From b244c4682a18e9c6034e1da2adf7d877d24c4f4d Mon Sep 17 00:00:00 2001 From: Lane Sawyer Date: Tue, 18 Jun 2024 11:45:10 -0700 Subject: [PATCH] chore: Formatting (#26) * Install prettier for packages * Run pretttier for packages * Prettier all the things! --- .prettierrc | 12 +- LICENSE.md | 50 +- README.md | 9 +- apps/common/package.json | 55 +- .../src/loaders/ome-zarr/fetchSlice.worker.ts | 26 +- .../src/loaders/ome-zarr/sliceWorkerPool.ts | 30 +- apps/common/src/loaders/ome-zarr/zarr-data.ts | 322 +- apps/common/src/loaders/scatterplot/data.ts | 68 +- .../scatterplot/scatterbrain-loader.ts | 52 +- apps/common/src/typed-array.ts | 2 +- apps/layers/package.json | 126 +- apps/layers/public/demo.html | 24 +- apps/layers/readme.md | 15 +- apps/layers/src/app.tsx | 76 +- .../src/data-renderers/annotation-renderer.ts | 115 +- .../dynamicGridSlideRenderer.ts | 137 +- .../layers/src/data-renderers/lineRenderer.ts | 52 +- .../src/data-renderers/mesh-renderer.ts | 64 +- .../simpleAnnotationRenderer.ts | 66 +- apps/layers/src/data-renderers/types.ts | 34 +- apps/layers/src/data-renderers/utils.ts | 8 +- .../src/data-renderers/volumeSliceRenderer.ts | 180 +- .../annotation/annotation-codec.ts | 4 +- .../annotation/annotation-grid.ts | 32 +- .../annotation/annotation-to-mesh.ts | 67 +- .../annotation/fetch-annotation.ts | 4 +- .../src/data-sources/annotation/types.ts | 4 +- .../src/data-sources/ome-zarr/planar-slice.ts | 26 +- .../src/data-sources/ome-zarr/slice-grid.ts | 27 +- .../data-sources/scatterplot/dynamic-grid.ts | 42 +- apps/layers/src/data-sources/types.ts | 16 +- apps/layers/src/demo.ts | 471 +- apps/layers/src/types.ts | 96 +- apps/layers/src/ui/annotation-grid.tsx | 34 +- apps/layers/src/ui/contact-sheet.tsx | 97 +- apps/layers/src/ui/scatterplot-ui.tsx | 60 +- apps/layers/src/ui/slice-ui.tsx | 117 +- apps/layers/tsconfig.json | 13 +- apps/neuroglancer-url/README.md | 4 +- apps/neuroglancer-url/package.json | 77 +- apps/neuroglancer-url/public/demo.html | 2 +- apps/neuroglancer-url/src/data.ts | 602 +- apps/neuroglancer-url/tsconfig.json | 3 +- apps/omezarr-viewer/README.md | 19 +- apps/omezarr-viewer/package.json | 96 +- apps/omezarr-viewer/public/tissuecyte.html | 16 +- apps/omezarr-viewer/public/versa.html | 17 +- apps/omezarr-viewer/src/annotation/path.ts | 196 +- apps/omezarr-viewer/src/camera.ts | 17 +- .../src/components/color-map.ts | 132 +- apps/omezarr-viewer/src/image-renderer.ts | 134 +- apps/omezarr-viewer/src/slice-renderer.ts | 505 +- apps/omezarr-viewer/src/tissuecyte.ts | 899 +- apps/omezarr-viewer/src/versa-renderer.ts | 610 +- apps/omezarr-viewer/src/versa.ts | 1091 +- apps/omezarr-viewer/tsconfig.json | 8 +- apps/scatterplot/README.md | 6 +- apps/scatterplot/package.json | 88 +- apps/scatterplot/public/demo.html | 19 +- apps/scatterplot/src/demo.ts | 329 +- apps/scatterplot/src/renderer.ts | 192 +- apps/scatterplot/tsconfig.json | 20 +- apps/tsconfig.json | 35 +- docs/authenticating.md | 2 + docs/examples.md | 2 + docs/publishing.md | 2 + package.json | 7 +- packages/geometry/package.json | 98 +- packages/geometry/src/BoundingBox.ts | 210 +- packages/geometry/src/Rectangle2D.ts | 70 +- packages/geometry/src/box2D.ts | 42 +- packages/geometry/src/box3D.ts | 38 +- packages/geometry/src/index.ts | 32 +- packages/geometry/src/interval.ts | 136 +- packages/geometry/src/line.ts | 6 +- packages/geometry/src/spatialIndexing/tree.ts | 2 +- .../geometry/src/tests/Rectangle2D.test.ts | 92 +- packages/geometry/src/tests/box2D.test.ts | 188 +- packages/geometry/src/tests/box3D.test.ts | 2 +- packages/geometry/src/tests/interval.test.ts | 120 +- packages/geometry/src/tests/line.test.ts | 30 +- packages/geometry/src/tests/vec2.test.ts | 270 +- packages/geometry/src/tests/vec3.test.ts | 262 +- packages/geometry/src/tests/vec4.test.ts | 2 +- packages/geometry/src/vec5.ts | 10 +- packages/geometry/src/vector.ts | 326 +- packages/geometry/tsconfig.json | 35 +- packages/scatterbrain/package.json | 110 +- packages/scatterbrain/src/dataset-cache.ts | 535 +- packages/scatterbrain/src/index.ts | 8 +- .../scatterbrain/src/layers/buffer-pair.ts | 3 +- packages/scatterbrain/src/layers/layer-2D.ts | 74 +- packages/scatterbrain/src/layers/types.ts | 33 +- packages/scatterbrain/src/render-queue.ts | 363 +- .../src/test/render-cache.test.ts | 273 +- .../src/test/render-queue.test.ts | 268 +- packages/scatterbrain/src/test/test-utils.ts | 21 +- packages/scatterbrain/tsconfig.json | 33 +- pnpm-lock.yaml | 9433 ++++++++++------- pnpm-workspace.yaml | 8 +- tsconfig.base.json | 20 +- 101 files changed, 11291 insertions(+), 9625 deletions(-) diff --git a/.prettierrc b/.prettierrc index 7c0342a..f429b83 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,8 +1,8 @@ { - "printWidth": 120, - "trailingComma": "es5", - "tabWidth": 4, - "singleQuote": true, - "semi": true, - "singleAttributePerLine": true + "printWidth": 120, + "trailingComma": "es5", + "tabWidth": 4, + "singleQuote": true, + "semi": true, + "singleAttributePerLine": true } diff --git a/LICENSE.md b/LICENSE.md index 1863975..53b3297 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,33 +1,33 @@ -Allen Institute Software License – This software license is the 2-clause BSD -license plus clause a third clause that prohibits redistribution and use for -commercial purposes without further permission. +Allen Institute Software License – This software license is the 2-clause BSD +license plus clause a third clause that prohibits redistribution and use for +commercial purposes without further permission. -Copyright © 2019. Allen Institute. All rights reserved. +Copyright © 2019. Allen Institute. All rights reserved. -Redistribution and use in source and binary forms, with or without +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -3. Redistributions and use for commercial purposes are not permitted without -the Allen Institute’s written permission. For purposes of this license, -commercial purposes are the incorporation of the Allen Institute's software -into anything for which you will charge fees or other compensation or use of -the software to perform a commercial service for a third party. Contact -terms@alleninstitute.org for commercial licensing opportunities. +3. Redistributions and use for commercial purposes are not permitted without + the Allen Institute’s written permission. For purposes of this license, + commercial purposes are the incorporation of the Allen Institute's software + into anything for which you will charge fees or other compensation or use of + the software to perform a commercial service for a third party. Contact + terms@alleninstitute.org for commercial licensing opportunities. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 46b41b9..a9a0ba7 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,22 @@ # Allen Institute Vis + This repository contains a collection of packages for building scalable visualization tools at the Allen Institute. It houses the `vis-[package name]` packages on the Allen Institute GitHub organization's NPM package registry. # Available Packages -- `vis-geometry`: A collection of vector functions for 2D and 3D geometry -- `scatterbrain`: A collection of useful utitilites used to build our big-data, scalable, scatterplot tool "Scatterbrain" in the Brain Knowledge Platform + +- `vis-geometry`: A collection of vector functions for 2D and 3D geometry +- `scatterbrain`: A collection of useful utitilites used to build our big-data, scalable, scatterplot tool "Scatterbrain" in the Brain Knowledge Platform # Examples + See the `apps` directory for example projects using the packages. Over time, these examples will become simpler as the base tooling becomes more mature. For details on running or adding new examples, see the `docs/examples.md` file. # Contributing + Contributions are welcome! We're currently breaking apart the Scattebrain component into smaller, more manageable packages. If you have a package that you think would be useful to others, please open a PR. # Using the Libraries + See the `docs/using-packages.md` file for information on how to use the packages in your own projects. diff --git a/apps/common/package.json b/apps/common/package.json index 2772f5a..5542b7f 100644 --- a/apps/common/package.json +++ b/apps/common/package.json @@ -3,35 +3,34 @@ "version": "0.0.1", "HEY": "NOTE! DO not use this package directly - its just for sharing code between our little apps", "contributors": [ - { - "name": "Lane Sawyer", - "email": "lane.sawyer@alleninstitute.org" - }, - { - "name": "James Gerstenberger", - "email": "james.gerstenberger@alleninstitute.org" - }, - { - "name": "Noah Shepard", - "email": "noah.shepard@alleninstitute.org" - }, - { - "name": "Skyler Moosman", - "email": "skyler.moosman@alleninstitute.org" - }, - { - "name": "Su Li", - "email": "su.li@alleninstitute.org" - } + { + "name": "Lane Sawyer", + "email": "lane.sawyer@alleninstitute.org" + }, + { + "name": "James Gerstenberger", + "email": "james.gerstenberger@alleninstitute.org" + }, + { + "name": "Noah Shepard", + "email": "noah.shepard@alleninstitute.org" + }, + { + "name": "Skyler Moosman", + "email": "skyler.moosman@alleninstitute.org" + }, + { + "name": "Su Li", + "email": "su.li@alleninstitute.org" + } ], "private": true, "dependencies": { - "@alleninstitute/vis-geometry": "workspace:*", - "@alleninstitute/vis-scatterbrain": "workspace:*", - "@types/lodash": "^4.14.202", - "lodash": "^4.17.21", - "regl": "^2.1.0", - "zarr": "^0.6.2" - + "@alleninstitute/vis-geometry": "workspace:*", + "@alleninstitute/vis-scatterbrain": "workspace:*", + "@types/lodash": "^4.14.202", + "lodash": "^4.17.21", + "regl": "^2.1.0", + "zarr": "^0.6.2" } - } \ No newline at end of file +} diff --git a/apps/common/src/loaders/ome-zarr/fetchSlice.worker.ts b/apps/common/src/loaders/ome-zarr/fetchSlice.worker.ts index 41b0072..655c445 100644 --- a/apps/common/src/loaders/ome-zarr/fetchSlice.worker.ts +++ b/apps/common/src/loaders/ome-zarr/fetchSlice.worker.ts @@ -1,16 +1,15 @@ - // a web-worker which fetches slices of data, decodes them, and returns the result as a flat float32 array, using transferables -import type { NestedArray, TypedArray } from 'zarr' -import { getSlice, type ZarrDataset, type ZarrRequest } from "./zarr-data"; +import type { NestedArray, TypedArray } from 'zarr'; +import { getSlice, type ZarrDataset, type ZarrRequest } from './zarr-data'; const ctx = self; type ZarrSliceRequest = { id: string; - type: 'ZarrSliceRequest' - metadata: ZarrDataset - req: ZarrRequest, - layerIndex: number -} + type: 'ZarrSliceRequest'; + metadata: ZarrDataset; + req: ZarrRequest; + layerIndex: number; +}; function isSliceRequest(payload: any): payload is ZarrSliceRequest { return typeof payload === 'object' && payload['type'] === 'ZarrSliceRequest'; } @@ -18,13 +17,10 @@ ctx.onmessage = (msg: MessageEvent) => { const { data } = msg; if (isSliceRequest(data)) { const { metadata, req, layerIndex, id } = data; - getSlice(metadata, req, layerIndex).then((result: { - shape: number[], - buffer: NestedArray - }) => { + getSlice(metadata, req, layerIndex).then((result: { shape: number[]; buffer: NestedArray }) => { const { shape, buffer } = result; const R = new Float32Array(buffer.flatten()); - ctx.postMessage({ type: 'slice', id, shape, data: R }, { transfer: [R.buffer] }) - }) + ctx.postMessage({ type: 'slice', id, shape, data: R }, { transfer: [R.buffer] }); + }); } -} \ No newline at end of file +}; diff --git a/apps/common/src/loaders/ome-zarr/sliceWorkerPool.ts b/apps/common/src/loaders/ome-zarr/sliceWorkerPool.ts index 0f4302a..905bb3c 100644 --- a/apps/common/src/loaders/ome-zarr/sliceWorkerPool.ts +++ b/apps/common/src/loaders/ome-zarr/sliceWorkerPool.ts @@ -1,5 +1,5 @@ -import { uniqueId } from "lodash"; -import type { ZarrDataset, ZarrRequest } from "./zarr-data"; +import { uniqueId } from 'lodash'; +import type { ZarrDataset, ZarrRequest } from './zarr-data'; type PromisifiedMessage = { requestCacheKey: string; @@ -8,15 +8,15 @@ type PromisifiedMessage = { promise?: Promise | undefined; }; type ExpectedResultSlice = { - type: 'slice', + type: 'slice'; id: string; } & Slice; type Slice = { data: Float32Array; - shape: number[] -} + shape: number[]; +}; function isExpectedResult(obj: any): obj is ExpectedResultSlice { - return (typeof obj === 'object' && 'type' in obj && obj.type === 'slice') + return typeof obj === 'object' && 'type' in obj && obj.type === 'slice'; } export class SliceWorkerPool { private workers: Worker[]; @@ -26,7 +26,7 @@ export class SliceWorkerPool { this.workers = new Array(size); for (let i = 0; i < size; i++) { this.workers[i] = new Worker(new URL('./fetchSlice.worker.ts', import.meta.url), { type: 'module' }); - this.workers[i].onmessage = (msg) => this.handleResponse(msg) + this.workers[i].onmessage = (msg) => this.handleResponse(msg); } this.promises = {}; this.which = 0; @@ -37,14 +37,14 @@ export class SliceWorkerPool { if (isExpectedResult(payload)) { const prom = this.promises[payload.id]; if (prom) { - const { data, shape } = payload + const { data, shape } = payload; prom.resolve({ data, shape }); - delete this.promises[payload.id] + delete this.promises[payload.id]; } } } private roundRobin() { - this.which = (this.which + 1) % this.workers.length + this.which = (this.which + 1) % this.workers.length; } requestSlice(dataset: ZarrDataset, req: ZarrRequest, layerIndex: number) { const reqId = uniqueId('rq'); @@ -57,7 +57,13 @@ export class SliceWorkerPool { reject, promise: undefined, // ill get added to the map once I am fully defined! }; - this.workers[this.which].postMessage({ id: reqId, type: 'ZarrSliceRequest', metadata: dataset, req, layerIndex }); + this.workers[this.which].postMessage({ + id: reqId, + type: 'ZarrSliceRequest', + metadata: dataset, + req, + layerIndex, + }); this.roundRobin(); }); this.promises[reqId].promise = eventually; @@ -72,4 +78,4 @@ export function getSlicePool() { slicePool = new SliceWorkerPool(16); } return slicePool; -} \ No newline at end of file +} diff --git a/apps/common/src/loaders/ome-zarr/zarr-data.ts b/apps/common/src/loaders/ome-zarr/zarr-data.ts index a48664d..9229752 100644 --- a/apps/common/src/loaders/ome-zarr/zarr-data.ts +++ b/apps/common/src/loaders/ome-zarr/zarr-data.ts @@ -1,238 +1,236 @@ // lets make some easy to understand utils to access .zarr data stored in an s3 bucket somewhere -import { HTTPStore, NestedArray, type TypedArray, openArray, openGroup, slice } from "zarr"; -import { some } from "lodash"; -import { Box2D, type Interval, Vec2, type box2D, limit, type vec2 } from "@alleninstitute/vis-geometry"; -import type { AxisAlignedPlane } from "../../../../omezarr-viewer/src/versa-renderer"; +import { HTTPStore, NestedArray, type TypedArray, openArray, openGroup, slice } from 'zarr'; +import { some } from 'lodash'; +import { Box2D, type Interval, Vec2, type box2D, limit, type vec2 } from '@alleninstitute/vis-geometry'; +import type { AxisAlignedPlane } from '../../../../omezarr-viewer/src/versa-renderer'; // documentation for ome-zarr datasets (from which these types are built) // can be found here: // https://ngff.openmicroscopy.org/latest/#multiscale-md // export type ZarrDataset = Awaited>; type AxisDesc = { - name: string; // x or y or z or time or ? - type: string; // space or time or ? - unit: string; // see list of possible units: https://ngff.openmicroscopy.org/latest/#axes-md + name: string; // x or y or z or time or ? + type: string; // space or time or ? + unit: string; // see list of possible units: https://ngff.openmicroscopy.org/latest/#axes-md }; // todo, there are other types of coordinate transforms... type ScaleTransform = { - type: "scale"; - scale: ReadonlyArray; + type: 'scale'; + scale: ReadonlyArray; }; function isScaleTransform(trn: unknown): trn is ScaleTransform { - if (typeof trn === "object" && trn !== null) { - const scaleTransform = trn as ScaleTransform; - return scaleTransform.type === "scale" && scaleTransform.scale !== undefined; - } - return false; + if (typeof trn === 'object' && trn !== null) { + const scaleTransform = trn as ScaleTransform; + return scaleTransform.type === 'scale' && scaleTransform.scale !== undefined; + } + return false; } type DatasetDesc = { - path: string; - coordinateTransformations: ReadonlyArray; + path: string; + coordinateTransformations: ReadonlyArray; }; type DatasetWithShape = DatasetDesc & { - shape: number[]; + shape: number[]; }; type ZarrAttr = { - axes: ReadonlyArray; - datasets: ReadonlyArray; + axes: ReadonlyArray; + datasets: ReadonlyArray; }; type ZarrAttrs = { - multiscales: ReadonlyArray; + multiscales: ReadonlyArray; }; async function getRawInfo(store: HTTPStore) { - const group = await openGroup(store); - // TODO HACK ALERT: I am once again doing the thing that I hate, in which I promise to my friend Typescript that - // the junk I just pulled out of this internet file is exactly what I expect it to be: :fingers_crossed: - return group.attrs.asObject() as Promise; + const group = await openGroup(store); + // TODO HACK ALERT: I am once again doing the thing that I hate, in which I promise to my friend Typescript that + // the junk I just pulled out of this internet file is exactly what I expect it to be: :fingers_crossed: + return group.attrs.asObject() as Promise; } async function mapAsync(arr: ReadonlyArray, fn: (t: T, index: number) => Promise) { - return Promise.all(arr.map((v, i) => fn(v, i))); + return Promise.all(arr.map((v, i) => fn(v, i))); } // return the mapping from path (aka resolution group???) to the dimensional shape of the data async function loadMetadata(store: HTTPStore, attrs: ZarrAttrs) { - const addShapeToDesc = async (d: DatasetDesc) => ({ - ...d, - shape: (await openArray({ store, mode: "r", path: d.path })).shape, - }); - return { - url: store.url, - multiscales: await mapAsync(attrs.multiscales, async (attr) => ({ - ...attr, - datasets: await mapAsync(attr.datasets, addShapeToDesc), - })), - }; + const addShapeToDesc = async (d: DatasetDesc) => ({ + ...d, + shape: (await openArray({ store, mode: 'r', path: d.path })).shape, + }); + return { + url: store.url, + multiscales: await mapAsync(attrs.multiscales, async (attr) => ({ + ...attr, + datasets: await mapAsync(attr.datasets, addShapeToDesc), + })), + }; } -type OmeDimension = "x" | "y" | "z" | "t" | "c"; +type OmeDimension = 'x' | 'y' | 'z' | 't' | 'c'; const uvTable = { - xy: { u: "x", v: "y" }, - xz: { u: "x", v: "z" }, - yz: { u: "y", v: "z" }, + xy: { u: 'x', v: 'y' }, + xz: { u: 'x', v: 'z' }, + yz: { u: 'y', v: 'z' }, } as const; const sliceDimension = { - xy: "z", - xz: "y", - yz: "x", + xy: 'z', + xz: 'y', + yz: 'x', } as const; export function uvForPlane(plane: AxisAlignedPlane) { - return uvTable[plane]; + return uvTable[plane]; } export function sliceDimensionForPlane(plane: AxisAlignedPlane) { - return sliceDimension[plane]; + return sliceDimension[plane]; } export type ZarrRequest = Record; export function pickBestScale( - dataset: ZarrDataset, - plane: { - u: OmeDimension; - v: OmeDimension; - }, - relativeView: box2D, // a box in data-unit-space - // in the plane given above - displayResolution: vec2 + dataset: ZarrDataset, + plane: { + u: OmeDimension; + v: OmeDimension; + }, + relativeView: box2D, // a box in data-unit-space + // in the plane given above + displayResolution: vec2 ) { - const datasets = dataset.multiscales[0].datasets; - const axes = dataset.multiscales[0].axes; - const realSize = sizeInUnits(plane, axes, datasets[0])! + const datasets = dataset.multiscales[0].datasets; + const axes = dataset.multiscales[0].axes; + const realSize = sizeInUnits(plane, axes, datasets[0])!; - const vxlPitch = (size: vec2) => Vec2.div(realSize, size); - // size, in dataspace, of a pixel 1/res - const pxPitch = Vec2.div(Box2D.size(relativeView), displayResolution); - const dstToDesired = (a: vec2, goal: vec2) => { - const diff = Vec2.sub(a, goal); - if (diff[0] * diff[1] > 0) { - // the res (a) is higher than our goal - - // weight this heavily to prefer smaller than the goal - return 1000 * Vec2.length(Vec2.sub(a, goal)); - } - return Vec2.length(Vec2.sub(a, goal)); - } - // we assume the datasets are ordered... hmmm TODO - const choice = datasets.reduce( - (bestSoFar, cur) => - dstToDesired(vxlPitch(planeSizeInVoxels(plane, axes, bestSoFar)!), pxPitch) > - dstToDesired(vxlPitch(planeSizeInVoxels(plane, axes, cur)!), pxPitch) - ? cur - : bestSoFar, - datasets[0] - ); - return choice ?? datasets[datasets.length - 1]; + const vxlPitch = (size: vec2) => Vec2.div(realSize, size); + // size, in dataspace, of a pixel 1/res + const pxPitch = Vec2.div(Box2D.size(relativeView), displayResolution); + const dstToDesired = (a: vec2, goal: vec2) => { + const diff = Vec2.sub(a, goal); + if (diff[0] * diff[1] > 0) { + // the res (a) is higher than our goal - + // weight this heavily to prefer smaller than the goal + return 1000 * Vec2.length(Vec2.sub(a, goal)); + } + return Vec2.length(Vec2.sub(a, goal)); + }; + // we assume the datasets are ordered... hmmm TODO + const choice = datasets.reduce( + (bestSoFar, cur) => + dstToDesired(vxlPitch(planeSizeInVoxels(plane, axes, bestSoFar)!), pxPitch) > + dstToDesired(vxlPitch(planeSizeInVoxels(plane, axes, cur)!), pxPitch) + ? cur + : bestSoFar, + datasets[0] + ); + return choice ?? datasets[datasets.length - 1]; } function indexFor(dim: OmeDimension, axes: readonly AxisDesc[]) { - return axes.findIndex((axe) => axe.name === dim); + return axes.findIndex((axe) => axe.name === dim); } export function sizeInUnits( - plane: AxisAlignedPlane | { - u: OmeDimension; - v: OmeDimension; - }, - axes: readonly AxisDesc[], - dataset: DatasetWithShape + plane: + | AxisAlignedPlane + | { + u: OmeDimension; + v: OmeDimension; + }, + axes: readonly AxisDesc[], + dataset: DatasetWithShape ): vec2 | undefined { - plane = typeof plane === 'string' ? uvForPlane(plane) : plane - const vxls = planeSizeInVoxels(plane, axes, dataset); + plane = typeof plane === 'string' ? uvForPlane(plane) : plane; + const vxls = planeSizeInVoxels(plane, axes, dataset); - if (vxls === undefined) return undefined; - let size: vec2 = vxls; - // now, just apply the correct transforms, if they exist... + if (vxls === undefined) return undefined; + let size: vec2 = vxls; + // now, just apply the correct transforms, if they exist... - dataset.coordinateTransformations.forEach((trn) => { - if (isScaleTransform(trn)) { - // try to apply it! - const uIndex = indexOfDimension(axes, plane.u); - const vIndex = indexOfDimension(axes, plane.v); - size = Vec2.mul(size, [trn.scale[uIndex], trn.scale[vIndex]]); - } - }); - return size; + dataset.coordinateTransformations.forEach((trn) => { + if (isScaleTransform(trn)) { + // try to apply it! + const uIndex = indexOfDimension(axes, plane.u); + const vIndex = indexOfDimension(axes, plane.v); + size = Vec2.mul(size, [trn.scale[uIndex], trn.scale[vIndex]]); + } + }); + return size; } -export function sizeInVoxels( - dim: OmeDimension, - axes: readonly AxisDesc[], - dataset: DatasetWithShape -) { - const uI = indexFor(dim, axes); - if (uI === -1) return undefined +export function sizeInVoxels(dim: OmeDimension, axes: readonly AxisDesc[], dataset: DatasetWithShape) { + const uI = indexFor(dim, axes); + if (uI === -1) return undefined; - return dataset.shape[uI] + return dataset.shape[uI]; } export function planeSizeInVoxels( - plane: { - u: OmeDimension; - v: OmeDimension; - }, - axes: readonly AxisDesc[], - dataset: DatasetWithShape + plane: { + u: OmeDimension; + v: OmeDimension; + }, + axes: readonly AxisDesc[], + dataset: DatasetWithShape ): vec2 | undefined { - // first - u&v must not refer to the same dimension, - // and both should exist in the axes... - const { u, v } = plane; - if (u === v) return undefined; - const uI = indexFor(u, axes); - const vI = indexFor(v, axes); + // first - u&v must not refer to the same dimension, + // and both should exist in the axes... + const { u, v } = plane; + if (u === v) return undefined; + const uI = indexFor(u, axes); + const vI = indexFor(v, axes); - if (uI === -1 || vI === -1) return undefined; + if (uI === -1 || vI === -1) return undefined; - return [dataset.shape[uI], dataset.shape[vI]] as const; + return [dataset.shape[uI], dataset.shape[vI]] as const; } // feel free to freak out if the request is over or under determined or whatever function buildQuery(r: Readonly, axes: readonly AxisDesc[], shape: number[]) { - const ordered = axes.map((a) => r[a.name as OmeDimension]); - // if any are undefined, throw up - if (some(ordered, (a) => a === undefined)) { - throw new Error("request does not match expected dimensions of ome-zarr dataset!"); - } - - return ordered.map((d, i) => { - const bounds = { min: 0, max: shape[i] }; - if (d === null) { - return d; - } else if (typeof d === "number") { - return limit(bounds, d); + const ordered = axes.map((a) => r[a.name as OmeDimension]); + // if any are undefined, throw up + if (some(ordered, (a) => a === undefined)) { + throw new Error('request does not match expected dimensions of ome-zarr dataset!'); } - return slice(limit(bounds, d.min), limit(bounds, d.max)); - }); + + return ordered.map((d, i) => { + const bounds = { min: 0, max: shape[i] }; + if (d === null) { + return d; + } else if (typeof d === 'number') { + return limit(bounds, d); + } + return slice(limit(bounds, d.min), limit(bounds, d.max)); + }); } function dieIfMalformed(r: ZarrRequest) { - // deal with me later - // TODO + // deal with me later + // TODO } export async function explain(z: ZarrDataset) { - console.dir(z); - const store = new HTTPStore(z.url); - for (const d of z.multiscales[0].datasets) { - openArray({ store, path: d.path, mode: "r" }).then((arr) => { - console.dir(arr); - }); - } + console.dir(z); + const store = new HTTPStore(z.url); + for (const d of z.multiscales[0].datasets) { + openArray({ store, path: d.path, mode: 'r' }).then((arr) => { + console.dir(arr); + }); + } } export function indexOfDimension(axes: readonly AxisDesc[], dim: OmeDimension) { - return axes.findIndex((ax) => ax.name === dim); + return axes.findIndex((ax) => ax.name === dim); } export async function getSlice(metadata: ZarrDataset, r: ZarrRequest, layerIndex: number) { - dieIfMalformed(r); - // put the request in native order - const store = new HTTPStore(metadata.url); - const scene = metadata.multiscales[0]; - const { axes } = scene; - const level = scene.datasets[layerIndex] ?? scene.datasets[scene.datasets.length - 1]; - const arr = await openArray({ store, path: level.path, mode: "r" }); - const result = await arr.get(buildQuery(r, axes, level.shape)); - if (typeof result == "number") { - throw new Error("oh noes, slice came back all weird"); - } - return { - shape: result.shape, - buffer: result, - }; + dieIfMalformed(r); + // put the request in native order + const store = new HTTPStore(metadata.url); + const scene = metadata.multiscales[0]; + const { axes } = scene; + const level = scene.datasets[layerIndex] ?? scene.datasets[scene.datasets.length - 1]; + const arr = await openArray({ store, path: level.path, mode: 'r' }); + const result = await arr.get(buildQuery(r, axes, level.shape)); + if (typeof result == 'number') { + throw new Error('oh noes, slice came back all weird'); + } + return { + shape: result.shape, + buffer: result, + }; } export async function load(url: string) { - const store = new HTTPStore(url); - return loadMetadata(store, await getRawInfo(store)); + const store = new HTTPStore(url); + return loadMetadata(store, await getRawInfo(store)); } diff --git a/apps/common/src/loaders/scatterplot/data.ts b/apps/common/src/loaders/scatterplot/data.ts index 68e273b..3d2320a 100644 --- a/apps/common/src/loaders/scatterplot/data.ts +++ b/apps/common/src/loaders/scatterplot/data.ts @@ -1,10 +1,17 @@ - // todo rename this file -import { Box2D, visitBFS, type box2D, type vec2 } from "@alleninstitute/vis-geometry"; -import { fetchColumn, type ColumnData, type ColumnRequest, type ColumnarNode, type ColumnarTree, type SlideViewDataset, type loadDataset } from "./scatterbrain-loader"; -import REGL from 'regl' -export type Dataset = ReturnType +import { Box2D, visitBFS, type box2D, type vec2 } from '@alleninstitute/vis-geometry'; +import { + fetchColumn, + type ColumnData, + type ColumnRequest, + type ColumnarNode, + type ColumnarTree, + type SlideViewDataset, + type loadDataset, +} from './scatterbrain-loader'; +import REGL from 'regl'; +export type Dataset = ReturnType; export type RenderSettings = { dataset: Dataset; view: box2D; @@ -12,53 +19,66 @@ export type RenderSettings = { pointSize: number; target: REGL.Framebuffer2D | null; regl: REGL.Regl; -} +}; function isVisible(view: box2D, sizeLimit: number, tree: ColumnarTree) { const { bounds } = tree.content; return Box2D.size(bounds)[0] > sizeLimit && !!Box2D.intersection(view, tree.content.bounds); } export function getVisibleItems(dataset: Dataset, view: box2D, sizeLimit: number) { - const hits: ColumnarTree[] = [] + const hits: ColumnarTree[] = []; let tree = 'slides' in dataset ? Object.values(dataset.slides)[0].tree : dataset.tree; - visitBFS(tree, + visitBFS( + tree, (t: ColumnarTree) => t.children, - (tree) => { hits.push(tree) }, - (tree) => isVisible(view, sizeLimit, tree)); + (tree) => { + hits.push(tree); + }, + (tree) => isVisible(view, sizeLimit, tree) + ); return hits; } export function getVisibleItemsInSlide(dataset: SlideViewDataset, slide: string, view: box2D, sizeLimit: number) { const theSlide = dataset.slides[slide]; if (!theSlide) { - console.log('nope', Object.keys(dataset.slides)) - return [] + console.log('nope', Object.keys(dataset.slides)); + return []; } - const hits: ColumnarTree[] = [] + const hits: ColumnarTree[] = []; const tree = theSlide.tree; - visitBFS(tree, + visitBFS( + tree, (t: ColumnarTree) => t.children, - (tree) => { hits.push(tree) }, - (tree) => isVisible(view, sizeLimit, tree)); + (tree) => { + hits.push(tree); + }, + (tree) => isVisible(view, sizeLimit, tree) + ); return hits; } function toReglBuffer(c: ColumnData, regl: REGL.Regl) { return { type: 'vbo', - data: regl.buffer(c) + data: regl.buffer(c), } as const; } -function fetchAndUpload(settings: { dataset: Dataset, regl: REGL.Regl }, node: ColumnarNode, req: ColumnRequest, signal?: AbortSignal | undefined) { +function fetchAndUpload( + settings: { dataset: Dataset; regl: REGL.Regl }, + node: ColumnarNode, + req: ColumnRequest, + signal?: AbortSignal | undefined +) { const { dataset, regl } = settings; - return fetchColumn(node, dataset, req, signal).then(cd => toReglBuffer(cd, regl)) + return fetchColumn(node, dataset, req, signal).then((cd) => toReglBuffer(cd, regl)); } export function fetchItem(item: ColumnarTree, settings: RenderSettings, signal?: AbortSignal) { const { dataset, colorBy } = settings; - const position = () => fetchAndUpload(settings, item.content, { type: 'METADATA', name: dataset.spatialColumn }, signal); - const color = () => fetchAndUpload(settings, item.content, colorBy, signal) + const position = () => + fetchAndUpload(settings, item.content, { type: 'METADATA', name: dataset.spatialColumn }, signal); + const color = () => fetchAndUpload(settings, item.content, colorBy, signal); return { position, - color - } as const + color, + } as const; } - diff --git a/apps/common/src/loaders/scatterplot/scatterbrain-loader.ts b/apps/common/src/loaders/scatterplot/scatterbrain-loader.ts index 7e868d5..fcddd2b 100644 --- a/apps/common/src/loaders/scatterplot/scatterbrain-loader.ts +++ b/apps/common/src/loaders/scatterplot/scatterbrain-loader.ts @@ -1,6 +1,6 @@ -import { Box2D, Box3D, Vec3, type box, type box3D, type vec2, type vec3 } from "@alleninstitute/vis-geometry"; -import { MakeTaggedBufferView, type TaggedTypedArray, type WebGLSafeBasicType } from "../../typed-array"; -import type REGL from "regl"; +import { Box2D, Box3D, Vec3, type box, type box3D, type vec2, type vec3 } from '@alleninstitute/vis-geometry'; +import { MakeTaggedBufferView, type TaggedTypedArray, type WebGLSafeBasicType } from '../../typed-array'; +import type REGL from 'regl'; type volumeBound = { lx: number; @@ -68,7 +68,7 @@ export type SlideColumnarMetadata = Omit +type VectorConstraint = ReadonlyArray; export type ColumnarNode = { url: string; name: string; @@ -79,8 +79,8 @@ export type ColumnarNode = { }; export type ColumnarTree = { content: ColumnarNode; - children: ReadonlyArray> -} + children: ReadonlyArray>; +}; // adapted from Potree createChildAABB // note that if you do not do indexing in precisely the same order @@ -135,14 +135,14 @@ function convertTree2D( children: n.children !== undefined && n.children.length > 0 ? n.children.map((c) => - convertTree2D( - c, - getChildBoundsUsingPotreeIndexing(bounds, getRelativeIndex(safeName, sanitizeName(c.file))), - depth + 1, - metadataPath, - genePath - ) - ) + convertTree2D( + c, + getChildBoundsUsingPotreeIndexing(bounds, getRelativeIndex(safeName, sanitizeName(c.file))), + depth + 1, + metadataPath, + genePath + ) + ) : [], }; } @@ -185,7 +185,7 @@ function loadSlideViewDataset(metadata: SlideColumnarMetadata, _datasetUrl: stri const slideBounds = Box3D.create([box.lx, box.ly, box.lz], [box.ux, box.uy, box.uz]); return { tree: convertTree2D(slide.tree.root, slideBounds, 0, metadataFileEndpoint, geneFileEndpoint), - id: (slide.featureTypeValueReferenceId), + id: slide.featureTypeValueReferenceId, }; }); return { @@ -226,13 +226,7 @@ export function loadDataset(metadata: ColumnarMetadata, datasetUrl: string) { geneUrl: metadata.geneFileEndpoint, columnInfo, spatialColumn: metadata.spatialColumn, - tree: convertTree2D( - metadata.root, - rootBounds, - 0, - metadata.metadataFileEndpoint, - metadata.geneFileEndpoint - ), + tree: convertTree2D(metadata.root, rootBounds, 0, metadata.metadataFileEndpoint, metadata.geneFileEndpoint), }; } @@ -246,15 +240,15 @@ type QuantitativeColumn = { }; export type ColumnRequest = MetadataColumn | QuantitativeColumn; export type ColumnBuffer = { - type: 'vbo', - data: REGL.Buffer -} + type: 'vbo'; + data: REGL.Buffer; +}; export type ColumnData = TaggedTypedArray & { elements: number; // per vector entry - for example 'xy' would have elements: 2 }; export async function loadScatterbrainJson(url: string) { // obviously, we should check or something - return fetch(url).then(stuff => stuff.json() as unknown as ColumnarMetadata) + return fetch(url).then((stuff) => stuff.json() as unknown as ColumnarMetadata); } export async function fetchColumn( @@ -268,11 +262,13 @@ export async function fetchColumn( const getGeneUrl = (columnName: string) => `${dataset.geneUrl}${columnName}/${referenceIdForEmbedding}/${node.name}.bin`; if (column.type === 'QUANTITATIVE') { - const buff = await fetch(getGeneUrl(column.name), { signal: signal ?? null }).then((resp) => resp.arrayBuffer()); + const buff = await fetch(getGeneUrl(column.name), { signal: signal ?? null }).then((resp) => + resp.arrayBuffer() + ); return { ...MakeTaggedBufferView('float', buff), elements: 1 }; } const info = dataset.columnInfo[column.name]; const buff = await fetch(getColumnUrl(column.name), { signal: signal ?? null }).then((resp) => resp.arrayBuffer()); return { ...MakeTaggedBufferView(info.type, buff), elements: info.elements }; -} \ No newline at end of file +} diff --git a/apps/common/src/typed-array.ts b/apps/common/src/typed-array.ts index 40af16d..ef008cb 100644 --- a/apps/common/src/typed-array.ts +++ b/apps/common/src/typed-array.ts @@ -88,4 +88,4 @@ export function MakeTaggedBufferView(type: WebGLSafeBasicType, buffer: ArrayBuff throw new Error(`unsupported type requested: ${unreachable}`); } } -} \ No newline at end of file +} diff --git a/apps/layers/package.json b/apps/layers/package.json index 150d506..229f921 100644 --- a/apps/layers/package.json +++ b/apps/layers/package.json @@ -1,67 +1,67 @@ { - "name": "@alleninstitute/layer-demo", - "version": "0.0.1", - "contributors": [ - { - "name": "Lane Sawyer", - "email": "lane.sawyer@alleninstitute.org" + "name": "@alleninstitute/layer-demo", + "version": "0.0.1", + "contributors": [ + { + "name": "Lane Sawyer", + "email": "lane.sawyer@alleninstitute.org" + }, + { + "name": "James Gerstenberger", + "email": "james.gerstenberger@alleninstitute.org" + }, + { + "name": "Noah Shepard", + "email": "noah.shepard@alleninstitute.org" + }, + { + "name": "Skyler Moosman", + "email": "skyler.moosman@alleninstitute.org" + }, + { + "name": "Su Li", + "email": "su.li@alleninstitute.org" + } + ], + "license": "TBD", + "type": "module", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "private": true, + "scripts": { + "preinstall": "npx only-allow pnpm", + "typecheck": "tsc --noEmit", + "start": "parcel public/demo.html" }, - { - "name": "James Gerstenberger", - "email": "james.gerstenberger@alleninstitute.org" + "devDependencies": { + "@parcel/packager-ts": "^2.12.0", + "@parcel/transformer-typescript-types": "^2.12.0", + "@types/file-saver": "^2.0.7", + "@types/react": "^18.3.0", + "@types/react-dom": "^18.3.0", + "esbuild": "^0.19.12", + "parcel": "2.12.0", + "typescript": "^5.3.3" }, - { - "name": "Noah Shepard", - "email": "noah.shepard@alleninstitute.org" - }, - { - "name": "Skyler Moosman", - "email": "skyler.moosman@alleninstitute.org" - }, - { - "name": "Su Li", - "email": "su.li@alleninstitute.org" + "dependencies": { + "@alleninstitute/vis-geometry": "workspace:*", + "@alleninstitute/vis-scatterbrain": "workspace:*", + "@czi-sds/components": "^20.0.1", + "@emotion/css": "^11.11.2", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/base": "5.0.0-beta.40", + "@mui/icons-material": "^5.15.15", + "@mui/lab": "5.0.0-alpha.170", + "@mui/material": "^5.15.15", + "@types/lodash": "^4.14.202", + "file-saver": "^2.0.5", + "json5": "^2.2.3", + "kiwi-schema": "^0.5.0", + "lodash": "^4.17.21", + "regl": "^2.1.0", + "react": "^18.3.0", + "react-dom": "^18.3.0", + "zarr": "^0.6.2" } - ], - "license": "TBD", - "type": "module", - "main": "lib/index.js", - "types": "lib/index.d.ts", - "private": true, - "scripts": { - "preinstall": "npx only-allow pnpm", - "typecheck": "tsc --noEmit", - "start": "parcel public/demo.html" - }, - "devDependencies": { - "@parcel/packager-ts": "^2.12.0", - "@parcel/transformer-typescript-types": "^2.12.0", - "@types/file-saver": "^2.0.7", - "@types/react": "^18.3.0", - "@types/react-dom": "^18.3.0", - "esbuild": "^0.19.12", - "parcel": "2.12.0", - "typescript": "^5.3.3" - }, - "dependencies": { - "@alleninstitute/vis-geometry": "workspace:*", - "@alleninstitute/vis-scatterbrain": "workspace:*", - "@czi-sds/components": "^20.0.1", - "@emotion/css": "^11.11.2", - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", - "@mui/base": "5.0.0-beta.40", - "@mui/icons-material": "^5.15.15", - "@mui/lab": "5.0.0-alpha.170", - "@mui/material": "^5.15.15", - "@types/lodash": "^4.14.202", - "file-saver": "^2.0.5", - "json5": "^2.2.3", - "kiwi-schema": "^0.5.0", - "lodash": "^4.17.21", - "regl": "^2.1.0", - "react": "^18.3.0", - "react-dom": "^18.3.0", - "zarr": "^0.6.2" - } -} \ No newline at end of file +} diff --git a/apps/layers/public/demo.html b/apps/layers/public/demo.html index bde8af2..6dceb31 100644 --- a/apps/layers/public/demo.html +++ b/apps/layers/public/demo.html @@ -1,11 +1,17 @@ - + - - - - - - + + + + - \ No newline at end of file + diff --git a/apps/layers/readme.md b/apps/layers/readme.md index 6b4b782..80b874c 100644 --- a/apps/layers/readme.md +++ b/apps/layers/readme.md @@ -1,5 +1,7 @@ # Layered Rendering Example App + ## Run it + 1. download/clone this repository. 2. in the root directory (vis/) run `pnpm install` 3. run `pnpm build` @@ -8,12 +10,17 @@ 6. navigate to the running app (default `localhost://1234`) ## Why? + the goal of this (rather complicated) example app is not to show off a cool app - rather its goal is to show that we can build complexity by composing simple, focused modules. As we (the AIBS Apps team) have developed ABC-Atlas, we've tried to make sure our visualization code stays general, and that each part does as little as possible. The result is that it was fairly easy to combine those components into this new app, which mixes a (terrible) UI, scatter-plot rendering, polygon-mesh rendering (for annotations) and multi-channel volumetric rendering into independent layers. Although each of these data types appear different, our caching, fetching, visibility determination, and render-scheduling code is the same regardless of the datatype to be rendered. All that is required is to fill in a simple interface, and provide a low-level "renderer" plugin in order to add a new "layer" type. + ## Demo Script + ### Programmatic Configuration + After starting the app in a browser, you'll be greeted by a blank screen. We're going to demonstrate programmatic access to the features of this demo. The goal here is not to make users invoke command-line arguments, but rather just an easy way for interested parties to "peak under the hood". All the visualizations are configured here via simple json objects - it would not be a stretch to read these configuration options at initialization-time via URL parameters for example. Open your browser's developer tools via ctrl+shift+i, ctrl+opt+i, or F12, and go to the developer console tab. This console is a running REPL environment with direct access to the demo. You can explore what features are available by typing "demo." at which point you should be given some auto-complete options, corresponding to the methods available on the demo object. The first thing we should take a look at is `demo.addLayer`, which accepts a configuration object for some data to be viewed as a layer in the app. A list of pre-constructed objects is provided in the `examples` object. lets run `examples.reconstructed` to take a peek:
+ ```{ "type": "ScatterPlotGridConfig", "colorBy": { @@ -23,22 +30,26 @@ Open your browser's developer tools via ctrl+shift+i, ctrl+opt+i, or F12, and go "url": "https://.../4STCSZBXHYOI0JUUA3M/ScatterBrain.json" } ``` + note - the above config has been slightly altered here for readability! Some things to observe about this config object:
+ 1. its simple json 2. the "type" tag tells the app what fields to expect next. 3. this data is a grid of scatter-plots (slide view!), its colored by a quantitative feature (gene #88). 4. lastly - do not take this structure too seriously! I made up all the layer-config types in a hurry, and we can easily make new ones, compose existing ones, or change anything at all! ### Explore a few layers + Lets continue by adding one layer: `demo.addLayer(examples.reconstructed)`
now, we should be able to navigate the (previously blank) view with the mouse, and we can watch the data load as it becomes visible (and thus, worth fetching & caching). Note also that the UI populates, with very simple (ugly?) controls to change settings, in this case only the gene by which to color can be edited. This ui took about 60 seconds to write, and I would not hesitate to throw it away. -Lets add a second layer: `demo.addLayer(examples.structureAnnotation)`
+Lets add a second layer: `demo.addLayer(examples.structureAnnotation)`
This data is the CCF annotations (the regions to which the scatterplot data is registered), and should line up with the scatterplot grid. This layer type has only a few simple options for altering the opacity of the polygons.
Lets add another layer: `demo.addLayer(examples.tissuecyte396)`
This should load up a contact-sheet style view, with 142 slices. You should note that the slices are not expected to line up with those in the other two layers (the slide-view scatterplot) - the data in each are in different coordinate systems. Perhaps obviously, the whole point of having multiple layers in one view would be to observe interesting relationships between them, and in a (non-demo) app, it would be important to allow configurations to specify mappings / transforms / etc. to get things to "line up". You should also see some double-post, "invlerp" sliders that control how the raw channels of information get mapped to visible-light color. You should be able to move the min & max for each channel, although do note that there seems to be very little data in the 3rd channel, mapped to the color blue. ### Take a picture -At the top left of the UI, you might notice a little 📸 button. This will take a low-resolution snapshot of the current view. If you'd like to be a little patient, enter the dev console again, and run `demo.requestSnapshot(10000)` which, depending on the aspect ratio of your browser window, will (slowly!) capture an ~80 million pixel image of the current screen - the main reason its slow is because, to properly serve that higher resolution, the rendering system must fetch many, many chunks of high-resolution data to render. Note that making changes to the UI during the snapshot process may cause those changes to take partial effect in the final snapshot output. This is a well understood class of bugs that are easy to address when planning to "do software correctly" - however this is a quick demo so I took a bunch of shortcuts! \ No newline at end of file + +At the top left of the UI, you might notice a little 📸 button. This will take a low-resolution snapshot of the current view. If you'd like to be a little patient, enter the dev console again, and run `demo.requestSnapshot(10000)` which, depending on the aspect ratio of your browser window, will (slowly!) capture an ~80 million pixel image of the current screen - the main reason its slow is because, to properly serve that higher resolution, the rendering system must fetch many, many chunks of high-resolution data to render. Note that making changes to the UI during the snapshot process may cause those changes to take partial effect in the final snapshot output. This is a well understood class of bugs that are easy to address when planning to "do software correctly" - however this is a quick demo so I took a bunch of shortcuts! diff --git a/apps/layers/src/app.tsx b/apps/layers/src/app.tsx index cf57847..9e033e8 100644 --- a/apps/layers/src/app.tsx +++ b/apps/layers/src/app.tsx @@ -7,38 +7,52 @@ import { ScatterplotUI } from './ui/scatterplot-ui'; import { Button } from '@czi-sds/components'; export function AppUi(props: { demo: Demo }) { - const {demo}=props; - return (
- - - - - -
) + const { demo } = props; + return ( +
+ + + + + +
+ ); } function LayerUi(props: { demo: Demo }) { - const {demo}=props; - const layer = demo.layers[demo.selectedLayer]; - if(layer){ - switch(layer.type){ - case 'annotationGrid': - return - case 'volumeGrid': - return - case 'volumeSlice': - return - case 'scatterplot': - case 'scatterplotGrid': - return - default: - return null; + const { demo } = props; + const layer = demo.layers[demo.selectedLayer]; + if (layer) { + switch (layer.type) { + case 'annotationGrid': + return ; + case 'volumeGrid': + return ; + case 'volumeSlice': + return ; + case 'scatterplot': + case 'scatterplotGrid': + return ; + default: + return null; + } } - } - return ; + return ; } diff --git a/apps/layers/src/data-renderers/annotation-renderer.ts b/apps/layers/src/data-renderers/annotation-renderer.ts index 5f9ba44..f899933 100644 --- a/apps/layers/src/data-renderers/annotation-renderer.ts +++ b/apps/layers/src/data-renderers/annotation-renderer.ts @@ -1,14 +1,14 @@ -import type REGL from "regl"; -import type { RenderCallback } from "./types"; -import { Box2D, Vec2, type box2D, type vec2, type vec4 } from "@alleninstitute/vis-geometry"; -import type { AnnotationMesh, GPUAnnotationMesh } from "src/data-sources/annotation/types"; -import type { buildLoopRenderer, buildMeshRenderer } from "./mesh-renderer"; -import type { OptionalTransform } from "src/data-sources/types"; -import { AsyncDataCache, beginLongRunningFrame, type FrameLifecycle } from "@alleninstitute/vis-scatterbrain"; -import { fetchAnnotation } from "src/data-sources/annotation/fetch-annotation"; -import { MeshFromAnnotation } from "src/data-sources/annotation/annotation-to-mesh"; -import { type Camera } from "../../../omezarr-viewer/src/camera"; -import type { AnnotationGrid } from "src/data-sources/annotation/annotation-grid"; +import type REGL from 'regl'; +import type { RenderCallback } from './types'; +import { Box2D, Vec2, type box2D, type vec2, type vec4 } from '@alleninstitute/vis-geometry'; +import type { AnnotationMesh, GPUAnnotationMesh } from 'src/data-sources/annotation/types'; +import type { buildLoopRenderer, buildMeshRenderer } from './mesh-renderer'; +import type { OptionalTransform } from 'src/data-sources/types'; +import { AsyncDataCache, beginLongRunningFrame, type FrameLifecycle } from '@alleninstitute/vis-scatterbrain'; +import { fetchAnnotation } from 'src/data-sources/annotation/fetch-annotation'; +import { MeshFromAnnotation } from 'src/data-sources/annotation/annotation-to-mesh'; +import { type Camera } from '../../../omezarr-viewer/src/camera'; +import type { AnnotationGrid } from 'src/data-sources/annotation/annotation-grid'; type SlideId = string; @@ -21,12 +21,12 @@ type SlideAnnotations = { export type LoopRenderer = ReturnType; export type MeshRenderer = ReturnType; -export type CacheContentType = { type: 'mesh', data: GPUAnnotationMesh } +export type CacheContentType = { type: 'mesh'; data: GPUAnnotationMesh }; type Settings = { regl: REGL.Regl; - loopRenderer: LoopRenderer, - meshRenderer: MeshRenderer, - stencilMeshRenderer: MeshRenderer, + loopRenderer: LoopRenderer; + meshRenderer: MeshRenderer; + stencilMeshRenderer: MeshRenderer; camera: Camera; viewport: REGL.BoundingBox; target: REGL.Framebuffer | null; @@ -42,7 +42,7 @@ type Settings = { }; function isMesh(obj: object | undefined): obj is CacheContentType { - return !!(obj && 'type' in obj && obj.type === 'mesh') + return !!(obj && 'type' in obj && obj.type === 'mesh'); } function fetchAnnotationsForSlide( item: SlideAnnotations, @@ -53,21 +53,28 @@ function fetchAnnotationsForSlide( const toCacheEntry = (m: AnnotationMesh | undefined): CacheContentType | undefined => m ? { - type: 'mesh', data: { - points: regl.buffer(m.points), - annotation: m - } - } + type: 'mesh', + data: { + points: regl.buffer(m.points), + annotation: m, + }, + } : undefined; const getMesh = () => { - return fetchAnnotation(item).then((anno) => anno ? MeshFromAnnotation(anno) : undefined).then(toCacheEntry) + return fetchAnnotation(item) + .then((anno) => (anno ? MeshFromAnnotation(anno) : undefined)) + .then(toCacheEntry); }; return { mesh: getMesh }; } type RProps = Parameters>[0]; -function renderSlideAnnotations(item: SlideAnnotations, settings: Settings, columns: Record) { +function renderSlideAnnotations( + item: SlideAnnotations, + settings: Settings, + columns: Record +) { const { camera, viewport, target, regl, loopRenderer, meshRenderer, stencilMeshRenderer } = settings; // const { view } = camera.projection === 'webImage' ? flipY(camera) : camera const { view } = camera; @@ -127,46 +134,58 @@ function renderSlideAnnotations(item: SlideAnnotations, settings: Settings, colu export type RenderSettings = { camera: Camera; - regl: REGL.Regl + regl: REGL.Regl; cache: AsyncDataCache; renderers: { - loopRenderer: LoopRenderer, - meshRenderer: MeshRenderer, - stencilMeshRenderer: MeshRenderer, - }, - callback: RenderCallback, - concurrentTasks?: number, - queueInterval?: number, - cpuLimit?: number, -} - + loopRenderer: LoopRenderer; + meshRenderer: MeshRenderer; + stencilMeshRenderer: MeshRenderer; + }; + callback: RenderCallback; + concurrentTasks?: number; + queueInterval?: number; + cpuLimit?: number; +}; export function renderAnnotationGrid( - target: REGL.Framebuffer2D | null, grid: AnnotationGrid, settings: RenderSettings): FrameLifecycle { + target: REGL.Framebuffer2D | null, + grid: AnnotationGrid, + settings: RenderSettings +): FrameLifecycle { const { dataset, annotationBaseUrl, levelFeature, stroke, fill } = grid; - const { regl, cache, camera: { view, screen }, renderers: { loopRenderer, meshRenderer, stencilMeshRenderer }, callback } = settings; + const { + regl, + cache, + camera: { view, screen }, + renderers: { loopRenderer, meshRenderer, stencilMeshRenderer }, + callback, + } = settings; let { camera, concurrentTasks, queueInterval, cpuLimit } = settings; - concurrentTasks = concurrentTasks ? Math.abs(concurrentTasks) : 5 - queueInterval = queueInterval ? Math.abs(queueInterval) : 33 - cpuLimit = cpuLimit ? Math.abs(cpuLimit) : undefined + concurrentTasks = concurrentTasks ? Math.abs(concurrentTasks) : 5; + queueInterval = queueInterval ? Math.abs(queueInterval) : 33; + cpuLimit = cpuLimit ? Math.abs(cpuLimit) : undefined; const items: SlideAnnotations[] = []; const rowSize = Math.floor(Math.sqrt(Object.keys(dataset.slides).length)); Object.keys(dataset.slides).forEach((slideId, i) => { - const gridIndex: vec2 = [i % rowSize, Math.floor(i / rowSize)] + const gridIndex: vec2 = [i % rowSize, Math.floor(i / rowSize)]; const { bounds } = dataset; - const offset = Vec2.mul(gridIndex, Box2D.size(bounds)) - const realBounds = Box2D.translate(bounds, offset) + const offset = Vec2.mul(gridIndex, Box2D.size(bounds)); + const realBounds = Box2D.translate(bounds, offset); if (Box2D.intersection(view, realBounds)) { items.push({ - annotationBaseUrl, gridFeature: slideId, levelFeature, bounds, toModelSpace: { + annotationBaseUrl, + gridFeature: slideId, + levelFeature, + bounds, + toModelSpace: { offset, - scale: [1, 1] - } - }) + scale: [1, 1], + }, + }); } - }) + }); const frame = beginLongRunningFrame( concurrentTasks, queueInterval, @@ -187,7 +206,7 @@ export function renderAnnotationGrid( width: screen[0], height: screen[1], }, - camera + camera, }, fetchAnnotationsForSlide, renderSlideAnnotations, diff --git a/apps/layers/src/data-renderers/dynamicGridSlideRenderer.ts b/apps/layers/src/data-renderers/dynamicGridSlideRenderer.ts index 8076319..c4f1e35 100644 --- a/apps/layers/src/data-renderers/dynamicGridSlideRenderer.ts +++ b/apps/layers/src/data-renderers/dynamicGridSlideRenderer.ts @@ -1,77 +1,118 @@ -import { beginLongRunningFrame, type AsyncDataCache } from "@alleninstitute/vis-scatterbrain"; -import type REGL from "regl"; -import { buildRenderer as buildScatterplotRenderer } from "../../../scatterplot/src/renderer"; -import { Box2D, Vec2, type vec2 } from "@alleninstitute/vis-geometry"; -import { fetchItem, getVisibleItemsInSlide } from "Common/loaders/scatterplot/data"; -import type { ColumnRequest, ColumnarTree } from "Common/loaders/scatterplot/scatterbrain-loader"; -import { applyOptionalTrn } from "./utils"; -import type { DynamicGrid, DynamicGridSlide } from "../data-sources/scatterplot/dynamic-grid"; -import type { RenderCallback } from "./types"; -import { type Camera } from "../../../omezarr-viewer/src/camera"; +import { beginLongRunningFrame, type AsyncDataCache } from '@alleninstitute/vis-scatterbrain'; +import type REGL from 'regl'; +import { buildRenderer as buildScatterplotRenderer } from '../../../scatterplot/src/renderer'; +import { Box2D, Vec2, type vec2 } from '@alleninstitute/vis-geometry'; +import { fetchItem, getVisibleItemsInSlide } from 'Common/loaders/scatterplot/data'; +import type { ColumnRequest, ColumnarTree } from 'Common/loaders/scatterplot/scatterbrain-loader'; +import { applyOptionalTrn } from './utils'; +import type { DynamicGrid, DynamicGridSlide } from '../data-sources/scatterplot/dynamic-grid'; +import type { RenderCallback } from './types'; +import { type Camera } from '../../../omezarr-viewer/src/camera'; type CacheContentType = { - type: 'vbo', + type: 'vbo'; data: REGL.Buffer; -} +}; -type Renderer = ReturnType +type Renderer = ReturnType; export type RenderSettings = { camera: Camera; cache: AsyncDataCache; - renderer: Renderer, - regl: REGL.Regl, - callback: RenderCallback, - concurrentTasks?: number, - queueInterval?: number, - cpuLimit?: number, -} -const cacheKey = (reqKey: string, item: ColumnarTree, settings: { colorBy: ColumnRequest }) => `${reqKey}:${item.content.name}:${settings.colorBy.name}|${settings.colorBy.type}` -export function renderSlide(target: REGL.Framebuffer2D | null, slide: DynamicGridSlide, settings: RenderSettings) { - const { cache, camera: { view, screen }, renderer, callback, regl } = settings; + renderer: Renderer; + regl: REGL.Regl; + callback: RenderCallback; + concurrentTasks?: number; + queueInterval?: number; + cpuLimit?: number; +}; +const cacheKey = (reqKey: string, item: ColumnarTree, settings: { colorBy: ColumnRequest }) => + `${reqKey}:${item.content.name}:${settings.colorBy.name}|${settings.colorBy.type}`; +export function renderSlide( + target: REGL.Framebuffer2D | null, + slide: DynamicGridSlide, + settings: RenderSettings +) { + const { + cache, + camera: { view, screen }, + renderer, + callback, + regl, + } = settings; let { camera, concurrentTasks, queueInterval, cpuLimit } = settings; - concurrentTasks = concurrentTasks ? Math.abs(concurrentTasks) : 5 - queueInterval = queueInterval ? Math.abs(queueInterval) : 33 - cpuLimit = cpuLimit ? Math.abs(cpuLimit) : undefined + concurrentTasks = concurrentTasks ? Math.abs(concurrentTasks) : 5; + queueInterval = queueInterval ? Math.abs(queueInterval) : 33; + cpuLimit = cpuLimit ? Math.abs(cpuLimit) : undefined; const { dataset, colorBy, pointSize } = slide; const unitsPerPixel = Vec2.div(Box2D.size(view), screen); - camera = { ...camera, view: applyOptionalTrn(camera.view, slide.toModelSpace, true) } + camera = { ...camera, view: applyOptionalTrn(camera.view, slide.toModelSpace, true) }; // camera = camera.projection === 'webImage' ? flipY(camera) : camera; - const items = getVisibleItemsInSlide(slide.dataset, slide.slideId, settings.camera.view, 10 * unitsPerPixel[0]) + const items = getVisibleItemsInSlide(slide.dataset, slide.slideId, settings.camera.view, 10 * unitsPerPixel[0]); // make the frame, return some junk - return beginLongRunningFrame(concurrentTasks, queueInterval, items, cache, - { view, dataset, target, colorBy, regl, pointSize }, fetchItem, renderer, callback, + return beginLongRunningFrame( + concurrentTasks, + queueInterval, + items, + cache, + { view, dataset, target, colorBy, regl, pointSize }, + fetchItem, + renderer, + callback, cacheKey, - cpuLimit); + cpuLimit + ); } -export function renderDynamicGrid(target: REGL.Framebuffer2D | null, grid: DynamicGrid, settings: RenderSettings) { - const { cache, camera: { view, screen }, renderer, callback, regl } = settings; +export function renderDynamicGrid( + target: REGL.Framebuffer2D | null, + grid: DynamicGrid, + settings: RenderSettings +) { + const { + cache, + camera: { view, screen }, + renderer, + callback, + regl, + } = settings; let { camera, concurrentTasks, queueInterval, cpuLimit } = settings; - concurrentTasks = concurrentTasks ? Math.abs(concurrentTasks) : 5 - queueInterval = queueInterval ? Math.abs(queueInterval) : 33 - cpuLimit = cpuLimit ? Math.abs(cpuLimit) : undefined - const items: ColumnarTree[] = [] + concurrentTasks = concurrentTasks ? Math.abs(concurrentTasks) : 5; + queueInterval = queueInterval ? Math.abs(queueInterval) : 33; + cpuLimit = cpuLimit ? Math.abs(cpuLimit) : undefined; + const items: ColumnarTree[] = []; const { dataset, pointSize } = grid; const unitsPerPixel = Vec2.div(Box2D.size(view), screen); const rowSize = Math.floor(Math.sqrt(Object.keys(dataset.slides).length)); - camera = { ...camera, view: applyOptionalTrn(camera.view, grid.toModelSpace, true) } + camera = { ...camera, view: applyOptionalTrn(camera.view, grid.toModelSpace, true) }; Object.keys(dataset.slides).forEach((slideId, i) => { const slide = dataset.slides[slideId]; - const gridIndex: vec2 = [i % rowSize, Math.floor(i / rowSize)] + const gridIndex: vec2 = [i % rowSize, Math.floor(i / rowSize)]; const { bounds } = dataset; - const offset = Vec2.mul(gridIndex, Box2D.size(bounds)) - const realBounds = Box2D.translate(bounds, offset) + const offset = Vec2.mul(gridIndex, Box2D.size(bounds)); + const realBounds = Box2D.translate(bounds, offset); if (Box2D.intersection(view, realBounds)) { - items.push(...getVisibleItemsInSlide(grid.dataset, slide.id, settings.camera.view, 10 * unitsPerPixel[0]).map(t => ({ ...t, offset }))) + items.push( + ...getVisibleItemsInSlide(grid.dataset, slide.id, settings.camera.view, 10 * unitsPerPixel[0]).map( + (t) => ({ ...t, offset }) + ) + ); } - }) - const { colorBy } = grid + }); + const { colorBy } = grid; // make the frame, return some junk - return beginLongRunningFrame(concurrentTasks, queueInterval, items, cache, - { view, dataset, target, colorBy, regl, pointSize }, fetchItem, renderer, callback, + return beginLongRunningFrame( + concurrentTasks, + queueInterval, + items, + cache, + { view, dataset, target, colorBy, regl, pointSize }, + fetchItem, + renderer, + callback, cacheKey, - cpuLimit); -} \ No newline at end of file + cpuLimit + ); +} diff --git a/apps/layers/src/data-renderers/lineRenderer.ts b/apps/layers/src/data-renderers/lineRenderer.ts index 50a3bf5..49fd6d7 100644 --- a/apps/layers/src/data-renderers/lineRenderer.ts +++ b/apps/layers/src/data-renderers/lineRenderer.ts @@ -1,18 +1,24 @@ -import type { box2D, vec2, vec4 } from '@alleninstitute/vis-geometry' -import REGL, { type AttributeConfig } from 'regl' -import type { ColumnData } from 'Common/loaders/scatterplot/scatterbrain-loader' -import type { TaggedFloat32Array } from 'Common/typed-array' +import type { box2D, vec2, vec4 } from '@alleninstitute/vis-geometry'; +import REGL, { type AttributeConfig } from 'regl'; +import type { ColumnData } from 'Common/loaders/scatterplot/scatterbrain-loader'; +import type { TaggedFloat32Array } from 'Common/typed-array'; -type Attrs = { pos: REGL.AttributeConfig } -type Unis = { view: vec4, color: vec4 } -type Props = { target: REGL.Framebuffer2D | null, view: vec4, color: vec4, pos: REGL.AttributeConfig | REGL.BufferData, count: number } +type Attrs = { pos: REGL.AttributeConfig }; +type Unis = { view: vec4; color: vec4 }; +type Props = { + target: REGL.Framebuffer2D | null; + view: vec4; + color: vec4; + pos: REGL.AttributeConfig | REGL.BufferData; + count: number; +}; const frag = ` precision highp float; uniform vec4 color; void main(){ gl_FragColor = color; -}` +}`; const vert = ` precision highp float; attribute vec2 pos; @@ -23,7 +29,7 @@ void main(){ vec2 unit = (pos-view.xy)/size; vec2 clip = 2.0*(unit-0.5); gl_Position = vec4(clip.x,clip.y,0,1); -}` +}`; export function buildLineRenderer(regl: REGL.Regl) { const cmd = regl({ frag, @@ -39,12 +45,12 @@ export function buildLineRenderer(regl: REGL.Regl) { enable: false, }, depth: { - enable: false + enable: false, }, count: regl.prop('count'), primitive: 'line strip', - framebuffer: regl.prop('target') - }) + framebuffer: regl.prop('target'), + }); return (points: Float32Array, color: vec4, view: box2D, target: REGL.Framebuffer2D | null) => { const { minCorner, maxCorner } = view; cmd({ @@ -52,24 +58,28 @@ export function buildLineRenderer(regl: REGL.Regl) { color, view: [...minCorner, ...maxCorner], pos: points, - count: points.length / 2 - }) - } + count: points.length / 2, + }); + }; } export type Path = { id: number; color: vec4; bounds: box2D; points: Array; -} +}; export function buildPathRenderer(regl: REGL.Regl) { const cmd = buildLineRenderer(regl); - return (item: Path, settings: { view: box2D, target: REGL.Framebuffer2D | null }, tasks: Record) => { - const pos = tasks['position'] - const { view, target } = settings + return ( + item: Path, + settings: { view: box2D; target: REGL.Framebuffer2D | null }, + tasks: Record + ) => { + const pos = tasks['position']; + const { view, target } = settings; if (pos && 'type' in pos && pos.type === 'float') { cmd(pos.data, item.color, view, target); } - } -} \ No newline at end of file + }; +} diff --git a/apps/layers/src/data-renderers/mesh-renderer.ts b/apps/layers/src/data-renderers/mesh-renderer.ts index 1a4440c..04ab333 100644 --- a/apps/layers/src/data-renderers/mesh-renderer.ts +++ b/apps/layers/src/data-renderers/mesh-renderer.ts @@ -95,39 +95,39 @@ export function buildMeshRenderer(regl: REGL.Regl, mode: 'draw-stencil' | 'use-s }, ...(mode === 'draw-stencil' ? { - colorMask: [false, false, false, false], - stencil: { - enable: true, - mask: -1, - func: { - cmp: 'always', - mask: -1, - ref: 0, - }, - op: { - fail: 'invert', // cmp is always - thus never fails... - zfail: 'invert', - zpass: 'invert', - }, - }, - } + colorMask: [false, false, false, false], + stencil: { + enable: true, + mask: -1, + func: { + cmp: 'always', + mask: -1, + ref: 0, + }, + op: { + fail: 'invert', // cmp is always - thus never fails... + zfail: 'invert', + zpass: 'invert', + }, + }, + } : { - // use-stencil - stencil: { - enable: true, - mask: 0, - func: { - cmp: 'lequal', - mask: -1, - ref: 1, - }, - op: { - fail: 'keep', - zfail: 'keep', - zpass: 'keep', - }, - }, - }), + // use-stencil + stencil: { + enable: true, + mask: 0, + func: { + cmp: 'lequal', + mask: -1, + ref: 1, + }, + op: { + fail: 'keep', + zfail: 'keep', + zpass: 'keep', + }, + }, + }), }); return ( ...batches: { diff --git a/apps/layers/src/data-renderers/simpleAnnotationRenderer.ts b/apps/layers/src/data-renderers/simpleAnnotationRenderer.ts index 4ebdc6e..f389d74 100644 --- a/apps/layers/src/data-renderers/simpleAnnotationRenderer.ts +++ b/apps/layers/src/data-renderers/simpleAnnotationRenderer.ts @@ -1,40 +1,40 @@ - -import type REGL from "regl"; -import { beginLongRunningFrame, type AsyncDataCache } from "@alleninstitute/vis-scatterbrain"; -import type { RenderCallback } from "./types"; -import type { ColumnData } from "Common/loaders/scatterplot/scatterbrain-loader"; -import { Box2D, type box2D } from "@alleninstitute/vis-geometry"; -import type { Path, buildPathRenderer } from "./lineRenderer"; -import { flatten } from "lodash"; -import type { OptionalTransform } from "../data-sources/types"; -import type { Camera } from "../../../omezarr-viewer/src/camera"; +import type REGL from 'regl'; +import { beginLongRunningFrame, type AsyncDataCache } from '@alleninstitute/vis-scatterbrain'; +import type { RenderCallback } from './types'; +import type { ColumnData } from 'Common/loaders/scatterplot/scatterbrain-loader'; +import { Box2D, type box2D } from '@alleninstitute/vis-geometry'; +import type { Path, buildPathRenderer } from './lineRenderer'; +import { flatten } from 'lodash'; +import type { OptionalTransform } from '../data-sources/types'; +import type { Camera } from '../../../omezarr-viewer/src/camera'; type Renderer = ReturnType; export type SimpleAnnotation = { - paths: Array -} & OptionalTransform + paths: Array; +} & OptionalTransform; export type RenderSettings = { camera: Camera; cache: AsyncDataCache; - renderer: Renderer, - callback: RenderCallback, - regl: REGL.Regl, - concurrentTasks?: number, - queueInterval?: number, - cpuLimit?: number, -} + renderer: Renderer; + callback: RenderCallback; + regl: REGL.Regl; + concurrentTasks?: number; + queueInterval?: number; + cpuLimit?: number; +}; function getVisibleStrokes(camera: Camera, layer: SimpleAnnotation) { - return layer.paths.filter((p) => !!Box2D.intersection(camera.view, p.bounds)) + return layer.paths.filter((p) => !!Box2D.intersection(camera.view, p.bounds)); } function requestsForPath(p: Path) { return { - 'position': () => Promise.resolve({ - type: 'float', - data: new Float32Array(flatten(p.points)) - }) - } + position: () => + Promise.resolve({ + type: 'float', + data: new Float32Array(flatten(p.points)), + }), + }; } export function renderAnnotationLayer( target: REGL.Framebuffer2D | null, @@ -42,17 +42,19 @@ export function renderAnnotationLayer( settings: RenderSettings ) { const { camera, cache, renderer, callback } = settings; - const items = getVisibleStrokes(camera, layer) - return beginLongRunningFrame( - 5, 33, - items, cache, + const items = getVisibleStrokes(camera, layer); + return beginLongRunningFrame( + 5, + 33, + items, + cache, { view: camera.view, - target + target, }, requestsForPath, renderer, callback, (rq: string, path: Path) => `${rq}_${path.id}_${path.points.length}` - ) -} \ No newline at end of file + ); +} diff --git a/apps/layers/src/data-renderers/types.ts b/apps/layers/src/data-renderers/types.ts index 7bec7f8..2f6fc4f 100644 --- a/apps/layers/src/data-renderers/types.ts +++ b/apps/layers/src/data-renderers/types.ts @@ -1,44 +1,36 @@ - // generic rendering of renderable things... -import type { Interval, box2D, vec2, vec4 } from "@alleninstitute/vis-geometry"; -import type { NormalStatus } from "@alleninstitute/vis-scatterbrain"; -import type { ZarrDataset } from "Common/loaders/ome-zarr/zarr-data"; -import type { SlideViewDataset, ColumnRequest } from "Common/loaders/scatterplot/scatterbrain-loader"; -import type { AxisAlignedPlane } from "../../../omezarr-viewer/src/slice-renderer"; - - - +import type { Interval, box2D, vec2, vec4 } from '@alleninstitute/vis-geometry'; +import type { NormalStatus } from '@alleninstitute/vis-scatterbrain'; +import type { ZarrDataset } from 'Common/loaders/ome-zarr/zarr-data'; +import type { SlideViewDataset, ColumnRequest } from 'Common/loaders/scatterplot/scatterbrain-loader'; +import type { AxisAlignedPlane } from '../../../omezarr-viewer/src/slice-renderer'; type ChannelSettings = { gamut: Interval; index: number; -} +}; export type ColorMapping = { R: ChannelSettings; G: ChannelSettings; B: ChannelSettings; -} - - - +}; type Path = { points: vec2[]; bounds: box2D; color: vec4; -} +}; type Drawing = { paths: readonly Path[]; // todo more later... -} +}; export type AnnotationLayer = { - type: "AnnotationLayer" + type: 'AnnotationLayer'; dimensions: 2; drawing: Drawing; -} +}; export type TwoDimensional = { - dimensions: 2 + dimensions: 2; }; -export type RenderCallback = (event: { status: NormalStatus } | { status: 'error', error: unknown }) => void; - +export type RenderCallback = (event: { status: NormalStatus } | { status: 'error'; error: unknown }) => void; diff --git a/apps/layers/src/data-renderers/utils.ts b/apps/layers/src/data-renderers/utils.ts index 51b73aa..45dbe4d 100644 --- a/apps/layers/src/data-renderers/utils.ts +++ b/apps/layers/src/data-renderers/utils.ts @@ -1,6 +1,6 @@ -import { Box2D, Vec2, type box2D, type vec2 } from "@alleninstitute/vis-geometry"; +import { Box2D, Vec2, type box2D, type vec2 } from '@alleninstitute/vis-geometry'; -export function applyOptionalTrn(box:box2D, trn:undefined | {offset:vec2}, inv:boolean=false){ +export function applyOptionalTrn(box: box2D, trn: undefined | { offset: vec2 }, inv: boolean = false) { // todo scale... - return trn ? Box2D.translate(box,Vec2.scale(trn.offset, inv?-1:1)) : box; -} \ No newline at end of file + return trn ? Box2D.translate(box, Vec2.scale(trn.offset, inv ? -1 : 1)) : box; +} diff --git a/apps/layers/src/data-renderers/volumeSliceRenderer.ts b/apps/layers/src/data-renderers/volumeSliceRenderer.ts index b30d41c..f234059 100644 --- a/apps/layers/src/data-renderers/volumeSliceRenderer.ts +++ b/apps/layers/src/data-renderers/volumeSliceRenderer.ts @@ -1,33 +1,53 @@ -import type REGL from "regl"; -import { beginLongRunningFrame, type AsyncDataCache } from "@alleninstitute/vis-scatterbrain"; -import type { RenderCallback } from "./types"; -import { cacheKeyFactory, getVisibleTiles, requestsForTile, type AxisAlignedPlane, type buildVersaRenderer, type VoxelSliceRenderSettings, type VoxelTile } from "../../../omezarr-viewer/src/versa-renderer"; -import { pickBestScale, sizeInUnits, sizeInVoxels, sliceDimensionForPlane, uvForPlane } from "Common/loaders/ome-zarr/zarr-data"; -import { applyOptionalTrn } from "./utils"; -import { Box2D, Vec2, type vec2 } from "@alleninstitute/vis-geometry"; -import type { AxisAlignedZarrSlice } from "../data-sources/ome-zarr/planar-slice"; -import type { AxisAlignedZarrSliceGrid } from "../data-sources/ome-zarr/slice-grid"; -import { type Camera } from "../../../omezarr-viewer/src/camera"; +import type REGL from 'regl'; +import { beginLongRunningFrame, type AsyncDataCache } from '@alleninstitute/vis-scatterbrain'; +import type { RenderCallback } from './types'; +import { + cacheKeyFactory, + getVisibleTiles, + requestsForTile, + type AxisAlignedPlane, + type buildVersaRenderer, + type VoxelSliceRenderSettings, + type VoxelTile, +} from '../../../omezarr-viewer/src/versa-renderer'; +import { + pickBestScale, + sizeInUnits, + sizeInVoxels, + sliceDimensionForPlane, + uvForPlane, +} from 'Common/loaders/ome-zarr/zarr-data'; +import { applyOptionalTrn } from './utils'; +import { Box2D, Vec2, type vec2 } from '@alleninstitute/vis-geometry'; +import type { AxisAlignedZarrSlice } from '../data-sources/ome-zarr/planar-slice'; +import type { AxisAlignedZarrSliceGrid } from '../data-sources/ome-zarr/slice-grid'; +import { type Camera } from '../../../omezarr-viewer/src/camera'; type Renderer = ReturnType; -type CacheContentType = { type: 'texture2D', data: REGL.Texture2D }; +type CacheContentType = { type: 'texture2D'; data: REGL.Texture2D }; export type RenderSettings = { camera: Camera; cache: AsyncDataCache; - renderer: Renderer, - callback: RenderCallback, - regl: REGL.Regl, - concurrentTasks?: number, - queueInterval?: number, - cpuLimit?: number, -} - + renderer: Renderer; + callback: RenderCallback; + regl: REGL.Regl; + concurrentTasks?: number; + queueInterval?: number; + cpuLimit?: number; +}; -function preferCachedEntries(grid: AxisAlignedZarrSliceGrid, settings: VoxelSliceRenderSettings, offset: vec2, cache: AsyncDataCache, camera: Camera, location: { - plane: AxisAlignedPlane, - planeIndex: number -}) { +function preferCachedEntries( + grid: AxisAlignedZarrSliceGrid, + settings: VoxelSliceRenderSettings, + offset: vec2, + cache: AsyncDataCache, + camera: Camera, + location: { + plane: AxisAlignedPlane; + planeIndex: number; + } +) { const { plane, planeIndex } = location; const idealTiles = getVisibleTiles(camera, plane, planeIndex, grid.dataset, offset); const fakes: VoxelTile[] = []; @@ -35,37 +55,46 @@ function preferCachedEntries(grid: AxisAl for (const tile of idealTiles.tiles) { const isCached = (t: VoxelTile) => { const requests = requestsForTile(t, settings); - const cacheKeys = Object.keys(requests).map(rq => cacheKeyFactory(rq, t, settings)) - return cache.areKeysAllCached(cacheKeys) - } + const cacheKeys = Object.keys(requests).map((rq) => cacheKeyFactory(rq, t, settings)); + return cache.areKeysAllCached(cacheKeys); + }; if (!isCached(tile)) { // search a different layer for a stand-in in this area... feels pretty slow... // for now just stick with the most low-res layer... - const lowerLOD = getVisibleTiles({ ...camera, view: tile.realBounds, screen: [1, 1] }, plane, planeIndex, grid.dataset, offset); - fakes.push(...lowerLOD.tiles) + const lowerLOD = getVisibleTiles( + { ...camera, view: tile.realBounds, screen: [1, 1] }, + plane, + planeIndex, + grid.dataset, + offset + ); + fakes.push(...lowerLOD.tiles); } } - return { fake: fakes, ideal: idealTiles } + return { fake: fakes, ideal: idealTiles }; } // todo: write a helper function that makes much smarter descisions about // what (already cached) tiles to use for this frame, given the view, the dataset, // and the cache (and the cache-key-factory...) -export function renderGrid(target: REGL.Framebuffer2D | null, grid: AxisAlignedZarrSliceGrid, settings: RenderSettings) { +export function renderGrid( + target: REGL.Framebuffer2D | null, + grid: AxisAlignedZarrSliceGrid, + settings: RenderSettings +) { const { cache, renderer, callback, regl } = settings; let { camera, concurrentTasks, queueInterval, cpuLimit } = settings; - const { dataset, gamut, plane, slices } = grid + const { dataset, gamut, plane, slices } = grid; const { axes } = dataset.multiscales[0]; - concurrentTasks = concurrentTasks ? Math.abs(concurrentTasks) : 5 - queueInterval = queueInterval ? Math.abs(queueInterval) : 33 - cpuLimit = cpuLimit ? Math.abs(cpuLimit) : undefined + concurrentTasks = concurrentTasks ? Math.abs(concurrentTasks) : 5; + queueInterval = queueInterval ? Math.abs(queueInterval) : 33; + cpuLimit = cpuLimit ? Math.abs(cpuLimit) : undefined; const rowSize = Math.floor(Math.sqrt(slices)); const allItems: VoxelTile[] = []; - const smokeAndMirrors: VoxelTile[] = [] + const smokeAndMirrors: VoxelTile[] = []; const best = pickBestScale(dataset, uvForPlane(plane), camera.view, camera.screen); - const renderSettings = - { + const renderSettings = { dataset, gamut, regl, @@ -73,61 +102,75 @@ export function renderGrid(target: REGL.F target, view: camera.view, viewport: { - x: 0, y: 0, + x: 0, + y: 0, width: camera.screen[0], - height: camera.screen[1] + height: camera.screen[1], }, }; for (let i = 0; i < slices; i++) { - const gridIndex: vec2 = [i % rowSize, Math.floor(i / rowSize)] + const gridIndex: vec2 = [i % rowSize, Math.floor(i / rowSize)]; let param = i / slices; - const slice: AxisAlignedZarrSlice = { ...grid, type: 'AxisAlignedZarrSlice', planeParameter: param } - const curCam = { ...camera, view: applyOptionalTrn(camera.view, slice.toModelSpace, true) } + const slice: AxisAlignedZarrSlice = { ...grid, type: 'AxisAlignedZarrSlice', planeParameter: param }; + const curCam = { ...camera, view: applyOptionalTrn(camera.view, slice.toModelSpace, true) }; const dim = sizeInVoxels(sliceDimensionForPlane(plane), axes, best); const realSize = sizeInUnits(plane, axes, best)!; - const offset = Vec2.mul(gridIndex, realSize) - // the bounds of this slice might not even be in view! + const offset = Vec2.mul(gridIndex, realSize); + // the bounds of this slice might not even be in view! // if we did this a bit different... we could know from the index, without having to conditionally test... TODO if (Box2D.intersection(curCam.view, Box2D.translate(Box2D.create([0, 0], realSize), offset))) { - const planeIndex = Math.round(param * (dim ?? 0)) + const planeIndex = Math.round(param * (dim ?? 0)); const { fake, ideal } = preferCachedEntries(grid, renderSettings, offset, cache, curCam, { plane, - planeIndex + planeIndex, }); // get all the items for the lowest level of detail: - smokeAndMirrors.push(...fake) - allItems.push(...ideal.tiles) - + smokeAndMirrors.push(...fake); + allItems.push(...ideal.tiles); } - } - const frame = beginLongRunningFrame(concurrentTasks, queueInterval, + const frame = beginLongRunningFrame( + concurrentTasks, + queueInterval, [...smokeAndMirrors, ...allItems], cache, - renderSettings, requestsForTile, renderer, callback, cacheKeyFactory, cpuLimit) + renderSettings, + requestsForTile, + renderer, + callback, + cacheKeyFactory, + cpuLimit + ); return frame; } -export function renderSlice(target: REGL.Framebuffer2D | null, slice: AxisAlignedZarrSlice, settings: RenderSettings) { +export function renderSlice( + target: REGL.Framebuffer2D | null, + slice: AxisAlignedZarrSlice, + settings: RenderSettings +) { const { cache, renderer, callback, regl } = settings; let { camera, concurrentTasks, queueInterval, cpuLimit } = settings; - const { dataset, planeParameter, gamut, plane } = slice - concurrentTasks = concurrentTasks ? Math.abs(concurrentTasks) : 5 - queueInterval = queueInterval ? Math.abs(queueInterval) : 33 - cpuLimit = cpuLimit ? Math.abs(cpuLimit) : undefined + const { dataset, planeParameter, gamut, plane } = slice; + concurrentTasks = concurrentTasks ? Math.abs(concurrentTasks) : 5; + queueInterval = queueInterval ? Math.abs(queueInterval) : 33; + cpuLimit = cpuLimit ? Math.abs(cpuLimit) : undefined; const desiredResolution = camera.screen; // convert planeParameter to planeIndex - which requires knowing the bounds of the appropriate dimension - camera = { ...camera, view: applyOptionalTrn(camera.view, slice.toModelSpace, true) } + camera = { ...camera, view: applyOptionalTrn(camera.view, slice.toModelSpace, true) }; const best = pickBestScale(dataset, uvForPlane(plane), camera.view, desiredResolution); const axes = dataset.multiscales[0].axes; const dim = sizeInVoxels(sliceDimensionForPlane(plane), axes, best); - const planeIndex = Math.round(planeParameter * (dim ?? 0)) + const planeIndex = Math.round(planeParameter * (dim ?? 0)); const items = getVisibleTiles({ ...camera, screen: desiredResolution }, plane, planeIndex, dataset); - const frame = beginLongRunningFrame(concurrentTasks, queueInterval, - items.tiles, cache, + const frame = beginLongRunningFrame( + concurrentTasks, + queueInterval, + items.tiles, + cache, { dataset, gamut, @@ -136,10 +179,17 @@ export function renderSlice(target: REGL. target, view: items.view, viewport: { - x: 0, y: 0, + x: 0, + y: 0, width: camera.screen[0], - height: camera.screen[1] + height: camera.screen[1], }, - }, requestsForTile, renderer, callback, cacheKeyFactory, cpuLimit); + }, + requestsForTile, + renderer, + callback, + cacheKeyFactory, + cpuLimit + ); return frame; -} \ No newline at end of file +} diff --git a/apps/layers/src/data-sources/annotation/annotation-codec.ts b/apps/layers/src/data-sources/annotation/annotation-codec.ts index ca73315..fd04f57 100644 --- a/apps/layers/src/data-sources/annotation/annotation-codec.ts +++ b/apps/layers/src/data-sources/annotation/annotation-codec.ts @@ -1,4 +1,4 @@ -import type { AnnotationCodec } from "./annotation-schema-type"; +import type { AnnotationCodec } from './annotation-schema-type'; import { parseSchema, compileSchema } from 'kiwi-schema'; export const AnnotationSchema = ` @@ -41,4 +41,4 @@ export function getAnnotationCodec() { } } return codec; -} \ No newline at end of file +} diff --git a/apps/layers/src/data-sources/annotation/annotation-grid.ts b/apps/layers/src/data-sources/annotation/annotation-grid.ts index 2ee8d95..1bfb1fb 100644 --- a/apps/layers/src/data-sources/annotation/annotation-grid.ts +++ b/apps/layers/src/data-sources/annotation/annotation-grid.ts @@ -1,5 +1,5 @@ -import type { vec4 } from "@alleninstitute/vis-geometry"; -import type { SlideViewDataset } from "Common/loaders/scatterplot/scatterbrain-loader"; +import type { vec4 } from '@alleninstitute/vis-geometry'; +import type { SlideViewDataset } from 'Common/loaders/scatterplot/scatterbrain-loader'; export type AnnotationGridConfig = { type: 'AnnotationGridConfig'; @@ -7,26 +7,26 @@ export type AnnotationGridConfig = { annotationUrl: string; levelFeature: string; stroke: { - overrideColor?: vec4, - opacity: number, + overrideColor?: vec4; + opacity: number; }; fill: { - overrideColor?: vec4, - opacity: number + overrideColor?: vec4; + opacity: number; }; -} +}; export type AnnotationGrid = { - type: 'AnnotationGrid', + type: 'AnnotationGrid'; dataset: SlideViewDataset; annotationBaseUrl: string; levelFeature: string; stroke: { - overrideColor?: vec4, - opacity: number, - width: number, - }, + overrideColor?: vec4; + opacity: number; + width: number; + }; fill: { - overrideColor?: vec4, - opacity: number - } -} \ No newline at end of file + overrideColor?: vec4; + opacity: number; + }; +}; diff --git a/apps/layers/src/data-sources/annotation/annotation-to-mesh.ts b/apps/layers/src/data-sources/annotation/annotation-to-mesh.ts index bcb8e2a..49280c2 100644 --- a/apps/layers/src/data-sources/annotation/annotation-to-mesh.ts +++ b/apps/layers/src/data-sources/annotation/annotation-to-mesh.ts @@ -6,27 +6,28 @@ function groupLoops(path: Path) { // collect each closed polygon from the path - because path commands are very flexible, // there could be multiple overlapping polygons in a single path! const { commands } = path; - const closed = commands?.reduce( - (loops: PathCommand[][], command) => { - const curLoop = loops[loops.length - 1]; - switch (command.type) { - case 'ClosePolygon': - curLoop.push(command); - // start a new loop - loops.push([]); - break; - case 'LineTo': - case 'MoveTo': - case 'CurveTo': - curLoop.push(command); - break; - default: - break; - } - return loops; - }, - [[]] as PathCommand[][] - ) ?? [] + const closed = + commands?.reduce( + (loops: PathCommand[][], command) => { + const curLoop = loops[loops.length - 1]; + switch (command.type) { + case 'ClosePolygon': + curLoop.push(command); + // start a new loop + loops.push([]); + break; + case 'LineTo': + case 'MoveTo': + case 'CurveTo': + curLoop.push(command); + break; + default: + break; + } + return loops; + }, + [[]] as PathCommand[][] + ) ?? []; return closed.filter((loop) => loop.length > 0); } // helper function for computing a bounding box of a bunch of uncertain stuff in a reasonably performant way @@ -71,17 +72,16 @@ function closedPolygon(loop: PathCommand[]) { default: } return acc; - }, initialState) + }, initialState); } function onlyDefined(collection: ReadonlyArray): ReadonlyArray { return collection.reduce((defined, cur) => { - return cur !== undefined ? [...defined, cur] : defined + return cur !== undefined ? [...defined, cur] : defined; }, [] as ReadonlyArray); } // intersection stuff: - type line = { a: vec2; b: vec2 }; /** @@ -175,11 +175,10 @@ export function findFirstHit(annotation: AnnotationMesh, p: vec2): AnnotationPol return undefined; } - - export function MeshFromAnnotation(annotation: Annotation): AnnotationMesh | undefined { const groups = - annotation.closedPolygons?.map((path) => ({ path, loops: onlyDefined(groupLoops(path).map(closedPolygon)) })) ?? []; + annotation.closedPolygons?.map((path) => ({ path, loops: onlyDefined(groupLoops(path).map(closedPolygon)) })) ?? + []; if (groups.length < 1) { return { @@ -210,7 +209,7 @@ export function MeshFromAnnotation(annotation: Annotation): AnnotationMesh | und if (group.loops.length < 1) continue; for (const loop of group.loops) { - if (!loop) continue + if (!loop) continue; const closedLoop: ClosedLoop = { start: outIndex / 2, @@ -229,9 +228,11 @@ export function MeshFromAnnotation(annotation: Annotation): AnnotationMesh | und }); } - return totalBounds === undefined ? undefined : { - bounds: totalBounds, - closedPolygons, - points, - }; + return totalBounds === undefined + ? undefined + : { + bounds: totalBounds, + closedPolygons, + points, + }; } diff --git a/apps/layers/src/data-sources/annotation/fetch-annotation.ts b/apps/layers/src/data-sources/annotation/fetch-annotation.ts index eae8fdc..040a773 100644 --- a/apps/layers/src/data-sources/annotation/fetch-annotation.ts +++ b/apps/layers/src/data-sources/annotation/fetch-annotation.ts @@ -1,4 +1,4 @@ -import { getAnnotationCodec } from "./annotation-codec"; +import { getAnnotationCodec } from './annotation-codec'; export async function fetchAnnotation(payload: { annotationBaseUrl: string; @@ -28,4 +28,4 @@ export async function fetchAnnotation(payload: { /* empty */ } return undefined; -} \ No newline at end of file +} diff --git a/apps/layers/src/data-sources/annotation/types.ts b/apps/layers/src/data-sources/annotation/types.ts index ff05454..79dd954 100644 --- a/apps/layers/src/data-sources/annotation/types.ts +++ b/apps/layers/src/data-sources/annotation/types.ts @@ -1,5 +1,5 @@ -import type { vec4, box2D } from "@alleninstitute/vis-geometry"; -import type REGL from "regl"; +import type { vec4, box2D } from '@alleninstitute/vis-geometry'; +import type REGL from 'regl'; export type ClosedLoop = { start: number; diff --git a/apps/layers/src/data-sources/ome-zarr/planar-slice.ts b/apps/layers/src/data-sources/ome-zarr/planar-slice.ts index b3c9d83..4f44565 100644 --- a/apps/layers/src/data-sources/ome-zarr/planar-slice.ts +++ b/apps/layers/src/data-sources/ome-zarr/planar-slice.ts @@ -1,38 +1,38 @@ -import { load, type ZarrDataset } from "Common/loaders/ome-zarr/zarr-data"; -import type { AxisAlignedPlane } from "../../../../omezarr-viewer/src/versa-renderer"; -import type { ColorMapping } from "../../data-renderers/types"; -import type { OptionalTransform, Simple2DTransform } from "../types"; +import { load, type ZarrDataset } from 'Common/loaders/ome-zarr/zarr-data'; +import type { AxisAlignedPlane } from '../../../../omezarr-viewer/src/versa-renderer'; +import type { ColorMapping } from '../../data-renderers/types'; +import type { OptionalTransform, Simple2DTransform } from '../types'; export type ZarrSliceConfig = { - type: 'zarrSliceConfig', + type: 'zarrSliceConfig'; url: string; plane: AxisAlignedPlane; planeParameter: number; // [0:1] eg. if if plane is 'xy' and parameter is 0.5, then we want the slice from the middle of the z-axis gamut: ColorMapping; rotation?: number; trn?: Simple2DTransform | undefined; -} +}; export type AxisAlignedZarrSlice = { - type: 'AxisAlignedZarrSlice' + type: 'AxisAlignedZarrSlice'; dataset: ZarrDataset; plane: AxisAlignedPlane; planeParameter: number; gamut: ColorMapping; rotation: number; -} & OptionalTransform +} & OptionalTransform; function assembleZarrSlice(config: ZarrSliceConfig, dataset: ZarrDataset): AxisAlignedZarrSlice { - const { rotation, trn } = config + const { rotation, trn } = config; return { ...config, type: 'AxisAlignedZarrSlice', dataset, toModelSpace: trn, - rotation: rotation ?? 0 - } + rotation: rotation ?? 0, + }; } export function createZarrSlice(config: ZarrSliceConfig): Promise { const { url } = config; return load(url).then((dataset) => { - return assembleZarrSlice(config, dataset) - }) + return assembleZarrSlice(config, dataset); + }); } diff --git a/apps/layers/src/data-sources/ome-zarr/slice-grid.ts b/apps/layers/src/data-sources/ome-zarr/slice-grid.ts index 588cedc..cca49c9 100644 --- a/apps/layers/src/data-sources/ome-zarr/slice-grid.ts +++ b/apps/layers/src/data-sources/ome-zarr/slice-grid.ts @@ -1,40 +1,39 @@ -import { load, type ZarrDataset } from "Common/loaders/ome-zarr/zarr-data"; -import type { AxisAlignedPlane } from "../../../../omezarr-viewer/src/versa-renderer"; -import type { ColorMapping } from "../../data-renderers/types"; -import type { OptionalTransform, Simple2DTransform } from "../types"; - +import { load, type ZarrDataset } from 'Common/loaders/ome-zarr/zarr-data'; +import type { AxisAlignedPlane } from '../../../../omezarr-viewer/src/versa-renderer'; +import type { ColorMapping } from '../../data-renderers/types'; +import type { OptionalTransform, Simple2DTransform } from '../types'; export type ZarrSliceGridConfig = { - type: 'ZarrSliceGridConfig', + type: 'ZarrSliceGridConfig'; url: string; plane: AxisAlignedPlane; slices: number; // divide this volume into this many slices, and arrange them in a grid. gamut: ColorMapping; rotation?: number; trn?: Simple2DTransform | undefined; -} +}; export type AxisAlignedZarrSliceGrid = { - type: 'AxisAlignedZarrSliceGrid' + type: 'AxisAlignedZarrSliceGrid'; dataset: ZarrDataset; plane: AxisAlignedPlane; slices: number; gamut: ColorMapping; rotation: number; -} & OptionalTransform +} & OptionalTransform; function assembleZarrSliceGrid(config: ZarrSliceGridConfig, dataset: ZarrDataset): AxisAlignedZarrSliceGrid { - const { rotation, trn } = config + const { rotation, trn } = config; return { ...config, type: 'AxisAlignedZarrSliceGrid', dataset, toModelSpace: trn, - rotation: rotation ?? 0 - } + rotation: rotation ?? 0, + }; } export function createZarrSliceGrid(config: ZarrSliceGridConfig): Promise { const { url } = config; return load(url).then((dataset) => { - return assembleZarrSliceGrid(config, dataset) - }) + return assembleZarrSliceGrid(config, dataset); + }); } diff --git a/apps/layers/src/data-sources/scatterplot/dynamic-grid.ts b/apps/layers/src/data-sources/scatterplot/dynamic-grid.ts index 1d2e5da..be7ba2c 100644 --- a/apps/layers/src/data-sources/scatterplot/dynamic-grid.ts +++ b/apps/layers/src/data-sources/scatterplot/dynamic-grid.ts @@ -1,41 +1,45 @@ -import { isSlideViewData, loadDataset, loadScatterbrainJson, type ColumnRequest, type ColumnarMetadata, type SlideViewDataset } from "Common/loaders/scatterplot/scatterbrain-loader"; -import type { OptionalTransform, Simple2DTransform } from "../types"; +import { + isSlideViewData, + loadDataset, + loadScatterbrainJson, + type ColumnRequest, + type ColumnarMetadata, + type SlideViewDataset, +} from 'Common/loaders/scatterplot/scatterbrain-loader'; +import type { OptionalTransform, Simple2DTransform } from '../types'; export type ScatterplotGridConfig = { type: 'ScatterPlotGridConfig'; colorBy: ColumnRequest; url: string; trn?: Simple2DTransform | undefined; -} +}; export type ScatterPlotGridSlideConfig = { type: 'ScatterPlotGridSlideConfig'; slideId: string; colorBy: ColumnRequest; url: string; trn?: Simple2DTransform | undefined; -} +}; export type DynamicGridSlide = { - type: 'DynamicGridSlide' + type: 'DynamicGridSlide'; dataset: SlideViewDataset; slideId: string; colorBy: ColumnRequest; pointSize: number; } & OptionalTransform; - export type DynamicGrid = { - type: 'DynamicGrid' + type: 'DynamicGrid'; dataset: SlideViewDataset; colorBy: ColumnRequest; pointSize: number; } & OptionalTransform; - - // create the real deal from the config function assembleSlideConfig(config: ScatterPlotGridSlideConfig, dataset: SlideViewDataset): DynamicGridSlide { - const { colorBy, slideId, trn } = config + const { colorBy, slideId, trn } = config; return { type: 'DynamicGridSlide', colorBy, @@ -43,36 +47,36 @@ function assembleSlideConfig(config: ScatterPlotGridSlideConfig, dataset: SlideV slideId, pointSize: 4, toModelSpace: trn, - } + }; } -export function createSlideDataset(config: ScatterPlotGridSlideConfig,): Promise { - const { url } = config +export function createSlideDataset(config: ScatterPlotGridSlideConfig): Promise { + const { url } = config; return loadScatterbrainJson(url).then((metadata) => { if (isSlideViewData(metadata)) { const dataset = loadDataset(metadata, url) as SlideViewDataset; - return assembleSlideConfig(config, dataset) + return assembleSlideConfig(config, dataset); } return undefined; }); } function assembleGridConfig(config: ScatterplotGridConfig, dataset: SlideViewDataset): DynamicGrid { - const { colorBy, trn } = config + const { colorBy, trn } = config; return { type: 'DynamicGrid', colorBy, dataset, pointSize: 4, toModelSpace: trn, - } + }; } export function createGridDataset(config: ScatterplotGridConfig): Promise { - const { url } = config + const { url } = config; return loadScatterbrainJson(url).then((metadata) => { if (isSlideViewData(metadata)) { const dataset = loadDataset(metadata, url) as SlideViewDataset; - return assembleGridConfig(config, dataset) + return assembleGridConfig(config, dataset); } return undefined; }); -} \ No newline at end of file +} diff --git a/apps/layers/src/data-sources/types.ts b/apps/layers/src/data-sources/types.ts index c9a796d..3eb4605 100644 --- a/apps/layers/src/data-sources/types.ts +++ b/apps/layers/src/data-sources/types.ts @@ -1,14 +1,16 @@ -import type { vec2 } from "@alleninstitute/vis-geometry"; +import type { vec2 } from '@alleninstitute/vis-geometry'; export type MaybePromise = T | Promise; // we'd like to be able to configure a layer with a simple payload export type Simple2DTransform = { offset: vec2; scale: vec2; -} +}; export type OptionalTransform = { - toModelSpace?: { - offset: vec2; - scale: vec2; - } | undefined -} \ No newline at end of file + toModelSpace?: + | { + offset: vec2; + scale: vec2; + } + | undefined; +}; diff --git a/apps/layers/src/demo.ts b/apps/layers/src/demo.ts index edba0fe..60be4f6 100644 --- a/apps/layers/src/demo.ts +++ b/apps/layers/src/demo.ts @@ -1,28 +1,56 @@ -import { Box2D, Vec2, type box2D, type vec2 } from "@alleninstitute/vis-geometry"; -import { type ColumnRequest } from "Common/loaders/scatterplot/scatterbrain-loader"; -import REGL from "regl"; -import { AsyncDataCache, ReglLayer2D, type FrameLifecycle, type NormalStatus } from "@alleninstitute/vis-scatterbrain"; -import { buildRenderer } from "../../scatterplot/src/renderer"; -import { buildImageRenderer } from "../../omezarr-viewer/src/image-renderer"; -import { renderDynamicGrid, renderSlide, type RenderSettings as SlideRenderSettings } from "./data-renderers/dynamicGridSlideRenderer"; -import { renderGrid, renderSlice, type RenderSettings as SliceRenderSettings } from "./data-renderers/volumeSliceRenderer"; -import { renderAnnotationLayer, type RenderSettings as AnnotationRenderSettings, type SimpleAnnotation } from "./data-renderers/simpleAnnotationRenderer"; -import { buildPathRenderer } from "./data-renderers/lineRenderer"; -import { buildVersaRenderer, type AxisAlignedPlane } from "../../omezarr-viewer/src/versa-renderer"; -import type { ColorMapping, RenderCallback } from "./data-renderers/types"; -import { createZarrSlice, type AxisAlignedZarrSlice, type ZarrSliceConfig } from "./data-sources/ome-zarr/planar-slice"; -import { createGridDataset, createSlideDataset, type DynamicGrid, type DynamicGridSlide, type ScatterPlotGridSlideConfig, type ScatterplotGridConfig } from "./data-sources/scatterplot/dynamic-grid"; -import type { OptionalTransform } from "./data-sources/types"; -import type { CacheEntry, AnnotationLayer, Layer } from "./types"; -import { AppUi } from "./app"; -import { createRoot } from "react-dom/client"; -import { createZarrSliceGrid, type AxisAlignedZarrSliceGrid, type ZarrSliceGridConfig } from "./data-sources/ome-zarr/slice-grid"; -import { renderAnnotationGrid, type LoopRenderer, type MeshRenderer, type RenderSettings as AnnotationGridRenderSettings } from "./data-renderers/annotation-renderer"; -import { buildLoopRenderer, buildMeshRenderer } from "./data-renderers/mesh-renderer"; -import type { Camera } from "../../omezarr-viewer/src/camera"; -import { saveAs } from 'file-saver' -import type { AnnotationGrid, AnnotationGridConfig } from "./data-sources/annotation/annotation-grid"; -import { sizeInUnits } from "Common/loaders/ome-zarr/zarr-data"; +import { Box2D, Vec2, type box2D, type vec2 } from '@alleninstitute/vis-geometry'; +import { type ColumnRequest } from 'Common/loaders/scatterplot/scatterbrain-loader'; +import REGL from 'regl'; +import { AsyncDataCache, ReglLayer2D, type FrameLifecycle, type NormalStatus } from '@alleninstitute/vis-scatterbrain'; +import { buildRenderer } from '../../scatterplot/src/renderer'; +import { buildImageRenderer } from '../../omezarr-viewer/src/image-renderer'; +import { + renderDynamicGrid, + renderSlide, + type RenderSettings as SlideRenderSettings, +} from './data-renderers/dynamicGridSlideRenderer'; +import { + renderGrid, + renderSlice, + type RenderSettings as SliceRenderSettings, +} from './data-renderers/volumeSliceRenderer'; +import { + renderAnnotationLayer, + type RenderSettings as AnnotationRenderSettings, + type SimpleAnnotation, +} from './data-renderers/simpleAnnotationRenderer'; +import { buildPathRenderer } from './data-renderers/lineRenderer'; +import { buildVersaRenderer, type AxisAlignedPlane } from '../../omezarr-viewer/src/versa-renderer'; +import type { ColorMapping, RenderCallback } from './data-renderers/types'; +import { createZarrSlice, type AxisAlignedZarrSlice, type ZarrSliceConfig } from './data-sources/ome-zarr/planar-slice'; +import { + createGridDataset, + createSlideDataset, + type DynamicGrid, + type DynamicGridSlide, + type ScatterPlotGridSlideConfig, + type ScatterplotGridConfig, +} from './data-sources/scatterplot/dynamic-grid'; +import type { OptionalTransform } from './data-sources/types'; +import type { CacheEntry, AnnotationLayer, Layer } from './types'; +import { AppUi } from './app'; +import { createRoot } from 'react-dom/client'; +import { + createZarrSliceGrid, + type AxisAlignedZarrSliceGrid, + type ZarrSliceGridConfig, +} from './data-sources/ome-zarr/slice-grid'; +import { + renderAnnotationGrid, + type LoopRenderer, + type MeshRenderer, + type RenderSettings as AnnotationGridRenderSettings, +} from './data-renderers/annotation-renderer'; +import { buildLoopRenderer, buildMeshRenderer } from './data-renderers/mesh-renderer'; +import type { Camera } from '../../omezarr-viewer/src/camera'; +import { saveAs } from 'file-saver'; +import type { AnnotationGrid, AnnotationGridConfig } from './data-sources/annotation/annotation-grid'; +import { sizeInUnits } from 'Common/loaders/ome-zarr/zarr-data'; const KB = 1000; const MB = 1000 * KB; @@ -44,7 +72,7 @@ function destroyer(item: CacheEntry) { break; default: // @ts-expect-error - console.error(item.data, 'implement a destroyer for this case!') + console.error(item.data, 'implement a destroyer for this case!'); break; } } @@ -55,7 +83,7 @@ function appendPoint(layer: AnnotationLayer, p: vec2) { const path = layer.data.paths[layer.data.paths.length - 1]; if (path) { path.points.push(p); - path.bounds = Box2D.union(path.bounds, Box2D.create(p, p)) + path.bounds = Box2D.union(path.bounds, Box2D.create(p, p)); } } function startStroke(layer: AnnotationLayer, p: vec2) { @@ -63,26 +91,23 @@ function startStroke(layer: AnnotationLayer, p: vec2) { bounds: Box2D.create(p, p), color: [1, 0, 0, 1], id: Math.random(), - points: [p] - }) + points: [p], + }); } export class Demo { - - - camera: Camera; - layers: Layer[] + layers: Layer[]; regl: REGL.Regl; selectedLayer: number; canvas: HTMLCanvasElement; - mouse: 'up' | 'down' - mode: 'draw' | 'pan' + mouse: 'up' | 'down'; + mode: 'draw' | 'pan'; mousePos: vec2; cache: AsyncDataCache; imgRenderer: ReturnType; plotRenderer: ReturnType; sliceRenderer: ReturnType; - pathRenderer: ReturnType + pathRenderer: ReturnType; loopRenderer: LoopRenderer; meshRenderer: MeshRenderer; stencilMeshRenderer: MeshRenderer; @@ -90,11 +115,11 @@ export class Demo { private redrawRequested: number = 0; constructor(canvas: HTMLCanvasElement, regl: REGL.Regl) { this.canvas = canvas; - this.mouse = 'up' + this.mouse = 'up'; this.regl = regl; - this.mousePos = [0, 0] + this.mousePos = [0, 0]; this.layers = []; - this.mode = 'pan' + this.mode = 'pan'; this.selectedLayer = 0; this.pathRenderer = buildPathRenderer(regl); this.plotRenderer = buildRenderer(regl); @@ -110,8 +135,8 @@ export class Demo { this.camera = { view: Box2D.create([0, 0], [(10 * w) / h, 10]), screen: [w, h], - projection: 'webImage' - } + projection: 'webImage', + }; this.initHandlers(canvas); // each entry in the cache is about 250 kb - so 4000 means we get 1GB of data this.cache = new AsyncDataCache(destroyer, sizeOf, 4000); @@ -120,7 +145,7 @@ export class Demo { if (i >= 0 && i < this.layers.length) { this.selectedLayer = i; if (this.layers[i].type !== 'annotationLayer') { - this.mode = 'pan' + this.mode = 'pan'; } } } @@ -145,7 +170,7 @@ export class Demo { setSlice(param: number) { const layer = this.layers[this.selectedLayer]; if (layer && layer.type === 'volumeSlice') { - layer.data = { ...layer.data, planeParameter: param } + layer.data = { ...layer.data, planeParameter: param }; this.uiChange(); } } @@ -173,40 +198,50 @@ export class Demo { addDynamicGrid(config: ScatterplotGridConfig) { return createGridDataset(config).then((data) => { if (data) { - const [w, h] = this.camera.screen + const [w, h] = this.camera.screen; const layer = new ReglLayer2D>( - this.regl, this.imgRenderer, renderDynamicGrid, [w, h] + this.regl, + this.imgRenderer, + renderDynamicGrid, + [w, h] ); this.layers.push({ type: 'scatterplotGrid', data, - render: layer + render: layer, }); - this.camera = { ...this.camera, view: data.dataset.bounds } + this.camera = { ...this.camera, view: data.dataset.bounds }; this.uiChange(); } - }) + }); } selectLayer(layer: number) { this.selectedLayer = Math.min(this.layers.length - 1, Math.max(0, layer)); const yay = this.layers[this.selectedLayer]; - console.log('selected:', yay.data) + console.log('selected:', yay.data); this.uiChange(); } deleteSelectedLayer() { - const removed = this.layers.splice(this.selectedLayer, 1) - removed.forEach(l => l.render.destroy()) + const removed = this.layers.splice(this.selectedLayer, 1); + removed.forEach((l) => l.render.destroy()); this.uiChange(); } - addLayer(config: ScatterplotGridConfig | ZarrSliceConfig | ZarrSliceGridConfig | ScatterPlotGridSlideConfig | AnnotationGridConfig) { + addLayer( + config: + | ScatterplotGridConfig + | ZarrSliceConfig + | ZarrSliceGridConfig + | ScatterPlotGridSlideConfig + | AnnotationGridConfig + ) { switch (config.type) { case 'AnnotationGridConfig': return this.addAnnotationGrid(config); case 'ScatterPlotGridConfig': return this.addDynamicGrid(config); case 'ScatterPlotGridSlideConfig': - return this.addScatterplot(config) + return this.addScatterplot(config); case 'ZarrSliceGridConfig': return this.addVolumeGrid(config); case 'zarrSliceConfig': @@ -214,63 +249,75 @@ export class Demo { } } addAnnotation(data: SimpleAnnotation) { - const [w, h] = this.camera.screen + const [w, h] = this.camera.screen; this.layers.push({ type: 'annotationLayer', data, render: new ReglLayer2D( - this.regl, this.imgRenderer, renderAnnotationLayer, [w, h] - ) - }) + this.regl, + this.imgRenderer, + renderAnnotationLayer, + [w, h] + ), + }); this.uiChange(); } addEmptyAnnotation() { - const [w, h] = this.camera.screen + const [w, h] = this.camera.screen; this.layers.push({ type: 'annotationLayer', data: { - paths: [] + paths: [], }, render: new ReglLayer2D( - this.regl, this.imgRenderer, renderAnnotationLayer, [w, h] - ) - }) + this.regl, + this.imgRenderer, + renderAnnotationLayer, + [w, h] + ), + }); this.uiChange(); } private addScatterplot(config: ScatterPlotGridSlideConfig) { return createSlideDataset(config).then((data) => { if (data) { - const [w, h] = this.camera.screen + const [w, h] = this.camera.screen; const layer = new ReglLayer2D>( - this.regl, this.imgRenderer, renderSlide, [w, h] + this.regl, + this.imgRenderer, + renderSlide, + [w, h] ); this.layers.push({ type: 'scatterplot', data, - render: layer + render: layer, }); - this.camera = { ...this.camera, view: data.dataset.bounds } + this.camera = { ...this.camera, view: data.dataset.bounds }; this.uiChange(); } - }) - - + }); } private addVolumeSlice(config: ZarrSliceConfig) { - const [w, h] = this.camera.screen + const [w, h] = this.camera.screen; return createZarrSlice(config).then((data) => { - const layer = new ReglLayer2D, 'target'>>( - this.regl, this.imgRenderer, renderSlice, [w, h] - ); + const layer = new ReglLayer2D< + AxisAlignedZarrSlice & OptionalTransform, + Omit, 'target'> + >(this.regl, this.imgRenderer, renderSlice, [w, h]); this.layers.push({ type: 'volumeSlice', data, - render: layer + render: layer, }); - const s = sizeInUnits(data.plane, data.dataset.multiscales[0].axes, data.dataset.multiscales[0].datasets[0]) - this.camera = { ...this.camera, view: Box2D.create([0, 0], s!) } + const s = sizeInUnits( + data.plane, + data.dataset.multiscales[0].axes, + data.dataset.multiscales[0].datasets[0] + ); + this.camera = { ...this.camera, view: Box2D.create([0, 0], s!) }; this.uiChange(); - }) + }); } private addAnnotationGrid(config: AnnotationGridConfig) { return createSlideDataset({ @@ -281,40 +328,46 @@ export class Demo { }).then((data) => { if (data) { const { stroke, fill, levelFeature, annotationUrl } = config; - const [w, h] = this.camera.screen + const [w, h] = this.camera.screen; const grid: AnnotationGrid = { dataset: data?.dataset, levelFeature, annotationBaseUrl: annotationUrl, - stroke: { ...stroke, width: 1 }, fill, + stroke: { ...stroke, width: 1 }, + fill, type: 'AnnotationGrid', - } + }; this.layers.push({ type: 'annotationGrid', data: grid, render: new ReglLayer2D, 'target'>>( - this.regl, this.imgRenderer, renderAnnotationGrid, [w, h]) - }) + this.regl, + this.imgRenderer, + renderAnnotationGrid, + [w, h] + ), + }); // look at it! - this.camera = { ...this.camera, view: data.dataset.bounds } + this.camera = { ...this.camera, view: data.dataset.bounds }; this.uiChange(); } - }) + }); } private addVolumeGrid(config: ZarrSliceGridConfig) { - const [w, h] = this.camera.screen + const [w, h] = this.camera.screen; return createZarrSliceGrid(config).then((data) => { const layer = new ReglLayer2D, 'target'>>( - this.regl, this.imgRenderer, renderGrid, [w, h] + this.regl, + this.imgRenderer, + renderGrid, + [w, h] ); this.layers.push({ type: 'volumeGrid', data: data, - render: layer + render: layer, }); - - - }) + }); } async requestSnapshot(pxWidth: number) { // TODO: using a canvas to build a png is very fast (the browser does it for us) @@ -326,7 +379,10 @@ export class Demo { const aspect = screen[1] / screen[0]; const h = w * aspect; // make it be upside down! - const pixels = await this.takeSnapshot({ view, screen: [w, h], projection: projection === 'webImage' ? 'cartesian' : 'webImage' }, this.layers) + const pixels = await this.takeSnapshot( + { view, screen: [w, h], projection: projection === 'webImage' ? 'cartesian' : 'webImage' }, + this.layers + ); // create an offscreen canvas... const cnvs = new OffscreenCanvas(w, h); const imgData = new ImageData(new Uint8ClampedArray(pixels.buffer), w, h); @@ -339,10 +395,9 @@ export class Demo { // render each layer, in order, given a snapshot buffer // once done, regl.read the whole thing, turn it to a png return new Promise((resolve, reject) => { - - const [width, height] = camera.screen + const [width, height] = camera.screen; const target = this.regl.framebuffer(width, height); - this.regl.clear({ framebuffer: target, color: [0, 0, 0, 1], depth: 1 }) + this.regl.clear({ framebuffer: target, color: [0, 0, 0, 1], depth: 1 }); const renderers = { volumeSlice: this.sliceRenderer, scatterplot: this.plotRenderer, @@ -352,59 +407,78 @@ export class Demo { annotationGrid: { loopRenderer: this.loopRenderer, meshRenderer: this.meshRenderer, - stencilMeshRenderer: this.stencilMeshRenderer - } - } + stencilMeshRenderer: this.stencilMeshRenderer, + }, + }; - - const layerPromises: Array<() => FrameLifecycle> = [] - const nextLayerWhenFinished: RenderCallback = (e: { status: NormalStatus } | { status: 'error', error: unknown }) => { + const layerPromises: Array<() => FrameLifecycle> = []; + const nextLayerWhenFinished: RenderCallback = ( + e: { status: NormalStatus } | { status: 'error'; error: unknown } + ) => { const { status } = e; switch (status) { case 'cancelled': - reject('one of the layer tasks was cancelled') + reject('one of the layer tasks was cancelled'); break; case 'progress': if (Math.random() > 0.7) { - console.log('...') + console.log('...'); } break; case 'finished': case 'finished_synchronously': // start the next layer - const next = layerPromises.shift() + const next = layerPromises.shift(); if (!next) { // do the final read! - const bytes = this.regl.read({ framebuffer: target }) + const bytes = this.regl.read({ framebuffer: target }); resolve(bytes); } else { // do the next layer next(); } } - } + }; const settings = { - cache: this.cache, camera, callback: nextLayerWhenFinished, regl: this.regl - } + cache: this.cache, + camera, + callback: nextLayerWhenFinished, + regl: this.regl, + }; for (const layer of layers) { switch (layer.type) { case 'volumeGrid': - layerPromises.push(() => renderGrid(target, layer.data, { ...settings, renderer: renderers[layer.type] })) + layerPromises.push(() => + renderGrid(target, layer.data, { ...settings, renderer: renderers[layer.type] }) + ); break; case 'annotationGrid': - layerPromises.push(() => renderAnnotationGrid(target, layer.data, { ...settings, renderers: renderers[layer.type] })); + layerPromises.push(() => + renderAnnotationGrid(target, layer.data, { ...settings, renderers: renderers[layer.type] }) + ); break; case 'volumeSlice': - layerPromises.push(() => renderSlice(target, layer.data, { ...settings, renderer: renderers[layer.type] })); + layerPromises.push(() => + renderSlice(target, layer.data, { ...settings, renderer: renderers[layer.type] }) + ); break; case 'scatterplot': - layerPromises.push(() => renderSlide(target, layer.data, { ...settings, renderer: renderers[layer.type] })); + layerPromises.push(() => + renderSlide(target, layer.data, { ...settings, renderer: renderers[layer.type] }) + ); break; case 'annotationLayer': - layerPromises.push(() => renderAnnotationLayer(target, layer.data, { ...settings, renderer: renderers[layer.type] })) + layerPromises.push(() => + renderAnnotationLayer(target, layer.data, { ...settings, renderer: renderers[layer.type] }) + ); break; case 'scatterplotGrid': - layerPromises.push(() => renderDynamicGrid(target, layer.data, { ...settings, renderer: renderers[layer.type] })) + layerPromises.push(() => + renderDynamicGrid(target, layer.data, { + ...settings, + renderer: renderers[layer.type], + }) + ); break; } } @@ -413,11 +487,11 @@ export class Demo { if (first) { first(); } - }) + }); } private doReRender() { const { cache, camera } = this; - const drawOnProgress: RenderCallback = (e: { status: NormalStatus } | { status: 'error', error: unknown }) => { + const drawOnProgress: RenderCallback = (e: { status: NormalStatus } | { status: 'error'; error: unknown }) => { const { status } = e; switch (status) { case 'finished': @@ -427,10 +501,13 @@ export class Demo { this.requestReRender(); break; } - } + }; const settings = { - cache, camera, callback: drawOnProgress, regl: this.regl - } + cache, + camera, + callback: drawOnProgress, + regl: this.regl, + }; const renderers = { volumeSlice: this.sliceRenderer, scatterplot: this.plotRenderer, @@ -440,9 +517,9 @@ export class Demo { annotationGrid: { loopRenderer: this.loopRenderer, meshRenderer: this.meshRenderer, - stencilMeshRenderer: this.stencilMeshRenderer - } - } + stencilMeshRenderer: this.stencilMeshRenderer, + }, + }; for (const layer of this.layers) { // TODO all cases are identical - dry it up! if (layer.type === 'scatterplot') { @@ -452,24 +529,27 @@ export class Demo { ...settings, renderer: renderers[layer.type], - } - }) + }, + }); } else if (layer.type === 'volumeSlice') { layer.render.onChange({ data: layer.data, settings: { ...settings, renderer: renderers[layer.type], - } - }) + }, + }); } else if (layer.type === 'annotationLayer') { - layer.render.onChange({ - data: layer.data, - settings: { - ...settings, - renderer: renderers[layer.type], - } - }, this.mode === 'pan') // dont cancel while drawing + layer.render.onChange( + { + data: layer.data, + settings: { + ...settings, + renderer: renderers[layer.type], + }, + }, + this.mode === 'pan' + ); // dont cancel while drawing } else if (layer.type === 'volumeGrid') { layer.render.onChange({ data: layer.data, @@ -478,8 +558,8 @@ export class Demo { concurrentTasks: 3, cpuLimit: 25, renderer: renderers[layer.type], - } - }) + }, + }); } else if (layer.type === 'annotationGrid') { layer.render.onChange({ data: layer.data, @@ -487,8 +567,8 @@ export class Demo { ...settings, concurrentTasks: 2, renderers: renderers[layer.type], - } - }) + }, + }); } else if (layer.type === 'scatterplotGrid') { layer.render.onChange({ data: layer.data, @@ -497,8 +577,8 @@ export class Demo { concurrentTasks: 3, cpuLimit: 25, renderer: renderers[layer.type], - } - }) + }, + }); } } } @@ -507,7 +587,7 @@ export class Demo { this.redrawRequested = window.requestAnimationFrame(() => { this.doReRender(); this.redrawRequested = 0; - }) + }); } this.requestReRender(); } @@ -516,13 +596,13 @@ export class Demo { this.refreshRequested = window.requestAnimationFrame(() => { this.refreshScreen(); this.refreshRequested = 0; - uiroot?.render(AppUi({ demo: this })) - }) + uiroot?.render(AppUi({ demo: this })); + }); } } - mouseButton(click: "up" | "down", pos: vec2) { + mouseButton(click: 'up' | 'down', pos: vec2) { this.mouse = click; - const curLayer = this.layers[this.selectedLayer] + const curLayer = this.layers[this.selectedLayer]; if (click === 'down' && curLayer && curLayer.type === 'annotationLayer') { startStroke(curLayer, this.toDataspace(pos)); } @@ -535,9 +615,9 @@ export class Demo { return Vec2.add(view.minCorner, c); } mouseMove(delta: vec2, pos: vec2) { - const curLayer = this.layers[this.selectedLayer] + const curLayer = this.layers[this.selectedLayer]; if (this.mode === 'pan') { - if (this.mouse === "down") { + if (this.mouse === 'down') { // drag the view const { screen, view } = this.camera; const p = Vec2.div(delta, [this.canvas.clientWidth, this.canvas.clientHeight]); @@ -546,8 +626,8 @@ export class Demo { this.onCameraChanged(); } } else if (curLayer && curLayer.type === 'annotationLayer') { - if (this.mouse === "down") { - appendPoint(curLayer, this.toDataspace(pos)) + if (this.mouse === 'down') { + appendPoint(curLayer, this.toDataspace(pos)); this.onCameraChanged(); } } @@ -566,10 +646,10 @@ export class Demo { } private initHandlers(canvas: HTMLCanvasElement) { canvas.onmousedown = (e: MouseEvent) => { - this.mouseButton("down", [e.offsetX, canvas.clientHeight - e.offsetY]); + this.mouseButton('down', [e.offsetX, canvas.clientHeight - e.offsetY]); }; canvas.onmouseup = (e: MouseEvent) => { - this.mouseButton("up", [e.offsetX, canvas.clientHeight - e.offsetY]); + this.mouseButton('up', [e.offsetX, canvas.clientHeight - e.offsetY]); }; canvas.onmousemove = (e: MouseEvent) => { // account for gl-origin vs. screen origin: @@ -586,7 +666,8 @@ export class Demo { this.mode = this.mode === 'draw' ? 'pan' : 'draw'; this.uiChange(); } - } if (e.key === 'd') { + } + if (e.key === 'd') { // start a new drawing! if (this.layers.length === 0 || (layer && layer.type !== 'annotationLayer')) { this.addEmptyAnnotation(); @@ -595,41 +676,39 @@ export class Demo { this.uiChange(); } } - } + }; } refreshScreen() { const flipBox = (box: box2D): box2D => { const { minCorner, maxCorner } = box; return { minCorner: [minCorner[0], maxCorner[1]], maxCorner: [maxCorner[0], minCorner[1]] }; - } - const flipped = Box2D.toFlatArray(flipBox(this.camera.view)) - this.regl.clear({ framebuffer: null, color: [0, 0, 0, 1], depth: 1 }) + }; + const flipped = Box2D.toFlatArray(flipBox(this.camera.view)); + this.regl.clear({ framebuffer: null, color: [0, 0, 0, 1], depth: 1 }); for (const layer of this.layers) { - const src = layer.render.getRenderResults('prev') + const src = layer.render.getRenderResults('prev'); if (src.bounds) { this.imgRenderer({ box: Box2D.toFlatArray(src.bounds), img: src.texture, target: null, - view: flipped - }) + view: flipped, + }); } // annotations are often transparent and dont do well... - if ( - layer.render.renderingInProgress() && layer.type !== 'annotationGrid') { + if (layer.render.renderingInProgress() && layer.type !== 'annotationGrid') { // draw our incoming frame overtop the old! - const cur = layer.render.getRenderResults('cur') + const cur = layer.render.getRenderResults('cur'); if (cur.bounds) { this.imgRenderer({ box: Box2D.toFlatArray(cur.bounds), img: cur.texture, target: null, - view: flipped - }) + view: flipped, + }); } } - } } } @@ -644,92 +723,92 @@ function demoTime(thing: HTMLCanvasElement) { thing.height = thing.clientHeight; const offscreen = thing; - const gl = offscreen.getContext("webgl", { + const gl = offscreen.getContext('webgl', { alpha: true, preserveDrawingBuffer: true, antialias: true, premultipliedAlpha: true, }); if (!gl) { - throw new Error('WebGL not supported!') + throw new Error('WebGL not supported!'); } const regl = REGL({ gl, - extensions: ["ANGLE_instanced_arrays", "OES_texture_float", "WEBGL_color_buffer_float"], + extensions: ['ANGLE_instanced_arrays', 'OES_texture_float', 'WEBGL_color_buffer_float'], }); theDemo = new Demo(thing, regl); window['demo'] = theDemo; setupExampleData(); - uiroot.render(AppUi({ demo: theDemo })) - + uiroot.render(AppUi({ demo: theDemo })); } function setupExampleData() { // add a bunch of pre-selected layers to the window object for selection during demo time window.examples = {}; const prep = (key: string, thing: any) => { window.examples[key] = thing; - } + }; prep('structureAnnotation', structureAnnotation); prep('tissuecyte396', tissuecyte396); - prep('slide32', oneSlide) - prep('versa1', versa1) + prep('slide32', oneSlide); + prep('versa1', versa1); prep('reconstructed', reconstructed); - prep('tissuecyte', tissueCyteSlice) - + prep('tissuecyte', tissueCyteSlice); } -const slide32 = 'MQ1B9QBZFIPXQO6PETJ' -const colorByGene: ColumnRequest = { name: '88', type: 'QUANTITATIVE' } -const merfish = 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_slide_view_02142024-20240223021524/DTVLE1YGNTJQMWVMKEU/ScatterBrain.json' -const ccf = 'https://neuroglancer-vis-prototype.s3.amazonaws.com/mouse3/230524_transposed_1501/avg_template/' -const tissuecyte = "https://tissuecyte-visualizations.s3.amazonaws.com/data/230105/tissuecyte/1111175209/green/" -const tenx = 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_tenx_01172024_stage-20240128193624/488I12FURRB8ZY5KJ8T/ScatterBrain.json' -const scottpoc = 'https://tissuecyte-ome-zarr-poc.s3.amazonaws.com/40_128_128/1145081396' -const pretend = { min: 0, max: 500 } +const slide32 = 'MQ1B9QBZFIPXQO6PETJ'; +const colorByGene: ColumnRequest = { name: '88', type: 'QUANTITATIVE' }; +const merfish = + 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_slide_view_02142024-20240223021524/DTVLE1YGNTJQMWVMKEU/ScatterBrain.json'; +const ccf = 'https://neuroglancer-vis-prototype.s3.amazonaws.com/mouse3/230524_transposed_1501/avg_template/'; +const tissuecyte = 'https://tissuecyte-visualizations.s3.amazonaws.com/data/230105/tissuecyte/1111175209/green/'; +const tenx = + 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_tenx_01172024_stage-20240128193624/488I12FURRB8ZY5KJ8T/ScatterBrain.json'; +const scottpoc = 'https://tissuecyte-ome-zarr-poc.s3.amazonaws.com/40_128_128/1145081396'; +const pretend = { min: 0, max: 500 }; const reconstructed: ScatterplotGridConfig = { colorBy: colorByGene, type: 'ScatterPlotGridConfig', url: 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_ccf_04112024-20240419205547/4STCSZBXHYOI0JUUA3M/ScatterBrain.json', -} +}; const oneSlide: ScatterPlotGridSlideConfig = { colorBy: colorByGene, slideId: slide32, type: 'ScatterPlotGridSlideConfig', url: 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_ccf_04112024-20240419205547/4STCSZBXHYOI0JUUA3M/ScatterBrain.json', -} +}; const tissuecyte396: ZarrSliceGridConfig = { type: 'ZarrSliceGridConfig', gamut: { R: { index: 0, gamut: { max: 600, min: 0 } }, G: { index: 1, gamut: { max: 500, min: 0 } }, - B: { index: 2, gamut: { max: 400, min: 0 } } + B: { index: 2, gamut: { max: 400, min: 0 } }, }, plane: 'xy', slices: 142, - url: scottpoc -} + url: scottpoc, +}; const tissueCyteSlice: ZarrSliceConfig = { type: 'zarrSliceConfig', gamut: { R: { index: 0, gamut: { max: 600, min: 0 } }, G: { index: 1, gamut: { max: 500, min: 0 } }, - B: { index: 2, gamut: { max: 400, min: 0 } } + B: { index: 2, gamut: { max: 400, min: 0 } }, }, plane: 'xy', planeParameter: 0.5, - url: scottpoc -} + url: scottpoc, +}; const versa1: ZarrSliceGridConfig = { - url: "https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/scratch/0500408166/", + url: 'https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/scratch/0500408166/', type: 'ZarrSliceGridConfig', gamut: { R: { index: 0, gamut: { max: 20, min: 0 } }, G: { index: 1, gamut: { max: 20, min: 0 } }, - B: { index: 2, gamut: { max: 20, min: 0 } } + B: { index: 2, gamut: { max: 20, min: 0 } }, }, plane: 'xy', slices: 4, -} +}; const structureAnnotation: AnnotationGridConfig = { type: 'AnnotationGridConfig', url: 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_ccf_04112024-20240419205547/4STCSZBXHYOI0JUUA3M/ScatterBrain.json', @@ -740,9 +819,9 @@ const structureAnnotation: AnnotationGridConfig = { overrideColor: [1, 0, 0, 1] as const, }, fill: { - opacity: 0.7 - } -} + opacity: 0.7, + }, +}; const uiroot = createRoot(document.getElementById('sidebar')!); -demoTime(document.getElementById('glCanvas') as HTMLCanvasElement) \ No newline at end of file +demoTime(document.getElementById('glCanvas') as HTMLCanvasElement); diff --git a/apps/layers/src/types.ts b/apps/layers/src/types.ts index 7c754c7..2aa76af 100644 --- a/apps/layers/src/types.ts +++ b/apps/layers/src/types.ts @@ -1,64 +1,72 @@ -import type { box2D } from "@alleninstitute/vis-geometry"; -import type REGL from "regl"; -import { type RenderSettings as SlideRenderSettings } from "./data-renderers/dynamicGridSlideRenderer"; -import { type RenderSettings as SliceRenderSettings } from "./data-renderers/volumeSliceRenderer"; -import { type RenderSettings as AnnotationRenderSettings, type SimpleAnnotation } from "./data-renderers/simpleAnnotationRenderer"; -import type { AxisAlignedZarrSlice } from "./data-sources/ome-zarr/planar-slice"; -import type { DynamicGrid, DynamicGridSlide } from "./data-sources/scatterplot/dynamic-grid"; -import type { AxisAlignedZarrSliceGrid } from "./data-sources/ome-zarr/slice-grid"; -import type { RenderSettings as AnnotationGridRenderSettings, CacheContentType as GpuMesh } from "./data-renderers/annotation-renderer"; -import type { AnnotationGrid } from "./data-sources/annotation/annotation-grid"; -import type { ReglLayer2D } from "@alleninstitute/vis-scatterbrain"; +import type { box2D } from '@alleninstitute/vis-geometry'; +import type REGL from 'regl'; +import { type RenderSettings as SlideRenderSettings } from './data-renderers/dynamicGridSlideRenderer'; +import { type RenderSettings as SliceRenderSettings } from './data-renderers/volumeSliceRenderer'; +import { + type RenderSettings as AnnotationRenderSettings, + type SimpleAnnotation, +} from './data-renderers/simpleAnnotationRenderer'; +import type { AxisAlignedZarrSlice } from './data-sources/ome-zarr/planar-slice'; +import type { DynamicGrid, DynamicGridSlide } from './data-sources/scatterplot/dynamic-grid'; +import type { AxisAlignedZarrSliceGrid } from './data-sources/ome-zarr/slice-grid'; +import type { + RenderSettings as AnnotationGridRenderSettings, + CacheContentType as GpuMesh, +} from './data-renderers/annotation-renderer'; +import type { AnnotationGrid } from './data-sources/annotation/annotation-grid'; +import type { ReglLayer2D } from '@alleninstitute/vis-scatterbrain'; // note: right now, all layers should be considered 2D, and WebGL only... export type Image = { - texture: REGL.Framebuffer2D + texture: REGL.Framebuffer2D; bounds: box2D | undefined; // if undefined, it means we allocated the texture, but its empty and should not be used (except to fill it) -} +}; type ColumnBuffer = { type: 'vbo'; data: REGL.Buffer; -} -export type CacheEntry = { - type: 'texture2D'; - data: REGL.Texture2D -} | ColumnBuffer - | GpuMesh - - - +}; +export type CacheEntry = + | { + type: 'texture2D'; + data: REGL.Texture2D; + } + | ColumnBuffer + | GpuMesh; export type ScatterPlotLayer = { - type: 'scatterplot' - data: DynamicGridSlide, - render: ReglLayer2D> + type: 'scatterplot'; + data: DynamicGridSlide; + render: ReglLayer2D>; }; export type ScatterPlotGridLayer = { - type: 'scatterplotGrid' - data: DynamicGrid, - render: ReglLayer2D> + type: 'scatterplotGrid'; + data: DynamicGrid; + render: ReglLayer2D>; }; export type VolumetricSliceLayer = { - type: 'volumeSlice' - data: AxisAlignedZarrSlice, - render: ReglLayer2D> + type: 'volumeSlice'; + data: AxisAlignedZarrSlice; + render: ReglLayer2D>; }; export type AnnotationLayer = { - type: 'annotationLayer', - data: SimpleAnnotation, - render: ReglLayer2D -} + type: 'annotationLayer'; + data: SimpleAnnotation; + render: ReglLayer2D; +}; export type VolumetricGridLayer = { type: 'volumeGrid'; data: AxisAlignedZarrSliceGrid; - render: ReglLayer2D> -} + render: ReglLayer2D>; +}; export type SlideViewAnnotations = { - type: 'annotationGrid', - data: AnnotationGrid, - render: ReglLayer2D> -} + type: 'annotationGrid'; + data: AnnotationGrid; + render: ReglLayer2D>; +}; export type Layer = - ScatterPlotLayer | ScatterPlotGridLayer - | VolumetricSliceLayer | VolumetricGridLayer - | SlideViewAnnotations | AnnotationLayer \ No newline at end of file + | ScatterPlotLayer + | ScatterPlotGridLayer + | VolumetricSliceLayer + | VolumetricGridLayer + | SlideViewAnnotations + | AnnotationLayer; diff --git a/apps/layers/src/ui/annotation-grid.tsx b/apps/layers/src/ui/annotation-grid.tsx index 2e51622..5d10113 100644 --- a/apps/layers/src/ui/annotation-grid.tsx +++ b/apps/layers/src/ui/annotation-grid.tsx @@ -2,21 +2,21 @@ import React from 'react'; import type { Demo } from 'src/demo'; import { InputSlider } from '@czi-sds/components'; export function AnnotationGrid(props: { demo: Demo }) { - const { demo } = props; - // control the gamut with some sliders - const l = demo.layers[demo.selectedLayer]; - if (l && l.type === 'annotationGrid') { - return ( - { - demo.setOpacity('fill', value as number); - }} - /> - ); - } - return null; + const { demo } = props; + // control the gamut with some sliders + const l = demo.layers[demo.selectedLayer]; + if (l && l.type === 'annotationGrid') { + return ( + { + demo.setOpacity('fill', value as number); + }} + /> + ); + } + return null; } diff --git a/apps/layers/src/ui/contact-sheet.tsx b/apps/layers/src/ui/contact-sheet.tsx index 3f66202..a57e04e 100644 --- a/apps/layers/src/ui/contact-sheet.tsx +++ b/apps/layers/src/ui/contact-sheet.tsx @@ -2,48 +2,57 @@ import React from 'react'; import type { Demo } from 'src/demo'; import { InputSlider, Button } from '@czi-sds/components'; export function ContactSheetUI(props: { demo: Demo }) { - const { demo } = props; - // control the gamut with some sliders - const l = demo.layers[demo.selectedLayer]; - if (l && l.type === 'volumeGrid') { - return ( -
- - { - demo.setGamutChannel('R', value as number[]); - }} - /> - { - demo.setGamutChannel('G', value as number[]); - }} - /> - { - demo.setGamutChannel('B', value as number[]); - }} - /> - - - -
- ); - } - return null; + const { demo } = props; + // control the gamut with some sliders + const l = demo.layers[demo.selectedLayer]; + if (l && l.type === 'volumeGrid') { + return ( +
+ + { + demo.setGamutChannel('R', value as number[]); + }} + /> + { + demo.setGamutChannel('G', value as number[]); + }} + /> + { + demo.setGamutChannel('B', value as number[]); + }} + /> + + + +
+ ); + } + return null; } diff --git a/apps/layers/src/ui/scatterplot-ui.tsx b/apps/layers/src/ui/scatterplot-ui.tsx index e38524a..53d8e06 100644 --- a/apps/layers/src/ui/scatterplot-ui.tsx +++ b/apps/layers/src/ui/scatterplot-ui.tsx @@ -2,34 +2,34 @@ import React from 'react'; import type { Demo } from 'src/demo'; import { InputSlider } from '@czi-sds/components'; export function ScatterplotUI(props: { demo: Demo }) { - const { demo } = props; - // control the gamut with some sliders - const l = demo.layers[demo.selectedLayer]; - if ((l && l.type === 'scatterplot') || l.type === 'scatterplotGrid') { - return ( -
- - { - demo.setPointSize(value as number); - }} - /> - - { - demo.setColorByIndex(value as number); - }} - /> -
- ); - } - return null; + const { demo } = props; + // control the gamut with some sliders + const l = demo.layers[demo.selectedLayer]; + if ((l && l.type === 'scatterplot') || l.type === 'scatterplotGrid') { + return ( +
+ + { + demo.setPointSize(value as number); + }} + /> + + { + demo.setColorByIndex(value as number); + }} + /> +
+ ); + } + return null; } diff --git a/apps/layers/src/ui/slice-ui.tsx b/apps/layers/src/ui/slice-ui.tsx index b2a42f7..f1154bf 100644 --- a/apps/layers/src/ui/slice-ui.tsx +++ b/apps/layers/src/ui/slice-ui.tsx @@ -2,58 +2,67 @@ import React from 'react'; import type { Demo } from 'src/demo'; import { InputSlider, Button } from '@czi-sds/components'; export function SliceViewLayer(props: { demo: Demo }) { - const { demo } = props; - // control the gamut with some sliders - const l = demo.layers[demo.selectedLayer]; - if (l && l.type === 'volumeSlice') { - return ( -
- - { - demo.setGamutChannel('R', value as number[]); - }} - /> - { - demo.setGamutChannel('G', value as number[]); - }} - /> - { - demo.setGamutChannel('B', value as number[]); - }} - /> - - { - demo.setSlice(value as number); - }} - /> - - - -
- ); - } - return null; + const { demo } = props; + // control the gamut with some sliders + const l = demo.layers[demo.selectedLayer]; + if (l && l.type === 'volumeSlice') { + return ( +
+ + { + demo.setGamutChannel('R', value as number[]); + }} + /> + { + demo.setGamutChannel('G', value as number[]); + }} + /> + { + demo.setGamutChannel('B', value as number[]); + }} + /> + + { + demo.setSlice(value as number); + }} + /> + + + +
+ ); + } + return null; } diff --git a/apps/layers/tsconfig.json b/apps/layers/tsconfig.json index 8fb771d..19a8384 100644 --- a/apps/layers/tsconfig.json +++ b/apps/layers/tsconfig.json @@ -1,14 +1,11 @@ { "extends": "../tsconfig.json", - "include": ["./src/**/*", "../common/src/**/*", - "../scatterplot/src/**/*", - "../omezarr-viewer/src/**/*"], - "compilerOptions": { + "include": ["./src/**/*", "../common/src/**/*", "../scatterplot/src/**/*", "../omezarr-viewer/src/**/*"], + "compilerOptions": { "jsx": "react", "baseUrl": "./", "paths": { - "Common/*":["../common/src/*"] + "Common/*": ["../common/src/*"] } - } - -} \ No newline at end of file + } +} diff --git a/apps/neuroglancer-url/README.md b/apps/neuroglancer-url/README.md index 517d44e..481592b 100644 --- a/apps/neuroglancer-url/README.md +++ b/apps/neuroglancer-url/README.md @@ -3,10 +3,12 @@ This is a demo for generating Neuroglancer URLs like the python POC [here](https://github.com/AllenInstitute/ome_zarr_converter/blob/main/src/ome_zarr_converter/neuroglancer/utils.py). ### How to build / run + 1. `pnpm build` from the root directory of this project 2. `pnpm install` in this directory 3. `pnpm run demo` in this directory - this will produce `dst/neuroglancer-url.html` 4. navigate to `dst/neuroglancer-url.html` and open it in your browser ### The Code - -- TBD -- \ No newline at end of file + +-- TBD -- diff --git a/apps/neuroglancer-url/package.json b/apps/neuroglancer-url/package.json index 33d82d2..0f3d7b3 100644 --- a/apps/neuroglancer-url/package.json +++ b/apps/neuroglancer-url/package.json @@ -1,42 +1,41 @@ { - "name": "@alleninstitute/neuroglancer-url-demo", - "version": "0.0.1", - "contributors": [ - { - "name": "Lane Sawyer", - "email": "lane.sawyer@alleninstitute.org" + "name": "@alleninstitute/neuroglancer-url-demo", + "version": "0.0.1", + "contributors": [ + { + "name": "Lane Sawyer", + "email": "lane.sawyer@alleninstitute.org" + }, + { + "name": "James Gerstenberger", + "email": "james.gerstenberger@alleninstitute.org" + }, + { + "name": "Noah Shepard", + "email": "noah.shepard@alleninstitute.org" + }, + { + "name": "Skyler Moosman", + "email": "skyler.moosman@alleninstitute.org" + }, + { + "name": "Su Li", + "email": "su.li@alleninstitute.org" + } + ], + "license": "TBD", + "type": "module", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "private": true, + "scripts": { + "preinstall": "npx only-allow pnpm", + "demo": "esbuild src/demo.ts --bundle --outfile=dst/demo.js && cp public/* dst/", + "typecheck": "tsc --noEmit" }, - { - "name": "James Gerstenberger", - "email": "james.gerstenberger@alleninstitute.org" + "devDependencies": { + "esbuild": "^0.19.12", + "typescript": "^5.3.3" }, - { - "name": "Noah Shepard", - "email": "noah.shepard@alleninstitute.org" - }, - { - "name": "Skyler Moosman", - "email": "skyler.moosman@alleninstitute.org" - }, - { - "name": "Su Li", - "email": "su.li@alleninstitute.org" - } - ], - "license": "TBD", - "type": "module", - "main": "lib/index.js", - "types": "lib/index.d.ts", - "private": true, - "scripts": { - "preinstall": "npx only-allow pnpm", - "demo": "esbuild src/demo.ts --bundle --outfile=dst/demo.js && cp public/* dst/", - "typecheck": "tsc --noEmit" - }, - "devDependencies": { - "esbuild": "^0.19.12", - "typescript": "^5.3.3" - }, - "dependencies": { - } -} \ No newline at end of file + "dependencies": {} +} diff --git a/apps/neuroglancer-url/public/demo.html b/apps/neuroglancer-url/public/demo.html index 8b27db8..7461435 100644 --- a/apps/neuroglancer-url/public/demo.html +++ b/apps/neuroglancer-url/public/demo.html @@ -1,4 +1,4 @@ - +
diff --git a/apps/neuroglancer-url/src/data.ts b/apps/neuroglancer-url/src/data.ts index 40311c0..f82b5e8 100644 --- a/apps/neuroglancer-url/src/data.ts +++ b/apps/neuroglancer-url/src/data.ts @@ -1,349 +1,309 @@ -import type { NGData } from "./types"; +import type { NGData } from './types'; export const data: NGData[] = [ { - "function": "get_image_series_grid_url", - "params": { - "src_config_list": [ - { - "blue_max": 4095.0, - "blue_min": 0.0, - "green_max": 7261.0, - "green_min": 0.0, - "img_name": "1125628029 (40_512_512)", - "ome_zarr_shape": [ - 3, - 142, - 29998, - 39998 + function: 'get_image_series_grid_url', + params: { + src_config_list: [ + { + blue_max: 4095.0, + blue_min: 0.0, + green_max: 7261.0, + green_min: 0.0, + img_name: '1125628029 (40_512_512)', + ome_zarr_shape: [3, 142, 29998, 39998], + red_max: 1261.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1125628029', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + { + blue_max: 4095.0, + blue_min: 0.0, + green_max: 1304.0, + green_min: 0.0, + img_name: '1145081396 (40_512_512)', + ome_zarr_shape: [3, 142, 11998, 15998], + red_max: 1344.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1145081396', + x_mm: 0.000875, + y_mm: 0.000875, + z_mm: 0.1, + }, + { + blue_max: 4095.0, + blue_min: 0.0, + green_max: 4045.0, + green_min: 0.0, + img_name: '1182837942 (40_512_512)', + ome_zarr_shape: [3, 142, 29998, 39998], + red_max: 864.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1182837942', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + { + blue_max: 4095.0, + blue_min: 0.0, + green_max: 3013.0, + green_min: 0.0, + img_name: '1240649363 (40_512_512)', + ome_zarr_shape: [3, 142, 29998, 39998], + red_max: 1356.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1240649363', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, ], - "red_max": 1261.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1125628029", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - { - "blue_max": 4095.0, - "blue_min": 0.0, - "green_max": 1304.0, - "green_min": 0.0, - "img_name": "1145081396 (40_512_512)", - "ome_zarr_shape": [ - 3, - 142, - 11998, - 15998 - ], - "red_max": 1344.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1145081396", - "x_mm": 0.000875, - "y_mm": 0.000875, - "z_mm": 0.1 - }, - { - "blue_max": 4095.0, - "blue_min": 0.0, - "green_max": 4045.0, - "green_min": 0.0, - "img_name": "1182837942 (40_512_512)", - "ome_zarr_shape": [ - 3, - 142, - 29998, - 39998 - ], - "red_max": 864.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1182837942", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - { - "blue_max": 4095.0, - "blue_min": 0.0, - "green_max": 3013.0, - "green_min": 0.0, - "img_name": "1240649363 (40_512_512)", - "ome_zarr_shape": [ - 3, - 142, - 29998, - 39998 - ], - "red_max": 1356.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1240649363", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - } - ] - }, - "type": "Multiple image series; coronal projection", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2050.0%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221125628029%20%2840_128_128%29%22%7D%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201261.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%207261.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221125628029%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%2C%20%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201344.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%201304.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221145081396%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%2C%20%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%20864.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%204045.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221182837942%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%2C%20%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201356.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%203013.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221240649363%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%2C%20%22layout%22%3A%20%7B%22type%22%3A%20%22row%22%2C%20%22children%22%3A%20%5B%7B%22type%22%3A%20%22column%22%2C%20%22children%22%3A%20%5B%7B%22type%22%3A%20%22viewer%22%2C%20%22layers%22%3A%20%5B%221125628029%20%2840_128_128%29%22%5D%2C%20%22layout%22%3A%20%22xy%22%7D%2C%20%7B%22type%22%3A%20%22viewer%22%2C%20%22layers%22%3A%20%5B%221145081396%20%2840_128_128%29%22%5D%2C%20%22layout%22%3A%20%22xy%22%7D%5D%7D%2C%20%7B%22type%22%3A%20%22column%22%2C%20%22children%22%3A%20%5B%7B%22type%22%3A%20%22viewer%22%2C%20%22layers%22%3A%20%5B%221182837942%20%2840_128_128%29%22%5D%2C%20%22layout%22%3A%20%22xy%22%7D%2C%20%7B%22type%22%3A%20%22viewer%22%2C%20%22layers%22%3A%20%5B%221240649363%20%2840_128_128%29%22%5D%2C%20%22layout%22%3A%20%22xy%22%7D%5D%7D%5D%7D%7D" + }, + type: 'Multiple image series; coronal projection', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2050.0%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221125628029%20%2840_128_128%29%22%7D%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201261.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%207261.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221125628029%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%2C%20%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201344.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%201304.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221145081396%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%2C%20%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%20864.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%204045.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221182837942%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%2C%20%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201356.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%203013.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221240649363%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%2C%20%22layout%22%3A%20%7B%22type%22%3A%20%22row%22%2C%20%22children%22%3A%20%5B%7B%22type%22%3A%20%22column%22%2C%20%22children%22%3A%20%5B%7B%22type%22%3A%20%22viewer%22%2C%20%22layers%22%3A%20%5B%221125628029%20%2840_128_128%29%22%5D%2C%20%22layout%22%3A%20%22xy%22%7D%2C%20%7B%22type%22%3A%20%22viewer%22%2C%20%22layers%22%3A%20%5B%221145081396%20%2840_128_128%29%22%5D%2C%20%22layout%22%3A%20%22xy%22%7D%5D%7D%2C%20%7B%22type%22%3A%20%22column%22%2C%20%22children%22%3A%20%5B%7B%22type%22%3A%20%22viewer%22%2C%20%22layers%22%3A%20%5B%221182837942%20%2840_128_128%29%22%5D%2C%20%22layout%22%3A%20%22xy%22%7D%2C%20%7B%22type%22%3A%20%22viewer%22%2C%20%22layers%22%3A%20%5B%221240649363%20%2840_128_128%29%22%5D%2C%20%22layout%22%3A%20%22xy%22%7D%5D%7D%5D%7D%7D', }, { - "function": "get_neuroglancer_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 57.142857142857146, - "green_max": 7261.0, - "green_min": 0.0, - "img_name": "1125628029 (40_128_128)", - "layout": "4panel", - "red_max": 1261.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1125628029", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - "type": "Single image series; all three planes", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2057.142857142857146%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221125628029%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%224panel%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201261.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%207261.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221125628029%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D" + function: 'get_neuroglancer_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 57.142857142857146, + green_max: 7261.0, + green_min: 0.0, + img_name: '1125628029 (40_128_128)', + layout: '4panel', + red_max: 1261.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1125628029', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + type: 'Single image series; all three planes', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2057.142857142857146%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221125628029%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%224panel%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201261.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%207261.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221125628029%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D', }, { - "function": "get_neuroglancer_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 37.714285714285715, - "green_max": 7261.0, - "green_min": 0.0, - "img_name": "1125628029 (40_128_128)", - "layout": "xy", - "red_max": 1261.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1125628029", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - "type": "Single image series; coronal projection", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2037.714285714285715%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221125628029%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201261.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%207261.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221125628029%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D" + function: 'get_neuroglancer_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 37.714285714285715, + green_max: 7261.0, + green_min: 0.0, + img_name: '1125628029 (40_128_128)', + layout: 'xy', + red_max: 1261.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1125628029', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + type: 'Single image series; coronal projection', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2037.714285714285715%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221125628029%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201261.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%207261.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221125628029%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D', }, { - "function": "get_contact_sheet_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 576.0, - "green_max": 7261.0, - "green_min": 0.0, - "img_name": "1125628029 (40_128_128)", - "ome_zarr_shape": [ - 3, - 142, - 29998, - 39998 - ], - "red_max": 1261.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1125628029", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - "type": "Single image series; contact sheet", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%20576.0%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221125628029%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201261.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%207261.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%5B%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-1%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-2%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-3%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-4%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-5%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-6%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-7%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-8%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-9%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-10%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-11%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-12%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-13%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-14%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-15%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-16%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-17%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-18%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-19%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-20%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-21%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-22%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-23%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-24%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-25%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-26%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-27%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-28%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-29%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-30%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-31%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-32%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-33%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-34%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-35%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-36%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-37%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-38%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-39%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-40%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-41%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-42%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-43%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-44%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-45%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-46%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-47%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-48%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-49%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-50%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-51%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-52%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-53%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-54%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-55%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-56%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-57%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-58%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-59%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-60%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-61%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-62%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-63%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-64%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-65%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-66%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-67%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-68%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-69%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-70%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-71%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-72%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-73%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-74%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-75%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-76%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-77%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-78%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-79%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-80%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-81%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-82%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-83%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-84%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-85%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-86%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-87%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-88%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-89%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-90%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-91%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-92%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-93%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-94%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-95%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-96%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-97%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-98%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-99%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-100%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-101%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-102%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-103%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-104%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-105%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-106%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-107%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-108%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-109%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-110%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-111%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-112%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-113%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-114%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-115%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-116%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-117%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-118%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-119%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-120%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-121%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-122%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-123%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-124%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-125%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-126%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-127%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-128%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-129%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-130%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-131%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-132%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-133%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-134%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-135%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-136%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-137%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-138%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-139%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-140%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-141%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%5D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221125628029%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%2C%20%22velocity%22%3A%20%7B%22z%22%3A%20%7B%22velocity%22%3A%20-10%2C%20%22atBoundary%22%3A%20%22reverse%22%7D%7D%2C%20%22position%22%3A%20%5B239988%2C%20179988%2C%20-141%5D%7D" + function: 'get_contact_sheet_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 576.0, + green_max: 7261.0, + green_min: 0.0, + img_name: '1125628029 (40_128_128)', + ome_zarr_shape: [3, 142, 29998, 39998], + red_max: 1261.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1125628029', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + type: 'Single image series; contact sheet', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%20576.0%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221125628029%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D14522.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201261.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%207261.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%5B%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-1%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-2%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-3%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-4%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-5%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-6%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-7%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-8%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-9%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-10%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-11%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-12%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-13%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-14%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-15%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-16%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-17%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-18%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-19%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-20%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-21%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-22%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-23%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-24%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-25%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-26%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-27%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-28%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-29%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-30%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-31%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-32%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-33%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-34%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-35%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-36%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-37%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-38%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-39%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-40%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-41%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-42%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-43%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-44%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-45%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-46%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-47%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-48%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-49%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-50%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-51%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-52%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-53%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-54%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-55%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-56%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-57%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-58%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-59%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-60%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-61%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-62%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-63%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-64%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-65%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-66%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-67%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-68%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-69%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-70%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-71%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-72%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-73%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-74%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-75%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-76%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-77%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-78%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-79%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-80%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-81%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-82%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-83%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-84%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-85%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-86%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-87%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-88%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-89%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-90%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-91%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-92%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-93%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-94%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-95%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-96%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-97%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-98%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-99%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-100%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-101%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-102%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-103%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-104%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-105%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-106%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-107%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-108%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-109%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-110%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-111%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-112%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-113%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-114%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-115%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-116%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-117%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-118%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-119%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-120%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-121%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-122%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-123%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-124%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-125%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-126%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-127%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-128%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-129%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-130%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-131%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-132%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-133%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-134%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-135%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-136%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-137%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-138%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-139%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-140%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1125628029%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-141%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%5D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221125628029%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%2C%20%22velocity%22%3A%20%7B%22z%22%3A%20%7B%22velocity%22%3A%20-10%2C%20%22atBoundary%22%3A%20%22reverse%22%7D%7D%2C%20%22position%22%3A%20%5B239988%2C%20179988%2C%20-141%5D%7D', }, { - "function": "get_neuroglancer_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 22.857142857142858, - "green_max": 1304.0, - "green_min": 0.0, - "img_name": "1145081396 (40_128_128)", - "layout": "4panel", - "red_max": 1344.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1145081396", - "x_mm": 0.000875, - "y_mm": 0.000875, - "z_mm": 0.1 - }, - "type": "Single image series; all three planes", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2022.857142857142858%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221145081396%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%224panel%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201344.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%201304.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221145081396%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D" + function: 'get_neuroglancer_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 22.857142857142858, + green_max: 1304.0, + green_min: 0.0, + img_name: '1145081396 (40_128_128)', + layout: '4panel', + red_max: 1344.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1145081396', + x_mm: 0.000875, + y_mm: 0.000875, + z_mm: 0.1, + }, + type: 'Single image series; all three planes', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2022.857142857142858%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221145081396%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%224panel%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201344.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%201304.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221145081396%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D', }, { - "function": "get_neuroglancer_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 15.085714285714287, - "green_max": 1304.0, - "green_min": 0.0, - "img_name": "1145081396 (40_128_128)", - "layout": "xy", - "red_max": 1344.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1145081396", - "x_mm": 0.000875, - "y_mm": 0.000875, - "z_mm": 0.1 - }, - "type": "Single image series; coronal projection", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2015.085714285714287%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221145081396%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201344.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%201304.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221145081396%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D" + function: 'get_neuroglancer_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 15.085714285714287, + green_max: 1304.0, + green_min: 0.0, + img_name: '1145081396 (40_128_128)', + layout: 'xy', + red_max: 1344.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1145081396', + x_mm: 0.000875, + y_mm: 0.000875, + z_mm: 0.1, + }, + type: 'Single image series; coronal projection', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2015.085714285714287%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221145081396%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201344.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%201304.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221145081396%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D', }, { - "function": "get_contact_sheet_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 230.4, - "green_max": 1304.0, - "green_min": 0.0, - "img_name": "1145081396 (40_128_128)", - "ome_zarr_shape": [ - 3, - 142, - 11998, - 15998 - ], - "red_max": 1344.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1145081396", - "x_mm": 0.000875, - "y_mm": 0.000875, - "z_mm": 0.1 - }, - "type": "Single image series; contact sheet", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%20230.4%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221145081396%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201344.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%201304.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%5B%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-1%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-2%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-3%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-4%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-5%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-6%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-7%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-8%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-9%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-10%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-11%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-12%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-13%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-14%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-15%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-16%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-17%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-18%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-19%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-20%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-21%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-22%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-23%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-24%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-25%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-26%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-27%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-28%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-29%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-30%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-31%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-32%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-33%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-34%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-35%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-36%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-37%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-38%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-39%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-40%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-41%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-42%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-43%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-44%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-45%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-46%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-47%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-48%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-49%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-50%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-51%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-52%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-53%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-54%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-55%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-56%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-57%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-58%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-59%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-60%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-61%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-62%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-63%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-64%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-65%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-66%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-67%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-68%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-69%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-70%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-71%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-72%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-73%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-74%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-75%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-76%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-77%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-78%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-79%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-80%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-81%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-82%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-83%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-84%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-85%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-86%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-87%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-88%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-89%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-90%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-91%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-92%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-93%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-94%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-95%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-96%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-97%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-98%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-99%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-100%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-101%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-102%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-103%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-104%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-105%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-106%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-107%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-108%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-109%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-110%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-111%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-112%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-113%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-114%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-115%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-116%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-117%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-118%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-119%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-120%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-121%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-122%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-123%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-124%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-125%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-126%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-127%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-128%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-129%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-130%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-131%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-132%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-133%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-134%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-135%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-136%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-137%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-138%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-139%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-140%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-141%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%5D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221145081396%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%2C%20%22velocity%22%3A%20%7B%22z%22%3A%20%7B%22velocity%22%3A%20-10%2C%20%22atBoundary%22%3A%20%22reverse%22%7D%7D%2C%20%22position%22%3A%20%5B95988%2C%2071988%2C%20-141%5D%7D" + function: 'get_contact_sheet_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 230.4, + green_max: 1304.0, + green_min: 0.0, + img_name: '1145081396 (40_128_128)', + ome_zarr_shape: [3, 142, 11998, 15998], + red_max: 1344.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1145081396', + x_mm: 0.000875, + y_mm: 0.000875, + z_mm: 0.1, + }, + type: 'Single image series; contact sheet', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%20230.4%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221145081396%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2688.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D2608.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201344.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%201304.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%5B%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-1%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-2%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-3%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-4%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-5%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-6%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-7%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-8%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-9%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-10%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-11%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-12%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-13%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-14%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-15%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-16%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-17%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-18%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-19%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-20%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-21%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-22%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-23%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2011998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-24%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-25%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-26%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-27%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-28%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-29%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-30%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-31%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-32%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-33%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-34%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-35%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2023996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-36%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-37%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-38%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-39%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-40%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-41%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-42%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-43%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-44%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-45%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-46%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-47%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2035994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-48%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-49%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-50%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-51%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-52%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-53%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-54%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-55%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-56%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-57%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-58%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-59%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2047992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-60%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-61%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-62%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-63%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-64%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-65%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-66%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-67%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-68%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-69%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-70%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-71%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-72%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-73%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-74%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-75%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-76%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-77%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-78%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-79%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-80%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-81%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-82%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-83%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2071988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-84%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-85%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-86%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-87%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-88%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-89%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-90%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-91%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-92%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-93%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-94%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-95%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2083986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-96%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-97%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-98%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-99%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-100%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-101%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-102%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-103%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-104%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-105%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-106%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-107%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2095984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-108%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-109%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-110%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-111%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-112%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-113%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-114%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-115%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-116%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-117%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-118%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-119%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20107982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-120%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-121%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-122%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-123%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-124%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-125%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-126%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-127%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-128%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-129%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-130%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-131%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20175978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-132%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-133%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2015998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-134%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2031996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-135%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2047994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-136%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2063992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-137%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-138%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2095988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-139%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20111986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-140%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20127984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1145081396%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B8.75e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-141%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20131978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20143982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%5D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221145081396%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%2C%20%22velocity%22%3A%20%7B%22z%22%3A%20%7B%22velocity%22%3A%20-10%2C%20%22atBoundary%22%3A%20%22reverse%22%7D%7D%2C%20%22position%22%3A%20%5B95988%2C%2071988%2C%20-141%5D%7D', }, { - "function": "get_neuroglancer_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 57.142857142857146, - "green_max": 4045.0, - "green_min": 0.0, - "img_name": "1182837942 (40_128_128)", - "layout": "4panel", - "red_max": 864.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1182837942", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - "type": "Single image series; all three planes", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2057.142857142857146%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221182837942%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%224panel%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%20864.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%204045.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221182837942%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D" + function: 'get_neuroglancer_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 57.142857142857146, + green_max: 4045.0, + green_min: 0.0, + img_name: '1182837942 (40_128_128)', + layout: '4panel', + red_max: 864.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1182837942', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + type: 'Single image series; all three planes', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2057.142857142857146%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221182837942%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%224panel%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%20864.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%204045.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221182837942%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D', }, { - "function": "get_neuroglancer_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 37.714285714285715, - "green_max": 4045.0, - "green_min": 0.0, - "img_name": "1182837942 (40_128_128)", - "layout": "xy", - "red_max": 864.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1182837942", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - "type": "Single image series; coronal projection", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2037.714285714285715%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221182837942%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%20864.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%204045.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221182837942%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D" + function: 'get_neuroglancer_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 37.714285714285715, + green_max: 4045.0, + green_min: 0.0, + img_name: '1182837942 (40_128_128)', + layout: 'xy', + red_max: 864.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1182837942', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + type: 'Single image series; coronal projection', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2037.714285714285715%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221182837942%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%20864.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%204045.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221182837942%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D', }, { - "function": "get_contact_sheet_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 576.0, - "green_max": 4045.0, - "green_min": 0.0, - "img_name": "1182837942 (40_128_128)", - "ome_zarr_shape": [ - 3, - 142, - 29998, - 39998 - ], - "red_max": 864.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1182837942", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - "type": "Single image series; contact sheet", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%20576.0%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221182837942%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%20864.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%204045.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%5B%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-1%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-2%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-3%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-4%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-5%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-6%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-7%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-8%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-9%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-10%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-11%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-12%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-13%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-14%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-15%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-16%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-17%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-18%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-19%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-20%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-21%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-22%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-23%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-24%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-25%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-26%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-27%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-28%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-29%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-30%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-31%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-32%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-33%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-34%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-35%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-36%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-37%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-38%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-39%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-40%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-41%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-42%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-43%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-44%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-45%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-46%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-47%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-48%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-49%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-50%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-51%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-52%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-53%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-54%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-55%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-56%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-57%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-58%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-59%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-60%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-61%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-62%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-63%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-64%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-65%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-66%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-67%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-68%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-69%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-70%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-71%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-72%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-73%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-74%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-75%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-76%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-77%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-78%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-79%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-80%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-81%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-82%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-83%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-84%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-85%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-86%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-87%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-88%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-89%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-90%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-91%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-92%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-93%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-94%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-95%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-96%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-97%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-98%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-99%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-100%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-101%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-102%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-103%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-104%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-105%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-106%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-107%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-108%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-109%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-110%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-111%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-112%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-113%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-114%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-115%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-116%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-117%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-118%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-119%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-120%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-121%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-122%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-123%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-124%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-125%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-126%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-127%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-128%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-129%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-130%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-131%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-132%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-133%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-134%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-135%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-136%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-137%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-138%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-139%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-140%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-141%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%5D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221182837942%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%2C%20%22velocity%22%3A%20%7B%22z%22%3A%20%7B%22velocity%22%3A%20-10%2C%20%22atBoundary%22%3A%20%22reverse%22%7D%7D%2C%20%22position%22%3A%20%5B239988%2C%20179988%2C%20-141%5D%7D" + function: 'get_contact_sheet_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 576.0, + green_max: 4045.0, + green_min: 0.0, + img_name: '1182837942 (40_128_128)', + ome_zarr_shape: [3, 142, 29998, 39998], + red_max: 864.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1182837942', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + type: 'Single image series; contact sheet', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%20576.0%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221182837942%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D1728.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D8090.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%20864.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%204045.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%5B%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-1%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-2%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-3%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-4%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-5%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-6%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-7%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-8%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-9%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-10%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-11%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-12%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-13%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-14%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-15%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-16%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-17%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-18%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-19%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-20%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-21%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-22%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-23%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-24%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-25%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-26%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-27%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-28%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-29%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-30%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-31%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-32%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-33%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-34%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-35%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-36%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-37%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-38%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-39%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-40%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-41%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-42%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-43%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-44%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-45%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-46%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-47%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-48%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-49%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-50%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-51%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-52%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-53%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-54%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-55%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-56%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-57%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-58%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-59%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-60%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-61%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-62%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-63%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-64%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-65%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-66%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-67%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-68%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-69%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-70%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-71%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-72%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-73%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-74%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-75%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-76%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-77%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-78%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-79%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-80%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-81%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-82%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-83%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-84%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-85%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-86%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-87%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-88%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-89%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-90%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-91%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-92%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-93%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-94%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-95%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-96%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-97%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-98%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-99%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-100%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-101%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-102%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-103%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-104%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-105%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-106%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-107%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-108%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-109%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-110%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-111%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-112%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-113%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-114%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-115%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-116%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-117%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-118%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-119%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-120%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-121%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-122%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-123%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-124%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-125%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-126%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-127%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-128%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-129%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-130%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-131%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-132%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-133%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-134%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-135%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-136%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-137%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-138%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-139%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-140%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1182837942%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-141%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%5D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221182837942%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%2C%20%22velocity%22%3A%20%7B%22z%22%3A%20%7B%22velocity%22%3A%20-10%2C%20%22atBoundary%22%3A%20%22reverse%22%7D%7D%2C%20%22position%22%3A%20%5B239988%2C%20179988%2C%20-141%5D%7D', }, { - "function": "get_neuroglancer_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 57.142857142857146, - "green_max": 3013.0, - "green_min": 0.0, - "img_name": "1240649363 (40_128_128)", - "layout": "4panel", - "red_max": 1356.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1240649363", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - "type": "Single image series; all three planes", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2057.142857142857146%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221240649363%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%224panel%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201356.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%203013.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221240649363%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D" + function: 'get_neuroglancer_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 57.142857142857146, + green_max: 3013.0, + green_min: 0.0, + img_name: '1240649363 (40_128_128)', + layout: '4panel', + red_max: 1356.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1240649363', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + type: 'Single image series; all three planes', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2057.142857142857146%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221240649363%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%224panel%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201356.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%203013.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221240649363%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D', }, { - "function": "get_neuroglancer_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 37.714285714285715, - "green_max": 3013.0, - "green_min": 0.0, - "img_name": "1240649363 (40_128_128)", - "layout": "xy", - "red_max": 1356.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1240649363", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - "type": "Single image series; coronal projection", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2037.714285714285715%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221240649363%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201356.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%203013.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221240649363%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D" + function: 'get_neuroglancer_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 37.714285714285715, + green_max: 3013.0, + green_min: 0.0, + img_name: '1240649363 (40_128_128)', + layout: 'xy', + red_max: 1356.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1240649363', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + type: 'Single image series; coronal projection', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%2037.714285714285715%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221240649363%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201356.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%203013.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%7D%7D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221240649363%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%7D', }, { - "function": "get_contact_sheet_url", - "params": { - "blue_max": 4095.0, - "blue_min": 0.0, - "cross_section_scale": 576.0, - "green_max": 3013.0, - "green_min": 0.0, - "img_name": "1240649363 (40_128_128)", - "ome_zarr_shape": [ - 3, - 142, - 29998, - 39998 - ], - "red_max": 1356.0, - "red_min": 0.0, - "src_url": "zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1240649363", - "x_mm": 0.00035, - "y_mm": 0.00035, - "z_mm": 0.1 - }, - "type": "Single image series; contact sheet", - "url": "https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%20576.0%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221240649363%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201356.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%203013.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%5B%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-1%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-2%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-3%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-4%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-5%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-6%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-7%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-8%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-9%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-10%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-11%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-12%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-13%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-14%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-15%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-16%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-17%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-18%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-19%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-20%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-21%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-22%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-23%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-24%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-25%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-26%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-27%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-28%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-29%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-30%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-31%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-32%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-33%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-34%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-35%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-36%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-37%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-38%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-39%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-40%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-41%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-42%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-43%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-44%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-45%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-46%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-47%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-48%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-49%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-50%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-51%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-52%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-53%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-54%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-55%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-56%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-57%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-58%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-59%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-60%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-61%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-62%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-63%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-64%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-65%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-66%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-67%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-68%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-69%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-70%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-71%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-72%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-73%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-74%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-75%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-76%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-77%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-78%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-79%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-80%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-81%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-82%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-83%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-84%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-85%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-86%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-87%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-88%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-89%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-90%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-91%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-92%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-93%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-94%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-95%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-96%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-97%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-98%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-99%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-100%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-101%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-102%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-103%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-104%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-105%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-106%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-107%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-108%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-109%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-110%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-111%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-112%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-113%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-114%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-115%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-116%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-117%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-118%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-119%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-120%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-121%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-122%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-123%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-124%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-125%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-126%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-127%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-128%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-129%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-130%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-131%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-132%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-133%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-134%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-135%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-136%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-137%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-138%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-139%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-140%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-141%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%5D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221240649363%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%2C%20%22velocity%22%3A%20%7B%22z%22%3A%20%7B%22velocity%22%3A%20-10%2C%20%22atBoundary%22%3A%20%22reverse%22%7D%7D%2C%20%22position%22%3A%20%5B239988%2C%20179988%2C%20-141%5D%7D" - } - ] \ No newline at end of file + function: 'get_contact_sheet_url', + params: { + blue_max: 4095.0, + blue_min: 0.0, + cross_section_scale: 576.0, + green_max: 3013.0, + green_min: 0.0, + img_name: '1240649363 (40_128_128)', + ome_zarr_shape: [3, 142, 29998, 39998], + red_max: 1356.0, + red_min: 0.0, + src_url: 'zarr://s3://tissuecyte-ome-zarr-poc/40_128_128/1240649363', + x_mm: 0.00035, + y_mm: 0.00035, + z_mm: 0.1, + }, + type: 'Single image series; contact sheet', + url: 'https://neuroglancer-demo.appspot.com/#!%7B%22dimensions%22%3A%20%7B%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%7D%2C%20%22crossSectionScale%22%3A%20576.0%2C%20%22projectionScale%22%3A%2040000%2C%20%22selectedLayer%22%3A%20%7B%22visible%22%3A%20true%2C%20%22layer%22%3A%20%221240649363%20%2840_128_128%29%22%7D%2C%20%22layout%22%3A%20%22xy%22%2C%20%22layers%22%3A%20%5B%7B%22type%22%3A%20%22image%22%2C%20%22tab%22%3A%20%22rendering%22%2C%20%22shader%22%3A%20%22%5Cn%20%20%20%20%23uicontrol%20float%20red_min%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20red_max%20slider%28min%3D0.0%2C%20max%3D2712.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_min%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20green_max%20slider%28min%3D0.0%2C%20max%3D6026.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_min%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20float%20blue_max%20slider%28min%3D0.0%2C%20max%3D8190.0%29%5Cn%20%20%20%20%23uicontrol%20bool%20red_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20green_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%23uicontrol%20bool%20blue_visible%20checkbox%28default%3Dtrue%29%3B%5Cn%20%20%20%20%5Cn%20%20%20%20void%20main%28%29%20%7B%5Cn%20%20%20%20%20%20%20%20float%20r%3B%5Cn%20%20%20%20%20%20%20%20float%20r_scale%3Dred_max-red_min%3B%5Cn%20%20%20%20%20%20%20%20if%28%21red_visible%20%7C%7C%20%28r_scale%3C%3D0.0%29%20%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20r%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%3D%28float%28getDataValue%280%29.value%29-red_min%29/r_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28r%3E1.0%29r%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20g%3B%5Cn%20%20%20%20%20%20%20%20%20float%20g_scale%3Dgreen_max-green_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21green_visible%20%7C%7C%20%28g_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20g%3D%28float%28getDataValue%281%29.value%29-green_min%29/g_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28g%3E1.0%29g%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20float%20b%3B%5Cn%20%20%20%20%20%20%20%20%20float%20b_scale%3Dblue_max-blue_min%3B%5Cn%20%20%20%20%20%20%20%20%20if%28%21blue_visible%20%7C%7C%20%28b_scale%3C%3D0.0%29%29%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D0.0%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20else%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20b%3D%28float%28getDataValue%282%29.value%29-blue_min%29/b_scale%3B%5Cn%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20if%28b%3E1.0%29b%3D1.0%3B%5Cn%5Cn%20%20%20%20%20%20%20%20%20emitRGB%28vec3%28r%2Cg%2Cb%29%29%3B%5Cn%20%20%20%20%20%7D%5Cn%20%20%20%20%20%22%2C%20%22shaderControls%22%3A%20%7B%22red_min%22%3A%200.0%2C%20%22red_max%22%3A%201356.0%2C%20%22green_min%22%3A%200.0%2C%20%22green_max%22%3A%203013.0%2C%20%22blue_min%22%3A%200.0%2C%20%22blue_max%22%3A%204095.0%7D%2C%20%22source%22%3A%20%5B%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-1%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-2%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-3%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-4%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-5%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-6%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-7%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-8%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-9%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-10%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-11%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%200%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-12%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-13%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-14%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-15%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-16%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-17%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-18%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-19%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-20%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-21%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-22%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-23%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2029998%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-24%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-25%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-26%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-27%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-28%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-29%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-30%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-31%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-32%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-33%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-34%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-35%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2059996%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-36%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-37%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-38%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-39%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-40%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-41%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-42%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-43%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-44%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-45%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-46%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-47%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%2089994%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-48%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-49%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-50%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-51%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-52%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-53%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-54%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-55%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-56%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-57%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-58%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-59%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20119992%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-60%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-61%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-62%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-63%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-64%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-65%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-66%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-67%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-68%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-69%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-70%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-71%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20149990%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-72%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-73%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-74%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-75%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-76%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-77%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-78%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-79%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-80%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-81%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-82%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-83%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20179988%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-84%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-85%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-86%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-87%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-88%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-89%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-90%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-91%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-92%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-93%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-94%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-95%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20209986%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-96%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-97%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-98%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-99%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-100%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-101%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-102%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-103%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-104%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-105%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-106%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-107%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20239984%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-108%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-109%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-110%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-111%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-112%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-113%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-114%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-115%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-116%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-117%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-118%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-119%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20269982%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-120%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-121%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-122%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-123%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-124%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-125%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-126%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-127%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-128%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-129%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-130%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20399980%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-131%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20299980%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20439978%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-132%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%200%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-133%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2039998%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-134%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%2079996%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-135%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20119994%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-136%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20159992%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-137%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20199990%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-138%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20239988%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-139%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20279986%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-140%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20319984%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%2C%20%7B%22url%22%3A%20%22zarr%3A//s3%3A//tissuecyte-ome-zarr-poc/40_128_128/1240649363%22%2C%20%22transform%22%3A%20%7B%22outputDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%2C%20%22z%22%3A%20%5B0.0001%2C%20%22m%22%5D%2C%20%22y%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%2C%20%22x%22%3A%20%5B3.5e-07%2C%20%22m%22%5D%7D%2C%20%22matrix%22%3A%20%5B%5B1%2C%200%2C%200%2C%200%2C%200%5D%2C%20%5B0%2C%20-1%2C%200%2C%200%2C%20-141%5D%2C%20%5B0%2C%200%2C%201%2C%200%2C%20329978%5D%2C%20%5B0%2C%200%2C%200%2C%201%2C%20359982%5D%5D%7D%2C%20%22subsources%22%3A%20%7B%22default%22%3A%20true%7D%2C%20%22enableDefaultSubsources%22%3A%20false%7D%5D%2C%20%22channelDimensions%22%3A%20%7B%22c%5E%22%3A%20%5B1%2C%20%22%22%5D%7D%2C%20%22name%22%3A%20%221240649363%20%2840_128_128%29%22%2C%20%22opacity%22%3A%201%7D%5D%2C%20%22velocity%22%3A%20%7B%22z%22%3A%20%7B%22velocity%22%3A%20-10%2C%20%22atBoundary%22%3A%20%22reverse%22%7D%7D%2C%20%22position%22%3A%20%5B239988%2C%20179988%2C%20-141%5D%7D', + }, +]; diff --git a/apps/neuroglancer-url/tsconfig.json b/apps/neuroglancer-url/tsconfig.json index e5bee2e..0f20604 100644 --- a/apps/neuroglancer-url/tsconfig.json +++ b/apps/neuroglancer-url/tsconfig.json @@ -1,5 +1,4 @@ { "extends": "../tsconfig.json", "include": ["./src/**/*", "../common/src/**/*"] - -} \ No newline at end of file +} diff --git a/apps/omezarr-viewer/README.md b/apps/omezarr-viewer/README.md index 1a525dd..a7e14d8 100644 --- a/apps/omezarr-viewer/README.md +++ b/apps/omezarr-viewer/README.md @@ -1,8 +1,11 @@ ## Ome-Zarr Viewer Demo a very minimal demo to show how one might use the scatterbrain package to render volumetric images contained in an OME-zarr "File". Note that the datasets in the demos (there are 2) are hard-coded to some data in public S3 buckets. + ### Versa + to run the versa demo, assuming you've just cloned this repository: + 1. run `pnpm build` from the root directory 2. run `pnpm install` in this (apps/omezarr-viewer/) directory 3. run `pnpm run versa` in this directory @@ -12,21 +15,25 @@ to run the versa demo, assuming you've just cloned this repository: The app will load, and immediately begin requesting chunks from the versa dataset - you should be able to pan and zoom with the scroll-Wheel / mouse, and you should see a very basic set of UI controls. The versa dataset is a multi-channel "sequence of images" modality - so a list of available slices will be displayed, allowing the user to click on one to view it. RGB channels can be manipulated individually. #### For developers + if you are interested in the code - you can start at the top: versa.ts contains the top-level glue code (its rather... demo-y! apologies for that - you should understand that this area of code is not "the point" - its just a short, easy-to-write harness for the good stuff) that makes the whole thing run. The interesting parts are probably in the neighborhood of `renderFrameHelper(...)`. The pattern we're looking for is:
+ 1. get the chunks of data (or rather, handles to that data) which are in view with `getVisibleTiles` 2. create a frame to render those tiles, using the current view & other settings, using `beginLongRunningFrame` 3. now you have an object (we call it a frame) that represents rendering progress - you can cancel the frame, put it in a list, create a promise to do something when its over, whatever you like! the point is that it is a first class entity which lets you abstract away a great deal of uncertainty and complexity. As long as you targeted a private render target, nothing else that happens in the app can have any impact on the image being rendered by this frame. 4. Still reading? you might be interested in the "plugin-style" renderer which actually renders chunks of ome-zarr data - take a look at `versa-renderer.ts` which contain the "strategy" components of rendering: -
- a. given a "camera" and a dataset, get me all the tasks (in our case, chunks of images) for what is in view: `getVisibleTiles` - b. given a handle to a "chunk" fetch the chunk and associate it with how it will be used during rendering: `requestsForTile()` - c. given fully-fetched data for a tile, render it! `buildVersaRenderer` - in this case we use [REgl](https://github.com/regl-project/regl/blob/master/API.md), an excellent WebGL abstraction layer, but the point of this plug-ability is that any user of the scatterbrain components may use whatever low-level rendering system (or data format) they prefer! +
+ a. given a "camera" and a dataset, get me all the tasks (in our case, chunks of images) for what is in view: `getVisibleTiles` + b. given a handle to a "chunk" fetch the chunk and associate it with how it will be used during rendering: `requestsForTile()` + c. given fully-fetched data for a tile, render it! `buildVersaRenderer` - in this case we use [REgl](https://github.com/regl-project/regl/blob/master/API.md), an excellent WebGL abstraction layer, but the point of this plug-ability is that any user of the scatterbrain components may use whatever low-level rendering system (or data format) they prefer! + ### Tissuecyte + to run the Tissuecyte demo, assuming you've just cloned this repository: + 1. run `pnpm build` from the root directory 2. run `pnpm install` in this (apps/omezarr-viewer/) directory 3. run `pnpm run tissuecyte` in this directory 4. navigate to apps/omezarr-viewer/dst/ using your File browser / finder, and open `tissuecyte.html` in your browser. - -The app will load, and immediately begin requesting chunks from the tissuecyte dataset - you should be able to pan and zoom with the scrollwheel / mouse, and you should see a very basic set of UI controls. The tissuecyte dataset is a "Volume" mode dataset - you get a single channel (gray-scale), and you can scroll through slices of the volume with Alt+Scroll, or use the slider in the UI. Note that in both demos, very little work was done to provide a "production ready" experience - the screen will go black in places where data it needs to render is not yet available, it may be flickery. In particular, the limit on cache memory is quite low, so delays while waiting for data to be (re) downloaded are to be expected. \ No newline at end of file +The app will load, and immediately begin requesting chunks from the tissuecyte dataset - you should be able to pan and zoom with the scrollwheel / mouse, and you should see a very basic set of UI controls. The tissuecyte dataset is a "Volume" mode dataset - you get a single channel (gray-scale), and you can scroll through slices of the volume with Alt+Scroll, or use the slider in the UI. Note that in both demos, very little work was done to provide a "production ready" experience - the screen will go black in places where data it needs to render is not yet available, it may be flickery. In particular, the limit on cache memory is quite low, so delays while waiting for data to be (re) downloaded are to be expected. diff --git a/apps/omezarr-viewer/package.json b/apps/omezarr-viewer/package.json index 4abed12..9eed628 100644 --- a/apps/omezarr-viewer/package.json +++ b/apps/omezarr-viewer/package.json @@ -1,52 +1,52 @@ { - "name": "@alleninstitute/vis-omezarr-demo", - "version": "0.0.1", - "contributors": [ - { - "name": "Lane Sawyer", - "email": "lane.sawyer@alleninstitute.org" + "name": "@alleninstitute/vis-omezarr-demo", + "version": "0.0.1", + "contributors": [ + { + "name": "Lane Sawyer", + "email": "lane.sawyer@alleninstitute.org" + }, + { + "name": "James Gerstenberger", + "email": "james.gerstenberger@alleninstitute.org" + }, + { + "name": "Noah Shepard", + "email": "noah.shepard@alleninstitute.org" + }, + { + "name": "Skyler Moosman", + "email": "skyler.moosman@alleninstitute.org" + }, + { + "name": "Su Li", + "email": "su.li@alleninstitute.org" + } + ], + "license": "TBD", + "type": "module", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "private": true, + "scripts": { + "preinstall": "npx only-allow pnpm", + "typecheck": "tsc --noEmit", + "demo": "esbuild src/demo.ts --bundle --outfile=dst/demo.js && cp public/* dst/", + "versa": "esbuild src/versa.ts --bundle --outfile=dst/versa.js && cp public/* dst/", + "tissuecyte": "esbuild src/tissuecyte.ts --bundle --outfile=dst/tissuecyte.js && cp public/* dst/", + "test": "jest --config=jest.config.cjs --watch" }, - { - "name": "James Gerstenberger", - "email": "james.gerstenberger@alleninstitute.org" + "devDependencies": { + "esbuild": "^0.19.12", + "typescript": "^5.3.3" }, - { - "name": "Noah Shepard", - "email": "noah.shepard@alleninstitute.org" - }, - { - "name": "Skyler Moosman", - "email": "skyler.moosman@alleninstitute.org" - }, - { - "name": "Su Li", - "email": "su.li@alleninstitute.org" + "dependencies": { + "@alleninstitute/vis-geometry": "workspace:*", + "@alleninstitute/vis-scatterbrain": "workspace:*", + "@types/lodash": "^4.14.202", + "@zhobo63/imgui-ts": "^0.1.43", + "lodash": "^4.17.21", + "regl": "^2.1.0", + "zarr": "^0.6.2" } - ], - "license": "TBD", - "type": "module", - "main": "lib/index.js", - "types": "lib/index.d.ts", - "private": true, - "scripts": { - "preinstall": "npx only-allow pnpm", - "typecheck": "tsc --noEmit", - "demo": "esbuild src/demo.ts --bundle --outfile=dst/demo.js && cp public/* dst/", - "versa": "esbuild src/versa.ts --bundle --outfile=dst/versa.js && cp public/* dst/", - "tissuecyte": "esbuild src/tissuecyte.ts --bundle --outfile=dst/tissuecyte.js && cp public/* dst/", - "test": "jest --config=jest.config.cjs --watch" - }, - "devDependencies": { - "esbuild": "^0.19.12", - "typescript": "^5.3.3" - }, - "dependencies": { - "@alleninstitute/vis-geometry": "workspace:*", - "@alleninstitute/vis-scatterbrain": "workspace:*", - "@types/lodash": "^4.14.202", - "@zhobo63/imgui-ts": "^0.1.43", - "lodash": "^4.17.21", - "regl": "^2.1.0", - "zarr": "^0.6.2" - } -} \ No newline at end of file +} diff --git a/apps/omezarr-viewer/public/tissuecyte.html b/apps/omezarr-viewer/public/tissuecyte.html index 5cd56e5..1f15c28 100644 --- a/apps/omezarr-viewer/public/tissuecyte.html +++ b/apps/omezarr-viewer/public/tissuecyte.html @@ -1,8 +1,14 @@ - + - - - - + + + + diff --git a/apps/omezarr-viewer/public/versa.html b/apps/omezarr-viewer/public/versa.html index 9821564..8c25eb8 100644 --- a/apps/omezarr-viewer/public/versa.html +++ b/apps/omezarr-viewer/public/versa.html @@ -1,7 +1,10 @@ - - - - - - - + + + + + + + diff --git a/apps/omezarr-viewer/src/annotation/path.ts b/apps/omezarr-viewer/src/annotation/path.ts index f0ff00e..1bb5aa2 100644 --- a/apps/omezarr-viewer/src/annotation/path.ts +++ b/apps/omezarr-viewer/src/annotation/path.ts @@ -1,99 +1,97 @@ -import type { vec2, vec4 } from "@alleninstitute/vis-geometry" - -export type Point = { - point: vec2; - pressure?: number; -} -// type SLLNode = { -// item: T; -// next: SLLNode | null; -// } -// type SLL = { -// head: SLLNode|null; -// tail: SLLNode|null; -// length -// } -export type Pen = { - color: vec4; - strokeWidth: number; -} -export type PathAnnotation = { - path: Point[]; - pen: Pen; -} - -// make a set of handlers that make a thing drawable... - - -// how would we generify drawing on top of something... -export type DrawingHost = { - updateCurrentStroke: (point: Point) => void; - newStroke: (point: Point) => void; - // endStroke? - currentTool: () => Pen | 'camera'; - pan: (screenDelta: vec2) => void; - screenToDataSpace: (screen: vec2) => vec2; - screenWidthToDataWidth: (w: number) => number; -} - -export function initDrawableInterface(surface: HTMLElement, host: DrawingHost) { - let buttonDown: boolean = false; - let curPointerId: number | null; - - surface.onpointermove = (ev: PointerEvent) => { - if (buttonDown && ev.pointerId === curPointerId) { - if (host.currentTool() == 'camera') { - // pan that camera! - host.pan([ev.movementX, ev.movementY]) - } else { - // draw with our current pen... hmmmm - host.updateCurrentStroke({ - point: host.screenToDataSpace([ev.x, ev.y]), - pressure: ev.pressure - }) - } - } - } - surface.onpointerdown = (ev: PointerEvent) => { - if (curPointerId === null) { - curPointerId = ev.pointerId; - buttonDown = true; - if (host.currentTool() !== 'camera') { - host.newStroke({ - point: host.screenToDataSpace([ev.x, ev.y]), - pressure: ev.pressure - }) - } - } - } - surface.onpointerup = (ev: PointerEvent) => { - if (curPointerId === ev.pointerId) { - curPointerId = null; - buttonDown = false; - } - } - - - return () => { - // cleanup! - // todo! - } -} - -// export function beginDrawing(pen: Pen, p: vec2, pressure?: number): PathAnnotation { -// return { -// pen, -// path: [{ -// point: p, -// pressure: pressure ?? 1.0 -// }] -// } -// } -// export function continueDrawing(annotation: PathAnnotation, p: vec2, pressure?: number): PathAnnotation { -// return { -// ...annotation, path: [...annotation.path, { -// point: p, -// pressure: pressure ?? 1.0 -// }] -// } -// } +import type { vec2, vec4 } from '@alleninstitute/vis-geometry'; + +export type Point = { + point: vec2; + pressure?: number; +}; +// type SLLNode = { +// item: T; +// next: SLLNode | null; +// } +// type SLL = { +// head: SLLNode|null; +// tail: SLLNode|null; +// length +// } +export type Pen = { + color: vec4; + strokeWidth: number; +}; +export type PathAnnotation = { + path: Point[]; + pen: Pen; +}; + +// make a set of handlers that make a thing drawable... + +// how would we generify drawing on top of something... +export type DrawingHost = { + updateCurrentStroke: (point: Point) => void; + newStroke: (point: Point) => void; + // endStroke? + currentTool: () => Pen | 'camera'; + pan: (screenDelta: vec2) => void; + screenToDataSpace: (screen: vec2) => vec2; + screenWidthToDataWidth: (w: number) => number; +}; + +export function initDrawableInterface(surface: HTMLElement, host: DrawingHost) { + let buttonDown: boolean = false; + let curPointerId: number | null; + + surface.onpointermove = (ev: PointerEvent) => { + if (buttonDown && ev.pointerId === curPointerId) { + if (host.currentTool() == 'camera') { + // pan that camera! + host.pan([ev.movementX, ev.movementY]); + } else { + // draw with our current pen... hmmmm + host.updateCurrentStroke({ + point: host.screenToDataSpace([ev.x, ev.y]), + pressure: ev.pressure, + }); + } + } + }; + surface.onpointerdown = (ev: PointerEvent) => { + if (curPointerId === null) { + curPointerId = ev.pointerId; + buttonDown = true; + if (host.currentTool() !== 'camera') { + host.newStroke({ + point: host.screenToDataSpace([ev.x, ev.y]), + pressure: ev.pressure, + }); + } + } + }; + surface.onpointerup = (ev: PointerEvent) => { + if (curPointerId === ev.pointerId) { + curPointerId = null; + buttonDown = false; + } + }; + + return () => { + // cleanup! + // todo! + }; +} + +// export function beginDrawing(pen: Pen, p: vec2, pressure?: number): PathAnnotation { +// return { +// pen, +// path: [{ +// point: p, +// pressure: pressure ?? 1.0 +// }] +// } +// } +// export function continueDrawing(annotation: PathAnnotation, p: vec2, pressure?: number): PathAnnotation { +// return { +// ...annotation, path: [...annotation.path, { +// point: p, +// pressure: pressure ?? 1.0 +// }] +// } +// } diff --git a/apps/omezarr-viewer/src/camera.ts b/apps/omezarr-viewer/src/camera.ts index 5cda0b2..a73dfb5 100644 --- a/apps/omezarr-viewer/src/camera.ts +++ b/apps/omezarr-viewer/src/camera.ts @@ -1,9 +1,8 @@ -import type { box2D, vec2 } from "@alleninstitute/vis-geometry" - -// a basic camera, for viewing slices -export type Camera = { - readonly view: box2D; // a view in 'data space' - readonly screen: vec2; // what that view projects to in display space, aka pixels - readonly projection: 'webImage' | 'cartesian' -} - +import type { box2D, vec2 } from '@alleninstitute/vis-geometry'; + +// a basic camera, for viewing slices +export type Camera = { + readonly view: box2D; // a view in 'data space' + readonly screen: vec2; // what that view projects to in display space, aka pixels + readonly projection: 'webImage' | 'cartesian'; +}; diff --git a/apps/omezarr-viewer/src/components/color-map.ts b/apps/omezarr-viewer/src/components/color-map.ts index 280f09c..41aa90b 100644 --- a/apps/omezarr-viewer/src/components/color-map.ts +++ b/apps/omezarr-viewer/src/components/color-map.ts @@ -1,66 +1,66 @@ -// an IM-gui widget for controlling the display of a single channel - -// an IM-gui widget for controlling the display of a single channel -import type { Interval } from "@alleninstitute/vis-geometry"; -import { ImGui } from "@zhobo63/imgui-ts"; -import type { ImTuple2 } from "@zhobo63/imgui-ts/src/bind-imgui"; -import { ImGuiColorEditFlags, ImGuiSliderFlags, ImVec4 } from "@zhobo63/imgui-ts/src/imgui"; - -// assumes its mid-frame of an IMGui.newFrame() when called! - -export function colorMapWidget( - channel: string, - mutable: { - useMe: boolean; - color: ImVec4; - gamut: Interval; - index: number; - }, - numChannels: number -) { - const channelChoices = new Array(numChannels).map((n) => n.toFixed(0)); - const getter = (data: string[], index: number, out: [string]) => { - out[0] = data[index]; - return false; - }; - let changed = false; - const { gamut, color } = mutable; - let index = mutable.index; - const range: ImTuple2 = [gamut.min, gamut.max]; - if ( - ImGui.Checkbox("", (b?: boolean) => { - mutable.useMe = b ?? mutable.useMe; - return mutable.useMe; - }) - ) { - changed = true; - } - ImGui.SameLine(); - ImGui.ColorButton(" ", color, ImGuiColorEditFlags.NoAlpha); - ImGui.SameLine(); - ImGui.PushItemWidth(10); - if ( - ImGui.DragInt( - `${channel}_options`, - (i?: number) => { - index = i ?? index; - return index; - }, - 0.2, - 0, - numChannels - 1, - "%i" - ) - ) { - changed = true; - mutable.index = index; - } - ImGui.PopItemWidth(); - - ImGui.SameLine(); - if (ImGui.SliderFloat2(channel, range, 0, 9999, "%3f", ImGuiSliderFlags.Logarithmic)) { - mutable.gamut = { min: range[0], max: range[1] }; - changed = true; - } - return { changed, ...mutable }; -} +// an IM-gui widget for controlling the display of a single channel + +// an IM-gui widget for controlling the display of a single channel +import type { Interval } from '@alleninstitute/vis-geometry'; +import { ImGui } from '@zhobo63/imgui-ts'; +import type { ImTuple2 } from '@zhobo63/imgui-ts/src/bind-imgui'; +import { ImGuiColorEditFlags, ImGuiSliderFlags, ImVec4 } from '@zhobo63/imgui-ts/src/imgui'; + +// assumes its mid-frame of an IMGui.newFrame() when called! + +export function colorMapWidget( + channel: string, + mutable: { + useMe: boolean; + color: ImVec4; + gamut: Interval; + index: number; + }, + numChannels: number +) { + const channelChoices = new Array(numChannels).map((n) => n.toFixed(0)); + const getter = (data: string[], index: number, out: [string]) => { + out[0] = data[index]; + return false; + }; + let changed = false; + const { gamut, color } = mutable; + let index = mutable.index; + const range: ImTuple2 = [gamut.min, gamut.max]; + if ( + ImGui.Checkbox('', (b?: boolean) => { + mutable.useMe = b ?? mutable.useMe; + return mutable.useMe; + }) + ) { + changed = true; + } + ImGui.SameLine(); + ImGui.ColorButton(' ', color, ImGuiColorEditFlags.NoAlpha); + ImGui.SameLine(); + ImGui.PushItemWidth(10); + if ( + ImGui.DragInt( + `${channel}_options`, + (i?: number) => { + index = i ?? index; + return index; + }, + 0.2, + 0, + numChannels - 1, + '%i' + ) + ) { + changed = true; + mutable.index = index; + } + ImGui.PopItemWidth(); + + ImGui.SameLine(); + if (ImGui.SliderFloat2(channel, range, 0, 9999, '%3f', ImGuiSliderFlags.Logarithmic)) { + mutable.gamut = { min: range[0], max: range[1] }; + changed = true; + } + return { changed, ...mutable }; +} diff --git a/apps/omezarr-viewer/src/image-renderer.ts b/apps/omezarr-viewer/src/image-renderer.ts index 0984187..0133cb7 100644 --- a/apps/omezarr-viewer/src/image-renderer.ts +++ b/apps/omezarr-viewer/src/image-renderer.ts @@ -1,67 +1,67 @@ -import type { vec2, vec4 } from "@alleninstitute/vis-geometry"; -import REGL, { type Framebuffer2D } from "regl"; - -type Props = { - target: Framebuffer2D | null; - box: vec4; - view: vec4; - // viewport: REGL.BoundingBox; - img: REGL.Texture2D | REGL.Framebuffer2D; -}; -export function buildImageRenderer(regl: REGL.Regl) { - const cmd = regl< - { view: vec4; box: vec4; img: REGL.Texture2D | REGL.Framebuffer2D }, - { pos: REGL.BufferData }, - Props - >({ - vert: ` precision highp float; - attribute vec2 pos; - - uniform vec4 view; - uniform vec4 box; - varying vec2 texCoord; - - void main(){ - vec2 tileSize = box.zw-box.xy; - texCoord = pos; - vec2 obj = (pos.xy*tileSize+box.xy); - vec2 p = (obj-view.xy)/(view.zw-view.xy); - // now, to clip space - p = (p*2.0)-1.0; - gl_Position = vec4(p.x,p.y,0.0,1.0); - }`, - frag: ` - precision highp float; - - uniform sampler2D img; - // its more direct to do 3 separate channels... - varying vec2 texCoord; - void main(){ - - gl_FragColor =texture2D(img, texCoord); - }`, - framebuffer: regl.prop("target"), - attributes: { - pos: [0, 0, 1, 0, 1, 1, 0, 1], - }, - depth: { - enable: false, - }, - uniforms: { - box: regl.prop("box"), - view: regl.prop("view"), - img: regl.prop("img"), - }, - blend: { - enable: true, - func: { - src: "src alpha", - dst: "one minus src alpha", - }, - }, - count: 4, - primitive: "triangle fan", - // ... more! - }); - return cmd; -} +import type { vec2, vec4 } from '@alleninstitute/vis-geometry'; +import REGL, { type Framebuffer2D } from 'regl'; + +type Props = { + target: Framebuffer2D | null; + box: vec4; + view: vec4; + // viewport: REGL.BoundingBox; + img: REGL.Texture2D | REGL.Framebuffer2D; +}; +export function buildImageRenderer(regl: REGL.Regl) { + const cmd = regl< + { view: vec4; box: vec4; img: REGL.Texture2D | REGL.Framebuffer2D }, + { pos: REGL.BufferData }, + Props + >({ + vert: ` precision highp float; + attribute vec2 pos; + + uniform vec4 view; + uniform vec4 box; + varying vec2 texCoord; + + void main(){ + vec2 tileSize = box.zw-box.xy; + texCoord = pos; + vec2 obj = (pos.xy*tileSize+box.xy); + vec2 p = (obj-view.xy)/(view.zw-view.xy); + // now, to clip space + p = (p*2.0)-1.0; + gl_Position = vec4(p.x,p.y,0.0,1.0); + }`, + frag: ` + precision highp float; + + uniform sampler2D img; + // its more direct to do 3 separate channels... + varying vec2 texCoord; + void main(){ + + gl_FragColor =texture2D(img, texCoord); + }`, + framebuffer: regl.prop('target'), + attributes: { + pos: [0, 0, 1, 0, 1, 1, 0, 1], + }, + depth: { + enable: false, + }, + uniforms: { + box: regl.prop('box'), + view: regl.prop('view'), + img: regl.prop('img'), + }, + blend: { + enable: true, + func: { + src: 'src alpha', + dst: 'one minus src alpha', + }, + }, + count: 4, + primitive: 'triangle fan', + // ... more! + }); + return cmd; +} diff --git a/apps/omezarr-viewer/src/slice-renderer.ts b/apps/omezarr-viewer/src/slice-renderer.ts index 91473d0..7575c04 100644 --- a/apps/omezarr-viewer/src/slice-renderer.ts +++ b/apps/omezarr-viewer/src/slice-renderer.ts @@ -1,255 +1,250 @@ -import REGL from "regl"; -import { - type ZarrDataset, - type ZarrRequest, - getSlice, - indexOfDimension, - pickBestScale, - sizeInUnits, - planeSizeInVoxels, -} from "Common/loaders/ome-zarr/zarr-data";; -import { Box2D, type Interval, Vec2, type box2D, type vec2, type vec4 } from "@alleninstitute/vis-geometry"; -import type { Camera } from "./camera"; - -type Props = { - tile: vec4; - view: vec4; - gamut: vec2; - viewport: REGL.BoundingBox; - img: REGL.Texture2D; - rot: number; - target: REGL.Framebuffer2D | null; -}; -export function buildVolumeSliceRenderer(regl: REGL.Regl) { - const cmd = regl< - { view: vec4; tile: vec4; img: REGL.Texture2D; gamut: vec2; rot: number }, - { pos: REGL.BufferData }, - Props - >({ - vert: ` precision highp float; - attribute vec2 pos; - - uniform vec4 view; - uniform vec4 tile; - uniform float rot; - varying vec2 texCoord; - - vec2 rotateObj(vec2 obj, float radians){ - return obj; - // mat2 R = mat2( - // vec2(cos(radians),-sin(radians)), - // vec2(-sin(radians),cos(radians)) - // ); - // return R*obj; - } - vec2 rotateTextureCoordinates(vec2 tx, float radians){ - vec2 xy = tx-vec2(0.5,0.5); - mat2 R = mat2( - vec2(cos(radians),-sin(radians)), - vec2(-sin(radians),cos(radians)) - ); - return ((R*xy)+vec2(0.5,0.5)); - } - void main(){ - vec2 tileSize = (tile.zw-tile.xy); - texCoord = rotateTextureCoordinates(pos,rot); - vec2 obj = rotateObj((pos.xy*tileSize+tile.xy),rot); - vec2 p = (obj-view.xy)/(view.zw-view.xy); - // now, to clip space - p = (p*2.0)-1.0; - - gl_Position = vec4(p.x,p.y,0.0,1.0); - }`, - frag: ` - precision highp float; - uniform sampler2D img; - uniform vec2 gamut; - varying vec2 texCoord; - void main(){ - float span = gamut.y-gamut.x; - float lum = texture2D(img, texCoord).r/span-gamut.x; - gl_FragColor = vec4(lum,lum,lum, 1.0); - }`, - attributes: { - pos: [0, 0, 1, 0, 1, 1, 0, 1], - }, - uniforms: { - rot: regl.prop("rot"), - tile: regl.prop("tile"), - view: regl.prop("view"), - img: regl.prop("img"), - gamut: regl.prop("gamut"), - }, - depth: { - enable: false, - }, - framebuffer: regl.prop("target"), - count: 4, - // viewport: regl.prop("viewport"), - primitive: "triangle fan", - // ... more! - }); - - return (item: VoxelTile, settings: VoxelSliceRenderSettings, tasks: Record) => { - const { view, viewport, gamut, target } = settings; - const { bounds } = item; - const img = tasks[LUMINANCE]; - if (!img || !('type' in img && img.type === 'texture2D')) return; // we cant render if the data for the positions is missing! - cmd({ - view: [...view.minCorner, ...view.maxCorner], - tile: [...bounds.minCorner, ...bounds.maxCorner], - // viewport, - gamut: [gamut.min, gamut.max], - img: img.data, - rot: settings.rotation, - target, - }); - }; -} -type Bfr = { type: 'texture2D', data: REGL.Texture2D }; - -type Tile = { bounds: box2D }; -export type VoxelSliceRenderSettings = { - regl: REGL.Regl; - target: REGL.Framebuffer2D | null; - dataset: ZarrDataset; - view: box2D; - gamut: Interval; - rotation: number; - viewport: REGL.BoundingBox; -}; -export type AxisAlignedPlane = "xy" | "yz" | "xz"; -export type VoxelTile = { - plane: AxisAlignedPlane; - bounds: box2D; // in voxels, in the plane - planeIndex: number; - layerIndex: number; - // time and channel are always = 0, for now -}; - -function toZarrRequest(tile: VoxelTile): ZarrRequest { - const { plane, planeIndex, bounds } = tile; - const { minCorner: min, maxCorner: max } = bounds; - const u = { min: min[0], max: max[0] }; - const v = { min: min[1], max: max[1] }; - switch (plane) { - case "xy": - return { - x: u, - y: v, - t: 0, - c: 0, - z: planeIndex, - }; - case "xz": - return { - x: u, - z: v, - t: 0, - c: 0, - y: planeIndex, - }; - case "yz": - return { - y: u, - z: v, - t: 0, - c: 0, - x: planeIndex, - }; - } -} -export function cacheKeyFactory(col: string, item: VoxelTile, settings: VoxelSliceRenderSettings) { - return `${JSON.stringify(item)}_${col}`; -} -const LUMINANCE = "luminance"; -export function requestsForTile(tile: VoxelTile, settings: VoxelSliceRenderSettings, signal?: AbortSignal) { - const { dataset, regl } = settings; - - return { - luminance: async () => { - // console.log("req: ", tile); - const vxl = await getSlice(dataset, toZarrRequest(tile), tile.layerIndex); - // TODO: cancel? - const { shape, buffer } = vxl; - // upload the data to a webgl texture - // draw that texture to the screen with our command - // console.log("upload new tile: ", cacheKeyFactory("lum", tile, settings)); - const tex = regl.texture({ - data: new Float32Array(buffer.flatten()), - width: shape[1], - height: shape[0], // TODO this swap is sus - format: "luminance", - }); - return { type: 'texture2D', data: tex }; - }, - }; -} - -function getAllTiles(idealTilePx: vec2, layerSize: vec2) { - // return the set of all our "tiles" of this layer, given the tilePx size - const tiles: box2D[] = []; - for (let x = 0; x < layerSize[0]; x += idealTilePx[0]) { - for (let y = 0; y < layerSize[1]; y += idealTilePx[1]) { - const xy: vec2 = [x, y]; - tiles.push(Box2D.create(xy, Vec2.min(Vec2.add(xy, idealTilePx), layerSize))); - } - } - return tiles; -} -const uvTable = { - xy: { u: "x", v: "y" }, - xz: { u: "x", v: "z" }, - yz: { u: "y", v: "z" }, -} as const; -const sliceDimension = { - xy: "z", - xz: "y", - yz: "x", -} as const; - -export function getVisibleTiles( - camera: Camera, - plane: AxisAlignedPlane, - sliceParam: number, - dataset: ZarrDataset -): { layer: number; view: box2D; tiles: VoxelTile[] } { - const { axes, datasets } = dataset.multiscales[0]; - const sliceSize = sizeInUnits(uvTable[plane], axes, datasets[0])!; - - const zIndex = indexOfDimension(axes, sliceDimension[plane]); - const thingy = pickBestScale( - dataset, - uvTable[plane], - camera.view, - camera.screen - ); - const thickness = thingy.shape[zIndex]; - const planeIndex = Math.floor(thickness * sliceParam); - // TODO: open the array, look at its chunks, use that size for the size of the tiles I request! - const layerIndex = dataset.multiscales[0].datasets.indexOf(thingy); - const size = planeSizeInVoxels(uvTable[plane], dataset.multiscales[0].axes, thingy); - const realSize = sizeInUnits(uvTable[plane], dataset.multiscales[0].axes, thingy); - if (!size || !realSize) return { layer: layerIndex, view: Box2D.create([0, 0], [1, 1]), tiles: [] }; - const scale = Vec2.div(realSize, size); - // to go from a voxel-box to a real-box (easier than you think, as both have an origin at 0,0, because we only support scale...) - const vxlToReal = (vxl: box2D) => Box2D.scale(vxl, scale); - const realToVxl = (real: box2D) => Box2D.scale(real, Vec2.div(size, realSize)); - - // find the tiles, in voxels, to request... - const allTiles = getAllTiles([256, 256], size); - const inView = allTiles.filter((tile) => !!Box2D.intersection(camera.view, vxlToReal(tile))); - // camera.view is in a made up dataspace, where 1=height of the current dataset - // thus, we have to convert it into a voxel-space camera for intersections - const voxelView = realToVxl(camera.view); - return { - layer: layerIndex, - view: voxelView, - tiles: inView.map((uv) => ({ - plane, - bounds: uv, - planeIndex, - layerIndex, - })), - }; -} +import REGL from 'regl'; +import { + type ZarrDataset, + type ZarrRequest, + getSlice, + indexOfDimension, + pickBestScale, + sizeInUnits, + planeSizeInVoxels, +} from 'Common/loaders/ome-zarr/zarr-data'; +import { Box2D, type Interval, Vec2, type box2D, type vec2, type vec4 } from '@alleninstitute/vis-geometry'; +import type { Camera } from './camera'; + +type Props = { + tile: vec4; + view: vec4; + gamut: vec2; + viewport: REGL.BoundingBox; + img: REGL.Texture2D; + rot: number; + target: REGL.Framebuffer2D | null; +}; +export function buildVolumeSliceRenderer(regl: REGL.Regl) { + const cmd = regl< + { view: vec4; tile: vec4; img: REGL.Texture2D; gamut: vec2; rot: number }, + { pos: REGL.BufferData }, + Props + >({ + vert: ` precision highp float; + attribute vec2 pos; + + uniform vec4 view; + uniform vec4 tile; + uniform float rot; + varying vec2 texCoord; + + vec2 rotateObj(vec2 obj, float radians){ + return obj; + // mat2 R = mat2( + // vec2(cos(radians),-sin(radians)), + // vec2(-sin(radians),cos(radians)) + // ); + // return R*obj; + } + vec2 rotateTextureCoordinates(vec2 tx, float radians){ + vec2 xy = tx-vec2(0.5,0.5); + mat2 R = mat2( + vec2(cos(radians),-sin(radians)), + vec2(-sin(radians),cos(radians)) + ); + return ((R*xy)+vec2(0.5,0.5)); + } + void main(){ + vec2 tileSize = (tile.zw-tile.xy); + texCoord = rotateTextureCoordinates(pos,rot); + vec2 obj = rotateObj((pos.xy*tileSize+tile.xy),rot); + vec2 p = (obj-view.xy)/(view.zw-view.xy); + // now, to clip space + p = (p*2.0)-1.0; + + gl_Position = vec4(p.x,p.y,0.0,1.0); + }`, + frag: ` + precision highp float; + uniform sampler2D img; + uniform vec2 gamut; + varying vec2 texCoord; + void main(){ + float span = gamut.y-gamut.x; + float lum = texture2D(img, texCoord).r/span-gamut.x; + gl_FragColor = vec4(lum,lum,lum, 1.0); + }`, + attributes: { + pos: [0, 0, 1, 0, 1, 1, 0, 1], + }, + uniforms: { + rot: regl.prop('rot'), + tile: regl.prop('tile'), + view: regl.prop('view'), + img: regl.prop('img'), + gamut: regl.prop('gamut'), + }, + depth: { + enable: false, + }, + framebuffer: regl.prop('target'), + count: 4, + // viewport: regl.prop("viewport"), + primitive: 'triangle fan', + // ... more! + }); + + return (item: VoxelTile, settings: VoxelSliceRenderSettings, tasks: Record) => { + const { view, viewport, gamut, target } = settings; + const { bounds } = item; + const img = tasks[LUMINANCE]; + if (!img || !('type' in img && img.type === 'texture2D')) return; // we cant render if the data for the positions is missing! + cmd({ + view: [...view.minCorner, ...view.maxCorner], + tile: [...bounds.minCorner, ...bounds.maxCorner], + // viewport, + gamut: [gamut.min, gamut.max], + img: img.data, + rot: settings.rotation, + target, + }); + }; +} +type Bfr = { type: 'texture2D'; data: REGL.Texture2D }; + +type Tile = { bounds: box2D }; +export type VoxelSliceRenderSettings = { + regl: REGL.Regl; + target: REGL.Framebuffer2D | null; + dataset: ZarrDataset; + view: box2D; + gamut: Interval; + rotation: number; + viewport: REGL.BoundingBox; +}; +export type AxisAlignedPlane = 'xy' | 'yz' | 'xz'; +export type VoxelTile = { + plane: AxisAlignedPlane; + bounds: box2D; // in voxels, in the plane + planeIndex: number; + layerIndex: number; + // time and channel are always = 0, for now +}; + +function toZarrRequest(tile: VoxelTile): ZarrRequest { + const { plane, planeIndex, bounds } = tile; + const { minCorner: min, maxCorner: max } = bounds; + const u = { min: min[0], max: max[0] }; + const v = { min: min[1], max: max[1] }; + switch (plane) { + case 'xy': + return { + x: u, + y: v, + t: 0, + c: 0, + z: planeIndex, + }; + case 'xz': + return { + x: u, + z: v, + t: 0, + c: 0, + y: planeIndex, + }; + case 'yz': + return { + y: u, + z: v, + t: 0, + c: 0, + x: planeIndex, + }; + } +} +export function cacheKeyFactory(col: string, item: VoxelTile, settings: VoxelSliceRenderSettings) { + return `${JSON.stringify(item)}_${col}`; +} +const LUMINANCE = 'luminance'; +export function requestsForTile(tile: VoxelTile, settings: VoxelSliceRenderSettings, signal?: AbortSignal) { + const { dataset, regl } = settings; + + return { + luminance: async () => { + // console.log("req: ", tile); + const vxl = await getSlice(dataset, toZarrRequest(tile), tile.layerIndex); + // TODO: cancel? + const { shape, buffer } = vxl; + // upload the data to a webgl texture + // draw that texture to the screen with our command + // console.log("upload new tile: ", cacheKeyFactory("lum", tile, settings)); + const tex = regl.texture({ + data: new Float32Array(buffer.flatten()), + width: shape[1], + height: shape[0], // TODO this swap is sus + format: 'luminance', + }); + return { type: 'texture2D', data: tex }; + }, + }; +} + +function getAllTiles(idealTilePx: vec2, layerSize: vec2) { + // return the set of all our "tiles" of this layer, given the tilePx size + const tiles: box2D[] = []; + for (let x = 0; x < layerSize[0]; x += idealTilePx[0]) { + for (let y = 0; y < layerSize[1]; y += idealTilePx[1]) { + const xy: vec2 = [x, y]; + tiles.push(Box2D.create(xy, Vec2.min(Vec2.add(xy, idealTilePx), layerSize))); + } + } + return tiles; +} +const uvTable = { + xy: { u: 'x', v: 'y' }, + xz: { u: 'x', v: 'z' }, + yz: { u: 'y', v: 'z' }, +} as const; +const sliceDimension = { + xy: 'z', + xz: 'y', + yz: 'x', +} as const; + +export function getVisibleTiles( + camera: Camera, + plane: AxisAlignedPlane, + sliceParam: number, + dataset: ZarrDataset +): { layer: number; view: box2D; tiles: VoxelTile[] } { + const { axes, datasets } = dataset.multiscales[0]; + const sliceSize = sizeInUnits(uvTable[plane], axes, datasets[0])!; + + const zIndex = indexOfDimension(axes, sliceDimension[plane]); + const thingy = pickBestScale(dataset, uvTable[plane], camera.view, camera.screen); + const thickness = thingy.shape[zIndex]; + const planeIndex = Math.floor(thickness * sliceParam); + // TODO: open the array, look at its chunks, use that size for the size of the tiles I request! + const layerIndex = dataset.multiscales[0].datasets.indexOf(thingy); + const size = planeSizeInVoxels(uvTable[plane], dataset.multiscales[0].axes, thingy); + const realSize = sizeInUnits(uvTable[plane], dataset.multiscales[0].axes, thingy); + if (!size || !realSize) return { layer: layerIndex, view: Box2D.create([0, 0], [1, 1]), tiles: [] }; + const scale = Vec2.div(realSize, size); + // to go from a voxel-box to a real-box (easier than you think, as both have an origin at 0,0, because we only support scale...) + const vxlToReal = (vxl: box2D) => Box2D.scale(vxl, scale); + const realToVxl = (real: box2D) => Box2D.scale(real, Vec2.div(size, realSize)); + + // find the tiles, in voxels, to request... + const allTiles = getAllTiles([256, 256], size); + const inView = allTiles.filter((tile) => !!Box2D.intersection(camera.view, vxlToReal(tile))); + // camera.view is in a made up dataspace, where 1=height of the current dataset + // thus, we have to convert it into a voxel-space camera for intersections + const voxelView = realToVxl(camera.view); + return { + layer: layerIndex, + view: voxelView, + tiles: inView.map((uv) => ({ + plane, + bounds: uv, + planeIndex, + layerIndex, + })), + }; +} diff --git a/apps/omezarr-viewer/src/tissuecyte.ts b/apps/omezarr-viewer/src/tissuecyte.ts index a4057f0..e4d3179 100644 --- a/apps/omezarr-viewer/src/tissuecyte.ts +++ b/apps/omezarr-viewer/src/tissuecyte.ts @@ -1,482 +1,499 @@ // I am the scatterplot demo // -import { ImGui, ImGui_Impl } from "@zhobo63/imgui-ts"; -import REGL from "regl"; +import { ImGui, ImGui_Impl } from '@zhobo63/imgui-ts'; +import REGL from 'regl'; import { - type ZarrDataset, - explain, - getSlice, - indexOfDimension, - load, - pickBestScale, - sizeInUnits, - planeSizeInVoxels, -} from "Common/loaders/ome-zarr/zarr-data"; -import { AsyncDataCache, type FrameLifecycle, beginLongRunningFrame } from "@alleninstitute/vis-scatterbrain"; + type ZarrDataset, + explain, + getSlice, + indexOfDimension, + load, + pickBestScale, + sizeInUnits, + planeSizeInVoxels, +} from 'Common/loaders/ome-zarr/zarr-data'; +import { AsyncDataCache, type FrameLifecycle, beginLongRunningFrame } from '@alleninstitute/vis-scatterbrain'; -import { Box2D, type Interval, Vec2, type box2D, type vec2 } from "@alleninstitute/vis-geometry"; -import type { Camera } from "./camera"; -import { buildImageRenderer } from "./image-renderer"; -import { ImVec2, ImVec4 } from "@zhobo63/imgui-ts/src/imgui"; -import { colorMapWidget } from "./components/color-map"; -import { initDrawableInterface } from "./annotation/path"; +import { Box2D, type Interval, Vec2, type box2D, type vec2 } from '@alleninstitute/vis-geometry'; +import type { Camera } from './camera'; +import { buildImageRenderer } from './image-renderer'; +import { ImVec2, ImVec4 } from '@zhobo63/imgui-ts/src/imgui'; +import { colorMapWidget } from './components/color-map'; +import { initDrawableInterface } from './annotation/path'; import { - type AxisAlignedPlane, - type VoxelSliceRenderSettings, - type VoxelTile, - buildVolumeSliceRenderer, - cacheKeyFactory, - getVisibleTiles, - requestsForTile, -} from "./slice-renderer"; + type AxisAlignedPlane, + type VoxelSliceRenderSettings, + type VoxelTile, + buildVolumeSliceRenderer, + cacheKeyFactory, + getVisibleTiles, + requestsForTile, +} from './slice-renderer'; const creepy = - "https://aind-open-data.s3.amazonaws.com/SmartSPIM_644106_2022-12-09_12-12-39_stitched_2022-12-16_16-55-11/processed/OMEZarr/Ex_488_Em_525.zarr"; -const tissuecyte = "https://tissuecyte-visualizations.s3.amazonaws.com/data/230105/tissuecyte/1111175209/green/"; + 'https://aind-open-data.s3.amazonaws.com/SmartSPIM_644106_2022-12-09_12-12-39_stitched_2022-12-16_16-55-11/processed/OMEZarr/Ex_488_Em_525.zarr'; +const tissuecyte = 'https://tissuecyte-visualizations.s3.amazonaws.com/data/230105/tissuecyte/1111175209/green/'; // const versa = "https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/scratch/0500408166/"; // const b = "https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/ome_zarr/20231207.1/1282139033/"; // const scott = "https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/ome_zarr/20231204/1197986710/"; const file = tissuecyte; -type Channel = "R" | "G" | "B"; // we can support 3 visual channels at once +type Channel = 'R' | 'G' | 'B'; // we can support 3 visual channels at once type ChannelColorSettings = { - gamut: Interval; - index: number; + gamut: Interval; + index: number; }; class TissuecyteDemo { - mouse: "up" | "down"; - mousePos: vec2; - camera: Camera; - channels: Record; - plane: AxisAlignedPlane; - sliceParameter: number; - canvas: HTMLCanvasElement; - curFrame: FrameLifecycle | null; - rotation: number; - cache: AsyncDataCache; - regl: REGL.Regl; - dataset: ZarrDataset; - screenRenderer: ReturnType; - renderer: ReturnType; - screenBuffer: { bounds: box2D; fbo: REGL.Framebuffer2D }; - datasets: string[]; - constructor( - canvas: HTMLCanvasElement, - dataset: ZarrDataset, - regl: REGL.Regl, - cache: AsyncDataCache, - urls: string[] - ) { - const [w, h] = [canvas.clientWidth, canvas.clientHeight]; - this.datasets = urls; + mouse: 'up' | 'down'; + mousePos: vec2; + camera: Camera; + channels: Record; + plane: AxisAlignedPlane; + sliceParameter: number; + canvas: HTMLCanvasElement; + curFrame: FrameLifecycle | null; + rotation: number; + cache: AsyncDataCache; + regl: REGL.Regl; + dataset: ZarrDataset; + screenRenderer: ReturnType; + renderer: ReturnType; + screenBuffer: { bounds: box2D; fbo: REGL.Framebuffer2D }; + datasets: string[]; + constructor( + canvas: HTMLCanvasElement, + dataset: ZarrDataset, + regl: REGL.Regl, + cache: AsyncDataCache, + urls: string[] + ) { + const [w, h] = [canvas.clientWidth, canvas.clientHeight]; + this.datasets = urls; - const sliceSize = sizeInUnits({ u: "x", v: "y" }, dataset.multiscales[0].axes, dataset.multiscales[0].datasets[0])!; - this.camera = { - view: Box2D.create([0, 0], [(sliceSize[1] * w) / h, sliceSize[1]]), - screen: [w, h], - }; - this.screenBuffer = { bounds: this.camera.view, fbo: regl.framebuffer(w, h) }; - this.dataset = dataset; - this.regl = regl; - this.plane = "yz"; - this.mouse = "up"; - this.cache = cache; - this.sliceParameter = 0.5; - this.mousePos = [0, 0]; - this.channels = { - R: { - gamut: { min: 0, max: 2500 }, - index: 0, - }, - // G: { - // gamut: { min: 0, max: 0.21 }, - // index: 1, - // }, - // B: { - // gamut: { min: 0, max: 0.21 }, - // index: 2, - // }, - }; - this.canvas = canvas; - this.curFrame = null; - this.rotation = (3 * Math.PI) / 2; - this.renderer = buildVolumeSliceRenderer(regl); - this.screenRenderer = buildImageRenderer(regl); - const loop = () => { - this.refreshScreen(); - window.requestAnimationFrame(loop); - }; - window.requestAnimationFrame(loop); - } - setupEventHandlers() { - const canvas = this.canvas; - } - - private upsideDown(v: box2D) { - const { minCorner, maxCorner } = v; - return Box2D.create([minCorner[0], maxCorner[1]], [maxCorner[0], minCorner[1]]); - } - private renderFrame() { - const { camera, plane, sliceParameter, dataset, cache, regl, channels, renderer } = this; - const { layer, view, tiles } = getVisibleTiles(camera, plane, sliceParameter, dataset); - // erase our buffer that holds the render'd dataset image - which lets the UI - // re-render itself independantly - regl.clear({ color: [0, 0, 0, 0], depth: 1, framebuffer: this.screenBuffer.fbo }); - - // get the lowest-resolution view of the current slice - the idea being that we keep - // it cached, and always draw it UNDER the actual layer we want to see, based on our zoom. - // this prevents a flickering black frame when we zoom in to a new, higher resolution layer - const { - layer: baseLayer, - view: baseView, - tiles: baseTiles, - } = getVisibleTiles({ ...camera, screen: [1, 1] }, plane, sliceParameter, dataset); - if (layer === baseLayer) { - this.curFrame = this.renderFrameHelper(baseView, baseTiles); - // if the layer we WANT is actually the lowest res layer, then we're done here and now! - return; + const sliceSize = sizeInUnits( + { u: 'x', v: 'y' }, + dataset.multiscales[0].axes, + dataset.multiscales[0].datasets[0] + )!; + this.camera = { + view: Box2D.create([0, 0], [(sliceSize[1] * w) / h, sliceSize[1]]), + screen: [w, h], + }; + this.screenBuffer = { bounds: this.camera.view, fbo: regl.framebuffer(w, h) }; + this.dataset = dataset; + this.regl = regl; + this.plane = 'yz'; + this.mouse = 'up'; + this.cache = cache; + this.sliceParameter = 0.5; + this.mousePos = [0, 0]; + this.channels = { + R: { + gamut: { min: 0, max: 2500 }, + index: 0, + }, + // G: { + // gamut: { min: 0, max: 0.21 }, + // index: 1, + // }, + // B: { + // gamut: { min: 0, max: 0.21 }, + // index: 2, + // }, + }; + this.canvas = canvas; + this.curFrame = null; + this.rotation = (3 * Math.PI) / 2; + this.renderer = buildVolumeSliceRenderer(regl); + this.screenRenderer = buildImageRenderer(regl); + const loop = () => { + this.refreshScreen(); + window.requestAnimationFrame(loop); + }; + window.requestAnimationFrame(loop); + } + setupEventHandlers() { + const canvas = this.canvas; } - const baseSettings = { - view: baseView, - dataset, - regl, - target: this.screenBuffer.fbo, - viewport: { - x: 0, - y: 0, - width: this.canvas.clientWidth, - height: this.canvas.clientHeight, - }, - rotation: this.rotation, - gamut: this.channels.R.gamut, - // gamut: channels, - }; - const cached = baseTiles.reduce( - (count, cur) => (cache.isCached(cacheKeyFactory("luminance", cur, baseSettings)) ? 1 + count : count), - 0 - ); - if (cached === 0) { - this.curFrame = this.renderFrameHelper(view, tiles); - return; + private upsideDown(v: box2D) { + const { minCorner, maxCorner } = v; + return Box2D.create([minCorner[0], maxCorner[1]], [maxCorner[0], minCorner[1]]); } - const frame = beginLongRunningFrame( - 3, - 33, - baseTiles, - cache, - baseSettings, - requestsForTile, - renderer, - (event) => { - switch (event.status) { - case "error": - throw event.error; // error boundary might catch this - case "progress": - break; - case "finished_synchronously": - case "finished": - console.log("finished base-layer... start real frame!"); - this.curFrame = this.renderFrameHelper(view, tiles); - break; - case "begun": - break; - case "cancelled": - this.curFrame = this.renderFrameHelper(view, tiles); - break; - default: + private renderFrame() { + const { camera, plane, sliceParameter, dataset, cache, regl, channels, renderer } = this; + const { layer, view, tiles } = getVisibleTiles(camera, plane, sliceParameter, dataset); + // erase our buffer that holds the render'd dataset image - which lets the UI + // re-render itself independantly + regl.clear({ color: [0, 0, 0, 0], depth: 1, framebuffer: this.screenBuffer.fbo }); + + // get the lowest-resolution view of the current slice - the idea being that we keep + // it cached, and always draw it UNDER the actual layer we want to see, based on our zoom. + // this prevents a flickering black frame when we zoom in to a new, higher resolution layer + const { + layer: baseLayer, + view: baseView, + tiles: baseTiles, + } = getVisibleTiles({ ...camera, screen: [1, 1] }, plane, sliceParameter, dataset); + if (layer === baseLayer) { + this.curFrame = this.renderFrameHelper(baseView, baseTiles); + // if the layer we WANT is actually the lowest res layer, then we're done here and now! + return; } - }, - cacheKeyFactory - ); - frame.cancelFrame(); - } - // not my fav thing to do - but renderFrame and renderFrame helper are tightly linked - // to accomplish our smoke&mirrors to avoid flickering as tiles load in - - // the both make assumptions about state, and the contents of buffers. do not - // call either of them! - private renderFrameHelper(view: box2D, visibleTiles: VoxelTile[]) { - const { camera, dataset, cache, regl, channels, renderer } = this; - this.screenBuffer.bounds = camera.view; - regl.clear({ depth: 1, framebuffer: this.screenBuffer.fbo }); - // const gamut = { - // R: channels.R.gamut, - // G: channels.G.gamut, - // B: channels.B.gamut, - // }; - const frame = beginLongRunningFrame( - 3, - 33, - visibleTiles, - cache, - { - rotation: this.rotation, - gamut: this.channels.R.gamut, - view: view, - dataset, - regl, - target: this.screenBuffer.fbo, - viewport: { - x: 0, - y: 0, - width: this.canvas.clientWidth, - height: this.canvas.clientHeight, - }, - // gamut: channels, - }, - requestsForTile, - renderer, - (event) => { - switch (event.status) { - case "error": - throw event.error; // error boundary might catch this - case "progress": - this.refreshScreen(); - break; - case "finished_synchronously": - case "finished": - this.curFrame = null; - this.refreshScreen(); - break; - case "begun": - this.refreshScreen(); - break; - case "cancelled": - break; - default: + const baseSettings = { + view: baseView, + dataset, + regl, + target: this.screenBuffer.fbo, + viewport: { + x: 0, + y: 0, + width: this.canvas.clientWidth, + height: this.canvas.clientHeight, + }, + rotation: this.rotation, + gamut: this.channels.R.gamut, + // gamut: channels, + }; + + const cached = baseTiles.reduce( + (count, cur) => (cache.isCached(cacheKeyFactory('luminance', cur, baseSettings)) ? 1 + count : count), + 0 + ); + if (cached === 0) { + this.curFrame = this.renderFrameHelper(view, tiles); + return; } - }, - cacheKeyFactory - ); - return frame; - } - refreshScreen() { - const now = performance.now(); - this.regl._refresh(); - this.regl.clear({ depth: 1, color: [0, 0, 0, 1], framebuffer: null }); + const frame = beginLongRunningFrame( + 3, + 33, + baseTiles, + cache, + baseSettings, + requestsForTile, + renderer, + (event) => { + switch (event.status) { + case 'error': + throw event.error; // error boundary might catch this + case 'progress': + break; + case 'finished_synchronously': + case 'finished': + console.log('finished base-layer... start real frame!'); + this.curFrame = this.renderFrameHelper(view, tiles); + break; + case 'begun': + break; + case 'cancelled': + this.curFrame = this.renderFrameHelper(view, tiles); + break; + default: + } + }, + cacheKeyFactory + ); + frame.cancelFrame(); + } + // not my fav thing to do - but renderFrame and renderFrame helper are tightly linked + // to accomplish our smoke&mirrors to avoid flickering as tiles load in - + // the both make assumptions about state, and the contents of buffers. do not + // call either of them! + private renderFrameHelper(view: box2D, visibleTiles: VoxelTile[]) { + const { camera, dataset, cache, regl, channels, renderer } = this; + this.screenBuffer.bounds = camera.view; + regl.clear({ depth: 1, framebuffer: this.screenBuffer.fbo }); + // const gamut = { + // R: channels.R.gamut, + // G: channels.G.gamut, + // B: channels.B.gamut, + // }; + const frame = beginLongRunningFrame( + 3, + 33, + visibleTiles, + cache, + { + rotation: this.rotation, + gamut: this.channels.R.gamut, + view: view, + dataset, + regl, + target: this.screenBuffer.fbo, + viewport: { + x: 0, + y: 0, + width: this.canvas.clientWidth, + height: this.canvas.clientHeight, + }, + // gamut: channels, + }, + requestsForTile, + renderer, + (event) => { + switch (event.status) { + case 'error': + throw event.error; // error boundary might catch this + case 'progress': + this.refreshScreen(); + break; + case 'finished_synchronously': + case 'finished': + this.curFrame = null; + this.refreshScreen(); + break; + case 'begun': + this.refreshScreen(); + break; + case 'cancelled': + break; + default: + } + }, + cacheKeyFactory + ); + return frame; + } + refreshScreen() { + const now = performance.now(); + this.regl._refresh(); + this.regl.clear({ depth: 1, color: [0, 0, 0, 1], framebuffer: null }); - this.screenRenderer([ - { - box: Box2D.toFlatArray(this.screenBuffer.bounds), - img: this.screenBuffer.fbo, - target: null, - view: Box2D.toFlatArray(this.upsideDown(this.camera.view)), - }, - ]); + this.screenRenderer([ + { + box: Box2D.toFlatArray(this.screenBuffer.bounds), + img: this.screenBuffer.fbo, + target: null, + view: Box2D.toFlatArray(this.upsideDown(this.camera.view)), + }, + ]); - this.drawUI(now); + this.drawUI(now); - this.regl._refresh(); - } + this.regl._refresh(); + } - drawUI(time: number) { - let drawAgain = false; - const effects: Array<() => void> = []; - // imgui wants mutable access to stuff... which is pretty weird - imAccess is nice, but all the vector-style updaters are nasty - try { - ImGui_Impl.NewFrame(time); - ImGui.NewFrame(); - ImGui.Begin("Settings"); - ImGui_Impl.ClearBuffer(new ImVec4(0.2, 0.2, 0.2, 1)); - // ImGui_Impl.ClearBuffer(new ImVec4(0, 0, 0, 0)); - // TODO: count the available channels that we could use for color! - Object.entries(this.channels).forEach(([channel, settings]) => { - const result = colorMapWidget( - channel, - { - gamut: settings.gamut, - color: new ImGui.Vec4(channel === "R" ? 255 : 0, channel === "G" ? 255 : 0, channel === "B" ? 255 : 0, 255), - useMe: true, - index: settings.index, - }, - 3 - ); - if (result.changed) { - this.channels[channel as Channel].gamut = result.gamut; - this.channels[channel as Channel].index = result.index; - drawAgain = true; - } - }); - const highlight = new ImVec4(0, 0.25, 0.65, 1.0); - const regular = new ImVec4(0.2, 0.2, 0.2, 1.0); - // for (const thumb of this.sliceThumbs) { - // if ( - // // here we dig deep into the guts of a regl-managed texture... not super safe, and regl's types are not really set up for this: - // ImGui.ImageButton( - // // @ts-expect-error - // thumb?.color[0]?._texture?.texture ?? null, - // new ImVec2(this.thumbWidth, THUMB_SIZE), - // new ImVec2(0, 0), - // new ImVec2(1, 1), - // // draw a little box around the selected slice: - // this.sliceIndex === this.sliceThumbs.indexOf(thumb) ? 3 : 0, - // this.sliceIndex === this.sliceThumbs.indexOf(thumb) ? highlight : regular - // ) - // ) { - // drawAgain = true; - // effects.push(() => this.setSlice(this.sliceThumbs.indexOf(thumb))); - // } - // ImGui.SameLine(); - // } - let p = this.sliceParameter; - if ( - ImGui.DragFloat( - "slice", - (v?: number) => { - p = v ?? p; - return p; - }, - 0.005, - 0.0, - 1.0, - "%4f" - ) - ) { - effects.push(() => (this.sliceParameter = p)); - drawAgain = true; - } - ImGui.End(); - ImGui.EndFrame(); - ImGui.Render(); + drawUI(time: number) { + let drawAgain = false; + const effects: Array<() => void> = []; + // imgui wants mutable access to stuff... which is pretty weird - imAccess is nice, but all the vector-style updaters are nasty + try { + ImGui_Impl.NewFrame(time); + ImGui.NewFrame(); + ImGui.Begin('Settings'); + ImGui_Impl.ClearBuffer(new ImVec4(0.2, 0.2, 0.2, 1)); + // ImGui_Impl.ClearBuffer(new ImVec4(0, 0, 0, 0)); + // TODO: count the available channels that we could use for color! + Object.entries(this.channels).forEach(([channel, settings]) => { + const result = colorMapWidget( + channel, + { + gamut: settings.gamut, + color: new ImGui.Vec4( + channel === 'R' ? 255 : 0, + channel === 'G' ? 255 : 0, + channel === 'B' ? 255 : 0, + 255 + ), + useMe: true, + index: settings.index, + }, + 3 + ); + if (result.changed) { + this.channels[channel as Channel].gamut = result.gamut; + this.channels[channel as Channel].index = result.index; + drawAgain = true; + } + }); + const highlight = new ImVec4(0, 0.25, 0.65, 1.0); + const regular = new ImVec4(0.2, 0.2, 0.2, 1.0); + // for (const thumb of this.sliceThumbs) { + // if ( + // // here we dig deep into the guts of a regl-managed texture... not super safe, and regl's types are not really set up for this: + // ImGui.ImageButton( + // // @ts-expect-error + // thumb?.color[0]?._texture?.texture ?? null, + // new ImVec2(this.thumbWidth, THUMB_SIZE), + // new ImVec2(0, 0), + // new ImVec2(1, 1), + // // draw a little box around the selected slice: + // this.sliceIndex === this.sliceThumbs.indexOf(thumb) ? 3 : 0, + // this.sliceIndex === this.sliceThumbs.indexOf(thumb) ? highlight : regular + // ) + // ) { + // drawAgain = true; + // effects.push(() => this.setSlice(this.sliceThumbs.indexOf(thumb))); + // } + // ImGui.SameLine(); + // } + let p = this.sliceParameter; + if ( + ImGui.DragFloat( + 'slice', + (v?: number) => { + p = v ?? p; + return p; + }, + 0.005, + 0.0, + 1.0, + '%4f' + ) + ) { + effects.push(() => (this.sliceParameter = p)); + drawAgain = true; + } + ImGui.End(); + ImGui.EndFrame(); + ImGui.Render(); - ImGui_Impl.RenderDrawData(ImGui.GetDrawData()); - effects.forEach((fx) => fx()); - if (drawAgain) { - window.setTimeout(() => this.rerender(), 5); - } - } catch (err) { - console.warn(err); + ImGui_Impl.RenderDrawData(ImGui.GetDrawData()); + effects.forEach((fx) => fx()); + if (drawAgain) { + window.setTimeout(() => this.rerender(), 5); + } + } catch (err) { + console.warn(err); + } } - } - rerender() { - if (this.curFrame !== null) { - this.curFrame.cancelFrame(); + rerender() { + if (this.curFrame !== null) { + this.curFrame.cancelFrame(); + } + this.renderFrame(); + } + mouseButton(click: 'up' | 'down') { + this.mouse = click; } - this.renderFrame(); - } - mouseButton(click: "up" | "down") { - this.mouse = click; - } - mouseMove(delta: vec2) { - if (this.mouse === "down") { - // drag the view - const { screen, view } = this.camera; - const p = Vec2.div(delta, [this.canvas.clientWidth, this.canvas.clientHeight]); - const c = Vec2.mul(p, Box2D.size(view)); - this.camera = { view: Box2D.translate(view, c), screen }; - this.rerender(); + mouseMove(delta: vec2) { + if (this.mouse === 'down') { + // drag the view + const { screen, view } = this.camera; + const p = Vec2.div(delta, [this.canvas.clientWidth, this.canvas.clientHeight]); + const c = Vec2.mul(p, Box2D.size(view)); + this.camera = { view: Box2D.translate(view, c), screen }; + this.rerender(); + } + this.mousePos = Vec2.add(this.mousePos, delta); + } + changeSlice(delta: number) { + this.sliceParameter += delta; + this.rerender(); } - this.mousePos = Vec2.add(this.mousePos, delta); - } - changeSlice(delta: number) { - this.sliceParameter += delta; - this.rerender(); - } - changeGamut(delta: number) { - this.channels.R.gamut = { min: this.channels.R.gamut.min, max: this.channels.R.gamut.max * delta }; - this.rerender(); - } - zoom(scale: number) { - const { view, screen } = this.camera; - const m = Box2D.midpoint(view); - this.camera = { - view: Box2D.translate(Box2D.scale(Box2D.translate(view, Vec2.scale(m, -1)), [scale, scale]), m), - screen, - }; - this.rerender(); - } - nextAxis() { - this.plane = this.plane == "xy" ? "xz" : this.plane === "xz" ? "yz" : "xy"; - this.rerender(); - } - rotateTiles() { - this.rotation += Math.PI / 2; - this.rerender(); - } + changeGamut(delta: number) { + this.channels.R.gamut = { min: this.channels.R.gamut.min, max: this.channels.R.gamut.max * delta }; + this.rerender(); + } + zoom(scale: number) { + const { view, screen } = this.camera; + const m = Box2D.midpoint(view); + this.camera = { + view: Box2D.translate(Box2D.scale(Box2D.translate(view, Vec2.scale(m, -1)), [scale, scale]), m), + screen, + }; + this.rerender(); + } + nextAxis() { + this.plane = this.plane == 'xy' ? 'xz' : this.plane === 'xz' ? 'yz' : 'xy'; + this.rerender(); + } + rotateTiles() { + this.rotation += Math.PI / 2; + this.rerender(); + } } function setupEventHandlers(canvas: HTMLCanvasElement, demo: TissuecyteDemo) { - canvas.onmousedown = (e: MouseEvent) => { - if (ImGui.GetIO().WantCaptureMouse) return; - demo.mouseButton("down"); - }; - canvas.onmouseup = (e: MouseEvent) => { - if (ImGui.GetIO().WantCaptureMouse) return; - demo.mouseButton("up"); - }; - canvas.onmousemove = (e: MouseEvent) => { - if (ImGui.GetIO().WantCaptureMouse) return; - // account for gl-origin vs. screen origin: - demo.mouseMove([-e.movementX, -e.movementY]); - }; - canvas.onwheel = (e: WheelEvent) => { - if (e.shiftKey) { - demo.changeGamut(e.deltaY > 0 ? 1.1 : 0.9); - } else if (e.altKey) { - demo.changeSlice(e.deltaY > 0 ? 0.01 : -0.01); - } else { - demo.zoom(e.deltaY > 0 ? 1.1 : 0.9); - } - }; - canvas.onkeydown = (e: KeyboardEvent) => { - switch (e.key) { - case "a": - demo.nextAxis(); - break; - case "r": - demo.rotateTiles(); - break; - default: - } - }; + canvas.onmousedown = (e: MouseEvent) => { + if (ImGui.GetIO().WantCaptureMouse) return; + demo.mouseButton('down'); + }; + canvas.onmouseup = (e: MouseEvent) => { + if (ImGui.GetIO().WantCaptureMouse) return; + demo.mouseButton('up'); + }; + canvas.onmousemove = (e: MouseEvent) => { + if (ImGui.GetIO().WantCaptureMouse) return; + // account for gl-origin vs. screen origin: + demo.mouseMove([-e.movementX, -e.movementY]); + }; + canvas.onwheel = (e: WheelEvent) => { + if (e.shiftKey) { + demo.changeGamut(e.deltaY > 0 ? 1.1 : 0.9); + } else if (e.altKey) { + demo.changeSlice(e.deltaY > 0 ? 0.01 : -0.01); + } else { + demo.zoom(e.deltaY > 0 ? 1.1 : 0.9); + } + }; + canvas.onkeydown = (e: KeyboardEvent) => { + switch (e.key) { + case 'a': + demo.nextAxis(); + break; + case 'r': + demo.rotateTiles(); + break; + default: + } + }; } function setupGui(canvas: HTMLCanvasElement | WebGL2RenderingContext | WebGLRenderingContext) { - ImGui.default().then(() => { - ImGui.CHECKVERSION(); - ImGui.CreateContext(); - const io: ImGui.IO = ImGui.GetIO(); - ImGui.StyleColorsDark(); - io.Fonts.AddFontDefault(); - ImGui_Impl.Init(canvas); - ImGui_Impl.ClearBuffer(new ImVec4(0.2, 0.2, 0.2, 1)); - }); + ImGui.default().then(() => { + ImGui.CHECKVERSION(); + ImGui.CreateContext(); + const io: ImGui.IO = ImGui.GetIO(); + ImGui.StyleColorsDark(); + io.Fonts.AddFontDefault(); + ImGui_Impl.Init(canvas); + ImGui_Impl.ClearBuffer(new ImVec4(0.2, 0.2, 0.2, 1)); + }); } async function demotime() { - const ui = document.getElementById("uiCanvas") as HTMLCanvasElement; - const yay = document.getElementById("glCanvas") as HTMLCanvasElement; - yay.width = 2000; - yay.height = 2000; + const ui = document.getElementById('uiCanvas') as HTMLCanvasElement; + const yay = document.getElementById('glCanvas') as HTMLCanvasElement; + yay.width = 2000; + yay.height = 2000; - const gl = ui.getContext("webgl2", { - alpha: true, - preserveDrawingBuffer: true, - antialias: true, - premultipliedAlpha: true, - }) as WebGL2RenderingContext; + const gl = ui.getContext('webgl2', { + alpha: true, + preserveDrawingBuffer: true, + antialias: true, + premultipliedAlpha: true, + }) as WebGL2RenderingContext; - const regl = REGL({ - canvas: yay, - attributes: { - alpha: true, - preserveDrawingBuffer: true, - antialias: true, - premultipliedAlpha: true, - }, - extensions: ["ANGLE_instanced_arrays", "OES_texture_float", "WEBGL_color_buffer_float"], - }); - ui.height = 2000; - ui.width = 2000; - const canvas: HTMLCanvasElement = regl._gl.canvas as HTMLCanvasElement; - canvas.tabIndex = 3; - setupGui(gl); - const voxelSliceCache: AsyncDataCache = new AsyncDataCache((d: REGL.Texture2D) => { - d.destroy() - }, (_d) => 1, 200); - const zarr = await load(file); - explain(zarr); + const regl = REGL({ + canvas: yay, + attributes: { + alpha: true, + preserveDrawingBuffer: true, + antialias: true, + premultipliedAlpha: true, + }, + extensions: ['ANGLE_instanced_arrays', 'OES_texture_float', 'WEBGL_color_buffer_float'], + }); + ui.height = 2000; + ui.width = 2000; + const canvas: HTMLCanvasElement = regl._gl.canvas as HTMLCanvasElement; + canvas.tabIndex = 3; + setupGui(gl); + const voxelSliceCache: AsyncDataCache = new AsyncDataCache< + string, + string, + REGL.Texture2D + >( + (d: REGL.Texture2D) => { + d.destroy(); + }, + (_d) => 1, + 200 + ); + const zarr = await load(file); + explain(zarr); - const theDemo = new TissuecyteDemo(canvas, zarr, regl, voxelSliceCache, []); + const theDemo = new TissuecyteDemo(canvas, zarr, regl, voxelSliceCache, []); - setupEventHandlers(canvas, theDemo); - theDemo.rerender(); + setupEventHandlers(canvas, theDemo); + theDemo.rerender(); } // since I am just included in a script tag in a raw html document, this is how we start: diff --git a/apps/omezarr-viewer/src/versa-renderer.ts b/apps/omezarr-viewer/src/versa-renderer.ts index 6ce6605..0cb1f43 100644 --- a/apps/omezarr-viewer/src/versa-renderer.ts +++ b/apps/omezarr-viewer/src/versa-renderer.ts @@ -1,303 +1,307 @@ -import REGL, { type Framebuffer2D } from "regl"; -import { type ZarrDataset, type ZarrRequest, getSlice, pickBestScale, sizeInUnits, planeSizeInVoxels, indexOfDimension } from "Common/loaders/ome-zarr/zarr-data"; -import { Box2D, type Interval, Vec2, type box2D, type vec2, type vec4 } from "@alleninstitute/vis-geometry"; -import { omit, slice } from "lodash"; -import type { Camera } from "./camera"; -import type { NestedArray, TypedArray } from "zarr"; -import { getSlicePool } from "Common/loaders/ome-zarr/sliceWorkerPool"; - -type Props = { - target: Framebuffer2D | null; - tile: vec4; - view: vec4; - rotation: number; - Rgamut: vec2; - Ggamut: vec2; - Bgamut: vec2; - viewport: REGL.BoundingBox; - R: REGL.Texture2D; - G: REGL.Texture2D; - B: REGL.Texture2D; -}; -function isTexture(obj: object | undefined): obj is Bfr { - return (obj !== undefined && 'type' in obj && obj.type === 'texture2D') -} -export function buildVersaRenderer(regl: REGL.Regl) { - const cmd = regl< - { - view: vec4; - tile: vec4; - rot: number; - R: REGL.Texture2D; - G: REGL.Texture2D; - B: REGL.Texture2D; - Rgamut: vec2; - Ggamut: vec2; - Bgamut: vec2; - }, - { pos: REGL.BufferData }, - Props - >({ - vert: ` precision highp float; - attribute vec2 pos; - - uniform vec4 view; - uniform vec4 tile; - varying vec2 texCoord; - uniform float rot; - - vec2 rotateObj(vec2 obj, float radians){ - return obj; - } - vec2 rotateTextureCoordinates(vec2 tx, float radians){ - vec2 xy = tx-vec2(0.5,0.5); - mat2 R = mat2( - vec2(cos(radians),-sin(radians)), - vec2(-sin(radians),cos(radians)) - ); - return ((R*xy)+vec2(0.5,0.5)); - } - void main(){ - vec2 tileSize = tile.zw-tile.xy; - texCoord = rotateTextureCoordinates(pos,rot); - vec2 obj = rotateObj((pos.xy*tileSize+tile.xy),rot); - - vec2 p = (obj-view.xy)/(view.zw-view.xy); - // now, to clip space - p = (p*2.0)-1.0; - gl_Position = vec4(p.x,p.y,0.0,1.0); - }`, - frag: ` - precision highp float; - uniform sampler2D R; - uniform sampler2D G; - uniform sampler2D B; // for reasons which are pretty annoying - // its more direct to do 3 separate channels... - uniform vec2 Rgamut; - uniform vec2 Ggamut; - uniform vec2 Bgamut; - - varying vec2 texCoord; - void main(){ - vec3 mins = vec3(Rgamut.x,Ggamut.x,Bgamut.x); - vec3 maxs = vec3(Rgamut.y,Ggamut.y,Bgamut.y); - vec3 span = maxs-mins; - vec3 color = (vec3( - texture2D(R, texCoord).r, - texture2D(G, texCoord).r, - texture2D(B, texCoord).r - )-mins) /span; - - gl_FragColor = vec4(color, 1.0); - }`, - framebuffer: regl.prop("target"), - attributes: { - pos: [0, 0, 1, 0, 1, 1, 0, 1], - }, - uniforms: { - rot: regl.prop("rotation"), - tile: regl.prop("tile"), - view: regl.prop("view"), - R: regl.prop("R"), - G: regl.prop("G"), - B: regl.prop("B"), - Rgamut: regl.prop("Rgamut"), - Ggamut: regl.prop("Ggamut"), - Bgamut: regl.prop("Bgamut"), - }, - depth: { - enable: false, - }, - count: 4, - // viewport: regl.prop("viewport"), - primitive: "triangle fan", - // ... more! - }); - - return (item: VoxelTile, settings: VoxelSliceRenderSettings, channels: Record) => { - const { view, viewport, gamut, target, rotation } = settings; - const { realBounds } = item; - const { R, G, B } = channels; - - if (!isTexture(R) || !isTexture(G) || !isTexture(B)) { - console.log("missing data: ", R, G, B); - return; - } - - cmd({ - target, - rotation, - view: [...view.minCorner, ...view.maxCorner], - tile: [...realBounds.minCorner, ...realBounds.maxCorner], - R: R.data, - G: G.data, - B: B.data, - Rgamut: [gamut.R.gamut.min, gamut.R.gamut.max], - Ggamut: [gamut.G.gamut.min, gamut.G.gamut.max], - Bgamut: [gamut.B.gamut.min, gamut.B.gamut.max], - }); - }; -} -type Bfr = { type: 'texture2D', data: REGL.Texture2D }; - -type Tile = { bounds: box2D }; -export type VoxelSliceRenderSettings = { - regl: REGL.Regl; - dataset: ZarrDataset; - view: box2D; - rotation: number; - gamut: Record<"R" | "G" | "B", { gamut: Interval; index: number }>; - viewport: REGL.BoundingBox; - target: REGL.Framebuffer2D | null; -}; -export type AxisAlignedPlane = "xy" | "yz" | "xz"; -export type VoxelTile = { - plane: AxisAlignedPlane; - realBounds: box2D; - bounds: box2D; // in voxels, in the plane - planeIndex: number; - layerIndex: number; - // time and channel are always = 0, for now -}; - -function toZarrRequest(tile: VoxelTile, channel: number): ZarrRequest { - const { plane, planeIndex, bounds } = tile; - const { minCorner: min, maxCorner: max } = bounds; - const u = { min: min[0], max: max[0] }; - const v = { min: min[1], max: max[1] }; - switch (plane) { - case "xy": - return { - x: u, - y: v, - t: 0, - c: channel, - z: planeIndex, - }; - case "xz": - return { - x: u, - z: v, - t: 0, - c: channel, - y: planeIndex, - }; - case "yz": - return { - y: u, - z: v, - t: 0, - c: channel, - x: planeIndex, - }; - } -} -export function cacheKeyFactory(col: string, item: VoxelTile, settings: VoxelSliceRenderSettings) { - return `${settings.dataset.url}_${JSON.stringify(omit(item, "desiredResolution"))}_ch=${settings.gamut[col as "R" | "G" | "B"].index - }`; -} - -function reqSlice(dataset: ZarrDataset, req: ZarrRequest, layerIndex: number) { - return getSlicePool().requestSlice(dataset, req, layerIndex) -} -const LUMINANCE = "luminance"; -export function requestsForTile(tile: VoxelTile, settings: VoxelSliceRenderSettings, signal?: AbortSignal) { - const { dataset, regl } = settings; - const handleResponse = (vxl: Awaited>) => { - const { shape, data } = vxl; - const r = regl.texture({ - data, - width: shape[1], - height: shape[0], // TODO this swap is sus - format: LUMINANCE, - }); - return r; - }; - // lets hope the browser caches our 3x repeat calls to teh same data... - return { - R: async () => { - const vxl = await reqSlice(dataset, toZarrRequest(tile, settings.gamut.R.index), tile.layerIndex); - return { type: 'texture2D', data: handleResponse(vxl) } - }, - G: async () => { - const vxl = await reqSlice(dataset, toZarrRequest(tile, settings.gamut.G.index), tile.layerIndex); - return { type: 'texture2D', data: handleResponse(vxl) } - }, - B: async () => { - const vxl = await reqSlice(dataset, toZarrRequest(tile, settings.gamut.B.index), tile.layerIndex); - return { type: 'texture2D', data: handleResponse(vxl) } - }, - }; -} - -function getAllTiles(idealTilePx: vec2, layerSize: vec2) { - // return the set of all our "tiles" of this layer, given the tilePx size - const tiles: box2D[] = []; - for (let x = 0; x < layerSize[0]; x += idealTilePx[0]) { - for (let y = 0; y < layerSize[1]; y += idealTilePx[1]) { - const xy: vec2 = [x, y]; - tiles.push(Box2D.create(xy, Vec2.min(Vec2.add(xy, idealTilePx), layerSize))); - } - } - return tiles; -} -const uvTable = { - xy: { u: "x", v: "y" }, - xz: { u: "x", v: "z" }, - yz: { u: "y", v: "z" }, -} as const; -const sliceDimension = { - xy: "z", - xz: "y", - yz: "x", -} as const; - -export function getVisibleTiles( - camera: Camera, - plane: AxisAlignedPlane, - planeIndex: number, - dataset: ZarrDataset, - offset?: vec2 -): { layer: number; view: box2D; tiles: VoxelTile[] } { - // const { axes, datasets } = dataset.multiscales[0]; - // const zIndex = indexOfDimension(axes, sliceDimension[plane]); - const sliceSize = sizeInUnits( - uvTable[plane], - dataset.multiscales[0].axes, - dataset.multiscales[0].datasets[0] - )!; - const layer = pickBestScale( - dataset, - uvTable[plane], - camera.view, - camera.screen - ); - // TODO: open the array, look at its chunks, use that size for the size of the tiles I request! - const layerIndex = dataset.multiscales[0].datasets.indexOf(layer); - - const size = planeSizeInVoxels(uvTable[plane], dataset.multiscales[0].axes, layer); - const realSize = sizeInUnits(uvTable[plane], dataset.multiscales[0].axes, layer); - if (!size || !realSize) return { layer: layerIndex, view: Box2D.create([0, 0], [1, 1]), tiles: [] }; - const scale = Vec2.div(realSize, size); - // to go from a voxel-box to a real-box (easier than you think, as both have an origin at 0,0, because we only support scale...) - const vxlToReal = (vxl: box2D) => Box2D.translate(Box2D.scale(vxl, scale), offset ?? [0, 0]); - // const realToVxl = (real: box2D) => Box2D.scale(real, Vec2.div(size, realSize)); - - // find the tiles, in voxels, to request... - const allTiles = getAllTiles([256, 256], size); - const inView = allTiles.filter((tile) => !!Box2D.intersection(camera.view, vxlToReal(tile))); - // camera.view is in a made up dataspace, where 1=height of the current dataset - // thus, we have to convert it into a voxel-space camera for intersections - // const voxelView = realToVxl(camera.view); - return { - layer: layerIndex, - view: camera.view, - tiles: inView.map((uv) => ({ - plane, - realBounds: vxlToReal(uv), - bounds: uv, - planeIndex, - layerIndex, - })), - }; -} +import REGL, { type Framebuffer2D } from 'regl'; +import { + type ZarrDataset, + type ZarrRequest, + getSlice, + pickBestScale, + sizeInUnits, + planeSizeInVoxels, + indexOfDimension, +} from 'Common/loaders/ome-zarr/zarr-data'; +import { Box2D, type Interval, Vec2, type box2D, type vec2, type vec4 } from '@alleninstitute/vis-geometry'; +import { omit, slice } from 'lodash'; +import type { Camera } from './camera'; +import type { NestedArray, TypedArray } from 'zarr'; +import { getSlicePool } from 'Common/loaders/ome-zarr/sliceWorkerPool'; + +type Props = { + target: Framebuffer2D | null; + tile: vec4; + view: vec4; + rotation: number; + Rgamut: vec2; + Ggamut: vec2; + Bgamut: vec2; + viewport: REGL.BoundingBox; + R: REGL.Texture2D; + G: REGL.Texture2D; + B: REGL.Texture2D; +}; +function isTexture(obj: object | undefined): obj is Bfr { + return obj !== undefined && 'type' in obj && obj.type === 'texture2D'; +} +export function buildVersaRenderer(regl: REGL.Regl) { + const cmd = regl< + { + view: vec4; + tile: vec4; + rot: number; + R: REGL.Texture2D; + G: REGL.Texture2D; + B: REGL.Texture2D; + Rgamut: vec2; + Ggamut: vec2; + Bgamut: vec2; + }, + { pos: REGL.BufferData }, + Props + >({ + vert: ` precision highp float; + attribute vec2 pos; + + uniform vec4 view; + uniform vec4 tile; + varying vec2 texCoord; + uniform float rot; + + vec2 rotateObj(vec2 obj, float radians){ + return obj; + } + vec2 rotateTextureCoordinates(vec2 tx, float radians){ + vec2 xy = tx-vec2(0.5,0.5); + mat2 R = mat2( + vec2(cos(radians),-sin(radians)), + vec2(-sin(radians),cos(radians)) + ); + return ((R*xy)+vec2(0.5,0.5)); + } + void main(){ + vec2 tileSize = tile.zw-tile.xy; + texCoord = rotateTextureCoordinates(pos,rot); + vec2 obj = rotateObj((pos.xy*tileSize+tile.xy),rot); + + vec2 p = (obj-view.xy)/(view.zw-view.xy); + // now, to clip space + p = (p*2.0)-1.0; + gl_Position = vec4(p.x,p.y,0.0,1.0); + }`, + frag: ` + precision highp float; + uniform sampler2D R; + uniform sampler2D G; + uniform sampler2D B; // for reasons which are pretty annoying + // its more direct to do 3 separate channels... + uniform vec2 Rgamut; + uniform vec2 Ggamut; + uniform vec2 Bgamut; + + varying vec2 texCoord; + void main(){ + vec3 mins = vec3(Rgamut.x,Ggamut.x,Bgamut.x); + vec3 maxs = vec3(Rgamut.y,Ggamut.y,Bgamut.y); + vec3 span = maxs-mins; + vec3 color = (vec3( + texture2D(R, texCoord).r, + texture2D(G, texCoord).r, + texture2D(B, texCoord).r + )-mins) /span; + + gl_FragColor = vec4(color, 1.0); + }`, + framebuffer: regl.prop('target'), + attributes: { + pos: [0, 0, 1, 0, 1, 1, 0, 1], + }, + uniforms: { + rot: regl.prop('rotation'), + tile: regl.prop('tile'), + view: regl.prop('view'), + R: regl.prop('R'), + G: regl.prop('G'), + B: regl.prop('B'), + Rgamut: regl.prop('Rgamut'), + Ggamut: regl.prop('Ggamut'), + Bgamut: regl.prop('Bgamut'), + }, + depth: { + enable: false, + }, + count: 4, + // viewport: regl.prop("viewport"), + primitive: 'triangle fan', + // ... more! + }); + + return ( + item: VoxelTile, + settings: VoxelSliceRenderSettings, + channels: Record + ) => { + const { view, viewport, gamut, target, rotation } = settings; + const { realBounds } = item; + const { R, G, B } = channels; + + if (!isTexture(R) || !isTexture(G) || !isTexture(B)) { + console.log('missing data: ', R, G, B); + return; + } + + cmd({ + target, + rotation, + view: [...view.minCorner, ...view.maxCorner], + tile: [...realBounds.minCorner, ...realBounds.maxCorner], + R: R.data, + G: G.data, + B: B.data, + Rgamut: [gamut.R.gamut.min, gamut.R.gamut.max], + Ggamut: [gamut.G.gamut.min, gamut.G.gamut.max], + Bgamut: [gamut.B.gamut.min, gamut.B.gamut.max], + }); + }; +} +type Bfr = { type: 'texture2D'; data: REGL.Texture2D }; + +type Tile = { bounds: box2D }; +export type VoxelSliceRenderSettings = { + regl: REGL.Regl; + dataset: ZarrDataset; + view: box2D; + rotation: number; + gamut: Record<'R' | 'G' | 'B', { gamut: Interval; index: number }>; + viewport: REGL.BoundingBox; + target: REGL.Framebuffer2D | null; +}; +export type AxisAlignedPlane = 'xy' | 'yz' | 'xz'; +export type VoxelTile = { + plane: AxisAlignedPlane; + realBounds: box2D; + bounds: box2D; // in voxels, in the plane + planeIndex: number; + layerIndex: number; + // time and channel are always = 0, for now +}; + +function toZarrRequest(tile: VoxelTile, channel: number): ZarrRequest { + const { plane, planeIndex, bounds } = tile; + const { minCorner: min, maxCorner: max } = bounds; + const u = { min: min[0], max: max[0] }; + const v = { min: min[1], max: max[1] }; + switch (plane) { + case 'xy': + return { + x: u, + y: v, + t: 0, + c: channel, + z: planeIndex, + }; + case 'xz': + return { + x: u, + z: v, + t: 0, + c: channel, + y: planeIndex, + }; + case 'yz': + return { + y: u, + z: v, + t: 0, + c: channel, + x: planeIndex, + }; + } +} +export function cacheKeyFactory(col: string, item: VoxelTile, settings: VoxelSliceRenderSettings) { + return `${settings.dataset.url}_${JSON.stringify(omit(item, 'desiredResolution'))}_ch=${ + settings.gamut[col as 'R' | 'G' | 'B'].index + }`; +} + +function reqSlice(dataset: ZarrDataset, req: ZarrRequest, layerIndex: number) { + return getSlicePool().requestSlice(dataset, req, layerIndex); +} +const LUMINANCE = 'luminance'; +export function requestsForTile(tile: VoxelTile, settings: VoxelSliceRenderSettings, signal?: AbortSignal) { + const { dataset, regl } = settings; + const handleResponse = (vxl: Awaited>) => { + const { shape, data } = vxl; + const r = regl.texture({ + data, + width: shape[1], + height: shape[0], // TODO this swap is sus + format: LUMINANCE, + }); + return r; + }; + // lets hope the browser caches our 3x repeat calls to teh same data... + return { + R: async () => { + const vxl = await reqSlice(dataset, toZarrRequest(tile, settings.gamut.R.index), tile.layerIndex); + return { type: 'texture2D', data: handleResponse(vxl) }; + }, + G: async () => { + const vxl = await reqSlice(dataset, toZarrRequest(tile, settings.gamut.G.index), tile.layerIndex); + return { type: 'texture2D', data: handleResponse(vxl) }; + }, + B: async () => { + const vxl = await reqSlice(dataset, toZarrRequest(tile, settings.gamut.B.index), tile.layerIndex); + return { type: 'texture2D', data: handleResponse(vxl) }; + }, + }; +} + +function getAllTiles(idealTilePx: vec2, layerSize: vec2) { + // return the set of all our "tiles" of this layer, given the tilePx size + const tiles: box2D[] = []; + for (let x = 0; x < layerSize[0]; x += idealTilePx[0]) { + for (let y = 0; y < layerSize[1]; y += idealTilePx[1]) { + const xy: vec2 = [x, y]; + tiles.push(Box2D.create(xy, Vec2.min(Vec2.add(xy, idealTilePx), layerSize))); + } + } + return tiles; +} +const uvTable = { + xy: { u: 'x', v: 'y' }, + xz: { u: 'x', v: 'z' }, + yz: { u: 'y', v: 'z' }, +} as const; +const sliceDimension = { + xy: 'z', + xz: 'y', + yz: 'x', +} as const; + +export function getVisibleTiles( + camera: Camera, + plane: AxisAlignedPlane, + planeIndex: number, + dataset: ZarrDataset, + offset?: vec2 +): { layer: number; view: box2D; tiles: VoxelTile[] } { + // const { axes, datasets } = dataset.multiscales[0]; + // const zIndex = indexOfDimension(axes, sliceDimension[plane]); + const sliceSize = sizeInUnits(uvTable[plane], dataset.multiscales[0].axes, dataset.multiscales[0].datasets[0])!; + const layer = pickBestScale(dataset, uvTable[plane], camera.view, camera.screen); + // TODO: open the array, look at its chunks, use that size for the size of the tiles I request! + const layerIndex = dataset.multiscales[0].datasets.indexOf(layer); + + const size = planeSizeInVoxels(uvTable[plane], dataset.multiscales[0].axes, layer); + const realSize = sizeInUnits(uvTable[plane], dataset.multiscales[0].axes, layer); + if (!size || !realSize) return { layer: layerIndex, view: Box2D.create([0, 0], [1, 1]), tiles: [] }; + const scale = Vec2.div(realSize, size); + // to go from a voxel-box to a real-box (easier than you think, as both have an origin at 0,0, because we only support scale...) + const vxlToReal = (vxl: box2D) => Box2D.translate(Box2D.scale(vxl, scale), offset ?? [0, 0]); + // const realToVxl = (real: box2D) => Box2D.scale(real, Vec2.div(size, realSize)); + + // find the tiles, in voxels, to request... + const allTiles = getAllTiles([256, 256], size); + const inView = allTiles.filter((tile) => !!Box2D.intersection(camera.view, vxlToReal(tile))); + // camera.view is in a made up dataspace, where 1=height of the current dataset + // thus, we have to convert it into a voxel-space camera for intersections + // const voxelView = realToVxl(camera.view); + return { + layer: layerIndex, + view: camera.view, + tiles: inView.map((uv) => ({ + plane, + realBounds: vxlToReal(uv), + bounds: uv, + planeIndex, + layerIndex, + })), + }; +} diff --git a/apps/omezarr-viewer/src/versa.ts b/apps/omezarr-viewer/src/versa.ts index 6fdb8a1..8ee3d61 100644 --- a/apps/omezarr-viewer/src/versa.ts +++ b/apps/omezarr-viewer/src/versa.ts @@ -1,537 +1,554 @@ -// I am the scatterplot demo // -import { ImGui, ImGui_Impl } from "@zhobo63/imgui-ts"; -import REGL from "regl"; -import { - type ZarrDataset, - explain, - getSlice, - indexOfDimension, - load, - pickBestScale, - sizeInUnits, - planeSizeInVoxels, -} from "Common/loaders/ome-zarr/zarr-data"; -import { AsyncDataCache, type FrameLifecycle, beginLongRunningFrame } from "@alleninstitute/vis-scatterbrain"; -import { - type AxisAlignedPlane, - type VoxelSliceRenderSettings, - type VoxelTile, - buildVersaRenderer, - cacheKeyFactory, - getVisibleTiles, - requestsForTile, -} from "./versa-renderer"; -import { Box2D, type Interval, Vec2, type box2D, type vec2 } from "@alleninstitute/vis-geometry"; -import type { Camera } from "./camera"; -import { buildImageRenderer } from "./image-renderer"; -import { ImVec2, ImVec4 } from "@zhobo63/imgui-ts/src/imgui"; -import { colorMapWidget } from "./components/color-map"; -import { initDrawableInterface } from "./annotation/path"; - -const versa = "https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/scratch/0500408166/"; -const b = "https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/ome_zarr/20231207.1/1282139033/"; -const scott = "https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/ome_zarr/20231204/1197986710/"; -const file = scott; -type Channel = "R" | "G" | "B"; // we can support 3 visual channels at once -type ChannelColorSettings = { - gamut: Interval; - index: number; -}; -const THUMB_SIZE = 128; -class VersaDemo { - mouse: "up" | "down"; - mousePos: vec2; - camera: Camera; - channels: Record; - plane: AxisAlignedPlane; - sliceIndex: number; - canvas: HTMLCanvasElement; - curFrame: FrameLifecycle | null; - rotation: number; - cache: AsyncDataCache; - regl: REGL.Regl; - dataset: ZarrDataset; - screenRenderer: ReturnType; - renderer: ReturnType; - screenBuffer: { bounds: box2D; fbo: REGL.Framebuffer2D }; - datasets: string[]; - sliceThumbs: REGL.Framebuffer2D[]; - thumbWidth = 64; - constructor( - canvas: HTMLCanvasElement, - dataset: ZarrDataset, - regl: REGL.Regl, - cache: AsyncDataCache, - urls: string[] - ) { - const [w, h] = [canvas.clientWidth, canvas.clientHeight]; - this.datasets = urls; - const baseSize = sizeInUnits({ u: 'x', v: 'y' }, dataset.multiscales[0].axes, dataset.multiscales[0].datasets[0]) ?? [10, 10] - this.camera = { - view: Box2D.create([0, 0], [(baseSize[1] * w) / h, baseSize[1]]), - screen: [w, h], - }; - this.screenBuffer = { bounds: this.camera.view, fbo: regl.framebuffer(w, h) }; - this.dataset = dataset; - this.regl = regl; - this.sliceIndex = 0; - this.plane = "xy"; - this.mouse = "up"; - this.cache = cache; - - this.mousePos = [0, 0]; - this.channels = { - R: { - gamut: { min: 0, max: 0.21 }, - index: 0, - }, - G: { - gamut: { min: 0, max: 0.21 }, - index: 1, - }, - B: { - gamut: { min: 0, max: 0.21 }, - index: 2, - }, - }; - this.canvas = canvas; - this.curFrame = null; - this.rotation = 0; - this.renderer = buildVersaRenderer(regl); - this.screenRenderer = buildImageRenderer(regl); - const loop = () => { - this.refreshScreen(); - window.requestAnimationFrame(loop); - }; - window.requestAnimationFrame(loop); - this.sliceThumbs = []; - this.initThumbnails(); - } - setupEventHandlers() { - const canvas = this.canvas; - - // initDrawableInterface(canvas, { - - // }) - } - async initThumbnails() { - // TODO cleanupThumbnails(); - const sliceSize = sizeInUnits( - { - u: "x", - v: "y", - }, - this.dataset.multiscales[0].axes, - this.dataset.multiscales[0].datasets[0] - )!; - - const smallestLayer = pickBestScale( - this.dataset, - { - u: "x", - v: "y", - }, - Box2D.create([0, 0], sliceSize), - [1, 1] - ); - const smallestLayerIndex = this.dataset.multiscales[0].datasets.indexOf(smallestLayer); - // how many slices are there? - const indexOfZ = indexOfDimension(this.dataset.multiscales[0].axes, "z"); - if (indexOfZ < 0) return; - // get the size, in real units - const sizeInMM = sizeInUnits({ u: "x", v: "y" }, this.dataset.multiscales[0].axes, smallestLayer)!; - // get the aspect ratio, widen the thumbslices... - const r = sizeInMM[0] / sizeInMM[1]; - this.thumbWidth = THUMB_SIZE * r; - const getSliceTextures = async (z: number) => { - const req = { - c: 0, - t: 0, - x: null, - y: null, - z, - }; - return Promise.all([ - getSlice(this.dataset, { ...req, c: 0 }, smallestLayerIndex), - getSlice(this.dataset, { ...req, c: 1 }, smallestLayerIndex), - getSlice(this.dataset, { ...req, c: 2 }, smallestLayerIndex), - ] as const); - }; - const numSlices = smallestLayer.shape[indexOfZ]; - const unitBox = Box2D.create([0, 0], [1, 1]); - for (let z = 0; z < numSlices; z++) { - const buffers = await getSliceTextures(z); - const [R, G, B] = buffers.map((bfr) => - this.regl.texture({ - width: bfr.shape[1], - height: bfr.shape[0], - data: bfr.buffer.flatten(), - format: "luminance", - }) - ); - - const thumb = this.regl.framebuffer(THUMB_SIZE, THUMB_SIZE); - // now render that to a much smaller texture... - this.renderer( - { plane: "xy", bounds: unitBox, layerIndex: smallestLayerIndex, planeIndex: z }, - { - dataset: this.dataset, - gamut: this.channels, - regl: this.regl, - target: thumb, - view: unitBox, - viewport: { x: 0, y: 0, width: THUMB_SIZE, height: THUMB_SIZE }, - }, - { R, G, B } - ); - this.sliceThumbs.push(thumb); - R.destroy(); - G.destroy(); - B.destroy(); - } - } - private upsideDown(v: box2D) { - const { minCorner, maxCorner } = v; - return Box2D.create([minCorner[0], maxCorner[1]], [maxCorner[0], minCorner[1]]); - } - private renderFrame() { - const { camera, plane, sliceIndex, dataset, cache, regl, channels, renderer } = this; - const { layer, view, tiles } = getVisibleTiles(camera, plane, sliceIndex, dataset); - // erase our buffer that holds the render'd dataset image - which lets the UI - // re-render itself independantly - regl.clear({ color: [0, 0, 0, 0], depth: 1, framebuffer: this.screenBuffer.fbo }); - - // get the lowest-resolution view of the current slice - the idea being that we keep - // it cached, and always draw it UNDER the actual layer we want to see, based on our zoom. - // this prevents a flickering black frame when we zoom in to a new, higher resolution layer - const { - layer: baseLayer, - view: baseView, - tiles: baseTiles, - } = getVisibleTiles({ ...camera, screen: [1, 1] }, plane, sliceIndex, dataset); - if (layer === baseLayer) { - this.curFrame = this.renderFrameHelper(baseView, baseTiles); - // if the layer we WANT is actually the lowest res layer, then we're done here and now! - return; - } - const baseSettings = { - view: baseView, - dataset, - regl, - target: this.screenBuffer.fbo, - viewport: { - x: 0, - y: 0, - width: this.canvas.clientWidth, - height: this.canvas.clientHeight, - }, - gamut: channels, - }; - - const cached = baseTiles.reduce( - (count, cur) => (cache.isCached(cacheKeyFactory("R", cur, baseSettings)) ? 1 + count : count), - 0 - ); - if (cached === 0) { - this.curFrame = this.renderFrameHelper(view, tiles); - return; - } - const frame = beginLongRunningFrame( - 3, - 33, - baseTiles, - cache, - baseSettings, - requestsForTile, - renderer, - (event) => { - switch (event.status) { - case "error": - throw event.error; // error boundary might catch this - case "progress": - break; - case "finished_synchronously": - case "finished": - console.log("finished base-layer... start real frame!"); - this.curFrame = this.renderFrameHelper(view, tiles); - break; - case "begun": - break; - case "cancelled": - this.curFrame = this.renderFrameHelper(view, tiles); - break; - default: - } - }, - cacheKeyFactory - ); - frame.cancelFrame(); - } - // not my fav thing to do - but renderFrame and renderFrame helper are tightly linked - // to accomplish our smoke&mirrors to avoid flickering as tiles load in - - // the both make assumptions about state, and the contents of buffers. do not - // call either of them! - private renderFrameHelper(view: box2D, visibleTiles: VoxelTile[]) { - const { camera, dataset, cache, regl, channels, renderer } = this; - this.screenBuffer.bounds = camera.view; - regl._refresh(); - const gamut = { - R: channels.R.gamut, - G: channels.G.gamut, - B: channels.B.gamut, - }; - const frame = beginLongRunningFrame( - 3, - 33, - visibleTiles, - cache, - { - view: view, - dataset, - regl, - target: this.screenBuffer.fbo, - viewport: { - x: 0, - y: 0, - width: this.canvas.clientWidth, - height: this.canvas.clientHeight, - }, - gamut: channels, - }, - requestsForTile, - renderer, - (event) => { - switch (event.status) { - case "error": - throw event.error; // error boundary might catch this - case "progress": - this.refreshScreen(); - break; - case "finished_synchronously": - case "finished": - this.curFrame = null; - this.refreshScreen(); - break; - case "begun": - this.refreshScreen(); - break; - case "cancelled": - break; - default: - } - }, - cacheKeyFactory - ); - return frame; - } - refreshScreen() { - const now = performance.now(); - this.regl._refresh(); - this.regl.clear({ depth: 1, color: [0, 0, 0, 1], framebuffer: null }); - - this.screenRenderer([ - { - box: Box2D.toFlatArray(this.screenBuffer.bounds), - img: this.screenBuffer.fbo, - target: null, - view: Box2D.toFlatArray(this.upsideDown(this.camera.view)), - }, - ]); - - this.drawUI(now); - - this.regl._refresh(); - } - - drawUI(time: number) { - let drawAgain = false; - const effects: Array<() => void> = []; - // imgui wants mutable access to stuff... which is pretty weird - imAccess is nice, but all the vector-style updaters are nasty - try { - this.regl._gl.bindFramebuffer(this.regl._gl.FRAMEBUFFER, null); - ImGui_Impl.NewFrame(time); - ImGui.NewFrame(); - ImGui.Begin("Settings"); - - // TODO: count the available channels that we could use for color! - Object.entries(this.channels).forEach(([channel, settings]) => { - const result = colorMapWidget( - channel, - { - gamut: settings.gamut, - color: new ImGui.Vec4(channel === "R" ? 255 : 0, channel === "G" ? 255 : 0, channel === "B" ? 255 : 0, 255), - useMe: true, - index: settings.index, - }, - 3 - ); - if (result.changed) { - this.channels[channel as Channel].gamut = result.gamut; - this.channels[channel as Channel].index = result.index; - drawAgain = true; - } - }); - const highlight = new ImVec4(0, 0.25, 0.65, 1.0); - const regular = new ImVec4(0.2, 0.2, 0.2, 1.0); - for (const thumb of this.sliceThumbs) { - if ( - // here we dig deep into the guts of a regl-managed texture... not super safe, and regl's types are not really set up for this: - ImGui.ImageButton( - // @ts-expect-error - thumb?.color[0]?._texture?.texture ?? null, - new ImVec2(this.thumbWidth, THUMB_SIZE), - new ImVec2(0, 0), - new ImVec2(1, 1), - // draw a little box around the selected slice: - this.sliceIndex === this.sliceThumbs.indexOf(thumb) ? 3 : 0, - this.sliceIndex === this.sliceThumbs.indexOf(thumb) ? highlight : regular - ) - ) { - drawAgain = true; - effects.push(() => this.setSlice(this.sliceThumbs.indexOf(thumb))); - } - ImGui.SameLine(); - } - ImGui.End(); - ImGui.EndFrame(); - ImGui.Render(); - - ImGui_Impl.RenderDrawData(ImGui.GetDrawData()); - effects.forEach((fx) => fx()); - if (drawAgain) { - window.setTimeout(() => this.rerender(), 5); - } - } catch (err) { - console.warn(err); - } - } - rerender() { - if (this.curFrame !== null) { - this.curFrame.cancelFrame(); - } - this.renderFrame(); - } - mouseButton(click: "up" | "down") { - this.mouse = click; - } - mouseMove(delta: vec2) { - if (this.mouse === "down") { - // drag the view - const { screen, view } = this.camera; - const p = Vec2.div(delta, [this.canvas.clientWidth, this.canvas.clientHeight]); - const c = Vec2.mul(p, Box2D.size(view)); - this.camera = { view: Box2D.translate(view, c), screen }; - this.rerender(); - } - this.mousePos = Vec2.add(this.mousePos, delta); - } - changeSlice(delta: number) { - this.sliceIndex += delta; - this.rerender(); - } - setSlice(sliceIndex: number) { - this.sliceIndex = sliceIndex; - // this.rerender(); - } - // changeGamut(delta: number) { - // this.gamut = { min: this.gamut.min, max: this.gamut.max * delta }; - // this.rerender(); - // } - zoom(scale: number) { - const { view, screen } = this.camera; - const m = Box2D.midpoint(view); - this.camera = { - view: Box2D.translate(Box2D.scale(Box2D.translate(view, Vec2.scale(m, -1)), [scale, scale]), m), - screen, - }; - this.rerender(); - } - nextAxis() { - this.plane = this.plane == "xy" ? "xz" : this.plane === "xz" ? "yz" : "xy"; - this.rerender(); - } - rotateTiles() { - this.rotation += Math.PI / 2; - this.rerender(); - } -} - -function setupEventHandlers(canvas: HTMLCanvasElement, demo: VersaDemo) { - canvas.onmousedown = (e: MouseEvent) => { - if (ImGui.GetIO().WantCaptureMouse) return; - demo.mouseButton("down"); - }; - canvas.onmouseup = (e: MouseEvent) => { - if (ImGui.GetIO().WantCaptureMouse) return; - demo.mouseButton("up"); - }; - canvas.onmousemove = (e: MouseEvent) => { - if (ImGui.GetIO().WantCaptureMouse) return; - // account for gl-origin vs. screen origin: - demo.mouseMove([-e.movementX, -e.movementY]); - }; - canvas.onwheel = (e: WheelEvent) => { - if (ImGui.GetIO().WantCaptureMouse) return; - if (e.ctrlKey) { - demo.nextAxis(); - } else if (e.altKey) { - demo.changeSlice(e.deltaY > 0 ? 1 : -1); - } else { - demo.zoom(e.deltaY > 0 ? 1.1 : 0.9); - } - }; - canvas.onkeydown = (e: KeyboardEvent) => { - if (ImGui.GetIO().WantCaptureKeyboard) return; - - switch (e.key) { - case "a": - demo.nextAxis(); - break; - case "r": - demo.rotateTiles(); - break; - default: - } - }; -} -function setupGui(canvas: HTMLCanvasElement | WebGL2RenderingContext | WebGLRenderingContext) { - ImGui.default().then(() => { - ImGui.CHECKVERSION(); - ImGui.CreateContext(); - const io: ImGui.IO = ImGui.GetIO(); - ImGui.StyleColorsDark(); - io.Fonts.AddFontDefault(); - ImGui_Impl.Init(canvas); - }); -} -async function demotime() { - const thing = document.getElementById("glCanvas") as HTMLCanvasElement; - thing.width = 2000; - thing.height = 2000; - const gl = thing.getContext("webgl2", { - alpha: true, - preserveDrawingBuffer: true, - antialias: true, - premultipliedAlpha: true, - }) as WebGL2RenderingContext; - const regl = REGL({ - gl, - // attributes: {}, - // extensions: ["ANGLE_instanced_arrays", "OES_texture_float", "WEBGL_color_buffer_float"], - }); - const canvas: HTMLCanvasElement = regl._gl.canvas as HTMLCanvasElement; - setupGui(gl); - const voxelSliceCache: AsyncDataCache = new AsyncDataCache((d: REGL.Texture2D) => { - d.destroy() - }, (_d) => 1, 200); - const zarr = await load(file); - explain(zarr); - - const theDemo = new VersaDemo(canvas, zarr, regl, voxelSliceCache, []); - - setupEventHandlers(canvas, theDemo); - theDemo.rerender(); -} - -// since I am just included in a script tag in a raw html document, this is how we start: -demotime(); +// I am the scatterplot demo // +import { ImGui, ImGui_Impl } from '@zhobo63/imgui-ts'; +import REGL from 'regl'; +import { + type ZarrDataset, + explain, + getSlice, + indexOfDimension, + load, + pickBestScale, + sizeInUnits, + planeSizeInVoxels, +} from 'Common/loaders/ome-zarr/zarr-data'; +import { AsyncDataCache, type FrameLifecycle, beginLongRunningFrame } from '@alleninstitute/vis-scatterbrain'; +import { + type AxisAlignedPlane, + type VoxelSliceRenderSettings, + type VoxelTile, + buildVersaRenderer, + cacheKeyFactory, + getVisibleTiles, + requestsForTile, +} from './versa-renderer'; +import { Box2D, type Interval, Vec2, type box2D, type vec2 } from '@alleninstitute/vis-geometry'; +import type { Camera } from './camera'; +import { buildImageRenderer } from './image-renderer'; +import { ImVec2, ImVec4 } from '@zhobo63/imgui-ts/src/imgui'; +import { colorMapWidget } from './components/color-map'; +import { initDrawableInterface } from './annotation/path'; + +const versa = 'https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/scratch/0500408166/'; +const b = 'https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/ome_zarr/20231207.1/1282139033/'; +const scott = 'https://neuroglancer-vis-prototype.s3.amazonaws.com/VERSA/ome_zarr/20231204/1197986710/'; +const file = scott; +type Channel = 'R' | 'G' | 'B'; // we can support 3 visual channels at once +type ChannelColorSettings = { + gamut: Interval; + index: number; +}; +const THUMB_SIZE = 128; +class VersaDemo { + mouse: 'up' | 'down'; + mousePos: vec2; + camera: Camera; + channels: Record; + plane: AxisAlignedPlane; + sliceIndex: number; + canvas: HTMLCanvasElement; + curFrame: FrameLifecycle | null; + rotation: number; + cache: AsyncDataCache; + regl: REGL.Regl; + dataset: ZarrDataset; + screenRenderer: ReturnType; + renderer: ReturnType; + screenBuffer: { bounds: box2D; fbo: REGL.Framebuffer2D }; + datasets: string[]; + sliceThumbs: REGL.Framebuffer2D[]; + thumbWidth = 64; + constructor( + canvas: HTMLCanvasElement, + dataset: ZarrDataset, + regl: REGL.Regl, + cache: AsyncDataCache, + urls: string[] + ) { + const [w, h] = [canvas.clientWidth, canvas.clientHeight]; + this.datasets = urls; + const baseSize = sizeInUnits( + { u: 'x', v: 'y' }, + dataset.multiscales[0].axes, + dataset.multiscales[0].datasets[0] + ) ?? [10, 10]; + this.camera = { + view: Box2D.create([0, 0], [(baseSize[1] * w) / h, baseSize[1]]), + screen: [w, h], + }; + this.screenBuffer = { bounds: this.camera.view, fbo: regl.framebuffer(w, h) }; + this.dataset = dataset; + this.regl = regl; + this.sliceIndex = 0; + this.plane = 'xy'; + this.mouse = 'up'; + this.cache = cache; + + this.mousePos = [0, 0]; + this.channels = { + R: { + gamut: { min: 0, max: 0.21 }, + index: 0, + }, + G: { + gamut: { min: 0, max: 0.21 }, + index: 1, + }, + B: { + gamut: { min: 0, max: 0.21 }, + index: 2, + }, + }; + this.canvas = canvas; + this.curFrame = null; + this.rotation = 0; + this.renderer = buildVersaRenderer(regl); + this.screenRenderer = buildImageRenderer(regl); + const loop = () => { + this.refreshScreen(); + window.requestAnimationFrame(loop); + }; + window.requestAnimationFrame(loop); + this.sliceThumbs = []; + this.initThumbnails(); + } + setupEventHandlers() { + const canvas = this.canvas; + + // initDrawableInterface(canvas, { + + // }) + } + async initThumbnails() { + // TODO cleanupThumbnails(); + const sliceSize = sizeInUnits( + { + u: 'x', + v: 'y', + }, + this.dataset.multiscales[0].axes, + this.dataset.multiscales[0].datasets[0] + )!; + + const smallestLayer = pickBestScale( + this.dataset, + { + u: 'x', + v: 'y', + }, + Box2D.create([0, 0], sliceSize), + [1, 1] + ); + const smallestLayerIndex = this.dataset.multiscales[0].datasets.indexOf(smallestLayer); + // how many slices are there? + const indexOfZ = indexOfDimension(this.dataset.multiscales[0].axes, 'z'); + if (indexOfZ < 0) return; + // get the size, in real units + const sizeInMM = sizeInUnits({ u: 'x', v: 'y' }, this.dataset.multiscales[0].axes, smallestLayer)!; + // get the aspect ratio, widen the thumbslices... + const r = sizeInMM[0] / sizeInMM[1]; + this.thumbWidth = THUMB_SIZE * r; + const getSliceTextures = async (z: number) => { + const req = { + c: 0, + t: 0, + x: null, + y: null, + z, + }; + return Promise.all([ + getSlice(this.dataset, { ...req, c: 0 }, smallestLayerIndex), + getSlice(this.dataset, { ...req, c: 1 }, smallestLayerIndex), + getSlice(this.dataset, { ...req, c: 2 }, smallestLayerIndex), + ] as const); + }; + const numSlices = smallestLayer.shape[indexOfZ]; + const unitBox = Box2D.create([0, 0], [1, 1]); + for (let z = 0; z < numSlices; z++) { + const buffers = await getSliceTextures(z); + const [R, G, B] = buffers.map((bfr) => + this.regl.texture({ + width: bfr.shape[1], + height: bfr.shape[0], + data: bfr.buffer.flatten(), + format: 'luminance', + }) + ); + + const thumb = this.regl.framebuffer(THUMB_SIZE, THUMB_SIZE); + // now render that to a much smaller texture... + this.renderer( + { plane: 'xy', bounds: unitBox, layerIndex: smallestLayerIndex, planeIndex: z }, + { + dataset: this.dataset, + gamut: this.channels, + regl: this.regl, + target: thumb, + view: unitBox, + viewport: { x: 0, y: 0, width: THUMB_SIZE, height: THUMB_SIZE }, + }, + { R, G, B } + ); + this.sliceThumbs.push(thumb); + R.destroy(); + G.destroy(); + B.destroy(); + } + } + private upsideDown(v: box2D) { + const { minCorner, maxCorner } = v; + return Box2D.create([minCorner[0], maxCorner[1]], [maxCorner[0], minCorner[1]]); + } + private renderFrame() { + const { camera, plane, sliceIndex, dataset, cache, regl, channels, renderer } = this; + const { layer, view, tiles } = getVisibleTiles(camera, plane, sliceIndex, dataset); + // erase our buffer that holds the render'd dataset image - which lets the UI + // re-render itself independantly + regl.clear({ color: [0, 0, 0, 0], depth: 1, framebuffer: this.screenBuffer.fbo }); + + // get the lowest-resolution view of the current slice - the idea being that we keep + // it cached, and always draw it UNDER the actual layer we want to see, based on our zoom. + // this prevents a flickering black frame when we zoom in to a new, higher resolution layer + const { + layer: baseLayer, + view: baseView, + tiles: baseTiles, + } = getVisibleTiles({ ...camera, screen: [1, 1] }, plane, sliceIndex, dataset); + if (layer === baseLayer) { + this.curFrame = this.renderFrameHelper(baseView, baseTiles); + // if the layer we WANT is actually the lowest res layer, then we're done here and now! + return; + } + const baseSettings = { + view: baseView, + dataset, + regl, + target: this.screenBuffer.fbo, + viewport: { + x: 0, + y: 0, + width: this.canvas.clientWidth, + height: this.canvas.clientHeight, + }, + gamut: channels, + }; + + const cached = baseTiles.reduce( + (count, cur) => (cache.isCached(cacheKeyFactory('R', cur, baseSettings)) ? 1 + count : count), + 0 + ); + if (cached === 0) { + this.curFrame = this.renderFrameHelper(view, tiles); + return; + } + const frame = beginLongRunningFrame( + 3, + 33, + baseTiles, + cache, + baseSettings, + requestsForTile, + renderer, + (event) => { + switch (event.status) { + case 'error': + throw event.error; // error boundary might catch this + case 'progress': + break; + case 'finished_synchronously': + case 'finished': + console.log('finished base-layer... start real frame!'); + this.curFrame = this.renderFrameHelper(view, tiles); + break; + case 'begun': + break; + case 'cancelled': + this.curFrame = this.renderFrameHelper(view, tiles); + break; + default: + } + }, + cacheKeyFactory + ); + frame.cancelFrame(); + } + // not my fav thing to do - but renderFrame and renderFrame helper are tightly linked + // to accomplish our smoke&mirrors to avoid flickering as tiles load in - + // the both make assumptions about state, and the contents of buffers. do not + // call either of them! + private renderFrameHelper(view: box2D, visibleTiles: VoxelTile[]) { + const { camera, dataset, cache, regl, channels, renderer } = this; + this.screenBuffer.bounds = camera.view; + regl._refresh(); + const gamut = { + R: channels.R.gamut, + G: channels.G.gamut, + B: channels.B.gamut, + }; + const frame = beginLongRunningFrame( + 3, + 33, + visibleTiles, + cache, + { + view: view, + dataset, + regl, + target: this.screenBuffer.fbo, + viewport: { + x: 0, + y: 0, + width: this.canvas.clientWidth, + height: this.canvas.clientHeight, + }, + gamut: channels, + }, + requestsForTile, + renderer, + (event) => { + switch (event.status) { + case 'error': + throw event.error; // error boundary might catch this + case 'progress': + this.refreshScreen(); + break; + case 'finished_synchronously': + case 'finished': + this.curFrame = null; + this.refreshScreen(); + break; + case 'begun': + this.refreshScreen(); + break; + case 'cancelled': + break; + default: + } + }, + cacheKeyFactory + ); + return frame; + } + refreshScreen() { + const now = performance.now(); + this.regl._refresh(); + this.regl.clear({ depth: 1, color: [0, 0, 0, 1], framebuffer: null }); + + this.screenRenderer([ + { + box: Box2D.toFlatArray(this.screenBuffer.bounds), + img: this.screenBuffer.fbo, + target: null, + view: Box2D.toFlatArray(this.upsideDown(this.camera.view)), + }, + ]); + + this.drawUI(now); + + this.regl._refresh(); + } + + drawUI(time: number) { + let drawAgain = false; + const effects: Array<() => void> = []; + // imgui wants mutable access to stuff... which is pretty weird - imAccess is nice, but all the vector-style updaters are nasty + try { + this.regl._gl.bindFramebuffer(this.regl._gl.FRAMEBUFFER, null); + ImGui_Impl.NewFrame(time); + ImGui.NewFrame(); + ImGui.Begin('Settings'); + + // TODO: count the available channels that we could use for color! + Object.entries(this.channels).forEach(([channel, settings]) => { + const result = colorMapWidget( + channel, + { + gamut: settings.gamut, + color: new ImGui.Vec4( + channel === 'R' ? 255 : 0, + channel === 'G' ? 255 : 0, + channel === 'B' ? 255 : 0, + 255 + ), + useMe: true, + index: settings.index, + }, + 3 + ); + if (result.changed) { + this.channels[channel as Channel].gamut = result.gamut; + this.channels[channel as Channel].index = result.index; + drawAgain = true; + } + }); + const highlight = new ImVec4(0, 0.25, 0.65, 1.0); + const regular = new ImVec4(0.2, 0.2, 0.2, 1.0); + for (const thumb of this.sliceThumbs) { + if ( + // here we dig deep into the guts of a regl-managed texture... not super safe, and regl's types are not really set up for this: + ImGui.ImageButton( + // @ts-expect-error + thumb?.color[0]?._texture?.texture ?? null, + new ImVec2(this.thumbWidth, THUMB_SIZE), + new ImVec2(0, 0), + new ImVec2(1, 1), + // draw a little box around the selected slice: + this.sliceIndex === this.sliceThumbs.indexOf(thumb) ? 3 : 0, + this.sliceIndex === this.sliceThumbs.indexOf(thumb) ? highlight : regular + ) + ) { + drawAgain = true; + effects.push(() => this.setSlice(this.sliceThumbs.indexOf(thumb))); + } + ImGui.SameLine(); + } + ImGui.End(); + ImGui.EndFrame(); + ImGui.Render(); + + ImGui_Impl.RenderDrawData(ImGui.GetDrawData()); + effects.forEach((fx) => fx()); + if (drawAgain) { + window.setTimeout(() => this.rerender(), 5); + } + } catch (err) { + console.warn(err); + } + } + rerender() { + if (this.curFrame !== null) { + this.curFrame.cancelFrame(); + } + this.renderFrame(); + } + mouseButton(click: 'up' | 'down') { + this.mouse = click; + } + mouseMove(delta: vec2) { + if (this.mouse === 'down') { + // drag the view + const { screen, view } = this.camera; + const p = Vec2.div(delta, [this.canvas.clientWidth, this.canvas.clientHeight]); + const c = Vec2.mul(p, Box2D.size(view)); + this.camera = { view: Box2D.translate(view, c), screen }; + this.rerender(); + } + this.mousePos = Vec2.add(this.mousePos, delta); + } + changeSlice(delta: number) { + this.sliceIndex += delta; + this.rerender(); + } + setSlice(sliceIndex: number) { + this.sliceIndex = sliceIndex; + // this.rerender(); + } + // changeGamut(delta: number) { + // this.gamut = { min: this.gamut.min, max: this.gamut.max * delta }; + // this.rerender(); + // } + zoom(scale: number) { + const { view, screen } = this.camera; + const m = Box2D.midpoint(view); + this.camera = { + view: Box2D.translate(Box2D.scale(Box2D.translate(view, Vec2.scale(m, -1)), [scale, scale]), m), + screen, + }; + this.rerender(); + } + nextAxis() { + this.plane = this.plane == 'xy' ? 'xz' : this.plane === 'xz' ? 'yz' : 'xy'; + this.rerender(); + } + rotateTiles() { + this.rotation += Math.PI / 2; + this.rerender(); + } +} + +function setupEventHandlers(canvas: HTMLCanvasElement, demo: VersaDemo) { + canvas.onmousedown = (e: MouseEvent) => { + if (ImGui.GetIO().WantCaptureMouse) return; + demo.mouseButton('down'); + }; + canvas.onmouseup = (e: MouseEvent) => { + if (ImGui.GetIO().WantCaptureMouse) return; + demo.mouseButton('up'); + }; + canvas.onmousemove = (e: MouseEvent) => { + if (ImGui.GetIO().WantCaptureMouse) return; + // account for gl-origin vs. screen origin: + demo.mouseMove([-e.movementX, -e.movementY]); + }; + canvas.onwheel = (e: WheelEvent) => { + if (ImGui.GetIO().WantCaptureMouse) return; + if (e.ctrlKey) { + demo.nextAxis(); + } else if (e.altKey) { + demo.changeSlice(e.deltaY > 0 ? 1 : -1); + } else { + demo.zoom(e.deltaY > 0 ? 1.1 : 0.9); + } + }; + canvas.onkeydown = (e: KeyboardEvent) => { + if (ImGui.GetIO().WantCaptureKeyboard) return; + + switch (e.key) { + case 'a': + demo.nextAxis(); + break; + case 'r': + demo.rotateTiles(); + break; + default: + } + }; +} +function setupGui(canvas: HTMLCanvasElement | WebGL2RenderingContext | WebGLRenderingContext) { + ImGui.default().then(() => { + ImGui.CHECKVERSION(); + ImGui.CreateContext(); + const io: ImGui.IO = ImGui.GetIO(); + ImGui.StyleColorsDark(); + io.Fonts.AddFontDefault(); + ImGui_Impl.Init(canvas); + }); +} +async function demotime() { + const thing = document.getElementById('glCanvas') as HTMLCanvasElement; + thing.width = 2000; + thing.height = 2000; + const gl = thing.getContext('webgl2', { + alpha: true, + preserveDrawingBuffer: true, + antialias: true, + premultipliedAlpha: true, + }) as WebGL2RenderingContext; + const regl = REGL({ + gl, + // attributes: {}, + // extensions: ["ANGLE_instanced_arrays", "OES_texture_float", "WEBGL_color_buffer_float"], + }); + const canvas: HTMLCanvasElement = regl._gl.canvas as HTMLCanvasElement; + setupGui(gl); + const voxelSliceCache: AsyncDataCache = new AsyncDataCache< + string, + string, + REGL.Texture2D + >( + (d: REGL.Texture2D) => { + d.destroy(); + }, + (_d) => 1, + 200 + ); + const zarr = await load(file); + explain(zarr); + + const theDemo = new VersaDemo(canvas, zarr, regl, voxelSliceCache, []); + + setupEventHandlers(canvas, theDemo); + theDemo.rerender(); +} + +// since I am just included in a script tag in a raw html document, this is how we start: +demotime(); diff --git a/apps/omezarr-viewer/tsconfig.json b/apps/omezarr-viewer/tsconfig.json index c0cb85c..0f20604 100644 --- a/apps/omezarr-viewer/tsconfig.json +++ b/apps/omezarr-viewer/tsconfig.json @@ -1,4 +1,4 @@ -{ - "extends": "../tsconfig.json", - "include": ["./src/**/*", "../common/src/**/*"], -} \ No newline at end of file +{ + "extends": "../tsconfig.json", + "include": ["./src/**/*", "../common/src/**/*"] +} diff --git a/apps/scatterplot/README.md b/apps/scatterplot/README.md index df54149..026795a 100644 --- a/apps/scatterplot/README.md +++ b/apps/scatterplot/README.md @@ -1,13 +1,15 @@ ## Scatterplot demo -A demo of rendering a scatterplot using beginLongRunningFrame. The points in the scatterplot are spatially indexed using a quad-tree. The way the quad-tree is organized is based on [link](https://github.com/potree/potree). +A demo of rendering a scatterplot using beginLongRunningFrame. The points in the scatterplot are spatially indexed using a quad-tree. The way the quad-tree is organized is based on [link](https://github.com/potree/potree). specifically, rather than the usual situation in which a parent node in the tree contains a low-resolution replacement for its children's data, all data in all layers of the tree should be considered to be additive; rendering all points in every node of the whole tree at every level would display the original ground truth data. Much like the ome-zarr demo, we can use a few simple tools to allow us to request only the nodes which are currently in view (and take up enough pixels to be worth rendering), and render them as they arrive using the concept of a long-running frame. ### How to build / run + 1. `pnpm build` from the root directory of this project 2. `pnpm install` in this directory 3. `pnpm run demo` in this directory - this will produce `dst/demo.html` 4. navigate to `dev/demo.html` and open it in your browser - its simply a static html page with a single js script import ### The Code - -- under construction come back later -- \ No newline at end of file + +-- under construction come back later -- diff --git a/apps/scatterplot/package.json b/apps/scatterplot/package.json index 22f0124..13cebb6 100644 --- a/apps/scatterplot/package.json +++ b/apps/scatterplot/package.json @@ -1,48 +1,48 @@ { - "name": "@alleninstitute/vis-scatterplot-demo", - "version": "0.0.1", - "contributors": [ - { - "name": "Lane Sawyer", - "email": "lane.sawyer@alleninstitute.org" + "name": "@alleninstitute/vis-scatterplot-demo", + "version": "0.0.1", + "contributors": [ + { + "name": "Lane Sawyer", + "email": "lane.sawyer@alleninstitute.org" + }, + { + "name": "James Gerstenberger", + "email": "james.gerstenberger@alleninstitute.org" + }, + { + "name": "Noah Shepard", + "email": "noah.shepard@alleninstitute.org" + }, + { + "name": "Skyler Moosman", + "email": "skyler.moosman@alleninstitute.org" + }, + { + "name": "Su Li", + "email": "su.li@alleninstitute.org" + } + ], + "license": "TBD", + "type": "module", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "private": true, + "scripts": { + "preinstall": "npx only-allow pnpm", + "demo": "esbuild src/demo.ts --bundle --outfile=dst/demo.js && cp public/* dst/", + "typecheck": "tsc --noEmit" }, - { - "name": "James Gerstenberger", - "email": "james.gerstenberger@alleninstitute.org" + "devDependencies": { + "esbuild": "^0.19.12", + "typescript": "^5.3.3" }, - { - "name": "Noah Shepard", - "email": "noah.shepard@alleninstitute.org" - }, - { - "name": "Skyler Moosman", - "email": "skyler.moosman@alleninstitute.org" - }, - { - "name": "Su Li", - "email": "su.li@alleninstitute.org" + "dependencies": { + "@alleninstitute/vis-geometry": "workspace:*", + "@alleninstitute/vis-scatterbrain": "workspace:*", + "@types/lodash": "^4.14.202", + "@zhobo63/imgui-ts": "^0.1.43", + "lodash": "^4.17.21", + "regl": "^2.1.0" } - ], - "license": "TBD", - "type": "module", - "main": "lib/index.js", - "types": "lib/index.d.ts", - "private": true, - "scripts": { - "preinstall": "npx only-allow pnpm", - "demo": "esbuild src/demo.ts --bundle --outfile=dst/demo.js && cp public/* dst/", - "typecheck": "tsc --noEmit" - }, - "devDependencies": { - "esbuild": "^0.19.12", - "typescript": "^5.3.3" - }, - "dependencies": { - "@alleninstitute/vis-geometry": "workspace:*", - "@alleninstitute/vis-scatterbrain": "workspace:*", - "@types/lodash": "^4.14.202", - "@zhobo63/imgui-ts": "^0.1.43", - "lodash": "^4.17.21", - "regl": "^2.1.0" - } -} \ No newline at end of file +} diff --git a/apps/scatterplot/public/demo.html b/apps/scatterplot/public/demo.html index d5f103e..3ef4680 100644 --- a/apps/scatterplot/public/demo.html +++ b/apps/scatterplot/public/demo.html @@ -1,9 +1,10 @@ - - - - - - - - - \ No newline at end of file + + + + + + + diff --git a/apps/scatterplot/src/demo.ts b/apps/scatterplot/src/demo.ts index 0595a3b..f3f2086 100644 --- a/apps/scatterplot/src/demo.ts +++ b/apps/scatterplot/src/demo.ts @@ -1,157 +1,172 @@ -import { Box2D, Vec2, type box2D, type vec2 } from "@alleninstitute/vis-geometry"; -import { beginLongRunningFrame, AsyncDataCache, type FrameLifecycle } from "@alleninstitute/vis-scatterbrain"; -import { getVisibleItems, type Dataset, type RenderSettings, fetchItem } from 'Common/loaders/scatterplot/data' -import { loadDataset, loadScatterbrainJson, type ColumnarMetadata, type ColumnarTree, type ColumnBuffer } from "Common/loaders/scatterplot/scatterbrain-loader"; -import REGL from "regl"; - -import { buildRenderer } from "./renderer"; -const better = 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_tenx_01172024_stage-20240128193624/488I12FURRB8ZY5KJ8T/ScatterBrain.json'; -const busted = 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_tenx_01172024_stage-20240128193624/G4I4GFJXJB9ATZ3PTX1/ScatterBrain.json'; -const KB = 1000; -const MB = 1000 * KB; -class Demo { - camera: { - view: box2D; - screen: vec2; - } - dataset: Dataset | undefined; - regl: REGL.Regl; - canvas: HTMLCanvasElement; - renderer: ReturnType; - mouse: 'up' | 'down' - mousePos: vec2; - cache: AsyncDataCache; - curFrame: FrameLifecycle | null; - constructor(canvas: HTMLCanvasElement, regl: REGL.Regl, url: string) { - const [w, h] = [canvas.clientWidth, canvas.clientHeight]; - this.camera = { - view: Box2D.create([0, 0], [(10 * w) / h, 10]), - screen: [w, h] - } - this.curFrame = null; - this.cache = new AsyncDataCache((entry) => { - entry.data.destroy(); - }, (_data: ColumnBuffer) => 1, 1000); - - loadScatterbrainJson(url).then((metadata) => { - this.dataset = loadDataset(metadata, url) - this.rerender(); - }) - this.renderer = buildRenderer(regl); - this.canvas = canvas; - this.mouse = 'up' - this.regl = regl; - this.mousePos = [0, 0] - } - mouseButton(click: "up" | "down") { - this.mouse = click; - } - mouseMove(delta: vec2) { - if (this.mouse === "down") { - // drag the view - const { screen, view } = this.camera; - const p = Vec2.div(delta, [this.canvas.clientWidth, this.canvas.clientHeight]); - const c = Vec2.mul(p, Box2D.size(view)); - this.camera = { view: Box2D.translate(view, c), screen }; - this.rerender(); - } - this.mousePos = Vec2.add(this.mousePos, delta); - } - zoom(scale: number) { - const { view, screen } = this.camera; - const m = Box2D.midpoint(view); - this.camera = { - view: Box2D.translate(Box2D.scale(Box2D.translate(view, Vec2.scale(m, -1)), [scale, scale]), m), - screen, - }; - this.rerender(); - } - rerender() { - if (this.curFrame) { - this.curFrame.cancelFrame('whatever') - } - this.regl.clear({ color: [0.25, 0.25, 0.25, 1], depth: 1 }) - if (this.dataset) { - // how big is one px in data-units? - const px = Box2D.size(this.camera.view)[0] / this.camera.screen[0] - // lets only draw a box of points if its 90px wide: - const sizeThreshold = 90 * px; - const items = getVisibleItems(this.dataset, this.camera.view, sizeThreshold); - this.curFrame = beginLongRunningFrame, RenderSettings>( - 5, 33, items, this.cache, { - dataset: this.dataset, - view: this.camera.view, - target: null, - colorBy: { - name: '88', - type: 'QUANTITATIVE', - }, - pointSize: 3, - regl: this.regl - }, - fetchItem, - this.renderer, - (event) => { - switch (event.status) { - case "error": - throw event.error; // error boundary might catch this - case "progress": - break; - case "finished_synchronously": - case "finished": - this.curFrame = null; - break; - case "begun": - break; - case "cancelled": - break; - default: - break; - } - }, - (reqKey, item, settings) => `${reqKey}:${item.content.name}`) - } - } -} -let theDemo: Demo; - -function demoTime() { - const thing = document.getElementById("glCanvas") as HTMLCanvasElement; - thing.width = thing.clientWidth; - thing.height = thing.clientHeight; - const gl = thing.getContext("webgl", { - alpha: true, - preserveDrawingBuffer: true, - antialias: true, - premultipliedAlpha: true, - }) as WebGL2RenderingContext; - const regl = REGL({ - gl, - // attributes: {}, - extensions: ["ANGLE_instanced_arrays", "OES_texture_float", "WEBGL_color_buffer_float"], - }); - const canvas: HTMLCanvasElement = regl._gl.canvas as HTMLCanvasElement; - theDemo = new Demo(canvas, regl, better); - - setupEventHandlers(canvas, theDemo); -} - - -function setupEventHandlers(canvas: HTMLCanvasElement, demo: Demo) { - canvas.onmousedown = (e: MouseEvent) => { - demo.mouseButton("down"); - }; - canvas.onmouseup = (e: MouseEvent) => { - demo.mouseButton("up"); - }; - canvas.onmousemove = (e: MouseEvent) => { - // account for gl-origin vs. screen origin: - demo.mouseMove([-e.movementX, e.movementY]); - }; - canvas.onwheel = (e: WheelEvent) => { - demo.zoom(e.deltaY > 0 ? 1.1 : 0.9); - }; -} - - -demoTime(); \ No newline at end of file +import { Box2D, Vec2, type box2D, type vec2 } from '@alleninstitute/vis-geometry'; +import { beginLongRunningFrame, AsyncDataCache, type FrameLifecycle } from '@alleninstitute/vis-scatterbrain'; +import { getVisibleItems, type Dataset, type RenderSettings, fetchItem } from 'Common/loaders/scatterplot/data'; +import { + loadDataset, + loadScatterbrainJson, + type ColumnarMetadata, + type ColumnarTree, + type ColumnBuffer, +} from 'Common/loaders/scatterplot/scatterbrain-loader'; +import REGL from 'regl'; + +import { buildRenderer } from './renderer'; +const better = + 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_tenx_01172024_stage-20240128193624/488I12FURRB8ZY5KJ8T/ScatterBrain.json'; +const busted = + 'https://bkp-2d-visualizations-stage.s3.amazonaws.com/wmb_tenx_01172024_stage-20240128193624/G4I4GFJXJB9ATZ3PTX1/ScatterBrain.json'; +const KB = 1000; +const MB = 1000 * KB; +class Demo { + camera: { + view: box2D; + screen: vec2; + }; + dataset: Dataset | undefined; + regl: REGL.Regl; + canvas: HTMLCanvasElement; + renderer: ReturnType; + mouse: 'up' | 'down'; + mousePos: vec2; + cache: AsyncDataCache; + curFrame: FrameLifecycle | null; + constructor(canvas: HTMLCanvasElement, regl: REGL.Regl, url: string) { + const [w, h] = [canvas.clientWidth, canvas.clientHeight]; + this.camera = { + view: Box2D.create([0, 0], [(10 * w) / h, 10]), + screen: [w, h], + }; + this.curFrame = null; + this.cache = new AsyncDataCache( + (entry) => { + entry.data.destroy(); + }, + (_data: ColumnBuffer) => 1, + 1000 + ); + + loadScatterbrainJson(url).then((metadata) => { + this.dataset = loadDataset(metadata, url); + this.rerender(); + }); + this.renderer = buildRenderer(regl); + this.canvas = canvas; + this.mouse = 'up'; + this.regl = regl; + this.mousePos = [0, 0]; + } + mouseButton(click: 'up' | 'down') { + this.mouse = click; + } + mouseMove(delta: vec2) { + if (this.mouse === 'down') { + // drag the view + const { screen, view } = this.camera; + const p = Vec2.div(delta, [this.canvas.clientWidth, this.canvas.clientHeight]); + const c = Vec2.mul(p, Box2D.size(view)); + this.camera = { view: Box2D.translate(view, c), screen }; + this.rerender(); + } + this.mousePos = Vec2.add(this.mousePos, delta); + } + zoom(scale: number) { + const { view, screen } = this.camera; + const m = Box2D.midpoint(view); + this.camera = { + view: Box2D.translate(Box2D.scale(Box2D.translate(view, Vec2.scale(m, -1)), [scale, scale]), m), + screen, + }; + this.rerender(); + } + rerender() { + if (this.curFrame) { + this.curFrame.cancelFrame('whatever'); + } + this.regl.clear({ color: [0.25, 0.25, 0.25, 1], depth: 1 }); + if (this.dataset) { + // how big is one px in data-units? + const px = Box2D.size(this.camera.view)[0] / this.camera.screen[0]; + // lets only draw a box of points if its 90px wide: + const sizeThreshold = 90 * px; + const items = getVisibleItems(this.dataset, this.camera.view, sizeThreshold); + this.curFrame = beginLongRunningFrame, RenderSettings>( + 5, + 33, + items, + this.cache, + { + dataset: this.dataset, + view: this.camera.view, + target: null, + colorBy: { + name: '88', + type: 'QUANTITATIVE', + }, + pointSize: 3, + regl: this.regl, + }, + fetchItem, + this.renderer, + (event) => { + switch (event.status) { + case 'error': + throw event.error; // error boundary might catch this + case 'progress': + break; + case 'finished_synchronously': + case 'finished': + this.curFrame = null; + break; + case 'begun': + break; + case 'cancelled': + break; + default: + break; + } + }, + (reqKey, item, settings) => `${reqKey}:${item.content.name}` + ); + } + } +} +let theDemo: Demo; + +function demoTime() { + const thing = document.getElementById('glCanvas') as HTMLCanvasElement; + thing.width = thing.clientWidth; + thing.height = thing.clientHeight; + const gl = thing.getContext('webgl', { + alpha: true, + preserveDrawingBuffer: true, + antialias: true, + premultipliedAlpha: true, + }) as WebGL2RenderingContext; + const regl = REGL({ + gl, + // attributes: {}, + extensions: ['ANGLE_instanced_arrays', 'OES_texture_float', 'WEBGL_color_buffer_float'], + }); + const canvas: HTMLCanvasElement = regl._gl.canvas as HTMLCanvasElement; + theDemo = new Demo(canvas, regl, better); + + setupEventHandlers(canvas, theDemo); +} + +function setupEventHandlers(canvas: HTMLCanvasElement, demo: Demo) { + canvas.onmousedown = (e: MouseEvent) => { + demo.mouseButton('down'); + }; + canvas.onmouseup = (e: MouseEvent) => { + demo.mouseButton('up'); + }; + canvas.onmousemove = (e: MouseEvent) => { + // account for gl-origin vs. screen origin: + demo.mouseMove([-e.movementX, e.movementY]); + }; + canvas.onwheel = (e: WheelEvent) => { + demo.zoom(e.deltaY > 0 ? 1.1 : 0.9); + }; +} + +demoTime(); diff --git a/apps/scatterplot/src/renderer.ts b/apps/scatterplot/src/renderer.ts index fc5a530..127ac0c 100644 --- a/apps/scatterplot/src/renderer.ts +++ b/apps/scatterplot/src/renderer.ts @@ -1,89 +1,103 @@ -import REGL, { type Framebuffer2D } from "regl"; -import type { ColumnBuffer, ColumnarTree } from "Common/loaders/scatterplot/scatterbrain-loader"; -import type { RenderSettings } from "Common/loaders/scatterplot/data"; -import { Box2D, type box2D, type vec2, type vec4 } from "@alleninstitute/vis-geometry"; - -type Props = { - view: vec4; - itemDepth: number; - count: number; - pointSize: number; - position: Float32Array, - color: Float32Array, - offset?: vec2 | undefined, - target: Framebuffer2D | null; -} -export function buildRenderer(regl: REGL.Regl) { - // build the regl command first - const cmd = regl<{ view: vec4, itemDepth: number, offset: vec2, pointSize: number }, { position: Float32Array, color: Float32Array }, Props>({ - vert: ` - precision highp float; - attribute vec2 position; - attribute float color; - - uniform float pointSize; - uniform vec4 view; - uniform float itemDepth; - uniform vec2 offset; - - varying vec4 clr; - - void main(){ - gl_PointSize=pointSize; - vec2 size = view.zw-view.xy; - vec2 pos = ((position+offset)-view.xy)/size; - vec2 clip = (pos*2.0)-1.0; - - // todo: gradients are cool - clr = vec4(mix(vec3(0.3,0,0),vec3(1,1,1),color/15.0),1.0); - - gl_Position = vec4(clip,0.5-color/20.0,1); - }`, - frag: ` - precision highp float; - varying vec4 clr; - void main(){ - // todo: round points with gl_FragCoord - gl_FragColor = clr; - }`, - attributes: { - color: regl.prop('color'), - position: regl.prop('position'), - }, - uniforms: { - itemDepth: regl.prop("itemDepth"), - view: regl.prop("view"), - offset: regl.prop("offset"), - pointSize: regl.prop("pointSize"), - }, - - blend: { - enable: false, - }, - framebuffer: regl.prop('target'), - count: regl.prop('count'), - primitive: "points", - }) - const renderDots = (item: ColumnarTree & { offset?: vec2 | undefined }, settings: RenderSettings, columns: Record) => { - const { color, position } = columns; - const count = item.content.count; - const itemDepth = item.content.depth - if (color && position && 'type' in color && 'type' in position && color.type === 'vbo' && position.type === 'vbo') { - cmd({ - view: Box2D.toFlatArray(settings.view), - count, - itemDepth, - position: position.data, - pointSize: settings.pointSize, - color: color.data, - offset: item.offset ?? [0, 0], - target: settings.target - }) - } else { - // todo freak out! - throw new Error('omg the internet lied to me') - } - - } - return renderDots; -} +import REGL, { type Framebuffer2D } from 'regl'; +import type { ColumnBuffer, ColumnarTree } from 'Common/loaders/scatterplot/scatterbrain-loader'; +import type { RenderSettings } from 'Common/loaders/scatterplot/data'; +import { Box2D, type box2D, type vec2, type vec4 } from '@alleninstitute/vis-geometry'; + +type Props = { + view: vec4; + itemDepth: number; + count: number; + pointSize: number; + position: Float32Array; + color: Float32Array; + offset?: vec2 | undefined; + target: Framebuffer2D | null; +}; +export function buildRenderer(regl: REGL.Regl) { + // build the regl command first + const cmd = regl< + { view: vec4; itemDepth: number; offset: vec2; pointSize: number }, + { position: Float32Array; color: Float32Array }, + Props + >({ + vert: ` + precision highp float; + attribute vec2 position; + attribute float color; + + uniform float pointSize; + uniform vec4 view; + uniform float itemDepth; + uniform vec2 offset; + + varying vec4 clr; + + void main(){ + gl_PointSize=pointSize; + vec2 size = view.zw-view.xy; + vec2 pos = ((position+offset)-view.xy)/size; + vec2 clip = (pos*2.0)-1.0; + + // todo: gradients are cool + clr = vec4(mix(vec3(0.3,0,0),vec3(1,1,1),color/15.0),1.0); + + gl_Position = vec4(clip,0.5-color/20.0,1); + }`, + frag: ` + precision highp float; + varying vec4 clr; + void main(){ + // todo: round points with gl_FragCoord + gl_FragColor = clr; + }`, + attributes: { + color: regl.prop('color'), + position: regl.prop('position'), + }, + uniforms: { + itemDepth: regl.prop('itemDepth'), + view: regl.prop('view'), + offset: regl.prop('offset'), + pointSize: regl.prop('pointSize'), + }, + + blend: { + enable: false, + }, + framebuffer: regl.prop('target'), + count: regl.prop('count'), + primitive: 'points', + }); + const renderDots = ( + item: ColumnarTree & { offset?: vec2 | undefined }, + settings: RenderSettings, + columns: Record + ) => { + const { color, position } = columns; + const count = item.content.count; + const itemDepth = item.content.depth; + if ( + color && + position && + 'type' in color && + 'type' in position && + color.type === 'vbo' && + position.type === 'vbo' + ) { + cmd({ + view: Box2D.toFlatArray(settings.view), + count, + itemDepth, + position: position.data, + pointSize: settings.pointSize, + color: color.data, + offset: item.offset ?? [0, 0], + target: settings.target, + }); + } else { + // todo freak out! + throw new Error('omg the internet lied to me'); + } + }; + return renderDots; +} diff --git a/apps/scatterplot/tsconfig.json b/apps/scatterplot/tsconfig.json index d1537fd..185adba 100644 --- a/apps/scatterplot/tsconfig.json +++ b/apps/scatterplot/tsconfig.json @@ -1,10 +1,10 @@ -{ - "extends": "../tsconfig.json", - "include": ["./src/**/*", "../common/src/**/*"], - "compilerOptions": { - "baseUrl": "./", - "paths": { - "Common/*":["../common/src/*"] - } - } -} \ No newline at end of file +{ + "extends": "../tsconfig.json", + "include": ["./src/**/*", "../common/src/**/*"], + "compilerOptions": { + "baseUrl": "./", + "paths": { + "Common/*": ["../common/src/*"] + } + } +} diff --git a/apps/tsconfig.json b/apps/tsconfig.json index 060e202..fe83fdc 100644 --- a/apps/tsconfig.json +++ b/apps/tsconfig.json @@ -1,20 +1,17 @@ { - "extends": "../tsconfig.base.json", - "compilerOptions": { - "strict": true, - "moduleResolution": "Node", - "module": "ES2022", - "target": "ES2022", - "lib": [ - "es2022", - "DOM" - ], - "declaration": true, - "skipLibCheck": true, - "esModuleInterop": true, - "baseUrl": "./", - "paths": { - "Common/*":["./common/src/*"] - }, - }, -} \ No newline at end of file + "extends": "../tsconfig.base.json", + "compilerOptions": { + "strict": true, + "moduleResolution": "Node", + "module": "ES2022", + "target": "ES2022", + "lib": ["es2022", "DOM"], + "declaration": true, + "skipLibCheck": true, + "esModuleInterop": true, + "baseUrl": "./", + "paths": { + "Common/*": ["./common/src/*"] + } + } +} diff --git a/docs/authenticating.md b/docs/authenticating.md index 8fa9eb3..0330280 100644 --- a/docs/authenticating.md +++ b/docs/authenticating.md @@ -17,6 +17,7 @@ Before you can publish a package, you'll need to get your Personal Access Token ``` ## Authenticating in GitHub Actions or Another CI/CD Pipeline + If you have a CI/CD pipeline outside of GitHub Actions, do the following to authenticate: 1. Follow the instructions for generating a PAT in the previous section. @@ -24,6 +25,7 @@ If you have a CI/CD pipeline outside of GitHub Actions, do the following to auth 2. Add that new token to your pipeline's secrets (e.g. `NODE_AUTH_TOKEN`). 3. Use that secret in your pipeline to set up the token before you do the package install: + ``` npm set "//npm.pkg.github.com/:_authToken=$NODE_AUTH_TOKEN" ``` diff --git a/docs/examples.md b/docs/examples.md index 55a9876..af18733 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -1,5 +1,7 @@ # Examples + Examples are located in the `apps` directory. ## Adding New Examples + To add a new example, create a new directory in the `apps` directory, copy the `package.json` from another example, and then start building! diff --git a/docs/publishing.md b/docs/publishing.md index 3ae19b2..e2d2832 100644 --- a/docs/publishing.md +++ b/docs/publishing.md @@ -3,6 +3,7 @@ The `vis` project contains multiple packages, each of which is published to the Allen Institute internal GitHub NPM package registry. ## Publishing a New Package + When you have a new package to publish, follow these steps to publish it: 1. Authenticate with GitHub Packages by following the instructions in the [Authenticating with GitHub Packages](authenticating.md) documentation. @@ -24,6 +25,7 @@ When you have a new package to publish, follow these steps to publish it: 4. Verify your package is available. You can see it listed on the [Allen Institute's GitHub NPM package registry](https://github.com/orgs/AllenInstitute/packages) or on the homepage of this repository. ## Updating an Existing Package + When you have changes to an existing package that you want to publish, follow these steps to publish the changes: 1. Authenticate with GitHub Packages by following the instructions in the [Authenticating with GitHub Packages](authenticating.md) documentation. diff --git a/package.json b/package.json index db7ade0..d5007ae 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,17 @@ "name": "@alleninstitute/vis", "scripts": { "preinstall": "npx only-allow pnpm", - "build": "pnpm -r run build", - "watch": "pnpm -r run watch" + "build": "pnpm -r run --no-bail build", + "watch": "pnpm -r run watch", + "fmt": "npx prettier . --write", + "fmt:check": "npx prettier . --check" }, "devDependencies": { "@parcel/packager-ts": "2.12.0", "@parcel/transformer-typescript-types": "2.12.0", "buffer": "^5.5.0||^6.0.0", "parcel": "2.12.0", + "prettier": "3.3.2", "process": "^0.11.10", "typescript": "^5.3.3" } diff --git a/packages/geometry/package.json b/packages/geometry/package.json index a2b0dda..fd1b2fe 100644 --- a/packages/geometry/package.json +++ b/packages/geometry/package.json @@ -1,55 +1,55 @@ { - "name": "@alleninstitute/vis-geometry", - "version": "0.0.2", - "contributors": [ - { - "name": "Lane Sawyer", - "email": "lane.sawyer@alleninstitute.org" + "name": "@alleninstitute/vis-geometry", + "version": "0.0.2", + "contributors": [ + { + "name": "Lane Sawyer", + "email": "lane.sawyer@alleninstitute.org" + }, + { + "name": "James Gerstenberger", + "email": "james.gerstenberger@alleninstitute.org" + }, + { + "name": "Noah Shepard", + "email": "noah.shepard@alleninstitute.org" + }, + { + "name": "Skyler Moosman", + "email": "skyler.moosman@alleninstitute.org" + }, + { + "name": "Su Li", + "email": "su.li@alleninstitute.org" + } + ], + "license": "TBD", + "source": "src/index.ts", + "main": "dist/main.js", + "module": "dist/module.js", + "types": "dist/types.d.ts", + "files": [ + "dist" + ], + "scripts": { + "preinstall": "npx only-allow pnpm", + "typecheck": "tsc --noEmit", + "build": "parcel build --no-cache", + "watch": "parcel watch", + "test": "vitest --watch" }, - { - "name": "James Gerstenberger", - "email": "james.gerstenberger@alleninstitute.org" + "repository": { + "type": "git", + "url": "https://github.com/AllenInstitute/vis.git" }, - { - "name": "Noah Shepard", - "email": "noah.shepard@alleninstitute.org" + "publishConfig": { + "registry": "https://npm.pkg.github.com/AllenInstitute" }, - { - "name": "Skyler Moosman", - "email": "skyler.moosman@alleninstitute.org" - }, - { - "name": "Su Li", - "email": "su.li@alleninstitute.org" + "devDependencies": { + "@parcel/packager-ts": "^2.12.0", + "@parcel/transformer-typescript-types": "^2.12.0", + "parcel": "2.12.0", + "typescript": "^5.3.3", + "vitest": "^1.4.0" } - ], - "license": "TBD", - "source": "src/index.ts", - "main": "dist/main.js", - "module": "dist/module.js", - "types": "dist/types.d.ts", - "files": [ - "dist" - ], - "scripts": { - "preinstall": "npx only-allow pnpm", - "typecheck": "tsc --noEmit", - "build": "parcel build --no-cache", - "watch": "parcel watch", - "test": "vitest --watch" - }, - "repository": { - "type": "git", - "url": "https://github.com/AllenInstitute/vis.git" - }, - "publishConfig": { - "registry": "https://npm.pkg.github.com/AllenInstitute" - }, - "devDependencies": { - "@parcel/packager-ts": "^2.12.0", - "@parcel/transformer-typescript-types": "^2.12.0", - "vitest": "^1.4.0", - "parcel": "2.12.0", - "typescript": "^5.3.3" - } } diff --git a/packages/geometry/src/BoundingBox.ts b/packages/geometry/src/BoundingBox.ts index 295d060..b45aac0 100644 --- a/packages/geometry/src/BoundingBox.ts +++ b/packages/geometry/src/BoundingBox.ts @@ -1,105 +1,105 @@ -import type { VectorLib } from "./vector"; - -type VectorConstraint = ReadonlyArray; -export type box = { - readonly minCorner: V; - readonly maxCorner: V; -}; - -export function BoxClassFactory(lib: VectorLib) { - const create = (low: V, hi: V) => ({ minCorner: low, maxCorner: hi }); - const isValid = (a: box) => { - const diff = lib.sub(a.maxCorner, a.minCorner); - return lib.finite(a.maxCorner) && lib.finite(a.minCorner) && lib.all(diff, (v: number) => v > 0.0); - }; - const union = (a: box, b: box) => ({ - minCorner: lib.min(a.minCorner, b.minCorner), - maxCorner: lib.max(a.maxCorner, b.maxCorner), - }); - const corners = (a: box) => { - const what = a.minCorner.map(() => false); - const next = () => { - for (let i = what.length - 1; i >= 0; i -= 1) { - if (!what[i]) { - what[i] = true; - return true; - } - what[i] = false; - } - return false; - }; - const vals: V[] = []; - const pickValue = (v: boolean, i: number) => (v ? a.maxCorner[i] : a.minCorner[i]); - do { - vals.push(what.map(pickValue) as unknown as V); - } while (next()); - return vals; - }; - const setCorner = (box: box, cornerIndex: number, position: V): box => { - // cornerIndex is based from the generated corners from box.corners - // The corner index corresponds to a binary representation where each bit represents a dimension. - // For example, in a 2D box, [[minX, minY], [minX, maxY], [maxX, minY], [maxX, maxY]] would be [[0,0], [0,1], [1,0], [1,1]] - const binaryIndex = cornerIndex.toString(2).padStart(box.minCorner.length, '0').split('').map(Number); - - const newMinCorner = [...box.minCorner]; - const newMaxCorner = [...box.maxCorner]; - - // And then based on the binaryIndex (dimensions), set the correct value in each corner so the box corner outputs to the intended position - for (let i = 0; i < binaryIndex.length; i += 1) { - if (binaryIndex[i] === 0) { - newMinCorner[i] = position[i]; - } else { - newMaxCorner[i] = position[i]; - } - } - - // Validate that minCorner is actually the minimum and maxCorner is the maximum - for (let i = 0; i < newMinCorner.length; i += 1) { - if (newMinCorner[i] > newMaxCorner[i]) { - [newMinCorner[i], newMaxCorner[i]] = [newMaxCorner[i], newMinCorner[i]]; - } - } - - return { - minCorner: newMinCorner as unknown as V, - maxCorner: newMaxCorner as unknown as V, - }; - }; - const intersection = (a: box, b: box) => { - const result: box = { - minCorner: lib.max(a.minCorner, b.minCorner), - maxCorner: lib.min(a.maxCorner, b.maxCorner), - }; - if (isValid(result)) { - return result; - } - return undefined; - }; - const containsPoint = (box: box, point: V) => { - const greaterThanMin = lib.all(lib.sub(point, box.minCorner), (v) => v > 0.0); - const lessThanMax = lib.all(lib.sub(box.maxCorner, point), (v) => v >= 0.0); - return greaterThanMin && lessThanMax; - }; - - const toFlatArray = (box: box) => [...box.minCorner, ...box.maxCorner] as const; - const size = (b: box) => lib.sub(b.maxCorner, b.minCorner); - const midpoint = (b: box) => lib.scale(lib.add(b.minCorner, b.maxCorner), 0.5); - const map = (box: box, fn: (v: V) => V) => ({ minCorner: fn(box.minCorner), maxCorner: fn(box.maxCorner) }); - const scale = (box: box, s: V) => map(box, (c: V) => lib.mul(s, c)); - const translate = (box: box, offset: V) => map(box, (c: V) => lib.add(c, offset)); - return { - create, // build a box - corners, // get all the corners of the box - setCorner, // set a specific corner of the box to the given position - isValid, // return false if the box has any non-finite points, or has a negative or zero volume/area etc.. - union, // return the smallest box that contains the two given boxes - intersection, // return the intersection of two boxes if it exists - containsPoint, // return true if a point is in a box - note that this is exclusive on the low side, and inclusive on the high side - size, // how big is it? - midpoint, // yup you guessed it, return a vector at the center of a box. - toFlatArray, - scale, - map, - translate, - } as const; -} +import type { VectorLib } from './vector'; + +type VectorConstraint = ReadonlyArray; +export type box = { + readonly minCorner: V; + readonly maxCorner: V; +}; + +export function BoxClassFactory(lib: VectorLib) { + const create = (low: V, hi: V) => ({ minCorner: low, maxCorner: hi }); + const isValid = (a: box) => { + const diff = lib.sub(a.maxCorner, a.minCorner); + return lib.finite(a.maxCorner) && lib.finite(a.minCorner) && lib.all(diff, (v: number) => v > 0.0); + }; + const union = (a: box, b: box) => ({ + minCorner: lib.min(a.minCorner, b.minCorner), + maxCorner: lib.max(a.maxCorner, b.maxCorner), + }); + const corners = (a: box) => { + const what = a.minCorner.map(() => false); + const next = () => { + for (let i = what.length - 1; i >= 0; i -= 1) { + if (!what[i]) { + what[i] = true; + return true; + } + what[i] = false; + } + return false; + }; + const vals: V[] = []; + const pickValue = (v: boolean, i: number) => (v ? a.maxCorner[i] : a.minCorner[i]); + do { + vals.push(what.map(pickValue) as unknown as V); + } while (next()); + return vals; + }; + const setCorner = (box: box, cornerIndex: number, position: V): box => { + // cornerIndex is based from the generated corners from box.corners + // The corner index corresponds to a binary representation where each bit represents a dimension. + // For example, in a 2D box, [[minX, minY], [minX, maxY], [maxX, minY], [maxX, maxY]] would be [[0,0], [0,1], [1,0], [1,1]] + const binaryIndex = cornerIndex.toString(2).padStart(box.minCorner.length, '0').split('').map(Number); + + const newMinCorner = [...box.minCorner]; + const newMaxCorner = [...box.maxCorner]; + + // And then based on the binaryIndex (dimensions), set the correct value in each corner so the box corner outputs to the intended position + for (let i = 0; i < binaryIndex.length; i += 1) { + if (binaryIndex[i] === 0) { + newMinCorner[i] = position[i]; + } else { + newMaxCorner[i] = position[i]; + } + } + + // Validate that minCorner is actually the minimum and maxCorner is the maximum + for (let i = 0; i < newMinCorner.length; i += 1) { + if (newMinCorner[i] > newMaxCorner[i]) { + [newMinCorner[i], newMaxCorner[i]] = [newMaxCorner[i], newMinCorner[i]]; + } + } + + return { + minCorner: newMinCorner as unknown as V, + maxCorner: newMaxCorner as unknown as V, + }; + }; + const intersection = (a: box, b: box) => { + const result: box = { + minCorner: lib.max(a.minCorner, b.minCorner), + maxCorner: lib.min(a.maxCorner, b.maxCorner), + }; + if (isValid(result)) { + return result; + } + return undefined; + }; + const containsPoint = (box: box, point: V) => { + const greaterThanMin = lib.all(lib.sub(point, box.minCorner), (v) => v > 0.0); + const lessThanMax = lib.all(lib.sub(box.maxCorner, point), (v) => v >= 0.0); + return greaterThanMin && lessThanMax; + }; + + const toFlatArray = (box: box) => [...box.minCorner, ...box.maxCorner] as const; + const size = (b: box) => lib.sub(b.maxCorner, b.minCorner); + const midpoint = (b: box) => lib.scale(lib.add(b.minCorner, b.maxCorner), 0.5); + const map = (box: box, fn: (v: V) => V) => ({ minCorner: fn(box.minCorner), maxCorner: fn(box.maxCorner) }); + const scale = (box: box, s: V) => map(box, (c: V) => lib.mul(s, c)); + const translate = (box: box, offset: V) => map(box, (c: V) => lib.add(c, offset)); + return { + create, // build a box + corners, // get all the corners of the box + setCorner, // set a specific corner of the box to the given position + isValid, // return false if the box has any non-finite points, or has a negative or zero volume/area etc.. + union, // return the smallest box that contains the two given boxes + intersection, // return the intersection of two boxes if it exists + containsPoint, // return true if a point is in a box - note that this is exclusive on the low side, and inclusive on the high side + size, // how big is it? + midpoint, // yup you guessed it, return a vector at the center of a box. + toFlatArray, + scale, + map, + translate, + } as const; +} diff --git a/packages/geometry/src/Rectangle2D.ts b/packages/geometry/src/Rectangle2D.ts index b025af7..c2d75c6 100644 --- a/packages/geometry/src/Rectangle2D.ts +++ b/packages/geometry/src/Rectangle2D.ts @@ -1,35 +1,35 @@ -import type { box2D } from "./box2D"; -import { Vec2, type vec2 } from "./vec2"; - -export type rectangle2D = { - center: vec2; - size: vec2; -}; - -export function getMinimumBoundingBox(rect: rectangle2D): box2D { - const { center, size } = rect; - const half = Vec2.scale(size, 0.5); - return { - minCorner: Vec2.sub(center, half), - maxCorner: Vec2.add(center, half), - }; -} -// return a rectangle scaled by scale, with the origin of the scaling at the given point -export const scaleFromPoint = (rect: rectangle2D, scale: number, point: vec2) => { - const centerFromOrigin = Vec2.sub(rect.center, point); - const newCenter = Vec2.add(Vec2.scale(centerFromOrigin, scale), point); - return { - ...rect, - center: newCenter, - size: Vec2.scale(rect.size, scale), - }; -}; - -// linearly interpolate start --> end -export function interpolateRectangles(start: T, end: T, parameter: number): T { - return { - ...start, - center: Vec2.mix(start.center, end.center, parameter), - size: Vec2.mix(start.size, end.size, parameter), - }; -} +import type { box2D } from './box2D'; +import { Vec2, type vec2 } from './vec2'; + +export type rectangle2D = { + center: vec2; + size: vec2; +}; + +export function getMinimumBoundingBox(rect: rectangle2D): box2D { + const { center, size } = rect; + const half = Vec2.scale(size, 0.5); + return { + minCorner: Vec2.sub(center, half), + maxCorner: Vec2.add(center, half), + }; +} +// return a rectangle scaled by scale, with the origin of the scaling at the given point +export const scaleFromPoint = (rect: rectangle2D, scale: number, point: vec2) => { + const centerFromOrigin = Vec2.sub(rect.center, point); + const newCenter = Vec2.add(Vec2.scale(centerFromOrigin, scale), point); + return { + ...rect, + center: newCenter, + size: Vec2.scale(rect.size, scale), + }; +}; + +// linearly interpolate start --> end +export function interpolateRectangles(start: T, end: T, parameter: number): T { + return { + ...start, + center: Vec2.mix(start.center, end.center, parameter), + size: Vec2.mix(start.size, end.size, parameter), + }; +} diff --git a/packages/geometry/src/box2D.ts b/packages/geometry/src/box2D.ts index 7e8ad9c..27e264f 100644 --- a/packages/geometry/src/box2D.ts +++ b/packages/geometry/src/box2D.ts @@ -1,21 +1,21 @@ -import { BoxClassFactory, type box } from "./BoundingBox"; -import type { rectangle2D } from "./Rectangle2D"; -import { type vec2, Vec2 } from "./vec2"; - -export type box2D = box; - -const isBox2D = (maybe: unknown): maybe is box2D => { - if (typeof maybe === "object" && maybe !== null && "minCorner" in maybe && "maxCorner" in maybe) { - if (Array.isArray(maybe.minCorner) && Array.isArray(maybe.maxCorner)) { - return maybe.minCorner.length === 2 && maybe.maxCorner.length === 2; - } - } - - return false; -}; -const boxClass = BoxClassFactory(Vec2); -function toRectangle2D(b: box2D): rectangle2D { - return { center: boxClass.midpoint(b), size: boxClass.size(b) }; -} - -export const Box2D = { isBox2D, toRectangle2D, ...boxClass }; +import { BoxClassFactory, type box } from './BoundingBox'; +import type { rectangle2D } from './Rectangle2D'; +import { type vec2, Vec2 } from './vec2'; + +export type box2D = box; + +const isBox2D = (maybe: unknown): maybe is box2D => { + if (typeof maybe === 'object' && maybe !== null && 'minCorner' in maybe && 'maxCorner' in maybe) { + if (Array.isArray(maybe.minCorner) && Array.isArray(maybe.maxCorner)) { + return maybe.minCorner.length === 2 && maybe.maxCorner.length === 2; + } + } + + return false; +}; +const boxClass = BoxClassFactory(Vec2); +function toRectangle2D(b: box2D): rectangle2D { + return { center: boxClass.midpoint(b), size: boxClass.size(b) }; +} + +export const Box2D = { isBox2D, toRectangle2D, ...boxClass }; diff --git a/packages/geometry/src/box3D.ts b/packages/geometry/src/box3D.ts index 5c300d7..a7a7c9f 100644 --- a/packages/geometry/src/box3D.ts +++ b/packages/geometry/src/box3D.ts @@ -1,19 +1,19 @@ -import { BoxClassFactory, type box } from './BoundingBox'; -import type { vec2 } from './vec2'; -import { type vec3, Vec3 } from './vec3'; - -const isBox3D = (maybe: unknown): maybe is box3D => { - if (typeof maybe === 'object' && maybe !== null && 'minCorner' in maybe && 'maxCorner' in maybe) { - if (Array.isArray(maybe.minCorner) && Array.isArray(maybe.maxCorner)) { - return maybe.minCorner.length === 3 && maybe.maxCorner.length === 3; - } - } - - return false; -}; -export const Box3D = { - ...BoxClassFactory(Vec3), - isBox3D, - xy: (b: box): box => ({ minCorner: Vec3.xy(b.minCorner), maxCorner: Vec3.xy(b.maxCorner) }), -}; -export type box3D = box; +import { BoxClassFactory, type box } from './BoundingBox'; +import type { vec2 } from './vec2'; +import { type vec3, Vec3 } from './vec3'; + +const isBox3D = (maybe: unknown): maybe is box3D => { + if (typeof maybe === 'object' && maybe !== null && 'minCorner' in maybe && 'maxCorner' in maybe) { + if (Array.isArray(maybe.minCorner) && Array.isArray(maybe.maxCorner)) { + return maybe.minCorner.length === 3 && maybe.maxCorner.length === 3; + } + } + + return false; +}; +export const Box3D = { + ...BoxClassFactory(Vec3), + isBox3D, + xy: (b: box): box => ({ minCorner: Vec3.xy(b.minCorner), maxCorner: Vec3.xy(b.maxCorner) }), +}; +export type box3D = box; diff --git a/packages/geometry/src/index.ts b/packages/geometry/src/index.ts index 0b6eb03..48127e3 100644 --- a/packages/geometry/src/index.ts +++ b/packages/geometry/src/index.ts @@ -1,16 +1,16 @@ -export { Vec2 } from "./vec2"; -export type { vec2 } from "./vec2"; -export { Vec3 } from "./vec3"; -export type { vec3 } from "./vec3"; -export { Vec4 } from "./vec4"; -export type { vec4 } from "./vec4"; -export { Vec5 } from "./vec5"; -export type { vec5 } from "./vec5"; -export { Box2D } from "./box2D"; -export type { box2D } from "./box2D"; -export { Box3D } from "./box3D"; -export type { box3D } from "./box3D"; -export { size, within, isFinite, isValid, fixOrder, intersection, limit } from "./interval"; -export type { box } from './BoundingBox'; -export { getMinimumBoundingBox, scaleFromPoint, interpolateRectangles } from './Rectangle2D'; -export { type SpatialTreeInterface, visitBFS } from './spatialIndexing/tree' \ No newline at end of file +export { Vec2 } from './vec2'; +export type { vec2 } from './vec2'; +export { Vec3 } from './vec3'; +export type { vec3 } from './vec3'; +export { Vec4 } from './vec4'; +export type { vec4 } from './vec4'; +export { Vec5 } from './vec5'; +export type { vec5 } from './vec5'; +export { Box2D } from './box2D'; +export type { box2D } from './box2D'; +export { Box3D } from './box3D'; +export type { box3D } from './box3D'; +export { size, within, isFinite, isValid, fixOrder, intersection, limit } from './interval'; +export type { box } from './BoundingBox'; +export { getMinimumBoundingBox, scaleFromPoint, interpolateRectangles } from './Rectangle2D'; +export { type SpatialTreeInterface, visitBFS } from './spatialIndexing/tree'; diff --git a/packages/geometry/src/interval.ts b/packages/geometry/src/interval.ts index 695f4d2..ef2c81e 100644 --- a/packages/geometry/src/interval.ts +++ b/packages/geometry/src/interval.ts @@ -1,68 +1,68 @@ -export type Interval = { - min: number; - max: number; -}; - -/** - * - * @param i the inteval to return the size of - * @returns the size of the interval, aka the distance between its start and end. note this value may be negative - */ -export function size(i: Interval) { - return i.max - i.min; -} -/** - * - * @param i a given VALID interval - * @param x a value - * @returns true iff the x is within (double-inclusive) the interval i - */ -export function within(i: Interval, x: number): boolean { - return i.min <= x && i.max >= x; -} -/** - * - * @param i a given interval - * @returns true iff its min and max values are both finite, non-NaN values - */ -export function isFinite(i: Interval) { - return Number.isFinite(i.min) && Number.isFinite(i.max); -} -/** - * - * @param i - * @param minSize - * @return true iff the given interval i is at least as big as minSize, and min <= max, and isFinite(i) - */ -export function isValid(i: Interval, minSize: number) { - return size(i) >= Math.abs(minSize) && isFinite(i) && i.max >= i.min; -} -/** - * - * @param i an interval - * @return a copy of i, with min&max swapped, if the given i had a negative size - */ -export function fixOrder(i: Interval) { - return { min: Math.min(i.max, i.min), max: Math.max(i.min, i.max) }; -} -/** - * - * @param a a valid interval - * @param b a valid interval - * @return the interval where a and b overlap, or undefined if there is no such interval - */ -export function intersection(a: Interval, b: Interval): Interval | undefined { - const result = { min: Math.max(a.min, b.min), max: Math.min(a.max, b.max) }; - if (size(result) > 0) return result; - - return undefined; -} -/** - * - * @param interval a given VALID interval - * @param x a finite number - * @returns x iff x is within interval (or if interval is invalid), interval.min if x= x; +} +/** + * + * @param i a given interval + * @returns true iff its min and max values are both finite, non-NaN values + */ +export function isFinite(i: Interval) { + return Number.isFinite(i.min) && Number.isFinite(i.max); +} +/** + * + * @param i + * @param minSize + * @return true iff the given interval i is at least as big as minSize, and min <= max, and isFinite(i) + */ +export function isValid(i: Interval, minSize: number) { + return size(i) >= Math.abs(minSize) && isFinite(i) && i.max >= i.min; +} +/** + * + * @param i an interval + * @return a copy of i, with min&max swapped, if the given i had a negative size + */ +export function fixOrder(i: Interval) { + return { min: Math.min(i.max, i.min), max: Math.max(i.min, i.max) }; +} +/** + * + * @param a a valid interval + * @param b a valid interval + * @return the interval where a and b overlap, or undefined if there is no such interval + */ +export function intersection(a: Interval, b: Interval): Interval | undefined { + const result = { min: Math.max(a.min, b.min), max: Math.min(a.max, b.max) }; + if (size(result) > 0) return result; + + return undefined; +} +/** + * + * @param interval a given VALID interval + * @param x a finite number + * @returns x iff x is within interval (or if interval is invalid), interval.min if x> = { bounds: (t: Tree) => box; diff --git a/packages/geometry/src/tests/Rectangle2D.test.ts b/packages/geometry/src/tests/Rectangle2D.test.ts index e1c625e..99e109b 100644 --- a/packages/geometry/src/tests/Rectangle2D.test.ts +++ b/packages/geometry/src/tests/Rectangle2D.test.ts @@ -1,46 +1,46 @@ -import { getMinimumBoundingBox, rectangle2D, scaleFromPoint } from "../Rectangle2D"; -import { Box2D, box2D } from "../box2D"; -import { Vec2, vec2 } from "../vec2"; -import { describe, expect, it, test } from 'vitest' - -function nearlyEqual(a: vec2, b: vec2, epsilon: number) { - return Vec2.maxComponent(Vec2.map(Vec2.sub(a, b), Math.abs)) < epsilon; -} -function boxesVeryClose(a: box2D, b: box2D, epsilon: number) { - return nearlyEqual(a.minCorner, b.minCorner, epsilon) && nearlyEqual(a.maxCorner, b.maxCorner, epsilon); -} -describe("scaleFromPoint", () => { - it("scaling from the center does not move the center!", () => { - const scaled = scaleFromPoint( - { - center: [5, 5], - size: [1, 1], - }, - 100, - [5, 5] - ); - expect(scaled.center).toEqual([5, 5]); - expect(scaled.size).toEqual([100, 100]); - }); - it("scaling from the bottom left corner does not move that corner", () => { - const start: rectangle2D = { - center: [3, 3], - size: [2, 2], - }; // my bottom left corner is 2,2 - const getBottomLeftCornerOfUnrotatedRectangle = (r: rectangle2D) => Vec2.sub(r.center, Vec2.scale(r.size, 0.5)); - const bottomLeft = getBottomLeftCornerOfUnrotatedRectangle(start); // note: this is only correct because rotation is zero - const scaled = scaleFromPoint(start, 100, bottomLeft); - expect(getBottomLeftCornerOfUnrotatedRectangle(scaled)).toEqual(bottomLeft); - expect(scaled.size).toEqual([200, 200]); - }); -}); -describe("getMinimumBoundingBox", () => { - test("that we can get the axis aligned bounding box of a rectangle", () => { - const view: rectangle2D = { - center: [2, 3], - size: [4, 6], - }; - const boundingBox = getMinimumBoundingBox(view); - expect(boundingBox).toStrictEqual(Box2D.create([0, 0], [4, 6])); - }); -}); +import { getMinimumBoundingBox, rectangle2D, scaleFromPoint } from '../Rectangle2D'; +import { Box2D, box2D } from '../box2D'; +import { Vec2, vec2 } from '../vec2'; +import { describe, expect, it, test } from 'vitest'; + +function nearlyEqual(a: vec2, b: vec2, epsilon: number) { + return Vec2.maxComponent(Vec2.map(Vec2.sub(a, b), Math.abs)) < epsilon; +} +function boxesVeryClose(a: box2D, b: box2D, epsilon: number) { + return nearlyEqual(a.minCorner, b.minCorner, epsilon) && nearlyEqual(a.maxCorner, b.maxCorner, epsilon); +} +describe('scaleFromPoint', () => { + it('scaling from the center does not move the center!', () => { + const scaled = scaleFromPoint( + { + center: [5, 5], + size: [1, 1], + }, + 100, + [5, 5] + ); + expect(scaled.center).toEqual([5, 5]); + expect(scaled.size).toEqual([100, 100]); + }); + it('scaling from the bottom left corner does not move that corner', () => { + const start: rectangle2D = { + center: [3, 3], + size: [2, 2], + }; // my bottom left corner is 2,2 + const getBottomLeftCornerOfUnrotatedRectangle = (r: rectangle2D) => Vec2.sub(r.center, Vec2.scale(r.size, 0.5)); + const bottomLeft = getBottomLeftCornerOfUnrotatedRectangle(start); // note: this is only correct because rotation is zero + const scaled = scaleFromPoint(start, 100, bottomLeft); + expect(getBottomLeftCornerOfUnrotatedRectangle(scaled)).toEqual(bottomLeft); + expect(scaled.size).toEqual([200, 200]); + }); +}); +describe('getMinimumBoundingBox', () => { + test('that we can get the axis aligned bounding box of a rectangle', () => { + const view: rectangle2D = { + center: [2, 3], + size: [4, 6], + }; + const boundingBox = getMinimumBoundingBox(view); + expect(boundingBox).toStrictEqual(Box2D.create([0, 0], [4, 6])); + }); +}); diff --git a/packages/geometry/src/tests/box2D.test.ts b/packages/geometry/src/tests/box2D.test.ts index f8757fa..48058f0 100644 --- a/packages/geometry/src/tests/box2D.test.ts +++ b/packages/geometry/src/tests/box2D.test.ts @@ -1,94 +1,94 @@ -import { Box2D } from '../box2D'; -import { Vec2 } from '../vec2'; -import { describe, expect, test } from 'vitest' -describe('box2D', () => { - // Basic box to use throughout the tests - const box = Box2D.create([1, 2], [3, 4]); - - test('create', () => { - expect(box).toStrictEqual({ minCorner: [1, 2], maxCorner: [3, 4] }); - }); - - test('corners', () => { - const corners = Box2D.corners(box); - // Checks that we get them back in this order: - // - bottom left - // - top left - // - bottom right - // - top right - expect(corners).toStrictEqual([ - [1, 2], - [1, 4], - [3, 2], - [3, 4], - ]); - }); - test('map', () => { - expect(Box2D.map(Box2D.create([0, 0], [1, 1]), (v) => Vec2.scale(v, 200))).toStrictEqual( - Box2D.create([0, 0], [200, 200]) - ); - }); - test('isValid', () => { - const validBox = Box2D.isValid(box); - expect(validBox).toBeTruthy(); - - const nanBox = Box2D.isValid(Box2D.create([NaN, NaN], [1, 1])); - expect(nanBox).toBeFalsy(); - - const infinityBox = Box2D.isValid(Box2D.create([Infinity, Infinity], [1, 1])); - expect(infinityBox).toBeFalsy(); - - const noAreaPointBox = Box2D.isValid(Box2D.create([0, 0], [0, 0])); - expect(noAreaPointBox).toBeFalsy(); - - const noAreaLineBox = Box2D.isValid(Box2D.create([0, 0], [0, 100])); - expect(noAreaLineBox).toBeFalsy(); - }); - - test('union', () => { - const union = Box2D.union(box, Box2D.create([3, 3], [5, 5])); - expect(union).toStrictEqual(Box2D.create([1, 2], [5, 5])); - }); - - test('intersection', () => { - const intersection = Box2D.intersection(box, Box2D.create([2, 3], [5, 5])); - expect(intersection).toStrictEqual(Box2D.create([2, 3], [3, 4])); - - const borderIntersection = Box2D.intersection(box, Box2D.create([3, 3], [5, 5])); - expect(borderIntersection).toBeUndefined(); - - const noIntersection = Box2D.intersection(box, Box2D.create([10, 10], [20, 20])); - expect(noIntersection).toBeUndefined(); - }); - - test('containsPoint', () => { - const insidePoint = Box2D.containsPoint(box, [2, 3]); - expect(insidePoint).toBeTruthy(); - - const outsidePoint = Box2D.containsPoint(box, [0, 0]); - expect(outsidePoint).toBeFalsy(); - - // A point on the lower border is not contained within the box - const lowerBorderPoint = Box2D.containsPoint(box, [1, 2]); - expect(lowerBorderPoint).toBeFalsy(); - - // A point on the upper border is contained within the box - const upperBorderPoint = Box2D.containsPoint(box, [3, 4]); - expect(upperBorderPoint).toBeTruthy(); - }); - - test('size', () => { - const size = Box2D.size(box); - expect(size).toStrictEqual([2, 2]); - }); - - test('midpoint', () => { - const midpoint = Box2D.midpoint(box); - expect(midpoint).toStrictEqual([2, 3]); - }); - - test('toFlatArray', () => { - const flatArray = Box2D.toFlatArray(box); - expect(flatArray).toStrictEqual([1, 2, 3, 4]); - }); -}); +import { Box2D } from '../box2D'; +import { Vec2 } from '../vec2'; +import { describe, expect, test } from 'vitest'; +describe('box2D', () => { + // Basic box to use throughout the tests + const box = Box2D.create([1, 2], [3, 4]); + + test('create', () => { + expect(box).toStrictEqual({ minCorner: [1, 2], maxCorner: [3, 4] }); + }); + + test('corners', () => { + const corners = Box2D.corners(box); + // Checks that we get them back in this order: + // - bottom left + // - top left + // - bottom right + // - top right + expect(corners).toStrictEqual([ + [1, 2], + [1, 4], + [3, 2], + [3, 4], + ]); + }); + test('map', () => { + expect(Box2D.map(Box2D.create([0, 0], [1, 1]), (v) => Vec2.scale(v, 200))).toStrictEqual( + Box2D.create([0, 0], [200, 200]) + ); + }); + test('isValid', () => { + const validBox = Box2D.isValid(box); + expect(validBox).toBeTruthy(); + + const nanBox = Box2D.isValid(Box2D.create([NaN, NaN], [1, 1])); + expect(nanBox).toBeFalsy(); + + const infinityBox = Box2D.isValid(Box2D.create([Infinity, Infinity], [1, 1])); + expect(infinityBox).toBeFalsy(); + + const noAreaPointBox = Box2D.isValid(Box2D.create([0, 0], [0, 0])); + expect(noAreaPointBox).toBeFalsy(); + + const noAreaLineBox = Box2D.isValid(Box2D.create([0, 0], [0, 100])); + expect(noAreaLineBox).toBeFalsy(); + }); + + test('union', () => { + const union = Box2D.union(box, Box2D.create([3, 3], [5, 5])); + expect(union).toStrictEqual(Box2D.create([1, 2], [5, 5])); + }); + + test('intersection', () => { + const intersection = Box2D.intersection(box, Box2D.create([2, 3], [5, 5])); + expect(intersection).toStrictEqual(Box2D.create([2, 3], [3, 4])); + + const borderIntersection = Box2D.intersection(box, Box2D.create([3, 3], [5, 5])); + expect(borderIntersection).toBeUndefined(); + + const noIntersection = Box2D.intersection(box, Box2D.create([10, 10], [20, 20])); + expect(noIntersection).toBeUndefined(); + }); + + test('containsPoint', () => { + const insidePoint = Box2D.containsPoint(box, [2, 3]); + expect(insidePoint).toBeTruthy(); + + const outsidePoint = Box2D.containsPoint(box, [0, 0]); + expect(outsidePoint).toBeFalsy(); + + // A point on the lower border is not contained within the box + const lowerBorderPoint = Box2D.containsPoint(box, [1, 2]); + expect(lowerBorderPoint).toBeFalsy(); + + // A point on the upper border is contained within the box + const upperBorderPoint = Box2D.containsPoint(box, [3, 4]); + expect(upperBorderPoint).toBeTruthy(); + }); + + test('size', () => { + const size = Box2D.size(box); + expect(size).toStrictEqual([2, 2]); + }); + + test('midpoint', () => { + const midpoint = Box2D.midpoint(box); + expect(midpoint).toStrictEqual([2, 3]); + }); + + test('toFlatArray', () => { + const flatArray = Box2D.toFlatArray(box); + expect(flatArray).toStrictEqual([1, 2, 3, 4]); + }); +}); diff --git a/packages/geometry/src/tests/box3D.test.ts b/packages/geometry/src/tests/box3D.test.ts index 9264de1..2ec6364 100644 --- a/packages/geometry/src/tests/box3D.test.ts +++ b/packages/geometry/src/tests/box3D.test.ts @@ -1,6 +1,6 @@ import { Box3D } from '../box3D'; import { Vec3 } from '../vec3'; -import { describe, expect, test } from 'vitest' +import { describe, expect, test } from 'vitest'; describe('Box3D', () => { // Basic box to use throughout the tests const box = Box3D.create([1, 2, 3], [3, 4, 5]); diff --git a/packages/geometry/src/tests/interval.test.ts b/packages/geometry/src/tests/interval.test.ts index f6bc796..3d203e5 100644 --- a/packages/geometry/src/tests/interval.test.ts +++ b/packages/geometry/src/tests/interval.test.ts @@ -1,60 +1,60 @@ -import { fixOrder, intersection, Interval, isValid, limit, size, within } from '../interval'; -import { describe, expect, it, test } from 'vitest' -function I(a: number, b: number): Interval { - return { min: a, max: b }; -} -describe('basic interval math', () => { - describe('validity', () => { - it('intervals with zero or negative size are invalid', () => { - expect(isValid(I(3, 3.00001), 0.00002)).toBe(false); - }); - it('intevals with non-finite values are invalid', () => { - expect(isValid(I(3, Number.NaN), 0)).toBeFalsy(); - expect(isValid(I(Number.NEGATIVE_INFINITY, 3), 0)).toBeFalsy(); - expect(isValid(I(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY), 0)).toBeFalsy(); - expect(isValid(I(Number.NEGATIVE_INFINITY, 3), 0)).toBeFalsy(); - expect(isValid(I(0, 1), 0)).toBeTruthy(); - }); - }); - describe('size', () => { - it('size is the signed distance between min and max', () => { - expect(size(I(1, 3))).toBe(2); - expect(size(I(11, -3))).toBe(-14); - expect(size(I(1, 1))).toBe(0); - }); - }); - describe('within', () => { - it('within is inclusive on either side', () => { - expect(within(I(10, 30), 10)).toBeTruthy(); - expect(within(I(10, 30), 30)).toBeTruthy(); - expect(within(I(10, 30), 30.0000001)).toBeFalsy(); - // invalid: should always return false - expect(within(I(30, 10), 15)).toBeFalsy(); - expect(within(I(10, 30), 15)).toBeTruthy(); - }); - }); - describe('fixOrder', () => { - it('fixOrder always returns a valid interval if its given interval was finite', () => { - expect(fixOrder(I(3, 1))).toEqual(I(1, 3)); - expect(fixOrder(I(1, 3))).toEqual(I(1, 3)); - // garbo in garbo out - expect(fixOrder(I(Number.NaN, 3))).toEqual(I(Number.NaN, Number.NaN)); - }); - }); - describe('intersection', () => { - it('intersection is the overlap of two intervals, if they are valid', () => { - expect(intersection(I(1, 4), I(3, 5))).toEqual(I(3, 4)); - expect(intersection(I(4, 1), I(3, 5))).toEqual(undefined); - expect(intersection(I(-1, 2), I(3, 5))).toEqual(undefined); - }); - }); - describe('limit', () => { - it('clamp a value into an interval, if the interval is valid', () => { - expect(limit(I(1, 4), 0)).toEqual(1); - expect(limit(I(1, 4), 50)).toEqual(4); - // given interval is invalid, so dont mess with x - expect(limit(I(4, 1), 200)).toEqual(200); - expect(limit(I(1, 4), 2)).toEqual(2); - }); - }); -}); +import { fixOrder, intersection, Interval, isValid, limit, size, within } from '../interval'; +import { describe, expect, it, test } from 'vitest'; +function I(a: number, b: number): Interval { + return { min: a, max: b }; +} +describe('basic interval math', () => { + describe('validity', () => { + it('intervals with zero or negative size are invalid', () => { + expect(isValid(I(3, 3.00001), 0.00002)).toBe(false); + }); + it('intevals with non-finite values are invalid', () => { + expect(isValid(I(3, Number.NaN), 0)).toBeFalsy(); + expect(isValid(I(Number.NEGATIVE_INFINITY, 3), 0)).toBeFalsy(); + expect(isValid(I(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY), 0)).toBeFalsy(); + expect(isValid(I(Number.NEGATIVE_INFINITY, 3), 0)).toBeFalsy(); + expect(isValid(I(0, 1), 0)).toBeTruthy(); + }); + }); + describe('size', () => { + it('size is the signed distance between min and max', () => { + expect(size(I(1, 3))).toBe(2); + expect(size(I(11, -3))).toBe(-14); + expect(size(I(1, 1))).toBe(0); + }); + }); + describe('within', () => { + it('within is inclusive on either side', () => { + expect(within(I(10, 30), 10)).toBeTruthy(); + expect(within(I(10, 30), 30)).toBeTruthy(); + expect(within(I(10, 30), 30.0000001)).toBeFalsy(); + // invalid: should always return false + expect(within(I(30, 10), 15)).toBeFalsy(); + expect(within(I(10, 30), 15)).toBeTruthy(); + }); + }); + describe('fixOrder', () => { + it('fixOrder always returns a valid interval if its given interval was finite', () => { + expect(fixOrder(I(3, 1))).toEqual(I(1, 3)); + expect(fixOrder(I(1, 3))).toEqual(I(1, 3)); + // garbo in garbo out + expect(fixOrder(I(Number.NaN, 3))).toEqual(I(Number.NaN, Number.NaN)); + }); + }); + describe('intersection', () => { + it('intersection is the overlap of two intervals, if they are valid', () => { + expect(intersection(I(1, 4), I(3, 5))).toEqual(I(3, 4)); + expect(intersection(I(4, 1), I(3, 5))).toEqual(undefined); + expect(intersection(I(-1, 2), I(3, 5))).toEqual(undefined); + }); + }); + describe('limit', () => { + it('clamp a value into an interval, if the interval is valid', () => { + expect(limit(I(1, 4), 0)).toEqual(1); + expect(limit(I(1, 4), 50)).toEqual(4); + // given interval is invalid, so dont mess with x + expect(limit(I(4, 1), 200)).toEqual(200); + expect(limit(I(1, 4), 2)).toEqual(2); + }); + }); +}); diff --git a/packages/geometry/src/tests/line.test.ts b/packages/geometry/src/tests/line.test.ts index b052247..541902a 100644 --- a/packages/geometry/src/tests/line.test.ts +++ b/packages/geometry/src/tests/line.test.ts @@ -9,14 +9,14 @@ describe('line', () => { }); test('lineSegmentsIntersect finds no intersection', () => { - const firstLine: line= { start: [0, 0] , end: [1, 1] }; - const secondLine: line = { start: [1, 0] , end: [2, 1] }; + const firstLine: line = { start: [0, 0], end: [1, 1] }; + const secondLine: line = { start: [1, 0], end: [2, 1] }; expect(lineSegmentsIntersect(firstLine, secondLine)).toBe(0); }); test('lineSegmentsIntersect finds no intersection for segment that starts on the end of another one', () => { - const firstLine: line = { start: [0, 0] , end: [2, 2] }; - const secondLine: line = { start: [2, 2] , end: [2, 4] }; + const firstLine: line = { start: [0, 0], end: [2, 2] }; + const secondLine: line = { start: [2, 2], end: [2, 4] }; expect(lineSegmentsIntersect(firstLine, secondLine)).toBe(0); }); @@ -31,9 +31,9 @@ describe('line', () => { // Test line ---------- // First line / // / - const testLine: line = { start: [0, 1] , end: [2, 1] }; - const firstLine: line = { start: [0, 0] , end: [1, 1] }; - const secondLine: line = { start: [1, 1] , end: [1, 2] }; + const testLine: line = { start: [0, 1], end: [2, 1] }; + const firstLine: line = { start: [0, 0], end: [1, 1] }; + const secondLine: line = { start: [1, 1], end: [1, 2] }; const firstTest = lineSegmentsIntersect(testLine, firstLine); const secondTest = lineSegmentsIntersect(testLine, secondLine); @@ -44,27 +44,27 @@ describe('line', () => { }); test('lineSegmentsIntersect finds no intersection for coincident line segments when start of one is at end of other', () => { - const firstLine: line = { start: [0, 0] , end: [2, 2] }; - const secondLine: line = { start: [2, 2] , end: [3, 3] }; + const firstLine: line = { start: [0, 0], end: [2, 2] }; + const secondLine: line = { start: [2, 2], end: [3, 3] }; expect(lineSegmentsIntersect(firstLine, secondLine)).toBe(0); }); test('lineSegmentsIntersect finds no intersection for collinear line segments', () => { - const firstLine: line = { start: [0, 0] , end: [1, 1] }; - const secondLine: line = { start: [2, 2] , end: [3, 3] }; + const firstLine: line = { start: [0, 0], end: [1, 1] }; + const secondLine: line = { start: [2, 2], end: [3, 3] }; expect(lineSegmentsIntersect(firstLine, secondLine)).toBe(0); }); test('lineSegmentsIntersect finds no intersection for parallel line segments', () => { - const firstLine: line = { start: [0, 0] , end: [1, 1] }; - const secondLine: line = { start: [0, 1] , end: [1, 2] }; + const firstLine: line = { start: [0, 0], end: [1, 1] }; + const secondLine: line = { start: [0, 1], end: [1, 2] }; expect(lineSegmentsIntersect(firstLine, secondLine)).toBe(0); }); // For our purposes, we don't consider colinear and coincident line segments to intersect test('lineSegmentsIntersect finds 0 intersection for coincident & colinear line segments (WARNING: technically incorrect)', () => { - const firstLine: line = { start: [0, 0] , end: [2, 2] }; - const secondLine: line = { start: [1, 1] , end: [3, 3] }; + const firstLine: line = { start: [0, 0], end: [2, 2] }; + const secondLine: line = { start: [1, 1], end: [3, 3] }; expect(lineSegmentsIntersect(firstLine, secondLine)).toBe(0); }); }); diff --git a/packages/geometry/src/tests/vec2.test.ts b/packages/geometry/src/tests/vec2.test.ts index b550699..afecb78 100644 --- a/packages/geometry/src/tests/vec2.test.ts +++ b/packages/geometry/src/tests/vec2.test.ts @@ -1,135 +1,135 @@ -import { Vec2 } from '../vec2'; -import { describe, expect, test } from 'vitest' -describe('vec2', () => { - test('add', () => { - const result = Vec2.add([2, 3], [4, 5]); - expect(result).toStrictEqual([6, 8]); - }); - - test('sub', () => { - const result = Vec2.sub([2, 3], [4, 5]); - expect(result).toStrictEqual([-2, -2]); - }); - - test('mul', () => { - const result = Vec2.mul([2, 3], [4, 5]); - expect(result).toStrictEqual([8, 15]); - }); - - test('div', () => { - const result = Vec2.div([2, 3], [4, 5]); - expect(result).toStrictEqual([0.5, 0.6]); - }); - test('floor', () => { - expect(Vec2.floor([33.999, -21.00001])).toStrictEqual([33, -22]); - }); - test('ceil', () => { - expect(Vec2.ceil([33.999, -21.00001])).toStrictEqual([34, -21]); - }); - - test('min', () => { - const result = Vec2.min([2, 8], [4, 5]); - expect(result).toStrictEqual([2, 5]); - }); - - test('max', () => { - const result = Vec2.max([2, 8], [4, 5]); - expect(result).toStrictEqual([4, 8]); - }); - - test('scale', () => { - const result = Vec2.scale([2, 3], 2); - expect(result).toStrictEqual([4, 6]); - }); - - test('sum', () => { - const result = Vec2.sum([2, 3]); - expect(result).toBe(5); - }); - - test('minComponent', () => { - const result = Vec2.minComponent([2, 3]); - expect(result).toBe(2); - }); - - test('maxComponent', () => { - const result = Vec2.maxComponent([2, 3]); - expect(result).toBe(3); - }); - test('map', () => { - expect(Vec2.map([0, 0], (_v, i) => i)).toStrictEqual([0, 1]); - }); - - test('dot', () => { - const result = Vec2.dot([2, 3], [4, 5]); - expect(result).toBe(23); - - const resultWithNegatives = Vec2.dot([-2, 3], [2, -4]); - expect(resultWithNegatives).toBe(-16); - }); - - test('length', () => { - const result = Vec2.length([2, 3]); - const length = Math.sqrt(2 * 2 + 3 * 3); - - expect(result).toBe(length); - }); - - test('normalize', () => { - const result = Vec2.normalize([2, 3]); - const length = Math.sqrt(2 * 2 + 3 * 3); - expect(result).toStrictEqual([2 / length, 3 / length]); - - const noLength = Vec2.normalize([0, 0]); - expect(noLength).toStrictEqual([NaN, NaN]); - }); - - test('finite', () => { - const result = Vec2.finite([2, 3]); - expect(result).toBeTruthy(); - - const infinityResult = Vec2.finite([Infinity, 2]); - expect(infinityResult).toBeFalsy(); - - const nanResult = Vec2.finite([NaN, 2]); - expect(nanResult).toBeFalsy(); - }); - - test('any', () => { - const result = Vec2.any([2, 3], (num) => num % 2 === 0); - expect(result).toBeTruthy(); - }); - - test('all', () => { - const result = Vec2.all([2, 3], (num) => num % 2 === 0); - expect(result).toBeFalsy(); - - const result2 = Vec2.all([2, 4], (num) => num % 2 === 0); - expect(result2).toBeTruthy(); - }); - - test('exactlyEqual', () => { - const result = Vec2.exactlyEqual([2, 3], [4, 5]); - expect(result).toBeFalsy(); - - const result2 = Vec2.exactlyEqual([2, 3], [2, 3]); - expect(result2).toBeTruthy(); - }); - test('swizzle', () => { - expect(Vec2.swizzle([111, 222], [1, 1])).toStrictEqual([222, 222]); - expect(Vec2.swizzle([111, 222], [0, 1])).toStrictEqual([111, 222]); - // dangerous cases: - expect(Vec2.swizzle([111, 222], [2, 1])).toStrictEqual([undefined, 222]); - }); - test('isVec2', () => { - const result = Vec2.isVec2([2, 3]); - expect(result).toBeTruthy(); - - const nonVec2 = Vec2.isVec2([1, 2, 3]); - expect(nonVec2).toBeFalsy(); - }); - test('det', () => { - const result = Vec2.det([2, 3], [4, 5]); - expect(result).toBe(-2); - }); -}); +import { Vec2 } from '../vec2'; +import { describe, expect, test } from 'vitest'; +describe('vec2', () => { + test('add', () => { + const result = Vec2.add([2, 3], [4, 5]); + expect(result).toStrictEqual([6, 8]); + }); + + test('sub', () => { + const result = Vec2.sub([2, 3], [4, 5]); + expect(result).toStrictEqual([-2, -2]); + }); + + test('mul', () => { + const result = Vec2.mul([2, 3], [4, 5]); + expect(result).toStrictEqual([8, 15]); + }); + + test('div', () => { + const result = Vec2.div([2, 3], [4, 5]); + expect(result).toStrictEqual([0.5, 0.6]); + }); + test('floor', () => { + expect(Vec2.floor([33.999, -21.00001])).toStrictEqual([33, -22]); + }); + test('ceil', () => { + expect(Vec2.ceil([33.999, -21.00001])).toStrictEqual([34, -21]); + }); + + test('min', () => { + const result = Vec2.min([2, 8], [4, 5]); + expect(result).toStrictEqual([2, 5]); + }); + + test('max', () => { + const result = Vec2.max([2, 8], [4, 5]); + expect(result).toStrictEqual([4, 8]); + }); + + test('scale', () => { + const result = Vec2.scale([2, 3], 2); + expect(result).toStrictEqual([4, 6]); + }); + + test('sum', () => { + const result = Vec2.sum([2, 3]); + expect(result).toBe(5); + }); + + test('minComponent', () => { + const result = Vec2.minComponent([2, 3]); + expect(result).toBe(2); + }); + + test('maxComponent', () => { + const result = Vec2.maxComponent([2, 3]); + expect(result).toBe(3); + }); + test('map', () => { + expect(Vec2.map([0, 0], (_v, i) => i)).toStrictEqual([0, 1]); + }); + + test('dot', () => { + const result = Vec2.dot([2, 3], [4, 5]); + expect(result).toBe(23); + + const resultWithNegatives = Vec2.dot([-2, 3], [2, -4]); + expect(resultWithNegatives).toBe(-16); + }); + + test('length', () => { + const result = Vec2.length([2, 3]); + const length = Math.sqrt(2 * 2 + 3 * 3); + + expect(result).toBe(length); + }); + + test('normalize', () => { + const result = Vec2.normalize([2, 3]); + const length = Math.sqrt(2 * 2 + 3 * 3); + expect(result).toStrictEqual([2 / length, 3 / length]); + + const noLength = Vec2.normalize([0, 0]); + expect(noLength).toStrictEqual([NaN, NaN]); + }); + + test('finite', () => { + const result = Vec2.finite([2, 3]); + expect(result).toBeTruthy(); + + const infinityResult = Vec2.finite([Infinity, 2]); + expect(infinityResult).toBeFalsy(); + + const nanResult = Vec2.finite([NaN, 2]); + expect(nanResult).toBeFalsy(); + }); + + test('any', () => { + const result = Vec2.any([2, 3], (num) => num % 2 === 0); + expect(result).toBeTruthy(); + }); + + test('all', () => { + const result = Vec2.all([2, 3], (num) => num % 2 === 0); + expect(result).toBeFalsy(); + + const result2 = Vec2.all([2, 4], (num) => num % 2 === 0); + expect(result2).toBeTruthy(); + }); + + test('exactlyEqual', () => { + const result = Vec2.exactlyEqual([2, 3], [4, 5]); + expect(result).toBeFalsy(); + + const result2 = Vec2.exactlyEqual([2, 3], [2, 3]); + expect(result2).toBeTruthy(); + }); + test('swizzle', () => { + expect(Vec2.swizzle([111, 222], [1, 1])).toStrictEqual([222, 222]); + expect(Vec2.swizzle([111, 222], [0, 1])).toStrictEqual([111, 222]); + // dangerous cases: + expect(Vec2.swizzle([111, 222], [2, 1])).toStrictEqual([undefined, 222]); + }); + test('isVec2', () => { + const result = Vec2.isVec2([2, 3]); + expect(result).toBeTruthy(); + + const nonVec2 = Vec2.isVec2([1, 2, 3]); + expect(nonVec2).toBeFalsy(); + }); + test('det', () => { + const result = Vec2.det([2, 3], [4, 5]); + expect(result).toBe(-2); + }); +}); diff --git a/packages/geometry/src/tests/vec3.test.ts b/packages/geometry/src/tests/vec3.test.ts index e46c767..c986505 100644 --- a/packages/geometry/src/tests/vec3.test.ts +++ b/packages/geometry/src/tests/vec3.test.ts @@ -1,131 +1,131 @@ -import { Vec3 } from '../vec3'; -import { describe, expect, test } from 'vitest' -describe('Vec3', () => { - test('add', () => { - const result = Vec3.add([2, 3, 4], [4, 5, 6]); - expect(result).toStrictEqual([6, 8, 10]); - }); - - test('sub', () => { - const result = Vec3.sub([2, 3, 4], [4, 5, 6]); - expect(result).toStrictEqual([-2, -2, -2]); - }); - - test('mul', () => { - const result = Vec3.mul([2, 3, 4], [4, 5, 6]); - expect(result).toStrictEqual([8, 15, 24]); - }); - - test('div', () => { - const result = Vec3.div([2, 3, 4], [4, 5, 6]); - expect(result).toStrictEqual([0.5, 0.6, 0.6666666666666666]); - }); - - test('min', () => { - const result = Vec3.min([2, 8, 13], [4, 5, 11]); - expect(result).toStrictEqual([2, 5, 11]); - }); - - test('max', () => { - const result = Vec3.max([2, 8, 13], [4, 5, 11]); - expect(result).toStrictEqual([4, 8, 13]); - }); - test('floor', () => { - expect(Vec3.floor([33.999, -21.00001, 1])).toStrictEqual([33, -22, 1]); - }); - test('ceil', () => { - expect(Vec3.ceil([2, 33.999, -21.00001])).toStrictEqual([2, 34, -21]); - }); - test('scale', () => { - const result = Vec3.scale([2, 3, 4], 2); - expect(result).toStrictEqual([4, 6, 8]); - }); - - test('sum', () => { - const result = Vec3.sum([2, 3, 4]); - expect(result).toBe(9); - }); - - test('minComponent', () => { - const result = Vec3.minComponent([2, 3, 4]); - expect(result).toBe(2); - }); - - test('maxComponent', () => { - const result = Vec3.maxComponent([2, 3, 4]); - expect(result).toBe(4); - }); - test('map', () => { - expect(Vec3.map([0, 0, 33], (_v, i) => i)).toStrictEqual([0, 1, 2]); - }); - test('dot', () => { - const result = Vec3.dot([2, 3, 4], [4, 5, 6]); - expect(result).toBe(47); - - const resultWithNegatives = Vec3.dot([-2, 3, 4], [2, -4, 5]); - expect(resultWithNegatives).toBe(4); - }); - - test('length', () => { - const result = Vec3.length([2, 3, 4]); - const length = Math.sqrt(2 * 2 + 3 * 3 + 4 * 4); - - expect(result).toBe(length); - }); - - test('normalize', () => { - const result = Vec3.normalize([2, 3, 4]); - const length = Math.sqrt(2 * 2 + 3 * 3 + 4 * 4); - expect(result).toStrictEqual([2 / length, 3 / length, 4 / length]); - - const noLength = Vec3.normalize([0, 0, 0]); - expect(noLength).toStrictEqual([NaN, NaN, NaN]); - }); - - test('finite', () => { - const result = Vec3.finite([2, 3, 4]); - expect(result).toBeTruthy(); - - const infinityResult = Vec3.finite([Infinity, 2, 3]); - expect(infinityResult).toBeFalsy(); - - const nanResult = Vec3.finite([NaN, 2, 3]); - expect(nanResult).toBeFalsy(); - }); - - test('any', () => { - const result = Vec3.any([2, 3, 4], (num) => num % 2 === 0); - expect(result).toBeTruthy(); - }); - - test('all', () => { - const result = Vec3.all([2, 3, 4], (num) => num % 2 === 0); - expect(result).toBeFalsy(); - - const result2 = Vec3.all([2, 4, 6], (num) => num % 2 === 0); - expect(result2).toBeTruthy(); - }); - - test('exactlyEqual', () => { - const result = Vec3.exactlyEqual([2, 3, 4], [4, 5, 6]); - expect(result).toBeFalsy(); - - const result2 = Vec3.exactlyEqual([2, 3, 4], [2, 3, 4]); - expect(result2).toBeTruthy(); - }); - test('swizzle', () => { - expect(Vec3.swizzle([111, 222, 33], [2, 1, 2])).toStrictEqual([33, 222, 33]); - expect(Vec3.swizzle([111, 222, 33], [0, 1, 0])).toStrictEqual([111, 222, 111]); - // dangerous cases: - expect(Vec3.swizzle([111, 222, 33], [2, 1, 3])).toStrictEqual([33, 222, undefined]); - }); - test('xy', () => { - const result = Vec3.xy([2, 3, 4]); - expect(result).toStrictEqual([2, 3]); - }); - test('isVec3', () => { - expect(Vec3.isVec3([1, 2, 3])).toBeTruthy(); - expect(Vec3.isVec3([1, 2, 2, 3])).toBeFalsy(); - expect(Vec3.isVec3([1, 2])).toBeFalsy(); - }); -}); +import { Vec3 } from '../vec3'; +import { describe, expect, test } from 'vitest'; +describe('Vec3', () => { + test('add', () => { + const result = Vec3.add([2, 3, 4], [4, 5, 6]); + expect(result).toStrictEqual([6, 8, 10]); + }); + + test('sub', () => { + const result = Vec3.sub([2, 3, 4], [4, 5, 6]); + expect(result).toStrictEqual([-2, -2, -2]); + }); + + test('mul', () => { + const result = Vec3.mul([2, 3, 4], [4, 5, 6]); + expect(result).toStrictEqual([8, 15, 24]); + }); + + test('div', () => { + const result = Vec3.div([2, 3, 4], [4, 5, 6]); + expect(result).toStrictEqual([0.5, 0.6, 0.6666666666666666]); + }); + + test('min', () => { + const result = Vec3.min([2, 8, 13], [4, 5, 11]); + expect(result).toStrictEqual([2, 5, 11]); + }); + + test('max', () => { + const result = Vec3.max([2, 8, 13], [4, 5, 11]); + expect(result).toStrictEqual([4, 8, 13]); + }); + test('floor', () => { + expect(Vec3.floor([33.999, -21.00001, 1])).toStrictEqual([33, -22, 1]); + }); + test('ceil', () => { + expect(Vec3.ceil([2, 33.999, -21.00001])).toStrictEqual([2, 34, -21]); + }); + test('scale', () => { + const result = Vec3.scale([2, 3, 4], 2); + expect(result).toStrictEqual([4, 6, 8]); + }); + + test('sum', () => { + const result = Vec3.sum([2, 3, 4]); + expect(result).toBe(9); + }); + + test('minComponent', () => { + const result = Vec3.minComponent([2, 3, 4]); + expect(result).toBe(2); + }); + + test('maxComponent', () => { + const result = Vec3.maxComponent([2, 3, 4]); + expect(result).toBe(4); + }); + test('map', () => { + expect(Vec3.map([0, 0, 33], (_v, i) => i)).toStrictEqual([0, 1, 2]); + }); + test('dot', () => { + const result = Vec3.dot([2, 3, 4], [4, 5, 6]); + expect(result).toBe(47); + + const resultWithNegatives = Vec3.dot([-2, 3, 4], [2, -4, 5]); + expect(resultWithNegatives).toBe(4); + }); + + test('length', () => { + const result = Vec3.length([2, 3, 4]); + const length = Math.sqrt(2 * 2 + 3 * 3 + 4 * 4); + + expect(result).toBe(length); + }); + + test('normalize', () => { + const result = Vec3.normalize([2, 3, 4]); + const length = Math.sqrt(2 * 2 + 3 * 3 + 4 * 4); + expect(result).toStrictEqual([2 / length, 3 / length, 4 / length]); + + const noLength = Vec3.normalize([0, 0, 0]); + expect(noLength).toStrictEqual([NaN, NaN, NaN]); + }); + + test('finite', () => { + const result = Vec3.finite([2, 3, 4]); + expect(result).toBeTruthy(); + + const infinityResult = Vec3.finite([Infinity, 2, 3]); + expect(infinityResult).toBeFalsy(); + + const nanResult = Vec3.finite([NaN, 2, 3]); + expect(nanResult).toBeFalsy(); + }); + + test('any', () => { + const result = Vec3.any([2, 3, 4], (num) => num % 2 === 0); + expect(result).toBeTruthy(); + }); + + test('all', () => { + const result = Vec3.all([2, 3, 4], (num) => num % 2 === 0); + expect(result).toBeFalsy(); + + const result2 = Vec3.all([2, 4, 6], (num) => num % 2 === 0); + expect(result2).toBeTruthy(); + }); + + test('exactlyEqual', () => { + const result = Vec3.exactlyEqual([2, 3, 4], [4, 5, 6]); + expect(result).toBeFalsy(); + + const result2 = Vec3.exactlyEqual([2, 3, 4], [2, 3, 4]); + expect(result2).toBeTruthy(); + }); + test('swizzle', () => { + expect(Vec3.swizzle([111, 222, 33], [2, 1, 2])).toStrictEqual([33, 222, 33]); + expect(Vec3.swizzle([111, 222, 33], [0, 1, 0])).toStrictEqual([111, 222, 111]); + // dangerous cases: + expect(Vec3.swizzle([111, 222, 33], [2, 1, 3])).toStrictEqual([33, 222, undefined]); + }); + test('xy', () => { + const result = Vec3.xy([2, 3, 4]); + expect(result).toStrictEqual([2, 3]); + }); + test('isVec3', () => { + expect(Vec3.isVec3([1, 2, 3])).toBeTruthy(); + expect(Vec3.isVec3([1, 2, 2, 3])).toBeFalsy(); + expect(Vec3.isVec3([1, 2])).toBeFalsy(); + }); +}); diff --git a/packages/geometry/src/tests/vec4.test.ts b/packages/geometry/src/tests/vec4.test.ts index ffcd6a0..e053f90 100644 --- a/packages/geometry/src/tests/vec4.test.ts +++ b/packages/geometry/src/tests/vec4.test.ts @@ -1,5 +1,5 @@ import { Vec4 } from '../vec4'; -import { describe, expect, test } from 'vitest' +import { describe, expect, test } from 'vitest'; describe('Vec4', () => { test('add', () => { const result = Vec4.add([2, 3, 4, 5], [4, 5, 6, 7]); diff --git a/packages/geometry/src/vec5.ts b/packages/geometry/src/vec5.ts index 54bab15..5bcd4d6 100644 --- a/packages/geometry/src/vec5.ts +++ b/packages/geometry/src/vec5.ts @@ -1,5 +1,5 @@ -import { VectorLibFactory } from "./vector"; - -export type vec5 = readonly [number, number, number, number, number]; - -export const Vec5 = VectorLibFactory(); +import { VectorLibFactory } from './vector'; + +export type vec5 = readonly [number, number, number, number, number]; + +export const Vec5 = VectorLibFactory(); diff --git a/packages/geometry/src/vector.ts b/packages/geometry/src/vector.ts index d53f58a..b6671b5 100644 --- a/packages/geometry/src/vector.ts +++ b/packages/geometry/src/vector.ts @@ -1,163 +1,163 @@ -// this is a utility file for producing 'libraries' that provide basic math operations -// on short vectors. The vectors here are readonly tuples of numbers - -// I think vectors are more like numbers than objects, so immutable 'value semantics' makes -// much more sense to me. -// furthermore, I have all the 'methods' that would act on a class of vectors in a separate -// object, more like a module. I like the data to be plain old data - its immutability -// makes it easy to stash in redux, and Pojo's can be serialized (or copied to a web-worker) -// very easily. -// its also, IMHO, very slightly more flexible - these libraries just operate on readonly arrays - -// no need to extend any interfaces, no need to buy into my world view - its easy to just pass in -// a literal array on the fly (eg. add([1,1], someOtherVector)) -// anyway - probably start at the end of this file - -// the type VectorLib and the factory that produces libraries for a given vector type (1d, 2d... 66d etc) -// if you want to see on in action, check out vec2.ts - -type binOp = (a: T, b: T) => T; -type scalarOp = (a: T, scalar: number) => T; -type reduceOp = (a: T) => number; -type unaryOp = (a: T) => T; -type predOp = (a: T) => boolean; -type VectorConstraint = ReadonlyArray; -function componentOpFn(op: binOp): binOp { - return (a: T, b: T) => { - const r: Array = [...a]; - for (let i = 0; i < a.length; i += 1) { - r[i] = op(a[i], b[i]); - } - // its fine - we're trying to present things as though they are readonly, immutable - // static-length arrays of numbers, all in the service of semi-generic vector convenience... - return r as unknown as T; - }; -} -function componentUnaryOpFn(op: unaryOp): unaryOp { - return (a: T) => { - const r: Array = [...a]; - for (let i = 0; i < a.length; i += 1) { - r[i] = op(a[i]); - } - // its fine - we're trying to present things as though they are readonly, immutable - // static-length arrays of numbers, all in the service of semi-generic vector convenience... - return r as unknown as T; - }; -} -function reduceComponentOpFn(op: binOp): reduceOp { - return (a: T) => { - let r: number = a[0]; - for (let i = 1; i < a.length; i += 1) { - r = op(r, a[i]); - } - return r; - }; -} -function scalarOpFn(op: scalarOp): scalarOp { - return (a: T, scalar: number) => { - const r: Array = [...a]; - for (let i = 0; i < a.length; i += 1) { - r[i] = op(a[i], scalar); - } - // its fine - we're trying to present things as though they are readonly, immutable - // static-length arrays of numbers, all in the service of semi-generic vector convenience... - return r as unknown as T; - }; -} - -function allCmp(op: predOp): predOp { - return (a: T) => { - let truth = true; - for (let i = 0; i < a.length; i += 1) { - truth = truth && op(a[i]); - } - return truth; - }; -} -function anyCmp(op: predOp): predOp { - return (a: T) => { - let truth = false; - for (let i = 0; i < a.length; i += 1) { - truth = truth || op(a[i]); - } - return truth; - }; -} - -export type VectorLib = Readonly<{ - add: binOp; - sub: binOp; - mul: binOp; - div: binOp; - min: binOp; - map: (v: T, op: (c: number, index: number) => number) => T; - max: binOp; - minComponent: reduceOp; - maxComponent: reduceOp; - floor: unaryOp; - ceil: unaryOp; - scale: scalarOp; - mix: (a: T, b: T, p: number) => T; - sum: reduceOp; - dot: (a: T, b: T) => number; - length: reduceOp; - normalize: unaryOp; - finite: predOp; - any: (v: T, op: (c: number) => boolean) => boolean; - all: (v: T, op: (c: number) => boolean) => boolean; - exactlyEqual: (a: T, b: T) => boolean; - swizzle: binOp; -}>; -// see the rambling at the top of this file for more details -// TLDR: return a module with functions that perform basic math -// on vectors, where vector means an immutable array of numbers with a known length -// note that this function will generate a library suitable for any length of vector - -// just pass its type (eg. readonly [number,number,number]) as the generic V -export function VectorLibFactory(): VectorLib { - const add = componentOpFn((a, b) => a + b); - const sub = componentOpFn((a, b) => a - b); - const mul = componentOpFn((a, b) => a * b); - const div = componentOpFn((a, b) => a / b); - const min = componentOpFn((a, b) => Math.min(a, b)); - const max = componentOpFn((a, b) => Math.max(a, b)); - const floor = componentUnaryOpFn((a) => Math.floor(a)); - const ceil = componentUnaryOpFn((a) => Math.ceil(a)); - const scale = scalarOpFn((a, b) => a * b); - const mix = (a: V, b: V, p: number) => add(scale(a, 1.0 - p), scale(b, p)); - const sum = reduceComponentOpFn((a, b) => a + b); - const minComponent = reduceComponentOpFn((a, b) => Math.min(a, b)); - const maxComponent = reduceComponentOpFn((a, b) => Math.max(a, b)); - const dot = (a: V, b: V) => sum(mul(a, b)); - const length = (a: V) => Math.sqrt(sum(mul(a, a))); - const normalize = (a: V) => scale(a, 1.0 / length(a)); - const finite = allCmp((a) => Number.isFinite(a)); // no NaNs, no +- Infinities - const any = (vec: V, op: predOp) => anyCmp(op)(vec); - const all = (vec: V, op: predOp) => allCmp(op)(vec); - const exactlyEqual = (a: V, b: V) => all(sub(a, b), (v) => v === 0); - const map = (v: V, fn: (c: number, index: number) => number) => v.map(fn) as unknown as V; - // return a re-indexed vector - for example - // swizzle([33,22,11], [1,1,0])==> [22,22,33] - // note that passing invalid indexes will result in values of undefined in affected components of the result - const swizzle = (v: V, index: V) => index.map((i) => v[i]) as unknown as V; - return { - add, - sub, - mul, - div, - min, - map, - max, - minComponent, - maxComponent, - floor, - ceil, - scale, - mix, - sum, - dot, - length, - normalize, - finite, - any, - all, - exactlyEqual, - swizzle, - }; -} +// this is a utility file for producing 'libraries' that provide basic math operations +// on short vectors. The vectors here are readonly tuples of numbers - +// I think vectors are more like numbers than objects, so immutable 'value semantics' makes +// much more sense to me. +// furthermore, I have all the 'methods' that would act on a class of vectors in a separate +// object, more like a module. I like the data to be plain old data - its immutability +// makes it easy to stash in redux, and Pojo's can be serialized (or copied to a web-worker) +// very easily. +// its also, IMHO, very slightly more flexible - these libraries just operate on readonly arrays - +// no need to extend any interfaces, no need to buy into my world view - its easy to just pass in +// a literal array on the fly (eg. add([1,1], someOtherVector)) +// anyway - probably start at the end of this file - +// the type VectorLib and the factory that produces libraries for a given vector type (1d, 2d... 66d etc) +// if you want to see on in action, check out vec2.ts + +type binOp = (a: T, b: T) => T; +type scalarOp = (a: T, scalar: number) => T; +type reduceOp = (a: T) => number; +type unaryOp = (a: T) => T; +type predOp = (a: T) => boolean; +type VectorConstraint = ReadonlyArray; +function componentOpFn(op: binOp): binOp { + return (a: T, b: T) => { + const r: Array = [...a]; + for (let i = 0; i < a.length; i += 1) { + r[i] = op(a[i], b[i]); + } + // its fine - we're trying to present things as though they are readonly, immutable + // static-length arrays of numbers, all in the service of semi-generic vector convenience... + return r as unknown as T; + }; +} +function componentUnaryOpFn(op: unaryOp): unaryOp { + return (a: T) => { + const r: Array = [...a]; + for (let i = 0; i < a.length; i += 1) { + r[i] = op(a[i]); + } + // its fine - we're trying to present things as though they are readonly, immutable + // static-length arrays of numbers, all in the service of semi-generic vector convenience... + return r as unknown as T; + }; +} +function reduceComponentOpFn(op: binOp): reduceOp { + return (a: T) => { + let r: number = a[0]; + for (let i = 1; i < a.length; i += 1) { + r = op(r, a[i]); + } + return r; + }; +} +function scalarOpFn(op: scalarOp): scalarOp { + return (a: T, scalar: number) => { + const r: Array = [...a]; + for (let i = 0; i < a.length; i += 1) { + r[i] = op(a[i], scalar); + } + // its fine - we're trying to present things as though they are readonly, immutable + // static-length arrays of numbers, all in the service of semi-generic vector convenience... + return r as unknown as T; + }; +} + +function allCmp(op: predOp): predOp { + return (a: T) => { + let truth = true; + for (let i = 0; i < a.length; i += 1) { + truth = truth && op(a[i]); + } + return truth; + }; +} +function anyCmp(op: predOp): predOp { + return (a: T) => { + let truth = false; + for (let i = 0; i < a.length; i += 1) { + truth = truth || op(a[i]); + } + return truth; + }; +} + +export type VectorLib = Readonly<{ + add: binOp; + sub: binOp; + mul: binOp; + div: binOp; + min: binOp; + map: (v: T, op: (c: number, index: number) => number) => T; + max: binOp; + minComponent: reduceOp; + maxComponent: reduceOp; + floor: unaryOp; + ceil: unaryOp; + scale: scalarOp; + mix: (a: T, b: T, p: number) => T; + sum: reduceOp; + dot: (a: T, b: T) => number; + length: reduceOp; + normalize: unaryOp; + finite: predOp; + any: (v: T, op: (c: number) => boolean) => boolean; + all: (v: T, op: (c: number) => boolean) => boolean; + exactlyEqual: (a: T, b: T) => boolean; + swizzle: binOp; +}>; +// see the rambling at the top of this file for more details +// TLDR: return a module with functions that perform basic math +// on vectors, where vector means an immutable array of numbers with a known length +// note that this function will generate a library suitable for any length of vector - +// just pass its type (eg. readonly [number,number,number]) as the generic V +export function VectorLibFactory(): VectorLib { + const add = componentOpFn((a, b) => a + b); + const sub = componentOpFn((a, b) => a - b); + const mul = componentOpFn((a, b) => a * b); + const div = componentOpFn((a, b) => a / b); + const min = componentOpFn((a, b) => Math.min(a, b)); + const max = componentOpFn((a, b) => Math.max(a, b)); + const floor = componentUnaryOpFn((a) => Math.floor(a)); + const ceil = componentUnaryOpFn((a) => Math.ceil(a)); + const scale = scalarOpFn((a, b) => a * b); + const mix = (a: V, b: V, p: number) => add(scale(a, 1.0 - p), scale(b, p)); + const sum = reduceComponentOpFn((a, b) => a + b); + const minComponent = reduceComponentOpFn((a, b) => Math.min(a, b)); + const maxComponent = reduceComponentOpFn((a, b) => Math.max(a, b)); + const dot = (a: V, b: V) => sum(mul(a, b)); + const length = (a: V) => Math.sqrt(sum(mul(a, a))); + const normalize = (a: V) => scale(a, 1.0 / length(a)); + const finite = allCmp((a) => Number.isFinite(a)); // no NaNs, no +- Infinities + const any = (vec: V, op: predOp) => anyCmp(op)(vec); + const all = (vec: V, op: predOp) => allCmp(op)(vec); + const exactlyEqual = (a: V, b: V) => all(sub(a, b), (v) => v === 0); + const map = (v: V, fn: (c: number, index: number) => number) => v.map(fn) as unknown as V; + // return a re-indexed vector - for example + // swizzle([33,22,11], [1,1,0])==> [22,22,33] + // note that passing invalid indexes will result in values of undefined in affected components of the result + const swizzle = (v: V, index: V) => index.map((i) => v[i]) as unknown as V; + return { + add, + sub, + mul, + div, + min, + map, + max, + minComponent, + maxComponent, + floor, + ceil, + scale, + mix, + sum, + dot, + length, + normalize, + finite, + any, + all, + exactlyEqual, + swizzle, + }; +} diff --git a/packages/geometry/tsconfig.json b/packages/geometry/tsconfig.json index da9a8ea..e0b8abd 100644 --- a/packages/geometry/tsconfig.json +++ b/packages/geometry/tsconfig.json @@ -1,22 +1,13 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "paths": { - "~/*": [ - "./*" - ] - }, - "module": "ES2022", - "target": "ES2022", - "lib": [ - "es2022" - ], - }, - "include": [ - "./src/index.ts" - ], - "exclude": [ - "tests/", - "**/*.test.ts" - ] -} \ No newline at end of file +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "paths": { + "~/*": ["./*"] + }, + "module": "ES2022", + "target": "ES2022", + "lib": ["es2022"] + }, + "include": ["./src/index.ts"], + "exclude": ["tests/", "**/*.test.ts"] +} diff --git a/packages/scatterbrain/package.json b/packages/scatterbrain/package.json index f53f3f3..941b8a9 100644 --- a/packages/scatterbrain/package.json +++ b/packages/scatterbrain/package.json @@ -1,61 +1,61 @@ { - "name": "@alleninstitute/vis-scatterbrain", - "version": "0.0.3", - "contributors": [ - { - "name": "Lane Sawyer", - "email": "lane.sawyer@alleninstitute.org" + "name": "@alleninstitute/vis-scatterbrain", + "version": "0.0.3", + "contributors": [ + { + "name": "Lane Sawyer", + "email": "lane.sawyer@alleninstitute.org" + }, + { + "name": "James Gerstenberger", + "email": "james.gerstenberger@alleninstitute.org" + }, + { + "name": "Noah Shepard", + "email": "noah.shepard@alleninstitute.org" + }, + { + "name": "Skyler Moosman", + "email": "skyler.moosman@alleninstitute.org" + }, + { + "name": "Su Li", + "email": "su.li@alleninstitute.org" + } + ], + "license": "TBD", + "source": "src/index.ts", + "main": "dist/main.js", + "module": "dist/module.js", + "types": "dist/types.d.ts", + "files": [ + "dist" + ], + "scripts": { + "preinstall": "npx only-allow pnpm", + "typecheck": "tsc --noEmit", + "build": "parcel build --no-cache", + "watch": "parcel watch", + "test": "vitest --watch" }, - { - "name": "James Gerstenberger", - "email": "james.gerstenberger@alleninstitute.org" + "repository": { + "type": "git", + "url": "https://github.com/AllenInstitute/vis.git" }, - { - "name": "Noah Shepard", - "email": "noah.shepard@alleninstitute.org" + "publishConfig": { + "registry": "https://npm.pkg.github.com/AllenInstitute" }, - { - "name": "Skyler Moosman", - "email": "skyler.moosman@alleninstitute.org" + "devDependencies": { + "@parcel/packager-ts": "^2.12.0", + "@parcel/transformer-typescript-types": "^2.12.0", + "@types/lodash": "^4.14.202", + "parcel": "2.12.0", + "typescript": "^5.3.3", + "vitest": "^1.4.0" }, - { - "name": "Su Li", - "email": "su.li@alleninstitute.org" + "dependencies": { + "@alleninstitute/vis-geometry": "workspace:*", + "lodash": "^4.17.21", + "regl": "^2.1.0" } - ], - "license": "TBD", - "source": "src/index.ts", - "main": "dist/main.js", - "module": "dist/module.js", - "types": "dist/types.d.ts", - "files": [ - "dist" - ], - "scripts": { - "preinstall": "npx only-allow pnpm", - "typecheck": "tsc --noEmit", - "build": "parcel build --no-cache", - "watch": "parcel watch", - "test": "vitest --watch" - }, - "repository": { - "type": "git", - "url": "https://github.com/AllenInstitute/vis.git" - }, - "publishConfig": { - "registry": "https://npm.pkg.github.com/AllenInstitute" - }, - "devDependencies": { - "@parcel/packager-ts": "^2.12.0", - "@parcel/transformer-typescript-types": "^2.12.0", - "@types/lodash": "^4.14.202", - "parcel": "2.12.0", - "typescript": "^5.3.3", - "vitest": "^1.4.0" - }, - "dependencies": { - "@alleninstitute/vis-geometry": "workspace:*", - "lodash": "^4.17.21", - "regl": "^2.1.0" - } -} \ No newline at end of file +} diff --git a/packages/scatterbrain/src/dataset-cache.ts b/packages/scatterbrain/src/dataset-cache.ts index 447abe3..6cab4c8 100644 --- a/packages/scatterbrain/src/dataset-cache.ts +++ b/packages/scatterbrain/src/dataset-cache.ts @@ -1,260 +1,275 @@ -type MaybePromise = D | Promise; -type RecordKey = string | number | symbol -export interface AsyncCache { - isCached(k: CacheKey): boolean; - getCachedUNSAFE(k: CacheKey): D | undefined; - cacheAndUse(workingSet: Record Promise>, use: (items: Record) => void, cacheKey: (semantic: SemanticKey) => CacheKey): cancelFn | undefined; -} - -type useFn = (items: Record) => void; -type cancelFn = () => void; -type MutablePendingRequest = { - runner: useFn; - awaiting: Map>; - blocking: Set; // these are the cache keys associated with the items in 'ready' - we keep them around to make it easy to make sure we dont delete something we assume we have - // while an outstanding task is waiting on more data - ready: Record; -} -// return true if the request is completely satisfied, false if its still awaiting more entries -function updatePendingRequest(req: MutablePendingRequest, key: SemanticKey, cacheKey: CacheKey, item: D): boolean { - if (req.awaiting.has(cacheKey)) { - const remaningAwaited = req.awaiting.get(cacheKey); - // we just fullfilled one - remove it from awaiting - remaningAwaited?.delete(key); - if ((remaningAwaited?.size ?? 0) < 1) { - req.awaiting.delete(cacheKey); - } - req.blocking.add(cacheKey); - req.ready[key] = item; - } - return req.awaiting.size === 0 -} -type MutableCacheEntry = { - data: MaybePromise; - lastRequestedTimestamp: number; -}; - -/** - * `AsyncDataCache` asynchronous data cache, useful for minimizing network requests by caching the results of - * a network request and returning the cached result if the request has already been made previously - * for a given key. - * - * It is generalizable over any type of data. - * - * @example - * const getMyData = ()=>fetch('https://example.com/data.json'); - * myCache.cache('myKey', getMyData).then((data)=>{console.log('its here now (and we cached it) ', data)}); - * } - - */ -export class AsyncDataCache implements AsyncCache { - private limit: number; - private size: (d: D) => number; - private destroyer: (d: D) => void; - private entries: Map>; - private pendingRequests: Set>; - - /** - * the intended use of this cache is to store resources used for rendering. Because the specific contents are generic, a simple interface must be provided - * to support LRU cache eviction - * occasionally, it can be necessary to manage these resources more explicitly (see https://stackoverflow.com/a/31250301 for a great example) - * @param destroy a function which safely releases the resources owned by an entry in this cache - for normal garbage-collected objects, a no-op function will suffice. - * @param size a function which returns the size of a resource - this is used only in relation to the cacheLimit - * @param cacheLimit a limit (in whatever units are returned by the size() parameter) to place on cache contents - * note that this limit is not a hard limit - old entries are evicted when new data is fetched, but the limit may be exceeded occasionally - * a reasonable implementation may simply return 1 for size, and a desired occupancy count for the limit - */ - constructor(destroy: (data: D) => void, size: (data: D) => number, cacheLimit: number) { - this.size = size; - this.destroyer = destroy; - this.limit = cacheLimit; - this.entries = new Map>(); - this.pendingRequests = new Set>(); - } - private usedSpace() { - // Map uses iterators, so we're in for-loop territory here - let sum = 0; - this.entries.forEach((entry) => (sum += entry.data instanceof Promise ? 0 : this.size(entry.data))); - return sum; - } - private countRequests() { - const reqCounts: Record = {} as Record - for (const req of this.pendingRequests) { - for (const key of [...req.blocking, ...req.awaiting.keys()]) { - if (!reqCounts[key]) { - reqCounts[key] = 0; - } - reqCounts[key] += 1; - } - } - return reqCounts; - } - // if the cache is full, sort candidates which are not currently requested by their last-used timestamps - // evict those items until the cache is no longer full - private evictIfFull() { - // find entries which have 0 pending requests, and are not themselves promises... - let used = this.usedSpace(); - const candidates: { key: CacheKey; data: D; lastRequestedTimestamp: number }[] = []; - if (used > this.limit) { - // its potentially a bit slow to do this: - const counts = this.countRequests(); - this.entries.forEach((entry, key) => { - if (!(entry.data instanceof Promise) && (counts[key] ?? 0) < 1) { - candidates.push({ key, data: entry.data, lastRequestedTimestamp: entry.lastRequestedTimestamp }); - } - }); - const priority = candidates.sort((a, b) => a.lastRequestedTimestamp - b.lastRequestedTimestamp); - for (const evictMe of priority) { - used -= this.size(evictMe.data); - this.destroyer(evictMe.data); - this.entries.delete(evictMe.key); - if (used < this.limit) { - return; - } - } - } - } - - /** - * `isCached` checks if the entry is in the cache with a resolved promise. - * - * @param key The entry key to check for in the cache - * @returns True if the entry in the cache has been resolved, false if there is no entry with that key or the promise is still pending - */ - isCached(key: CacheKey): boolean { - // the key exists, and the value associated is not a promise - return this.entries.has(key) && !(this.entries.get(key)?.data instanceof Promise); - } - - /** - * `areKeysAllCached` checks if all the keys provided are in the cache with resolved promises. - * - * Useful for checking if all the data needed for a particular operation is already in the cache. - * - * @param cacheKeys A list of keys to check for in the cache - * @returns True if all keys are cached, false if any are not in the cache - */ - areKeysAllCached(cacheKeys: readonly CacheKey[]): boolean { - return cacheKeys.every((key) => this.isCached(key)); - } - - /** - * @deprecated to alert (external) users to avoid calling this! - * `getCachedUNSAFE` gets an entry from the cache for the given key (if the promise is resolved). - * because of how eviction works - this method should be considered unsafe! consider the following - * @example - * const entry = cache.getCachedUnsafe('whatever') - * const otherStuff = await fetch('....') - * ... more code - * doSomethingCool(entry, otherStuff) - * - * by the time the caller gets to the doSomethingCool call, the resources bound to the cache entry - * may have been disposed! - * do note that if you use a cache-entry synchronously (no awaits!) after requesting it, you're likely to not - * encounter any issues, however its a much more robust practice to simply refactor like so: - * - * const otherStuff = await fetch('...') - * cache.cacheAndUse({...}, (...args)=>doSomethingCool(otherStuff, ..args), ...) - * - * @param key Entry key to look up in the cache - * @returns The entry (D) if it is present, or undefined if it is not - */ - getCachedUNSAFE(key: CacheKey): D | undefined { - const entry = this.entries.get(key); - if (!entry) return undefined; - - entry.lastRequestedTimestamp = performance.now(); - return entry.data instanceof Promise ? undefined : entry?.data; - } - getNumPendingTasks(): number { - return this.pendingRequests.size; - } - private dataArrived(key: SemanticKey, cacheKey: CacheKey, data: D) { - this.evictIfFull(); // we just got some data - is there room in the cache? - const mutableEntry = this.entries.get(cacheKey); - if (mutableEntry) { - mutableEntry.data = data; - } - const removeUs: MutablePendingRequest[] = [] - for (const req of this.pendingRequests) { - if (updatePendingRequest(req, key, cacheKey, data)) { - req.runner(req.ready); - removeUs.push(req); - } - } - removeUs.forEach(finished => this.pendingRequests.delete(finished)); - } - private prepareCache(semanticKey: SemanticKey, cacheKey: CacheKey, getter: () => Promise) { - let promise: Promise - let entry = this.entries.get(cacheKey); - const data = entry?.data; - // we either return early (data is cached) - // or we initialize promise (either getter() or a pre-existing request for the same cachekey) - // if we dont return early, we hook up a call to dataArrived to promise - if (data) { - if (data instanceof Promise) { - promise = data; - } else { - // we could simply "return data" - // however getCachedUnsafe updates its "last-requested timestamp" - return this.getCachedUNSAFE(cacheKey)! - } - } else { - promise = getter(); - this.entries.set(cacheKey, { - data: promise, - lastRequestedTimestamp: performance.now(), - }) - } - return promise.then((data) => { - this.dataArrived(semanticKey, cacheKey, data); - }) - } - cacheAndUse(workingSet: Record Promise>, use: (items: Record) => void, toCacheKey: (semanticKey: SemanticKey) => CacheKey, taskFinished?: () => void): cancelFn | undefined { - const keys: SemanticKey[] = Object.keys(workingSet) as SemanticKey[] - const req: MutablePendingRequest = { - awaiting: new Map>(), - ready: {} as Record, - runner: use, - blocking: new Set() - } - keys.forEach((k) => { - if (req.awaiting.has(toCacheKey(k))) { - req.awaiting.get(toCacheKey(k))?.add(k); - } else { - req.awaiting.set(toCacheKey(k), new Set([k])) - } - }) - for (const semanticKey of keys) { - const result = this.prepareCache(semanticKey, toCacheKey(semanticKey), workingSet[semanticKey]) - if (result instanceof Promise) { - const prom = taskFinished !== undefined ? result.then(taskFinished) : result; - prom.catch((_reason) => { - // delete the failed entry from the cache - // also remove the entire request it belongs to - this.entries.delete(toCacheKey(semanticKey)); - this.pendingRequests.delete(req); - // note that catches get chained - so any catch handlers that came in with this promise - // still get called - }) - } else { - if (updatePendingRequest(req, semanticKey, toCacheKey(semanticKey), result)) { - use(req.ready); - if (taskFinished !== undefined) { - Promise.resolve().then(taskFinished); // we did the task synchronously... - } - - // early return in the case that everything was cached! - // the only thing this short-circuits is pendingRequests.add(req) - // (because of course it isn't pending, because we just did it!) - return undefined; - } - } - } - this.pendingRequests.add(req); - return () => { - this.pendingRequests.delete(req); - } - } - -} +type MaybePromise = D | Promise; +type RecordKey = string | number | symbol; +export interface AsyncCache { + isCached(k: CacheKey): boolean; + getCachedUNSAFE(k: CacheKey): D | undefined; + cacheAndUse( + workingSet: Record Promise>, + use: (items: Record) => void, + cacheKey: (semantic: SemanticKey) => CacheKey + ): cancelFn | undefined; +} + +type useFn = (items: Record) => void; +type cancelFn = () => void; +type MutablePendingRequest = { + runner: useFn; + awaiting: Map>; + blocking: Set; // these are the cache keys associated with the items in 'ready' - we keep them around to make it easy to make sure we dont delete something we assume we have + // while an outstanding task is waiting on more data + ready: Record; +}; +// return true if the request is completely satisfied, false if its still awaiting more entries +function updatePendingRequest( + req: MutablePendingRequest, + key: SemanticKey, + cacheKey: CacheKey, + item: D +): boolean { + if (req.awaiting.has(cacheKey)) { + const remaningAwaited = req.awaiting.get(cacheKey); + // we just fullfilled one - remove it from awaiting + remaningAwaited?.delete(key); + if ((remaningAwaited?.size ?? 0) < 1) { + req.awaiting.delete(cacheKey); + } + req.blocking.add(cacheKey); + req.ready[key] = item; + } + return req.awaiting.size === 0; +} +type MutableCacheEntry = { + data: MaybePromise; + lastRequestedTimestamp: number; +}; + +/** + * `AsyncDataCache` asynchronous data cache, useful for minimizing network requests by caching the results of + * a network request and returning the cached result if the request has already been made previously + * for a given key. + * + * It is generalizable over any type of data. + * + * @example + * const getMyData = ()=>fetch('https://example.com/data.json'); + * myCache.cache('myKey', getMyData).then((data)=>{console.log('its here now (and we cached it) ', data)}); + * } + + */ +export class AsyncDataCache + implements AsyncCache +{ + private limit: number; + private size: (d: D) => number; + private destroyer: (d: D) => void; + private entries: Map>; + private pendingRequests: Set>; + + /** + * the intended use of this cache is to store resources used for rendering. Because the specific contents are generic, a simple interface must be provided + * to support LRU cache eviction + * occasionally, it can be necessary to manage these resources more explicitly (see https://stackoverflow.com/a/31250301 for a great example) + * @param destroy a function which safely releases the resources owned by an entry in this cache - for normal garbage-collected objects, a no-op function will suffice. + * @param size a function which returns the size of a resource - this is used only in relation to the cacheLimit + * @param cacheLimit a limit (in whatever units are returned by the size() parameter) to place on cache contents + * note that this limit is not a hard limit - old entries are evicted when new data is fetched, but the limit may be exceeded occasionally + * a reasonable implementation may simply return 1 for size, and a desired occupancy count for the limit + */ + constructor(destroy: (data: D) => void, size: (data: D) => number, cacheLimit: number) { + this.size = size; + this.destroyer = destroy; + this.limit = cacheLimit; + this.entries = new Map>(); + this.pendingRequests = new Set>(); + } + private usedSpace() { + // Map uses iterators, so we're in for-loop territory here + let sum = 0; + this.entries.forEach((entry) => (sum += entry.data instanceof Promise ? 0 : this.size(entry.data))); + return sum; + } + private countRequests() { + const reqCounts: Record = {} as Record; + for (const req of this.pendingRequests) { + for (const key of [...req.blocking, ...req.awaiting.keys()]) { + if (!reqCounts[key]) { + reqCounts[key] = 0; + } + reqCounts[key] += 1; + } + } + return reqCounts; + } + // if the cache is full, sort candidates which are not currently requested by their last-used timestamps + // evict those items until the cache is no longer full + private evictIfFull() { + // find entries which have 0 pending requests, and are not themselves promises... + let used = this.usedSpace(); + const candidates: { key: CacheKey; data: D; lastRequestedTimestamp: number }[] = []; + if (used > this.limit) { + // its potentially a bit slow to do this: + const counts = this.countRequests(); + this.entries.forEach((entry, key) => { + if (!(entry.data instanceof Promise) && (counts[key] ?? 0) < 1) { + candidates.push({ key, data: entry.data, lastRequestedTimestamp: entry.lastRequestedTimestamp }); + } + }); + const priority = candidates.sort((a, b) => a.lastRequestedTimestamp - b.lastRequestedTimestamp); + for (const evictMe of priority) { + used -= this.size(evictMe.data); + this.destroyer(evictMe.data); + this.entries.delete(evictMe.key); + if (used < this.limit) { + return; + } + } + } + } + + /** + * `isCached` checks if the entry is in the cache with a resolved promise. + * + * @param key The entry key to check for in the cache + * @returns True if the entry in the cache has been resolved, false if there is no entry with that key or the promise is still pending + */ + isCached(key: CacheKey): boolean { + // the key exists, and the value associated is not a promise + return this.entries.has(key) && !(this.entries.get(key)?.data instanceof Promise); + } + + /** + * `areKeysAllCached` checks if all the keys provided are in the cache with resolved promises. + * + * Useful for checking if all the data needed for a particular operation is already in the cache. + * + * @param cacheKeys A list of keys to check for in the cache + * @returns True if all keys are cached, false if any are not in the cache + */ + areKeysAllCached(cacheKeys: readonly CacheKey[]): boolean { + return cacheKeys.every((key) => this.isCached(key)); + } + + /** + * @deprecated to alert (external) users to avoid calling this! + * `getCachedUNSAFE` gets an entry from the cache for the given key (if the promise is resolved). + * because of how eviction works - this method should be considered unsafe! consider the following + * @example + * const entry = cache.getCachedUnsafe('whatever') + * const otherStuff = await fetch('....') + * ... more code + * doSomethingCool(entry, otherStuff) + * + * by the time the caller gets to the doSomethingCool call, the resources bound to the cache entry + * may have been disposed! + * do note that if you use a cache-entry synchronously (no awaits!) after requesting it, you're likely to not + * encounter any issues, however its a much more robust practice to simply refactor like so: + * + * const otherStuff = await fetch('...') + * cache.cacheAndUse({...}, (...args)=>doSomethingCool(otherStuff, ..args), ...) + * + * @param key Entry key to look up in the cache + * @returns The entry (D) if it is present, or undefined if it is not + */ + getCachedUNSAFE(key: CacheKey): D | undefined { + const entry = this.entries.get(key); + if (!entry) return undefined; + + entry.lastRequestedTimestamp = performance.now(); + return entry.data instanceof Promise ? undefined : entry?.data; + } + getNumPendingTasks(): number { + return this.pendingRequests.size; + } + private dataArrived(key: SemanticKey, cacheKey: CacheKey, data: D) { + this.evictIfFull(); // we just got some data - is there room in the cache? + const mutableEntry = this.entries.get(cacheKey); + if (mutableEntry) { + mutableEntry.data = data; + } + const removeUs: MutablePendingRequest[] = []; + for (const req of this.pendingRequests) { + if (updatePendingRequest(req, key, cacheKey, data)) { + req.runner(req.ready); + removeUs.push(req); + } + } + removeUs.forEach((finished) => this.pendingRequests.delete(finished)); + } + private prepareCache(semanticKey: SemanticKey, cacheKey: CacheKey, getter: () => Promise) { + let promise: Promise; + let entry = this.entries.get(cacheKey); + const data = entry?.data; + // we either return early (data is cached) + // or we initialize promise (either getter() or a pre-existing request for the same cachekey) + // if we dont return early, we hook up a call to dataArrived to promise + if (data) { + if (data instanceof Promise) { + promise = data; + } else { + // we could simply "return data" + // however getCachedUnsafe updates its "last-requested timestamp" + return this.getCachedUNSAFE(cacheKey)!; + } + } else { + promise = getter(); + this.entries.set(cacheKey, { + data: promise, + lastRequestedTimestamp: performance.now(), + }); + } + return promise.then((data) => { + this.dataArrived(semanticKey, cacheKey, data); + }); + } + cacheAndUse( + workingSet: Record Promise>, + use: (items: Record) => void, + toCacheKey: (semanticKey: SemanticKey) => CacheKey, + taskFinished?: () => void + ): cancelFn | undefined { + const keys: SemanticKey[] = Object.keys(workingSet) as SemanticKey[]; + const req: MutablePendingRequest = { + awaiting: new Map>(), + ready: {} as Record, + runner: use, + blocking: new Set(), + }; + keys.forEach((k) => { + if (req.awaiting.has(toCacheKey(k))) { + req.awaiting.get(toCacheKey(k))?.add(k); + } else { + req.awaiting.set(toCacheKey(k), new Set([k])); + } + }); + for (const semanticKey of keys) { + const result = this.prepareCache(semanticKey, toCacheKey(semanticKey), workingSet[semanticKey]); + if (result instanceof Promise) { + const prom = taskFinished !== undefined ? result.then(taskFinished) : result; + prom.catch((_reason) => { + // delete the failed entry from the cache + // also remove the entire request it belongs to + this.entries.delete(toCacheKey(semanticKey)); + this.pendingRequests.delete(req); + // note that catches get chained - so any catch handlers that came in with this promise + // still get called + }); + } else { + if (updatePendingRequest(req, semanticKey, toCacheKey(semanticKey), result)) { + use(req.ready); + if (taskFinished !== undefined) { + Promise.resolve().then(taskFinished); // we did the task synchronously... + } + + // early return in the case that everything was cached! + // the only thing this short-circuits is pendingRequests.add(req) + // (because of course it isn't pending, because we just did it!) + return undefined; + } + } + } + this.pendingRequests.add(req); + return () => { + this.pendingRequests.delete(req); + }; + } +} diff --git a/packages/scatterbrain/src/index.ts b/packages/scatterbrain/src/index.ts index b9ea96b..e4a2f6d 100644 --- a/packages/scatterbrain/src/index.ts +++ b/packages/scatterbrain/src/index.ts @@ -1,4 +1,4 @@ -export { beginLongRunningFrame } from "./render-queue"; -export { AsyncDataCache } from "./dataset-cache"; -export { ReglLayer2D } from './layers/layer-2D' -export * from './layers/buffer-pair' \ No newline at end of file +export { beginLongRunningFrame } from './render-queue'; +export { AsyncDataCache } from './dataset-cache'; +export { ReglLayer2D } from './layers/layer-2D'; +export * from './layers/buffer-pair'; diff --git a/packages/scatterbrain/src/layers/buffer-pair.ts b/packages/scatterbrain/src/layers/buffer-pair.ts index 4698f0e..a744942 100644 --- a/packages/scatterbrain/src/layers/buffer-pair.ts +++ b/packages/scatterbrain/src/layers/buffer-pair.ts @@ -1,8 +1,7 @@ - export type BufferPair = { writeTo: T; readFrom: T; -} +}; export function swapBuffers(doubleBuffer: BufferPair) { const { readFrom, writeTo } = doubleBuffer; return { readFrom: writeTo, writeTo: readFrom }; diff --git a/packages/scatterbrain/src/layers/layer-2D.ts b/packages/scatterbrain/src/layers/layer-2D.ts index ccb5b15..958bc9d 100644 --- a/packages/scatterbrain/src/layers/layer-2D.ts +++ b/packages/scatterbrain/src/layers/layer-2D.ts @@ -1,45 +1,53 @@ - // a helper to render a 2D layer, using regl -import type { Image, ImageRenderer, RenderFn } from "./types"; -import { type BufferPair, swapBuffers } from "./buffer-pair"; -import type REGL from "regl"; -import type { FrameLifecycle, RenderCallback } from "../render-queue"; -import { Box2D, type box2D, type vec2 } from '@alleninstitute/vis-geometry' +import type { Image, ImageRenderer, RenderFn } from './types'; +import { type BufferPair, swapBuffers } from './buffer-pair'; +import type REGL from 'regl'; +import type { FrameLifecycle, RenderCallback } from '../render-queue'; +import { Box2D, type box2D, type vec2 } from '@alleninstitute/vis-geometry'; -type EventType = Parameters[0] -type RequiredSettings = { camera: { view: box2D }, callback: RenderCallback } +type EventType = Parameters[0]; +type RequiredSettings = { camera: { view: box2D }; callback: RenderCallback }; export class ReglLayer2D { private buffers: BufferPair; - private renderFn: RenderFn + private renderFn: RenderFn; private runningFrame: FrameLifecycle | null; private regl: REGL.Regl; - private renderImg: ImageRenderer - constructor(regl: REGL.Regl, imgRenderer: ImageRenderer, renderFn: RenderFn, resolution: vec2) { + private renderImg: ImageRenderer; + constructor( + regl: REGL.Regl, + imgRenderer: ImageRenderer, + renderFn: RenderFn, + resolution: vec2 + ) { this.buffers = { readFrom: { resolution, texture: regl.framebuffer(...resolution), bounds: undefined }, - writeTo: { resolution, texture: regl.framebuffer(...resolution), bounds: undefined } + writeTo: { resolution, texture: regl.framebuffer(...resolution), bounds: undefined }, }; - this.renderImg = imgRenderer + this.renderImg = imgRenderer; this.regl = regl; this.runningFrame = null; this.renderFn = renderFn; } destroy() { - this.runningFrame?.cancelFrame("destroy this layer"); + this.runningFrame?.cancelFrame('destroy this layer'); this.buffers.readFrom.texture.destroy(); this.buffers.writeTo.texture.destroy(); } - renderingInProgress() { return this.runningFrame !== null } + renderingInProgress() { + return this.runningFrame !== null; + } getRenderResults(stage: 'prev' | 'cur') { - return stage == 'cur' ? this.buffers.writeTo : this.buffers.readFrom + return stage == 'cur' ? this.buffers.writeTo : this.buffers.readFrom; } - onChange(props: { - readonly data: Readonly; - readonly settings: Readonly - }, cancel: boolean = true) { - + onChange( + props: { + readonly data: Readonly; + readonly settings: Readonly; + }, + cancel: boolean = true + ) { if (cancel && this.runningFrame) { this.runningFrame.cancelFrame(); this.runningFrame = null; @@ -52,20 +60,21 @@ export class ReglLayer2D { img: writeTo.texture, target: readFrom.texture, viewport: { - x: 0, y: 0, width, height + x: 0, + y: 0, + width, + height, }, - view: Box2D.toFlatArray(readFrom.bounds) - }) + view: Box2D.toFlatArray(readFrom.bounds), + }); } - this.regl.clear({ framebuffer: this.buffers.writeTo.texture, color: [0, 0, 0, 0], depth: 1 }) + this.regl.clear({ framebuffer: this.buffers.writeTo.texture, color: [0, 0, 0, 0], depth: 1 }); } const { data, settings } = props; const { camera, callback } = settings; this.buffers.writeTo.bounds = camera.view; - - const wrapCallback: RenderSettings = - { + const wrapCallback: RenderSettings = { ...settings, callback: (ev: EventType) => { const { status } = ev; @@ -75,15 +84,18 @@ export class ReglLayer2D { this.buffers = swapBuffers(this.buffers); // only erase... if we would have cancelled... if (cancel) { - this.regl.clear({ framebuffer: this.buffers.writeTo.texture, color: [0, 0, 0, 0], depth: 1 }) + this.regl.clear({ + framebuffer: this.buffers.writeTo.texture, + color: [0, 0, 0, 0], + depth: 1, + }); } this.runningFrame = null; break; } callback?.(ev); - } + }, }; this.runningFrame = this.renderFn(this.buffers.writeTo.texture, data, wrapCallback); } - } diff --git a/packages/scatterbrain/src/layers/types.ts b/packages/scatterbrain/src/layers/types.ts index 8801f3e..a0c3e47 100644 --- a/packages/scatterbrain/src/layers/types.ts +++ b/packages/scatterbrain/src/layers/types.ts @@ -1,23 +1,26 @@ import type { box2D, vec2, vec4 } from '@alleninstitute/vis-geometry'; -import type { FrameLifecycle } from '../render-queue' -import type REGL from "regl"; +import type { FrameLifecycle } from '../render-queue'; +import type REGL from 'regl'; -export type RenderFn = - (target: REGL.Framebuffer2D | null, thing: Readonly, settings: Readonly) => FrameLifecycle; +export type RenderFn = ( + target: REGL.Framebuffer2D | null, + thing: Readonly, + settings: Readonly +) => FrameLifecycle; export type Image = { - resolution: vec2; - texture: REGL.Framebuffer2D; - bounds: box2D | undefined; // if undefined, it means we allocated the texture, but its empty and should not be used (except to fill it) -} + resolution: vec2; + texture: REGL.Framebuffer2D; + bounds: box2D | undefined; // if undefined, it means we allocated the texture, but its empty and should not be used (except to fill it) +}; type ImageRendererProps = { - target: REGL.Framebuffer2D | null; - box: vec4; - view: vec4; - viewport: REGL.BoundingBox; - img: REGL.Texture2D | REGL.Framebuffer2D; -} + target: REGL.Framebuffer2D | null; + box: vec4; + view: vec4; + viewport: REGL.BoundingBox; + img: REGL.Texture2D | REGL.Framebuffer2D; +}; // a function which renders an axis aligned image to another axis aligned image - no funny buisness -export type ImageRenderer = (props: ImageRendererProps) => void; \ No newline at end of file +export type ImageRenderer = (props: ImageRendererProps) => void; diff --git a/packages/scatterbrain/src/render-queue.ts b/packages/scatterbrain/src/render-queue.ts index 7e79dad..88e8cd1 100644 --- a/packages/scatterbrain/src/render-queue.ts +++ b/packages/scatterbrain/src/render-queue.ts @@ -1,182 +1,181 @@ -import { partial } from 'lodash'; -import { AsyncDataCache } from './dataset-cache'; - -/** - * FrameLifecycle type that defines the functions a user can call to interact with the frame lifecycle. - * - * Currently only supports `cancelFrame` to allow the user to cancel the frame on an ad-hoc basis. - */ -export type FrameLifecycle = { - cancelFrame: (reason?: string) => void; -}; - - -/** - * NormalStatus type that defines the possible non-error statuses for a frame. - * - * `begun` - The frame has started running - * - * `finished` - The frame has finished running - * - * `cancelled` - The frame was cancelled by the user - * - * `finished_synchronously` - The frame finished synchronously - * - * `progress` - The frame is still running and has not finished - */ -export type NormalStatus = 'begun' | 'finished' | 'cancelled' | 'finished_synchronously' | 'progress'; -export type RenderCallback = (event: { status: NormalStatus } | { status: 'error', error: unknown }) => void; -/** - * `beingLongRunningFrame` starts a long-running frame that will render a list of items asynchronously based on - * the provided data, settings, and rendering functions. - * - * The frame will run until all items have been rendered, or until the user cancels the frame. It will update the - * provided cache so that the data is available for other frames that may be running. This function is safe to call - * multiple times in different areas of your code, as it will complete quickly if/when all the data is already cached and available. - * - * You can listen for the status of the frame, allowing you to make decisions based on the progress of the frame. - * - * In addition, you can cancel the frame at any time, which will stop the frame from running and prevent any further - * rendering or data fetching from occurring. - * - * @param maximumInflightAsyncTasks The maximum number of async tasks to run at once. - * @param queueProcessingIntervalMS The length of time to wait between processing the queue in milliseconds. - * @param items An array of generic items to render - * @param mutableCache The asynchronous cache used to store the data - * @param settings Flexible object of settings related to the items that are being rendered - * @param requestsForItem a function which returns a mapping of "columns" to async functions that would fetch the column - * @param render The main render function that will be called once all data is available - * @param lifecycleCallback Callback function so they user can be notified of the status of the frame - * @param cacheKeyForRequest A function for generating a cache key for a given request key, item, and settings. Defaults to the request key if not provided. - * @param queueTimeBudgetMS the maximum ammount of time (milliseconds) to spend rendering before yeilding to allow other work to run - rendering will resume next frame (@param queueProcessingIntervalMS) - * @returns A FrameLifecycle object with a cancelFrame function to allow users to cancel the frame when necessary - */ -export function beginLongRunningFrame( - maximumInflightAsyncTasks: number, - queueProcessingIntervalMS: number, - items: Item[], - mutableCache: AsyncDataCache, - settings: Settings, - requestsForItem: (item: Item, settings: Settings, signal?: AbortSignal) => Record Promise>, - render: (item: Item, settings: Settings, columns: Record) => void, - lifecycleCallback: RenderCallback, - cacheKeyForRequest: (requestKey: string, item: Item, settings: Settings) => string = (key) => key, - queueTimeBudgetMS: number = queueProcessingIntervalMS / 3 -): FrameLifecycle { - const abort = new AbortController(); - const queue: Item[] = []; - const taskCancelCallbacks: Array<() => void> = []; - - const reportNormalStatus = (status: NormalStatus) => { - // we want to report our status, however the flow of events can be confusing - - // our callers anticipate an asynchronous (long running) frame to be started, - // but there are scenarios in which the whole thing is completely synchronous - // callers who are scheduling things may be surprised that their frame finished - // before the code that handles it appears to start. thus, we make the entire lifecycle callback - // system async, to prevent surprises. - Promise.resolve().then(() => lifecycleCallback({ status })); - }; - // when starting a frame, we greedily attempt to render any tasks that are already in the cache - // however, if there is too much overhead (or too many tasks) we would risk hogging the main thread - // thus - obey the limit (its a soft limit) - const startTime = performance.now(); - - for (let i = 0; i < items.length; i += 1) { - const itemToRender = items[i]; - const requestFns = requestsForItem(itemToRender, settings, abort.signal) - const cacheKey = (rq: string) => cacheKeyForRequest(rq, itemToRender, settings) - const cacheKeys = Object.keys(requestFns).map(cacheKey); - - if (mutableCache.areKeysAllCached(cacheKeys)) { - - const result = mutableCache.cacheAndUse( - requestFns, partial(render, itemToRender, settings), cacheKey - ); - if (result !== undefined) { - // this is a problem - the cache reported that all the keys are in the cache, however this result is a cancellation callback, - // which indicates that the item could not be rendered right away, which should be impossible... - // TODO - taskCancelCallbacks.push(result); - } - } else { - // areKeysAllCached returned false - enqueue for later - queue.push(itemToRender) - } - if (performance.now() - startTime > queueTimeBudgetMS) { - // we've used up all our time - enqueue all remaining tasks - if (i < items.length - 1) { - queue.push(...items.slice(i + 1)); - } - break; - } - } - - if (queue.length === 0) { - // we did all the work - it was already cached - reportNormalStatus('finished_synchronously'); - return { cancelFrame: () => { } }; - } - // TODO: Re-examine lifecycle reporting, potentially unify all statuses into a single type - reportNormalStatus('begun'); - if (queue.length !== items.length) { - // We did some work, but there's some left - reportNormalStatus('progress'); - } - const doWorkOnQueue = (intervalId: number) => { - // try our best to cleanup if something goes awry - const startWorkTime = performance.now(); - const cleanupOnError = (err: unknown) => { - // clear the queue and the staging area (inFlight) - taskCancelCallbacks.forEach(cancelMe => cancelMe()); - queue.splice(0, queue.length); - // stop fetching - abort.abort(err); - clearInterval(intervalId); - // pass the error somewhere better: - lifecycleCallback({ status: 'error', error: err }); - }; - while (mutableCache.getNumPendingTasks() < Math.max(maximumInflightAsyncTasks, 1)) { - if (queue.length < 1) { - // we cant add anything to the in-flight staging area, the final task - // is already in flight - if (mutableCache.getNumPendingTasks() < 1) { - // we do want to wait for that last in-flight task to actually finish though: - clearInterval(intervalId); - reportNormalStatus('finished'); - } - return; - } - // We know there are items in the queue because of the check above, so we assert the type exist - const itemToRender = queue.shift()!; - const toCacheKey = (rq: string) => cacheKeyForRequest(rq, itemToRender, settings); - try { - const result = mutableCache.cacheAndUse( - requestsForItem(itemToRender, settings, abort.signal), partial(render, itemToRender, settings), toCacheKey, () => reportNormalStatus('progress') - ); - if (result !== undefined) { - // put this cancel callback in a list where we can invoke if something goes wrong - // note that it is harmless to cancel a task that was completed - taskCancelCallbacks.push(result); - } - } catch (err) { - cleanupOnError(err); - } - if (performance.now() - startWorkTime > queueTimeBudgetMS) { - // used up all our time - leave remaining work for later - break; - } - } - }; - const interval = setInterval(() => doWorkOnQueue(interval), queueProcessingIntervalMS); - - // return a function to allow our caller to cancel the frame - guaranteed that no settings/data will be - // touched/referenced after cancellation, unless the author of render() did some super weird bad things - return { - cancelFrame: (reason?: string) => { - taskCancelCallbacks.forEach(cancelMe => cancelMe()); - abort.abort(new DOMException(reason, 'AbortError')); - clearInterval(interval); - reportNormalStatus('cancelled'); - }, - }; -} +import { partial } from 'lodash'; +import { AsyncDataCache } from './dataset-cache'; + +/** + * FrameLifecycle type that defines the functions a user can call to interact with the frame lifecycle. + * + * Currently only supports `cancelFrame` to allow the user to cancel the frame on an ad-hoc basis. + */ +export type FrameLifecycle = { + cancelFrame: (reason?: string) => void; +}; + +/** + * NormalStatus type that defines the possible non-error statuses for a frame. + * + * `begun` - The frame has started running + * + * `finished` - The frame has finished running + * + * `cancelled` - The frame was cancelled by the user + * + * `finished_synchronously` - The frame finished synchronously + * + * `progress` - The frame is still running and has not finished + */ +export type NormalStatus = 'begun' | 'finished' | 'cancelled' | 'finished_synchronously' | 'progress'; +export type RenderCallback = (event: { status: NormalStatus } | { status: 'error'; error: unknown }) => void; +/** + * `beingLongRunningFrame` starts a long-running frame that will render a list of items asynchronously based on + * the provided data, settings, and rendering functions. + * + * The frame will run until all items have been rendered, or until the user cancels the frame. It will update the + * provided cache so that the data is available for other frames that may be running. This function is safe to call + * multiple times in different areas of your code, as it will complete quickly if/when all the data is already cached and available. + * + * You can listen for the status of the frame, allowing you to make decisions based on the progress of the frame. + * + * In addition, you can cancel the frame at any time, which will stop the frame from running and prevent any further + * rendering or data fetching from occurring. + * + * @param maximumInflightAsyncTasks The maximum number of async tasks to run at once. + * @param queueProcessingIntervalMS The length of time to wait between processing the queue in milliseconds. + * @param items An array of generic items to render + * @param mutableCache The asynchronous cache used to store the data + * @param settings Flexible object of settings related to the items that are being rendered + * @param requestsForItem a function which returns a mapping of "columns" to async functions that would fetch the column + * @param render The main render function that will be called once all data is available + * @param lifecycleCallback Callback function so they user can be notified of the status of the frame + * @param cacheKeyForRequest A function for generating a cache key for a given request key, item, and settings. Defaults to the request key if not provided. + * @param queueTimeBudgetMS the maximum ammount of time (milliseconds) to spend rendering before yeilding to allow other work to run - rendering will resume next frame (@param queueProcessingIntervalMS) + * @returns A FrameLifecycle object with a cancelFrame function to allow users to cancel the frame when necessary + */ +export function beginLongRunningFrame( + maximumInflightAsyncTasks: number, + queueProcessingIntervalMS: number, + items: Item[], + mutableCache: AsyncDataCache, + settings: Settings, + requestsForItem: (item: Item, settings: Settings, signal?: AbortSignal) => Record Promise>, + render: (item: Item, settings: Settings, columns: Record) => void, + lifecycleCallback: RenderCallback, + cacheKeyForRequest: (requestKey: string, item: Item, settings: Settings) => string = (key) => key, + queueTimeBudgetMS: number = queueProcessingIntervalMS / 3 +): FrameLifecycle { + const abort = new AbortController(); + const queue: Item[] = []; + const taskCancelCallbacks: Array<() => void> = []; + + const reportNormalStatus = (status: NormalStatus) => { + // we want to report our status, however the flow of events can be confusing - + // our callers anticipate an asynchronous (long running) frame to be started, + // but there are scenarios in which the whole thing is completely synchronous + // callers who are scheduling things may be surprised that their frame finished + // before the code that handles it appears to start. thus, we make the entire lifecycle callback + // system async, to prevent surprises. + Promise.resolve().then(() => lifecycleCallback({ status })); + }; + // when starting a frame, we greedily attempt to render any tasks that are already in the cache + // however, if there is too much overhead (or too many tasks) we would risk hogging the main thread + // thus - obey the limit (its a soft limit) + const startTime = performance.now(); + + for (let i = 0; i < items.length; i += 1) { + const itemToRender = items[i]; + const requestFns = requestsForItem(itemToRender, settings, abort.signal); + const cacheKey = (rq: string) => cacheKeyForRequest(rq, itemToRender, settings); + const cacheKeys = Object.keys(requestFns).map(cacheKey); + + if (mutableCache.areKeysAllCached(cacheKeys)) { + const result = mutableCache.cacheAndUse(requestFns, partial(render, itemToRender, settings), cacheKey); + if (result !== undefined) { + // this is a problem - the cache reported that all the keys are in the cache, however this result is a cancellation callback, + // which indicates that the item could not be rendered right away, which should be impossible... + // TODO + taskCancelCallbacks.push(result); + } + } else { + // areKeysAllCached returned false - enqueue for later + queue.push(itemToRender); + } + if (performance.now() - startTime > queueTimeBudgetMS) { + // we've used up all our time - enqueue all remaining tasks + if (i < items.length - 1) { + queue.push(...items.slice(i + 1)); + } + break; + } + } + + if (queue.length === 0) { + // we did all the work - it was already cached + reportNormalStatus('finished_synchronously'); + return { cancelFrame: () => {} }; + } + // TODO: Re-examine lifecycle reporting, potentially unify all statuses into a single type + reportNormalStatus('begun'); + if (queue.length !== items.length) { + // We did some work, but there's some left + reportNormalStatus('progress'); + } + const doWorkOnQueue = (intervalId: number) => { + // try our best to cleanup if something goes awry + const startWorkTime = performance.now(); + const cleanupOnError = (err: unknown) => { + // clear the queue and the staging area (inFlight) + taskCancelCallbacks.forEach((cancelMe) => cancelMe()); + queue.splice(0, queue.length); + // stop fetching + abort.abort(err); + clearInterval(intervalId); + // pass the error somewhere better: + lifecycleCallback({ status: 'error', error: err }); + }; + while (mutableCache.getNumPendingTasks() < Math.max(maximumInflightAsyncTasks, 1)) { + if (queue.length < 1) { + // we cant add anything to the in-flight staging area, the final task + // is already in flight + if (mutableCache.getNumPendingTasks() < 1) { + // we do want to wait for that last in-flight task to actually finish though: + clearInterval(intervalId); + reportNormalStatus('finished'); + } + return; + } + // We know there are items in the queue because of the check above, so we assert the type exist + const itemToRender = queue.shift()!; + const toCacheKey = (rq: string) => cacheKeyForRequest(rq, itemToRender, settings); + try { + const result = mutableCache.cacheAndUse( + requestsForItem(itemToRender, settings, abort.signal), + partial(render, itemToRender, settings), + toCacheKey, + () => reportNormalStatus('progress') + ); + if (result !== undefined) { + // put this cancel callback in a list where we can invoke if something goes wrong + // note that it is harmless to cancel a task that was completed + taskCancelCallbacks.push(result); + } + } catch (err) { + cleanupOnError(err); + } + if (performance.now() - startWorkTime > queueTimeBudgetMS) { + // used up all our time - leave remaining work for later + break; + } + } + }; + const interval = setInterval(() => doWorkOnQueue(interval), queueProcessingIntervalMS); + + // return a function to allow our caller to cancel the frame - guaranteed that no settings/data will be + // touched/referenced after cancellation, unless the author of render() did some super weird bad things + return { + cancelFrame: (reason?: string) => { + taskCancelCallbacks.forEach((cancelMe) => cancelMe()); + abort.abort(new DOMException(reason, 'AbortError')); + clearInterval(interval); + reportNormalStatus('cancelled'); + }, + }; +} diff --git a/packages/scatterbrain/src/test/render-cache.test.ts b/packages/scatterbrain/src/test/render-cache.test.ts index 0d6599d..7b9fc75 100644 --- a/packages/scatterbrain/src/test/render-cache.test.ts +++ b/packages/scatterbrain/src/test/render-cache.test.ts @@ -1,17 +1,17 @@ -import { beforeEach, describe, expect, it } from "vitest"; -import { AsyncDataCache } from "../dataset-cache"; -import { fakeFetch } from "./test-utils"; -import { delay, partial, partialRight, uniqueId } from "lodash"; -type Columns = 'color' | 'position' -type vec3 = readonly [number, number, number] -type Data = { pretend: vec3 } +import { beforeEach, describe, expect, it } from 'vitest'; +import { AsyncDataCache } from '../dataset-cache'; +import { fakeFetch } from './test-utils'; +import { delay, partial, partialRight, uniqueId } from 'lodash'; +type Columns = 'color' | 'position'; +type vec3 = readonly [number, number, number]; +type Data = { pretend: vec3 }; type Entry = { resolveMe: () => void; rejectMe: (reason?: any) => void; -} +}; class PromiseFarm { - entries: Map, Entry> + entries: Map, Entry>; staging: Record; constructor() { this.entries = new Map(); @@ -20,11 +20,10 @@ class PromiseFarm { promiseMe(t: T) { const reqId = uniqueId('rq'); const prom = new Promise((resolve, reject) => { - this.staging[reqId] = - { + this.staging[reqId] = { resolveMe: () => resolve(t), - rejectMe: (reason: any) => reject(reason) - } + rejectMe: (reason: any) => reject(reason), + }; }); this.entries.set(prom, this.staging[reqId]); delete this.staging[reqId]; @@ -50,160 +49,170 @@ class PromiseFarm { type SpyOnRenderer = { data: Record; -} +}; function cacheKey(item: { id: number }, rq: Columns) { return `api:4000/${rq}_${item.id}.bin`; } describe('async cache', () => { let mockPromises = new PromiseFarm(); const fetchFakeItem = (id: number, color: vec3, pos: vec3) => { - const c = mockPromises.promiseMe({ pretend: color }) - const p = mockPromises.promiseMe({ pretend: pos }) + const c = mockPromises.promiseMe({ pretend: color }); + const p = mockPromises.promiseMe({ pretend: pos }); return { fetchers: { color: () => c, position: () => p, }, spies: [c, p], - id + id, } as const; - } + }; const fetchTheSameThingTwice = (id: number, color: vec3, _pos: vec3) => { - const c = mockPromises.promiseMe({ pretend: color }) - const c2 = mockPromises.promiseMe({ pretend: [...color] as vec3 }) + const c = mockPromises.promiseMe({ pretend: color }); + const c2 = mockPromises.promiseMe({ pretend: [...color] as vec3 }); return { fetchers: { color: () => c, position: () => c2, }, spies: [c, c2], - id + id, } as const; - } + }; const fetchTheSameThingTwiceOnePromise = (id: number, color: vec3, _pos: vec3) => { - const c = mockPromises.promiseMe({ pretend: color }) + const c = mockPromises.promiseMe({ pretend: color }); return { fetchers: { color: () => c, position: () => c, }, spies: [c, c], - id + id, } as const; - } + }; const resolveFakePromises = async (lies: readonly Promise[]): Promise => { - lies.forEach((p) => { mockPromises.mockResolve(p) }) + lies.forEach((p) => { + mockPromises.mockResolve(p); + }); // because the promises are mega hackified, even though we call resolve, the event system hasn't had a chance to catch up // so - we have to inject a fake wait in here to give all the promises we just resolved a chance to run for realsies - await Promise.resolve() + await Promise.resolve(); return Promise.resolve(); + }; - } - - let cache = new AsyncDataCache((item: Data) => { }, () => 1, 10); - let disposed: Data[] = [] - let rendered: SpyOnRenderer[] = [] // these are just for spying + let cache = new AsyncDataCache( + (item: Data) => {}, + () => 1, + 10 + ); + let disposed: Data[] = []; + let rendered: SpyOnRenderer[] = []; // these are just for spying const render = (data: Record) => { rendered.push({ data }); - } + }; beforeEach(() => { - cache = new AsyncDataCache((item: Data) => { disposed.push(item) }, () => 1, 10); - disposed = [] - rendered = [] - }) + cache = new AsyncDataCache( + (item: Data) => { + disposed.push(item); + }, + () => 1, + 10 + ); + disposed = []; + rendered = []; + }); describe('cacheAndUse', () => { it('calls the use fn once all requested data is available', async () => { - const { fetchers, id, spies } = fetchFakeItem(1, [255, 0, 0], [1, 2, 3]) + const { fetchers, id, spies } = fetchFakeItem(1, [255, 0, 0], [1, 2, 3]); const toCacheKey = partial(cacheKey, { id }); - const result = cache.cacheAndUse(fetchers, render, toCacheKey) + const result = cache.cacheAndUse(fetchers, render, toCacheKey); expect(result).toBeDefined(); // the promises for our fake data never resolve until we tell them to - expect(cache.getNumPendingTasks()).toBe(1) + expect(cache.getNumPendingTasks()).toBe(1); expect(rendered.length).toBe(0); await resolveFakePromises(spies); - expect(cache.getNumPendingTasks()).toBe(0) + expect(cache.getNumPendingTasks()).toBe(0); expect(rendered.length).toBe(1); - }) + }); it('behaves correctly when a fetch fails', async () => { - const { fetchers, id, spies } = fetchFakeItem(1, [255, 0, 0], [1, 2, 3]) + const { fetchers, id, spies } = fetchFakeItem(1, [255, 0, 0], [1, 2, 3]); const toCacheKey = partial(cacheKey, { id }); - const result = cache.cacheAndUse(fetchers, render, toCacheKey) + const result = cache.cacheAndUse(fetchers, render, toCacheKey); expect(result).toBeDefined(); // fail one, resolve the other let boom = false; // this little catch represents passing our deep error up to someone smarter: - spies[0].catch(() => boom = true) + spies[0].catch(() => (boom = true)); - - mockPromises.mockResolve(spies[1]) + mockPromises.mockResolve(spies[1]); // resolve one first so that we can be sure its value lives in the cache - await Promise.resolve() - expect(cache.isCached(toCacheKey('position'))).toBeTruthy() + await Promise.resolve(); + expect(cache.isCached(toCacheKey('position'))).toBeTruthy(); // then reject the other to fail the overall task - mockPromises.mockReject(spies[0], 'fetch failed for reals') + mockPromises.mockReject(spies[0], 'fetch failed for reals'); // so this is pretty gross... // the number of awaits here relates to how many promises are chained together... // todo think of a way to be smarter about this very async test... - await Promise.resolve() - await Promise.resolve() + await Promise.resolve(); + await Promise.resolve(); - expect(cache.getNumPendingTasks()).toBe(0) + expect(cache.getNumPendingTasks()).toBe(0); expect(rendered.length).toBe(0); - expect(boom).toBeTruthy() + expect(boom).toBeTruthy(); // the one that failed of course is missing from the cache - expect(cache.isCached(toCacheKey('color'))).toBeFalsy() - }) + expect(cache.isCached(toCacheKey('color'))).toBeFalsy(); + }); it('evicts data after the soft limit is hit', async () => { // each of our tasks requests two chunks of data // the cache has a limit of 10 items (see beforeEach) - let allKeysSoFar: string[] = [] + let allKeysSoFar: string[] = []; for (let i = 0; i < 5; i++) { - const { fetchers, id, spies } = fetchFakeItem(i, [255, 0, i], [1, 2 * i, 3 * i]) - const toCacheKey = partial(cacheKey, { id }) - const result = cache.cacheAndUse(fetchers, render, toCacheKey) + const { fetchers, id, spies } = fetchFakeItem(i, [255, 0, i], [1, 2 * i, 3 * i]); + const toCacheKey = partial(cacheKey, { id }); + const result = cache.cacheAndUse(fetchers, render, toCacheKey); // store all the cache keys so we can expect them later - allKeysSoFar.push(toCacheKey('color'), toCacheKey('position')) - await resolveFakePromises(spies) + allKeysSoFar.push(toCacheKey('color'), toCacheKey('position')); + await resolveFakePromises(spies); } // so after making 5 requests, we should have a full cache expect(cache.areKeysAllCached(allKeysSoFar)).toBe(true); expect(cache.getNumPendingTasks()).toBe(0); // now request a new thing - this should cause the cache to remove at least one item - const { fetchers, id, spies } = fetchFakeItem(99, [99, 99, 99], [9, 9, 9]) - const toCacheKey = partial(cacheKey, { id }) + const { fetchers, id, spies } = fetchFakeItem(99, [99, 99, 99], [9, 9, 9]); + const toCacheKey = partial(cacheKey, { id }); const result = cache.cacheAndUse(fetchers, render, toCacheKey); - await resolveFakePromises(spies) + await resolveFakePromises(spies); // we would expect the items with id=0 to have been removed, as they are the oldest - expect(cache.isCached(toCacheKey('color'))).toBeTruthy() - expect(cache.isCached(toCacheKey('position'))).toBeTruthy() + expect(cache.isCached(toCacheKey('color'))).toBeTruthy(); + expect(cache.isCached(toCacheKey('position'))).toBeTruthy(); // and the old ones: - expect(cache.isCached(cacheKey({ id: 0 }, 'color'))).toBeFalsy() - expect(cache.isCached(cacheKey({ id: 0 }, 'position'))).toBeFalsy() - }) + expect(cache.isCached(cacheKey({ id: 0 }, 'color'))).toBeFalsy(); + expect(cache.isCached(cacheKey({ id: 0 }, 'position'))).toBeFalsy(); + }); it('does not evict data if it is marked as critical for a pending request', async () => { // almost the same scenario as the previous test, except we're going to intentionally NOT // resolve the task with id=0. Because its still pending, we would like to see that it does not get evicted! // each of our tasks requests two chunks of data // the cache has a limit of 10 items (see beforeEach) - let allKeysSoFar: string[] = [] + let allKeysSoFar: string[] = []; let reallySlowRequest: Promise; for (let i = 0; i < 6; i++) { - const { fetchers, id, spies } = fetchFakeItem(i, [255, 0, i], [1, 2 * i, 3 * i]) - const toCacheKey = partial(cacheKey, { id }) - const result = cache.cacheAndUse(fetchers, render, toCacheKey) + const { fetchers, id, spies } = fetchFakeItem(i, [255, 0, i], [1, 2 * i, 3 * i]); + const toCacheKey = partial(cacheKey, { id }); + const result = cache.cacheAndUse(fetchers, render, toCacheKey); if (i !== 0) { // dont resolve the stuff for the first task! - allKeysSoFar.push(toCacheKey('color'), toCacheKey('position')) - await resolveFakePromises(spies) + allKeysSoFar.push(toCacheKey('color'), toCacheKey('position')); + await resolveFakePromises(spies); } else { - allKeysSoFar.push(toCacheKey('color')) - await resolveFakePromises([spies[0]]) + allKeysSoFar.push(toCacheKey('color')); + await resolveFakePromises([spies[0]]); reallySlowRequest = spies[1]; // intentionally not resolving position! } @@ -213,46 +222,46 @@ describe('async cache', () => { expect(cache.getNumPendingTasks()).toBe(1); // the first task is still pending, because we didn't resolve its position request // now request a new thing - this should cause the cache to remove at least one item - const { fetchers, id, spies } = fetchFakeItem(99, [99, 99, 99], [9, 9, 9]) + const { fetchers, id, spies } = fetchFakeItem(99, [99, 99, 99], [9, 9, 9]); const result = cache.cacheAndUse(fetchers, render, partial(cacheKey, { id })); - await resolveFakePromises(spies) + await resolveFakePromises(spies); - expect(cache.isCached(cacheKey({ id: 99 }, 'color'))).toBeTruthy() - expect(cache.isCached(cacheKey({ id: 99 }, 'position'))).toBeTruthy() + expect(cache.isCached(cacheKey({ id: 99 }, 'color'))).toBeTruthy(); + expect(cache.isCached(cacheKey({ id: 99 }, 'position'))).toBeTruthy(); // we would expect the items with id=0 to have been removed, as they are the oldest, HOWEVER - // we never resolved (position,id:0) so we expect to not have removed - expect(cache.isCached(cacheKey({ id: 0 }, 'color'))).toBeTruthy() // its still in the cache - expect(cache.isCached(cacheKey({ id: 0 }, 'position'))).toBeFalsy() // its never been resolved, so it cant be in the cache (yet) + // we never resolved (position,id:0) so we expect to not have removed + expect(cache.isCached(cacheKey({ id: 0 }, 'color'))).toBeTruthy(); // its still in the cache + expect(cache.isCached(cacheKey({ id: 0 }, 'position'))).toBeFalsy(); // its never been resolved, so it cant be in the cache (yet) - expect(cache.isCached(cacheKey({ id: 1 }, 'color'))).toBeFalsy() - expect(cache.isCached(cacheKey({ id: 1 }, 'position'))).toBeFalsy() + expect(cache.isCached(cacheKey({ id: 1 }, 'color'))).toBeFalsy(); + expect(cache.isCached(cacheKey({ id: 1 }, 'position'))).toBeFalsy(); // finally, resolve that first stalled request, and observe us fulfilling our first render task: - await resolveFakePromises([reallySlowRequest!]) - expect(cache.getNumPendingTasks()).toBe(0) + await resolveFakePromises([reallySlowRequest!]); + expect(cache.getNumPendingTasks()).toBe(0); // expect everything to have been rendered, regardless of all this cache nonsense - expect(rendered.length).toEqual(7) // id=0...5, 99 + expect(rendered.length).toEqual(7); // id=0...5, 99 // spot check the last two rendered things: - rendered[rendered.length - 2].data.color[1] = 99 - rendered[rendered.length - 1].data.position[2] = 0 // 3*(i=0) - }) + rendered[rendered.length - 2].data.color[1] = 99; + rendered[rendered.length - 1].data.position[2] = 0; // 3*(i=0) + }); it('evicts data after the soft limit is hit, while prioritizing Least-recently used entries', async () => { // each of our tasks requests two chunks of data // the cache has a limit of 10 items (see beforeEach) - let allKeysSoFar: string[] = [] - let first: ReturnType & { toCacheKey: (rq: Columns) => string } + let allKeysSoFar: string[] = []; + let first: ReturnType & { toCacheKey: (rq: Columns) => string }; for (let i = 0; i < 5; i++) { - const { fetchers, id, spies } = fetchFakeItem(i, [255, 0, i], [1, 2 * i, 3 * i]) - const toCacheKey = partial(cacheKey, { id }) + const { fetchers, id, spies } = fetchFakeItem(i, [255, 0, i], [1, 2 * i, 3 * i]); + const toCacheKey = partial(cacheKey, { id }); if (i === 0) { - first = { fetchers, id, spies, toCacheKey } + first = { fetchers, id, spies, toCacheKey }; } - const result = cache.cacheAndUse(fetchers, render, toCacheKey) + const result = cache.cacheAndUse(fetchers, render, toCacheKey); // store all the cache keys so we can expect them later - allKeysSoFar.push(toCacheKey('color'), toCacheKey('position')) - await resolveFakePromises(spies) + allKeysSoFar.push(toCacheKey('color'), toCacheKey('position')); + await resolveFakePromises(spies); } // so after making 5 requests, we should have a full cache expect(cache.areKeysAllCached(allKeysSoFar)).toBe(true); @@ -263,21 +272,21 @@ describe('async cache', () => { await resolveFakePromises(again.spies); expect(cache.getNumPendingTasks()).toBe(0); // now request a new thing - this should cause the cache to remove at least one item - const { fetchers, id, spies } = fetchFakeItem(99, [99, 99, 99], [9, 9, 9]) - const toCacheKey = partial(cacheKey, { id }) + const { fetchers, id, spies } = fetchFakeItem(99, [99, 99, 99], [9, 9, 9]); + const toCacheKey = partial(cacheKey, { id }); const result = cache.cacheAndUse(fetchers, render, toCacheKey); - await resolveFakePromises(spies) + await resolveFakePromises(spies); // we would expect the items with id=1 to have been removed (not id=0 because we re-requested it) - expect(cache.isCached(toCacheKey('color'))).toBeTruthy() - expect(cache.isCached(toCacheKey('position'))).toBeTruthy() + expect(cache.isCached(toCacheKey('color'))).toBeTruthy(); + expect(cache.isCached(toCacheKey('position'))).toBeTruthy(); - expect(cache.isCached(cacheKey({ id: 0 }, 'color'))).toBeTruthy() - expect(cache.isCached(cacheKey({ id: 0 }, 'position'))).toBeTruthy() + expect(cache.isCached(cacheKey({ id: 0 }, 'color'))).toBeTruthy(); + expect(cache.isCached(cacheKey({ id: 0 }, 'position'))).toBeTruthy(); // these are gone - they would have been the second oldest (and thus safe) - but we re-requested the id=0 items // so they get updated as having been used most-recently - the idea being they'll be requested again and maybe other things would be better to evict - expect(cache.isCached(cacheKey({ id: 1 }, 'color'))).toBeFalsy() - expect(cache.isCached(cacheKey({ id: 1 }, 'position'))).toBeFalsy() - }) + expect(cache.isCached(cacheKey({ id: 1 }, 'color'))).toBeFalsy(); + expect(cache.isCached(cacheKey({ id: 1 }, 'position'))).toBeFalsy(); + }); it('handles the case in which the same cache-key is requested by multiple semantic-keys within the same task: ', async () => { // a nice edge-case. // real-world version: imagine a 1-channel ome-zarr image, in which the user wants to render with a 3-channel (RGB) shader @@ -286,51 +295,51 @@ describe('async cache', () => { // green: ()=>fetch(http://blah.channel0), // blue: ()=>fetch(http://blah.channel0), // } - // prior to this fix, the cache assumed that any incoming data would map to exactly one (per-task) semantic output - + // prior to this fix, the cache assumed that any incoming data would map to exactly one (per-task) semantic output - // the result would be that the task would resolve itself early, with several keys being undefined - const clr: vec3 = [255, 0, 0] - const { fetchers, id, spies } = fetchTheSameThingTwice(1, clr, [1, 2, 3]) + const clr: vec3 = [255, 0, 0]; + const { fetchers, id, spies } = fetchTheSameThingTwice(1, clr, [1, 2, 3]); // in this case, we want to test what happens when one cache key is associated with multiple semantic keys: - const toCacheKey = () => `http://blah.channel0` - const result = cache.cacheAndUse(fetchers, render, toCacheKey) + const toCacheKey = () => `http://blah.channel0`; + const result = cache.cacheAndUse(fetchers, render, toCacheKey); expect(result).toBeDefined(); - expect(cache.getNumPendingTasks()).toBe(1) + expect(cache.getNumPendingTasks()).toBe(1); expect(rendered.length).toBe(0); // the point of this test is that one promise ends up fullfilling multiple "semantic" entries // thus, we need only resolve one fake promise for the whole thing to be ready (both elements of 'spies' are the same promise) await resolveFakePromises([spies[0]]); - expect(cache.getNumPendingTasks()).toBe(0) + expect(cache.getNumPendingTasks()).toBe(0); expect(rendered.length).toBe(1); // expect that all the parts of the response did show up: const renderedData = rendered[0]; // each entry (position and color) are the same value - which we put in at the beginning of the test (clr) - expect(renderedData.data.color.pretend).toEqual(clr) - expect(renderedData.data.position.pretend).toEqual(clr) - }) + expect(renderedData.data.color.pretend).toEqual(clr); + expect(renderedData.data.position.pretend).toEqual(clr); + }); it('handles the case in which the same cache-key is requested by multiple semantic-keys within the same task (and also the promises beneath are the same promise): ', async () => { // same as above, but internally returns the same promise twice... - const clr: vec3 = [255, 0, 0] - const { fetchers, id, spies } = fetchTheSameThingTwiceOnePromise(1, clr, [1, 2, 3]) + const clr: vec3 = [255, 0, 0]; + const { fetchers, id, spies } = fetchTheSameThingTwiceOnePromise(1, clr, [1, 2, 3]); // in this case, we want to test what happens when one cache key is associated with multiple semantic keys: - const toCacheKey = () => `http://blah.channel0` - const result = cache.cacheAndUse(fetchers, render, toCacheKey) + const toCacheKey = () => `http://blah.channel0`; + const result = cache.cacheAndUse(fetchers, render, toCacheKey); expect(result).toBeDefined(); - expect(cache.getNumPendingTasks()).toBe(1) + expect(cache.getNumPendingTasks()).toBe(1); expect(rendered.length).toBe(0); // the point of this test is that one promise ends up fullfilling multiple "semantic" entries // thus, we need only resolve one fake promise for the whole thing to be ready (both elements of 'spies' are the same promise) await resolveFakePromises([spies[0]]); - expect(cache.getNumPendingTasks()).toBe(0) + expect(cache.getNumPendingTasks()).toBe(0); expect(rendered.length).toBe(1); // expect that all the parts of the response did show up: const renderedData = rendered[0]; // each entry (position and color) are the same value - which we put in at the beginning of the test (clr) - expect(renderedData.data.color.pretend).toEqual(clr) - expect(renderedData.data.position.pretend).toEqual(clr) - }) - }) -}) \ No newline at end of file + expect(renderedData.data.color.pretend).toEqual(clr); + expect(renderedData.data.position.pretend).toEqual(clr); + }); + }); +}); diff --git a/packages/scatterbrain/src/test/render-queue.test.ts b/packages/scatterbrain/src/test/render-queue.test.ts index ae7b134..5a102bb 100644 --- a/packages/scatterbrain/src/test/render-queue.test.ts +++ b/packages/scatterbrain/src/test/render-queue.test.ts @@ -1,129 +1,139 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest' -import delay from 'lodash/delay'; -import { beginLongRunningFrame, type NormalStatus } from '../render-queue'; -import { AsyncDataCache } from '../dataset-cache'; -import { fakeFetch } from './test-utils'; - -type FakeTask = { id: number; color: string }; -type FakeItem = { id: number }; -type FakeSettings = { color: string }; -function cacheKey(item: FakeItem, settings: FakeSettings) { - return `${settings.color}_${item.id}`; -} - -// a few easy tests to start, we can get crazy later -describe('beginLongRunningFrame', () => { - let cache: AsyncDataCache = new AsyncDataCache(() => { }, () => 1, 9999); - let renderSequence: FakeTask[] = []; - function renderPretender(item: FakeItem, settings: FakeSettings, tasks: Record) { - const tsk = tasks[cacheKey(item, settings)]; - if (!tsk) throw new Error('undefined column!'); - renderSequence.push(tsk); - } - const getPretendItemsToRender = (howMany: number) => { - const items: FakeItem[] = []; - for (let i = 0; i < howMany; i += 1) { - items.push({ id: i }); - } - return items; - }; - function rq(item: FakeItem, settings: FakeSettings, signal?: AbortSignal) { - return { - [cacheKey(item, settings)]: () => fakeFetch({ id: item.id, color: settings.color }, signal), - }; - } - // a less wordy fake frame: - const fakeFrame = ( - items: number, - eventHandler: (event: { status: NormalStatus } | { status: 'error'; error: unknown }) => void - ) => - beginLongRunningFrame( - 5, - 33, - getPretendItemsToRender(items), - cache, - { color: 'red' }, - rq, - renderPretender, - eventHandler, - (rq: string, item: FakeItem, settings: FakeSettings) => cacheKey(item, settings), - 9999 - ); - beforeEach(() => { - cache = new AsyncDataCache(() => { }, () => 1, 9999); - renderSequence = []; - }); - it('runs the expected number of tasks', async () => { - let done: () => void; - const testOver = new Promise((resolve, reject) => { - done = () => { resolve() } - }) - const events: string[] = []; - fakeFrame(9, (e) => { - events.push(e.status); // track the events for the test - switch (e.status) { - case 'finished': - done(); // if I dont get called, the test will fail very slowly - break; - default: - break; - } - }); - await testOver; - expect(renderSequence.length).toBe(9); - expect(events.length).toBe(9 + 2); // begin, ... progress x9 ..., finished - expect(events[0]).toEqual('begun'); - expect(events[events.length - 1]).toEqual('finished'); - }); - it('can be cancelled without crash', async () => { - let done: () => void; - const testOver = new Promise((resolve, reject) => { - done = () => resolve() - }) - try { - const frame = fakeFrame(9, (e) => { - expect(renderSequence.length).toBeLessThan(9); - switch (e.status) { - case 'cancelled': - done(); - break; - default: - break; - } - }); - // cancel the fetch after brief delay to simulate cancelling partway through - delay(() => frame.cancelFrame('for testing'), 1); - } catch (err) { - // should not happen! - expect(err).not.toBeDefined(); - } - await testOver; - }); - it('synchronously completes the second frame, because the cache gets warmed up', async () => { - const allEvents: string[] = []; - let done: () => void; - const testOver = new Promise((resolve, reject) => { - done = () => resolve() - }) - fakeFrame(9, (e) => { - allEvents.push(e.status); - if (e.status === 'finished') { - // start the second frame after the first is done for this test: - // eslint-disable-next-line @typescript-eslint/no-shadow - fakeFrame(9, (e) => { - allEvents.push(e.status); - switch (e.status) { - case 'finished_synchronously': - break; - default: - expect(e.status).toBe('finished_synchronously'); - } - done(); - }); - } - }); - await testOver - expect(renderSequence.length).toBe(9 + 9); // two frames, each having 9 tasks - expect(allEvents.length).toBe(9 + 2 + 1); // all of the events of the first frame(begun,progress*9,finished) + 'finished_sync' - }); -}); +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import delay from 'lodash/delay'; +import { beginLongRunningFrame, type NormalStatus } from '../render-queue'; +import { AsyncDataCache } from '../dataset-cache'; +import { fakeFetch } from './test-utils'; + +type FakeTask = { id: number; color: string }; +type FakeItem = { id: number }; +type FakeSettings = { color: string }; +function cacheKey(item: FakeItem, settings: FakeSettings) { + return `${settings.color}_${item.id}`; +} + +// a few easy tests to start, we can get crazy later +describe('beginLongRunningFrame', () => { + let cache: AsyncDataCache = new AsyncDataCache( + () => {}, + () => 1, + 9999 + ); + let renderSequence: FakeTask[] = []; + function renderPretender(item: FakeItem, settings: FakeSettings, tasks: Record) { + const tsk = tasks[cacheKey(item, settings)]; + if (!tsk) throw new Error('undefined column!'); + renderSequence.push(tsk); + } + const getPretendItemsToRender = (howMany: number) => { + const items: FakeItem[] = []; + for (let i = 0; i < howMany; i += 1) { + items.push({ id: i }); + } + return items; + }; + function rq(item: FakeItem, settings: FakeSettings, signal?: AbortSignal) { + return { + [cacheKey(item, settings)]: () => fakeFetch({ id: item.id, color: settings.color }, signal), + }; + } + // a less wordy fake frame: + const fakeFrame = ( + items: number, + eventHandler: (event: { status: NormalStatus } | { status: 'error'; error: unknown }) => void + ) => + beginLongRunningFrame( + 5, + 33, + getPretendItemsToRender(items), + cache, + { color: 'red' }, + rq, + renderPretender, + eventHandler, + (rq: string, item: FakeItem, settings: FakeSettings) => cacheKey(item, settings), + 9999 + ); + beforeEach(() => { + cache = new AsyncDataCache( + () => {}, + () => 1, + 9999 + ); + renderSequence = []; + }); + it('runs the expected number of tasks', async () => { + let done: () => void; + const testOver = new Promise((resolve, reject) => { + done = () => { + resolve(); + }; + }); + const events: string[] = []; + fakeFrame(9, (e) => { + events.push(e.status); // track the events for the test + switch (e.status) { + case 'finished': + done(); // if I dont get called, the test will fail very slowly + break; + default: + break; + } + }); + await testOver; + expect(renderSequence.length).toBe(9); + expect(events.length).toBe(9 + 2); // begin, ... progress x9 ..., finished + expect(events[0]).toEqual('begun'); + expect(events[events.length - 1]).toEqual('finished'); + }); + it('can be cancelled without crash', async () => { + let done: () => void; + const testOver = new Promise((resolve, reject) => { + done = () => resolve(); + }); + try { + const frame = fakeFrame(9, (e) => { + expect(renderSequence.length).toBeLessThan(9); + switch (e.status) { + case 'cancelled': + done(); + break; + default: + break; + } + }); + // cancel the fetch after brief delay to simulate cancelling partway through + delay(() => frame.cancelFrame('for testing'), 1); + } catch (err) { + // should not happen! + expect(err).not.toBeDefined(); + } + await testOver; + }); + it('synchronously completes the second frame, because the cache gets warmed up', async () => { + const allEvents: string[] = []; + let done: () => void; + const testOver = new Promise((resolve, reject) => { + done = () => resolve(); + }); + fakeFrame(9, (e) => { + allEvents.push(e.status); + if (e.status === 'finished') { + // start the second frame after the first is done for this test: + // eslint-disable-next-line @typescript-eslint/no-shadow + fakeFrame(9, (e) => { + allEvents.push(e.status); + switch (e.status) { + case 'finished_synchronously': + break; + default: + expect(e.status).toBe('finished_synchronously'); + } + done(); + }); + } + }); + await testOver; + expect(renderSequence.length).toBe(9 + 9); // two frames, each having 9 tasks + expect(allEvents.length).toBe(9 + 2 + 1); // all of the events of the first frame(begun,progress*9,finished) + 'finished_sync' + }); +}); diff --git a/packages/scatterbrain/src/test/test-utils.ts b/packages/scatterbrain/src/test/test-utils.ts index e5970e0..0aa777d 100644 --- a/packages/scatterbrain/src/test/test-utils.ts +++ b/packages/scatterbrain/src/test/test-utils.ts @@ -1,12 +1,15 @@ -import { delay } from "lodash"; +import { delay } from 'lodash'; export const fakeFetch = (data: FakeTask, signal?: AbortSignal): Promise => new Promise((resolve, reject) => { - delay(() => { - if (signal?.aborted ?? false) { - reject(new DOMException('abort fetch', 'AbortError')); - } else { - resolve(data); - } - }, 100 * Math.random() + 50); - }); \ No newline at end of file + delay( + () => { + if (signal?.aborted ?? false) { + reject(new DOMException('abort fetch', 'AbortError')); + } else { + resolve(data); + } + }, + 100 * Math.random() + 50 + ); + }); diff --git a/packages/scatterbrain/tsconfig.json b/packages/scatterbrain/tsconfig.json index d9869b8..baaee9e 100644 --- a/packages/scatterbrain/tsconfig.json +++ b/packages/scatterbrain/tsconfig.json @@ -1,20 +1,13 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "paths": { - "~/*": [ - "./*" - ] - }, - "moduleResolution": "Bundler", - "module": "ES2022", - "target": "ES2022", - "lib": [ - "es2022", - "DOM" - ], - }, - "include": [ - "./src/index.ts" - ] -} \ No newline at end of file +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "paths": { + "~/*": ["./*"] + }, + "moduleResolution": "Bundler", + "module": "ES2022", + "target": "ES2022", + "lib": ["es2022", "DOM"] + }, + "include": ["./src/index.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc34308..50f0831 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4067 +1,5382 @@ lockfileVersion: '6.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false importers: - - .: - devDependencies: - '@parcel/packager-ts': - specifier: 2.12.0 - version: 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-typescript-types': - specifier: 2.12.0 - version: 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) - buffer: - specifier: ^5.5.0||^6.0.0 - version: 6.0.3 - parcel: - specifier: 2.12.0 - version: 2.12.0(typescript@5.3.3) - process: - specifier: ^0.11.10 - version: 0.11.10 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - apps/common: - dependencies: - '@alleninstitute/vis-geometry': - specifier: workspace:* - version: link:../../packages/geometry - '@alleninstitute/vis-scatterbrain': - specifier: workspace:* - version: link:../../packages/scatterbrain - '@types/lodash': - specifier: ^4.14.202 - version: 4.14.202 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - regl: - specifier: ^2.1.0 - version: 2.1.0 - zarr: - specifier: ^0.6.2 - version: 0.6.2 - - apps/layers: - dependencies: - '@alleninstitute/vis-geometry': - specifier: workspace:* - version: link:../../packages/geometry - '@alleninstitute/vis-scatterbrain': - specifier: workspace:* - version: link:../../packages/scatterbrain - '@czi-sds/components': - specifier: ^20.0.1 - version: 20.0.1(@emotion/core@11.0.0)(@emotion/css@11.11.2)(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/base@5.0.0-beta.40)(@mui/icons-material@5.15.15)(@mui/lab@5.0.0-alpha.170)(@mui/material@5.15.15)(react-dom@18.3.0)(react@18.3.0) - '@emotion/css': - specifier: ^11.11.2 - version: 11.11.2 - '@emotion/react': - specifier: ^11.11.4 - version: 11.11.4(@types/react@18.3.0)(react@18.3.0) - '@emotion/styled': - specifier: ^11.11.5 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) - '@mui/base': - specifier: 5.0.0-beta.40 - version: 5.0.0-beta.40(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) - '@mui/icons-material': - specifier: ^5.15.15 - version: 5.15.15(@mui/material@5.15.15)(@types/react@18.3.0)(react@18.3.0) - '@mui/lab': - specifier: 5.0.0-alpha.170 - version: 5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) - '@mui/material': - specifier: ^5.15.15 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) - '@types/lodash': - specifier: ^4.14.202 - version: 4.14.202 - file-saver: - specifier: ^2.0.5 - version: 2.0.5 - json5: - specifier: ^2.2.3 - version: 2.2.3 - kiwi-schema: - specifier: ^0.5.0 - version: 0.5.0 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - react: - specifier: ^18.3.0 - version: 18.3.0 - react-dom: - specifier: ^18.3.0 - version: 18.3.0(react@18.3.0) - regl: - specifier: ^2.1.0 - version: 2.1.0 - zarr: - specifier: ^0.6.2 - version: 0.6.2 - devDependencies: - '@parcel/packager-ts': - specifier: ^2.12.0 - version: 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-typescript-types': - specifier: ^2.12.0 - version: 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) - '@types/file-saver': - specifier: ^2.0.7 - version: 2.0.7 - '@types/react': - specifier: ^18.3.0 - version: 18.3.0 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - esbuild: - specifier: ^0.19.12 - version: 0.19.12 - parcel: - specifier: 2.12.0 - version: 2.12.0(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - apps/neuroglancer-url: - devDependencies: - esbuild: - specifier: ^0.19.12 - version: 0.19.12 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - apps/omezarr-viewer: - dependencies: - '@alleninstitute/vis-geometry': - specifier: workspace:* - version: link:../../packages/geometry - '@alleninstitute/vis-scatterbrain': - specifier: workspace:* - version: link:../../packages/scatterbrain - '@types/lodash': - specifier: ^4.14.202 - version: 4.14.202 - '@zhobo63/imgui-ts': - specifier: ^0.1.43 - version: 0.1.43 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - regl: - specifier: ^2.1.0 - version: 2.1.0 - zarr: - specifier: ^0.6.2 - version: 0.6.2 - devDependencies: - esbuild: - specifier: ^0.19.12 - version: 0.19.12 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - apps/scatterplot: - dependencies: - '@alleninstitute/vis-geometry': - specifier: workspace:* - version: link:../../packages/geometry - '@alleninstitute/vis-scatterbrain': - specifier: workspace:* - version: link:../../packages/scatterbrain - '@types/lodash': - specifier: ^4.14.202 - version: 4.14.202 - '@zhobo63/imgui-ts': - specifier: ^0.1.43 - version: 0.1.43 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - regl: - specifier: ^2.1.0 - version: 2.1.0 - devDependencies: - esbuild: - specifier: ^0.19.12 - version: 0.19.12 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - packages/geometry: - devDependencies: - '@parcel/packager-ts': - specifier: ^2.12.0 - version: 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-typescript-types': - specifier: ^2.12.0 - version: 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) - parcel: - specifier: 2.12.0 - version: 2.12.0(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - vitest: - specifier: ^1.4.0 - version: 1.4.0 - - packages/scatterbrain: - dependencies: - '@alleninstitute/vis-geometry': - specifier: workspace:* - version: link:../geometry - lodash: - specifier: ^4.17.21 - version: 4.17.21 - regl: - specifier: ^2.1.0 - version: 2.1.0 - devDependencies: - '@parcel/packager-ts': - specifier: ^2.12.0 - version: 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-typescript-types': - specifier: ^2.12.0 - version: 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) - '@types/lodash': - specifier: ^4.14.202 - version: 4.14.202 - parcel: - specifier: 2.12.0 - version: 2.12.0(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - vitest: - specifier: ^1.4.0 - version: 1.4.0 + .: + devDependencies: + '@parcel/packager-ts': + specifier: 2.12.0 + version: 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-typescript-types': + specifier: 2.12.0 + version: 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) + buffer: + specifier: ^5.5.0||^6.0.0 + version: 6.0.3 + parcel: + specifier: 2.12.0 + version: 2.12.0(typescript@5.3.3) + prettier: + specifier: 3.3.2 + version: 3.3.2 + process: + specifier: ^0.11.10 + version: 0.11.10 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + + apps/common: + dependencies: + '@alleninstitute/vis-geometry': + specifier: workspace:* + version: link:../../packages/geometry + '@alleninstitute/vis-scatterbrain': + specifier: workspace:* + version: link:../../packages/scatterbrain + '@types/lodash': + specifier: ^4.14.202 + version: 4.14.202 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + regl: + specifier: ^2.1.0 + version: 2.1.0 + zarr: + specifier: ^0.6.2 + version: 0.6.2 + + apps/layers: + dependencies: + '@alleninstitute/vis-geometry': + specifier: workspace:* + version: link:../../packages/geometry + '@alleninstitute/vis-scatterbrain': + specifier: workspace:* + version: link:../../packages/scatterbrain + '@czi-sds/components': + specifier: ^20.0.1 + version: 20.0.1(@emotion/core@11.0.0)(@emotion/css@11.11.2)(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/base@5.0.0-beta.40)(@mui/icons-material@5.15.15)(@mui/lab@5.0.0-alpha.170)(@mui/material@5.15.15)(react-dom@18.3.0)(react@18.3.0) + '@emotion/css': + specifier: ^11.11.2 + version: 11.11.2 + '@emotion/react': + specifier: ^11.11.4 + version: 11.11.4(@types/react@18.3.0)(react@18.3.0) + '@emotion/styled': + specifier: ^11.11.5 + version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) + '@mui/base': + specifier: 5.0.0-beta.40 + version: 5.0.0-beta.40(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) + '@mui/icons-material': + specifier: ^5.15.15 + version: 5.15.15(@mui/material@5.15.15)(@types/react@18.3.0)(react@18.3.0) + '@mui/lab': + specifier: 5.0.0-alpha.170 + version: 5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) + '@mui/material': + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) + '@types/lodash': + specifier: ^4.14.202 + version: 4.14.202 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + json5: + specifier: ^2.2.3 + version: 2.2.3 + kiwi-schema: + specifier: ^0.5.0 + version: 0.5.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + react: + specifier: ^18.3.0 + version: 18.3.0 + react-dom: + specifier: ^18.3.0 + version: 18.3.0(react@18.3.0) + regl: + specifier: ^2.1.0 + version: 2.1.0 + zarr: + specifier: ^0.6.2 + version: 0.6.2 + devDependencies: + '@parcel/packager-ts': + specifier: ^2.12.0 + version: 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-typescript-types': + specifier: ^2.12.0 + version: 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) + '@types/file-saver': + specifier: ^2.0.7 + version: 2.0.7 + '@types/react': + specifier: ^18.3.0 + version: 18.3.0 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + esbuild: + specifier: ^0.19.12 + version: 0.19.12 + parcel: + specifier: 2.12.0 + version: 2.12.0(typescript@5.3.3) + typescript: + specifier: ^5.3.3 + version: 5.3.3 + + apps/neuroglancer-url: + devDependencies: + esbuild: + specifier: ^0.19.12 + version: 0.19.12 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + + apps/omezarr-viewer: + dependencies: + '@alleninstitute/vis-geometry': + specifier: workspace:* + version: link:../../packages/geometry + '@alleninstitute/vis-scatterbrain': + specifier: workspace:* + version: link:../../packages/scatterbrain + '@types/lodash': + specifier: ^4.14.202 + version: 4.14.202 + '@zhobo63/imgui-ts': + specifier: ^0.1.43 + version: 0.1.43 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + regl: + specifier: ^2.1.0 + version: 2.1.0 + zarr: + specifier: ^0.6.2 + version: 0.6.2 + devDependencies: + esbuild: + specifier: ^0.19.12 + version: 0.19.12 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + + apps/scatterplot: + dependencies: + '@alleninstitute/vis-geometry': + specifier: workspace:* + version: link:../../packages/geometry + '@alleninstitute/vis-scatterbrain': + specifier: workspace:* + version: link:../../packages/scatterbrain + '@types/lodash': + specifier: ^4.14.202 + version: 4.14.202 + '@zhobo63/imgui-ts': + specifier: ^0.1.43 + version: 0.1.43 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + regl: + specifier: ^2.1.0 + version: 2.1.0 + devDependencies: + esbuild: + specifier: ^0.19.12 + version: 0.19.12 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + + packages/geometry: + devDependencies: + '@parcel/packager-ts': + specifier: ^2.12.0 + version: 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-typescript-types': + specifier: ^2.12.0 + version: 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) + parcel: + specifier: 2.12.0 + version: 2.12.0(typescript@5.3.3) + typescript: + specifier: ^5.3.3 + version: 5.3.3 + vitest: + specifier: ^1.4.0 + version: 1.4.0 + + packages/scatterbrain: + dependencies: + '@alleninstitute/vis-geometry': + specifier: workspace:* + version: link:../geometry + lodash: + specifier: ^4.17.21 + version: 4.17.21 + regl: + specifier: ^2.1.0 + version: 2.1.0 + devDependencies: + '@parcel/packager-ts': + specifier: ^2.12.0 + version: 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-typescript-types': + specifier: ^2.12.0 + version: 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) + '@types/lodash': + specifier: ^4.14.202 + version: 4.14.202 + parcel: + specifier: 2.12.0 + version: 2.12.0(typescript@5.3.3) + typescript: + specifier: ^5.3.3 + version: 5.3.3 + vitest: + specifier: ^1.4.0 + version: 1.4.0 packages: + /@babel/code-frame@7.23.5: + resolution: + { + integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + /@babel/helper-module-imports@7.24.3: + resolution: + { + integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-string-parser@7.24.1: + resolution: + { + integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==, + } + engines: { node: '>=6.9.0' } + dev: false + + /@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' } + dev: false + + /@babel/highlight@7.23.4: + resolution: + { + integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/runtime@7.24.5: + resolution: + { + integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==, + } + engines: { node: '>=6.9.0' } + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/types@7.24.5: + resolution: + { + integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 + to-fast-properties: 2.0.0 + dev: false + + /@czi-sds/components@20.0.1(@emotion/core@11.0.0)(@emotion/css@11.11.2)(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/base@5.0.0-beta.40)(@mui/icons-material@5.15.15)(@mui/lab@5.0.0-alpha.170)(@mui/material@5.15.15)(react-dom@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-vB3gGl+tzxDmV00J8ioLr/LIj1WU26448Pot9orgyGeZy+AaJM7WMT/qsSpPSCGEKLN5ykcIUBIDIGK1E/JZmQ==, + } + peerDependencies: + '@emotion/core': ^11.0.0 + '@emotion/css': ^11.11.2 + '@emotion/react': ^11.11.3 + '@emotion/styled': ^11.11.0 + '@mui/base': ^5.0.0-beta.30 + '@mui/icons-material': ^5.15.3 + '@mui/lab': ^5.0.0-alpha.159 + '@mui/material': ^5.15.3 + react: '>=17.0.1' + react-dom: '>=17.0.1' + dependencies: + '@emotion/core': 11.0.0 + '@emotion/css': 11.11.2 + '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) + '@mui/base': 5.0.0-beta.40(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) + '@mui/icons-material': 5.15.15(@mui/material@5.15.15)(@types/react@18.3.0)(react@18.3.0) + '@mui/lab': 5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) + '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + dev: false + + /@emotion/babel-plugin@11.11.0: + resolution: + { + integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==, + } + dependencies: + '@babel/helper-module-imports': 7.24.3 + '@babel/runtime': 7.24.5 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.4 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + + /@emotion/cache@11.11.0: + resolution: + { + integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==, + } + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + + /@emotion/core@11.0.0: + resolution: + { + integrity: sha512-w4sE3AmHmyG6RDKf6mIbtHpgJUSJ2uGvPQb8VXFL7hFjMPibE8IiehG8cMX3Ztm4svfCQV6KqusQbeIOkurBcA==, + } + dev: false + + /@emotion/css@11.11.2: + resolution: + { + integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==, + } + dependencies: + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.4 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + dev: false + + /@emotion/hash@0.9.1: + resolution: + { + integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==, + } + dev: false + + /@emotion/is-prop-valid@1.2.2: + resolution: + { + integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==, + } + dependencies: + '@emotion/memoize': 0.8.1 + dev: false + + /@emotion/memoize@0.8.1: + resolution: + { + integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==, + } + dev: false + + /@emotion/react@11.11.4(@types/react@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==, + } + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.3.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.0 + dev: false + + /@emotion/serialize@1.1.4: + resolution: + { + integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==, + } + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + dev: false + + /@emotion/sheet@1.2.2: + resolution: + { + integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==, + } + dev: false + + /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==, + } + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.2 + '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.0) + '@emotion/utils': 1.2.1 + '@types/react': 18.3.0 + react: 18.3.0 + dev: false + + /@emotion/unitless@0.8.1: + resolution: + { + integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==, + } + dev: false + + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.0): + resolution: + { + integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==, + } + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.3.0 + dev: false + + /@emotion/utils@1.2.1: + resolution: + { + integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==, + } + dev: false + + /@emotion/weak-memoize@0.3.1: + resolution: + { + integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==, + } + dev: false + + /@esbuild/aix-ppc64@0.19.12: + resolution: + { + integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, + } + engines: { node: '>=12' } + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/aix-ppc64@0.20.2: + resolution: + { + integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==, + } + engines: { node: '>=12' } + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: + { + integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: + { + integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: + { + integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, + } + engines: { node: '>=12' } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: + { + integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==, + } + engines: { node: '>=12' } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: + { + integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: + { + integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: + { + integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: + { + integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: + { + integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: + { + integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: + { + integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: + { + integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: + { + integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: + { + integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: + { + integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: + { + integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: + { + integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, + } + engines: { node: '>=12' } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: + { + integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==, + } + engines: { node: '>=12' } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: + { + integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, + } + engines: { node: '>=12' } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: + { + integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==, + } + engines: { node: '>=12' } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: + { + integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, + } + engines: { node: '>=12' } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: + { + integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==, + } + engines: { node: '>=12' } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: + { + integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, + } + engines: { node: '>=12' } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: + { + integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==, + } + engines: { node: '>=12' } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: + { + integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, + } + engines: { node: '>=12' } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: + { + integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==, + } + engines: { node: '>=12' } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: + { + integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, + } + engines: { node: '>=12' } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: + { + integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==, + } + engines: { node: '>=12' } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: + { + integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, + } + engines: { node: '>=12' } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: + { + integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==, + } + engines: { node: '>=12' } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: + { + integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: + { + integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: + { + integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: + { + integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: + { + integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: + { + integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: + { + integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: + { + integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: + { + integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: + { + integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: + { + integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, + } + engines: { node: '>=12' } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: + { + integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==, + } + engines: { node: '>=12' } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: + { + integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: + { + integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@floating-ui/core@1.6.1: + resolution: + { + integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==, + } + dependencies: + '@floating-ui/utils': 0.2.2 + dev: false + + /@floating-ui/dom@1.6.4: + resolution: + { + integrity: sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==, + } + dependencies: + '@floating-ui/core': 1.6.1 + '@floating-ui/utils': 0.2.2 + dev: false + + /@floating-ui/react-dom@2.0.9(react-dom@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==, + } + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.6.4 + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + dev: false + + /@floating-ui/utils@0.2.2: + resolution: + { + integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==, + } + dev: false + + /@jest/schemas@29.6.3: + resolution: + { + integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } + dev: true + + /@lezer/common@1.2.1: + resolution: + { + integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==, + } + dev: true + + /@lezer/lr@1.4.0: + resolution: + { + integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==, + } + dependencies: + '@lezer/common': 1.2.1 + dev: true + + /@lmdb/lmdb-darwin-arm64@2.8.5: + resolution: + { + integrity: sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-darwin-x64@2.8.5: + resolution: + { + integrity: sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==, + } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-linux-arm64@2.8.5: + resolution: + { + integrity: sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-linux-arm@2.8.5: + resolution: + { + integrity: sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==, + } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-linux-x64@2.8.5: + resolution: + { + integrity: sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-win32-x64@2.8.5: + resolution: + { + integrity: sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==, + } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@mischnic/json-sourcemap@0.1.1: + resolution: + { + integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@lezer/common': 1.2.1 + '@lezer/lr': 1.4.0 + json5: 2.2.3 + dev: true + + /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: + resolution: + { + integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2: + resolution: + { + integrity: sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==, + } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2: + resolution: + { + integrity: sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2: + resolution: + { + integrity: sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==, + } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2: + resolution: + { + integrity: sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2: + resolution: + { + integrity: sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==, + } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@mui/base@5.0.0-beta.40(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@floating-ui/react-dom': 2.0.9(react-dom@18.3.0)(react@18.3.0) + '@mui/types': 7.2.14(@types/react@18.3.0) + '@mui/utils': 5.15.14(@types/react@18.3.0)(react@18.3.0) + '@popperjs/core': 2.11.8 + '@types/react': 18.3.0 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + dev: false + + /@mui/core-downloads-tracker@5.15.15: + resolution: + { + integrity: sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==, + } + dev: false + + /@mui/icons-material@5.15.15(@mui/material@5.15.15)(@types/react@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) + '@types/react': 18.3.0 + react: 18.3.0 + dev: false + + /@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-0bDVECGmrNjd3+bLdcLiwYZ0O4HP5j5WSQm5DV6iA/Z9kr8O6AnvZ1bv9ImQbbX7Gj3pX4o43EKwCutj3EQxQg==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material': '>=5.15.0' + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) + '@mui/base': 5.0.0-beta.40(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) + '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) + '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react@18.3.0) + '@mui/types': 7.2.14(@types/react@18.3.0) + '@mui/utils': 5.15.14(@types/react@18.3.0)(react@18.3.0) + '@types/react': 18.3.0 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + dev: false + + /@mui/material@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) + '@mui/base': 5.0.0-beta.40(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) + '@mui/core-downloads-tracker': 5.15.15 + '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react@18.3.0) + '@mui/types': 7.2.14(@types/react@18.3.0) + '@mui/utils': 5.15.14(@types/react@18.3.0)(react@18.3.0) + '@types/react': 18.3.0 + '@types/react-transition-group': 4.4.10 + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + react-is: 18.2.0 + react-transition-group: 4.4.5(react-dom@18.3.0)(react@18.3.0) + dev: false + + /@mui/private-theming@5.15.14(@types/react@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@mui/utils': 5.15.14(@types/react@18.3.0)(react@18.3.0) + '@types/react': 18.3.0 + prop-types: 15.8.1 + react: 18.3.0 + dev: false + + /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.0): + resolution: + { + integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.0 + dev: false + + /@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) + '@mui/private-theming': 5.15.14(@types/react@18.3.0)(react@18.3.0) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.0) + '@mui/types': 7.2.14(@types/react@18.3.0) + '@mui/utils': 5.15.14(@types/react@18.3.0)(react@18.3.0) + '@types/react': 18.3.0 + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.0 + dev: false + + /@mui/types@7.2.14(@types/react@18.3.0): + resolution: + { + integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==, + } + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.0 + dev: false + + /@mui/utils@5.15.14(@types/react@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@types/prop-types': 15.7.12 + '@types/react': 18.3.0 + prop-types: 15.8.1 + react: 18.3.0 + react-is: 18.2.0 + dev: false + + /@parcel/bundler-default@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-3ybN74oYNMKyjD6V20c9Gerdbh7teeNvVMwIoHIQMzuIFT6IGX53PyOLlOKRLbjxMc0TMimQQxIt2eQqxR5LsA==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/graph': 3.2.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/cache@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==, + } + engines: { node: '>= 12.0.0' } + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/logger': 2.12.0 + '@parcel/utils': 2.12.0 + lmdb: 2.8.5 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/codeframe@2.12.0: + resolution: + { + integrity: sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==, + } + engines: { node: '>= 12.0.0' } + dependencies: + chalk: 4.1.2 + dev: true + + /@parcel/compressor-raw@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-h41Q3X7ZAQ9wbQ2csP8QGrwepasLZdXiuEdpUryDce6rF9ZiHoJ97MRpdLxOhOPyASTw/xDgE1xyaPQr0Q3f5A==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/config-default@2.12.0(@parcel/core@2.12.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-dPNe2n9eEsKRc1soWIY0yToMUPirPIa2QhxcCB3Z5RjpDGIXm0pds+BaiqY6uGLEEzsjhRO0ujd4v2Rmm0vuFg==, + } + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/bundler-default': 2.12.0(@parcel/core@2.12.0) + '@parcel/compressor-raw': 2.12.0(@parcel/core@2.12.0) + '@parcel/core': 2.12.0 + '@parcel/namer-default': 2.12.0(@parcel/core@2.12.0) + '@parcel/optimizer-css': 2.12.0(@parcel/core@2.12.0) + '@parcel/optimizer-htmlnano': 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) + '@parcel/optimizer-image': 2.12.0(@parcel/core@2.12.0) + '@parcel/optimizer-svgo': 2.12.0(@parcel/core@2.12.0) + '@parcel/optimizer-swc': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-css': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-html': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-js': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-raw': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-svg': 2.12.0(@parcel/core@2.12.0) + '@parcel/packager-wasm': 2.12.0(@parcel/core@2.12.0) + '@parcel/reporter-dev-server': 2.12.0(@parcel/core@2.12.0) + '@parcel/resolver-default': 2.12.0(@parcel/core@2.12.0) + '@parcel/runtime-browser-hmr': 2.12.0(@parcel/core@2.12.0) + '@parcel/runtime-js': 2.12.0(@parcel/core@2.12.0) + '@parcel/runtime-react-refresh': 2.12.0(@parcel/core@2.12.0) + '@parcel/runtime-service-worker': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-babel': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-css': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-html': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-image': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-js': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-json': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-postcss': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-posthtml': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-raw': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-react-refresh-wrap': 2.12.0(@parcel/core@2.12.0) + '@parcel/transformer-svg': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + dev: true + + /@parcel/core@2.12.0: + resolution: + { + integrity: sha512-s+6pwEj+GfKf7vqGUzN9iSEPueUssCCQrCBUlcAfKrJe0a22hTUCjewpB0I7lNrCIULt8dkndD+sMdOrXsRl6Q==, + } + engines: { node: '>= 12.0.0' } + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/cache': 2.12.0(@parcel/core@2.12.0) + '@parcel/diagnostic': 2.12.0 + '@parcel/events': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/graph': 3.2.0 + '@parcel/logger': 2.12.0 + '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/profiler': 2.12.0 + '@parcel/rust': 2.12.0 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + abortcontroller-polyfill: 1.7.5 + base-x: 3.0.9 + browserslist: 4.22.3 + clone: 2.1.2 + dotenv: 7.0.0 + dotenv-expand: 5.1.0 + json5: 2.2.3 + msgpackr: 1.10.1 + nullthrows: 1.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/diagnostic@2.12.0: + resolution: + { + integrity: sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==, + } + engines: { node: '>= 12.0.0' } + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + dev: true + + /@parcel/events@2.12.0: + resolution: + { + integrity: sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==, + } + engines: { node: '>= 12.0.0' } + dev: true + + /@parcel/fs@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==, + } + engines: { node: '>= 12.0.0' } + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/rust': 2.12.0 + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + '@parcel/watcher': 2.4.1 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/graph@3.2.0: + resolution: + { + integrity: sha512-xlrmCPqy58D4Fg5umV7bpwDx5Vyt7MlnQPxW68vae5+BA4GSWetfZt+Cs5dtotMG2oCHzZxhIPt7YZ7NRyQzLA==, + } + engines: { node: '>= 12.0.0' } + dependencies: + nullthrows: 1.1.1 + dev: true + + /@parcel/logger@2.12.0: + resolution: + { + integrity: sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==, + } + engines: { node: '>= 12.0.0' } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/events': 2.12.0 + dev: true + + /@parcel/markdown-ansi@2.12.0: + resolution: + { + integrity: sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==, + } + engines: { node: '>= 12.0.0' } + dependencies: + chalk: 4.1.2 + dev: true + + /@parcel/namer-default@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-9DNKPDHWgMnMtqqZIMiEj/R9PNWW16lpnlHjwK3ciRlMPgjPJ8+UNc255teZODhX0T17GOzPdGbU/O/xbxVPzA==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/node-resolver-core@3.3.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==, + } + engines: { node: '>= 12.0.0' } + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/diagnostic': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/optimizer-css@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-ifbcC97fRzpruTjaa8axIFeX4MjjSIlQfem3EJug3L2AVqQUXnM1XO8L0NaXGNLTW2qnh1ZjIJ7vXT/QhsphsA==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + browserslist: 4.22.3 + lightningcss: 1.24.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/optimizer-htmlnano@2.12.0(@parcel/core@2.12.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-MfPMeCrT8FYiOrpFHVR+NcZQlXAptK2r4nGJjfT+ndPBhEEZp4yyL7n1y7HfX9geg5altc4WTb4Gug7rCoW8VQ==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + htmlnano: 2.1.0(svgo@2.8.0)(typescript@5.3.3) + nullthrows: 1.1.1 + posthtml: 0.16.6 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + dev: true + + /@parcel/optimizer-image@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-bo1O7raeAIbRU5nmNVtx8divLW9Xqn0c57GVNGeAK4mygnQoqHqRZ0mR9uboh64pxv6ijXZHPhKvU9HEpjPjBQ==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/utils': 2.12.0 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/optimizer-svgo@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-Kyli+ZZXnoonnbeRQdoWwee9Bk2jm/49xvnfb+2OO8NN0d41lblBoRhOyFiScRnJrw7eVl1Xrz7NTkXCIO7XFQ==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/optimizer-swc@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-iBi6LZB3lm6WmbXfzi8J3DCVPmn4FN2lw7DGXxUXu7MouDPVWfTsM6U/5TkSHJRNRogZ2gqy5q9g34NPxHbJcw==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + '@swc/core': 1.3.107(@swc/helpers@0.5.6) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/package-manager@2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6): + resolution: + { + integrity: sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==, + } + engines: { node: '>= 12.0.0' } + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/logger': 2.12.0 + '@parcel/node-resolver-core': 3.3.0(@parcel/core@2.12.0) + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + '@swc/core': 1.3.107(@swc/helpers@0.5.6) + semver: 7.5.4 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/packager-css@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-j3a/ODciaNKD19IYdWJT+TP+tnhhn5koBGBWWtrKSu0UxWpnezIGZetit3eE+Y9+NTePalMkvpIlit2eDhvfJA==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + lightningcss: 1.24.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-html@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-PpvGB9hFFe+19NXGz2ApvPrkA9GwEqaDAninT+3pJD57OVBaxB8U+HN4a5LICKxjUppPPqmrLb6YPbD65IX4RA==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-js@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-viMF+FszITRRr8+2iJyk+4ruGiL27Y6AF7hQ3xbJfzqnmbOhGFtLTQwuwhOLqN/mWR2VKdgbLpZSarWaO3yAMg==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + globals: 13.24.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-raw@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-tJZqFbHqP24aq1F+OojFbQIc09P/u8HAW5xfndCrFnXpW4wTgM3p03P0xfw3gnNq+TtxHJ8c3UFE5LnXNNKhYA==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-svg@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-ldaGiacGb2lLqcXas97k8JiZRbAnNREmcvoY2W2dvW4loVuDT9B9fU777mbV6zODpcgcHWsLL3lYbJ5Lt3y9cg==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-ts@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-8wR0BNN2NBD+IIU0tjioK+lRD4p2Qi/fKxDH5ixEW912tRV+Vd4kE8k++U6YQIpSlK4FRnjFod5zYYhNSLuiXg==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/packager-wasm@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-fYqZzIqO9fGYveeImzF8ll6KRo2LrOXfD+2Y5U3BiX/wp9wv17dz50QLDQm9hmTcKGWxK4yWqKQh+Evp/fae7A==, + } + engines: { node: '>=12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/plugin@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-nc/uRA8DiMoe4neBbzV6kDndh/58a4wQuGKw5oEoIwBCHUvE2W8ZFSu7ollSXUGRzfacTt4NdY8TwS73ScWZ+g==, + } + engines: { node: '>= 12.0.0' } + dependencies: + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/plugin@2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6): + resolution: + { + integrity: sha512-nc/uRA8DiMoe4neBbzV6kDndh/58a4wQuGKw5oEoIwBCHUvE2W8ZFSu7ollSXUGRzfacTt4NdY8TwS73ScWZ+g==, + } + engines: { node: '>= 12.0.0' } + dependencies: + '@parcel/types': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/profiler@2.12.0: + resolution: + { + integrity: sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==, + } + engines: { node: '>= 12.0.0' } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/events': 2.12.0 + chrome-trace-event: 1.0.3 + dev: true + + /@parcel/reporter-cli@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-TqKsH4GVOLPSCanZ6tcTPj+rdVHERnt5y4bwTM82cajM21bCX1Ruwp8xOKU+03091oV2pv5ieB18pJyRF7IpIw==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + chalk: 4.1.2 + term-size: 2.2.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/reporter-dev-server@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-tIcDqRvAPAttRlTV28dHcbWT5K2r/MBFks7nM4nrEDHWtnrCwimkDmZTc1kD8QOCCjGVwRHcQybpHvxfwol6GA==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/reporter-tracer@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-g8rlu9GxB8Ut/F8WGx4zidIPQ4pcYFjU9bZO+fyRIPrSUFH2bKijCnbZcr4ntqzDGx74hwD6cCG4DBoleq2UlQ==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + chrome-trace-event: 1.0.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/resolver-default@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-uuhbajTax37TwCxu7V98JtRLiT6hzE4VYSu5B7Qkauy14/WFt2dz6GOUXPgVsED569/hkxebPx3KCMtZW6cHHA==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/node-resolver-core': 3.3.0(@parcel/core@2.12.0) + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/runtime-browser-hmr@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-4ZLp2FWyD32r0GlTulO3+jxgsA3oO1P1b5oO2IWuWilfhcJH5LTiazpL5YdusUjtNn9PGN6QLAWfxmzRIfM+Ow==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/runtime-js@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-sBerP32Z1crX5PfLNGDSXSdqzlllM++GVnVQVeM7DgMKS8JIFG3VLi28YkX+dYYGtPypm01JoIHCkvwiZEcQJg==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/runtime-react-refresh@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-SCHkcczJIDFTFdLTzrHTkQ0aTrX3xH6jrA4UsCBL6ji61+w+ohy4jEEe9qCgJVXhnJfGLE43HNXek+0MStX+Mw==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + react-error-overlay: 6.0.9 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/runtime-service-worker@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-BXuMBsfiwpIEnssn+jqfC3jkgbS8oxeo3C7xhSQsuSv+AF2FwY3O3AO1c1RBskEW3XrBLNINOJujroNw80VTKA==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/rust@2.12.0: + resolution: + { + integrity: sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==, + } + engines: { node: '>= 12.0.0' } + dev: true + + /@parcel/source-map@2.1.1: + resolution: + { + integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==, + } + engines: { node: ^12.18.3 || >=14 } + dependencies: + detect-libc: 1.0.3 + dev: true + + /@parcel/transformer-babel@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-zQaBfOnf/l8rPxYGnsk/ufh/0EuqvmnxafjBIpKZ//j6rGylw5JCqXSb1QvvAqRYruKeccxGv7+HrxpqKU6V4A==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + browserslist: 4.22.3 + json5: 2.2.3 + nullthrows: 1.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-css@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-vXhOqoAlQGATYyQ433Z1DXKmiKmzOAUmKysbYH3FD+LKEKLMEl/pA14goqp00TW+A/EjtSKKyeMyHlMIIUqj4Q==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + browserslist: 4.22.3 + lightningcss: 1.24.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-html@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-5jW4dFFBlYBvIQk4nrH62rfA/G/KzVzEDa6S+Nne0xXhglLjkm64Ci9b/d4tKZfuGWUbpm2ASAq8skti/nfpXw==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + srcset: 4.0.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-image@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-8hXrGm2IRII49R7lZ0RpmNk27EhcsH+uNKsvxuMpXPuEnWgC/ha/IrjaI29xCng1uGur74bJF43NUSQhR4aTdw==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@parcel/transformer-js@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-OSZpOu+FGDbC/xivu24v092D9w6EGytB3vidwbdiJ2FaPgfV7rxS0WIUjH4I0OcvHAcitArRXL0a3+HrNTdQQw==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) + '@parcel/rust': 2.12.0 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.12.0 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + '@swc/helpers': 0.5.6 + browserslist: 4.22.3 + nullthrows: 1.1.1 + regenerator-runtime: 0.13.11 + semver: 7.5.4 + dev: true + + /@parcel/transformer-json@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-Utv64GLRCQILK5r0KFs4o7I41ixMPllwOLOhkdjJKvf1hZmN6WqfOmB1YLbWS/y5Zb/iB52DU2pWZm96vLFQZQ==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + json5: 2.2.3 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-postcss@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-FZqn+oUtiLfPOn67EZxPpBkfdFiTnF4iwiXPqvst3XI8H+iC+yNgzmtJkunOOuylpYY6NOU5jT8d7saqWSDv2Q==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + '@parcel/utils': 2.12.0 + clone: 2.1.2 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-posthtml@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-z6Z7rav/pcaWdeD+2sDUcd0mmNZRUvtHaUGa50Y2mr+poxrKilpsnFMSiWBT+oOqPt7j71jzDvrdnAF4XkCljg==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-raw@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-Ht1fQvXxix0NncdnmnXZsa6hra20RXYh1VqhBYZLsDfkvGGFnXIgO03Jqn4Z8MkKoa0tiNbDhpKIeTjyclbBxQ==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-react-refresh-wrap@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-GE8gmP2AZtkpBIV5vSCVhewgOFRhqwdM5Q9jNPOY5PKcM3/Ff0qCqDiTzzGLhk0/VMBrdjssrfZkVx6S/lHdJw==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-svg@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-cZJqGRJ4JNdYcb+vj94J7PdOuTnwyy45dM9xqbIMH+HSiiIkfrMsdEwYft0GTyFTdsnf+hdHn3tau7Qa5hhX+A==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/rust': 2.12.0 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/transformer-typescript-types@2.12.0(@parcel/core@2.12.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-uxF4UBMYvbjiV3zHTWMrZX8cFD92VUvD3ArcGi5WEtuVROUm9Sc47o0mOzxKfMFlJu2KOfZVHYlzK9f/UKA2kQ==, + } + engines: { node: '>= 12.0.0', parcel: ^2.12.0 } + peerDependencies: + typescript: '>=3.0.0' + dependencies: + '@parcel/diagnostic': 2.12.0 + '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) + '@parcel/source-map': 2.1.1 + '@parcel/ts-utils': 2.12.0(typescript@5.3.3) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + typescript: 5.3.3 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/ts-utils@2.12.0(typescript@5.3.3): + resolution: + { + integrity: sha512-zou+W6dcqnXXUOfN5zGM+ePIWbYOhGp8bVB2jICoNkoKmNAHd4l4zeHl5yQXnbZfynVw88cZVqxtXS8tYebelg==, + } + engines: { node: '>= 12.0.0' } + peerDependencies: + typescript: '>=3.0.0' + dependencies: + nullthrows: 1.1.1 + typescript: 5.3.3 + dev: true + + /@parcel/types@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==, + } + dependencies: + '@parcel/cache': 2.12.0(@parcel/core@2.12.0) + '@parcel/diagnostic': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + utility-types: 3.11.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/types@2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6): + resolution: + { + integrity: sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==, + } + dependencies: + '@parcel/cache': 2.12.0(@parcel/core@2.12.0) + '@parcel/diagnostic': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.12.0(@parcel/core@2.12.0) + utility-types: 3.11.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: true + + /@parcel/utils@2.12.0: + resolution: + { + integrity: sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==, + } + engines: { node: '>= 12.0.0' } + dependencies: + '@parcel/codeframe': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/logger': 2.12.0 + '@parcel/markdown-ansi': 2.12.0 + '@parcel/rust': 2.12.0 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + nullthrows: 1.1.1 + dev: true + + /@parcel/watcher-android-arm64@2.4.1: + resolution: + { + integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-darwin-arm64@2.4.1: + resolution: + { + integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-darwin-x64@2.4.1: + resolution: + { + integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==, + } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-freebsd-x64@2.4.1: + resolution: + { + integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==, + } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm-glibc@2.4.1: + resolution: + { + integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.4.1: + resolution: + { + integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm64-musl@2.4.1: + resolution: + { + integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-x64-glibc@2.4.1: + resolution: + { + integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==, + } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-x64-musl@2.4.1: + resolution: + { + integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==, + } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-win32-arm64@2.4.1: + resolution: + { + integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-win32-ia32@2.4.1: + resolution: + { + integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==, + } + engines: { node: '>= 10.0.0' } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-win32-x64@2.4.1: + resolution: + { + integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==, + } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher@2.4.1: + resolution: + { + integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==, + } + engines: { node: '>= 10.0.0' } + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.1.0 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.4.1 + '@parcel/watcher-darwin-arm64': 2.4.1 + '@parcel/watcher-darwin-x64': 2.4.1 + '@parcel/watcher-freebsd-x64': 2.4.1 + '@parcel/watcher-linux-arm-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-musl': 2.4.1 + '@parcel/watcher-linux-x64-glibc': 2.4.1 + '@parcel/watcher-linux-x64-musl': 2.4.1 + '@parcel/watcher-win32-arm64': 2.4.1 + '@parcel/watcher-win32-ia32': 2.4.1 + '@parcel/watcher-win32-x64': 2.4.1 + dev: true + + /@parcel/workers@2.12.0(@parcel/core@2.12.0): + resolution: + { + integrity: sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==, + } + engines: { node: '>= 12.0.0' } + peerDependencies: + '@parcel/core': ^2.12.0 + dependencies: + '@parcel/core': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/logger': 2.12.0 + '@parcel/profiler': 2.12.0 + '@parcel/types': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + nullthrows: 1.1.1 + dev: true + + /@popperjs/core@2.11.8: + resolution: + { + integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, + } + dev: false + + /@rollup/rollup-android-arm-eabi@4.14.1: + resolution: + { + integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==, + } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.14.1: + resolution: + { + integrity: sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==, + } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.14.1: + resolution: + { + integrity: sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.14.1: + resolution: + { + integrity: sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==, + } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.14.1: + resolution: + { + integrity: sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==, + } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.14.1: + resolution: + { + integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.14.1: + resolution: + { + integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.14.1: + resolution: + { + integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==, + } + cpu: [ppc64le] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.14.1: + resolution: + { + integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==, + } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.14.1: + resolution: + { + integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==, + } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.14.1: + resolution: + { + integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.14.1: + resolution: + { + integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.14.1: + resolution: + { + integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==, + } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.14.1: + resolution: + { + integrity: sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==, + } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.14.1: + resolution: + { + integrity: sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==, + } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@sinclair/typebox@0.27.8: + resolution: + { + integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, + } + dev: true + + /@swc/core-darwin-arm64@1.3.107: + resolution: + { + integrity: sha512-47tD/5vSXWxPd0j/ZllyQUg4bqalbQTsmqSw0J4dDdS82MWqCAwUErUrAZPRjBkjNQ6Kmrf5rpCWaGTtPw+ngw==, + } + engines: { node: '>=10' } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.3.107: + resolution: + { + integrity: sha512-hwiLJ2ulNkBGAh1m1eTfeY1417OAYbRGcb/iGsJ+LuVLvKAhU/itzsl535CvcwAlt2LayeCFfcI8gdeOLeZa9A==, + } + engines: { node: '>=10' } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.107: + resolution: + { + integrity: sha512-I2wzcC0KXqh0OwymCmYwNRgZ9nxX7DWnOOStJXV3pS0uB83TXAkmqd7wvMBuIl9qu4Hfomi9aDM7IlEEn9tumQ==, + } + engines: { node: '>=10' } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.3.107: + resolution: + { + integrity: sha512-HWgnn7JORYlOYnGsdunpSF8A+BCZKPLzLtEUA27/M/ZuANcMZabKL9Zurt7XQXq888uJFAt98Gy+59PU90aHKg==, + } + engines: { node: '>=10' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.3.107: + resolution: + { + integrity: sha512-vfPF74cWfAm8hyhS8yvYI94ucMHIo8xIYU+oFOW9uvDlGQRgnUf/6DEVbLyt/3yfX5723Ln57U8uiMALbX5Pyw==, + } + engines: { node: '>=10' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.3.107: + resolution: + { + integrity: sha512-uBVNhIg0ip8rH9OnOsCARUFZ3Mq3tbPHxtmWk9uAa5u8jQwGWeBx5+nTHpDOVd3YxKb6+5xDEI/edeeLpha/9g==, + } + engines: { node: '>=10' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.3.107: + resolution: + { + integrity: sha512-mvACkUvzSIB12q1H5JtabWATbk3AG+pQgXEN95AmEX2ZA5gbP9+B+mijsg7Sd/3tboHr7ZHLz/q3SHTvdFJrEw==, + } + engines: { node: '>=10' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.3.107: + resolution: + { + integrity: sha512-J3P14Ngy/1qtapzbguEH41kY109t6DFxfbK4Ntz9dOWNuVY3o9/RTB841ctnJk0ZHEG+BjfCJjsD2n8H5HcaOA==, + } + engines: { node: '>=10' } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.3.107: + resolution: + { + integrity: sha512-ZBUtgyjTHlz8TPJh7kfwwwFma+ktr6OccB1oXC8fMSopD0AxVnQasgun3l3099wIsAB9eEsJDQ/3lDkOLs1gBA==, + } + engines: { node: '>=10' } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.3.107: + resolution: + { + integrity: sha512-Eyzo2XRqWOxqhE1gk9h7LWmUf4Bp4Xn2Ttb0ayAXFp6YSTxQIThXcT9kipXZqcpxcmDwoq8iWbbf2P8XL743EA==, + } + engines: { node: '>=10' } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.3.107(@swc/helpers@0.5.6): + resolution: + { + integrity: sha512-zKhqDyFcTsyLIYK1iEmavljZnf4CCor5pF52UzLAz4B6Nu/4GLU+2LQVAf+oRHjusG39PTPjd2AlRT3f3QWfsQ==, + } + engines: { node: '>=10' } + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.2 + '@swc/helpers': 0.5.6 + '@swc/types': 0.1.5 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.107 + '@swc/core-darwin-x64': 1.3.107 + '@swc/core-linux-arm-gnueabihf': 1.3.107 + '@swc/core-linux-arm64-gnu': 1.3.107 + '@swc/core-linux-arm64-musl': 1.3.107 + '@swc/core-linux-x64-gnu': 1.3.107 + '@swc/core-linux-x64-musl': 1.3.107 + '@swc/core-win32-arm64-msvc': 1.3.107 + '@swc/core-win32-ia32-msvc': 1.3.107 + '@swc/core-win32-x64-msvc': 1.3.107 + dev: true + + /@swc/counter@0.1.2: + resolution: + { + integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==, + } + dev: true + + /@swc/helpers@0.5.6: + resolution: + { + integrity: sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==, + } + dependencies: + tslib: 2.6.2 + dev: true + + /@swc/types@0.1.5: + resolution: + { + integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==, + } + dev: true + + /@trysound/sax@0.2.0: + resolution: + { + integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, + } + engines: { node: '>=10.13.0' } + dev: true + + /@types/emscripten@1.39.10: + resolution: + { + integrity: sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==, + } + dev: false + + /@types/estree@1.0.5: + resolution: + { + integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, + } + dev: true + + /@types/file-saver@2.0.7: + resolution: + { + integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==, + } + dev: true + + /@types/lodash@4.14.202: + resolution: + { + integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==, + } + + /@types/parse-json@4.0.2: + resolution: + { + integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, + } + dev: false + + /@types/prop-types@15.7.12: + resolution: + { + integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==, + } + + /@types/react-dom@18.3.0: + resolution: + { + integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==, + } + dependencies: + '@types/react': 18.3.0 + dev: true + + /@types/react-transition-group@4.4.10: + resolution: + { + integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==, + } + dependencies: + '@types/react': 18.3.0 + dev: false + + /@types/react@18.3.0: + resolution: + { + integrity: sha512-DiUcKjzE6soLyln8NNZmyhcQjVv+WsUIFSqetMN0p8927OztKT4VTfFTqsbAi5oAGIcgOmOajlfBqyptDDjZRw==, + } + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + /@vitest/expect@1.4.0: + resolution: + { + integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==, + } + dependencies: + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.4.0: + resolution: + { + integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==, + } + dependencies: + '@vitest/utils': 1.4.0 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.4.0: + resolution: + { + integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==, + } + dependencies: + magic-string: 0.30.9 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.4.0: + resolution: + { + integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==, + } + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/utils@1.4.0: + resolution: + { + integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==, + } + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + + /@zhobo63/imgui-ts@0.1.43: + resolution: + { + integrity: sha512-H3FLIhOYefNsgqT2AR2UXSuHOe7d3vKpbQWB3/liPexK4zHYrZJMDE1QiG54u6BPexGQZ4FhZqEKAmYWWpH/ng==, + } + dependencies: + '@types/emscripten': 1.39.10 + dev: false + + /abortcontroller-polyfill@1.7.5: + resolution: + { + integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==, + } + dev: true + + /acorn-walk@8.3.2: + resolution: + { + integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, + } + engines: { node: '>=0.4.0' } + dev: true + + /acorn@8.11.3: + resolution: + { + integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, + } + engines: { node: '>=0.4.0' } + hasBin: true + dev: true + + /ansi-styles@3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: '>=4' } + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: '>=8' } + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: '>=10' } + dev: true + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + dev: true + + /assertion-error@1.1.0: + resolution: + { + integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, + } + dev: true + + /babel-plugin-macros@3.1.0: + resolution: + { + integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==, + } + engines: { node: '>=10', npm: '>=6' } + dependencies: + '@babel/runtime': 7.24.5 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + dev: false + + /base-x@3.0.9: + resolution: + { + integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + dev: true + + /boolbase@1.0.0: + resolution: + { + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + } + dev: true + + /braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: '>=8' } + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.22.3: + resolution: + { + integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: 1.0.30001581 + electron-to-chromium: 1.4.650 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.3) + dev: true + + /buffer@6.0.3: + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /cac@6.7.14: + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: '>=8' } + dev: true + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: '>=6' } + + /caniuse-lite@1.0.30001581: + resolution: + { + integrity: sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==, + } + dev: true + + /chai@4.4.1: + resolution: + { + integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==, + } + engines: { node: '>=4' } + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: '>=4' } + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.3: + resolution: + { + integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, + } + dependencies: + get-func-name: 2.0.2 + dev: true + + /chrome-trace-event@1.0.3: + resolution: + { + integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==, + } + engines: { node: '>=6.0' } + dev: true + + /clone@2.1.2: + resolution: + { + integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, + } + engines: { node: '>=0.8' } + dev: true + + /clsx@2.1.1: + resolution: + { + integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, + } + engines: { node: '>=6' } + dev: false + + /color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + dev: true + + /commander@7.2.0: + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: '>= 10' } + dev: true + + /convert-source-map@1.9.0: + resolution: + { + integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, + } + dev: false + + /cosmiconfig@7.1.0: + resolution: + { + integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, + } + engines: { node: '>=10' } + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cosmiconfig@8.3.6(typescript@5.3.3): + resolution: + { + integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==, + } + engines: { node: '>=14' } + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.3.3 + dev: true + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: '>= 8' } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /css-select@4.3.0: + resolution: + { + integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, + } + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-tree@1.1.3: + resolution: + { + integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, + } + engines: { node: '>=8.0.0' } + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-what@6.1.0: + resolution: + { + integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, + } + engines: { node: '>= 6' } + dev: true + + /csso@4.2.0: + resolution: + { + integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==, + } + engines: { node: '>=8.0.0' } + dependencies: + css-tree: 1.1.3 + dev: true + + /csstype@3.1.3: + resolution: + { + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, + } + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: '>=6.0' } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-eql@4.1.3: + resolution: + { + integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, + } + engines: { node: '>=6' } + dependencies: + type-detect: 4.0.8 + dev: true + + /detect-libc@1.0.3: + resolution: + { + integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, + } + engines: { node: '>=0.10' } + hasBin: true + dev: true + + /detect-libc@2.0.2: + resolution: + { + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, + } + engines: { node: '>=8' } + dev: true + + /diff-sequences@29.6.3: + resolution: + { + integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /dom-helpers@5.2.1: + resolution: + { + integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==, + } + dependencies: + '@babel/runtime': 7.24.5 + csstype: 3.1.3 + dev: false + + /dom-serializer@1.4.1: + resolution: + { + integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, + } + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /domelementtype@2.3.0: + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } + dev: true + + /domhandler@4.3.1: + resolution: + { + integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, + } + engines: { node: '>= 4' } + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@2.8.0: + resolution: + { + integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, + } + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /dotenv-expand@5.1.0: + resolution: + { + integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==, + } + dev: true + + /dotenv@7.0.0: + resolution: + { + integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==, + } + engines: { node: '>=6' } + dev: true + + /electron-to-chromium@1.4.650: + resolution: + { + integrity: sha512-sYSQhJCJa4aGA1wYol5cMQgekDBlbVfTRavlGZVr3WZpDdOPcp6a6xUnFfrt8TqZhsBYYbDxJZCjGfHuGupCRQ==, + } + dev: true + + /entities@2.2.0: + resolution: + { + integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, + } + dev: true + + /entities@3.0.1: + resolution: + { + integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==, + } + engines: { node: '>=0.12' } + dev: true + + /error-ex@1.3.2: + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } + dependencies: + is-arrayish: 0.2.1 + + /esbuild@0.19.12: + resolution: + { + integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, + } + engines: { node: '>=12' } + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + + /esbuild@0.20.2: + resolution: + { + integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==, + } + engines: { node: '>=12' } + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true + + /escalade@3.1.1: + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + } + engines: { node: '>=6' } + dev: true + + /escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: '>=0.8.0' } + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: '>=10' } + dev: false + + /estree-walker@3.0.3: + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } + dependencies: + '@types/estree': 1.0.5 + dev: true + + /eventemitter3@5.0.1: + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } + dev: false + + /execa@8.0.1: + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + } + engines: { node: '>=16.17' } + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /file-saver@2.0.5: + resolution: + { + integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==, + } + dev: false + + /fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: '>=8' } + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-root@1.1.0: + resolution: + { + integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, + } + dev: false + + /fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + dev: false + + /get-func-name@2.0.2: + resolution: + { + integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, + } + dev: true + + /get-port@4.2.0: + resolution: + { + integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==, + } + engines: { node: '>=6' } + dev: true + + /get-stream@8.0.1: + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + } + engines: { node: '>=16' } + dev: true + + /globals@13.24.0: + resolution: + { + integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, + } + engines: { node: '>=8' } + dependencies: + type-fest: 0.20.2 + dev: true + + /has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: '>=4' } + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: '>=8' } + dev: true + + /hasown@2.0.2: + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: '>= 0.4' } + dependencies: + function-bind: 1.1.2 + dev: false + + /hoist-non-react-statics@3.3.2: + resolution: + { + integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==, + } + dependencies: + react-is: 16.13.1 + dev: false + + /htmlnano@2.1.0(svgo@2.8.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-jVGRE0Ep9byMBKEu0Vxgl8dhXYOUk0iNQ2pjsG+BcRB0u0oDF5A9p/iBGMg/PGKYUyMD0OAGu8dVT5Lzj8S58g==, + } + peerDependencies: + cssnano: ^6.0.0 + postcss: ^8.3.11 + purgecss: ^5.0.0 + relateurl: ^0.2.7 + srcset: 4.0.0 + svgo: ^3.0.2 + terser: ^5.10.0 + uncss: ^0.17.3 + peerDependenciesMeta: + cssnano: + optional: true + postcss: + optional: true + purgecss: + optional: true + relateurl: + optional: true + srcset: + optional: true + svgo: + optional: true + terser: + optional: true + uncss: + optional: true + dependencies: + cosmiconfig: 8.3.6(typescript@5.3.3) + posthtml: 0.16.6 + svgo: 2.8.0 + timsort: 0.3.0 + transitivePeerDependencies: + - typescript + dev: true + + /htmlparser2@7.2.0: + resolution: + { + integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==, + } + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + dev: true + + /human-signals@5.0.0: + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + } + engines: { node: '>=16.17.0' } + dev: true + + /ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + dev: true + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: '>=6' } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /is-arrayish@0.2.1: + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } + + /is-core-module@2.13.1: + resolution: + { + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, + } + dependencies: + hasown: 2.0.2 + dev: false + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: '>=0.10.0' } + dev: true + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: '>=0.10.0' } + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-json@2.0.1: + resolution: + { + integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==, + } + dev: true + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: '>=0.12.0' } + dev: true + + /is-stream@3.0.0: + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + dev: true + + /js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + + /js-tokens@9.0.0: + resolution: + { + integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==, + } + dev: true + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } + + /json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: '>=6' } + hasBin: true + + /jsonc-parser@3.2.1: + resolution: + { + integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==, + } + dev: true + + /kiwi-schema@0.5.0: + resolution: + { + integrity: sha512-X+FpfU0yTEtc6aTHS7VwbOpvQwRt70+pXXWRI5fd6CvWhe7pSVC854TVo4Zo0x5/wwcWj+/9KUlXpdcP0dY9AA==, + } + hasBin: true + dev: false + + /lightningcss-darwin-arm64@1.24.0: + resolution: + { + integrity: sha512-rTNPkEiynOu4CfGdd5ZfVOQe2gd2idfQd4EfX1l2ZUUwd+2SwSdbb7cG4rlwfnZckbzCAygm85xkpekRE5/wFw==, + } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-darwin-x64@1.24.0: + resolution: + { + integrity: sha512-4KCeF2RJjzp9xdGY8zIH68CUtptEg8uz8PfkHvsIdrP4t9t5CIgfDBhiB8AmuO75N6SofdmZexDZIKdy9vA7Ww==, + } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-freebsd-x64@1.24.0: + resolution: + { + integrity: sha512-FJAYlek1wXuVTsncNU0C6YD41q126dXcIUm97KAccMn9C4s/JfLSqGWT2gIzAblavPFkyGG2gIADTWp3uWfN1g==, + } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm-gnueabihf@1.24.0: + resolution: + { + integrity: sha512-N55K6JqzMx7C0hYUu1YmWqhkHwzEJlkQRMA6phY65noO0I1LOAvP4wBIoFWrzRE+O6zL0RmXJ2xppqyTbk3sYw==, + } + engines: { node: '>= 12.0.0' } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-gnu@1.24.0: + resolution: + { + integrity: sha512-MqqUB2TpYtFWeBvvf5KExDdClU3YGLW5bHKs50uKKootcvG9KoS7wYwd5UichS+W3mYLc5yXUPGD1DNWbLiYKw==, + } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-musl@1.24.0: + resolution: + { + integrity: sha512-5wn4d9tFwa5bS1ao9mLexYVJdh3nn09HNIipsII6ZF7z9ZA5J4dOEhMgKoeCl891axTGTUYd8Kxn+Hn3XUSYRQ==, + } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-gnu@1.24.0: + resolution: + { + integrity: sha512-3j5MdTh+LSDF3o6uDwRjRUgw4J+IfDCVtdkUrJvKxL79qBLUujXY7CTe5X3IQDDLKEe/3wu49r8JKgxr0MfjbQ==, + } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-musl@1.24.0: + resolution: + { + integrity: sha512-HI+rNnvaLz0o36z6Ki0gyG5igVGrJmzczxA5fznr6eFTj3cHORoR/j2q8ivMzNFR4UKJDkTWUH5LMhacwOHWBA==, + } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-win32-x64-msvc@1.24.0: + resolution: + { + integrity: sha512-oeije/t7OZ5N9vSs6amyW/34wIYoBCpE6HUlsSKcP2SR1CVgx9oKEM00GtQmtqNnYiMIfsSm7+ppMb4NLtD5vg==, + } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /lightningcss@1.24.0: + resolution: + { + integrity: sha512-y36QEEDVx4IM7/yIZNsZJMRREIu26WzTsauIysf5s76YeCmlSbRZS7aC97IGPuoFRnyZ5Wx43OBsQBFB5Ne7ng==, + } + engines: { node: '>= 12.0.0' } + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.24.0 + lightningcss-darwin-x64: 1.24.0 + lightningcss-freebsd-x64: 1.24.0 + lightningcss-linux-arm-gnueabihf: 1.24.0 + lightningcss-linux-arm64-gnu: 1.24.0 + lightningcss-linux-arm64-musl: 1.24.0 + lightningcss-linux-x64-gnu: 1.24.0 + lightningcss-linux-x64-musl: 1.24.0 + lightningcss-win32-x64-msvc: 1.24.0 + dev: true + + /lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + + /lmdb@2.8.5: + resolution: + { + integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==, + } + hasBin: true + requiresBuild: true + dependencies: + msgpackr: 1.10.1 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.1.1 + ordered-binary: 1.5.1 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.8.5 + '@lmdb/lmdb-darwin-x64': 2.8.5 + '@lmdb/lmdb-linux-arm': 2.8.5 + '@lmdb/lmdb-linux-arm64': 2.8.5 + '@lmdb/lmdb-linux-x64': 2.8.5 + '@lmdb/lmdb-win32-x64': 2.8.5 + dev: true + + /local-pkg@0.5.0: + resolution: + { + integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==, + } + engines: { node: '>=14' } + dependencies: + mlly: 1.6.1 + pkg-types: 1.0.3 + dev: true + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + dev: false + + /loose-envify@1.4.0: + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /loupe@2.3.7: + resolution: + { + integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, + } + dependencies: + get-func-name: 2.0.2 + dev: true + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: '>=10' } + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.30.9: + resolution: + { + integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==, + } + engines: { node: '>=12' } + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /mdn-data@2.0.14: + resolution: + { + integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==, + } + dev: true + + /merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + dev: true + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: '>=8.6' } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn@4.0.0: + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: '>=12' } + dev: true + + /mlly@1.6.1: + resolution: + { + integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==, + } + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.5.3 + dev: true + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + dev: true + + /msgpackr-extract@3.0.2: + resolution: + { + integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==, + } + hasBin: true + requiresBuild: true + dependencies: + node-gyp-build-optional-packages: 5.0.7 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 + dev: true + optional: true + + /msgpackr@1.10.1: + resolution: + { + integrity: sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==, + } + optionalDependencies: + msgpackr-extract: 3.0.2 + dev: true + + /nanoid@3.3.7: + resolution: + { + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + dev: true + + /node-addon-api@6.1.0: + resolution: + { + integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==, + } + dev: true + + /node-addon-api@7.1.0: + resolution: + { + integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==, + } + engines: { node: ^16 || ^18 || >= 20 } + dev: true + + /node-gyp-build-optional-packages@5.0.7: + resolution: + { + integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==, + } + hasBin: true + requiresBuild: true + dev: true + optional: true - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - dev: false - - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} - dev: false - - /@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'} - dev: false - - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - - /@babel/runtime@7.24.5: - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: false - - /@babel/types@7.24.5: - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 - to-fast-properties: 2.0.0 - dev: false - - /@czi-sds/components@20.0.1(@emotion/core@11.0.0)(@emotion/css@11.11.2)(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/base@5.0.0-beta.40)(@mui/icons-material@5.15.15)(@mui/lab@5.0.0-alpha.170)(@mui/material@5.15.15)(react-dom@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-vB3gGl+tzxDmV00J8ioLr/LIj1WU26448Pot9orgyGeZy+AaJM7WMT/qsSpPSCGEKLN5ykcIUBIDIGK1E/JZmQ==} - peerDependencies: - '@emotion/core': ^11.0.0 - '@emotion/css': ^11.11.2 - '@emotion/react': ^11.11.3 - '@emotion/styled': ^11.11.0 - '@mui/base': ^5.0.0-beta.30 - '@mui/icons-material': ^5.15.3 - '@mui/lab': ^5.0.0-alpha.159 - '@mui/material': ^5.15.3 - react: '>=17.0.1' - react-dom: '>=17.0.1' - dependencies: - '@emotion/core': 11.0.0 - '@emotion/css': 11.11.2 - '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) - '@mui/base': 5.0.0-beta.40(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) - '@mui/icons-material': 5.15.15(@mui/material@5.15.15)(@types/react@18.3.0)(react@18.3.0) - '@mui/lab': 5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) - '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) - react: 18.3.0 - react-dom: 18.3.0(react@18.3.0) - dev: false - - /@emotion/babel-plugin@11.11.0: - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} - dependencies: - '@babel/helper-module-imports': 7.24.3 - '@babel/runtime': 7.24.5 - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/serialize': 1.1.4 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - dev: false - - /@emotion/cache@11.11.0: - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} - dependencies: - '@emotion/memoize': 0.8.1 - '@emotion/sheet': 1.2.2 - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - stylis: 4.2.0 - dev: false - - /@emotion/core@11.0.0: - resolution: {integrity: sha512-w4sE3AmHmyG6RDKf6mIbtHpgJUSJ2uGvPQb8VXFL7hFjMPibE8IiehG8cMX3Ztm4svfCQV6KqusQbeIOkurBcA==} - dev: false - - /@emotion/css@11.11.2: - resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==} - dependencies: - '@emotion/babel-plugin': 11.11.0 - '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.4 - '@emotion/sheet': 1.2.2 - '@emotion/utils': 1.2.1 - dev: false - - /@emotion/hash@0.9.1: - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - dev: false - - /@emotion/is-prop-valid@1.2.2: - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} - dependencies: - '@emotion/memoize': 0.8.1 - dev: false - - /@emotion/memoize@0.8.1: - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: false - - /@emotion/react@11.11.4(@types/react@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/babel-plugin': 11.11.0 - '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.0) - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.3.0 - hoist-non-react-statics: 3.3.2 - react: 18.3.0 - dev: false - - /@emotion/serialize@1.1.4: - resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} - dependencies: - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/unitless': 0.8.1 - '@emotion/utils': 1.2.1 - csstype: 3.1.3 - dev: false - - /@emotion/sheet@1.2.2: - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - dev: false - - /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/babel-plugin': 11.11.0 - '@emotion/is-prop-valid': 1.2.2 - '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) - '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.0) - '@emotion/utils': 1.2.1 - '@types/react': 18.3.0 - react: 18.3.0 - dev: false - - /@emotion/unitless@0.8.1: - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - dev: false - - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.0): - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} - peerDependencies: - react: '>=16.8.0' - dependencies: - react: 18.3.0 - dev: false - - /@emotion/utils@1.2.1: - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - dev: false - - /@emotion/weak-memoize@0.3.1: - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - dev: false - - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.20.2: - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.20.2: - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.20.2: - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.20.2: - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.20.2: - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.20.2: - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.20.2: - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@floating-ui/core@1.6.1: - resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} - dependencies: - '@floating-ui/utils': 0.2.2 - dev: false - - /@floating-ui/dom@1.6.4: - resolution: {integrity: sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==} - dependencies: - '@floating-ui/core': 1.6.1 - '@floating-ui/utils': 0.2.2 - dev: false - - /@floating-ui/react-dom@2.0.9(react-dom@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - dependencies: - '@floating-ui/dom': 1.6.4 - react: 18.3.0 - react-dom: 18.3.0(react@18.3.0) - dev: false - - /@floating-ui/utils@0.2.2: - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} - dev: false - - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@lezer/common@1.2.1: - resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} - dev: true - - /@lezer/lr@1.4.0: - resolution: {integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==} - dependencies: - '@lezer/common': 1.2.1 - dev: true - - /@lmdb/lmdb-darwin-arm64@2.8.5: - resolution: {integrity: sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@lmdb/lmdb-darwin-x64@2.8.5: - resolution: {integrity: sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@lmdb/lmdb-linux-arm64@2.8.5: - resolution: {integrity: sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@lmdb/lmdb-linux-arm@2.8.5: - resolution: {integrity: sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@lmdb/lmdb-linux-x64@2.8.5: - resolution: {integrity: sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@lmdb/lmdb-win32-x64@2.8.5: - resolution: {integrity: sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@mischnic/json-sourcemap@0.1.1: - resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} - engines: {node: '>=12.0.0'} - dependencies: - '@lezer/common': 1.2.1 - '@lezer/lr': 1.4.0 - json5: 2.2.3 - dev: true - - /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: - resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2: - resolution: {integrity: sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2: - resolution: {integrity: sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2: - resolution: {integrity: sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2: - resolution: {integrity: sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2: - resolution: {integrity: sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@mui/base@5.0.0-beta.40(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@floating-ui/react-dom': 2.0.9(react-dom@18.3.0)(react@18.3.0) - '@mui/types': 7.2.14(@types/react@18.3.0) - '@mui/utils': 5.15.14(@types/react@18.3.0)(react@18.3.0) - '@popperjs/core': 2.11.8 - '@types/react': 18.3.0 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.0 - react-dom: 18.3.0(react@18.3.0) - dev: false - - /@mui/core-downloads-tracker@5.15.15: - resolution: {integrity: sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==} - dev: false - - /@mui/icons-material@5.15.15(@mui/material@5.15.15)(@types/react@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) - '@types/react': 18.3.0 - react: 18.3.0 - dev: false - - /@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-0bDVECGmrNjd3+bLdcLiwYZ0O4HP5j5WSQm5DV6iA/Z9kr8O6AnvZ1bv9ImQbbX7Gj3pX4o43EKwCutj3EQxQg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@mui/material': '>=5.15.0' - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) - '@mui/base': 5.0.0-beta.40(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) - '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) - '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react@18.3.0) - '@mui/types': 7.2.14(@types/react@18.3.0) - '@mui/utils': 5.15.14(@types/react@18.3.0)(react@18.3.0) - '@types/react': 18.3.0 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.0 - react-dom: 18.3.0(react@18.3.0) - dev: false - - /@mui/material@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) - '@mui/base': 5.0.0-beta.40(@types/react@18.3.0)(react-dom@18.3.0)(react@18.3.0) - '@mui/core-downloads-tracker': 5.15.15 - '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react@18.3.0) - '@mui/types': 7.2.14(@types/react@18.3.0) - '@mui/utils': 5.15.14(@types/react@18.3.0)(react@18.3.0) - '@types/react': 18.3.0 - '@types/react-transition-group': 4.4.10 - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.0 - react-dom: 18.3.0(react@18.3.0) - react-is: 18.2.0 - react-transition-group: 4.4.5(react-dom@18.3.0)(react@18.3.0) - dev: false - - /@mui/private-theming@5.15.14(@types/react@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@mui/utils': 5.15.14(@types/react@18.3.0)(react@18.3.0) - '@types/react': 18.3.0 - prop-types: 15.8.1 - react: 18.3.0 - dev: false - - /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.0): - resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.0 - dev: false - - /@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/react': 11.11.4(@types/react@18.3.0)(react@18.3.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.0)(react@18.3.0) - '@mui/private-theming': 5.15.14(@types/react@18.3.0)(react@18.3.0) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.0) - '@mui/types': 7.2.14(@types/react@18.3.0) - '@mui/utils': 5.15.14(@types/react@18.3.0)(react@18.3.0) - '@types/react': 18.3.0 - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.0 - dev: false - - /@mui/types@7.2.14(@types/react@18.3.0): - resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.3.0 - dev: false - - /@mui/utils@5.15.14(@types/react@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@types/prop-types': 15.7.12 - '@types/react': 18.3.0 - prop-types: 15.8.1 - react: 18.3.0 - react-is: 18.2.0 - dev: false - - /@parcel/bundler-default@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-3ybN74oYNMKyjD6V20c9Gerdbh7teeNvVMwIoHIQMzuIFT6IGX53PyOLlOKRLbjxMc0TMimQQxIt2eQqxR5LsA==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/graph': 3.2.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/rust': 2.12.0 - '@parcel/utils': 2.12.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/cache@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@parcel/core': ^2.12.0 - dependencies: - '@parcel/core': 2.12.0 - '@parcel/fs': 2.12.0(@parcel/core@2.12.0) - '@parcel/logger': 2.12.0 - '@parcel/utils': 2.12.0 - lmdb: 2.8.5 - transitivePeerDependencies: - - '@swc/helpers' - dev: true - - /@parcel/codeframe@2.12.0: - resolution: {integrity: sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==} - engines: {node: '>= 12.0.0'} - dependencies: - chalk: 4.1.2 - dev: true - - /@parcel/compressor-raw@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-h41Q3X7ZAQ9wbQ2csP8QGrwepasLZdXiuEdpUryDce6rF9ZiHoJ97MRpdLxOhOPyASTw/xDgE1xyaPQr0Q3f5A==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/config-default@2.12.0(@parcel/core@2.12.0)(typescript@5.3.3): - resolution: {integrity: sha512-dPNe2n9eEsKRc1soWIY0yToMUPirPIa2QhxcCB3Z5RjpDGIXm0pds+BaiqY6uGLEEzsjhRO0ujd4v2Rmm0vuFg==} - peerDependencies: - '@parcel/core': ^2.12.0 - dependencies: - '@parcel/bundler-default': 2.12.0(@parcel/core@2.12.0) - '@parcel/compressor-raw': 2.12.0(@parcel/core@2.12.0) - '@parcel/core': 2.12.0 - '@parcel/namer-default': 2.12.0(@parcel/core@2.12.0) - '@parcel/optimizer-css': 2.12.0(@parcel/core@2.12.0) - '@parcel/optimizer-htmlnano': 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) - '@parcel/optimizer-image': 2.12.0(@parcel/core@2.12.0) - '@parcel/optimizer-svgo': 2.12.0(@parcel/core@2.12.0) - '@parcel/optimizer-swc': 2.12.0(@parcel/core@2.12.0) - '@parcel/packager-css': 2.12.0(@parcel/core@2.12.0) - '@parcel/packager-html': 2.12.0(@parcel/core@2.12.0) - '@parcel/packager-js': 2.12.0(@parcel/core@2.12.0) - '@parcel/packager-raw': 2.12.0(@parcel/core@2.12.0) - '@parcel/packager-svg': 2.12.0(@parcel/core@2.12.0) - '@parcel/packager-wasm': 2.12.0(@parcel/core@2.12.0) - '@parcel/reporter-dev-server': 2.12.0(@parcel/core@2.12.0) - '@parcel/resolver-default': 2.12.0(@parcel/core@2.12.0) - '@parcel/runtime-browser-hmr': 2.12.0(@parcel/core@2.12.0) - '@parcel/runtime-js': 2.12.0(@parcel/core@2.12.0) - '@parcel/runtime-react-refresh': 2.12.0(@parcel/core@2.12.0) - '@parcel/runtime-service-worker': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-babel': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-css': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-html': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-image': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-js': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-json': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-postcss': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-posthtml': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-raw': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-react-refresh-wrap': 2.12.0(@parcel/core@2.12.0) - '@parcel/transformer-svg': 2.12.0(@parcel/core@2.12.0) - transitivePeerDependencies: - - '@swc/helpers' - - cssnano - - postcss - - purgecss - - relateurl - - srcset - - terser - - typescript - - uncss - dev: true - - /@parcel/core@2.12.0: - resolution: {integrity: sha512-s+6pwEj+GfKf7vqGUzN9iSEPueUssCCQrCBUlcAfKrJe0a22hTUCjewpB0I7lNrCIULt8dkndD+sMdOrXsRl6Q==} - engines: {node: '>= 12.0.0'} - dependencies: - '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.12.0(@parcel/core@2.12.0) - '@parcel/diagnostic': 2.12.0 - '@parcel/events': 2.12.0 - '@parcel/fs': 2.12.0(@parcel/core@2.12.0) - '@parcel/graph': 3.2.0 - '@parcel/logger': 2.12.0 - '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/profiler': 2.12.0 - '@parcel/rust': 2.12.0 - '@parcel/source-map': 2.1.1 - '@parcel/types': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - '@parcel/workers': 2.12.0(@parcel/core@2.12.0) - abortcontroller-polyfill: 1.7.5 - base-x: 3.0.9 - browserslist: 4.22.3 - clone: 2.1.2 - dotenv: 7.0.0 - dotenv-expand: 5.1.0 - json5: 2.2.3 - msgpackr: 1.10.1 - nullthrows: 1.1.1 - semver: 7.5.4 - transitivePeerDependencies: - - '@swc/helpers' - dev: true - - /@parcel/diagnostic@2.12.0: - resolution: {integrity: sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==} - engines: {node: '>= 12.0.0'} - dependencies: - '@mischnic/json-sourcemap': 0.1.1 - nullthrows: 1.1.1 - dev: true - - /@parcel/events@2.12.0: - resolution: {integrity: sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==} - engines: {node: '>= 12.0.0'} - dev: true - - /@parcel/fs@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@parcel/core': ^2.12.0 - dependencies: - '@parcel/core': 2.12.0 - '@parcel/rust': 2.12.0 - '@parcel/types': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - '@parcel/watcher': 2.4.1 - '@parcel/workers': 2.12.0(@parcel/core@2.12.0) - transitivePeerDependencies: - - '@swc/helpers' - dev: true - - /@parcel/graph@3.2.0: - resolution: {integrity: sha512-xlrmCPqy58D4Fg5umV7bpwDx5Vyt7MlnQPxW68vae5+BA4GSWetfZt+Cs5dtotMG2oCHzZxhIPt7YZ7NRyQzLA==} - engines: {node: '>= 12.0.0'} - dependencies: - nullthrows: 1.1.1 - dev: true - - /@parcel/logger@2.12.0: - resolution: {integrity: sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==} - engines: {node: '>= 12.0.0'} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/events': 2.12.0 - dev: true - - /@parcel/markdown-ansi@2.12.0: - resolution: {integrity: sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==} - engines: {node: '>= 12.0.0'} - dependencies: - chalk: 4.1.2 - dev: true - - /@parcel/namer-default@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-9DNKPDHWgMnMtqqZIMiEj/R9PNWW16lpnlHjwK3ciRlMPgjPJ8+UNc255teZODhX0T17GOzPdGbU/O/xbxVPzA==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/node-resolver-core@3.3.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==} - engines: {node: '>= 12.0.0'} - dependencies: - '@mischnic/json-sourcemap': 0.1.1 - '@parcel/diagnostic': 2.12.0 - '@parcel/fs': 2.12.0(@parcel/core@2.12.0) - '@parcel/rust': 2.12.0 - '@parcel/utils': 2.12.0 - nullthrows: 1.1.1 - semver: 7.5.4 - transitivePeerDependencies: - - '@parcel/core' - dev: true - - /@parcel/optimizer-css@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-ifbcC97fRzpruTjaa8axIFeX4MjjSIlQfem3EJug3L2AVqQUXnM1XO8L0NaXGNLTW2qnh1ZjIJ7vXT/QhsphsA==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.12.0 - browserslist: 4.22.3 - lightningcss: 1.24.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/optimizer-htmlnano@2.12.0(@parcel/core@2.12.0)(typescript@5.3.3): - resolution: {integrity: sha512-MfPMeCrT8FYiOrpFHVR+NcZQlXAptK2r4nGJjfT+ndPBhEEZp4yyL7n1y7HfX9geg5altc4WTb4Gug7rCoW8VQ==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - htmlnano: 2.1.0(svgo@2.8.0)(typescript@5.3.3) - nullthrows: 1.1.1 - posthtml: 0.16.6 - svgo: 2.8.0 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - - cssnano - - postcss - - purgecss - - relateurl - - srcset - - terser - - typescript - - uncss - dev: true - - /@parcel/optimizer-image@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-bo1O7raeAIbRU5nmNVtx8divLW9Xqn0c57GVNGeAK4mygnQoqHqRZ0mR9uboh64pxv6ijXZHPhKvU9HEpjPjBQ==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - peerDependencies: - '@parcel/core': ^2.12.0 - dependencies: - '@parcel/core': 2.12.0 - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/rust': 2.12.0 - '@parcel/utils': 2.12.0 - '@parcel/workers': 2.12.0(@parcel/core@2.12.0) - transitivePeerDependencies: - - '@swc/helpers' - dev: true - - /@parcel/optimizer-svgo@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-Kyli+ZZXnoonnbeRQdoWwee9Bk2jm/49xvnfb+2OO8NN0d41lblBoRhOyFiScRnJrw7eVl1Xrz7NTkXCIO7XFQ==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - svgo: 2.8.0 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/optimizer-swc@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-iBi6LZB3lm6WmbXfzi8J3DCVPmn4FN2lw7DGXxUXu7MouDPVWfTsM6U/5TkSHJRNRogZ2gqy5q9g34NPxHbJcw==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.12.0 - '@swc/core': 1.3.107(@swc/helpers@0.5.6) - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/package-manager@2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6): - resolution: {integrity: sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@parcel/core': ^2.12.0 - dependencies: - '@parcel/core': 2.12.0 - '@parcel/diagnostic': 2.12.0 - '@parcel/fs': 2.12.0(@parcel/core@2.12.0) - '@parcel/logger': 2.12.0 - '@parcel/node-resolver-core': 3.3.0(@parcel/core@2.12.0) - '@parcel/types': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - '@parcel/workers': 2.12.0(@parcel/core@2.12.0) - '@swc/core': 1.3.107(@swc/helpers@0.5.6) - semver: 7.5.4 - transitivePeerDependencies: - - '@swc/helpers' - dev: true - - /@parcel/packager-css@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-j3a/ODciaNKD19IYdWJT+TP+tnhhn5koBGBWWtrKSu0UxWpnezIGZetit3eE+Y9+NTePalMkvpIlit2eDhvfJA==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.12.0 - lightningcss: 1.24.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/packager-html@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-PpvGB9hFFe+19NXGz2ApvPrkA9GwEqaDAninT+3pJD57OVBaxB8U+HN4a5LICKxjUppPPqmrLb6YPbD65IX4RA==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/types': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - nullthrows: 1.1.1 - posthtml: 0.16.6 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/packager-js@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-viMF+FszITRRr8+2iJyk+4ruGiL27Y6AF7hQ3xbJfzqnmbOhGFtLTQwuwhOLqN/mWR2VKdgbLpZSarWaO3yAMg==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/rust': 2.12.0 - '@parcel/source-map': 2.1.1 - '@parcel/types': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - globals: 13.24.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/packager-raw@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-tJZqFbHqP24aq1F+OojFbQIc09P/u8HAW5xfndCrFnXpW4wTgM3p03P0xfw3gnNq+TtxHJ8c3UFE5LnXNNKhYA==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/packager-svg@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-ldaGiacGb2lLqcXas97k8JiZRbAnNREmcvoY2W2dvW4loVuDT9B9fU777mbV6zODpcgcHWsLL3lYbJ5Lt3y9cg==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/types': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - posthtml: 0.16.6 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/packager-ts@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-8wR0BNN2NBD+IIU0tjioK+lRD4p2Qi/fKxDH5ixEW912tRV+Vd4kE8k++U6YQIpSlK4FRnjFod5zYYhNSLuiXg==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/packager-wasm@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-fYqZzIqO9fGYveeImzF8ll6KRo2LrOXfD+2Y5U3BiX/wp9wv17dz50QLDQm9hmTcKGWxK4yWqKQh+Evp/fae7A==} - engines: {node: '>=12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/plugin@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-nc/uRA8DiMoe4neBbzV6kDndh/58a4wQuGKw5oEoIwBCHUvE2W8ZFSu7ollSXUGRzfacTt4NdY8TwS73ScWZ+g==} - engines: {node: '>= 12.0.0'} - dependencies: - '@parcel/types': 2.12.0(@parcel/core@2.12.0) - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/plugin@2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6): - resolution: {integrity: sha512-nc/uRA8DiMoe4neBbzV6kDndh/58a4wQuGKw5oEoIwBCHUvE2W8ZFSu7ollSXUGRzfacTt4NdY8TwS73ScWZ+g==} - engines: {node: '>= 12.0.0'} - dependencies: - '@parcel/types': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/profiler@2.12.0: - resolution: {integrity: sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==} - engines: {node: '>= 12.0.0'} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/events': 2.12.0 - chrome-trace-event: 1.0.3 - dev: true - - /@parcel/reporter-cli@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-TqKsH4GVOLPSCanZ6tcTPj+rdVHERnt5y4bwTM82cajM21bCX1Ruwp8xOKU+03091oV2pv5ieB18pJyRF7IpIw==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/types': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - chalk: 4.1.2 - term-size: 2.2.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/reporter-dev-server@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-tIcDqRvAPAttRlTV28dHcbWT5K2r/MBFks7nM4nrEDHWtnrCwimkDmZTc1kD8QOCCjGVwRHcQybpHvxfwol6GA==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/reporter-tracer@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-g8rlu9GxB8Ut/F8WGx4zidIPQ4pcYFjU9bZO+fyRIPrSUFH2bKijCnbZcr4ntqzDGx74hwD6cCG4DBoleq2UlQ==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - chrome-trace-event: 1.0.3 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/resolver-default@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-uuhbajTax37TwCxu7V98JtRLiT6hzE4VYSu5B7Qkauy14/WFt2dz6GOUXPgVsED569/hkxebPx3KCMtZW6cHHA==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/node-resolver-core': 3.3.0(@parcel/core@2.12.0) - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/runtime-browser-hmr@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-4ZLp2FWyD32r0GlTulO3+jxgsA3oO1P1b5oO2IWuWilfhcJH5LTiazpL5YdusUjtNn9PGN6QLAWfxmzRIfM+Ow==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/runtime-js@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-sBerP32Z1crX5PfLNGDSXSdqzlllM++GVnVQVeM7DgMKS8JIFG3VLi28YkX+dYYGtPypm01JoIHCkvwiZEcQJg==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/runtime-react-refresh@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-SCHkcczJIDFTFdLTzrHTkQ0aTrX3xH6jrA4UsCBL6ji61+w+ohy4jEEe9qCgJVXhnJfGLE43HNXek+0MStX+Mw==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - react-error-overlay: 6.0.9 - react-refresh: 0.9.0 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/runtime-service-worker@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-BXuMBsfiwpIEnssn+jqfC3jkgbS8oxeo3C7xhSQsuSv+AF2FwY3O3AO1c1RBskEW3XrBLNINOJujroNw80VTKA==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/rust@2.12.0: - resolution: {integrity: sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==} - engines: {node: '>= 12.0.0'} - dev: true - - /@parcel/source-map@2.1.1: - resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} - engines: {node: ^12.18.3 || >=14} - dependencies: - detect-libc: 1.0.3 - dev: true - - /@parcel/transformer-babel@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-zQaBfOnf/l8rPxYGnsk/ufh/0EuqvmnxafjBIpKZ//j6rGylw5JCqXSb1QvvAqRYruKeccxGv7+HrxpqKU6V4A==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.12.0 - browserslist: 4.22.3 - json5: 2.2.3 - nullthrows: 1.1.1 - semver: 7.5.4 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/transformer-css@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-vXhOqoAlQGATYyQ433Z1DXKmiKmzOAUmKysbYH3FD+LKEKLMEl/pA14goqp00TW+A/EjtSKKyeMyHlMIIUqj4Q==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.12.0 - browserslist: 4.22.3 - lightningcss: 1.24.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/transformer-html@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-5jW4dFFBlYBvIQk4nrH62rfA/G/KzVzEDa6S+Nne0xXhglLjkm64Ci9b/d4tKZfuGWUbpm2ASAq8skti/nfpXw==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/rust': 2.12.0 - nullthrows: 1.1.1 - posthtml: 0.16.6 - posthtml-parser: 0.10.2 - posthtml-render: 3.0.0 - semver: 7.5.4 - srcset: 4.0.0 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/transformer-image@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-8hXrGm2IRII49R7lZ0RpmNk27EhcsH+uNKsvxuMpXPuEnWgC/ha/IrjaI29xCng1uGur74bJF43NUSQhR4aTdw==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - peerDependencies: - '@parcel/core': ^2.12.0 - dependencies: - '@parcel/core': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - '@parcel/workers': 2.12.0(@parcel/core@2.12.0) - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@swc/helpers' - dev: true - - /@parcel/transformer-js@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-OSZpOu+FGDbC/xivu24v092D9w6EGytB3vidwbdiJ2FaPgfV7rxS0WIUjH4I0OcvHAcitArRXL0a3+HrNTdQQw==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - peerDependencies: - '@parcel/core': ^2.12.0 - dependencies: - '@parcel/core': 2.12.0 - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) - '@parcel/rust': 2.12.0 - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.12.0 - '@parcel/workers': 2.12.0(@parcel/core@2.12.0) - '@swc/helpers': 0.5.6 - browserslist: 4.22.3 - nullthrows: 1.1.1 - regenerator-runtime: 0.13.11 - semver: 7.5.4 - dev: true - - /@parcel/transformer-json@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-Utv64GLRCQILK5r0KFs4o7I41ixMPllwOLOhkdjJKvf1hZmN6WqfOmB1YLbWS/y5Zb/iB52DU2pWZm96vLFQZQ==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - json5: 2.2.3 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/transformer-postcss@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-FZqn+oUtiLfPOn67EZxPpBkfdFiTnF4iwiXPqvst3XI8H+iC+yNgzmtJkunOOuylpYY6NOU5jT8d7saqWSDv2Q==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/rust': 2.12.0 - '@parcel/utils': 2.12.0 - clone: 2.1.2 - nullthrows: 1.1.1 - postcss-value-parser: 4.2.0 - semver: 7.5.4 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/transformer-posthtml@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-z6Z7rav/pcaWdeD+2sDUcd0mmNZRUvtHaUGa50Y2mr+poxrKilpsnFMSiWBT+oOqPt7j71jzDvrdnAF4XkCljg==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - nullthrows: 1.1.1 - posthtml: 0.16.6 - posthtml-parser: 0.10.2 - posthtml-render: 3.0.0 - semver: 7.5.4 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/transformer-raw@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-Ht1fQvXxix0NncdnmnXZsa6hra20RXYh1VqhBYZLsDfkvGGFnXIgO03Jqn4Z8MkKoa0tiNbDhpKIeTjyclbBxQ==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/transformer-react-refresh-wrap@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-GE8gmP2AZtkpBIV5vSCVhewgOFRhqwdM5Q9jNPOY5PKcM3/Ff0qCqDiTzzGLhk0/VMBrdjssrfZkVx6S/lHdJw==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - react-refresh: 0.9.0 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/transformer-svg@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-cZJqGRJ4JNdYcb+vj94J7PdOuTnwyy45dM9xqbIMH+HSiiIkfrMsdEwYft0GTyFTdsnf+hdHn3tau7Qa5hhX+A==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/rust': 2.12.0 - nullthrows: 1.1.1 - posthtml: 0.16.6 - posthtml-parser: 0.10.2 - posthtml-render: 3.0.0 - semver: 7.5.4 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/transformer-typescript-types@2.12.0(@parcel/core@2.12.0)(typescript@5.3.3): - resolution: {integrity: sha512-uxF4UBMYvbjiV3zHTWMrZX8cFD92VUvD3ArcGi5WEtuVROUm9Sc47o0mOzxKfMFlJu2KOfZVHYlzK9f/UKA2kQ==} - engines: {node: '>= 12.0.0', parcel: ^2.12.0} - peerDependencies: - typescript: '>=3.0.0' - dependencies: - '@parcel/diagnostic': 2.12.0 - '@parcel/plugin': 2.12.0(@parcel/core@2.12.0) - '@parcel/source-map': 2.1.1 - '@parcel/ts-utils': 2.12.0(typescript@5.3.3) - '@parcel/utils': 2.12.0 - nullthrows: 1.1.1 - typescript: 5.3.3 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/ts-utils@2.12.0(typescript@5.3.3): - resolution: {integrity: sha512-zou+W6dcqnXXUOfN5zGM+ePIWbYOhGp8bVB2jICoNkoKmNAHd4l4zeHl5yQXnbZfynVw88cZVqxtXS8tYebelg==} - engines: {node: '>= 12.0.0'} - peerDependencies: - typescript: '>=3.0.0' - dependencies: - nullthrows: 1.1.1 - typescript: 5.3.3 - dev: true - - /@parcel/types@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==} - dependencies: - '@parcel/cache': 2.12.0(@parcel/core@2.12.0) - '@parcel/diagnostic': 2.12.0 - '@parcel/fs': 2.12.0(@parcel/core@2.12.0) - '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) - '@parcel/source-map': 2.1.1 - '@parcel/workers': 2.12.0(@parcel/core@2.12.0) - utility-types: 3.11.0 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/types@2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6): - resolution: {integrity: sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==} - dependencies: - '@parcel/cache': 2.12.0(@parcel/core@2.12.0) - '@parcel/diagnostic': 2.12.0 - '@parcel/fs': 2.12.0(@parcel/core@2.12.0) - '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) - '@parcel/source-map': 2.1.1 - '@parcel/workers': 2.12.0(@parcel/core@2.12.0) - utility-types: 3.11.0 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - dev: true - - /@parcel/utils@2.12.0: - resolution: {integrity: sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==} - engines: {node: '>= 12.0.0'} - dependencies: - '@parcel/codeframe': 2.12.0 - '@parcel/diagnostic': 2.12.0 - '@parcel/logger': 2.12.0 - '@parcel/markdown-ansi': 2.12.0 - '@parcel/rust': 2.12.0 - '@parcel/source-map': 2.1.1 - chalk: 4.1.2 - nullthrows: 1.1.1 - dev: true - - /@parcel/watcher-android-arm64@2.4.1: - resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-darwin-arm64@2.4.1: - resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-darwin-x64@2.4.1: - resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-freebsd-x64@2.4.1: - resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-linux-arm-glibc@2.4.1: - resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-linux-arm64-glibc@2.4.1: - resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-linux-arm64-musl@2.4.1: - resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-linux-x64-glibc@2.4.1: - resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-linux-x64-musl@2.4.1: - resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-win32-arm64@2.4.1: - resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-win32-ia32@2.4.1: - resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-win32-x64@2.4.1: - resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher@2.4.1: - resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} - engines: {node: '>= 10.0.0'} - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.5 - node-addon-api: 7.1.0 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.4.1 - '@parcel/watcher-darwin-arm64': 2.4.1 - '@parcel/watcher-darwin-x64': 2.4.1 - '@parcel/watcher-freebsd-x64': 2.4.1 - '@parcel/watcher-linux-arm-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-musl': 2.4.1 - '@parcel/watcher-linux-x64-glibc': 2.4.1 - '@parcel/watcher-linux-x64-musl': 2.4.1 - '@parcel/watcher-win32-arm64': 2.4.1 - '@parcel/watcher-win32-ia32': 2.4.1 - '@parcel/watcher-win32-x64': 2.4.1 - dev: true - - /@parcel/workers@2.12.0(@parcel/core@2.12.0): - resolution: {integrity: sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@parcel/core': ^2.12.0 - dependencies: - '@parcel/core': 2.12.0 - '@parcel/diagnostic': 2.12.0 - '@parcel/logger': 2.12.0 - '@parcel/profiler': 2.12.0 - '@parcel/types': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - nullthrows: 1.1.1 - dev: true - - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false - - /@rollup/rollup-android-arm-eabi@4.14.1: - resolution: {integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-android-arm64@4.14.1: - resolution: {integrity: sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-arm64@4.14.1: - resolution: {integrity: sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-x64@4.14.1: - resolution: {integrity: sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm-gnueabihf@4.14.1: - resolution: {integrity: sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-gnu@4.14.1: - resolution: {integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-musl@4.14.1: - resolution: {integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-powerpc64le-gnu@4.14.1: - resolution: {integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==} - cpu: [ppc64le] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-riscv64-gnu@4.14.1: - resolution: {integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-s390x-gnu@4.14.1: - resolution: {integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-gnu@4.14.1: - resolution: {integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-musl@4.14.1: - resolution: {integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-arm64-msvc@4.14.1: - resolution: {integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-ia32-msvc@4.14.1: - resolution: {integrity: sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-x64-msvc@4.14.1: - resolution: {integrity: sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@swc/core-darwin-arm64@1.3.107: - resolution: {integrity: sha512-47tD/5vSXWxPd0j/ZllyQUg4bqalbQTsmqSw0J4dDdS82MWqCAwUErUrAZPRjBkjNQ6Kmrf5rpCWaGTtPw+ngw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@swc/core-darwin-x64@1.3.107: - resolution: {integrity: sha512-hwiLJ2ulNkBGAh1m1eTfeY1417OAYbRGcb/iGsJ+LuVLvKAhU/itzsl535CvcwAlt2LayeCFfcI8gdeOLeZa9A==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-arm-gnueabihf@1.3.107: - resolution: {integrity: sha512-I2wzcC0KXqh0OwymCmYwNRgZ9nxX7DWnOOStJXV3pS0uB83TXAkmqd7wvMBuIl9qu4Hfomi9aDM7IlEEn9tumQ==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-arm64-gnu@1.3.107: - resolution: {integrity: sha512-HWgnn7JORYlOYnGsdunpSF8A+BCZKPLzLtEUA27/M/ZuANcMZabKL9Zurt7XQXq888uJFAt98Gy+59PU90aHKg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-arm64-musl@1.3.107: - resolution: {integrity: sha512-vfPF74cWfAm8hyhS8yvYI94ucMHIo8xIYU+oFOW9uvDlGQRgnUf/6DEVbLyt/3yfX5723Ln57U8uiMALbX5Pyw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-x64-gnu@1.3.107: - resolution: {integrity: sha512-uBVNhIg0ip8rH9OnOsCARUFZ3Mq3tbPHxtmWk9uAa5u8jQwGWeBx5+nTHpDOVd3YxKb6+5xDEI/edeeLpha/9g==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-x64-musl@1.3.107: - resolution: {integrity: sha512-mvACkUvzSIB12q1H5JtabWATbk3AG+pQgXEN95AmEX2ZA5gbP9+B+mijsg7Sd/3tboHr7ZHLz/q3SHTvdFJrEw==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-win32-arm64-msvc@1.3.107: - resolution: {integrity: sha512-J3P14Ngy/1qtapzbguEH41kY109t6DFxfbK4Ntz9dOWNuVY3o9/RTB841ctnJk0ZHEG+BjfCJjsD2n8H5HcaOA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@swc/core-win32-ia32-msvc@1.3.107: - resolution: {integrity: sha512-ZBUtgyjTHlz8TPJh7kfwwwFma+ktr6OccB1oXC8fMSopD0AxVnQasgun3l3099wIsAB9eEsJDQ/3lDkOLs1gBA==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@swc/core-win32-x64-msvc@1.3.107: - resolution: {integrity: sha512-Eyzo2XRqWOxqhE1gk9h7LWmUf4Bp4Xn2Ttb0ayAXFp6YSTxQIThXcT9kipXZqcpxcmDwoq8iWbbf2P8XL743EA==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@swc/core@1.3.107(@swc/helpers@0.5.6): - resolution: {integrity: sha512-zKhqDyFcTsyLIYK1iEmavljZnf4CCor5pF52UzLAz4B6Nu/4GLU+2LQVAf+oRHjusG39PTPjd2AlRT3f3QWfsQ==} - engines: {node: '>=10'} - requiresBuild: true - peerDependencies: - '@swc/helpers': ^0.5.0 - peerDependenciesMeta: - '@swc/helpers': - optional: true - dependencies: - '@swc/counter': 0.1.2 - '@swc/helpers': 0.5.6 - '@swc/types': 0.1.5 - optionalDependencies: - '@swc/core-darwin-arm64': 1.3.107 - '@swc/core-darwin-x64': 1.3.107 - '@swc/core-linux-arm-gnueabihf': 1.3.107 - '@swc/core-linux-arm64-gnu': 1.3.107 - '@swc/core-linux-arm64-musl': 1.3.107 - '@swc/core-linux-x64-gnu': 1.3.107 - '@swc/core-linux-x64-musl': 1.3.107 - '@swc/core-win32-arm64-msvc': 1.3.107 - '@swc/core-win32-ia32-msvc': 1.3.107 - '@swc/core-win32-x64-msvc': 1.3.107 - dev: true - - /@swc/counter@0.1.2: - resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} - dev: true - - /@swc/helpers@0.5.6: - resolution: {integrity: sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==} - dependencies: - tslib: 2.6.2 - dev: true - - /@swc/types@0.1.5: - resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} - dev: true - - /@trysound/sax@0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - dev: true - - /@types/emscripten@1.39.10: - resolution: {integrity: sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==} - dev: false - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - - /@types/file-saver@2.0.7: - resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} - dev: true - - /@types/lodash@4.14.202: - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} - - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - dev: false - - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - - /@types/react-dom@18.3.0: - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - dependencies: - '@types/react': 18.3.0 - dev: true - - /@types/react-transition-group@4.4.10: - resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} - dependencies: - '@types/react': 18.3.0 - dev: false - - /@types/react@18.3.0: - resolution: {integrity: sha512-DiUcKjzE6soLyln8NNZmyhcQjVv+WsUIFSqetMN0p8927OztKT4VTfFTqsbAi5oAGIcgOmOajlfBqyptDDjZRw==} - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 - - /@vitest/expect@1.4.0: - resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} - dependencies: - '@vitest/spy': 1.4.0 - '@vitest/utils': 1.4.0 - chai: 4.4.1 - dev: true - - /@vitest/runner@1.4.0: - resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} - dependencies: - '@vitest/utils': 1.4.0 - p-limit: 5.0.0 - pathe: 1.1.2 - dev: true - - /@vitest/snapshot@1.4.0: - resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} - dependencies: - magic-string: 0.30.9 - pathe: 1.1.2 - pretty-format: 29.7.0 - dev: true - - /@vitest/spy@1.4.0: - resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} - dependencies: - tinyspy: 2.2.1 - dev: true - - /@vitest/utils@1.4.0: - resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true - - /@zhobo63/imgui-ts@0.1.43: - resolution: {integrity: sha512-H3FLIhOYefNsgqT2AR2UXSuHOe7d3vKpbQWB3/liPexK4zHYrZJMDE1QiG54u6BPexGQZ4FhZqEKAmYWWpH/ng==} - dependencies: - '@types/emscripten': 1.39.10 - dev: false - - /abortcontroller-polyfill@1.7.5: - resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} - dev: true - - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - dependencies: - '@babel/runtime': 7.24.5 - cosmiconfig: 7.1.0 - resolve: 1.22.8 - dev: false - - /base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /browserslist@4.22.3: - resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001581 - electron-to-chromium: 1.4.650 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.3) - dev: true - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - /caniuse-lite@1.0.30001581: - resolution: {integrity: sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==} - dev: true - - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true - - /clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - dev: true - - /clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - dev: false - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: true - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false - - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - dev: false - - /cosmiconfig@8.3.6(typescript@5.3.3): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - typescript: 5.3.3 - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - dev: true - - /css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - dev: true - - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true - - /csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} - dependencies: - css-tree: 1.1.3 - dev: true - - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - dev: true - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: true - - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - dependencies: - '@babel/runtime': 7.24.5 - csstype: 3.1.3 - dev: false - - /dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dev: true - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - - /domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - - /domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - dev: true - - /dotenv-expand@5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - dev: true - - /dotenv@7.0.0: - resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==} - engines: {node: '>=6'} - dev: true - - /electron-to-chromium@1.4.650: - resolution: {integrity: sha512-sYSQhJCJa4aGA1wYol5cMQgekDBlbVfTRavlGZVr3WZpDdOPcp6a6xUnFfrt8TqZhsBYYbDxJZCjGfHuGupCRQ==} - dev: true - - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: true - - /entities@3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} - engines: {node: '>=0.12'} - dev: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - dev: true - - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: false - - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.5 - dev: true - - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: false - - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - - /file-saver@2.0.5: - resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} - dev: false - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: false - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: false - - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - - /get-port@4.2.0: - resolution: {integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==} - engines: {node: '>=6'} - dev: true - - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true - - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: false - - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - dependencies: - react-is: 16.13.1 - dev: false - - /htmlnano@2.1.0(svgo@2.8.0)(typescript@5.3.3): - resolution: {integrity: sha512-jVGRE0Ep9byMBKEu0Vxgl8dhXYOUk0iNQ2pjsG+BcRB0u0oDF5A9p/iBGMg/PGKYUyMD0OAGu8dVT5Lzj8S58g==} - peerDependencies: - cssnano: ^6.0.0 - postcss: ^8.3.11 - purgecss: ^5.0.0 - relateurl: ^0.2.7 - srcset: 4.0.0 - svgo: ^3.0.2 - terser: ^5.10.0 - uncss: ^0.17.3 - peerDependenciesMeta: - cssnano: - optional: true - postcss: - optional: true - purgecss: - optional: true - relateurl: - optional: true - srcset: - optional: true - svgo: - optional: true - terser: - optional: true - uncss: - optional: true - dependencies: - cosmiconfig: 8.3.6(typescript@5.3.3) - posthtml: 0.16.6 - svgo: 2.8.0 - timsort: 0.3.0 - transitivePeerDependencies: - - typescript - dev: true - - /htmlparser2@7.2.0: - resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 3.0.1 - dev: true - - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.2 - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-json@2.0.1: - resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true - - /kiwi-schema@0.5.0: - resolution: {integrity: sha512-X+FpfU0yTEtc6aTHS7VwbOpvQwRt70+pXXWRI5fd6CvWhe7pSVC854TVo4Zo0x5/wwcWj+/9KUlXpdcP0dY9AA==} - hasBin: true - dev: false - - /lightningcss-darwin-arm64@1.24.0: - resolution: {integrity: sha512-rTNPkEiynOu4CfGdd5ZfVOQe2gd2idfQd4EfX1l2ZUUwd+2SwSdbb7cG4rlwfnZckbzCAygm85xkpekRE5/wFw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /lightningcss-darwin-x64@1.24.0: - resolution: {integrity: sha512-4KCeF2RJjzp9xdGY8zIH68CUtptEg8uz8PfkHvsIdrP4t9t5CIgfDBhiB8AmuO75N6SofdmZexDZIKdy9vA7Ww==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /lightningcss-freebsd-x64@1.24.0: - resolution: {integrity: sha512-FJAYlek1wXuVTsncNU0C6YD41q126dXcIUm97KAccMn9C4s/JfLSqGWT2gIzAblavPFkyGG2gIADTWp3uWfN1g==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /lightningcss-linux-arm-gnueabihf@1.24.0: - resolution: {integrity: sha512-N55K6JqzMx7C0hYUu1YmWqhkHwzEJlkQRMA6phY65noO0I1LOAvP4wBIoFWrzRE+O6zL0RmXJ2xppqyTbk3sYw==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /lightningcss-linux-arm64-gnu@1.24.0: - resolution: {integrity: sha512-MqqUB2TpYtFWeBvvf5KExDdClU3YGLW5bHKs50uKKootcvG9KoS7wYwd5UichS+W3mYLc5yXUPGD1DNWbLiYKw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /lightningcss-linux-arm64-musl@1.24.0: - resolution: {integrity: sha512-5wn4d9tFwa5bS1ao9mLexYVJdh3nn09HNIipsII6ZF7z9ZA5J4dOEhMgKoeCl891axTGTUYd8Kxn+Hn3XUSYRQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /lightningcss-linux-x64-gnu@1.24.0: - resolution: {integrity: sha512-3j5MdTh+LSDF3o6uDwRjRUgw4J+IfDCVtdkUrJvKxL79qBLUujXY7CTe5X3IQDDLKEe/3wu49r8JKgxr0MfjbQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /lightningcss-linux-x64-musl@1.24.0: - resolution: {integrity: sha512-HI+rNnvaLz0o36z6Ki0gyG5igVGrJmzczxA5fznr6eFTj3cHORoR/j2q8ivMzNFR4UKJDkTWUH5LMhacwOHWBA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /lightningcss-win32-x64-msvc@1.24.0: - resolution: {integrity: sha512-oeije/t7OZ5N9vSs6amyW/34wIYoBCpE6HUlsSKcP2SR1CVgx9oKEM00GtQmtqNnYiMIfsSm7+ppMb4NLtD5vg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /lightningcss@1.24.0: - resolution: {integrity: sha512-y36QEEDVx4IM7/yIZNsZJMRREIu26WzTsauIysf5s76YeCmlSbRZS7aC97IGPuoFRnyZ5Wx43OBsQBFB5Ne7ng==} - engines: {node: '>= 12.0.0'} - dependencies: - detect-libc: 1.0.3 - optionalDependencies: - lightningcss-darwin-arm64: 1.24.0 - lightningcss-darwin-x64: 1.24.0 - lightningcss-freebsd-x64: 1.24.0 - lightningcss-linux-arm-gnueabihf: 1.24.0 - lightningcss-linux-arm64-gnu: 1.24.0 - lightningcss-linux-arm64-musl: 1.24.0 - lightningcss-linux-x64-gnu: 1.24.0 - lightningcss-linux-x64-musl: 1.24.0 - lightningcss-win32-x64-msvc: 1.24.0 - dev: true - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - /lmdb@2.8.5: - resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} - hasBin: true - requiresBuild: true - dependencies: - msgpackr: 1.10.1 - node-addon-api: 6.1.0 - node-gyp-build-optional-packages: 5.1.1 - ordered-binary: 1.5.1 - weak-lru-cache: 1.2.2 - optionalDependencies: - '@lmdb/lmdb-darwin-arm64': 2.8.5 - '@lmdb/lmdb-darwin-x64': 2.8.5 - '@lmdb/lmdb-linux-arm': 2.8.5 - '@lmdb/lmdb-linux-arm64': 2.8.5 - '@lmdb/lmdb-linux-x64': 2.8.5 - '@lmdb/lmdb-win32-x64': 2.8.5 - dev: true - - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /magic-string@0.30.9: - resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.5.3 - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /msgpackr-extract@3.0.2: - resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==} - hasBin: true - requiresBuild: true - dependencies: - node-gyp-build-optional-packages: 5.0.7 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.2 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.2 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.2 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.2 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.2 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 - dev: true - optional: true - - /msgpackr@1.10.1: - resolution: {integrity: sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==} - optionalDependencies: - msgpackr-extract: 3.0.2 - dev: true - - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - dev: true - - /node-addon-api@7.1.0: - resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} - engines: {node: ^16 || ^18 || >= 20} - dev: true - - /node-gyp-build-optional-packages@5.0.7: - resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /node-gyp-build-optional-packages@5.1.1: - resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} - hasBin: true - dependencies: - detect-libc: 2.0.2 - dev: true - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true - - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - dependencies: - boolbase: 1.0.0 - dev: true - - /nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - dev: true - - /numcodecs@0.2.2: - resolution: {integrity: sha512-Y5K8mv80yb4MgVpcElBkUeMZqeE4TrovxRit/dTZvoRl6YkB6WEjY+fiUjGCblITnt3T3fmrDg8yRWu0gOLjhQ==} - engines: {node: '>=12'} - dev: false - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - - /ordered-binary@1.5.1: - resolution: {integrity: sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==} - dev: true - - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /p-queue@7.4.1: - resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} - engines: {node: '>=12'} - dependencies: - eventemitter3: 5.0.1 - p-timeout: 5.1.0 - dev: false - - /p-timeout@5.1.0: - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} - engines: {node: '>=12'} - dev: false - - /parcel@2.12.0(typescript@5.3.3): - resolution: {integrity: sha512-W+gxAq7aQ9dJIg/XLKGcRT0cvnStFAQHPaI0pvD0U2l6IVLueUAm3nwN7lkY62zZNmlvNx6jNtE4wlbS+CyqSg==} - engines: {node: '>= 12.0.0'} - hasBin: true - peerDependenciesMeta: - '@parcel/core': - optional: true - dependencies: - '@parcel/config-default': 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) - '@parcel/core': 2.12.0 - '@parcel/diagnostic': 2.12.0 - '@parcel/events': 2.12.0 - '@parcel/fs': 2.12.0(@parcel/core@2.12.0) - '@parcel/logger': 2.12.0 - '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) - '@parcel/reporter-cli': 2.12.0(@parcel/core@2.12.0) - '@parcel/reporter-dev-server': 2.12.0(@parcel/core@2.12.0) - '@parcel/reporter-tracer': 2.12.0(@parcel/core@2.12.0) - '@parcel/utils': 2.12.0 - chalk: 4.1.2 - commander: 7.2.0 - get-port: 4.2.0 - transitivePeerDependencies: - - '@swc/helpers' - - cssnano - - postcss - - purgecss - - relateurl - - srcset - - terser - - typescript - - uncss - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.23.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: false - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.1 - mlly: 1.6.1 - pathe: 1.1.2 - dev: true - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true - - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - dev: true - - /posthtml-parser@0.10.2: - resolution: {integrity: sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==} - engines: {node: '>=12'} - dependencies: - htmlparser2: 7.2.0 - dev: true - - /posthtml-parser@0.11.0: - resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} - engines: {node: '>=12'} - dependencies: - htmlparser2: 7.2.0 - dev: true - - /posthtml-render@3.0.0: - resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==} - engines: {node: '>=12'} - dependencies: - is-json: 2.0.1 - dev: true - - /posthtml@0.16.6: - resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==} - engines: {node: '>=12.0.0'} - dependencies: - posthtml-parser: 0.11.0 - posthtml-render: 3.0.0 - dev: true - - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: true - - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - dev: false - - /react-dom@18.3.0(react@18.3.0): - resolution: {integrity: sha512-zaKdLBftQJnvb7FtDIpZtsAIb2MZU087RM8bRDZU8LVCCFYjPTsDZJNFUWPcVz3HFSN1n/caxi0ca4B/aaVQGQ==} - peerDependencies: - react: ^18.3.0 - dependencies: - loose-envify: 1.4.0 - react: 18.3.0 - scheduler: 0.23.1 - dev: false - - /react-error-overlay@6.0.9: - resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} - dev: true - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - - /react-refresh@0.9.0: - resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} - engines: {node: '>=0.10.0'} - dev: true - - /react-transition-group@4.4.5(react-dom@18.3.0)(react@18.3.0): - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' - dependencies: - '@babel/runtime': 7.24.5 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 18.3.0 - react-dom: 18.3.0(react@18.3.0) - dev: false - - /react@18.3.0: - resolution: {integrity: sha512-RPutkJftSAldDibyrjuku7q11d3oy6wKOyPe5K1HA/HwwrXcEqBdHsLypkC2FFYjP7bPUa6gbzSBhw4sY2JcDg==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: false - - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: true - - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false - - /regl@2.1.0: - resolution: {integrity: sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==} - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: false - - /rollup@4.14.1: - resolution: {integrity: sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.1 - '@rollup/rollup-android-arm64': 4.14.1 - '@rollup/rollup-darwin-arm64': 4.14.1 - '@rollup/rollup-darwin-x64': 4.14.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.1 - '@rollup/rollup-linux-arm64-gnu': 4.14.1 - '@rollup/rollup-linux-arm64-musl': 4.14.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.1 - '@rollup/rollup-linux-riscv64-gnu': 4.14.1 - '@rollup/rollup-linux-s390x-gnu': 4.14.1 - '@rollup/rollup-linux-x64-gnu': 4.14.1 - '@rollup/rollup-linux-x64-musl': 4.14.1 - '@rollup/rollup-win32-arm64-msvc': 4.14.1 - '@rollup/rollup-win32-ia32-msvc': 4.14.1 - '@rollup/rollup-win32-x64-msvc': 4.14.1 - fsevents: 2.3.3 - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /scheduler@0.23.1: - resolution: {integrity: sha512-5GKS5JGfiah1O38Vfa9srZE4s3wdHbwjlCrvIookrg2FO9aIwKLOJXuJQFlEfNcVSOXuaL2hzDeY20uVXcUtrw==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true - - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /srcset@4.0.0: - resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} - engines: {node: '>=12'} - dev: true - - /stable@0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - dev: true - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - - /strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - dependencies: - js-tokens: 9.0.0 - dev: true - - /stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - dev: false - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: false - - /svgo@2.8.0: - resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} - engines: {node: '>=10.13.0'} - hasBin: true - dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 4.3.0 - css-tree: 1.1.3 - csso: 4.2.0 - picocolors: 1.0.0 - stable: 0.1.8 - dev: true - - /term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - dev: true - - /timsort@0.3.0: - resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} - dev: true - - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} - dev: true - - /tinypool@0.8.3: - resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: false - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.22.3): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.3 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /utility-types@3.11.0: - resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} - engines: {node: '>= 4'} - dev: true - - /vite-node@1.4.0: - resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.2.8 - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite@5.2.8: - resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.14.1 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /vitest@1.4.0: - resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.4.0 - '@vitest/ui': 1.4.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - dependencies: - '@vitest/expect': 1.4.0 - '@vitest/runner': 1.4.0 - '@vitest/snapshot': 1.4.0 - '@vitest/spy': 1.4.0 - '@vitest/utils': 1.4.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.9 - pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.6.0 - tinypool: 0.8.3 - vite: 5.2.8 - vite-node: 1.4.0 - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /weak-lru-cache@1.2.2: - resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: false - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true - - /zarr@0.6.2: - resolution: {integrity: sha512-3gtxrnpziRlDtrz0hz/M+hreCC5YexppeCVHK62Pmb2FSn947h14GHMDj9rQFkY2mPhRKDHhtB+AUGa8wqJW6Q==} - engines: {node: '>=12'} - dependencies: - numcodecs: 0.2.2 - p-queue: 7.4.1 - dev: false + /node-gyp-build-optional-packages@5.1.1: + resolution: + { + integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==, + } + hasBin: true + dependencies: + detect-libc: 2.0.2 + dev: true + + /node-releases@2.0.14: + resolution: + { + integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, + } + dev: true + + /npm-run-path@5.3.0: + resolution: + { + integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + path-key: 4.0.0 + dev: true + + /nth-check@2.1.1: + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } + dependencies: + boolbase: 1.0.0 + dev: true + + /nullthrows@1.1.1: + resolution: + { + integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==, + } + dev: true + + /numcodecs@0.2.2: + resolution: + { + integrity: sha512-Y5K8mv80yb4MgVpcElBkUeMZqeE4TrovxRit/dTZvoRl6YkB6WEjY+fiUjGCblITnt3T3fmrDg8yRWu0gOLjhQ==, + } + engines: { node: '>=12' } + dev: false + + /object-assign@4.1.1: + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: '>=0.10.0' } + dev: false + + /onetime@6.0.0: + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: '>=12' } + dependencies: + mimic-fn: 4.0.0 + dev: true + + /ordered-binary@1.5.1: + resolution: + { + integrity: sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==, + } + dev: true + + /p-limit@5.0.0: + resolution: + { + integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==, + } + engines: { node: '>=18' } + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-queue@7.4.1: + resolution: + { + integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==, + } + engines: { node: '>=12' } + dependencies: + eventemitter3: 5.0.1 + p-timeout: 5.1.0 + dev: false + + /p-timeout@5.1.0: + resolution: + { + integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==, + } + engines: { node: '>=12' } + dev: false + + /parcel@2.12.0(typescript@5.3.3): + resolution: + { + integrity: sha512-W+gxAq7aQ9dJIg/XLKGcRT0cvnStFAQHPaI0pvD0U2l6IVLueUAm3nwN7lkY62zZNmlvNx6jNtE4wlbS+CyqSg==, + } + engines: { node: '>= 12.0.0' } + hasBin: true + peerDependenciesMeta: + '@parcel/core': + optional: true + dependencies: + '@parcel/config-default': 2.12.0(@parcel/core@2.12.0)(typescript@5.3.3) + '@parcel/core': 2.12.0 + '@parcel/diagnostic': 2.12.0 + '@parcel/events': 2.12.0 + '@parcel/fs': 2.12.0(@parcel/core@2.12.0) + '@parcel/logger': 2.12.0 + '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0)(@swc/helpers@0.5.6) + '@parcel/reporter-cli': 2.12.0(@parcel/core@2.12.0) + '@parcel/reporter-dev-server': 2.12.0(@parcel/core@2.12.0) + '@parcel/reporter-tracer': 2.12.0(@parcel/core@2.12.0) + '@parcel/utils': 2.12.0 + chalk: 4.1.2 + commander: 7.2.0 + get-port: 4.2.0 + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + dev: true + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: '>=6' } + dependencies: + callsites: 3.1.0 + + /parse-json@5.2.0: + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: '>=8' } + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } + dev: true + + /path-key@4.0.0: + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: '>=12' } + dev: true + + /path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + dev: false + + /path-type@4.0.0: + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: '>=8' } + + /pathe@1.1.2: + resolution: + { + integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, + } + dev: true + + /pathval@1.1.1: + resolution: + { + integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, + } + dev: true + + /picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + dev: true + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: '>=8.6' } + dev: true + + /pkg-types@1.0.3: + resolution: + { + integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==, + } + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } + dev: true + + /postcss@8.4.38: + resolution: + { + integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, + } + engines: { node: ^10 || ^12 || >=14 } + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + dev: true + + /posthtml-parser@0.10.2: + resolution: + { + integrity: sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==, + } + engines: { node: '>=12' } + dependencies: + htmlparser2: 7.2.0 + dev: true + + /posthtml-parser@0.11.0: + resolution: + { + integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==, + } + engines: { node: '>=12' } + dependencies: + htmlparser2: 7.2.0 + dev: true + + /posthtml-render@3.0.0: + resolution: + { + integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==, + } + engines: { node: '>=12' } + dependencies: + is-json: 2.0.1 + dev: true + + /posthtml@0.16.6: + resolution: + { + integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==, + } + engines: { node: '>=12.0.0' } + dependencies: + posthtml-parser: 0.11.0 + posthtml-render: 3.0.0 + dev: true + + /prettier@3.3.2: + resolution: + { + integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==, + } + engines: { node: '>=14' } + hasBin: true + dev: true + + /pretty-format@29.7.0: + resolution: + { + integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /process@0.11.10: + resolution: + { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: '>= 0.6.0' } + dev: true + + /prop-types@15.8.1: + resolution: + { + integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, + } + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /react-dom@18.3.0(react@18.3.0): + resolution: + { + integrity: sha512-zaKdLBftQJnvb7FtDIpZtsAIb2MZU087RM8bRDZU8LVCCFYjPTsDZJNFUWPcVz3HFSN1n/caxi0ca4B/aaVQGQ==, + } + peerDependencies: + react: ^18.3.0 + dependencies: + loose-envify: 1.4.0 + react: 18.3.0 + scheduler: 0.23.1 + dev: false + + /react-error-overlay@6.0.9: + resolution: + { + integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==, + } + dev: true + + /react-is@16.13.1: + resolution: + { + integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, + } + dev: false + + /react-is@18.2.0: + resolution: + { + integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, + } + + /react-refresh@0.9.0: + resolution: + { + integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==, + } + engines: { node: '>=0.10.0' } + dev: true + + /react-transition-group@4.4.5(react-dom@18.3.0)(react@18.3.0): + resolution: + { + integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==, + } + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.24.5 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + dev: false + + /react@18.3.0: + resolution: + { + integrity: sha512-RPutkJftSAldDibyrjuku7q11d3oy6wKOyPe5K1HA/HwwrXcEqBdHsLypkC2FFYjP7bPUa6gbzSBhw4sY2JcDg==, + } + engines: { node: '>=0.10.0' } + dependencies: + loose-envify: 1.4.0 + dev: false + + /regenerator-runtime@0.13.11: + resolution: + { + integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, + } + dev: true + + /regenerator-runtime@0.14.1: + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } + dev: false + + /regl@2.1.0: + resolution: + { + integrity: sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==, + } + dev: false + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: '>=4' } + + /resolve@1.22.8: + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /rollup@4.14.1: + resolution: + { + integrity: sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==, + } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.14.1 + '@rollup/rollup-android-arm64': 4.14.1 + '@rollup/rollup-darwin-arm64': 4.14.1 + '@rollup/rollup-darwin-x64': 4.14.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.14.1 + '@rollup/rollup-linux-arm64-gnu': 4.14.1 + '@rollup/rollup-linux-arm64-musl': 4.14.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.14.1 + '@rollup/rollup-linux-riscv64-gnu': 4.14.1 + '@rollup/rollup-linux-s390x-gnu': 4.14.1 + '@rollup/rollup-linux-x64-gnu': 4.14.1 + '@rollup/rollup-linux-x64-musl': 4.14.1 + '@rollup/rollup-win32-arm64-msvc': 4.14.1 + '@rollup/rollup-win32-ia32-msvc': 4.14.1 + '@rollup/rollup-win32-x64-msvc': 4.14.1 + fsevents: 2.3.3 + dev: true + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: true + + /scheduler@0.23.1: + resolution: + { + integrity: sha512-5GKS5JGfiah1O38Vfa9srZE4s3wdHbwjlCrvIookrg2FO9aIwKLOJXuJQFlEfNcVSOXuaL2hzDeY20uVXcUtrw==, + } + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } + dev: true + + /siginfo@2.0.0: + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } + dev: true + + /signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: '>=14' } + dev: true + + /source-map-js@1.2.0: + resolution: + { + integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /source-map@0.5.7: + resolution: + { + integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, + } + engines: { node: '>=0.10.0' } + dev: false + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: '>=0.10.0' } + dev: true + + /srcset@4.0.0: + resolution: + { + integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==, + } + engines: { node: '>=12' } + dev: true + + /stable@0.1.8: + resolution: + { + integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==, + } + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + /stackback@0.0.2: + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } + dev: true + + /std-env@3.7.0: + resolution: + { + integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==, + } + dev: true + + /strip-final-newline@3.0.0: + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: '>=12' } + dev: true + + /strip-literal@2.1.0: + resolution: + { + integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==, + } + dependencies: + js-tokens: 9.0.0 + dev: true + + /stylis@4.2.0: + resolution: + { + integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==, + } + dev: false + + /supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: '>=4' } + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: '>= 0.4' } + dev: false + + /svgo@2.8.0: + resolution: + { + integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==, + } + engines: { node: '>=10.13.0' } + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + + /term-size@2.2.1: + resolution: + { + integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==, + } + engines: { node: '>=8' } + dev: true + + /timsort@0.3.0: + resolution: + { + integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==, + } + dev: true + + /tinybench@2.6.0: + resolution: + { + integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==, + } + dev: true + + /tinypool@0.8.3: + resolution: + { + integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==, + } + engines: { node: '>=14.0.0' } + dev: true + + /tinyspy@2.2.1: + resolution: + { + integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==, + } + engines: { node: '>=14.0.0' } + dev: true + + /to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: '>=4' } + dev: false + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } + dependencies: + is-number: 7.0.0 + dev: true + + /tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + dev: true + + /type-detect@4.0.8: + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: '>=4' } + dev: true + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: '>=10' } + dev: true + + /typescript@5.3.3: + resolution: + { + integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, + } + engines: { node: '>=14.17' } + hasBin: true + dev: true + + /ufo@1.5.3: + resolution: + { + integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==, + } + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.3): + resolution: + { + integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, + } + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.3 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /utility-types@3.11.0: + resolution: + { + integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==, + } + engines: { node: '>= 4' } + dev: true + + /vite-node@1.4.0: + resolution: + { + integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.8 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@5.2.8: + resolution: + { + integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.14.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@1.4.0: + resolution: + { + integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.4.0 + '@vitest/ui': 1.4.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@vitest/expect': 1.4.0 + '@vitest/runner': 1.4.0 + '@vitest/snapshot': 1.4.0 + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.9 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.2.8 + vite-node: 1.4.0 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /weak-lru-cache@1.2.2: + resolution: + { + integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==, + } + dev: true + + /which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /why-is-node-running@2.2.2: + resolution: + { + integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==, + } + engines: { node: '>=8' } + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + dev: true + + /yaml@1.10.2: + resolution: + { + integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, + } + engines: { node: '>= 6' } + dev: false + + /yocto-queue@1.0.0: + resolution: + { + integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, + } + engines: { node: '>=12.20' } + dev: true + + /zarr@0.6.2: + resolution: + { + integrity: sha512-3gtxrnpziRlDtrz0hz/M+hreCC5YexppeCVHK62Pmb2FSn947h14GHMDj9rQFkY2mPhRKDHhtB+AUGa8wqJW6Q==, + } + engines: { node: '>=12' } + dependencies: + numcodecs: 0.2.2 + p-queue: 7.4.1 + dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index cfa8468..5fca56a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,4 @@ -packages: - - "packages/**" - - "apps/**" - - "!**test**" +packages: + - 'packages/**' + - 'apps/**' + - '!**test**' diff --git a/tsconfig.base.json b/tsconfig.base.json index 9ec7859..ff28030 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,10 +1,10 @@ -{ - "compilerOptions": { - "strict": true, - "verbatimModuleSyntax": true, - "esModuleInterop": true, - "exactOptionalPropertyTypes": true, - "forceConsistentCasingInFileNames": true, - "skipLibCheck": true, - } -} +{ + "compilerOptions": { + "strict": true, + "verbatimModuleSyntax": true, + "esModuleInterop": true, + "exactOptionalPropertyTypes": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true + } +}