@jax-data-science/sci-image-visualizer 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +10 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +1 -1
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +11 -7
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +20 -3
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +28 -5
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +9 -2
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +5 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +81 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +115 -4
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +15 -3
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +18 -7
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +38 -8
- package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
- package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +1 -1
- package/esm2022/lib/models/class-preset.mjs +1 -1
- package/esm2022/lib/models/polygon-factory.mjs +17 -1
- package/esm2022/lib/models/region-geojson.mjs +44 -6
- package/esm2022/lib/models/region.mjs +1 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +77 -13
- package/esm2022/lib/region-editor/region-editor.component.mjs +670 -42
- package/esm2022/lib/region-editor/region-metrics.mjs +20 -2
- package/esm2022/lib/region-editor/region-persistence.service.mjs +44 -10
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +24 -8
- package/esm2022/lib/region-import/label-classes.mjs +149 -0
- package/esm2022/lib/region-import/label-volume.mjs +194 -0
- package/esm2022/lib/region-import/region-import.mjs +71 -0
- package/esm2022/lib/region-overlay/region-geometry.mjs +3 -3
- package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/routing-visualizer.service.mjs +510 -22
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/store/class-color.util.mjs +10 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-scope-cache.mjs +5 -1
- package/esm2022/lib/store/region-source-scope.mjs +186 -0
- package/esm2022/lib/store/region-store.service.mjs +774 -12
- package/esm2022/lib/store/visualizer-store.service.mjs +33 -6
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +8 -2
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +55 -15
- package/esm2022/lib/toolbar/toolbar.component.mjs +19 -5
- package/esm2022/lib/visualizer/region-load.mjs +67 -4
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +155 -7
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs} +9851 -2904
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs} +4 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -3
- package/fesm2022/region-source.worker.js +1067 -0
- package/index.d.ts +12 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +24 -0
- package/lib/contracts/region-editor-api.contract.d.ts +102 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/visualizer.contract.d.ts +10 -0
- package/lib/contracts/viz-config.d.ts +8 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -2
- package/lib/implementations/napari-js/napari-loading-state.d.ts +8 -1
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +6 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +33 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +3 -1
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +48 -0
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +45 -1
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +4 -3
- package/lib/implementations/osd/osd-region-overlay.d.ts +10 -3
- package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
- package/lib/implementations/osd/slice-cache.d.ts +13 -3
- package/lib/implementations/tile-server/tile-protocol.d.ts +3 -0
- package/lib/models/class-preset.d.ts +7 -0
- package/lib/models/polygon-factory.d.ts +5 -0
- package/lib/models/region-geojson.d.ts +40 -0
- package/lib/models/region.d.ts +19 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +36 -6
- package/lib/region-editor/region-editor.component.d.ts +159 -17
- package/lib/region-editor/region-metrics.d.ts +8 -0
- package/lib/region-editor/region-persistence.service.d.ts +17 -5
- package/lib/region-editor/region-table/region-table.component.d.ts +10 -4
- package/lib/region-import/label-classes.d.ts +39 -0
- package/lib/region-import/label-volume.d.ts +31 -0
- package/lib/region-import/region-import.d.ts +46 -0
- package/lib/region-overlay/region-geometry.d.ts +4 -3
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/routing-visualizer.service.d.ts +168 -1
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/store/class-color.util.d.ts +6 -3
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-scope-cache.d.ts +2 -0
- package/lib/store/region-source-scope.d.ts +74 -0
- package/lib/store/region-store.service.d.ts +216 -2
- package/lib/store/visualizer-store.service.d.ts +10 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +3 -1
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +20 -9
- package/lib/toolbar/toolbar.component.d.ts +9 -2
- package/lib/visualizer/region-load.d.ts +23 -4
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +40 -0
- package/package.json +2 -2
- package/src/lib/assets/slice.svg +23 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +0 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { firstValueFrom } from 'rxjs';
|
|
2
|
+
import { RegionTileCache, abortable } from './region-source';
|
|
3
|
+
/** Open the region source at `baseUrl` (its `info` is fetched first). */
|
|
4
|
+
export async function openHttpRegionSource(baseUrl, options = {}) {
|
|
5
|
+
const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
|
|
6
|
+
const http = new Http(base, options);
|
|
7
|
+
const info = await http.json('info');
|
|
8
|
+
return new HttpRegionSource(http, info);
|
|
9
|
+
}
|
|
10
|
+
class Http {
|
|
11
|
+
constructor(base, options) {
|
|
12
|
+
this.base = base;
|
|
13
|
+
this.options = options;
|
|
14
|
+
this.fetchFn = options.fetch ?? ((input, init) => fetch(input, init));
|
|
15
|
+
}
|
|
16
|
+
async json(path, body) {
|
|
17
|
+
return JSON.parse(await this.text(path, body));
|
|
18
|
+
}
|
|
19
|
+
async text(path, body) {
|
|
20
|
+
const http = this.options.http;
|
|
21
|
+
if (http) {
|
|
22
|
+
const url = this.base + path;
|
|
23
|
+
try {
|
|
24
|
+
return await firstValueFrom(body === undefined
|
|
25
|
+
? http.get(url, { responseType: 'text' })
|
|
26
|
+
: http.post(url, body, { responseType: 'text' }));
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const status = err?.status;
|
|
30
|
+
throw new Error(`Region source ${path}: HTTP ${status ?? 'error'}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const init = { ...this.options.init };
|
|
34
|
+
if (body !== undefined) {
|
|
35
|
+
init.method = 'POST';
|
|
36
|
+
init.body = JSON.stringify(body);
|
|
37
|
+
init.headers = {
|
|
38
|
+
...this.options.init?.headers,
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const res = await this.fetchFn(this.base + path, init);
|
|
43
|
+
if (!res.ok)
|
|
44
|
+
throw new Error(`Region source ${path}: HTTP ${res.status}`);
|
|
45
|
+
return res.text();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
class HttpRegionSource {
|
|
49
|
+
constructor(http, info) {
|
|
50
|
+
this.http = http;
|
|
51
|
+
this.info = info;
|
|
52
|
+
this.cache = new RegionTileCache();
|
|
53
|
+
}
|
|
54
|
+
getTile(z, key, signal) {
|
|
55
|
+
// The fetch itself is not aborted: another view (the other backend) may be waiting on the
|
|
56
|
+
// same cached tile, and a tile is small. Only this caller stops waiting.
|
|
57
|
+
const tile = this.cache.get(z, key, async () => {
|
|
58
|
+
const wire = await this.http.json(`tile/${z}/${key.level}/${key.gx}/${key.gy}`);
|
|
59
|
+
return { z, ...key, features: wire.features.map(fromWire) };
|
|
60
|
+
});
|
|
61
|
+
return abortable(tile, signal);
|
|
62
|
+
}
|
|
63
|
+
async getFeatures(ids) {
|
|
64
|
+
if (!ids.length)
|
|
65
|
+
return [];
|
|
66
|
+
return (await this.http.json('features', { ids })).features;
|
|
67
|
+
}
|
|
68
|
+
getIndex(z, query) {
|
|
69
|
+
return this.http.json('index', { z, ...query });
|
|
70
|
+
}
|
|
71
|
+
async getClassOutlines(classes, level, exclude = []) {
|
|
72
|
+
const wire = await this.http.json('outlines', { classes, level, exclude });
|
|
73
|
+
return wire.slices.map((s) => ({
|
|
74
|
+
z: s.z,
|
|
75
|
+
rings: s.rings.map((r) => Float32Array.from(r)),
|
|
76
|
+
...(s.lines?.length ? { lines: s.lines.map((l) => Float32Array.from(l)) } : {}),
|
|
77
|
+
...(s.ringGroups ? { ringGroups: s.ringGroups } : {}),
|
|
78
|
+
...(s.ringLabels ? { ringLabels: s.ringLabels } : {}),
|
|
79
|
+
...(s.lineLabels ? { lineLabels: s.lineLabels } : {}),
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
getClassCounts(z, exclude = []) {
|
|
83
|
+
// Every plane is `all` (a plane must be a number: a server that predates it answers 400).
|
|
84
|
+
return this.http.json('classes', z === null ? { all: true, exclude } : { z, exclude });
|
|
85
|
+
}
|
|
86
|
+
exportGeoJson(exclude, extra) {
|
|
87
|
+
return this.http.text('export', { exclude, extra });
|
|
88
|
+
}
|
|
89
|
+
dispose() {
|
|
90
|
+
this.cache.clear();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function fromWire(f) {
|
|
94
|
+
return {
|
|
95
|
+
id: f.id,
|
|
96
|
+
label: f.label ?? null,
|
|
97
|
+
color: f.color ?? null,
|
|
98
|
+
bbox: f.bbox,
|
|
99
|
+
rings: f.rings.map((r) => Float32Array.from(r)),
|
|
100
|
+
open: !!f.open,
|
|
101
|
+
...(f.labels?.length ? { labels: Float32Array.from(f.labels) } : {}),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZWdpb24tc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24tc291cmNlL2h0dHAtcmVnaW9uLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtQkEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQWdCLGVBQWUsRUFBaUIsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFvQzFGLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxPQUFlLEVBQ2YsVUFBbUMsRUFBRTtJQUVyQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUM7SUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBbUIsTUFBTSxDQUFDLENBQUM7SUFDdkQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsTUFBTSxJQUFJO0lBR1IsWUFDbUIsSUFBWSxFQUNaLE9BQWdDO1FBRGhDLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUVqRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBSSxJQUFZLEVBQUUsSUFBYztRQUN4QyxPQUFPLElB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LEtBQUssSUFBSSxJQUFJO1FBQ3RCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUk7UUFDdEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1FBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNyRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSB7QGxpbmsgUmVnaW9uU291cmNlfSBzZXJ2ZWQgb3ZlciBIVFRQLCBieSBhIHNlcnZlciB0aGF0IHRpbGVzIGEgcmVnaW9uIHNldCBhcyBgcmVnaW9uLXRpbGVzYFxuICogZG9lcyAodGhlIGV4YW1wbGUgdGlsZSBzZXJ2ZXIncyBgL3JlZ2lvbnMv4oCmYCByb3V0ZXMpLiBSZWxhdGl2ZSB0byB0aGUgc291cmNlJ3MgYmFzZSBVUkw6XG4gKlxuICogIC0gYEdFVCAgaW5mb2AgICAgICAgICAgICAgICAgICAgICAgIOKGkiB7QGxpbmsgUmVnaW9uU291cmNlSW5mb31cbiAqICAtIGBHRVQgIHRpbGUve3p9L3tsZXZlbH0ve2d4fS97Z3l9YCDihpIgYHsgZmVhdHVyZXM6IFdpcmVUaWxlRmVhdHVyZVtdIH1gXG4gKiAgLSBgUE9TVCBmZWF0dXJlc2AgYHsgaWRzIH1gICAgICAgICAg4oaSIGB7IGZlYXR1cmVzOiBTb3VyY2VGZWF0dXJlW10gfWBcbiAqICAtIGBQT1NUIGluZGV4YCBgeyB6LCAuLi5xdWVyeSB9YCAgICDihpIge0BsaW5rIFJlZ2lvbkluZGV4UGFnZX1cbiAqICAtIGBQT1NUIGNsYXNzZXNgIGB7IHosIGV4Y2x1ZGUgfWAgICAg4oaSIGZlYXR1cmVzIHBlciBjbGFzcyBvbiBwbGFuZSB6XG4gKiAgLSBgUE9TVCBvdXRsaW5lc2AgYHsgY2xhc3NlcywgbGV2ZWwsIGV4Y2x1ZGUgfWAg4oaSIGB7IHNsaWNlczogW3sgeiwgcmluZ3MgfV0gfWBcbiAqICAtIGBQT1NUIGV4cG9ydGAgYHsgZXhjbHVkZSwgZXh0cmEgfWDihpIgYSBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uXG4gKlxuICogVGlsZSByaW5ncyB0cmF2ZWwgYXMgZmxhdCBgW3gsIHksIHgsIHksIOKApl1gIGFycmF5cywgbGFiZWwgcG9pbnRzIGFzIGZsYXQgYFt4LCB5LCByb29tLCDigKZdYC5cbiAqXG4gKiBHaXZlbiB0aGUgaG9zdCdzIEFuZ3VsYXIgYEh0dHBDbGllbnRgIChhcyB0aGUgdmlzdWFsaXplciBwYXNzZXMgaXQpLCBldmVyeSByZXF1ZXN0IGdvZXMgdGhyb3VnaFxuICogaXQsIHNvIHRoZSBob3N0J3MgaW50ZXJjZXB0b3JzIGFwcGx5IOKAlCBpdHMgYXV0aCBoZWFkZXIgYWJvdmUgYWxsIOKAlCBhcyBmb3IgdGhlIGltYWdlIHRpbGVzIGFuZFxuICogdGhlIHNwYXRpYWwgZGF0YS4gVGhlIGxpYnJhcnkgaXRzZWxmIGtub3dzIG5vdGhpbmcgb2YgYXV0aGVudGljYXRpb24uXG4gKi9cbmltcG9ydCB0eXBlIHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSZWdpb25Tb3VyY2UsIFJlZ2lvblRpbGVDYWNoZSwgU291cmNlRmVhdHVyZSwgYWJvcnRhYmxlIH0gZnJvbSAnLi9yZWdpb24tc291cmNlJztcbmltcG9ydCB0eXBlIHtcbiAgQmJveCxcbiAgQ2xhc3NPdXRsaW5lcyxcbiAgUmVnaW9uSW5kZXhQYWdlLFxuICBSZWdpb25JbmRleFF1ZXJ5LFxuICBSZWdpb25Tb3VyY2VJbmZvLFxuICBSZWdpb25UaWxlLFxuICBSZWdpb25UaWxlS2V5LFxuICBUaWxlRmVhdHVyZSxcbn0gZnJvbSAnLi9yZWdpb24tdGlsZXMnO1xuXG4vKiogQSB0aWxlIGZlYXR1cmUgb24gdGhlIHdpcmU6IHJpbmdzIGFzIHBsYWluIGFycmF5cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2lyZVRpbGVGZWF0dXJlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZyB8IG51bGw7XG4gIGNvbG9yOiBzdHJpbmcgfCBudWxsO1xuICBiYm94OiBCYm94O1xuICByaW5nczogbnVtYmVyW11bXTtcbiAgb3Blbj86IGJvb2xlYW47XG4gIGxhYmVscz86IG51bWJlcltdO1xufVxuXG4vKiogT3B0aW9ucyBvZiB7QGxpbmsgb3Blbkh0dHBSZWdpb25Tb3VyY2V9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwUmVnaW9uU291cmNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgaG9zdCdzIGBIdHRwQ2xpZW50YDogcmVxdWVzdHMgdGhlbiBnbyB0aHJvdWdoIGl0IGFuZCBpdHMgaW50ZXJjZXB0b3JzICh0aGUgaG9zdCdzIGF1dGgpLFxuICAgKiBub3QgYGZldGNoYCwgYW5kIGBpbml0YCBhbmQgYGZldGNoYCBhcmUgbm90IHVzZWQuXG4gICAqL1xuICBodHRwPzogSHR0cENsaWVudDtcbiAgLyoqIEV4dHJhIHJlcXVlc3Qgb3B0aW9ucyAoY3JlZGVudGlhbHMsIGhlYWRlcnMpIGZvciBldmVyeSBgZmV0Y2hgIHJlcXVlc3QuICovXG4gIGluaXQ/OiBSZXF1ZXN0SW5pdDtcbiAgLyoqIFRoZSBmZXRjaCB0byB1c2UgKGRlZmF1bHQgdGhlIGdsb2JhbCBvbmUpLiAqL1xuICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbn1cblxuLyoqIE9wZW4gdGhlIHJlZ2lvbiBzb3VyY2UgYXQgYGJhc2VVcmxgIChpdHMgYGluZm9gIGlzIGZldGNoZWQgZmlyc3QpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5IdHRwUmVnaW9uU291cmNlKFxuICBiYXNlVXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEh0dHBSZWdpb25Tb3VyY2VPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFJlZ2lvblNvdXJjZT4ge1xuICBjb25zdCBiYXNlID0gYmFzZVVybC5lbmRzV2l0aCgnLycpID8gYmFzZVVybCA6IGAke2Jhc2VVcmx9L2A7XG4gIGNvbnN0IGh0dHAgPSBuZXcgSHR0cChiYXNlLCBvcHRpb25zKTtcbiAgY29uc3QgaW5mbyA9IGF3YWl0IGh0dHAuanNvbjxSZWdpb25Tb3VyY2VJbmZvPignaW5mbycpO1xuICByZXR1cm4gbmV3IEh0dHBSZWdpb25Tb3VyY2UoaHR0cCwgaW5mbyk7XG59XG5cbmNsYXNzIEh0dHAge1xuICBwcml2YXRlIHJlYWRvbmx5IGZldGNoRm46IHR5cGVvZiBmZXRjaDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhc2U6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEh0dHBSZWdpb25Tb3VyY2VPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLmZldGNoRm4gPSBvcHRpb25zLmZldGNoID8/ICgoaW5wdXQsIGluaXQpID0+IGZldGNoKGlucHV0LCBpbml0KSk7XG4gIH1cblxuICBhc3luYyBqc29uPFQ+KHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCB0aGlzLnRleHQocGF0aCwgYm9keSkpIGFzIFQ7XG4gIH1cblxuICBhc3luYyB0ZXh0KHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGh0dHAgPSB0aGlzLm9wdGlvbnMuaHR0cDtcbiAgICBpZiAoaHR0cCkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlICsgcGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICBib2R5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pXG4gICAgICAgICAgICA6IGh0dHAucG9zdCh1cmwsIGJvZHksIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSksXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gKGVyciBhcyB7IHN0YXR1cz86IG51bWJlciB9IHwgbnVsbCk/LnN0YXR1cztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpb24gc291cmNlICR7cGF0aH06IEhUVFAgJHtzdGF0dXMgPz8gJ2Vycm9yJ31gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7IC4uLnRoaXMub3B0aW9ucy5pbml0IH07XG4gICAgaWYgKGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5pdC5tZXRob2QgPSAnUE9TVCc7XG4gICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICAgIGluaXQuaGVhZGVycyA9IHtcbiAgICAgICAgLi4uKHRoaXMub3B0aW9ucy5pbml0Py5oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pLFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5mZXRjaEZuKHRoaXMuYmFzZSArIHBhdGgsIGluaXQpO1xuICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lvbiBzb3VyY2UgJHtwYXRofTogSFRUUCAke3Jlcy5zdGF0dXN9YCk7XG4gICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gIH1cbn1cblxuY2xhc3MgSHR0cFJlZ2lvblNvdXJjZSBpbXBsZW1lbnRzIFJlZ2lvblNvdXJjZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgUmVnaW9uVGlsZUNhY2hlKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwLFxuICAgIHJlYWRvbmx5IGluZm86IFJlZ2lvblNvdXJjZUluZm8sXG4gICkge31cblxuICBnZXRUaWxlKHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UmVnaW9uVGlsZT4ge1xuICAgIC8vIFRoZSBmZXRjaCBpdHNlbGYgaXMgbm90IGFib3J0ZWQ6IGFub3RoZXIgdmlldyAodGhlIG90aGVyIGJhY2tlbmQpIG1heSBiZSB3YWl0aW5nIG9uIHRoZVxuICAgIC8vIHNhbWUgY2FjaGVkIHRpbGUsIGFuZCBhIHRpbGUgaXMgc21hbGwuIE9ubHkgdGhpcyBjYWxsZXIgc3RvcHMgd2FpdGluZy5cbiAgICBjb25zdCB0aWxlID0gdGhpcy5jYWNoZS5nZXQoeiwga2V5LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB3aXJlID0gYXdhaXQgdGhpcy5odHRwLmpzb248eyBmZWF0dXJlczogV2lyZVRpbGVGZWF0dXJlW10gfT4oXG4gICAgICAgIGB0aWxlLyR7en0vJHtrZXkubGV2ZWx9LyR7a2V5Lmd4fS8ke2tleS5neX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHosIC4uLmtleSwgZmVhdHVyZXM6IHdpcmUuZmVhdHVyZXMubWFwKGZyb21XaXJlKSB9O1xuICAgIH0pO1xuICAgIHJldHVybiBhYm9ydGFibGUodGlsZSwgc2lnbmFsKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFNvdXJjZUZlYXR1cmVbXT4ge1xuICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5odHRwLmpzb248eyBmZWF0dXJlczogU291cmNlRmVhdHVyZVtdIH0+KCdmZWF0dXJlcycsIHsgaWRzIH0pKS5mZWF0dXJlcztcbiAgfVxuXG4gIGdldEluZGV4KHo6IG51bWJlciwgcXVlcnk6IFJlZ2lvbkluZGV4UXVlcnkpOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuanNvbjxSZWdpb25JbmRleFBhZ2U+KCdpbmRleCcsIHsgeiwgLi4ucXVlcnkgfSk7XG4gIH1cblxuICBhc3luYyBnZXRDbGFzc091dGxpbmVzKFxuICAgIGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGV4Y2x1ZGU6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gICk6IFByb21pc2U8Q2xhc3NPdXRsaW5lc1tdPiB7XG4gICAgY29uc3Qgd2lyZSA9IGF3YWl0IHRoaXMuaHR0cC5qc29uPHtcbiAgICAgIHNsaWNlczogQXJyYXk8e1xuICAgICAgICB6OiBudW1iZXI7XG4gICAgICAgIHJpbmdzOiBudW1iZXJbXVtdO1xuICAgICAgICBsaW5lcz86IG51bWJlcltdW107XG4gICAgICAgIHJpbmdHcm91cHM/OiBudW1iZXJbXTtcbiAgICAgICAgcmluZ0xhYmVscz86IHN0cmluZ1tdO1xuICAgICAgICBsaW5lTGFiZWxzPzogc3RyaW5nW107XG4gICAgICB9PjtcbiAgICB9Pignb3V0bGluZXMnLCB7IGNsYXNzZXMsIGxldmVsLCBleGNsdWRlIH0pO1xuICAgIHJldHVybiB3aXJlLnNsaWNlcy5tYXAoKHMpID0+ICh7XG4gICAgICB6OiBzLnosXG4gICAgICByaW5nczogcy5yaW5ncy5tYXAoKHIpID0+IEZsb2F0MzJBcnJheS5mcm9tKHIpKSxcbiAgICAgIC4uLihzLmxpbmVzPy5sZW5ndGggPyB7IGxpbmVzOiBzLmxpbmVzLm1hcCgobCkgPT4gRmxvYXQzMkFycmF5LmZyb20obCkpIH0gOiB7fSksXG4gICAgICAuLi4ocy5yaW5nR3JvdXBzID8geyByaW5nR3JvdXBzOiBzLnJpbmdHcm91cHMgfSA6IHt9KSxcbiAgICAgIC4uLihzLnJpbmdMYWJlbHMgPyB7IHJpbmdMYWJlbHM6IHMucmluZ0xhYmVscyB9IDoge30pLFxuICAgICAgLi4uKHMubGluZUxhYmVscyA/IHsgbGluZUxhYmVsczogcy5saW5lTGFiZWxzIH0gOiB7fSksXG4gICAgfSkpO1xuICB9XG5cbiAgZ2V0Q2xhc3NDb3VudHMoejogbnVtYmVyIHwgbnVsbCwgZXhjbHVkZTogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIC8vIEV2ZXJ5IHBsYW5lIGlzIGBhbGxgIChhIHBsYW5lIG11c3QgYmUgYSBudW1iZXI6IGEgc2VydmVyIHRoYXQgcHJlZGF0ZXMgaXQgYW5zd2VycyA0MDApLlxuICAgIHJldHVybiB0aGlzLmh0dHAuanNvbjxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PignY2xhc3NlcycsIHogPT09IG51bGwgPyB7IGFsbDogdHJ1ZSwgZXhjbHVkZSB9IDogeyB6LCBleGNsdWRlIH0pO1xuICB9XG5cbiAgZXhwb3J0R2VvSnNvbihleGNsdWRlOiByZWFkb25seSBzdHJpbmdbXSwgZXh0cmE6IHJlYWRvbmx5IG9iamVjdFtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnRleHQoJ2V4cG9ydCcsIHsgZXhjbHVkZSwgZXh0cmEgfSk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmcm9tV2lyZShmOiBXaXJlVGlsZUZlYXR1cmUpOiBUaWxlRmVhdHVyZSB7XG4gIHJldHVybiB7XG4gICAgaWQ6IGYuaWQsXG4gICAgbGFiZWw6IGYubGFiZWwgPz8gbnVsbCxcbiAgICBjb2xvcjogZi5jb2xvciA/PyBudWxsLFxuICAgIGJib3g6IGYuYmJveCxcbiAgICByaW5nczogZi5yaW5ncy5tYXAoKHIpID0+IEZsb2F0MzJBcnJheS5mcm9tKHIpKSxcbiAgICBvcGVuOiAhIWYub3BlbixcbiAgICAuLi4oZi5sYWJlbHM/Lmxlbmd0aCA/IHsgbGFiZWxzOiBGbG9hdDMyQXJyYXkuZnJvbShmLmxhYmVscykgfSA6IHt9KSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The region-source worker's protocol and the tables it holds, shared by the worker and the
|
|
3
|
+
* main-thread fallback (which runs the very same {@link RegionSourceTables} where no worker can
|
|
4
|
+
* start).
|
|
5
|
+
*
|
|
6
|
+
* Protocol: `{ id, op, ...args }` → `{ id, ok: true, result }` | `{ id, ok: false, error }`.
|
|
7
|
+
*/
|
|
8
|
+
import { reconstruct } from '../geometry/reconstruct';
|
|
9
|
+
import { RegionFeatureTable, } from './region-tiles';
|
|
10
|
+
/** The open tables, by handle. */
|
|
11
|
+
export class RegionSourceTables {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.tables = new Map();
|
|
14
|
+
this.nextHandle = 1;
|
|
15
|
+
}
|
|
16
|
+
run(request) {
|
|
17
|
+
return this.dispatch(request);
|
|
18
|
+
}
|
|
19
|
+
dispatch(r) {
|
|
20
|
+
switch (r.op) {
|
|
21
|
+
case 'open': {
|
|
22
|
+
const table = RegionFeatureTable.fromGeoJson(r.text, r.tileSize);
|
|
23
|
+
const handle = this.nextHandle++;
|
|
24
|
+
this.tables.set(handle, table);
|
|
25
|
+
return { handle, info: table.info() };
|
|
26
|
+
}
|
|
27
|
+
case 'tile':
|
|
28
|
+
return this.table(r.handle).tile(r.z, r.level, r.gx, r.gy);
|
|
29
|
+
case 'features':
|
|
30
|
+
return this.table(r.handle).features(r.ids);
|
|
31
|
+
case 'index':
|
|
32
|
+
return this.table(r.handle).index(r.z, r.query);
|
|
33
|
+
case 'classes':
|
|
34
|
+
return this.table(r.handle).classCounts(r.z, r.exclude);
|
|
35
|
+
case 'outlines':
|
|
36
|
+
return this.table(r.handle).classOutlines(r.classes, r.level, r.exclude);
|
|
37
|
+
case 'mesh':
|
|
38
|
+
return reconstruct(r.slices, r.options);
|
|
39
|
+
case 'export':
|
|
40
|
+
return this.table(r.handle).exportGeoJson(r.exclude, r.extra);
|
|
41
|
+
case 'close':
|
|
42
|
+
this.tables.delete(r.handle);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
table(handle) {
|
|
47
|
+
const table = this.tables.get(handle);
|
|
48
|
+
if (!table)
|
|
49
|
+
throw new Error(`No open region source ${handle}.`);
|
|
50
|
+
return table;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS1vcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXNvdXJjZS1vcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFxQyxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV6RixPQUFPLEVBRUwsa0JBQWtCLEdBS25CLE1BQU0sZ0JBQWdCLENBQUM7QUFxQ3hCLGtDQUFrQztBQUNsQyxNQUFNLE9BQU8sa0JBQWtCO0lBQS9CO1FBQ21CLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztRQUN4RCxlQUFVLEdBQUcsQ0FBQyxDQUFDO0lBdUN6QixDQUFDO0lBckNDLEdBQUcsQ0FBZ0MsT0FBVTtRQUMzQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFpQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxRQUFRLENBQUMsQ0FBc0I7UUFDckMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDYixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ1osTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDeEMsQ0FBQztZQUNELEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0QsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEQsS0FBSyxTQUFTO2dCQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELEtBQUssVUFBVTtnQkFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNFLEtBQUssTUFBTTtnQkFDVCxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEUsS0FBSyxPQUFPO2dCQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsTUFBYztRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSByZWdpb24tc291cmNlIHdvcmtlcidzIHByb3RvY29sIGFuZCB0aGUgdGFibGVzIGl0IGhvbGRzLCBzaGFyZWQgYnkgdGhlIHdvcmtlciBhbmQgdGhlXG4gKiBtYWluLXRocmVhZCBmYWxsYmFjayAod2hpY2ggcnVucyB0aGUgdmVyeSBzYW1lIHtAbGluayBSZWdpb25Tb3VyY2VUYWJsZXN9IHdoZXJlIG5vIHdvcmtlciBjYW5cbiAqIHN0YXJ0KS5cbiAqXG4gKiBQcm90b2NvbDogYHsgaWQsIG9wLCAuLi5hcmdzIH1gIOKGkiBgeyBpZCwgb2s6IHRydWUsIHJlc3VsdCB9YCB8IGB7IGlkLCBvazogZmFsc2UsIGVycm9yIH1gLlxuICovXG5pbXBvcnQgeyBSZWNvbnN0cnVjdE9wdGlvbnMsIFNsaWNlT3V0bGluZXMsIHJlY29uc3RydWN0IH0gZnJvbSAnLi4vZ2VvbWV0cnkvcmVjb25zdHJ1Y3QnO1xuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSAnbmFwYXJpLWpzL2dlb21ldHJ5JztcbmltcG9ydCB7XG4gIENsYXNzT3V0bGluZXMsXG4gIFJlZ2lvbkZlYXR1cmVUYWJsZSxcbiAgUmVnaW9uSW5kZXhQYWdlLFxuICBSZWdpb25JbmRleFF1ZXJ5LFxuICBSZWdpb25Tb3VyY2VJbmZvLFxuICBSZWdpb25UaWxlLFxufSBmcm9tICcuL3JlZ2lvbi10aWxlcyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZlYXR1cmUgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UnO1xuXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VSZXF1ZXN0ID1cbiAgfCB7IG9wOiAnb3Blbic7IHRleHQ6IHN0cmluZzsgdGlsZVNpemU/OiBudW1iZXIgfVxuICB8IHsgb3A6ICd0aWxlJzsgaGFuZGxlOiBudW1iZXI7IHo6IG51bWJlcjsgbGV2ZWw6IG51bWJlcjsgZ3g6IG51bWJlcjsgZ3k6IG51bWJlciB9XG4gIHwgeyBvcDogJ2ZlYXR1cmVzJzsgaGFuZGxlOiBudW1iZXI7IGlkczogcmVhZG9ubHkgc3RyaW5nW10gfVxuICB8IHsgb3A6ICdpbmRleCc7IGhhbmRsZTogbnVtYmVyOyB6OiBudW1iZXI7IHF1ZXJ5OiBSZWdpb25JbmRleFF1ZXJ5IH1cbiAgfCB7IG9wOiAnY2xhc3Nlcyc7IGhhbmRsZTogbnVtYmVyOyB6OiBudW1iZXIgfCBudWxsOyBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10gfVxuICB8IHtcbiAgICAgIG9wOiAnb3V0bGluZXMnO1xuICAgICAgaGFuZGxlOiBudW1iZXI7XG4gICAgICBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGw7XG4gICAgICBsZXZlbDogbnVtYmVyO1xuICAgICAgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIH1cbiAgfCB7IG9wOiAnbWVzaCc7IHNsaWNlczogcmVhZG9ubHkgU2xpY2VPdXRsaW5lc1tdOyBvcHRpb25zPzogUmVjb25zdHJ1Y3RPcHRpb25zIH1cbiAgfCB7IG9wOiAnZXhwb3J0JzsgaGFuZGxlOiBudW1iZXI7IGV4Y2x1ZGU6IHJlYWRvbmx5IHN0cmluZ1tdOyBleHRyYTogcmVhZG9ubHkgb2JqZWN0W10gfVxuICB8IHsgb3A6ICdjbG9zZSc7IGhhbmRsZTogbnVtYmVyIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uU291cmNlUmVzdWx0cyB7XG4gIG9wZW46IHsgaGFuZGxlOiBudW1iZXI7IGluZm86IFJlZ2lvblNvdXJjZUluZm8gfTtcbiAgdGlsZTogUmVnaW9uVGlsZTtcbiAgZmVhdHVyZXM6IFNvdXJjZUZlYXR1cmVbXTtcbiAgaW5kZXg6IFJlZ2lvbkluZGV4UGFnZTtcbiAgY2xhc3NlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgb3V0bGluZXM6IENsYXNzT3V0bGluZXNbXTtcbiAgbWVzaDogTWVzaDtcbiAgZXhwb3J0OiBzdHJpbmc7XG4gIGNsb3NlOiBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VNZXNzYWdlID0gUmVnaW9uU291cmNlUmVxdWVzdCAmIHsgaWQ6IG51bWJlciB9O1xuXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VSZXBseSA9XG4gIHsgaWQ6IG51bWJlcjsgb2s6IHRydWU7IHJlc3VsdDogdW5rbm93biB9IHwgeyBpZDogbnVtYmVyOyBvazogZmFsc2U7IGVycm9yOiBzdHJpbmcgfTtcblxuLyoqIFRoZSBvcGVuIHRhYmxlcywgYnkgaGFuZGxlLiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lvblNvdXJjZVRhYmxlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFibGVzID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbkZlYXR1cmVUYWJsZT4oKTtcbiAgcHJpdmF0ZSBuZXh0SGFuZGxlID0gMTtcblxuICBydW48UiBleHRlbmRzIFJlZ2lvblNvdXJjZVJlcXVlc3Q+KHJlcXVlc3Q6IFIpOiBSZWdpb25Tb3VyY2VSZXN1bHRzW1JbJ29wJ11dIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChyZXF1ZXN0KSBhcyBSZWdpb25Tb3VyY2VSZXN1bHRzW1JbJ29wJ11dO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaChyOiBSZWdpb25Tb3VyY2VSZXF1ZXN0KTogUmVnaW9uU291cmNlUmVzdWx0c1trZXlvZiBSZWdpb25Tb3VyY2VSZXN1bHRzXSB7XG4gICAgc3dpdGNoIChyLm9wKSB7XG4gICAgICBjYXNlICdvcGVuJzoge1xuICAgICAgICBjb25zdCB0YWJsZSA9IFJlZ2lvbkZlYXR1cmVUYWJsZS5mcm9tR2VvSnNvbihyLnRleHQsIHIudGlsZVNpemUpO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLm5leHRIYW5kbGUrKztcbiAgICAgICAgdGhpcy50YWJsZXMuc2V0KGhhbmRsZSwgdGFibGUpO1xuICAgICAgICByZXR1cm4geyBoYW5kbGUsIGluZm86IHRhYmxlLmluZm8oKSB9O1xuICAgICAgfVxuICAgICAgY2FzZSAndGlsZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS50aWxlKHIueiwgci5sZXZlbCwgci5neCwgci5neSk7XG4gICAgICBjYXNlICdmZWF0dXJlcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5mZWF0dXJlcyhyLmlkcyk7XG4gICAgICBjYXNlICdpbmRleCc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5pbmRleChyLnosIHIucXVlcnkpO1xuICAgICAgY2FzZSAnY2xhc3Nlcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5jbGFzc0NvdW50cyhyLnosIHIuZXhjbHVkZSk7XG4gICAgICBjYXNlICdvdXRsaW5lcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5jbGFzc091dGxpbmVzKHIuY2xhc3Nlcywgci5sZXZlbCwgci5leGNsdWRlKTtcbiAgICAgIGNhc2UgJ21lc2gnOlxuICAgICAgICByZXR1cm4gcmVjb25zdHJ1Y3Qoci5zbGljZXMsIHIub3B0aW9ucyk7XG4gICAgICBjYXNlICdleHBvcnQnOlxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZShyLmhhbmRsZSkuZXhwb3J0R2VvSnNvbihyLmV4Y2x1ZGUsIHIuZXh0cmEpO1xuICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICB0aGlzLnRhYmxlcy5kZWxldGUoci5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRhYmxlKGhhbmRsZTogbnVtYmVyKTogUmVnaW9uRmVhdHVyZVRhYmxlIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldChoYW5kbGUpO1xuICAgIGlmICghdGFibGUpIHRocm93IG5ldyBFcnJvcihgTm8gb3BlbiByZWdpb24gc291cmNlICR7aGFuZGxlfS5gKTtcbiAgICByZXR1cm4gdGFibGU7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for the region-source Web Worker, isolated in its own module so the `import.meta.url`
|
|
3
|
+
* reference — which the bundler needs in order to locate the worker — is never pulled into the
|
|
4
|
+
* ts-jest CommonJS compile of anything that uses it. Same arrangement as
|
|
5
|
+
* `workers/spatial-math-worker.ts`.
|
|
6
|
+
*/
|
|
7
|
+
export function createRegionSourceWorker() {
|
|
8
|
+
return new Worker(new URL('./region-source.worker', import.meta.url), { type: 'module' });
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS13b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXNvdXJjZS13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQzVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZhY3RvcnkgZm9yIHRoZSByZWdpb24tc291cmNlIFdlYiBXb3JrZXIsIGlzb2xhdGVkIGluIGl0cyBvd24gbW9kdWxlIHNvIHRoZSBgaW1wb3J0Lm1ldGEudXJsYFxuICogcmVmZXJlbmNlIOKAlCB3aGljaCB0aGUgYnVuZGxlciBuZWVkcyBpbiBvcmRlciB0byBsb2NhdGUgdGhlIHdvcmtlciDigJQgaXMgbmV2ZXIgcHVsbGVkIGludG8gdGhlXG4gKiB0cy1qZXN0IENvbW1vbkpTIGNvbXBpbGUgb2YgYW55dGhpbmcgdGhhdCB1c2VzIGl0LiBTYW1lIGFycmFuZ2VtZW50IGFzXG4gKiBgd29ya2Vycy9zcGF0aWFsLW1hdGgtd29ya2VyLnRzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZ2lvblNvdXJjZVdvcmtlcigpOiBXb3JrZXIge1xuICByZXR1cm4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3JlZ2lvbi1zb3VyY2Uud29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSwgeyB0eXBlOiAnbW9kdWxlJyB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ROI GeoJSON at least this many characters long loads as a tiled region source rather than as
|
|
3
|
+
* regions (see `VizConfig.regionSourceMinChars`).
|
|
4
|
+
*/
|
|
5
|
+
export const REGION_SOURCE_MIN_CHARS = 1_000_000;
|
|
6
|
+
/** Tiles a source keeps, most recently used last. */
|
|
7
|
+
export const REGION_TILE_CACHE_SIZE = 384;
|
|
8
|
+
/** A least-recently-used cache of tile requests. A request that fails is forgotten. */
|
|
9
|
+
export class RegionTileCache {
|
|
10
|
+
constructor(limit = REGION_TILE_CACHE_SIZE) {
|
|
11
|
+
this.limit = limit;
|
|
12
|
+
this.tiles = new Map();
|
|
13
|
+
}
|
|
14
|
+
/** The cached tile, else `load()`'s, cached. */
|
|
15
|
+
get(z, key, load) {
|
|
16
|
+
const id = `${z}/${key.level}/${key.gx}/${key.gy}`;
|
|
17
|
+
const hit = this.tiles.get(id);
|
|
18
|
+
if (hit) {
|
|
19
|
+
this.tiles.delete(id);
|
|
20
|
+
this.tiles.set(id, hit);
|
|
21
|
+
return hit;
|
|
22
|
+
}
|
|
23
|
+
const tile = load();
|
|
24
|
+
this.tiles.set(id, tile);
|
|
25
|
+
tile.catch(() => {
|
|
26
|
+
if (this.tiles.get(id) === tile)
|
|
27
|
+
this.tiles.delete(id);
|
|
28
|
+
});
|
|
29
|
+
while (this.tiles.size > this.limit)
|
|
30
|
+
this.tiles.delete(this.tiles.keys().next().value);
|
|
31
|
+
return tile;
|
|
32
|
+
}
|
|
33
|
+
clear() {
|
|
34
|
+
this.tiles.clear();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** An `AbortError`, as `fetch` and the workers reject with. */
|
|
38
|
+
export function abortError() {
|
|
39
|
+
if (typeof DOMException !== 'undefined')
|
|
40
|
+
return new DOMException('The request was aborted.', 'AbortError');
|
|
41
|
+
const err = new Error('The request was aborted.');
|
|
42
|
+
err.name = 'AbortError';
|
|
43
|
+
return err;
|
|
44
|
+
}
|
|
45
|
+
/** True for the rejection of an aborted request. */
|
|
46
|
+
export function isAbortError(err) {
|
|
47
|
+
return err?.name === 'AbortError';
|
|
48
|
+
}
|
|
49
|
+
/** `promise`, rejected with an `AbortError` as soon as `signal` fires (the work goes on). */
|
|
50
|
+
export function abortable(promise, signal) {
|
|
51
|
+
if (!signal)
|
|
52
|
+
return promise;
|
|
53
|
+
if (signal.aborted)
|
|
54
|
+
return Promise.reject(abortError());
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
const onAbort = () => reject(abortError());
|
|
57
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
58
|
+
promise.then((v) => {
|
|
59
|
+
signal.removeEventListener('abort', onAbort);
|
|
60
|
+
resolve(v);
|
|
61
|
+
}, (e) => {
|
|
62
|
+
signal.removeEventListener('abort', onAbort);
|
|
63
|
+
reject(e);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLXNvdXJjZS9yZWdpb24tc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTZFQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxTQUFTLENBQUM7QUFFakQscURBQXFEO0FBQ3JELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUUxQyx1RkFBdUY7QUFDdkYsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFBNkIsUUFBUSxzQkFBc0I7UUFBOUIsVUFBSyxHQUFMLEtBQUssQ0FBeUI7UUFGMUMsVUFBSyxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO0lBRUYsQ0FBQztJQUUvRCxnREFBZ0Q7SUFDaEQsR0FBRyxDQUFDLENBQVMsRUFBRSxHQUFrQixFQUFFLElBQStCO1FBQ2hFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4QixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUk7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFlLENBQUMsQ0FBQztRQUNqRyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDO0NBQ0Y7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLFVBQVU7SUFDeEIsSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXO1FBQUUsT0FBTyxJQUFJLFlBQVksQ0FBQywwQkFBMEIsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMzRyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ2xELEdBQUcsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBQ3hCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVk7SUFDdkMsT0FBUSxHQUFnQyxFQUFFLElBQUksS0FBSyxZQUFZLENBQUM7QUFDbEUsQ0FBQztBQUVELDZGQUE2RjtBQUM3RixNQUFNLFVBQVUsU0FBUyxDQUFJLE9BQW1CLEVBQUUsTUFBb0I7SUFDcEUsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUM1QixJQUFJLE1BQU0sQ0FBQyxPQUFPO1FBQUUsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDeEQsT0FBTyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN4QyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE9BQU8sQ0FBQyxJQUFJLENBQ1YsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNKLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxFQUNELENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDSixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHRpbGVkIHJlZ2lvbiBzb3VyY2U6IG9uZSBpbWFnZSdzIGxhcmdlIHJlZ2lvbiBzZXQsIHNlcnZlZCBhcyBsZXZlbC1vZi1kZXRhaWwgdGlsZXMgc28gYSB2aWV3XG4gKiBuZXZlciBob2xkcyBvciBkcmF3cyB0aGUgd2hvbGUgc2V0IChzZWUgYHJlZ2lvbi10aWxlc2AgZm9yIHRoZSBsZXZlbHMgYW5kIHRpbGVzKS5cbiAqXG4gKiBUd28gaW1wbGVtZW50YXRpb25zIGJlaGluZCB7QGxpbmsgUmVnaW9uU291cmNlfTogYSBHZW9KU09OIHNvdXJjZSBwYXJzZWQgYW5kIHRpbGVkIGluIGEgV2ViXG4gKiBXb3JrZXIgKGBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZWAsIHRoZSBtYWluIHRocmVhZCBvbmx5IGV2ZXIgc2VlcyB0aWxlcyksIGFuZCBhbiBIVFRQIHNvdXJjZVxuICogZm9yIGEgc2VydmVyIHRoYXQgc2VydmVzIHRoZSBzYW1lIHRpbGVzIChgb3Blbkh0dHBSZWdpb25Tb3VyY2VgKS5cbiAqL1xuaW1wb3J0IHR5cGUge1xuICBDbGFzc091dGxpbmVzLFxuICBHZW9Kc29uRmVhdHVyZUxpa2UsXG4gIFJlZ2lvbkluZGV4UGFnZSxcbiAgUmVnaW9uSW5kZXhRdWVyeSxcbiAgUmVnaW9uU291cmNlSW5mbyxcbiAgUmVnaW9uVGlsZSxcbiAgUmVnaW9uVGlsZUtleSxcbiAgVGlsZUZlYXR1cmUsXG59IGZyb20gJy4vcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3R5bGUgfSBmcm9tICcuLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tc3R5bGUnO1xuXG4vKiogQSBmZWF0dXJlJ3MgZXhhY3QgR2VvSlNPTiB3aXRoIHRoZSBzb3VyY2UncyBpZCBmb3IgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZUZlYXR1cmUge1xuICBpZDogc3RyaW5nO1xuICBmZWF0dXJlOiBHZW9Kc29uRmVhdHVyZUxpa2U7XG59XG5cbi8qKiBPbmUgaW1hZ2UncyB0aWxlZCByZWdpb24gc2V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpb25Tb3VyY2Uge1xuICAvKiogV2hhdCB0aGUgc291cmNlIGhvbGRzOyBrbm93biBvbmNlIGl0IGlzIG9wZW4uICovXG4gIHJlYWRvbmx5IGluZm86IFJlZ2lvblNvdXJjZUluZm87XG4gIC8qKiBPbmUgdGlsZSBvZiBwbGFuZSBgemAuIENhY2hlZDogYXNraW5nIGFnYWluIGZvciBhIHRpbGUgaW4gdmlldyBjb3N0cyBub3RoaW5nLiAqL1xuICBnZXRUaWxlKHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UmVnaW9uVGlsZT47XG4gIC8qKiBUaGUgZXhhY3QgZmVhdHVyZXMgd2l0aCB0aGVzZSBpZHMgKHVua25vd24gaWRzIGFyZSBza2lwcGVkKS4gKi9cbiAgZ2V0RmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8U291cmNlRmVhdHVyZVtdPjtcbiAgLyoqIEEgcGFnZSBvZiBwbGFuZSBgemAncyBmZWF0dXJlIGluZGV4LiAqL1xuICBnZXRJbmRleCh6OiBudW1iZXIsIHF1ZXJ5OiBSZWdpb25JbmRleFF1ZXJ5KTogUHJvbWlzZTxSZWdpb25JbmRleFBhZ2U+O1xuICAvKipcbiAgICogRXZlcnkgcGxhbmUncyBvdXRsaW5lcyBvZiB0aGUgZmVhdHVyZXMgb2YgdGhlc2UgY2xhc3Nlcywgc2ltcGxpZmllZCBmb3IgYGxldmVsYCwgd2l0aG91dCB0aGVcbiAgICogYGV4Y2x1ZGVgZCBpZHM6IHdoYXQgYSAzRCByZWNvbnN0cnVjdGlvbiBvZiB0aGUgY2xhc3NlcyBzdGFja3MuIGBjbGFzc2VzYCBudWxsIHJlYWRzIGV2ZXJ5XG4gICAqIGNsYXNzLCBlYWNoIG91dGxpbmUgbGFiZWxsZWQgd2l0aCBpdHMgb3duICh3aGF0IGEgc2VjdGlvbiB0aHJvdWdoIHRoZSBzdGFjayBkcmF3cykuXG4gICAqL1xuICBnZXRDbGFzc091dGxpbmVzKFxuICAgIGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGV4Y2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTxDbGFzc091dGxpbmVzW10+O1xuICAvKipcbiAgICogSG93IG1hbnkgZmVhdHVyZXMgb2YgZWFjaCBjbGFzcyBwbGFuZSBgemAgaGFzIChudWxsOiBldmVyeSBwbGFuZSwgdGhlIHdob2xlIHN0YWNrKSwgd2l0aG91dFxuICAgKiB0aGUgYGV4Y2x1ZGVgZCBpZHMuXG4gICAqL1xuICBnZXRDbGFzc0NvdW50cyh6OiBudW1iZXIgfCBudWxsLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+O1xuICAvKipcbiAgICogVGhlIHdob2xlIHNldCBhcyBhIEdlb0pTT04gRmVhdHVyZUNvbGxlY3Rpb24gc3RyaW5nLCB0aHJvdWdoIHRoZSB3b3JraW5nIHNldDogYGV4Y2x1ZGVgZFxuICAgKiBmZWF0dXJlcyAodGFrZW4gZm9yIGVkaXRpbmcsIG9yIGRlbGV0ZWQpIGxlZnQgb3V0LCBgZXh0cmFgIGZlYXR1cmVzIGFwcGVuZGVkLlxuICAgKi9cbiAgZXhwb3J0R2VvSnNvbihleGNsdWRlOiByZWFkb25seSBzdHJpbmdbXSwgZXh0cmE6IHJlYWRvbmx5IG9iamVjdFtdKTogUHJvbWlzZTxzdHJpbmc+O1xuICAvKiogUmVsZWFzZSB0aGUgc291cmNlIChpdHMgd29ya2VyIHRhYmxlLCBpdHMgY2FjaGUpLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKiBXaGF0IHRoZSBzdG9yZSBzaG93cyBvZiB0aGUgY3VycmVudCBzbGljZSdzIHJlZ2lvbiBzb3VyY2U6IHdoYXQgYSBzb3VyY2UgbGF5ZXIgZHJhd3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lvblNvdXJjZVZpZXcge1xuICBzb3VyY2U6IFJlZ2lvblNvdXJjZTtcbiAgLyoqIFRoZSBzb3VyY2UgcGxhbmUgdGhlIHNsaWNlIHNob3dzLiAqL1xuICBwbGFuZTogbnVtYmVyO1xuICAvKiogSWRzIHRoZSBzb3VyY2Ugbm8gbG9uZ2VyIGRyYXdzOiB0YWtlbiBpbnRvIHRoZSB3b3JraW5nIHNldCwgb3IgZGVsZXRlZC4gKi9cbiAgdGFrZW46IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIC8qKiBUaGUgY29sb3VyIGEgZmVhdHVyZSBpcyBkcmF3biBpbiAoaXRzIGNsYXNzIGNvbG91ciwgYXMgYSByZWdpb24gb2YgdGhhdCBjbGFzcyBnZXRzKS4gKi9cbiAgY29sb3JPZihmZWF0dXJlOiBQaWNrPFRpbGVGZWF0dXJlLCAnbGFiZWwnIHwgJ2NvbG9yJz4pOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVnaW9uIGxvb2ssIHRoZSByZWdpb25zJyBvd24gKHNvIGEgZmVhdHVyZSBsb29rcyB0aGUgc2FtZSBvbmNlIHRha2VuKS4gKi9cbiAgc3R5bGU6IFJlZ2lvblN0eWxlO1xuICAvKiogV2hldGhlciBjbGFzcyBsYWJlbHMgYXJlIHNob3duLiAqL1xuICBsYWJlbHM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgY2xhc3MncyBmZWF0dXJlcyBhcmUgaGlkZGVuIChzZWUgYFJlZ2lvblN0b3JlLnNldENsYXNzZXNIaWRkZW5gKTsgZGVmYXVsdDogbm9uZSBpcy4gKi9cbiAgaXNIaWRkZW4/KGxhYmVsOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBST0kgR2VvSlNPTiBhdCBsZWFzdCB0aGlzIG1hbnkgY2hhcmFjdGVycyBsb25nIGxvYWRzIGFzIGEgdGlsZWQgcmVnaW9uIHNvdXJjZSByYXRoZXIgdGhhbiBhc1xuICogcmVnaW9ucyAoc2VlIGBWaXpDb25maWcucmVnaW9uU291cmNlTWluQ2hhcnNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9TT1VSQ0VfTUlOX0NIQVJTID0gMV8wMDBfMDAwO1xuXG4vKiogVGlsZXMgYSBzb3VyY2Uga2VlcHMsIG1vc3QgcmVjZW50bHkgdXNlZCBsYXN0LiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9USUxFX0NBQ0hFX1NJWkUgPSAzODQ7XG5cbi8qKiBBIGxlYXN0LXJlY2VudGx5LXVzZWQgY2FjaGUgb2YgdGlsZSByZXF1ZXN0cy4gQSByZXF1ZXN0IHRoYXQgZmFpbHMgaXMgZm9yZ290dGVuLiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lvblRpbGVDYWNoZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGlsZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxSZWdpb25UaWxlPj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxpbWl0ID0gUkVHSU9OX1RJTEVfQ0FDSEVfU0laRSkge31cblxuICAvKiogVGhlIGNhY2hlZCB0aWxlLCBlbHNlIGBsb2FkKClgJ3MsIGNhY2hlZC4gKi9cbiAgZ2V0KHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBsb2FkOiAoKSA9PiBQcm9taXNlPFJlZ2lvblRpbGU+KTogUHJvbWlzZTxSZWdpb25UaWxlPiB7XG4gICAgY29uc3QgaWQgPSBgJHt6fS8ke2tleS5sZXZlbH0vJHtrZXkuZ3h9LyR7a2V5Lmd5fWA7XG4gICAgY29uc3QgaGl0ID0gdGhpcy50aWxlcy5nZXQoaWQpO1xuICAgIGlmIChoaXQpIHtcbiAgICAgIHRoaXMudGlsZXMuZGVsZXRlKGlkKTtcbiAgICAgIHRoaXMudGlsZXMuc2V0KGlkLCBoaXQpO1xuICAgICAgcmV0dXJuIGhpdDtcbiAgICB9XG4gICAgY29uc3QgdGlsZSA9IGxvYWQoKTtcbiAgICB0aGlzLnRpbGVzLnNldChpZCwgdGlsZSk7XG4gICAgdGlsZS5jYXRjaCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50aWxlcy5nZXQoaWQpID09PSB0aWxlKSB0aGlzLnRpbGVzLmRlbGV0ZShpZCk7XG4gICAgfSk7XG4gICAgd2hpbGUgKHRoaXMudGlsZXMuc2l6ZSA+IHRoaXMubGltaXQpIHRoaXMudGlsZXMuZGVsZXRlKHRoaXMudGlsZXMua2V5cygpLm5leHQoKS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgIHJldHVybiB0aWxlO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy50aWxlcy5jbGVhcigpO1xuICB9XG59XG5cbi8qKiBBbiBgQWJvcnRFcnJvcmAsIGFzIGBmZXRjaGAgYW5kIHRoZSB3b3JrZXJzIHJlamVjdCB3aXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFib3J0RXJyb3IoKTogRXJyb3Ige1xuICBpZiAodHlwZW9mIERPTUV4Y2VwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBuZXcgRE9NRXhjZXB0aW9uKCdUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpO1xuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ1RoZSByZXF1ZXN0IHdhcyBhYm9ydGVkLicpO1xuICBlcnIubmFtZSA9ICdBYm9ydEVycm9yJztcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqIFRydWUgZm9yIHRoZSByZWplY3Rpb24gb2YgYW4gYWJvcnRlZCByZXF1ZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnRFcnJvcihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChlcnIgYXMgeyBuYW1lPzogc3RyaW5nIH0gfCBudWxsKT8ubmFtZSA9PT0gJ0Fib3J0RXJyb3InO1xufVxuXG4vKiogYHByb21pc2VgLCByZWplY3RlZCB3aXRoIGFuIGBBYm9ydEVycm9yYCBhcyBzb29uIGFzIGBzaWduYWxgIGZpcmVzICh0aGUgd29yayBnb2VzIG9uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhYm9ydGFibGU8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFQ+IHtcbiAgaWYgKCFzaWduYWwpIHJldHVybiBwcm9taXNlO1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybiBQcm9taXNlLnJlamVjdChhYm9ydEVycm9yKCkpO1xuICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiByZWplY3QoYWJvcnRFcnJvcigpKTtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgcHJvbWlzZS50aGVuKFxuICAgICAgKHYpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgIHJlc29sdmUodik7XG4gICAgICB9LFxuICAgICAgKGUpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG4iXX0=
|