@jax-data-science/sci-image-visualizer 0.10.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.
Files changed (41) hide show
  1. package/esm2022/index.mjs +4 -1
  2. package/esm2022/lib/contracts/ports/region-io.port.mjs +1 -1
  3. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  4. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
  5. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
  6. package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
  7. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
  8. package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
  9. package/esm2022/lib/region-editor/region-editor.component.mjs +147 -4
  10. package/esm2022/lib/region-editor/region-persistence.service.mjs +9 -1
  11. package/esm2022/lib/region-import/label-classes.mjs +149 -0
  12. package/esm2022/lib/region-import/label-volume.mjs +194 -0
  13. package/esm2022/lib/region-import/region-import.mjs +71 -0
  14. package/esm2022/lib/routing-visualizer.service.mjs +93 -1
  15. package/esm2022/lib/store/region-source-scope.mjs +19 -4
  16. package/esm2022/lib/store/region-store.service.mjs +64 -14
  17. package/esm2022/lib/visualizer.component.mjs +28 -2
  18. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs} +1049 -188
  19. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +1 -0
  20. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs} +2 -2
  21. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map} +1 -1
  22. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  23. package/index.d.ts +6 -0
  24. package/lib/contracts/ports/region-io.port.d.ts +24 -0
  25. package/lib/contracts/region-editor-api.contract.d.ts +19 -1
  26. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
  27. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
  28. package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
  29. package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
  30. package/lib/implementations/osd/slice-cache.d.ts +13 -3
  31. package/lib/region-editor/region-editor.component.d.ts +26 -0
  32. package/lib/region-editor/region-persistence.service.d.ts +5 -1
  33. package/lib/region-import/label-classes.d.ts +39 -0
  34. package/lib/region-import/label-volume.d.ts +31 -0
  35. package/lib/region-import/region-import.d.ts +46 -0
  36. package/lib/routing-visualizer.service.d.ts +30 -0
  37. package/lib/store/region-source-scope.d.ts +8 -2
  38. package/lib/store/region-store.service.d.ts +15 -5
  39. package/lib/visualizer.component.d.ts +9 -0
  40. package/package.json +1 -1
  41. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +0 -1
@@ -131,6 +131,14 @@ export class RegionPersistenceService {
131
131
  }
132
132
  return out;
133
133
  }
134
+ /** Whether the host can pick regions on its server (see RegionIoPort.pickServerRegions). */
135
+ canPickServerRegions() {
136
+ return typeof this.io.pickServerRegions === 'function';
137
+ }
138
+ /** Let the user pick regions on the host's server; null when cancelled or unsupported. */
139
+ pickServerRegions() {
140
+ return this.io.pickServerRegions?.() ?? of(null);
141
+ }
134
142
  /** Write per-slice geojsons through the host port. */
135
143
  saveSlices(slices) {
136
144
  return this.io.saveSliceGeoJsons(slices);
@@ -157,4 +165,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
157
165
  type: Inject,
158
166
  args: [REGION_IO_PORT]
159
167
  }] }] });
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXBlcnNpc3RlbmNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLXBlcnNpc3RlbmNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFnQixFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM5RixPQUFPLEVBQUUsY0FBYyxFQUFnQixNQUFNLG1DQUFtQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBUXZDOzs7Ozs7R0FNRztBQUVILE1BQU0sT0FBTyx3QkFBd0I7SUFDbkMsWUFDOEMsR0FBcUIsRUFDeEIsRUFBZ0I7UUFEYixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUN4QixPQUFFLEdBQUYsRUFBRSxDQUFjO0lBQ3hELENBQUM7SUFFSiw4Q0FBOEM7SUFDOUMsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixlQUFlO1FBQ2IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUs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VUFBVSxDQUFDLE1BQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7bURBQytDO0lBQy9DLGNBQWMsQ0FBQyxLQUFZLEVBQUUsTUFBOEI7UUFDekQsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLE1BQTJCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQWdCLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7OEdBbkpVLHdCQUF3QixrQkFFekIsaUJBQWlCLGFBQ2pCLGNBQWM7a0hBSGIsd0JBQXdCOzsyRkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVOzswQkFHTixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyB3aXRoUmVnaW9uWiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24tY2xvbmUnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRvckFwaSwgUkVHSU9OX0VESVRPUl9BUEkgfSBmcm9tICcuLi9jb250cmFjdHMvcmVnaW9uLWVkaXRvci1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgUkVHSU9OX0lPX1BPUlQsIFJlZ2lvbklvUG9ydCB9IGZyb20gJy4uL2NvbnRyYWN0cy9wb3J0cy9yZWdpb24taW8ucG9ydCc7XG5pbXBvcnQgeyBmaWxlU3RlbSB9IGZyb20gJy4vZmlsZS1zdGVtJztcblxuLyoqIE9uZSBzbGljZS1maWxlJ3Mgc2VyaWFsaXplZCByZWdpb25zIChmb2xkZXIgc3RhY2ssIGppdC11aSM5MykuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlR2VvSnNvbiB7XG4gIHo6IG51bWJlcjtcbiAgZ2VvSnNvblN0cjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZ2lvbiBmaWxlIEkvTyBmb3IgdGhlIFJlZ2lvbiBFZGl0b3I6IGRlZmF1bHQgZmlsZSBuYW1lcywgR2VvSlNPTiBkb3dubG9hZFxuICogKGV4cG9ydCksIHNhdmUgdG8gdGhlIGhvc3QgdGhyb3VnaCB7QGxpbmsgUmVnaW9uSW9Qb3J0fSAod2l0aCBhIGRlYm91bmNlZFxuICogXCJmaWxlIGV4aXN0c1wiIGNoZWNrKSwgcGVyLXNsaWNlIHNhdmVzIGZvciBmb2xkZXIgc3RhY2tzLCBhbmQgcmVhZGluZyBhblxuICogaW1wb3J0ZWQgZmlsZS4gUHJvdmlkZWQgYnkgdGhlIGVkaXRvcjsgaXQgaG9sZHMgbm8gc3RhdGUg4oCUIHRoZSBlZGl0b3Igb3duc1xuICogdGhlIGRpYWxvZ3MsIHRoZSB0b2FzdHMgYW5kIHRoZSBydW5uaW5nIGpvYnMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZWdpb25QZXJzaXN0ZW5jZVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFJFR0lPTl9FRElUT1JfQVBJKSBwcml2YXRlIHJlYWRvbmx5IGFwaTogSVJlZ2lvbkVkaXRvckFwaSxcbiAgICBASW5qZWN0KFJFR0lPTl9JT19QT1JUKSBwcml2YXRlIHJlYWRvbmx5IGlvOiBSZWdpb25Jb1BvcnQsXG4gICkge31cblxuICAvKiogVGhlIHNlbGVjdGVkIGltYWdlJ3MgZmlsZSBuYW1lLCBpZiBhbnkuICovXG4gIHNlbGVjdGVkRmlsZU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5pby5nZXRTZWxlY3RlZEZpbGVOYW1lKCk7XG4gIH1cblxuICAvKiogYDxpbWFnZS1zdGVtPi5nZW9qc29uYCBmb3IgYSBzZXJ2ZXIgc2F2ZTsgdW5kZWZpbmVkIHdpdGggbm8gaW1hZ2Ugc2VsZWN0ZWQuICovXG4gIGRlZmF1bHRTYXZlTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmlvLmdldFNlbGVjdGVkRmlsZU5hbWUoKTtcbiAgICByZXR1cm4gbmFtZSA/IGAke2ZpbGVTdGVtKG5hbWUsIG5hbWUpfS5nZW9qc29uYCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBgPGltYWdlLXN0ZW0+Lmdlb2pzb25gIChvciBgcm9pcy5nZW9qc29uYCkgZm9yIGEgZG93bmxvYWQuICovXG4gIGRlZmF1bHRFeHBvcnROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2ZpbGVTdGVtKHRoaXMuaW8uZ2V0U2VsZWN0ZWRGaWxlTmFtZSgpLCAncm9pcycpfS5nZW9qc29uYDtcbiAgfVxuXG4gIC8qKiBgPGltYWdlLXN0ZW0+X21hc2sucG5nYCAob3IgYHJlZ2lvbnNfbWFzay5wbmdgKSBmb3IgYSBtYXNrIGRvd25sb2FkLiAqL1xuICBkZWZhdWx0TWFza05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7ZmlsZVN0ZW0odGhpcy5pby5nZXRTZWxlY3RlZEZpbGVOYW1lKCksICdyZWdpb25zJyl9X21hc2sucG5nYDtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYSBzYXZlIHdyaXRlcyBvbmUgZ2VvanNvbiBwZXIgc2xpY2UtZmlsZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpLiAqL1xuICBzYXZlc1BlclNsaWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFwaS5pc1N0YWNrTW9kZSgpICYmIHRoaXMuYXBpLmdldFN0YWNrU2F2ZUxheW91dCgpID09PSAncGVyLXNsaWNlLWZpbGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbnMgdG8gc2VyaWFsaXplIG9uIHNhdmUvZXhwb3J0LiBGb3IgYSBzaW5nbGUtZmlsZSB6LXN0YWNrIHRoZSBzdG9yZVxuICAgKiBrZWVwcyBvbmx5IHRoZSBjdXJyZW50IHNsaWNlIGxpdmUsIHNvIHRha2UgRVZFUlkgc2xpY2UncyBhbm5vdGF0aW9ucyAoZWFjaFxuICAgKiB0YWdnZWQgd2l0aCBpdHMgemVyby1iYXNlZCBSZWdpb24ueikgZm9yIG9uZSBjb21iaW5lZCB6LWluZGV4ZWQgZ2VvanNvblxuICAgKiAoaml0LXVpIzkzKTsgb3RoZXJ3aXNlIGBsaXZlYCAoc2luZ2xlIHBsYW5lLCBvciBhIGZvbGRlciBzdGFjayB3aG9zZSBzbGljZXNcbiAgICogc2F2ZSB0byB0aGVpciBvd24gZmlsZXMpLlxuICAgKi9cbiAgcmVnaW9uc0ZvclNhdmUobGl2ZTogUmVnaW9uW10pOiBSZWdpb25bXSB7XG4gICAgaWYgKHRoaXMuYXBpLmlzU3RhY2tNb2RlKCkgJiYgdGhpcy5hcGkuZ2V0U3RhY2tTYXZlTGF5b3V0KCkgPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwaS5nZXRTbGljZUFubm90YXRpb25SZWdpb25zKCk7XG4gICAgfVxuICAgIHJldHVybiBsaXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZWFjaCBmaWxlIG5hbWUgaW4gYG5hbWVzYCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgaG9zdCwgZGVib3VuY2VkXG4gICAqIDQwMCBtczsgYSBuZXdlciBuYW1lIHN1cGVyc2VkZXMgYW4gaW4tZmxpZ2h0IGNoZWNrLiBBIGZhaWxlZCBjaGVjayByZWFkcyBhc1xuICAgKiBcImRvZXMgbm90IGV4aXN0XCIgYW5kIGxhdGVyIGNoZWNrcyBrZWVwIHdvcmtpbmcuXG4gICAqL1xuICBmaWxlRXhpc3RzKG5hbWVzOiBPYnNlcnZhYmxlPHN0cmluZz4pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmFtZXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSg0MDApLFxuICAgICAgc3dpdGNoTWFwKChuYW1lKSA9PiB0aGlzLmlvLnJvaUZpbGVFeGlzdHMobmFtZSkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKGZhbHNlKSkpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGByZWdpb25zYCBhcyBHZW9KU09OLCBtZXJnZWQgd2l0aCB0aGUgaW1hZ2UncyByZWdpb24gc291cmNlIHdoZW4gaXQgaGFzIG9uZSAodGhlIHNvdXJjZSdzXG4gICAqIGZlYXR1cmVzIHRoYXQgd2VyZSBub3QgdGFrZW4gb3IgZGVsZXRlZCwgdGhlbiBgcmVnaW9uc2ApOyBgc2xpY2VgIG5hbWVzIGEgZm9sZGVyIHN0YWNrJ3NcbiAgICogc2xpY2UuXG4gICAqL1xuICBzZXJpYWxpemUocmVnaW9uczogUmVnaW9uW10sIHNsaWNlPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBtZXJnZWQgPSB0aGlzLmFwaS5nZXRHZW9Kc29uU3RyaW5nV2l0aFNvdXJjZT8uKHJlZ2lvbnMsIHNsaWNlKTtcbiAgICBpZiAobWVyZ2VkKSByZXR1cm4gbWVyZ2VkO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYXBpLmdldEdlb0pzb25TdHJpbmcocmVnaW9ucykpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIERvd25sb2FkIGByZWdpb25zYCAod2l0aCB0aGUgcmVnaW9uIHNvdXJjZSBiZWhpbmQgdGhlbSkgYXMgYSBHZW9KU09OIGZpbGUgbmFtZWQgYGZpbGVuYW1lYC4gKi9cbiAgYXN5bmMgZG93bmxvYWQocmVnaW9uczogUmVnaW9uW10sIGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2F3YWl0IHRoaXMuc2VyaWFsaXplKHJlZ2lvbnMpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGByZWdpb25zKClgIHRvIHRoZSBob3N0IGFzIGBmaWxlbmFtZWAuIFNlcmlhbGl6aW5nIGlzIGRlZmVycmVkIG9uZVxuICAgKiB0aWNrIChzbyBhIHByb2dyZXNzIGluZGljYXRvciBwYWludHMgYmVmb3JlIGEgbGFyZ2Ugc3luY2hyb25vdXNcbiAgICogc2VyaWFsaXplKTsgdW5zdWJzY3JpYmluZyBiZWZvcmUgdGhlbiBjYW5jZWxzIHRoZSBzYXZlIGVudGlyZWx5LCBhbmQgYWZ0ZXJcbiAgICogaXQgY2FuY2VscyB0aGUgdXBsb2FkLiBBIHNlcmlhbGl6ZSBmYWlsdXJlIGlzIGFuIGVycm9yLCBsaWtlIGFuIHVwbG9hZCBvbmUuXG4gICAqL1xuICBzYXZlKHJlZ2lvbnM6ICgpID0+IFJlZ2lvbltdLCBmaWxlbmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHZvaWQ+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBsZXQgdXBsb2FkOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgc2VyaWFsaXplZDogUHJvbWlzZTxzdHJpbmc+O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZShyZWdpb25zKCkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlcmlhbGl6ZWQudGhlbihcbiAgICAgICAgICAoZ2VvSnNvblN0cikgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYW5jZWxsZWQpIHVwbG9hZCA9IHRoaXMuaW8uc2F2ZUdlb0pzb24oZ2VvSnNvblN0ciwgZmlsZW5hbWUpLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdXBsb2FkPy51bnN1YnNjcmliZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZvbGRlciBzdGFjaydzIHJlZ2lvbnMgYXMgb25lIGdlb2pzb24gcGVyIHNsaWNlLWZpbGUgKGppdC11aSM5MyksIGVhY2hcbiAgICogc2VyaWFsaXplZCBvbiB0aGUgZGVmYXVsdCBwbGFuZSAoej0wKTogZXZlcnkgc2xpY2UtZmlsZSBpcyBvbmUgcGxhbmUsIGFuZFxuICAgKiB0aGUgbG9hZGVyIHJlLWRlcml2ZXMgdGhlIHNsaWNlIGluZGV4IGZyb20gdGhlIGZpbGUncyBwb3NpdGlvbi4gU2xpY2VzXG4gICAqIGNsZWFyZWQgc2luY2UgbG9hZCBhcmUgaW5jbHVkZWQgKGVtcHR5KSBzbyB0aGVpciBmaWxlIGlzIG92ZXJ3cml0dGVuLCBhbmQgc28gYXJlIHNsaWNlc1xuICAgKiB3aG9zZSByZWdpb24gc291cmNlIGxvc3QgZmVhdHVyZXM7IGEgc2xpY2Ugd2l0aCBhIHJlZ2lvbiBzb3VyY2Uga2VlcHMgdGhlIGZlYXR1cmVzIHN0aWxsXG4gICAqIGluIGl0LlxuICAgKi9cbiAgYXN5bmMgc2xpY2VHZW9Kc29ucygpOiBQcm9taXNlPFNsaWNlR2VvSnNvbltdPiB7XG4gICAgY29uc3Qgb3V0OiBTbGljZUdlb0pzb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMuYXBpLmdldFN0YWNrU2F2ZUFubm90YXRpb25TbGljZXMoKSkge1xuICAgICAgb3V0LnB1c2goe1xuICAgICAgICB6LFxuICAgICAgICBnZW9Kc29uU3RyOiBhd2FpdCB0aGlzLnNlcmlhbGl6ZShcbiAgICAgICAgICByZWdzLm1hcCgocikgPT4gd2l0aFJlZ2lvbloociwgMCkpLFxuICAgICAgICAgIHosXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBXcml0ZSBwZXItc2xpY2UgZ2VvanNvbnMgdGhyb3VnaCB0aGUgaG9zdCBwb3J0LiAqL1xuICBzYXZlU2xpY2VzKHNsaWNlczogU2xpY2VHZW9Kc29uW10pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5pby5zYXZlU2xpY2VHZW9Kc29ucyhzbGljZXMpO1xuICB9XG5cbiAgLyoqIFJlYWQgdGhlIGZpbGUgY2hvc2VuIGluIGEgZmlsZSBpbnB1dCdzIGNoYW5nZSBldmVudCBhcyB0ZXh0LCB0aGVuIGNhbGxcbiAgICogIGBvblRleHRgLiBOby1vcCB3aGVuIG5vIGZpbGUgd2FzIGNob3Nlbi4gKi9cbiAgcmVhZENob3NlbkZpbGUoZXZlbnQ6IEV2ZW50LCBvblRleHQ6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcz8uWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IG9uVGV4dChyZWFkZXIucmVzdWx0IGFzIHN0cmluZyk7XG4gICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gIH1cbn1cbiJdfQ==
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXBlcnNpc3RlbmNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLXBlcnNpc3RlbmNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFnQixFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM5RixPQUFPLEVBQUUsY0FBYyxFQUFrQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBUXZDOzs7Ozs7R0FNRztBQUVILE1BQU0sT0FBTyx3QkFBd0I7SUFDbkMsWUFDOEMsR0FBcUIsRUFDeEIsRUFBZ0I7UUFEYixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUN4QixPQUFFLEdBQUYsRUFBRSxDQUFjO0lBQ3hELENBQUM7SUFFSiw4Q0FBOEM7SUFDOUMsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixlQUFlO1FBQ2IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUs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b0JBQW9CO1FBQ2xCLE9BQU8sT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixLQUFLLFVBQVUsQ0FBQztJQUN6RCxDQUFDO0lBRUQsMEZBQTBGO0lBQzFGLGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsVUFBVSxDQUFDLE1BQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7bURBQytDO0lBQy9DLGNBQWMsQ0FBQyxLQUFZLEVBQUUsTUFBOEI7UUFDekQsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLE1BQTJCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQWdCLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7OEdBN0pVLHdCQUF3QixrQkFFekIsaUJBQWlCLGFBQ2pCLGNBQWM7a0hBSGIsd0JBQXdCOzsyRkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVOzswQkFHTixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyB3aXRoUmVnaW9uWiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24tY2xvbmUnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRvckFwaSwgUkVHSU9OX0VESVRPUl9BUEkgfSBmcm9tICcuLi9jb250cmFjdHMvcmVnaW9uLWVkaXRvci1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgUkVHSU9OX0lPX1BPUlQsIFJlZ2lvbklvUG9ydCwgU2VydmVyUmVnaW9uUGljayB9IGZyb20gJy4uL2NvbnRyYWN0cy9wb3J0cy9yZWdpb24taW8ucG9ydCc7XG5pbXBvcnQgeyBmaWxlU3RlbSB9IGZyb20gJy4vZmlsZS1zdGVtJztcblxuLyoqIE9uZSBzbGljZS1maWxlJ3Mgc2VyaWFsaXplZCByZWdpb25zIChmb2xkZXIgc3RhY2ssIGppdC11aSM5MykuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlR2VvSnNvbiB7XG4gIHo6IG51bWJlcjtcbiAgZ2VvSnNvblN0cjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZ2lvbiBmaWxlIEkvTyBmb3IgdGhlIFJlZ2lvbiBFZGl0b3I6IGRlZmF1bHQgZmlsZSBuYW1lcywgR2VvSlNPTiBkb3dubG9hZFxuICogKGV4cG9ydCksIHNhdmUgdG8gdGhlIGhvc3QgdGhyb3VnaCB7QGxpbmsgUmVnaW9uSW9Qb3J0fSAod2l0aCBhIGRlYm91bmNlZFxuICogXCJmaWxlIGV4aXN0c1wiIGNoZWNrKSwgcGVyLXNsaWNlIHNhdmVzIGZvciBmb2xkZXIgc3RhY2tzLCBhbmQgcmVhZGluZyBhblxuICogaW1wb3J0ZWQgZmlsZS4gUHJvdmlkZWQgYnkgdGhlIGVkaXRvcjsgaXQgaG9sZHMgbm8gc3RhdGUg4oCUIHRoZSBlZGl0b3Igb3duc1xuICogdGhlIGRpYWxvZ3MsIHRoZSB0b2FzdHMgYW5kIHRoZSBydW5uaW5nIGpvYnMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZWdpb25QZXJzaXN0ZW5jZVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFJFR0lPTl9FRElUT1JfQVBJKSBwcml2YXRlIHJlYWRvbmx5IGFwaTogSVJlZ2lvbkVkaXRvckFwaSxcbiAgICBASW5qZWN0KFJFR0lPTl9JT19QT1JUKSBwcml2YXRlIHJlYWRvbmx5IGlvOiBSZWdpb25Jb1BvcnQsXG4gICkge31cblxuICAvKiogVGhlIHNlbGVjdGVkIGltYWdlJ3MgZmlsZSBuYW1lLCBpZiBhbnkuICovXG4gIHNlbGVjdGVkRmlsZU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5pby5nZXRTZWxlY3RlZEZpbGVOYW1lKCk7XG4gIH1cblxuICAvKiogYDxpbWFnZS1zdGVtPi5nZW9qc29uYCBmb3IgYSBzZXJ2ZXIgc2F2ZTsgdW5kZWZpbmVkIHdpdGggbm8gaW1hZ2Ugc2VsZWN0ZWQuICovXG4gIGRlZmF1bHRTYXZlTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmlvLmdldFNlbGVjdGVkRmlsZU5hbWUoKTtcbiAgICByZXR1cm4gbmFtZSA/IGAke2ZpbGVTdGVtKG5hbWUsIG5hbWUpfS5nZW9qc29uYCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBgPGltYWdlLXN0ZW0+Lmdlb2pzb25gIChvciBgcm9pcy5nZW9qc29uYCkgZm9yIGEgZG93bmxvYWQuICovXG4gIGRlZmF1bHRFeHBvcnROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2ZpbGVTdGVtKHRoaXMuaW8uZ2V0U2VsZWN0ZWRGaWxlTmFtZSgpLCAncm9pcycpfS5nZW9qc29uYDtcbiAgfVxuXG4gIC8qKiBgPGltYWdlLXN0ZW0+X21hc2sucG5nYCAob3IgYHJlZ2lvbnNfbWFzay5wbmdgKSBmb3IgYSBtYXNrIGRvd25sb2FkLiAqL1xuICBkZWZhdWx0TWFza05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7ZmlsZVN0ZW0odGhpcy5pby5nZXRTZWxlY3RlZEZpbGVOYW1lKCksICdyZWdpb25zJyl9X21hc2sucG5nYDtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYSBzYXZlIHdyaXRlcyBvbmUgZ2VvanNvbiBwZXIgc2xpY2UtZmlsZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpLiAqL1xuICBzYXZlc1BlclNsaWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFwaS5pc1N0YWNrTW9kZSgpICYmIHRoaXMuYXBpLmdldFN0YWNrU2F2ZUxheW91dCgpID09PSAncGVyLXNsaWNlLWZpbGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbnMgdG8gc2VyaWFsaXplIG9uIHNhdmUvZXhwb3J0LiBGb3IgYSBzaW5nbGUtZmlsZSB6LXN0YWNrIHRoZSBzdG9yZVxuICAgKiBrZWVwcyBvbmx5IHRoZSBjdXJyZW50IHNsaWNlIGxpdmUsIHNvIHRha2UgRVZFUlkgc2xpY2UncyBhbm5vdGF0aW9ucyAoZWFjaFxuICAgKiB0YWdnZWQgd2l0aCBpdHMgemVyby1iYXNlZCBSZWdpb24ueikgZm9yIG9uZSBjb21iaW5lZCB6LWluZGV4ZWQgZ2VvanNvblxuICAgKiAoaml0LXVpIzkzKTsgb3RoZXJ3aXNlIGBsaXZlYCAoc2luZ2xlIHBsYW5lLCBvciBhIGZvbGRlciBzdGFjayB3aG9zZSBzbGljZXNcbiAgICogc2F2ZSB0byB0aGVpciBvd24gZmlsZXMpLlxuICAgKi9cbiAgcmVnaW9uc0ZvclNhdmUobGl2ZTogUmVnaW9uW10pOiBSZWdpb25bXSB7XG4gICAgaWYgKHRoaXMuYXBpLmlzU3RhY2tNb2RlKCkgJiYgdGhpcy5hcGkuZ2V0U3RhY2tTYXZlTGF5b3V0KCkgPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwaS5nZXRTbGljZUFubm90YXRpb25SZWdpb25zKCk7XG4gICAgfVxuICAgIHJldHVybiBsaXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZWFjaCBmaWxlIG5hbWUgaW4gYG5hbWVzYCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgaG9zdCwgZGVib3VuY2VkXG4gICAqIDQwMCBtczsgYSBuZXdlciBuYW1lIHN1cGVyc2VkZXMgYW4gaW4tZmxpZ2h0IGNoZWNrLiBBIGZhaWxlZCBjaGVjayByZWFkcyBhc1xuICAgKiBcImRvZXMgbm90IGV4aXN0XCIgYW5kIGxhdGVyIGNoZWNrcyBrZWVwIHdvcmtpbmcuXG4gICAqL1xuICBmaWxlRXhpc3RzKG5hbWVzOiBPYnNlcnZhYmxlPHN0cmluZz4pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmFtZXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSg0MDApLFxuICAgICAgc3dpdGNoTWFwKChuYW1lKSA9PiB0aGlzLmlvLnJvaUZpbGVFeGlzdHMobmFtZSkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKGZhbHNlKSkpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGByZWdpb25zYCBhcyBHZW9KU09OLCBtZXJnZWQgd2l0aCB0aGUgaW1hZ2UncyByZWdpb24gc291cmNlIHdoZW4gaXQgaGFzIG9uZSAodGhlIHNvdXJjZSdzXG4gICAqIGZlYXR1cmVzIHRoYXQgd2VyZSBub3QgdGFrZW4gb3IgZGVsZXRlZCwgdGhlbiBgcmVnaW9uc2ApOyBgc2xpY2VgIG5hbWVzIGEgZm9sZGVyIHN0YWNrJ3NcbiAgICogc2xpY2UuXG4gICAqL1xuICBzZXJpYWxpemUocmVnaW9uczogUmVnaW9uW10sIHNsaWNlPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBtZXJnZWQgPSB0aGlzLmFwaS5nZXRHZW9Kc29uU3RyaW5nV2l0aFNvdXJjZT8uKHJlZ2lvbnMsIHNsaWNlKTtcbiAgICBpZiAobWVyZ2VkKSByZXR1cm4gbWVyZ2VkO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYXBpLmdldEdlb0pzb25TdHJpbmcocmVnaW9ucykpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIERvd25sb2FkIGByZWdpb25zYCAod2l0aCB0aGUgcmVnaW9uIHNvdXJjZSBiZWhpbmQgdGhlbSkgYXMgYSBHZW9KU09OIGZpbGUgbmFtZWQgYGZpbGVuYW1lYC4gKi9cbiAgYXN5bmMgZG93bmxvYWQocmVnaW9uczogUmVnaW9uW10sIGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2F3YWl0IHRoaXMuc2VyaWFsaXplKHJlZ2lvbnMpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGByZWdpb25zKClgIHRvIHRoZSBob3N0IGFzIGBmaWxlbmFtZWAuIFNlcmlhbGl6aW5nIGlzIGRlZmVycmVkIG9uZVxuICAgKiB0aWNrIChzbyBhIHByb2dyZXNzIGluZGljYXRvciBwYWludHMgYmVmb3JlIGEgbGFyZ2Ugc3luY2hyb25vdXNcbiAgICogc2VyaWFsaXplKTsgdW5zdWJzY3JpYmluZyBiZWZvcmUgdGhlbiBjYW5jZWxzIHRoZSBzYXZlIGVudGlyZWx5LCBhbmQgYWZ0ZXJcbiAgICogaXQgY2FuY2VscyB0aGUgdXBsb2FkLiBBIHNlcmlhbGl6ZSBmYWlsdXJlIGlzIGFuIGVycm9yLCBsaWtlIGFuIHVwbG9hZCBvbmUuXG4gICAqL1xuICBzYXZlKHJlZ2lvbnM6ICgpID0+IFJlZ2lvbltdLCBmaWxlbmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHZvaWQ+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBsZXQgdXBsb2FkOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgc2VyaWFsaXplZDogUHJvbWlzZTxzdHJpbmc+O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZShyZWdpb25zKCkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlcmlhbGl6ZWQudGhlbihcbiAgICAgICAgICAoZ2VvSnNvblN0cikgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYW5jZWxsZWQpIHVwbG9hZCA9IHRoaXMuaW8uc2F2ZUdlb0pzb24oZ2VvSnNvblN0ciwgZmlsZW5hbWUpLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdXBsb2FkPy51bnN1YnNjcmliZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZvbGRlciBzdGFjaydzIHJlZ2lvbnMgYXMgb25lIGdlb2pzb24gcGVyIHNsaWNlLWZpbGUgKGppdC11aSM5MyksIGVhY2hcbiAgICogc2VyaWFsaXplZCBvbiB0aGUgZGVmYXVsdCBwbGFuZSAoej0wKTogZXZlcnkgc2xpY2UtZmlsZSBpcyBvbmUgcGxhbmUsIGFuZFxuICAgKiB0aGUgbG9hZGVyIHJlLWRlcml2ZXMgdGhlIHNsaWNlIGluZGV4IGZyb20gdGhlIGZpbGUncyBwb3NpdGlvbi4gU2xpY2VzXG4gICAqIGNsZWFyZWQgc2luY2UgbG9hZCBhcmUgaW5jbHVkZWQgKGVtcHR5KSBzbyB0aGVpciBmaWxlIGlzIG92ZXJ3cml0dGVuLCBhbmQgc28gYXJlIHNsaWNlc1xuICAgKiB3aG9zZSByZWdpb24gc291cmNlIGxvc3QgZmVhdHVyZXM7IGEgc2xpY2Ugd2l0aCBhIHJlZ2lvbiBzb3VyY2Uga2VlcHMgdGhlIGZlYXR1cmVzIHN0aWxsXG4gICAqIGluIGl0LlxuICAgKi9cbiAgYXN5bmMgc2xpY2VHZW9Kc29ucygpOiBQcm9taXNlPFNsaWNlR2VvSnNvbltdPiB7XG4gICAgY29uc3Qgb3V0OiBTbGljZUdlb0pzb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMuYXBpLmdldFN0YWNrU2F2ZUFubm90YXRpb25TbGljZXMoKSkge1xuICAgICAgb3V0LnB1c2goe1xuICAgICAgICB6LFxuICAgICAgICBnZW9Kc29uU3RyOiBhd2FpdCB0aGlzLnNlcmlhbGl6ZShcbiAgICAgICAgICByZWdzLm1hcCgocikgPT4gd2l0aFJlZ2lvbloociwgMCkpLFxuICAgICAgICAgIHosXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBob3N0IGNhbiBwaWNrIHJlZ2lvbnMgb24gaXRzIHNlcnZlciAoc2VlIFJlZ2lvbklvUG9ydC5waWNrU2VydmVyUmVnaW9ucykuICovXG4gIGNhblBpY2tTZXJ2ZXJSZWdpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5pby5waWNrU2VydmVyUmVnaW9ucyA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8qKiBMZXQgdGhlIHVzZXIgcGljayByZWdpb25zIG9uIHRoZSBob3N0J3Mgc2VydmVyOyBudWxsIHdoZW4gY2FuY2VsbGVkIG9yIHVuc3VwcG9ydGVkLiAqL1xuICBwaWNrU2VydmVyUmVnaW9ucygpOiBPYnNlcnZhYmxlPFNlcnZlclJlZ2lvblBpY2sgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuaW8ucGlja1NlcnZlclJlZ2lvbnM/LigpID8/IG9mKG51bGwpO1xuICB9XG5cbiAgLyoqIFdyaXRlIHBlci1zbGljZSBnZW9qc29ucyB0aHJvdWdoIHRoZSBob3N0IHBvcnQuICovXG4gIHNhdmVTbGljZXMoc2xpY2VzOiBTbGljZUdlb0pzb25bXSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmlvLnNhdmVTbGljZUdlb0pzb25zKHNsaWNlcyk7XG4gIH1cblxuICAvKiogUmVhZCB0aGUgZmlsZSBjaG9zZW4gaW4gYSBmaWxlIGlucHV0J3MgY2hhbmdlIGV2ZW50IGFzIHRleHQsIHRoZW4gY2FsbFxuICAgKiAgYG9uVGV4dGAuIE5vLW9wIHdoZW4gbm8gZmlsZSB3YXMgY2hvc2VuLiAqL1xuICByZWFkQ2hvc2VuRmlsZShldmVudDogRXZlbnQsIG9uVGV4dDogKHRleHQ6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzPy5bMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4gb25UZXh0KHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,149 @@
1
+ import { traceContours } from 'napari-js/geometry';
2
+ /** The look the Allen atlas region sets carry (see the brain-atlas example's GeoJSON). */
3
+ export const ATLAS_STYLE = {
4
+ fillOpacity: 0.6,
5
+ stroke: '#3c3c3c',
6
+ strokeWidth: 1,
7
+ labels: true,
8
+ highlight: '#a020f0',
9
+ };
10
+ /**
11
+ * The classes of a label volume from `ontology`, a parsed JSON document:
12
+ *
13
+ * - an **Allen structure graph** (`structure_graph_1.json`: `{ msg: [root] }`, or a node or a
14
+ * list of nodes with `id`, `acronym`, `name`, `color_hex_triplet`, `graph_order` and
15
+ * `children`): label = structure id, class = acronym, its tree the ontology's, drawn as the
16
+ * atlas region sets are;
17
+ * - a **region set description** (a `regionset.json`: `classHierarchy`, optional `style`), whose
18
+ * classes name their label as `value` (or `id`), or with a `labels` map of value → class name.
19
+ *
20
+ * Without one (or with another document), each label is its own class `label <value>`.
21
+ */
22
+ export function labelClasses(ontology) {
23
+ const allen = allenRoots(ontology);
24
+ if (allen)
25
+ return allenClasses(allen);
26
+ if (ontology &&
27
+ typeof ontology === 'object' &&
28
+ Array.isArray(ontology.classHierarchy)) {
29
+ return regionSetClasses(ontology);
30
+ }
31
+ return { classOf: unnamed };
32
+ }
33
+ function unnamed(value) {
34
+ return { name: `label ${value}`, color: paletteColor(value) };
35
+ }
36
+ function allenRoots(doc) {
37
+ const isNode = (n) => !!n &&
38
+ typeof n === 'object' &&
39
+ typeof n.id === 'number' &&
40
+ typeof n.acronym === 'string';
41
+ const msg = doc?.msg;
42
+ const roots = Array.isArray(msg) ? msg : Array.isArray(doc) ? doc : doc ? [doc] : [];
43
+ return roots.length && roots.every(isNode) ? roots : null;
44
+ }
45
+ function allenClasses(roots) {
46
+ const byId = new Map();
47
+ const hierarchy = [];
48
+ const walk = (n, parent) => {
49
+ const color = `#${(n.color_hex_triplet || '808080').toUpperCase()}`;
50
+ byId.set(n.id, { name: n.acronym, color, title: n.name });
51
+ hierarchy.push({
52
+ name: n.acronym,
53
+ ...(n.name ? { title: n.name } : {}),
54
+ ...(parent ? { parent } : {}),
55
+ color,
56
+ ...(n.graph_order != null ? { order: n.graph_order } : {}),
57
+ });
58
+ for (const c of n.children ?? [])
59
+ walk(c, n.acronym);
60
+ };
61
+ for (const r of roots)
62
+ walk(r, null);
63
+ hierarchy.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
64
+ return { classOf: (v) => byId.get(v) ?? unnamed(v), hierarchy, style: ATLAS_STYLE };
65
+ }
66
+ function regionSetClasses(doc) {
67
+ const nodes = new Map(doc.classHierarchy.map((n) => [n.name, n]));
68
+ const byValue = new Map();
69
+ for (const n of doc.classHierarchy) {
70
+ const v = typeof n.value === 'number' ? n.value : typeof n.id === 'number' ? n.id : undefined;
71
+ if (v != null)
72
+ byValue.set(v, n.name);
73
+ }
74
+ for (const [v, name] of Object.entries(doc.labels ?? {}))
75
+ byValue.set(Number(v), name);
76
+ const hierarchy = doc.classHierarchy.map(({ name, title, parent, color, order }) => ({
77
+ name,
78
+ ...(title ? { title } : {}),
79
+ ...(parent ? { parent } : {}),
80
+ ...(color ? { color } : {}),
81
+ ...(order != null ? { order } : {}),
82
+ }));
83
+ return {
84
+ classOf: (v) => {
85
+ const name = byValue.get(v);
86
+ const node = name ? nodes.get(name) : undefined;
87
+ return node ? { name: node.name, color: node.color ?? paletteColor(v), title: node.title } : unnamed(v);
88
+ },
89
+ hierarchy,
90
+ ...(doc.style ? { style: doc.style } : {}),
91
+ };
92
+ }
93
+ /** A colour per label value, spread around the hue circle. */
94
+ function paletteColor(value) {
95
+ const hue = (value * 137.508) % 360;
96
+ const [r, g, b] = hsl(hue, 0.65, 0.55);
97
+ return `#${[r, g, b].map((c) => c.toString(16).padStart(2, '0')).join('')}`.toUpperCase();
98
+ }
99
+ function hsl(h, s, l) {
100
+ const k = (n) => (n + h / 30) % 12;
101
+ const a = s * Math.min(l, 1 - l);
102
+ const f = (n) => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));
103
+ return [f(0), f(8), f(4)].map((c) => Math.round(c * 255));
104
+ }
105
+ const rgb = (hex) => [1, 3, 5].map((o) => parseInt(hex.slice(o, o + 2), 16));
106
+ /**
107
+ * Slice `z` of `volume` as a GeoJSON FeatureCollection string: one feature per label on the
108
+ * slice, its every piece (with holes) traced along pixel edges, in image pixels with y down;
109
+ * classified by `classes`, which also give the collection its class tree and style.
110
+ */
111
+ export function labelSliceGeoJson(volume, z, classes) {
112
+ const labels = volume.sliceLabels(z);
113
+ const byLabel = new Map();
114
+ for (const c of traceContours({ data: labels, width: volume.width, height: volume.height })) {
115
+ const polygons = byLabel.get(c.value) ?? [];
116
+ polygons.push([ring(c.outer), ...c.holes.map(ring)]);
117
+ byLabel.set(c.value, polygons);
118
+ }
119
+ const features = [...byLabel].map(([value, polygons]) => {
120
+ const cls = classes.classOf(value);
121
+ return {
122
+ type: 'Feature',
123
+ id: String(value),
124
+ geometry: { type: 'MultiPolygon', coordinates: polygons },
125
+ properties: {
126
+ objectType: 'annotation',
127
+ name: cls.title ?? cls.name,
128
+ classification: { name: cls.name, color: rgb(cls.color) },
129
+ labelValue: value,
130
+ },
131
+ };
132
+ });
133
+ return JSON.stringify({
134
+ type: 'FeatureCollection',
135
+ ...(classes.hierarchy ? { classHierarchy: classes.hierarchy } : {}),
136
+ ...(classes.style ? { style: classes.style } : {}),
137
+ features,
138
+ });
139
+ }
140
+ /** A closed GeoJSON ring from a flat `[x0, y0, …]` one. */
141
+ function ring(flat) {
142
+ const pts = [];
143
+ for (let i = 0; i < flat.length; i += 2)
144
+ pts.push([flat[i], flat[i + 1]]);
145
+ if (pts.length)
146
+ pts.push([...pts[0]]);
147
+ return pts;
148
+ }
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwtY2xhc3Nlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWltcG9ydC9sYWJlbC1jbGFzc2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWtCbkQsMEZBQTBGO0FBQzFGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBc0I7SUFDNUMsV0FBVyxFQUFFLEdBQUc7SUFDaEIsTUFBTSxFQUFFLFNBQVM7SUFDakIsV0FBVyxFQUFFLENBQUM7SUFDZCxNQUFNLEVBQUUsSUFBSTtJQUNaLFNBQVMsRUFBRSxTQUFTO0NBQ3JCLENBQUM7QUFXRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsUUFBa0I7SUFDN0MsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLElBQUksS0FBSztRQUFFLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLElBQ0UsUUFBUTtRQUNSLE9BQU8sUUFBUSxLQUFLLFFBQVE7UUFDNUIsS0FBSyxDQUFDLE9BQU8sQ0FBRSxRQUF5QyxDQUFDLGNBQWMsQ0FBQyxFQUN4RSxDQUFDO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxRQUF3QixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLEtBQWE7SUFDNUIsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsR0FBWTtJQUM5QixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQVUsRUFBa0IsRUFBRSxDQUM1QyxDQUFDLENBQUMsQ0FB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QUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsSUFBSSxHQUFHLENBQUMsTUFBTTtRQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHJhY2VDb250b3VycyB9IGZyb20gJ25hcGFyaS1qcy9nZW9tZXRyeSc7XG5cbmltcG9ydCB0eXBlIHsgUmVnaW9uQ2xhc3NOb2RlLCBSZWdpb25Tb3VyY2VTdHlsZSB9IGZyb20gJy4uL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgTGFiZWxWb2x1bWUgfSBmcm9tICcuL2xhYmVsLXZvbHVtZSc7XG5cbi8qKlxuICogVGhlIGNsYXNzZXMgb2YgYSBsYWJlbCB2b2x1bWUncyB2YWx1ZXM6IHRoZWlyIG5hbWVzIGFuZCBjb2xvdXJzIGFuZCwgd2hlbiB0aGUgdm9sdW1lIGNvbWVzXG4gKiB3aXRoIGFuIG9udG9sb2d5LCB0aGVpciB0cmVlLiBQdXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsQ2xhc3NlcyB7XG4gIC8qKiBUaGUgY2xhc3Mgb2YgbGFiZWwgYHZhbHVlYCAoPiAwKTsgb25lIHdpdGhvdXQgYW4gb250b2xvZ3kgZW50cnkgaXMgYGxhYmVsIDx2YWx1ZT5gLiAqL1xuICBjbGFzc09mKHZhbHVlOiBudW1iZXIpOiB7IG5hbWU6IHN0cmluZzsgY29sb3I6IHN0cmluZzsgdGl0bGU/OiBzdHJpbmcgfTtcbiAgLyoqIFRoZSBjbGFzcyB0cmVlLCB3aGVuIHRoZSBvbnRvbG9neSBoYXMgb25lLiAqL1xuICBoaWVyYXJjaHk/OiBSZWdpb25DbGFzc05vZGVbXTtcbiAgLyoqIEhvdyB0aGUgc2V0IHdhbnRzIHRvIGJlIGRyYXduIChhbiBhdGxhcydzIGZpbGxlZCBsb29rKSwgd2hlbiB0aGUgb250b2xvZ3kgc2F5cy4gKi9cbiAgc3R5bGU/OiBSZWdpb25Tb3VyY2VTdHlsZTtcbn1cblxuLyoqIFRoZSBsb29rIHRoZSBBbGxlbiBhdGxhcyByZWdpb24gc2V0cyBjYXJyeSAoc2VlIHRoZSBicmFpbi1hdGxhcyBleGFtcGxlJ3MgR2VvSlNPTikuICovXG5leHBvcnQgY29uc3QgQVRMQVNfU1RZTEU6IFJlZ2lvblNvdXJjZVN0eWxlID0ge1xuICBmaWxsT3BhY2l0eTogMC42LFxuICBzdHJva2U6ICcjM2MzYzNjJyxcbiAgc3Ryb2tlV2lkdGg6IDEsXG4gIGxhYmVsczogdHJ1ZSxcbiAgaGlnaGxpZ2h0OiAnI2EwMjBmMCcsXG59O1xuXG5pbnRlcmZhY2UgQWxsZW5Ob2RlIHtcbiAgaWQ6IG51bWJlcjtcbiAgYWNyb255bTogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICBjb2xvcl9oZXhfdHJpcGxldD86IHN0cmluZztcbiAgZ3JhcGhfb3JkZXI/OiBudW1iZXI7XG4gIGNoaWxkcmVuPzogQWxsZW5Ob2RlW107XG59XG5cbi8qKlxuICogVGhlIGNsYXNzZXMgb2YgYSBsYWJlbCB2b2x1bWUgZnJvbSBgb250b2xvZ3lgLCBhIHBhcnNlZCBKU09OIGRvY3VtZW50OlxuICpcbiAqIC0gYW4gKipBbGxlbiBzdHJ1Y3R1cmUgZ3JhcGgqKiAoYHN0cnVjdHVyZV9ncmFwaF8xLmpzb25gOiBgeyBtc2c6IFtyb290XSB9YCwgb3IgYSBub2RlIG9yIGFcbiAqICAgbGlzdCBvZiBub2RlcyB3aXRoIGBpZGAsIGBhY3JvbnltYCwgYG5hbWVgLCBgY29sb3JfaGV4X3RyaXBsZXRgLCBgZ3JhcGhfb3JkZXJgIGFuZFxuICogICBgY2hpbGRyZW5gKTogbGFiZWwgPSBzdHJ1Y3R1cmUgaWQsIGNsYXNzID0gYWNyb255bSwgaXRzIHRyZWUgdGhlIG9udG9sb2d5J3MsIGRyYXduIGFzIHRoZVxuICogICBhdGxhcyByZWdpb24gc2V0cyBhcmU7XG4gKiAtIGEgKipyZWdpb24gc2V0IGRlc2NyaXB0aW9uKiogKGEgYHJlZ2lvbnNldC5qc29uYDogYGNsYXNzSGllcmFyY2h5YCwgb3B0aW9uYWwgYHN0eWxlYCksIHdob3NlXG4gKiAgIGNsYXNzZXMgbmFtZSB0aGVpciBsYWJlbCBhcyBgdmFsdWVgIChvciBgaWRgKSwgb3Igd2l0aCBhIGBsYWJlbHNgIG1hcCBvZiB2YWx1ZSDihpIgY2xhc3MgbmFtZS5cbiAqXG4gKiBXaXRob3V0IG9uZSAob3Igd2l0aCBhbm90aGVyIGRvY3VtZW50KSwgZWFjaCBsYWJlbCBpcyBpdHMgb3duIGNsYXNzIGBsYWJlbCA8dmFsdWU+YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhYmVsQ2xhc3NlcyhvbnRvbG9neT86IHVua25vd24pOiBMYWJlbENsYXNzZXMge1xuICBjb25zdCBhbGxlbiA9IGFsbGVuUm9vdHMob250b2xvZ3kpO1xuICBpZiAoYWxsZW4pIHJldHVybiBhbGxlbkNsYXNzZXMoYWxsZW4pO1xuICBpZiAoXG4gICAgb250b2xvZ3kgJiZcbiAgICB0eXBlb2Ygb250b2xvZ3kgPT09ICdvYmplY3QnICYmXG4gICAgQXJyYXkuaXNBcnJheSgob250b2xvZ3kgYXMgeyBjbGFzc0hpZXJhcmNoeT86IHVua25vd24gfSkuY2xhc3NIaWVyYXJjaHkpXG4gICkge1xuICAgIHJldHVybiByZWdpb25TZXRDbGFzc2VzKG9udG9sb2d5IGFzIFJlZ2lvblNldERvYyk7XG4gIH1cbiAgcmV0dXJuIHsgY2xhc3NPZjogdW5uYW1lZCB9O1xufVxuXG5mdW5jdGlvbiB1bm5hbWVkKHZhbHVlOiBudW1iZXIpOiB7IG5hbWU6IHN0cmluZzsgY29sb3I6IHN0cmluZyB9IHtcbiAgcmV0dXJuIHsgbmFtZTogYGxhYmVsICR7dmFsdWV9YCwgY29sb3I6IHBhbGV0dGVDb2xvcih2YWx1ZSkgfTtcbn1cblxuZnVuY3Rpb24gYWxsZW5Sb290cyhkb2M6IHVua25vd24pOiBBbGxlbk5vZGVbXSB8IG51bGwge1xuICBjb25zdCBpc05vZGUgPSAobjogdW5rbm93bik6IG4gaXMgQWxsZW5Ob2RlID0+XG4gICAgISFuICYmXG4gICAgdHlwZW9mIG4gPT09ICdvYmplY3QnICYmXG4gICAgdHlwZW9mIChuIGFzIEFsbGVuTm9kZSkuaWQgPT09ICdudW1iZXInICYmXG4gICAgdHlwZW9mIChuIGFzIEFsbGVuTm9kZSkuYWNyb255bSA9PT0gJ3N0cmluZyc7XG4gIGNvbnN0IG1zZyA9IChkb2MgYXMgeyBtc2c/OiB1bmtub3duIH0pPy5tc2c7XG4gIGNvbnN0IHJvb3RzID0gQXJyYXkuaXNBcnJheShtc2cpID8gbXNnIDogQXJyYXkuaXNBcnJheShkb2MpID8gZG9jIDogZG9jID8gW2RvY10gOiBbXTtcbiAgcmV0dXJuIHJvb3RzLmxlbmd0aCAmJiByb290cy5ldmVyeShpc05vZGUpID8gKHJvb3RzIGFzIEFsbGVuTm9kZVtdKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFsbGVuQ2xhc3Nlcyhyb290czogQWxsZW5Ob2RlW10pOiBMYWJlbENsYXNzZXMge1xuICBjb25zdCBieUlkID0gbmV3IE1hcDxudW1iZXIsIHsgbmFtZTogc3RyaW5nOyBjb2xvcjogc3RyaW5nOyB0aXRsZT86IHN0cmluZyB9PigpO1xuICBjb25zdCBoaWVyYXJjaHk6IFJlZ2lvbkNsYXNzTm9kZVtdID0gW107XG4gIGNvbnN0IHdhbGsgPSAobjogQWxsZW5Ob2RlLCBwYXJlbnQ6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICBjb25zdCBjb2xvciA9IGAjJHsobi5jb2xvcl9oZXhfdHJpcGxldCB8fCAnODA4MDgwJykudG9VcHBlckNhc2UoKX1gO1xuICAgIGJ5SWQuc2V0KG4uaWQsIHsgbmFtZTogbi5hY3JvbnltLCBjb2xvciwgdGl0bGU6IG4ubmFtZSB9KTtcbiAgICBoaWVyYXJjaHkucHVzaCh7XG4gICAgICBuYW1lOiBuLmFjcm9ueW0sXG4gICAgICAuLi4obi5uYW1lID8geyB0aXRsZTogbi5uYW1lIH0gOiB7fSksXG4gICAgICAuLi4ocGFyZW50ID8geyBwYXJlbnQgfSA6IHt9KSxcbiAgICAgIGNvbG9yLFxuICAgICAgLi4uKG4uZ3JhcGhfb3JkZXIgIT0gbnVsbCA/IHsgb3JkZXI6IG4uZ3JhcGhfb3JkZXIgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IGMgb2Ygbi5jaGlsZHJlbiA/PyBbXSkgd2FsayhjLCBuLmFjcm9ueW0pO1xuICB9O1xuICBmb3IgKGNvbnN0IHIgb2Ygcm9vdHMpIHdhbGsociwgbnVsbCk7XG4gIGhpZXJhcmNoeS5zb3J0KChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApKTtcbiAgcmV0dXJuIHsgY2xhc3NPZjogKHYpID0+IGJ5SWQuZ2V0KHYpID8/IHVubmFtZWQodiksIGhpZXJhcmNoeSwgc3R5bGU6IEFUTEFTX1NUWUxFIH07XG59XG5cbmludGVyZmFjZSBSZWdpb25TZXREb2Mge1xuICBjbGFzc0hpZXJhcmNoeTogQXJyYXk8UmVnaW9uQ2xhc3NOb2RlICYgeyB2YWx1ZT86IG51bWJlcjsgaWQ/OiBudW1iZXIgfT47XG4gIHN0eWxlPzogUmVnaW9uU291cmNlU3R5bGU7XG4gIGxhYmVscz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmZ1bmN0aW9uIHJlZ2lvblNldENsYXNzZXMoZG9jOiBSZWdpb25TZXREb2MpOiBMYWJlbENsYXNzZXMge1xuICBjb25zdCBub2RlcyA9IG5ldyBNYXAoZG9jLmNsYXNzSGllcmFyY2h5Lm1hcCgobikgPT4gW24ubmFtZSwgbl0pKTtcbiAgY29uc3QgYnlWYWx1ZSA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbiBvZiBkb2MuY2xhc3NIaWVyYXJjaHkpIHtcbiAgICBjb25zdCB2ID0gdHlwZW9mIG4udmFsdWUgPT09ICdudW1iZXInID8gbi52YWx1ZSA6IHR5cGVvZiBuLmlkID09PSAnbnVtYmVyJyA/IG4uaWQgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHYgIT0gbnVsbCkgYnlWYWx1ZS5zZXQodiwgbi5uYW1lKTtcbiAgfVxuICBmb3IgKGNvbnN0IFt2LCBuYW1lXSBvZiBPYmplY3QuZW50cmllcyhkb2MubGFiZWxzID8/IHt9KSkgYnlWYWx1ZS5zZXQoTnVtYmVyKHYpLCBuYW1lKTtcbiAgY29uc3QgaGllcmFyY2h5ID0gZG9jLmNsYXNzSGllcmFyY2h5Lm1hcCgoeyBuYW1lLCB0aXRsZSwgcGFyZW50LCBjb2xvciwgb3JkZXIgfSkgPT4gKHtcbiAgICBuYW1lLFxuICAgIC4uLih0aXRsZSA/IHsgdGl0bGUgfSA6IHt9KSxcbiAgICAuLi4ocGFyZW50ID8geyBwYXJlbnQgfSA6IHt9KSxcbiAgICAuLi4oY29sb3IgPyB7IGNvbG9yIH0gOiB7fSksXG4gICAgLi4uKG9yZGVyICE9IG51bGwgPyB7IG9yZGVyIH0gOiB7fSksXG4gIH0pKTtcbiAgcmV0dXJuIHtcbiAgICBjbGFzc09mOiAodikgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGJ5VmFsdWUuZ2V0KHYpO1xuICAgICAgY29uc3Qgbm9kZSA9IG5hbWUgPyBub2Rlcy5nZXQobmFtZSkgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gbm9kZSA/IHsgbmFtZTogbm9kZS5uYW1lLCBjb2xvcjogbm9kZS5jb2xvciA/PyBwYWxldHRlQ29sb3IodiksIHRpdGxlOiBub2RlLnRpdGxlIH0gOiB1bm5hbWVkKHYpO1xuICAgIH0sXG4gICAgaGllcmFyY2h5LFxuICAgIC4uLihkb2Muc3R5bGUgPyB7IHN0eWxlOiBkb2Muc3R5bGUgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIEEgY29sb3VyIHBlciBsYWJlbCB2YWx1ZSwgc3ByZWFkIGFyb3VuZCB0aGUgaHVlIGNpcmNsZS4gKi9cbmZ1bmN0aW9uIHBhbGV0dGVDb2xvcih2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaHVlID0gKHZhbHVlICogMTM3LjUwOCkgJSAzNjA7XG4gIGNvbnN0IFtyLCBnLCBiXSA9IGhzbChodWUsIDAuNjUsIDAuNTUpO1xuICByZXR1cm4gYCMke1tyLCBnLCBiXS5tYXAoKGMpID0+IGMudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpfWAudG9VcHBlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gaHNsKGg6IG51bWJlciwgczogbnVtYmVyLCBsOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBrID0gKG46IG51bWJlcikgPT4gKG4gKyBoIC8gMzApICUgMTI7XG4gIGNvbnN0IGEgPSBzICogTWF0aC5taW4obCwgMSAtIGwpO1xuICBjb25zdCBmID0gKG46IG51bWJlcikgPT4gbCAtIGEgKiBNYXRoLm1heCgtMSwgTWF0aC5taW4oayhuKSAtIDMsIE1hdGgubWluKDkgLSBrKG4pLCAxKSkpO1xuICByZXR1cm4gW2YoMCksIGYoOCksIGYoNCldLm1hcCgoYykgPT4gTWF0aC5yb3VuZChjICogMjU1KSkgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xufVxuXG5jb25zdCByZ2IgPSAoaGV4OiBzdHJpbmcpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT5cbiAgWzEsIDMsIDVdLm1hcCgobykgPT4gcGFyc2VJbnQoaGV4LnNsaWNlKG8sIG8gKyAyKSwgMTYpKSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbi8qKlxuICogU2xpY2UgYHpgIG9mIGB2b2x1bWVgIGFzIGEgR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvbiBzdHJpbmc6IG9uZSBmZWF0dXJlIHBlciBsYWJlbCBvbiB0aGVcbiAqIHNsaWNlLCBpdHMgZXZlcnkgcGllY2UgKHdpdGggaG9sZXMpIHRyYWNlZCBhbG9uZyBwaXhlbCBlZGdlcywgaW4gaW1hZ2UgcGl4ZWxzIHdpdGggeSBkb3duO1xuICogY2xhc3NpZmllZCBieSBgY2xhc3Nlc2AsIHdoaWNoIGFsc28gZ2l2ZSB0aGUgY29sbGVjdGlvbiBpdHMgY2xhc3MgdHJlZSBhbmQgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYWJlbFNsaWNlR2VvSnNvbih2b2x1bWU6IExhYmVsVm9sdW1lLCB6OiBudW1iZXIsIGNsYXNzZXM6IExhYmVsQ2xhc3Nlcyk6IHN0cmluZyB7XG4gIGNvbnN0IGxhYmVscyA9IHZvbHVtZS5zbGljZUxhYmVscyh6KTtcbiAgY29uc3QgYnlMYWJlbCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXJbXVtdW11bXT4oKTtcbiAgZm9yIChjb25zdCBjIG9mIHRyYWNlQ29udG91cnMoeyBkYXRhOiBsYWJlbHMsIHdpZHRoOiB2b2x1bWUud2lkdGgsIGhlaWdodDogdm9sdW1lLmhlaWdodCB9KSkge1xuICAgIGNvbnN0IHBvbHlnb25zID0gYnlMYWJlbC5nZXQoYy52YWx1ZSkgPz8gW107XG4gICAgcG9seWdvbnMucHVzaChbcmluZyhjLm91dGVyKSwgLi4uYy5ob2xlcy5tYXAocmluZyldKTtcbiAgICBieUxhYmVsLnNldChjLnZhbHVlLCBwb2x5Z29ucyk7XG4gIH1cbiAgY29uc3QgZmVhdHVyZXMgPSBbLi4uYnlMYWJlbF0ubWFwKChbdmFsdWUsIHBvbHlnb25zXSkgPT4ge1xuICAgIGNvbnN0IGNscyA9IGNsYXNzZXMuY2xhc3NPZih2YWx1ZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgIGlkOiBTdHJpbmcodmFsdWUpLFxuICAgICAgZ2VvbWV0cnk6IHsgdHlwZTogJ011bHRpUG9seWdvbicsIGNvb3JkaW5hdGVzOiBwb2x5Z29ucyB9LFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBvYmplY3RUeXBlOiAnYW5ub3RhdGlvbicsXG4gICAgICAgIG5hbWU6IGNscy50aXRsZSA/PyBjbHMubmFtZSxcbiAgICAgICAgY2xhc3NpZmljYXRpb246IHsgbmFtZTogY2xzLm5hbWUsIGNvbG9yOiByZ2IoY2xzLmNvbG9yKSB9LFxuICAgICAgICBsYWJlbFZhbHVlOiB2YWx1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAuLi4oY2xhc3Nlcy5oaWVyYXJjaHkgPyB7IGNsYXNzSGllcmFyY2h5OiBjbGFzc2VzLmhpZXJhcmNoeSB9IDoge30pLFxuICAgIC4uLihjbGFzc2VzLnN0eWxlID8geyBzdHlsZTogY2xhc3Nlcy5zdHlsZSB9IDoge30pLFxuICAgIGZlYXR1cmVzLFxuICB9KTtcbn1cblxuLyoqIEEgY2xvc2VkIEdlb0pTT04gcmluZyBmcm9tIGEgZmxhdCBgW3gwLCB5MCwg4oCmXWAgb25lLiAqL1xuZnVuY3Rpb24gcmluZyhmbGF0OiBudW1iZXJbXSk6IG51bWJlcltdW10ge1xuICBjb25zdCBwdHM6IG51bWJlcltdW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbGF0Lmxlbmd0aDsgaSArPSAyKSBwdHMucHVzaChbZmxhdFtpXSwgZmxhdFtpICsgMV1dKTtcbiAgaWYgKHB0cy5sZW5ndGgpIHB0cy5wdXNoKFsuLi5wdHNbMF1dKTtcbiAgcmV0dXJuIHB0cztcbn1cbiJdfQ==
@@ -0,0 +1,194 @@
1
+ /**
2
+ * A label volume (a NIfTI-1 `.nii` / `.nii.gz` or a NRRD `.nrrd` of integer structure ids, an
3
+ * atlas annotation say) read in the browser, sliced as the server opens the matching image:
4
+ *
5
+ * - **NRRD**: a 3D volume is cut along its FIRST axis, each section its third axis wide and its
6
+ * second axis high, as jit-service opens a NRRD volume (`AtlasNrrdReader`: the Allen CCF's 528
7
+ * coronal sections of 456 × 320, anterior first). A 2D NRRD is one slice.
8
+ * - **NIfTI**: along its third axis, each slice its first axis wide and its second axis high, as
9
+ * Bio-Formats reads one (no row flip).
10
+ *
11
+ * Only what label volumes use: a single file (NRRD with attached data, NIfTI-1 `n+1`), integer
12
+ * or integer-valued float samples, either byte order, raw or gzip. Anything else throws rather
13
+ * than be read approximately. Pure: usable from workers.
14
+ */
15
+ /** Whether a file name is a label volume this reads. */
16
+ export function isLabelVolumeName(name) {
17
+ return /\.(nrrd|nii|nii\.gz)$/i.test(name);
18
+ }
19
+ /** Read the label volume in `bytes`, named `name` (`.nrrd`, `.nii`, `.nii.gz`). */
20
+ export async function readLabelVolume(name, bytes, gunzip = platformGunzip) {
21
+ if (/\.nrrd$/i.test(name))
22
+ return readNrrd(bytes, gunzip);
23
+ if (/\.nii(\.gz)?$/i.test(name))
24
+ return readNifti(isGzip(bytes) ? await gunzip(bytes) : bytes);
25
+ throw new Error(`${name}: not a NIfTI (.nii, .nii.gz) or NRRD (.nrrd) label volume`);
26
+ }
27
+ const SAMPLES = {
28
+ u8: { bytes: 1, read: (v, at) => v.getUint8(at) },
29
+ i8: { bytes: 1, read: (v, at) => v.getInt8(at) },
30
+ u16: { bytes: 2, read: (v, at, le) => v.getUint16(at, le) },
31
+ i16: { bytes: 2, read: (v, at, le) => v.getInt16(at, le) },
32
+ u32: { bytes: 4, read: (v, at, le) => v.getUint32(at, le) },
33
+ i32: { bytes: 4, read: (v, at, le) => v.getInt32(at, le) },
34
+ f32: { bytes: 4, read: (v, at, le) => Math.round(v.getFloat32(at, le)) },
35
+ f64: { bytes: 8, read: (v, at, le) => Math.round(v.getFloat64(at, le)) },
36
+ };
37
+ /** NRRD type names (every spelling the format allows) → sample type. */
38
+ const NRRD_TYPES = {
39
+ 'signed char': 'i8',
40
+ int8: 'i8',
41
+ int8_t: 'i8',
42
+ uchar: 'u8',
43
+ 'unsigned char': 'u8',
44
+ uint8: 'u8',
45
+ uint8_t: 'u8',
46
+ short: 'i16',
47
+ 'short int': 'i16',
48
+ 'signed short': 'i16',
49
+ 'signed short int': 'i16',
50
+ int16: 'i16',
51
+ int16_t: 'i16',
52
+ ushort: 'u16',
53
+ 'unsigned short': 'u16',
54
+ 'unsigned short int': 'u16',
55
+ uint16: 'u16',
56
+ uint16_t: 'u16',
57
+ int: 'i32',
58
+ 'signed int': 'i32',
59
+ int32: 'i32',
60
+ int32_t: 'i32',
61
+ uint: 'u32',
62
+ 'unsigned int': 'u32',
63
+ uint32: 'u32',
64
+ uint32_t: 'u32',
65
+ float: 'f32',
66
+ double: 'f64',
67
+ };
68
+ /** NIfTI datatype codes → sample type. */
69
+ const NIFTI_TYPES = {
70
+ 2: 'u8',
71
+ 4: 'i16',
72
+ 8: 'i32',
73
+ 16: 'f32',
74
+ 64: 'f64',
75
+ 256: 'i8',
76
+ 512: 'u16',
77
+ 768: 'u32',
78
+ };
79
+ async function readNrrd(bytes, gunzip) {
80
+ const end = headerEnd(bytes);
81
+ if (end < 0)
82
+ throw new Error('NRRD: no blank line ends the header');
83
+ const lines = new TextDecoder('latin1').decode(bytes.subarray(0, end)).split(/\r?\n/);
84
+ if (!/^NRRD\d{4}/.test(lines[0] ?? ''))
85
+ throw new Error('NRRD: not a NRRD file');
86
+ const field = {};
87
+ for (const line of lines.slice(1)) {
88
+ if (line.startsWith('#'))
89
+ continue;
90
+ const at = line.indexOf(': ');
91
+ if (at > 0)
92
+ field[line.slice(0, at).trim().toLowerCase()] = line.slice(at + 2).trim();
93
+ }
94
+ if (field['data file'] || field['datafile'])
95
+ throw new Error('NRRD: detached data (a .nhdr) is not supported');
96
+ const type = NRRD_TYPES[(field['type'] ?? '').toLowerCase()];
97
+ if (!type)
98
+ throw new Error(`NRRD: unsupported type "${field['type']}"`);
99
+ const sizes = (field['sizes'] ?? '').split(/\s+/).filter(Boolean).map(Number);
100
+ if (sizes.length !== 2 && sizes.length !== 3)
101
+ throw new Error(`NRRD: need 2 or 3 dimensions, got ${sizes.length}`);
102
+ const encoding = (field['encoding'] ?? 'raw').toLowerCase();
103
+ let data = bytes.subarray(end);
104
+ if (encoding === 'gzip' || encoding === 'gz')
105
+ data = await gunzip(data);
106
+ else if (encoding !== 'raw')
107
+ throw new Error(`NRRD: unsupported encoding "${encoding}"`);
108
+ const little = (field['endian'] ?? 'little').toLowerCase() !== 'big';
109
+ // A 3D volume: sections along axis 0, each axis 2 wide and axis 1 high (jit-service's cut).
110
+ const [n0, n1, n2] = sizes.length === 3 ? sizes : [sizes[0], sizes[1], 1];
111
+ const axes = sizes.length === 3 ? { z: 0, x: 2, y: 1 } : { z: 2, x: 0, y: 1 };
112
+ return volume('nrrd', [n0, n1, n2], axes, data, SAMPLES[type], little);
113
+ }
114
+ function readNifti(bytes) {
115
+ if (bytes.length < 352)
116
+ throw new Error('NIfTI: shorter than a header');
117
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
118
+ let little = true;
119
+ if (view.getInt32(0, true) !== 348) {
120
+ if (view.getInt32(0, false) !== 348)
121
+ throw new Error('NIfTI: not a NIfTI-1 file');
122
+ little = false;
123
+ }
124
+ const magic = new TextDecoder('latin1').decode(bytes.subarray(344, 347));
125
+ if (magic !== 'n+1')
126
+ throw new Error('NIfTI: a separate .hdr/.img pair is not supported');
127
+ const ndim = view.getInt16(40, little);
128
+ const dims = [1, 2, 3, 4].map((i) => view.getInt16(40 + 2 * i, little));
129
+ if (ndim < 2)
130
+ throw new Error(`NIfTI: need at least 2 dimensions, got ${ndim}`);
131
+ if (ndim >= 4 && dims[3] > 1)
132
+ throw new Error('NIfTI: a 4D file is not a label volume');
133
+ const type = NIFTI_TYPES[view.getInt16(70, little)];
134
+ if (!type)
135
+ throw new Error(`NIfTI: unsupported datatype ${view.getInt16(70, little)}`);
136
+ const offset = Math.max(352, Math.round(view.getFloat32(108, little)));
137
+ const [n0, n1, n2] = [dims[0], dims[1], ndim >= 3 ? dims[2] : 1];
138
+ // Slices along axis 2, each axis 0 wide and axis 1 high (Bio-Formats' planes).
139
+ return volume('nifti', [n0, n1, n2], { z: 2, x: 0, y: 1 }, bytes.subarray(offset), SAMPLES[type], little);
140
+ }
141
+ function volume(format, n, axes, data, sample, little) {
142
+ const count = n[0] * n[1] * n[2];
143
+ if (!(count > 0))
144
+ throw new Error(`${format}: empty volume`);
145
+ if (data.length < count * sample.bytes) {
146
+ throw new Error(`${format}: ${data.length} bytes of data, ${count * sample.bytes} needed`);
147
+ }
148
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
149
+ const stride = [1, n[0], n[0] * n[1]];
150
+ const width = n[axes.x];
151
+ const height = n[axes.y];
152
+ return {
153
+ format,
154
+ width,
155
+ height,
156
+ slices: n[axes.z],
157
+ sliceLabels(z) {
158
+ const out = new Uint32Array(width * height);
159
+ const base = z * stride[axes.z];
160
+ const sx = stride[axes.x];
161
+ const sy = stride[axes.y];
162
+ for (let y = 0; y < height; y++) {
163
+ for (let x = 0; x < width; x++) {
164
+ const v = sample.read(view, (base + x * sx + y * sy) * sample.bytes, little);
165
+ out[y * width + x] = v > 0 ? v : 0;
166
+ }
167
+ }
168
+ return out;
169
+ },
170
+ };
171
+ }
172
+ /** The offset just past the header's blank line (`\n\n` or `\r\n\r\n`); -1 without one. */
173
+ function headerEnd(bytes) {
174
+ const limit = Math.min(bytes.length - 1, 1 << 20);
175
+ for (let i = 0; i < limit; i++) {
176
+ if (bytes[i] !== 10)
177
+ continue;
178
+ if (bytes[i + 1] === 10)
179
+ return i + 2;
180
+ if (bytes[i + 1] === 13 && bytes[i + 2] === 10)
181
+ return i + 3;
182
+ }
183
+ return -1;
184
+ }
185
+ function isGzip(bytes) {
186
+ return bytes.length > 2 && bytes[0] === 0x1f && bytes[1] === 0x8b;
187
+ }
188
+ async function platformGunzip(bytes) {
189
+ if (typeof DecompressionStream === 'undefined')
190
+ throw new Error('gzip data needs DecompressionStream');
191
+ const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream('gzip'));
192
+ return new Uint8Array(await new Response(stream).arrayBuffer());
193
+ }
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwtdm9sdW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24taW1wb3J0L2xhYmVsLXZvbHVtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBaUJILHdEQUF3RDtBQUN4RCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBWTtJQUM1QyxPQUFPLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUNuQyxJQUFZLEVBQ1osS0FBaUIsRUFDakIsU0FBaUIsY0FBYztJQUUvQixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFELElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9GLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLDREQUE0RCxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUlELE1BQU0sT0FBTyxHQUEyQjtJQUN0QyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDakQsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2hELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzNELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzFELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzNELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzFELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUN4RSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FB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LEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFpQjtJQUNsQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNsRixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxNQUFN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Q0FBQztBQUVELEtBQUssVUFBVSxjQUFjLENBQUMsS0FBaUI7SUFDN0MsSUFBSSxPQUFPLG1CQUFtQixLQUFLLFdBQVc7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDdkcsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFpQixDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25HLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgbGFiZWwgdm9sdW1lIChhIE5JZlRJLTEgYC5uaWlgIC8gYC5uaWkuZ3pgIG9yIGEgTlJSRCBgLm5ycmRgIG9mIGludGVnZXIgc3RydWN0dXJlIGlkcywgYW5cbiAqIGF0bGFzIGFubm90YXRpb24gc2F5KSByZWFkIGluIHRoZSBicm93c2VyLCBzbGljZWQgYXMgdGhlIHNlcnZlciBvcGVucyB0aGUgbWF0Y2hpbmcgaW1hZ2U6XG4gKlxuICogLSAqKk5SUkQqKjogYSAzRCB2b2x1bWUgaXMgY3V0IGFsb25nIGl0cyBGSVJTVCBheGlzLCBlYWNoIHNlY3Rpb24gaXRzIHRoaXJkIGF4aXMgd2lkZSBhbmQgaXRzXG4gKiAgIHNlY29uZCBheGlzIGhpZ2gsIGFzIGppdC1zZXJ2aWNlIG9wZW5zIGEgTlJSRCB2b2x1bWUgKGBBdGxhc05ycmRSZWFkZXJgOiB0aGUgQWxsZW4gQ0NGJ3MgNTI4XG4gKiAgIGNvcm9uYWwgc2VjdGlvbnMgb2YgNDU2IMOXIDMyMCwgYW50ZXJpb3IgZmlyc3QpLiBBIDJEIE5SUkQgaXMgb25lIHNsaWNlLlxuICogLSAqKk5JZlRJKio6IGFsb25nIGl0cyB0aGlyZCBheGlzLCBlYWNoIHNsaWNlIGl0cyBmaXJzdCBheGlzIHdpZGUgYW5kIGl0cyBzZWNvbmQgYXhpcyBoaWdoLCBhc1xuICogICBCaW8tRm9ybWF0cyByZWFkcyBvbmUgKG5vIHJvdyBmbGlwKS5cbiAqXG4gKiBPbmx5IHdoYXQgbGFiZWwgdm9sdW1lcyB1c2U6IGEgc2luZ2xlIGZpbGUgKE5SUkQgd2l0aCBhdHRhY2hlZCBkYXRhLCBOSWZUSS0xIGBuKzFgKSwgaW50ZWdlclxuICogb3IgaW50ZWdlci12YWx1ZWQgZmxvYXQgc2FtcGxlcywgZWl0aGVyIGJ5dGUgb3JkZXIsIHJhdyBvciBnemlwLiBBbnl0aGluZyBlbHNlIHRocm93cyByYXRoZXJcbiAqIHRoYW4gYmUgcmVhZCBhcHByb3hpbWF0ZWx5LiBQdXJlOiB1c2FibGUgZnJvbSB3b3JrZXJzLlxuICovXG5cbi8qKiBBIGxhYmVsIHZvbHVtZSwgc2xpY2VkIChzZWUgdGhlIG1vZHVsZSBjb21tZW50KS4gTGFiZWwgMCBpcyBiYWNrZ3JvdW5kLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWJlbFZvbHVtZSB7XG4gIGZvcm1hdDogJ25ycmQnIHwgJ25pZnRpJztcbiAgLyoqIEEgc2xpY2UncyB3aWR0aCBhbmQgaGVpZ2h0LCBpbiB2b3hlbHMgKHRoZSBpbWFnZSdzIHBpeGVscykuICovXG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHNsaWNlcy4gKi9cbiAgc2xpY2VzOiBudW1iZXI7XG4gIC8qKiBTbGljZSBgemAncyBsYWJlbHMsIHJvdy1tYWpvciAoYGhlaWdodGAgcm93cyBvZiBgd2lkdGhgKS4gKi9cbiAgc2xpY2VMYWJlbHMoejogbnVtYmVyKTogVWludDMyQXJyYXk7XG59XG5cbi8qKiBEZWNvbXByZXNzIGd6aXAgYnl0ZXMgKGRlZmF1bHQ6IHRoZSBwbGF0Zm9ybSdzIGBEZWNvbXByZXNzaW9uU3RyZWFtYCkuICovXG5leHBvcnQgdHlwZSBHdW56aXAgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IFByb21pc2U8VWludDhBcnJheT47XG5cbi8qKiBXaGV0aGVyIGEgZmlsZSBuYW1lIGlzIGEgbGFiZWwgdm9sdW1lIHRoaXMgcmVhZHMuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMYWJlbFZvbHVtZU5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFwuKG5ycmR8bmlpfG5paVxcLmd6KSQvaS50ZXN0KG5hbWUpO1xufVxuXG4vKiogUmVhZCB0aGUgbGFiZWwgdm9sdW1lIGluIGBieXRlc2AsIG5hbWVkIGBuYW1lYCAoYC5ucnJkYCwgYC5uaWlgLCBgLm5paS5nemApLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRMYWJlbFZvbHVtZShcbiAgbmFtZTogc3RyaW5nLFxuICBieXRlczogVWludDhBcnJheSxcbiAgZ3VuemlwOiBHdW56aXAgPSBwbGF0Zm9ybUd1bnppcCxcbik6IFByb21pc2U8TGFiZWxWb2x1bWU+IHtcbiAgaWYgKC9cXC5ucnJkJC9pLnRlc3QobmFtZSkpIHJldHVybiByZWFkTnJyZChieXRlcywgZ3VuemlwKTtcbiAgaWYgKC9cXC5uaWkoXFwuZ3opPyQvaS50ZXN0KG5hbWUpKSByZXR1cm4gcmVhZE5pZnRpKGlzR3ppcChieXRlcykgPyBhd2FpdCBndW56aXAoYnl0ZXMpIDogYnl0ZXMpO1xuICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX06IG5vdCBhIE5JZlRJICgubmlpLCAubmlpLmd6KSBvciBOUlJEICgubnJyZCkgbGFiZWwgdm9sdW1lYCk7XG59XG5cbi8qKiBTYW1wbGUgdHlwZXM6IHRoZWlyIGJ5dGUgc2l6ZSBhbmQgaG93IG9uZSBpcyByZWFkLiAqL1xudHlwZSBTYW1wbGUgPSB7IGJ5dGVzOiBudW1iZXI7IHJlYWQ6ICh2OiBEYXRhVmlldywgYXQ6IG51bWJlciwgbGl0dGxlOiBib29sZWFuKSA9PiBudW1iZXIgfTtcbmNvbnN0IFNBTVBMRVM6IFJlY29yZDxzdHJpbmcsIFNhbXBsZT4gPSB7XG4gIHU4OiB7IGJ5dGVzOiAxLCByZWFkOiAodiwgYXQpID0+IHYuZ2V0VWludDgoYXQpIH0sXG4gIGk4OiB7IGJ5dGVzOiAxLCByZWFkOiAodiwgYXQpID0+IHYuZ2V0SW50OChhdCkgfSxcbiAgdTE2OiB7IGJ5dGVzOiAyLCByZWFkOiAodiwgYXQsIGxlKSA9PiB2LmdldFVpbnQxNihhdCwgbGUpIH0sXG4gIGkxNjogeyBieXRlczogMiwgcmVhZDogKHYsIGF0LCBsZSkgPT4gdi5nZXRJbnQxNihhdCwgbGUpIH0sXG4gIHUzMjogeyBieXRlczogNCwgcmVhZDogKHYsIGF0LCBsZSkgPT4gdi5nZXRVaW50MzIoYXQsIGxlKSB9LFxuICBpMzI6IHsgYnl0ZXM6IDQsIHJlYWQ6ICh2LCBhdCwgbGUpID0+IHYuZ2V0SW50MzIoYXQsIGxlKSB9LFxuICBmMzI6IHsgYnl0ZXM6IDQsIHJlYWQ6ICh2LCBhdCwgbGUpID0+IE1hdGgucm91bmQodi5nZXRGbG9hdDMyKGF0LCBsZSkpIH0sXG4gIGY2NDogeyBieXRlczogOCwgcmVhZDogKHYsIGF0LCBsZSkgPT4gTWF0aC5yb3VuZCh2LmdldEZsb2F0NjQoYXQsIGxlKSkgfSxcbn07XG5cbi8qKiBOUlJEIHR5cGUgbmFtZXMgKGV2ZXJ5IHNwZWxsaW5nIHRoZSBmb3JtYXQgYWxsb3dzKSDihpIgc2FtcGxlIHR5cGUuICovXG5jb25zdCBOUlJEX1RZUEVTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnc2lnbmVkIGNoYXInOiAnaTgnLFxuICBpbnQ4OiAnaTgnLFxuICBpbnQ4X3Q6ICdpOCcsXG4gIHVjaGFyOiAndTgnLFxuICAndW5zaWduZWQgY2hhcic6ICd1OCcsXG4gIHVpbnQ4OiAndTgnLFxuICB1aW50OF90OiAndTgnLFxuICBzaG9ydDogJ2kxNicsXG4gICdzaG9ydCBpbnQnOiAnaTE2JyxcbiAgJ3NpZ25lZCBzaG9ydCc6ICdpMTYnLFxuICAnc2lnbmVkIHNob3J0IGludCc6ICdpMTYnLFxuICBpbnQxNjogJ2kxNicsXG4gIGludDE2X3Q6ICdpMTYnLFxuICB1c2hvcnQ6ICd1MTYnLFxuICAndW5zaWduZWQgc2hvcnQnOiAndTE2JyxcbiAgJ3Vuc2lnbmVkIHNob3J0IGludCc6ICd1MTYnLFxuICB1aW50MTY6ICd1MTYnLFxuICB1aW50MTZfdDogJ3UxNicsXG4gIGludDogJ2kzMicsXG4gICdzaWduZWQgaW50JzogJ2kzMicsXG4gIGludDMyOiAnaTMyJyxcbiAgaW50MzJfdDogJ2kzMicsXG4gIHVpbnQ6ICd1MzInLFxuICAndW5zaWduZWQgaW50JzogJ3UzMicsXG4gIHVpbnQzMjogJ3UzMicsXG4gIHVpbnQzMl90OiAndTMyJyxcbiAgZmxvYXQ6ICdmMzInLFxuICBkb3VibGU6ICdmNjQnLFxufTtcblxuLyoqIE5JZlRJIGRhdGF0eXBlIGNvZGVzIOKGkiBzYW1wbGUgdHlwZS4gKi9cbmNvbnN0IE5JRlRJX1RZUEVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAyOiAndTgnLFxuICA0OiAnaTE2JyxcbiAgODogJ2kzMicsXG4gIDE2OiAnZjMyJyxcbiAgNjQ6ICdmNjQnLFxuICAyNTY6ICdpOCcsXG4gIDUxMjogJ3UxNicsXG4gIDc2ODogJ3UzMicsXG59O1xuXG5hc3luYyBmdW5jdGlvbiByZWFkTnJyZChieXRlczogVWludDhBcnJheSwgZ3VuemlwOiBHdW56aXApOiBQcm9taXNlPExhYmVsVm9sdW1lPiB7XG4gIGNvbnN0IGVuZCA9IGhlYWRlckVuZChieXRlcyk7XG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoJ05SUkQ6IG5vIGJsYW5rIGxpbmUgZW5kcyB0aGUgaGVhZGVyJyk7XG4gIGNvbnN0IGxpbmVzID0gbmV3IFRleHREZWNvZGVyKCdsYXRpbjEnKS5kZWNvZGUoYnl0ZXMuc3ViYXJyYXkoMCwgZW5kKSkuc3BsaXQoL1xccj9cXG4vKTtcbiAgaWYgKCEvXk5SUkRcXGR7NH0vLnRlc3QobGluZXNbMF0gPz8gJycpKSB0aHJvdyBuZXcgRXJyb3IoJ05SUkQ6IG5vdCBhIE5SUkQgZmlsZScpO1xuICBjb25zdCBmaWVsZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMuc2xpY2UoMSkpIHtcbiAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjJykpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGF0ID0gbGluZS5pbmRleE9mKCc6ICcpO1xuICAgIGlmIChhdCA+IDApIGZpZWxkW2xpbmUuc2xpY2UoMCwgYXQpLnRyaW0oKS50b0xvd2VyQ2FzZSgpXSA9IGxpbmUuc2xpY2UoYXQgKyAyKS50cmltKCk7XG4gIH1cbiAgaWYgKGZpZWxkWydkYXRhIGZpbGUnXSB8fCBmaWVsZFsnZGF0YWZpbGUnXSkgdGhyb3cgbmV3IEVycm9yKCdOUlJEOiBkZXRhY2hlZCBkYXRhIChhIC5uaGRyKSBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIGNvbnN0IHR5cGUgPSBOUlJEX1RZUEVTWyhmaWVsZFsndHlwZSddID8/ICcnKS50b0xvd2VyQ2FzZSgpXTtcbiAgaWYgKCF0eXBlKSB0aHJvdyBuZXcgRXJyb3IoYE5SUkQ6IHVuc3VwcG9ydGVkIHR5cGUgXCIke2ZpZWxkWyd0eXBlJ119XCJgKTtcbiAgY29uc3Qgc2l6ZXMgPSAoZmllbGRbJ3NpemVzJ10gPz8gJycpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pLm1hcChOdW1iZXIpO1xuICBpZiAoc2l6ZXMubGVuZ3RoICE9PSAyICYmIHNpemVzLmxlbmd0aCAhPT0gMylcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5SUkQ6IG5lZWQgMiBvciAzIGRpbWVuc2lvbnMsIGdvdCAke3NpemVzLmxlbmd0aH1gKTtcbiAgY29uc3QgZW5jb2RpbmcgPSAoZmllbGRbJ2VuY29kaW5nJ10gPz8gJ3JhdycpLnRvTG93ZXJDYXNlKCk7XG4gIGxldCBkYXRhID0gYnl0ZXMuc3ViYXJyYXkoZW5kKTtcbiAgaWYgKGVuY29kaW5nID09PSAnZ3ppcCcgfHwgZW5jb2RpbmcgPT09ICdneicpIGRhdGEgPSBhd2FpdCBndW56aXAoZGF0YSk7XG4gIGVsc2UgaWYgKGVuY29kaW5nICE9PSAncmF3JykgdGhyb3cgbmV3IEVycm9yKGBOUlJEOiB1bnN1cHBvcnRlZCBlbmNvZGluZyBcIiR7ZW5jb2Rpbmd9XCJgKTtcbiAgY29uc3QgbGl0dGxlID0gKGZpZWxkWydlbmRpYW4nXSA/PyAnbGl0dGxlJykudG9Mb3dlckNhc2UoKSAhPT0gJ2JpZyc7XG4gIC8vIEEgM0Qgdm9sdW1lOiBzZWN0aW9ucyBhbG9uZyBheGlzIDAsIGVhY2ggYXhpcyAyIHdpZGUgYW5kIGF4aXMgMSBoaWdoIChqaXQtc2VydmljZSdzIGN1dCkuXG4gIGNvbnN0IFtuMCwgbjEsIG4yXSA9IHNpemVzLmxlbmd0aCA9PT0gMyA/IHNpemVzIDogW3NpemVzWzBdLCBzaXplc1sxXSwgMV07XG4gIGNvbnN0IGF4ZXMgPSBzaXplcy5sZW5ndGggPT09IDMgPyB7IHo6IDAsIHg6IDIsIHk6IDEgfSA6IHsgejogMiwgeDogMCwgeTogMSB9O1xuICByZXR1cm4gdm9sdW1lKCducnJkJywgW24wLCBuMSwgbjJdLCBheGVzLCBkYXRhLCBTQU1QTEVTW3R5cGVdLCBsaXR0bGUpO1xufVxuXG5mdW5jdGlvbiByZWFkTmlmdGkoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBMYWJlbFZvbHVtZSB7XG4gIGlmIChieXRlcy5sZW5ndGggPCAzNTIpIHRocm93IG5ldyBFcnJvcignTklmVEk6IHNob3J0ZXIgdGhhbiBhIGhlYWRlcicpO1xuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlciwgYnl0ZXMuYnl0ZU9mZnNldCwgYnl0ZXMuYnl0ZUxlbmd0aCk7XG4gIGxldCBsaXR0bGUgPSB0cnVlO1xuICBpZiAodmlldy5nZXRJbnQzMigwLCB0cnVlKSAhPT0gMzQ4KSB7XG4gICAgaWYgKHZpZXcuZ2V0SW50MzIoMCwgZmFsc2UpICE9PSAzNDgpIHRocm93IG5ldyBFcnJvcignTklmVEk6IG5vdCBhIE5JZlRJLTEgZmlsZScpO1xuICAgIGxpdHRsZSA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IG1hZ2ljID0gbmV3IFRleHREZWNvZGVyKCdsYXRpbjEnKS5kZWNvZGUoYnl0ZXMuc3ViYXJyYXkoMzQ0LCAzNDcpKTtcbiAgaWYgKG1hZ2ljICE9PSAnbisxJykgdGhyb3cgbmV3IEVycm9yKCdOSWZUSTogYSBzZXBhcmF0ZSAuaGRyLy5pbWcgcGFpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIGNvbnN0IG5kaW0gPSB2aWV3LmdldEludDE2KDQwLCBsaXR0bGUpO1xuICBjb25zdCBkaW1zID0gWzEsIDIsIDMsIDRdLm1hcCgoaSkgPT4gdmlldy5nZXRJbnQxNig0MCArIDIgKiBpLCBsaXR0bGUpKTtcbiAgaWYgKG5kaW0gPCAyKSB0aHJvdyBuZXcgRXJyb3IoYE5JZlRJOiBuZWVkIGF0IGxlYXN0IDIgZGltZW5zaW9ucywgZ290ICR7bmRpbX1gKTtcbiAgaWYgKG5kaW0gPj0gNCAmJiBkaW1zWzNdID4gMSkgdGhyb3cgbmV3IEVycm9yKCdOSWZUSTogYSA0RCBmaWxlIGlzIG5vdCBhIGxhYmVsIHZvbHVtZScpO1xuICBjb25zdCB0eXBlID0gTklGVElfVFlQRVNbdmlldy5nZXRJbnQxNig3MCwgbGl0dGxlKV07XG4gIGlmICghdHlwZSkgdGhyb3cgbmV3IEVycm9yKGBOSWZUSTogdW5zdXBwb3J0ZWQgZGF0YXR5cGUgJHt2aWV3LmdldEludDE2KDcwLCBsaXR0bGUpfWApO1xuICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCgzNTIsIE1hdGgucm91bmQodmlldy5nZXRGbG9hdDMyKDEwOCwgbGl0dGxlKSkpO1xuICBjb25zdCBbbjAsIG4xLCBuMl0gPSBbZGltc1swXSwgZGltc1sxXSwgbmRpbSA+PSAzID8gZGltc1syXSA6IDFdO1xuICAvLyBTbGljZXMgYWxvbmcgYXhpcyAyLCBlYWNoIGF4aXMgMCB3aWRlIGFuZCBheGlzIDEgaGlnaCAoQmlvLUZvcm1hdHMnIHBsYW5lcykuXG4gIHJldHVybiB2b2x1bWUoJ25pZnRpJywgW24wLCBuMSwgbjJdLCB7IHo6IDIsIHg6IDAsIHk6IDEgfSwgYnl0ZXMuc3ViYXJyYXkob2Zmc2V0KSwgU0FNUExFU1t0eXBlXSwgbGl0dGxlKTtcbn1cblxuZnVuY3Rpb24gdm9sdW1lKFxuICBmb3JtYXQ6IExhYmVsVm9sdW1lWydmb3JtYXQnXSxcbiAgbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICBheGVzOiB7IHo6IG51bWJlcjsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcbiAgZGF0YTogVWludDhBcnJheSxcbiAgc2FtcGxlOiBTYW1wbGUsXG4gIGxpdHRsZTogYm9vbGVhbixcbik6IExhYmVsVm9sdW1lIHtcbiAgY29uc3QgY291bnQgPSBuWzBdICogblsxXSAqIG5bMl07XG4gIGlmICghKGNvdW50ID4gMCkpIHRocm93IG5ldyBFcnJvcihgJHtmb3JtYXR9OiBlbXB0eSB2b2x1bWVgKTtcbiAgaWYgKGRhdGEubGVuZ3RoIDwgY291bnQgKiBzYW1wbGUuYnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Zm9ybWF0fTogJHtkYXRhLmxlbmd0aH0gYnl0ZXMgb2YgZGF0YSwgJHtjb3VudCAqIHNhbXBsZS5ieXRlc30gbmVlZGVkYCk7XG4gIH1cbiAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpO1xuICBjb25zdCBzdHJpZGUgPSBbMSwgblswXSwgblswXSAqIG5bMV1dO1xuICBjb25zdCB3aWR0aCA9IG5bYXhlcy54XTtcbiAgY29uc3QgaGVpZ2h0ID0gbltheGVzLnldO1xuICByZXR1cm4ge1xuICAgIGZvcm1hdCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgc2xpY2VzOiBuW2F4ZXMuel0sXG4gICAgc2xpY2VMYWJlbHMoejogbnVtYmVyKTogVWludDMyQXJyYXkge1xuICAgICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQzMkFycmF5KHdpZHRoICogaGVpZ2h0KTtcbiAgICAgIGNvbnN0IGJhc2UgPSB6ICogc3RyaWRlW2F4ZXMuel07XG4gICAgICBjb25zdCBzeCA9IHN0cmlkZVtheGVzLnhdO1xuICAgICAgY29uc3Qgc3kgPSBzdHJpZGVbYXhlcy55XTtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHNhbXBsZS5yZWFkKHZpZXcsIChiYXNlICsgeCAqIHN4ICsgeSAqIHN5KSAqIHNhbXBsZS5ieXRlcywgbGl0dGxlKTtcbiAgICAgICAgICBvdXRbeSAqIHdpZHRoICsgeF0gPSB2ID4gMCA/IHYgOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH0sXG4gIH07XG59XG5cbi8qKiBUaGUgb2Zmc2V0IGp1c3QgcGFzdCB0aGUgaGVhZGVyJ3MgYmxhbmsgbGluZSAoYFxcblxcbmAgb3IgYFxcclxcblxcclxcbmApOyAtMSB3aXRob3V0IG9uZS4gKi9cbmZ1bmN0aW9uIGhlYWRlckVuZChieXRlczogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oYnl0ZXMubGVuZ3RoIC0gMSwgMSA8PCAyMCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykge1xuICAgIGlmIChieXRlc1tpXSAhPT0gMTApIGNvbnRpbnVlO1xuICAgIGlmIChieXRlc1tpICsgMV0gPT09IDEwKSByZXR1cm4gaSArIDI7XG4gICAgaWYgKGJ5dGVzW2kgKyAxXSA9PT0gMTMgJiYgYnl0ZXNbaSArIDJdID09PSAxMCkgcmV0dXJuIGkgKyAzO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gaXNHemlwKGJ5dGVzOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIHJldHVybiBieXRlcy5sZW5ndGggPiAyICYmIGJ5dGVzWzBdID09PSAweDFmICYmIGJ5dGVzWzFdID09PSAweDhiO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwbGF0Zm9ybUd1bnppcChieXRlczogVWludDhBcnJheSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBpZiAodHlwZW9mIERlY29tcHJlc3Npb25TdHJlYW0gPT09ICd1bmRlZmluZWQnKSB0aHJvdyBuZXcgRXJyb3IoJ2d6aXAgZGF0YSBuZWVkcyBEZWNvbXByZXNzaW9uU3RyZWFtJyk7XG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBCbG9iKFtieXRlcyBhcyBCbG9iUGFydF0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCdnemlwJykpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IFJlc3BvbnNlKHN0cmVhbSkuYXJyYXlCdWZmZXIoKSk7XG59XG4iXX0=
@@ -0,0 +1,71 @@
1
+ import { isLabelVolumeName } from './label-volume';
2
+ /** `data`, named `name`, as an import file. A `File`'s own name is used when `name` is omitted. */
3
+ export function importFile(data, name = data.name ?? '') {
4
+ const encoder = new TextEncoder();
5
+ return {
6
+ name,
7
+ text: async () => typeof data === 'string'
8
+ ? data
9
+ : data instanceof Blob
10
+ ? data.text()
11
+ : new TextDecoder().decode(data instanceof Uint8Array ? data : new Uint8Array(data)),
12
+ bytes: async () => typeof data === 'string'
13
+ ? encoder.encode(data)
14
+ : data instanceof Blob
15
+ ? new Uint8Array(await data.arrayBuffer())
16
+ : data instanceof Uint8Array
17
+ ? data
18
+ : new Uint8Array(data),
19
+ };
20
+ }
21
+ const leaf = (name) => name.split(/[\\/]/).pop() ?? name;
22
+ const isRegionSet = (f) => leaf(f.name).toLowerCase() === 'regionset.json';
23
+ const isGeoJson = (f) => /\.geojson$/i.test(f.name);
24
+ const isJson = (f) => /\.json$/i.test(f.name);
25
+ /**
26
+ * What `files` import as: a label volume (`.nii`, `.nii.gz`, `.nrrd`) with the ontology JSON chosen
27
+ * with it (a `regionset.json`, else an Allen `structure_graph*.json`, else any `.json`); several
28
+ * region files (a folder of per-slice `.geojson`, in natural name order, its `regionset.json`
29
+ * apart); or one region file (`.geojson` or `.json`). Null when none of them is one.
30
+ */
31
+ export function planRegionImport(files) {
32
+ const volume = files.find((f) => isLabelVolumeName(f.name));
33
+ if (volume) {
34
+ const jsons = files.filter((f) => f !== volume && isJson(f));
35
+ const ontology = jsons.find(isRegionSet) ??
36
+ jsons.find((f) => /structure_graph.*\.json$/i.test(leaf(f.name))) ??
37
+ jsons[0] ??
38
+ null;
39
+ return { kind: 'volume', volume, ontology };
40
+ }
41
+ const regionSet = files.find(isRegionSet) ?? null;
42
+ const geojsons = files.filter((f) => isGeoJson(f));
43
+ const regionFiles = geojsons.length ? geojsons : files.filter((f) => isJson(f) && !isRegionSet(f));
44
+ if (regionFiles.length > 1 || (regionFiles.length === 1 && regionSet)) {
45
+ const slices = [...regionFiles].sort((a, b) => naturalCompare(leaf(a.name), leaf(b.name)));
46
+ return { kind: 'folder', slices, regionSet };
47
+ }
48
+ return regionFiles.length === 1 ? { kind: 'single', file: regionFiles[0] } : null;
49
+ }
50
+ /** "slice_2" before "slice_10": runs of digits compared as numbers. */
51
+ export function naturalCompare(a, b) {
52
+ return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
53
+ }
54
+ /**
55
+ * A folder slice's GeoJSON with the set's class tree and style (its `regionset.json`) as the
56
+ * collection's own members, unless the file has its own: what a served folder's slice carries.
57
+ */
58
+ export async function folderSliceGeoJson(file, regionSet) {
59
+ const text = await file.text();
60
+ if (!regionSet || (!regionSet.classHierarchy && !regionSet.style))
61
+ return text;
62
+ const doc = JSON.parse(text);
63
+ if (doc['type'] !== 'FeatureCollection')
64
+ return text;
65
+ if (regionSet.classHierarchy && !doc['classHierarchy'])
66
+ doc['classHierarchy'] = regionSet.classHierarchy;
67
+ if (regionSet.style && !doc['style'])
68
+ doc['style'] = regionSet.style;
69
+ return JSON.stringify(doc);
70
+ }
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWltcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWltcG9ydC9yZWdpb24taW1wb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBWW5ELG1HQUFtRztBQUNuRyxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQXNCLEVBQUUsT0FBUSxJQUFhLENBQUMsSUFBSSxJQUFJLEVBQUU7SUFDakYsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsSUFBSTtRQUNKLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUNmLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFDdEIsQ0FBQyxDQUFDLElBQUk7WUFDTixDQUFDLENBQUMsSUFBSSxZQUFZLElBQUk7Z0JBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNiLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFGLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRSxDQUNoQixPQUFPLElBQUksS0FBSyxRQUFRO1lBQ3RCLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUN0QixDQUFDLENBQUMsSUFBSSxZQUFZLElBQUk7Z0JBQ3BCLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDMUMsQ0FBQyxDQUFDLElBQUksWUFBWSxVQUFVO29CQUMxQixDQUFDLENBQUMsSUFBSTtvQkFDTixDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDO0tBQy9CLENBQUM7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QztBQUNwRixDQUFDO0FBRUQsdUVBQXVFO0FBQ3ZFLE1BQU0sVUFBVSxjQUFjLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDakQsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxJQUFzQixFQUN0QixTQUErRDtJQUUvRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQixJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQy9FLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUE0QixDQUFDO0lBQ3hELElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLG1CQUFtQjtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3JELElBQUksU0FBUyxDQUFDLGNBQWMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUM7SUFDekcsSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQ3JFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNMYWJlbFZvbHVtZU5hbWUgfSBmcm9tICcuL2xhYmVsLXZvbHVtZSc7XG5cbi8qKiBBIGZpbGUgdG8gaW1wb3J0IHJlZ2lvbnMgZnJvbTogb25lIHRoZSB1c2VyIGNob3NlLCBvciBvbmUgdGhlIGhvc3QncyBzZXJ2ZXIgc2VudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uSW1wb3J0RmlsZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGV4dCgpOiBQcm9taXNlPHN0cmluZz47XG4gIGJ5dGVzKCk6IFByb21pc2U8VWludDhBcnJheT47XG59XG5cbi8qKiBBIGZpbGUncyBjb250ZW50cyBhcyB0aGUgaG9zdCBtYXkgaGFuZCB0aGVtIG92ZXIgKHNlZSBgU2VydmVyUmVnaW9uUGlja2ApLiAqL1xuZXhwb3J0IHR5cGUgUmVnaW9uSW1wb3J0RGF0YSA9IEJsb2IgfCBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXkgfCBzdHJpbmc7XG5cbi8qKiBgZGF0YWAsIG5hbWVkIGBuYW1lYCwgYXMgYW4gaW1wb3J0IGZpbGUuIEEgYEZpbGVgJ3Mgb3duIG5hbWUgaXMgdXNlZCB3aGVuIGBuYW1lYCBpcyBvbWl0dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltcG9ydEZpbGUoZGF0YTogUmVnaW9uSW1wb3J0RGF0YSwgbmFtZSA9IChkYXRhIGFzIEZpbGUpLm5hbWUgPz8gJycpOiBSZWdpb25JbXBvcnRGaWxlIHtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdGV4dDogYXN5bmMgKCkgPT5cbiAgICAgIHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGRhdGFcbiAgICAgICAgOiBkYXRhIGluc3RhbmNlb2YgQmxvYlxuICAgICAgICAgID8gZGF0YS50ZXh0KClcbiAgICAgICAgICA6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGRhdGEgOiBuZXcgVWludDhBcnJheShkYXRhKSksXG4gICAgYnl0ZXM6IGFzeW5jICgpID0+XG4gICAgICB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBlbmNvZGVyLmVuY29kZShkYXRhKVxuICAgICAgICA6IGRhdGEgaW5zdGFuY2VvZiBCbG9iXG4gICAgICAgICAgPyBuZXcgVWludDhBcnJheShhd2FpdCBkYXRhLmFycmF5QnVmZmVyKCkpXG4gICAgICAgICAgOiBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheVxuICAgICAgICAgICAgPyBkYXRhXG4gICAgICAgICAgICA6IG5ldyBVaW50OEFycmF5KGRhdGEpLFxuICB9O1xufVxuXG4vKiogV2hhdCBhIHNldCBvZiBjaG9zZW4gZmlsZXMgaW1wb3J0cyBhcy4gKi9cbmV4cG9ydCB0eXBlIFJlZ2lvbkltcG9ydFBsYW4gPVxuICAvKiogQSBsYWJlbCB2b2x1bWUsIGl0cyBjbGFzc2VzIG5hbWVkIGJ5IGFuIG9udG9sb2d5IChvciBhIHJlZ2lvbiBzZXQgZGVzY3JpcHRpb24pIGJlc2lkZSBpdC4gKi9cbiAgfCB7IGtpbmQ6ICd2b2x1bWUnOyB2b2x1bWU6IFJlZ2lvbkltcG9ydEZpbGU7IG9udG9sb2d5OiBSZWdpb25JbXBvcnRGaWxlIHwgbnVsbCB9XG4gIC8qKiBBIGZvbGRlciBvZiBwZXItc2xpY2UgcmVnaW9uIGZpbGVzLCBpbiBzbGljZSBvcmRlciwgd2l0aCB0aGUgc2V0J3MgYHJlZ2lvbnNldC5qc29uYC4gKi9cbiAgfCB7IGtpbmQ6ICdmb2xkZXInOyBzbGljZXM6IFJlZ2lvbkltcG9ydEZpbGVbXTsgcmVnaW9uU2V0OiBSZWdpb25JbXBvcnRGaWxlIHwgbnVsbCB9XG4gIC8qKiBPbmUgcmVnaW9uIGZpbGUuICovXG4gIHwgeyBraW5kOiAnc2luZ2xlJzsgZmlsZTogUmVnaW9uSW1wb3J0RmlsZSB9O1xuXG5jb25zdCBsZWFmID0gKG5hbWU6IHN0cmluZykgPT4gbmFtZS5zcGxpdCgvW1xcXFwvXS8pLnBvcCgpID8/IG5hbWU7XG5jb25zdCBpc1JlZ2lvblNldCA9IChmOiBSZWdpb25JbXBvcnRGaWxlKSA9PiBsZWFmKGYubmFtZSkudG9Mb3dlckNhc2UoKSA9PT0gJ3JlZ2lvbnNldC5qc29uJztcbmNvbnN0IGlzR2VvSnNvbiA9IChmOiBSZWdpb25JbXBvcnRGaWxlKSA9PiAvXFwuZ2VvanNvbiQvaS50ZXN0KGYubmFtZSk7XG5jb25zdCBpc0pzb24gPSAoZjogUmVnaW9uSW1wb3J0RmlsZSkgPT4gL1xcLmpzb24kL2kudGVzdChmLm5hbWUpO1xuXG4vKipcbiAqIFdoYXQgYGZpbGVzYCBpbXBvcnQgYXM6IGEgbGFiZWwgdm9sdW1lIChgLm5paWAsIGAubmlpLmd6YCwgYC5ucnJkYCkgd2l0aCB0aGUgb250b2xvZ3kgSlNPTiBjaG9zZW5cbiAqIHdpdGggaXQgKGEgYHJlZ2lvbnNldC5qc29uYCwgZWxzZSBhbiBBbGxlbiBgc3RydWN0dXJlX2dyYXBoKi5qc29uYCwgZWxzZSBhbnkgYC5qc29uYCk7IHNldmVyYWxcbiAqIHJlZ2lvbiBmaWxlcyAoYSBmb2xkZXIgb2YgcGVyLXNsaWNlIGAuZ2VvanNvbmAsIGluIG5hdHVyYWwgbmFtZSBvcmRlciwgaXRzIGByZWdpb25zZXQuanNvbmBcbiAqIGFwYXJ0KTsgb3Igb25lIHJlZ2lvbiBmaWxlIChgLmdlb2pzb25gIG9yIGAuanNvbmApLiBOdWxsIHdoZW4gbm9uZSBvZiB0aGVtIGlzIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYW5SZWdpb25JbXBvcnQoZmlsZXM6IHJlYWRvbmx5IFJlZ2lvbkltcG9ydEZpbGVbXSk6IFJlZ2lvbkltcG9ydFBsYW4gfCBudWxsIHtcbiAgY29uc3Qgdm9sdW1lID0gZmlsZXMuZmluZCgoZikgPT4gaXNMYWJlbFZvbHVtZU5hbWUoZi5uYW1lKSk7XG4gIGlmICh2b2x1bWUpIHtcbiAgICBjb25zdCBqc29ucyA9IGZpbGVzLmZpbHRlcigoZikgPT4gZiAhPT0gdm9sdW1lICYmIGlzSnNvbihmKSk7XG4gICAgY29uc3Qgb250b2xvZ3kgPVxuICAgICAganNvbnMuZmluZChpc1JlZ2lvblNldCkgPz9cbiAgICAgIGpzb25zLmZpbmQoKGYpID0+IC9zdHJ1Y3R1cmVfZ3JhcGguKlxcLmpzb24kL2kudGVzdChsZWFmKGYubmFtZSkpKSA/P1xuICAgICAganNvbnNbMF0gPz9cbiAgICAgIG51bGw7XG4gICAgcmV0dXJuIHsga2luZDogJ3ZvbHVtZScsIHZvbHVtZSwgb250b2xvZ3kgfTtcbiAgfVxuICBjb25zdCByZWdpb25TZXQgPSBmaWxlcy5maW5kKGlzUmVnaW9uU2V0KSA/PyBudWxsO1xuICBjb25zdCBnZW9qc29ucyA9IGZpbGVzLmZpbHRlcigoZikgPT4gaXNHZW9Kc29uKGYpKTtcbiAgY29uc3QgcmVnaW9uRmlsZXMgPSBnZW9qc29ucy5sZW5ndGggPyBnZW9qc29ucyA6IGZpbGVzLmZpbHRlcigoZikgPT4gaXNKc29uKGYpICYmICFpc1JlZ2lvblNldChmKSk7XG4gIGlmIChyZWdpb25GaWxlcy5sZW5ndGggPiAxIHx8IChyZWdpb25GaWxlcy5sZW5ndGggPT09IDEgJiYgcmVnaW9uU2V0KSkge1xuICAgIGNvbnN0IHNsaWNlcyA9IFsuLi5yZWdpb25GaWxlc10uc29ydCgoYSwgYikgPT4gbmF0dXJhbENvbXBhcmUobGVhZihhLm5hbWUpLCBsZWFmKGIubmFtZSkpKTtcbiAgICByZXR1cm4geyBraW5kOiAnZm9sZGVyJywgc2xpY2VzLCByZWdpb25TZXQgfTtcbiAgfVxuICByZXR1cm4gcmVnaW9uRmlsZXMubGVuZ3RoID09PSAxID8geyBraW5kOiAnc2luZ2xlJywgZmlsZTogcmVnaW9uRmlsZXNbMF0gfSA6IG51bGw7XG59XG5cbi8qKiBcInNsaWNlXzJcIiBiZWZvcmUgXCJzbGljZV8xMFwiOiBydW5zIG9mIGRpZ2l0cyBjb21wYXJlZCBhcyBudW1iZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdHVyYWxDb21wYXJlKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6ICdiYXNlJyB9KTtcbn1cblxuLyoqXG4gKiBBIGZvbGRlciBzbGljZSdzIEdlb0pTT04gd2l0aCB0aGUgc2V0J3MgY2xhc3MgdHJlZSBhbmQgc3R5bGUgKGl0cyBgcmVnaW9uc2V0Lmpzb25gKSBhcyB0aGVcbiAqIGNvbGxlY3Rpb24ncyBvd24gbWVtYmVycywgdW5sZXNzIHRoZSBmaWxlIGhhcyBpdHMgb3duOiB3aGF0IGEgc2VydmVkIGZvbGRlcidzIHNsaWNlIGNhcnJpZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmb2xkZXJTbGljZUdlb0pzb24oXG4gIGZpbGU6IFJlZ2lvbkltcG9ydEZpbGUsXG4gIHJlZ2lvblNldDogeyBjbGFzc0hpZXJhcmNoeT86IHVua25vd247IHN0eWxlPzogdW5rbm93biB9IHwgbnVsbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKTtcbiAgaWYgKCFyZWdpb25TZXQgfHwgKCFyZWdpb25TZXQuY2xhc3NIaWVyYXJjaHkgJiYgIXJlZ2lvblNldC5zdHlsZSkpIHJldHVybiB0ZXh0O1xuICBjb25zdCBkb2MgPSBKU09OLnBhcnNlKHRleHQpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAoZG9jWyd0eXBlJ10gIT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHJldHVybiB0ZXh0O1xuICBpZiAocmVnaW9uU2V0LmNsYXNzSGllcmFyY2h5ICYmICFkb2NbJ2NsYXNzSGllcmFyY2h5J10pIGRvY1snY2xhc3NIaWVyYXJjaHknXSA9IHJlZ2lvblNldC5jbGFzc0hpZXJhcmNoeTtcbiAgaWYgKHJlZ2lvblNldC5zdHlsZSAmJiAhZG9jWydzdHlsZSddKSBkb2NbJ3N0eWxlJ10gPSByZWdpb25TZXQuc3R5bGU7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShkb2MpO1xufVxuIl19