@jax-data-science/sci-image-visualizer 0.2.8 → 0.2.10

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 CHANGED
@@ -23,12 +23,16 @@ export * from './lib/contracts/display-types';
23
23
  export * from './lib/contracts/sam.contract';
24
24
  export * from './lib/contracts/cell-segmenter.contract';
25
25
  export { CellposeSegmenterService } from './lib/toolbar/segmentation/cellpose-segmenter.service';
26
+ export * from './lib/contracts/instance-segmenter.contract';
27
+ export { YoloSegmenterService } from './lib/toolbar/segmentation/yolo-segmenter.service';
26
28
  // ── Generic client-side image utilities (shared with the host's pipeline) ──
27
29
  export { ProcessingImage } from './lib/processing/processing-image';
28
30
  export { cropImage } from './lib/processing/image-crop';
29
31
  export { ImageConverterService } from './lib/processing/image-converter.service';
30
32
  // ── SAM model registry (host configures hosted ONNX URLs once available) ──
31
33
  export { SAM_MODELS, DEFAULT_SAM_MODEL_ID, getSamModel, isSamModelReady, setSamModelUrls, setDefaultSamModel, getDefaultSamModelId, } from './lib/toolbar/segmentation/sam-model-registry';
34
+ // ── YOLO instance-segmentation model registry (same repointing story) ─────
35
+ export { YOLO_MODELS, DEFAULT_YOLO_MODEL_ID, getYoloModel, isYoloModelReady, setYoloModelUrls, setDefaultYoloModel, getDefaultYoloModelId, } from './lib/toolbar/segmentation/yolo-model-registry';
32
36
  // ── onnxruntime-web WASM location (host overrides once, at app init) ───────
33
37
  export { setOrtWasmBase, getOrtWasmBase } from './lib/toolbar/segmentation/ort-runtime-config';
34
38
  // ── Neutral data models ──────────────────────────────────────────────────
@@ -49,4 +53,4 @@ export { VisualizerComponent } from './lib/visualizer.component';
49
53
  export { RegionEditorComponent } from './lib/region-editor/region-editor.component';
50
54
  export { HexColorPickerComponent } from './lib/hex-color-picker/hex-color-picker.component';
51
55
  export { ChannelHistogramComponent } from './lib/channel-histogram/channel-histogram.component';
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsNEVBQTRFO0FBQzVFLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFFakcsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFvQixNQUFNLDZCQUE2QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRWpGLDZFQUE2RTtBQUM3RSxPQUFPLEVBQ0wsVUFBVSxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUMvRSxrQkFBa0IsRUFBRSxvQkFBb0IsR0FDekMsTUFBTSwrQ0FBK0MsQ0FBQztBQUV2RCw4RUFBOEU7QUFDOUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUUvRiw0RUFBNEU7QUFDNUUsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCw0RUFBNEU7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUUsNkVBQTZFO0FBQzdFLG1FQUFtRTtBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVuRSw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLDhFQUE4RTtBQUM5RSw2REFBNkQ7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDNUYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scURBQXFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1YmxpYyBBUEkgb2YgdGhlIGpheC1pbWFnZS12aXN1YWxpemF0aW9uIGxpYnJhcnkuIEV4dGVybmFsIGNvbnN1bWVycyBpbXBvcnRcbiAqIE9OTFkgZnJvbSBoZXJlIChgQGpheC1kYXRhLXNjaWVuY2Uvc2NpLWltYWdlLXZpc3VhbGl6ZXJgKTsgZXZlcnl0aGluZyBlbHNlIHVuZGVyIGBsaWIvYCBpc1xuICogaW50ZXJuYWwuIFRoZSBzdXJmYWNlIGlzIGNvbnRyYWN0cyArIHRva2VucyArIG5ldXRyYWwgbW9kZWxzICsgdGhlIEFuZ3VsYXJcbiAqIG1vZHVsZSwgcGx1cyB0aGUgcm91dGluZyBzZXJ2aWNlIHRoZSBob3N0J3MgY29tcG9zaXRpb24gcm9vdCBiaW5kcyB0aGUgdG9rZW5zXG4gKiB0byAoYHVzZUV4aXN0aW5nYCkuXG4gKi9cblxuLy8g4pSA4pSAIENvbnRyYWN0cyAmIERJIHRva2VucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcG9ydHMvaW1hZ2Utc3RhdGUucG9ydCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcG9ydHMvcmVnaW9uLWlvLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3ByZWZlcmVuY2VzLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvdG9vbGJhci1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvY2VsbC1zZWdtZW50ZXIuY29udHJhY3QnO1xuZXhwb3J0IHsgQ2VsbHBvc2VTZWdtZW50ZXJTZXJ2aWNlIH0gZnJvbSAnLi9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbHBvc2Utc2VnbWVudGVyLnNlcnZpY2UnO1xuXG4vLyDilIDilIAgR2VuZXJpYyBjbGllbnQtc2lkZSBpbWFnZSB1dGlsaXRpZXMgKHNoYXJlZCB3aXRoIHRoZSBob3N0J3MgcGlwZWxpbmUpIOKUgOKUgFxuZXhwb3J0IHsgUHJvY2Vzc2luZ0ltYWdlIH0gZnJvbSAnLi9saWIvcHJvY2Vzc2luZy9wcm9jZXNzaW5nLWltYWdlJztcbmV4cG9ydCB7IGNyb3BJbWFnZSwgQ3JvcEltYWdlT3B0aW9ucyB9IGZyb20gJy4vbGliL3Byb2Nlc3NpbmcvaW1hZ2UtY3JvcCc7XG5leHBvcnQgeyBJbWFnZUNvbnZlcnRlclNlcnZpY2UgfSBmcm9tICcuL2xpYi9wcm9jZXNzaW5nL2ltYWdlLWNvbnZlcnRlci5zZXJ2aWNlJztcblxuLy8g4pSA4pSAIFNBTSBtb2RlbCByZWdpc3RyeSAoaG9zdCBjb25maWd1cmVzIGhvc3RlZCBPTk5YIFVSTHMgb25jZSBhdmFpbGFibGUpIOKUgOKUgFxuZXhwb3J0IHtcbiAgU0FNX01PREVMUywgREVGQVVMVF9TQU1fTU9ERUxfSUQsIGdldFNhbU1vZGVsLCBpc1NhbU1vZGVsUmVhZHksIHNldFNhbU1vZGVsVXJscyxcbiAgc2V0RGVmYXVsdFNhbU1vZGVsLCBnZXREZWZhdWx0U2FtTW9kZWxJZCxcbn0gZnJvbSAnLi9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLW1vZGVsLXJlZ2lzdHJ5JztcblxuLy8g4pSA4pSAIG9ubnhydW50aW1lLXdlYiBXQVNNIGxvY2F0aW9uIChob3N0IG92ZXJyaWRlcyBvbmNlLCBhdCBhcHAgaW5pdCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgeyBzZXRPcnRXYXNtQmFzZSwgZ2V0T3J0V2FzbUJhc2UgfSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9vcnQtcnVudGltZS1jb25maWcnO1xuXG4vLyDilIDilIAgTmV1dHJhbCBkYXRhIG1vZGVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9yZWdpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2NsYXNzLXByZXNldCc7XG5leHBvcnQgeyBTaGFwZVNlbGVjdGlvbiB9IGZyb20gJy4vbGliL21vZGVscy9zaGFwZSc7XG5cbi8vIOKUgOKUgCBBbmd1bGFyIG1vZHVsZSArIGNvbXBvc2l0aW9uLXJvb3Qgc2VydmljZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCB7IFZpc3VhbGl6YXRpb25Nb2R1bGUgfSBmcm9tICcuL2xpYi92aXN1YWxpemF0aW9uLm1vZHVsZSc7XG5leHBvcnQgeyBSb3V0aW5nVmlzdWFsaXplclNlcnZpY2UgfSBmcm9tICcuL2xpYi9yb3V0aW5nLXZpc3VhbGl6ZXIuc2VydmljZSc7XG4vLyBQcm92aWRlciBmYWN0b3J5IGZvciBhbiBpc29sYXRlZCwgY29tcG9uZW50LXNjb3BlZCB2aWV3ZXIgaW5zdGFuY2UgKGUuZy4gYVxuLy8gbW9kYWwgdGhhdCBtdXN0IG5vdCBzaGFyZSB0aGUgbWFpbiB2aWV3ZXIncyByZWdpb24vaW1hZ2Ugc3RhdGUpLlxuZXhwb3J0IHsgcHJvdmlkZVZpc3VhbGl6YXRpb24gfSBmcm9tICcuL2xpYi9wcm92aWRlLXZpc3VhbGl6YXRpb24nO1xuXG4vLyDilIDilIAgUHVibGljIGNvbXBvbmVudHMgKGV4cG9ydGVkIGJ5IFZpc3VhbGl6YXRpb25Nb2R1bGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gbmctcGFja2FnciByZXF1aXJlcyBtb2R1bGUtZXhwb3J0ZWQgY29tcG9uZW50cyB0byBiZSByZWFjaGFibGUgZnJvbSB0aGVcbi8vIGVudHJ5IHBvaW50IHNvIGNvbnN1bWVycyBnZXQgdGhlaXIgdHlwZXM7IHRoZXNlIGFyZSB0aGUgZW1iZWRkYWJsZSBlbGVtZW50c1xuLy8gKGA8dmlzdWFsaXplcj5gLCBgPHJlZ2lvbi1lZGl0b3I+YCwgYDxoZXgtY29sb3ItcGlja2VyPmApLlxuZXhwb3J0IHsgVmlzdWFsaXplckNvbXBvbmVudCB9IGZyb20gJy4vbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50JztcbmV4cG9ydCB7IFJlZ2lvbkVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQnO1xuZXhwb3J0IHsgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2xpYi9oZXgtY29sb3ItcGlja2VyL2hleC1jb2xvci1waWNrZXIuY29tcG9uZW50JztcbmV4cG9ydCB7IENoYW5uZWxIaXN0b2dyYW1Db21wb25lbnQgfSBmcm9tICcuL2xpYi9jaGFubmVsLWhpc3RvZ3JhbS9jaGFubmVsLWhpc3RvZ3JhbS5jb21wb25lbnQnO1xuIl19
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsNEVBQTRFO0FBQzVFLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDakcsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUV6Riw4RUFBOEU7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sNkJBQTZCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFakYsNkVBQTZFO0FBQzdFLE9BQU8sRUFDTCxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQy9FLGtCQUFrQixFQUFFLG9CQUFvQixHQUN6QyxNQUFNLCtDQUErQyxDQUFDO0FBRXZELDZFQUE2RTtBQUM3RSxPQUFPLEVBQ0wsV0FBVyxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDcEYsbUJBQW1CLEVBQUUscUJBQXFCLEdBQzNDLE1BQU0sZ0RBQWdELENBQUM7QUFFeEQsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFL0YsNEVBQTRFO0FBQzVFLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsNEVBQTRFO0FBQzVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLDZFQUE2RTtBQUM3RSxtRUFBbUU7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbkUsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsNkRBQTZEO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIG9mIHRoZSBqYXgtaW1hZ2UtdmlzdWFsaXphdGlvbiBsaWJyYXJ5LiBFeHRlcm5hbCBjb25zdW1lcnMgaW1wb3J0XG4gKiBPTkxZIGZyb20gaGVyZSAoYEBqYXgtZGF0YS1zY2llbmNlL3NjaS1pbWFnZS12aXN1YWxpemVyYCk7IGV2ZXJ5dGhpbmcgZWxzZSB1bmRlciBgbGliL2AgaXNcbiAqIGludGVybmFsLiBUaGUgc3VyZmFjZSBpcyBjb250cmFjdHMgKyB0b2tlbnMgKyBuZXV0cmFsIG1vZGVscyArIHRoZSBBbmd1bGFyXG4gKiBtb2R1bGUsIHBsdXMgdGhlIHJvdXRpbmcgc2VydmljZSB0aGUgaG9zdCdzIGNvbXBvc2l0aW9uIHJvb3QgYmluZHMgdGhlIHRva2Vuc1xuICogdG8gKGB1c2VFeGlzdGluZ2ApLlxuICovXG5cbi8vIOKUgOKUgCBDb250cmFjdHMgJiBESSB0b2tlbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcmVnaW9uLWVkaXRvci1hcGkuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL2ltYWdlLXN0YXRlLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3JlZ2lvbi1pby5wb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9wb3J0cy9wcmVmZXJlbmNlcy5wb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Zpei1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Rvb2xiYXItY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9zYW0uY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmV4cG9ydCB7IENlbGxwb3NlU2VnbWVudGVyU2VydmljZSB9IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGxwb3NlLXNlZ21lbnRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9pbnN0YW5jZS1zZWdtZW50ZXIuY29udHJhY3QnO1xuZXhwb3J0IHsgWW9sb1NlZ21lbnRlclNlcnZpY2UgfSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi95b2xvLXNlZ21lbnRlci5zZXJ2aWNlJztcblxuLy8g4pSA4pSAIEdlbmVyaWMgY2xpZW50LXNpZGUgaW1hZ2UgdXRpbGl0aWVzIChzaGFyZWQgd2l0aCB0aGUgaG9zdCdzIHBpcGVsaW5lKSDilIDilIBcbmV4cG9ydCB7IFByb2Nlc3NpbmdJbWFnZSB9IGZyb20gJy4vbGliL3Byb2Nlc3NpbmcvcHJvY2Vzc2luZy1pbWFnZSc7XG5leHBvcnQgeyBjcm9wSW1hZ2UsIENyb3BJbWFnZU9wdGlvbnMgfSBmcm9tICcuL2xpYi9wcm9jZXNzaW5nL2ltYWdlLWNyb3AnO1xuZXhwb3J0IHsgSW1hZ2VDb252ZXJ0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9saWIvcHJvY2Vzc2luZy9pbWFnZS1jb252ZXJ0ZXIuc2VydmljZSc7XG5cbi8vIOKUgOKUgCBTQU0gbW9kZWwgcmVnaXN0cnkgKGhvc3QgY29uZmlndXJlcyBob3N0ZWQgT05OWCBVUkxzIG9uY2UgYXZhaWxhYmxlKSDilIDilIBcbmV4cG9ydCB7XG4gIFNBTV9NT0RFTFMsIERFRkFVTFRfU0FNX01PREVMX0lELCBnZXRTYW1Nb2RlbCwgaXNTYW1Nb2RlbFJlYWR5LCBzZXRTYW1Nb2RlbFVybHMsXG4gIHNldERlZmF1bHRTYW1Nb2RlbCwgZ2V0RGVmYXVsdFNhbU1vZGVsSWQsXG59IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5cbi8vIOKUgOKUgCBZT0xPIGluc3RhbmNlLXNlZ21lbnRhdGlvbiBtb2RlbCByZWdpc3RyeSAoc2FtZSByZXBvaW50aW5nIHN0b3J5KSDilIDilIDilIDilIDilIBcbmV4cG9ydCB7XG4gIFlPTE9fTU9ERUxTLCBERUZBVUxUX1lPTE9fTU9ERUxfSUQsIGdldFlvbG9Nb2RlbCwgaXNZb2xvTW9kZWxSZWFkeSwgc2V0WW9sb01vZGVsVXJscyxcbiAgc2V0RGVmYXVsdFlvbG9Nb2RlbCwgZ2V0RGVmYXVsdFlvbG9Nb2RlbElkLCBZb2xvTW9kZWxEZWYsXG59IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3lvbG8tbW9kZWwtcmVnaXN0cnknO1xuXG4vLyDilIDilIAgb25ueHJ1bnRpbWUtd2ViIFdBU00gbG9jYXRpb24gKGhvc3Qgb3ZlcnJpZGVzIG9uY2UsIGF0IGFwcCBpbml0KSDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCB7IHNldE9ydFdhc21CYXNlLCBnZXRPcnRXYXNtQmFzZSB9IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL29ydC1ydW50aW1lLWNvbmZpZyc7XG5cbi8vIOKUgOKUgCBOZXV0cmFsIGRhdGEgbW9kZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL3JlZ2lvbic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmV4cG9ydCB7IFNoYXBlU2VsZWN0aW9uIH0gZnJvbSAnLi9saWIvbW9kZWxzL3NoYXBlJztcblxuLy8g4pSA4pSAIEFuZ3VsYXIgbW9kdWxlICsgY29tcG9zaXRpb24tcm9vdCBzZXJ2aWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0IHsgVmlzdWFsaXphdGlvbk1vZHVsZSB9IGZyb20gJy4vbGliL3Zpc3VhbGl6YXRpb24ubW9kdWxlJztcbmV4cG9ydCB7IFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlJztcbi8vIFByb3ZpZGVyIGZhY3RvcnkgZm9yIGFuIGlzb2xhdGVkLCBjb21wb25lbnQtc2NvcGVkIHZpZXdlciBpbnN0YW5jZSAoZS5nLiBhXG4vLyBtb2RhbCB0aGF0IG11c3Qgbm90IHNoYXJlIHRoZSBtYWluIHZpZXdlcidzIHJlZ2lvbi9pbWFnZSBzdGF0ZSkuXG5leHBvcnQgeyBwcm92aWRlVmlzdWFsaXphdGlvbiB9IGZyb20gJy4vbGliL3Byb3ZpZGUtdmlzdWFsaXphdGlvbic7XG5cbi8vIOKUgOKUgCBQdWJsaWMgY29tcG9uZW50cyAoZXhwb3J0ZWQgYnkgVmlzdWFsaXphdGlvbk1vZHVsZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBuZy1wYWNrYWdyIHJlcXVpcmVzIG1vZHVsZS1leHBvcnRlZCBjb21wb25lbnRzIHRvIGJlIHJlYWNoYWJsZSBmcm9tIHRoZVxuLy8gZW50cnkgcG9pbnQgc28gY29uc3VtZXJzIGdldCB0aGVpciB0eXBlczsgdGhlc2UgYXJlIHRoZSBlbWJlZGRhYmxlIGVsZW1lbnRzXG4vLyAoYDx2aXN1YWxpemVyPmAsIGA8cmVnaW9uLWVkaXRvcj5gLCBgPGhleC1jb2xvci1waWNrZXI+YCkuXG5leHBvcnQgeyBWaXN1YWxpemVyQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvdmlzdWFsaXplci5jb21wb25lbnQnO1xuZXhwb3J0IHsgUmVnaW9uRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvcmVnaW9uLWVkaXRvci9yZWdpb24tZWRpdG9yLmNvbXBvbmVudCc7XG5leHBvcnQgeyBIZXhDb2xvclBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vbGliL2hleC1jb2xvci1waWNrZXIvaGV4LWNvbG9yLXBpY2tlci5jb21wb25lbnQnO1xuZXhwb3J0IHsgQ2hhbm5lbEhpc3RvZ3JhbUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NoYW5uZWwtaGlzdG9ncmFtL2NoYW5uZWwtaGlzdG9ncmFtLmNvbXBvbmVudCc7XG4iXX0=
@@ -0,0 +1,12 @@
1
+ import { InjectionToken, inject } from '@angular/core';
2
+ import { YoloSegmenterService } from '../toolbar/segmentation/yolo-segmenter.service';
3
+ /**
4
+ * DI token for the automatic instance segmenter. Defaults to the in-library
5
+ * {@link YoloSegmenterService} (yolo-segdetect-js, lazy-loaded); override it in
6
+ * the host to swap implementations — for example to delegate to the server.
7
+ */
8
+ export const INSTANCE_SEGMENTER = new InjectionToken('INSTANCE_SEGMENTER', {
9
+ providedIn: 'root',
10
+ factory: () => inject(YoloSegmenterService),
11
+ });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFuY2Utc2VnbWVudGVyLmNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdHMvaW5zdGFuY2Utc2VnbWVudGVyLmNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBK0h0Rjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQXFCLG9CQUFvQixFQUFFO0lBQzdGLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUM7Q0FDNUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBZb2xvU2VnbWVudGVyU2VydmljZSB9IGZyb20gJy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3lvbG8tc2VnbWVudGVyLnNlcnZpY2UnO1xuXG4vKipcbiAqIFBvcnQgZm9yIGFuIGF1dG9tYXRpYyAqKmluc3RhbmNlKiogc2VnbWVudGVyIOKAlCBvbmUgdGhhdCByZXR1cm5zIGRpc2NyZXRlLFxuICogY2xhc3NpZmllZCBvYmplY3RzIHJhdGhlciB0aGFuIGEgcGVyLXBpeGVsIGxhYmVsIG1hcC5cbiAqXG4gKiBUaGlzIGlzIGEgc2libGluZyBvZiB7QGxpbmsgSUNlbGxTZWdtZW50ZXJ9LCBub3QgYSByZXBsYWNlbWVudC4gQ2VsbHBvc2Utc3R5bGVcbiAqIHNlZ21lbnRlcnMgcHJvZHVjZSBvbmUgZXhjbHVzaXZlIGxhYmVsIHBlciBwaXhlbCwgd2hpY2ggaXMgZXhhY3RseSByaWdodCBmb3JcbiAqIGRlbnNlbHkgcGFja2VkIGNlbGxzOyBhIGRldGVjdG9yIGxpa2UgWU9MTyBwcm9kdWNlcyBvdmVybGFwcGluZyBpbnN0YW5jZXMsXG4gKiBlYWNoIHdpdGggaXRzIG93biBjbGFzcyBhbmQgY29uZmlkZW5jZSwgYW5kIGZsYXR0ZW5pbmcgdGhvc2UgaW50byBhIGxhYmVsIG1hcFxuICogd291bGQgc2lsZW50bHkgZGlzY2FyZCBib3RoIHRoZSBvdmVybGFwIGFuZCB0aGUgY2xhc3NpZmljYXRpb24uIFRoZSB0d29cbiAqIG91dHB1dHMgYXJlIGdlbnVpbmVseSBkaWZmZXJlbnQgc2hhcGVzLCBzbyB0aGV5IGdldCBkaWZmZXJlbnQgcG9ydHMuXG4gKlxuICogR2VvbWV0cnkgaXMgcmV0dXJuZWQgYXMgcG9seWdvbiByaW5ncyBpbiAqKmltYWdlIHBpeGVscyoqLCByZWFkeSB0byBiZWNvbWVcbiAqIHtAbGluayBSZWdpb259cyB3aXRob3V0IGEgc2Vjb25kIGNvbnZlcnNpb24gc3RlcC5cbiAqL1xuXG4vKiogQSBjbG9zZWQgcmluZzsgdGhlIGxhc3QgcG9pbnQgaXMgTk9UIGEgcmVwZWF0IG9mIHRoZSBmaXJzdC4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlUmluZyA9IEFycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuXG4vKiogT25lIHBvbHlnb24gd2l0aCBvcHRpb25hbCBpbnRlcmlvciByaW5ncyAoZG9udXQgaG9sZXMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YW5jZVBvbHlnb24ge1xuICBleHRlcmlvcjogSW5zdGFuY2VSaW5nO1xuICBob2xlczogSW5zdGFuY2VSaW5nW107XG59XG5cbi8qKiBPbmUgZGV0ZWN0ZWQgb2JqZWN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YW5jZURldGVjdGlvbiB7XG4gIC8qKlxuICAgKiBPdXRsaW5lKHMpIG9mIHRoaXMgaW5zdGFuY2UuIFVzdWFsbHkgb25lLCBidXQgYSBtYXNrIHRoYXQgc3BsaXRzIHVuZGVyXG4gICAqIHRocmVzaG9sZGluZyB5aWVsZHMgc2V2ZXJhbCDigJQgdGhleSBhbGwgYmVsb25nIHRvIHRoZSBzYW1lIGRldGVjdGlvbi5cbiAgICovXG4gIHBvbHlnb25zOiBJbnN0YW5jZVBvbHlnb25bXTtcbiAgLyoqIGBbeDEsIHkxLCB4MiwgeTJdYCBpbiBpbWFnZSBwaXhlbHMuICovXG4gIGJveDogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIC8qKiBNb2RlbCBjb25maWRlbmNlLCAwLi4xLiAqL1xuICBzY29yZTogbnVtYmVyO1xuICBjbGFzc0lkOiBudW1iZXI7XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlU2VnbWVudGF0aW9uIHtcbiAgZGV0ZWN0aW9uczogSW5zdGFuY2VEZXRlY3Rpb25bXTtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIC8qKiBDbGFzcyBuYW1lcyBpbmRleGVkIGJ5IGNsYXNzIGlkLCBmcm9tIHRoZSBtb2RlbCdzIG93biBtZXRhZGF0YS4gKi9cbiAgY2xhc3NOYW1lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVHVuYWJsZXMgZm9yIG9uZSBydW4uXG4gKlxuICogVGhyZWUgc2VwYXJhdGUgdGhyZXNob2xkcyBhcmUgaW4gcGxheSBhbmQgdGhleSBhcmUgZWFzeSB0byBjb25mbGF0ZTpcbiAqIGBjb25maWRlbmNlYCBhbmQgYGlvdVRocmVzaG9sZGAgYWN0IHBlciB0aWxlLCB3aGlsZSBgbWVyZ2VUaHJlc2hvbGRgIGdvdmVybnNcbiAqIHRoZSBjcm9zcy10aWxlIHJlY29uY2lsaWF0aW9uLiBUaGV5IGNvbWUgZnJvbSBkaWZmZXJlbnQgc3RhZ2VzIG9mIHRoZVxuICogcGlwZWxpbmUgYW5kIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlU2VnbWVudE9wdGlvbnMge1xuICAvKiogV2hpY2ggcmVnaXN0ZXJlZCBtb2RlbCB0byBydW4uIERlZmF1bHRzIHRvIHRoZSByZWdpc3RyeSdzIGRlZmF1bHQuICovXG4gIG1vZGVsSWQ/OiBzdHJpbmc7XG4gIC8qKiBNaW5pbXVtIGRldGVjdGlvbiBjb25maWRlbmNlLCBwZXIgdGlsZS4gKi9cbiAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgLyoqIE5NUyBJb1Ugd2l0aGluIGEgc2luZ2xlIHRpbGUuICovXG4gIGlvdVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIEludGVyc2VjdGlvbi1vdmVyLXNtYWxsZXIgdGhyZXNob2xkIGZvciBtZXJnaW5nIGFjcm9zcyB0aWxlIHNlYW1zLiAqL1xuICBtZXJnZVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIFRpbGUgb3ZlcmxhcCwgcGVyY2VudC4gKi9cbiAgb3ZlcmxhcFg/OiBudW1iZXI7XG4gIG92ZXJsYXBZPzogbnVtYmVyO1xuICAvKiogUHJvYmFiaWxpdHkgYXQgd2hpY2ggYSBtYXNrIHBpeGVsIGNvdW50cyBhcyBpbnNpZGUuICovXG4gIG1hc2tUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBDYXAgb24gZGV0ZWN0aW9ucyBwZXIgdGlsZS4gKi9cbiAgbWF4RGV0ZWN0aW9ucz86IG51bWJlcjtcbiAgLyoqIEtlZXAgb25seSB0aGVzZSBjbGFzcyBpZHM7IG9taXQgZm9yIGFsbCBjbGFzc2VzIHRoZSBtb2RlbCBkZWNsYXJlcy4gKi9cbiAgY2xhc3NGaWx0ZXI/OiBudW1iZXJbXTtcbiAgLyoqIERvdWdsYXMtUGV1Y2tlciB0b2xlcmFuY2UgaW4gcGl4ZWxzIGZvciBvdXRsaW5lIHNpbXBsaWZpY2F0aW9uOyAwIGRpc2FibGVzLiAqL1xuICBzaW1wbGlmeVRvbGVyYW5jZT86IG51bWJlcjtcbiAgLyoqIERyb3AgaW5zdGFuY2VzIHdob3NlIG91dGxpbmUgYXJlYSBpcyBiZWxvdyB0aGlzLCBpbiBzcXVhcmUgcGl4ZWxzLiAqL1xuICBtaW5BcmVhPzogbnVtYmVyO1xuICAvKipcbiAgICogU2V0IGZhbHNlIHRvIGRldGVjdCBib3hlcyB3aXRob3V0IGFzc2VtYmxpbmcgbWFza3Mg4oCUIHN1YnN0YW50aWFsbHkgZmFzdGVyLFxuICAgKiBzaW5jZSBtYXNrIGFzc2VtYmx5IGRvbWluYXRlcyB0aGUgY29zdCBvZiBhIHJ1bi4gRGV0ZWN0aW9ucyB0aGVuIGNhcnJ5IGFcbiAgICogYm94IGFuZCBjbGFzcyBidXQgbm8gb3V0bGluZSwgc28gbm90aGluZyBjYW4gYmUgY29tbWl0dGVkIGFzIGEgcmVnaW9uLlxuICAgKi9cbiAgd2l0aE1hc2tzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFib3J0IGFuIGluLXByb2dyZXNzIHJ1bi5cbiAgICpcbiAgICogQ2FuY2VsbGF0aW9uIGlzIGNvb3BlcmF0aXZlIGFuZCBjaGVja2VkIGF0IHRpbGUgYm91bmRhcmllcywgc28gaXQgdGFrZXNcbiAgICogZWZmZWN0IHdpdGhpbiByb3VnaGx5IG9uZSB0aWxlIHJhdGhlciB0aGFuIGluc3RhbnRseSDigJQgYSBgc2Vzc2lvbi5ydW4oKWBcbiAgICogYWxyZWFkeSBpbiBmbGlnaHQgY2Fubm90IGJlIGludGVycnVwdGVkLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogUHJvZ3Jlc3Mvc3RhdHVzIGNhbGxiYWNrcyAoYWxsIG9wdGlvbmFsKS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbWlycm9ycyB7QGxpbmsgQ2VsbFNlZ21lbnRQcm9ncmVzc30gaW4gc2hhcGUgcmF0aGVyIHRoYW4gaW1wb3J0aW5nXG4gKiBpdCDigJQgdGhlIHR3byBjb250cmFjdHMgc3RheSBpbmRlcGVuZGVudGx5IHZlcnNpb25hYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlU2VnbWVudFByb2dyZXNzIHtcbiAgLyoqIE1vZGVsLWRvd25sb2FkIHByb2dyZXNzLCAwLi4xIChmaXJzdCBydW4gb25seSkuICovXG4gIG9uUHJvZ3Jlc3M/OiAoZnJhY3Rpb246IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFJhdyBkb3dubG9hZCBieXRlIGNvdW50cywgZm9yIGhvc3RzIHRoYXQgcmVuZGVyIGEgc2l6ZSAoXCIxNDIgLyAyODcgTUJcIilcbiAgICogcmF0aGVyIHRoYW4gYSBiYXJlIHBlcmNlbnRhZ2UuIGB0b3RhbGAgaXMgbnVsbCB3aGVuIHRoZSByZXNwb25zZSBjYXJyaWVkIG5vXG4gICAqIENvbnRlbnQtTGVuZ3RoLlxuICAgKlxuICAgKiBBIGZyYWN0aW9uIGFsb25lIGNhbm5vdCBiZSB0dXJuZWQgYmFjayBpbnRvIGJ5dGVzLCBzbyBhIGhvc3QgZ2l2ZW4gb25seVxuICAgKiB7QGxpbmsgb25Qcm9ncmVzc30gaGFzIHRvIGludmVudCB0aGUgbnVtYmVycyDigJQgd2hpY2ggcmVhZHMgYXMgXCIwIE1CIC8gMCBNQlwiXG4gICAqIHRoZSBtb21lbnQgaXQgZG9lcy5cbiAgICovXG4gIG9uQnl0ZXM/OiAobG9hZGVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIgfCBudWxsKSA9PiB2b2lkO1xuICAvKiogSHVtYW4tcmVhZGFibGUgcGhhc2UsIGUuZy4gJ1J1bm5pbmcgaW5mZXJlbmNlICh0aWxlIDMvOCnigKYnLiAqL1xuICBvblN0YXR1cz86IChzdGF0dXM6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW5zdGFuY2VTZWdtZW50ZXIge1xuICAvKiogRGV0ZWN0IGFuZCBvdXRsaW5lIGFsbCBpbnN0YW5jZXMgaW4gYW4gUkdCQSBpbWFnZS4gKi9cbiAgc2VnbWVudEluc3RhbmNlcyhcbiAgICBpbWFnZTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICBvcHRzPzogSW5zdGFuY2VTZWdtZW50T3B0aW9ucyxcbiAgICBwcm9ncmVzcz86IEluc3RhbmNlU2VnbWVudFByb2dyZXNzLFxuICApOiBQcm9taXNlPEluc3RhbmNlU2VnbWVudGF0aW9uPjtcbn1cblxuLyoqXG4gKiBESSB0b2tlbiBmb3IgdGhlIGF1dG9tYXRpYyBpbnN0YW5jZSBzZWdtZW50ZXIuIERlZmF1bHRzIHRvIHRoZSBpbi1saWJyYXJ5XG4gKiB7QGxpbmsgWW9sb1NlZ21lbnRlclNlcnZpY2V9ICh5b2xvLXNlZ2RldGVjdC1qcywgbGF6eS1sb2FkZWQpOyBvdmVycmlkZSBpdCBpblxuICogdGhlIGhvc3QgdG8gc3dhcCBpbXBsZW1lbnRhdGlvbnMg4oCUIGZvciBleGFtcGxlIHRvIGRlbGVnYXRlIHRvIHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBJTlNUQU5DRV9TRUdNRU5URVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48SUluc3RhbmNlU2VnbWVudGVyPignSU5TVEFOQ0VfU0VHTUVOVEVSJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IGluamVjdChZb2xvU2VnbWVudGVyU2VydmljZSksXG59KTtcbiJdfQ==
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Registry of YOLOv8-seg instance-segmentation models.
3
+ *
4
+ * Mirrors {@link SAM_MODELS}: public HF-hosted ONNX by default so the tool works
5
+ * out of the box in any host, repointable at private hosting via
6
+ * {@link setYoloModelUrls}.
7
+ *
8
+ * Each entry carries the per-model *defaults* the server-side worker uses for
9
+ * that checkpoint. These are properties of how the model was trained (object
10
+ * scale, expected crowding), not UI preferences — the embryo models want heavy
11
+ * 60% tile overlap and loose merge thresholds because their objects are large
12
+ * and touch, while the eye models were trained on sparse, downsampled fields.
13
+ * Keeping them here means a host that just picks a model gets sane behaviour
14
+ * without having to know any of that.
15
+ *
16
+ * Weights point at the `model.fp16w.onnx` variant deliberately. The `.fp16`
17
+ * variant accumulates in half precision on WebGPU and, at the x-scale these
18
+ * models use, produces materially wrong boxes; `fp16w` stores weights in fp16
19
+ * and computes in fp32, so it is half the download at identical accuracy.
20
+ *
21
+ * Export tooling: the sibling `browser-onnx-tools` project.
22
+ */
23
+ const HF = 'https://huggingface.co/Ballon999';
24
+ const EYE_DEFAULTS = {
25
+ confidence: 0.6,
26
+ iouThreshold: 0.5,
27
+ mergeThreshold: 0.3,
28
+ overlapX: 0,
29
+ overlapY: 0,
30
+ };
31
+ // Embryos are large, touch each other, and are imaged at native scale — hence
32
+ // the heavy overlap and the far looser merge thresholds.
33
+ const EMBRYO_DEFAULTS = {
34
+ confidence: 0.6,
35
+ iouThreshold: 0.8,
36
+ mergeThreshold: 0.8,
37
+ overlapX: 60,
38
+ overlapY: 60,
39
+ };
40
+ export const YOLO_MODELS = [
41
+ {
42
+ id: 'yolov8x-seg-opticnerve',
43
+ label: 'Optic nerve',
44
+ modelUrl: `${HF}/yolov8x-seg-opticnerve-onnx/resolve/main/model.fp16w.onnx`,
45
+ defaults: { ...EYE_DEFAULTS },
46
+ },
47
+ {
48
+ id: 'yolov8x-seg-retina',
49
+ label: 'Retina',
50
+ modelUrl: `${HF}/yolov8x-seg-retina-onnx/resolve/main/model.fp16w.onnx`,
51
+ defaults: { ...EYE_DEFAULTS },
52
+ },
53
+ {
54
+ id: 'yolov8x-seg-embryo-m2',
55
+ label: 'Embryo (M2)',
56
+ modelUrl: `${HF}/yolov8x-seg-embryo-m2-onnx/resolve/main/model.fp16w.onnx`,
57
+ defaults: { ...EMBRYO_DEFAULTS },
58
+ },
59
+ {
60
+ id: 'yolov8x-seg-embryo-m3',
61
+ label: 'Embryo (M3)',
62
+ modelUrl: `${HF}/yolov8x-seg-embryo-m3-onnx/resolve/main/model.fp16w.onnx`,
63
+ defaults: { ...EMBRYO_DEFAULTS },
64
+ },
65
+ ];
66
+ export const DEFAULT_YOLO_MODEL_ID = 'yolov8x-seg-opticnerve';
67
+ let defaultModelId = DEFAULT_YOLO_MODEL_ID;
68
+ /** Look up a model definition by id. Returns undefined for an unknown id. */
69
+ export function getYoloModel(id) {
70
+ return YOLO_MODELS.find((m) => m.id === id);
71
+ }
72
+ /** Whether a model has a usable weights URL configured. */
73
+ export function isYoloModelReady(id) {
74
+ const m = getYoloModel(id);
75
+ return !!m && m.modelUrl.trim().length > 0;
76
+ }
77
+ /**
78
+ * Repoint a model at different hosting (e.g. a GCS bucket or a same-origin
79
+ * proxy). Call once at app init, before the first run. An empty `modelUrl`
80
+ * disables the model.
81
+ */
82
+ export function setYoloModelUrls(id, urls) {
83
+ const m = getYoloModel(id);
84
+ if (!m)
85
+ return;
86
+ if (urls.modelUrl !== undefined)
87
+ m.modelUrl = urls.modelUrl;
88
+ if (urls.metaUrl !== undefined)
89
+ m.metaUrl = urls.metaUrl;
90
+ }
91
+ /** Change which model runs when a caller does not name one. */
92
+ export function setDefaultYoloModel(id) {
93
+ if (getYoloModel(id))
94
+ defaultModelId = id;
95
+ }
96
+ export function getDefaultYoloModelId() {
97
+ return defaultModelId;
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW9sby1tb2RlbC1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24veW9sby1tb2RlbC1yZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBc0JILE1BQU0sRUFBRSxHQUFHLGtDQUFrQyxDQUFDO0FBRTlDLE1BQU0sWUFBWSxHQUFHO0lBQ25CLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLEdBQUc7SUFDakIsY0FBYyxFQUFFLEdBQUc7SUFDbkIsUUFBUSxFQUFFLENBQUM7SUFDWCxRQUFRLEVBQUUsQ0FBQztDQUNaLENBQUM7QUFFRiw4RUFBOEU7QUFDOUUseURBQXlEO0FBQ3pELE1BQU0sZUFBZSxHQUFHO0lBQ3RCLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLEdBQUc7SUFDakIsY0FBYyxFQUFFLEdBQUc7SUFDbkIsUUFBUSxFQUFFLEVBQUU7SUFDWixRQUFRLEVBQUUsRUFBRTtDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQW1CO0lBQ3pDO1FBQ0UsRUFBRSxFQUFFLHdCQUF3QjtRQUM1QixLQUFLLEVBQUUsYUFBYTtRQUNwQixRQUFRLEVBQUUsR0FBRyxFQUFFLDREQUE0RDtRQUMzRSxRQUFRLEVBQUUsRUFBRSxHQUFHLFlBQVksRUFBRTtLQUM5QjtJQUNEO1FBQ0UsRUFBRSxFQUFFLG9CQUFvQjtRQUN4QixLQUFLLEVBQUUsUUFBUTtRQUNmLFFBQVEsRUFBRSxHQUFHLEVBQUUsd0RBQXdEO1FBQ3ZFLFFBQVEsRUFBRSxFQUFFLEdBQUcsWUFBWSxFQUFFO0tBQzlCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsdUJBQXVCO1FBQzNCLEtBQUssRUFBRSxhQUFhO1FBQ3BCLFFBQVEsRUFBRSxHQUFHLEVBQUUsMkRBQTJEO1FBQzFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsZUFBZSxFQUFFO0tBQ2pDO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsdUJBQXVCO1FBQzNCLEtBQUssRUFBRSxhQUFhO1FBQ3BCLFFBQVEsRUFBRSxHQUFHLEVBQUUsMkRBQTJEO1FBQzFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsZUFBZSxFQUFFO0tBQ2pDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHdCQUF3QixDQUFDO0FBRTlELElBQUksY0FBYyxHQUFHLHFCQUFxQixDQUFDO0FBRTNDLDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsWUFBWSxDQUFDLEVBQVU7SUFDckMsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCwyREFBMkQ7QUFDM0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEVBQVU7SUFDekMsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsRUFBVSxFQUFFLElBQTZDO0lBQ3hGLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU87SUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUztRQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM1RCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUztRQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMzRCxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxFQUFVO0lBQzVDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUFFLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDNUMsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVnaXN0cnkgb2YgWU9MT3Y4LXNlZyBpbnN0YW5jZS1zZWdtZW50YXRpb24gbW9kZWxzLlxuICpcbiAqIE1pcnJvcnMge0BsaW5rIFNBTV9NT0RFTFN9OiBwdWJsaWMgSEYtaG9zdGVkIE9OTlggYnkgZGVmYXVsdCBzbyB0aGUgdG9vbCB3b3Jrc1xuICogb3V0IG9mIHRoZSBib3ggaW4gYW55IGhvc3QsIHJlcG9pbnRhYmxlIGF0IHByaXZhdGUgaG9zdGluZyB2aWFcbiAqIHtAbGluayBzZXRZb2xvTW9kZWxVcmxzfS5cbiAqXG4gKiBFYWNoIGVudHJ5IGNhcnJpZXMgdGhlIHBlci1tb2RlbCAqZGVmYXVsdHMqIHRoZSBzZXJ2ZXItc2lkZSB3b3JrZXIgdXNlcyBmb3JcbiAqIHRoYXQgY2hlY2twb2ludC4gVGhlc2UgYXJlIHByb3BlcnRpZXMgb2YgaG93IHRoZSBtb2RlbCB3YXMgdHJhaW5lZCAob2JqZWN0XG4gKiBzY2FsZSwgZXhwZWN0ZWQgY3Jvd2RpbmcpLCBub3QgVUkgcHJlZmVyZW5jZXMg4oCUIHRoZSBlbWJyeW8gbW9kZWxzIHdhbnQgaGVhdnlcbiAqIDYwJSB0aWxlIG92ZXJsYXAgYW5kIGxvb3NlIG1lcmdlIHRocmVzaG9sZHMgYmVjYXVzZSB0aGVpciBvYmplY3RzIGFyZSBsYXJnZVxuICogYW5kIHRvdWNoLCB3aGlsZSB0aGUgZXllIG1vZGVscyB3ZXJlIHRyYWluZWQgb24gc3BhcnNlLCBkb3duc2FtcGxlZCBmaWVsZHMuXG4gKiBLZWVwaW5nIHRoZW0gaGVyZSBtZWFucyBhIGhvc3QgdGhhdCBqdXN0IHBpY2tzIGEgbW9kZWwgZ2V0cyBzYW5lIGJlaGF2aW91clxuICogd2l0aG91dCBoYXZpbmcgdG8ga25vdyBhbnkgb2YgdGhhdC5cbiAqXG4gKiBXZWlnaHRzIHBvaW50IGF0IHRoZSBgbW9kZWwuZnAxNncub25ueGAgdmFyaWFudCBkZWxpYmVyYXRlbHkuIFRoZSBgLmZwMTZgXG4gKiB2YXJpYW50IGFjY3VtdWxhdGVzIGluIGhhbGYgcHJlY2lzaW9uIG9uIFdlYkdQVSBhbmQsIGF0IHRoZSB4LXNjYWxlIHRoZXNlXG4gKiBtb2RlbHMgdXNlLCBwcm9kdWNlcyBtYXRlcmlhbGx5IHdyb25nIGJveGVzOyBgZnAxNndgIHN0b3JlcyB3ZWlnaHRzIGluIGZwMTZcbiAqIGFuZCBjb21wdXRlcyBpbiBmcDMyLCBzbyBpdCBpcyBoYWxmIHRoZSBkb3dubG9hZCBhdCBpZGVudGljYWwgYWNjdXJhY3kuXG4gKlxuICogRXhwb3J0IHRvb2xpbmc6IHRoZSBzaWJsaW5nIGBicm93c2VyLW9ubngtdG9vbHNgIHByb2plY3QuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBZb2xvTW9kZWxEZWYge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogVVJMIG9mIHRoZSBgLm9ubnhgIHdlaWdodHMuIEVtcHR5IGRpc2FibGVzIHRoZSBtb2RlbC4gKi9cbiAgbW9kZWxVcmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFVSTCBvZiB0aGUgYG1vZGVsLmpzb25gIHNpZGVjYXIuIE9taXQgdG8gdXNlIGBtb2RlbC5qc29uYCBhbG9uZ3NpZGUgdGhlXG4gICAqIHdlaWdodHMsIHdoaWNoIGlzIGhvdyBldmVyeSBwdWJsaXNoZWQgcmVwbyBpcyBsYWlkIG91dC5cbiAgICovXG4gIG1ldGFVcmw/OiBzdHJpbmc7XG4gIC8qKiBQZXItbW9kZWwgZGVmYXVsdHMsIGZyb20gdGhlIHNlcnZlciB3b3JrZXIncyBtb2RlbCB0YWJsZS4gKi9cbiAgZGVmYXVsdHM6IHtcbiAgICBjb25maWRlbmNlOiBudW1iZXI7XG4gICAgaW91VGhyZXNob2xkOiBudW1iZXI7XG4gICAgbWVyZ2VUaHJlc2hvbGQ6IG51bWJlcjtcbiAgICBvdmVybGFwWDogbnVtYmVyO1xuICAgIG92ZXJsYXBZOiBudW1iZXI7XG4gIH07XG59XG5cbmNvbnN0IEhGID0gJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vQmFsbG9uOTk5JztcblxuY29uc3QgRVlFX0RFRkFVTFRTID0ge1xuICBjb25maWRlbmNlOiAwLjYsXG4gIGlvdVRocmVzaG9sZDogMC41LFxuICBtZXJnZVRocmVzaG9sZDogMC4zLFxuICBvdmVybGFwWDogMCxcbiAgb3ZlcmxhcFk6IDAsXG59O1xuXG4vLyBFbWJyeW9zIGFyZSBsYXJnZSwgdG91Y2ggZWFjaCBvdGhlciwgYW5kIGFyZSBpbWFnZWQgYXQgbmF0aXZlIHNjYWxlIOKAlCBoZW5jZVxuLy8gdGhlIGhlYXZ5IG92ZXJsYXAgYW5kIHRoZSBmYXIgbG9vc2VyIG1lcmdlIHRocmVzaG9sZHMuXG5jb25zdCBFTUJSWU9fREVGQVVMVFMgPSB7XG4gIGNvbmZpZGVuY2U6IDAuNixcbiAgaW91VGhyZXNob2xkOiAwLjgsXG4gIG1lcmdlVGhyZXNob2xkOiAwLjgsXG4gIG92ZXJsYXBYOiA2MCxcbiAgb3ZlcmxhcFk6IDYwLFxufTtcblxuZXhwb3J0IGNvbnN0IFlPTE9fTU9ERUxTOiBZb2xvTW9kZWxEZWZbXSA9IFtcbiAge1xuICAgIGlkOiAneW9sb3Y4eC1zZWctb3B0aWNuZXJ2ZScsXG4gICAgbGFiZWw6ICdPcHRpYyBuZXJ2ZScsXG4gICAgbW9kZWxVcmw6IGAke0hGfS95b2xvdjh4LXNlZy1vcHRpY25lcnZlLW9ubngvcmVzb2x2ZS9tYWluL21vZGVsLmZwMTZ3Lm9ubnhgLFxuICAgIGRlZmF1bHRzOiB7IC4uLkVZRV9ERUZBVUxUUyB9LFxuICB9LFxuICB7XG4gICAgaWQ6ICd5b2xvdjh4LXNlZy1yZXRpbmEnLFxuICAgIGxhYmVsOiAnUmV0aW5hJyxcbiAgICBtb2RlbFVybDogYCR7SEZ9L3lvbG92OHgtc2VnLXJldGluYS1vbm54L3Jlc29sdmUvbWFpbi9tb2RlbC5mcDE2dy5vbm54YCxcbiAgICBkZWZhdWx0czogeyAuLi5FWUVfREVGQVVMVFMgfSxcbiAgfSxcbiAge1xuICAgIGlkOiAneW9sb3Y4eC1zZWctZW1icnlvLW0yJyxcbiAgICBsYWJlbDogJ0VtYnJ5byAoTTIpJyxcbiAgICBtb2RlbFVybDogYCR7SEZ9L3lvbG92OHgtc2VnLWVtYnJ5by1tMi1vbm54L3Jlc29sdmUvbWFpbi9tb2RlbC5mcDE2dy5vbm54YCxcbiAgICBkZWZhdWx0czogeyAuLi5FTUJSWU9fREVGQVVMVFMgfSxcbiAgfSxcbiAge1xuICAgIGlkOiAneW9sb3Y4eC1zZWctZW1icnlvLW0zJyxcbiAgICBsYWJlbDogJ0VtYnJ5byAoTTMpJyxcbiAgICBtb2RlbFVybDogYCR7SEZ9L3lvbG92OHgtc2VnLWVtYnJ5by1tMy1vbm54L3Jlc29sdmUvbWFpbi9tb2RlbC5mcDE2dy5vbm54YCxcbiAgICBkZWZhdWx0czogeyAuLi5FTUJSWU9fREVGQVVMVFMgfSxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1lPTE9fTU9ERUxfSUQgPSAneW9sb3Y4eC1zZWctb3B0aWNuZXJ2ZSc7XG5cbmxldCBkZWZhdWx0TW9kZWxJZCA9IERFRkFVTFRfWU9MT19NT0RFTF9JRDtcblxuLyoqIExvb2sgdXAgYSBtb2RlbCBkZWZpbml0aW9uIGJ5IGlkLiBSZXR1cm5zIHVuZGVmaW5lZCBmb3IgYW4gdW5rbm93biBpZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRZb2xvTW9kZWwoaWQ6IHN0cmluZyk6IFlvbG9Nb2RlbERlZiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBZT0xPX01PREVMUy5maW5kKChtKSA9PiBtLmlkID09PSBpZCk7XG59XG5cbi8qKiBXaGV0aGVyIGEgbW9kZWwgaGFzIGEgdXNhYmxlIHdlaWdodHMgVVJMIGNvbmZpZ3VyZWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNZb2xvTW9kZWxSZWFkeShpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG0gPSBnZXRZb2xvTW9kZWwoaWQpO1xuICByZXR1cm4gISFtICYmIG0ubW9kZWxVcmwudHJpbSgpLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogUmVwb2ludCBhIG1vZGVsIGF0IGRpZmZlcmVudCBob3N0aW5nIChlLmcuIGEgR0NTIGJ1Y2tldCBvciBhIHNhbWUtb3JpZ2luXG4gKiBwcm94eSkuIENhbGwgb25jZSBhdCBhcHAgaW5pdCwgYmVmb3JlIHRoZSBmaXJzdCBydW4uIEFuIGVtcHR5IGBtb2RlbFVybGBcbiAqIGRpc2FibGVzIHRoZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFlvbG9Nb2RlbFVybHMoaWQ6IHN0cmluZywgdXJsczogeyBtb2RlbFVybD86IHN0cmluZzsgbWV0YVVybD86IHN0cmluZyB9KTogdm9pZCB7XG4gIGNvbnN0IG0gPSBnZXRZb2xvTW9kZWwoaWQpO1xuICBpZiAoIW0pIHJldHVybjtcbiAgaWYgKHVybHMubW9kZWxVcmwgIT09IHVuZGVmaW5lZCkgbS5tb2RlbFVybCA9IHVybHMubW9kZWxVcmw7XG4gIGlmICh1cmxzLm1ldGFVcmwgIT09IHVuZGVmaW5lZCkgbS5tZXRhVXJsID0gdXJscy5tZXRhVXJsO1xufVxuXG4vKiogQ2hhbmdlIHdoaWNoIG1vZGVsIHJ1bnMgd2hlbiBhIGNhbGxlciBkb2VzIG5vdCBuYW1lIG9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0WW9sb01vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGdldFlvbG9Nb2RlbChpZCkpIGRlZmF1bHRNb2RlbElkID0gaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0WW9sb01vZGVsSWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGRlZmF1bHRNb2RlbElkO1xufVxuIl19
@@ -0,0 +1,169 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { getOrtWasmBase } from './ort-runtime-config';
3
+ import { getDefaultYoloModelId, getYoloModel } from './yolo-model-registry';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Default in-library {@link IInstanceSegmenter}, backed by yolo-segdetect-js
7
+ * (YOLOv8-seg on WebGPU, falling back to WASM).
8
+ *
9
+ * `yolo-segdetect-js` is a regular dependency but is **lazy-imported** on first
10
+ * use, so apps that never run YOLO pay nothing for it — or for onnxruntime-web —
11
+ * in their initial bundle. This mirrors {@link CellposeSegmenterService}.
12
+ *
13
+ * The one structural difference from the Cellpose service: there are four YOLO
14
+ * checkpoints, not one, so instances are cached **per model id** rather than as
15
+ * a single singleton. Each entry owns its own worker and ORT session, so a host
16
+ * that switches models pays a second load but keeps the first one warm. Nothing
17
+ * evicts automatically — these are ~144 MB each, so a host that cycles through
18
+ * all four should call {@link dispose} for the ones it is done with.
19
+ */
20
+ export class YoloSegmenterService {
21
+ constructor() {
22
+ this.instances = new Map();
23
+ this.loading = new Map();
24
+ }
25
+ async segmentInstances(image, opts = {}, progress) {
26
+ const modelId = opts.modelId ?? getDefaultYoloModelId();
27
+ const def = this.requireModel(modelId);
28
+ let announcedDownload = false;
29
+ const seg = await this.getModel(modelId, (loaded, total) => {
30
+ if (total)
31
+ progress?.onProgress?.(loaded / total);
32
+ progress?.onBytes?.(loaded, total);
33
+ if (loaded > 0 && !announcedDownload) {
34
+ announcedDownload = true;
35
+ progress?.onStatus?.(`Downloading ${def.label} model…`);
36
+ }
37
+ }, (status) => progress?.onStatus?.(status));
38
+ progress?.onStatus?.('Running inference…');
39
+ const result = await seg.segment({ data: image.data, width: image.width, height: image.height }, {
40
+ confThreshold: opts.confidence ?? def.defaults.confidence,
41
+ iouThreshold: opts.iouThreshold ?? def.defaults.iouThreshold,
42
+ threshold: opts.mergeThreshold ?? def.defaults.mergeThreshold,
43
+ overlapX: opts.overlapX ?? def.defaults.overlapX,
44
+ overlapY: opts.overlapY ?? def.defaults.overlapY,
45
+ ...(opts.maskThreshold !== undefined ? { maskThreshold: opts.maskThreshold } : {}),
46
+ ...(opts.maxDetections !== undefined ? { maxDetections: opts.maxDetections } : {}),
47
+ ...(opts.classFilter ? { classFilter: opts.classFilter } : {}),
48
+ ...(opts.withMasks !== undefined ? { withMasks: opts.withMasks } : {}),
49
+ ...(opts.signal ? { signal: opts.signal } : {}),
50
+ // Only worth tracing when there are masks to trace.
51
+ tracePolygons: opts.withMasks !== false,
52
+ traceOptions: {
53
+ ...(opts.simplifyTolerance !== undefined ? { simplifyTolerance: opts.simplifyTolerance } : {}),
54
+ ...(opts.minArea !== undefined ? { minArea: opts.minArea } : {}),
55
+ },
56
+ onTileProgress: (done, total) => progress?.onStatus?.(done < total ? `Running inference (tile ${done}/${total})…` : 'Tracing outlines…'),
57
+ });
58
+ // Detections without geometry are dropped rather than surfaced as empty
59
+ // regions — a detection whose mask vanished under thresholding has nothing
60
+ // meaningful to draw or edit.
61
+ const detections = [];
62
+ for (const d of result.detections) {
63
+ if (!d.polygons || d.polygons.length === 0)
64
+ continue;
65
+ detections.push({
66
+ polygons: d.polygons.map((p) => ({
67
+ exterior: p.exterior.map(([x, y]) => [x, y]),
68
+ holes: p.holes.map((h) => h.map(([x, y]) => [x, y])),
69
+ })),
70
+ box: [d.box[0], d.box[1], d.box[2], d.box[3]],
71
+ score: d.score,
72
+ classId: d.classId,
73
+ className: d.className ?? `class${d.classId}`,
74
+ });
75
+ }
76
+ return {
77
+ detections,
78
+ width: result.width,
79
+ height: result.height,
80
+ classNames: result.classNames,
81
+ };
82
+ }
83
+ /**
84
+ * The shared segmenter for a model id, created on first use and reused
85
+ * thereafter (deduped across concurrent callers). Exposed so a host's
86
+ * processing pipeline can drive richer `segment()` options on the same loaded
87
+ * session instead of loading the model twice.
88
+ */
89
+ getModel(modelId = getDefaultYoloModelId(), onProgress, onStatus) {
90
+ const existing = this.instances.get(modelId);
91
+ if (existing)
92
+ return Promise.resolve(existing);
93
+ const inFlight = this.loading.get(modelId);
94
+ if (inFlight)
95
+ return inFlight;
96
+ const def = this.requireModel(modelId);
97
+ const load = (async () => {
98
+ // Lazy: keep yolo-segdetect-js + its ORT runtime out of the initial bundle.
99
+ const { YoloSegmenter, configureOrt } = await import('yolo-segdetect-js');
100
+ configureOrt({ wasmPaths: getOrtWasmBase() });
101
+ const seg = await YoloSegmenter.fromPretrained(def.modelUrl, {
102
+ preload: true,
103
+ ...(def.metaUrl ? { metaUrl: def.metaUrl } : {}),
104
+ onProgress: ({ loaded, total }) => onProgress?.(loaded, total),
105
+ onStatus: (s) => onStatus?.(s),
106
+ });
107
+ this.instances.set(modelId, seg);
108
+ return seg;
109
+ })();
110
+ this.loading.set(modelId, load);
111
+ // A failed load must not poison the cache — the next caller should retry
112
+ // rather than inherit the rejected promise forever.
113
+ load.catch(() => this.loading.delete(modelId));
114
+ return load;
115
+ }
116
+ /** Whether a model is already loaded (warm). */
117
+ isLoaded(modelId = getDefaultYoloModelId()) {
118
+ return this.instances.has(modelId);
119
+ }
120
+ /**
121
+ * Release one model, or all of them. Safe to call on a model never loaded.
122
+ *
123
+ * In-flight loads are torn down too, not just warm ones. Simply dropping the
124
+ * pending promise and returning would let the load finish afterwards,
125
+ * re-populate {@link instances}, and strand a live worker and ORT session that
126
+ * nothing owns — disposal would have reported success while leaking. So a load
127
+ * that is still running is awaited and then released.
128
+ */
129
+ async dispose(modelId) {
130
+ const ids = modelId ? [modelId] : [...new Set([...this.instances.keys(), ...this.loading.keys()])];
131
+ await Promise.all(ids.map((id) => this.disposeOne(id)));
132
+ }
133
+ async disposeOne(id) {
134
+ const pending = this.loading.get(id);
135
+ const loaded = this.instances.get(id);
136
+ this.instances.delete(id);
137
+ this.loading.delete(id);
138
+ if (loaded)
139
+ await loaded.dispose();
140
+ if (!pending)
141
+ return;
142
+ // A pending load assigns instances[id] before its promise resolves, so by
143
+ // the time this await returns the entry is back. Clear it only if it still
144
+ // points at what *this* load produced — a newer load started in the
145
+ // meantime owns its own entry and must not be evicted.
146
+ const seg = await pending.catch(() => null);
147
+ if (!seg || seg === loaded)
148
+ return;
149
+ if (this.instances.get(id) === seg)
150
+ this.instances.delete(id);
151
+ await seg.dispose();
152
+ }
153
+ requireModel(modelId) {
154
+ const def = getYoloModel(modelId);
155
+ if (!def)
156
+ throw new Error(`Unknown YOLO model id "${modelId}".`);
157
+ if (!def.modelUrl.trim()) {
158
+ throw new Error(`YOLO model "${modelId}" is not configured — its modelUrl is empty.`);
159
+ }
160
+ return def;
161
+ }
162
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: YoloSegmenterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
163
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: YoloSegmenterService, providedIn: 'root' }); }
164
+ }
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: YoloSegmenterService, decorators: [{
166
+ type: Injectable,
167
+ args: [{ providedIn: 'root' }]
168
+ }] });
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW9sby1zZWdtZW50ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24veW9sby1zZWdtZW50ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFxQixNQUFNLHVCQUF1QixDQUFDOztBQVcvRjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFEakM7UUFFbUIsY0FBUyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQzdDLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztLQWdLdEU7SUE5SkMsS0FBSyxDQUFDLGdCQUFnQixDQUNwQixLQUFpRSxFQUNqRSxPQUErQixFQUFFLEVBQ2pDLFFBQWtDO1FBRWxDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZDLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FDN0IsT0FBTyxFQUNQLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hCLElBQUksS0FBSztnQkFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ2xELFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJ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QUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsT0FBTyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7OEdBaktVLG9CQUFvQjtrSEFBcEIsb0JBQW9CLGNBRFAsTUFBTTs7MkZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXRPcnRXYXNtQmFzZSB9IGZyb20gJy4vb3J0LXJ1bnRpbWUtY29uZmlnJztcbmltcG9ydCB7IGdldERlZmF1bHRZb2xvTW9kZWxJZCwgZ2V0WW9sb01vZGVsLCB0eXBlIFlvbG9Nb2RlbERlZiB9IGZyb20gJy4veW9sby1tb2RlbC1yZWdpc3RyeSc7XG5cbmltcG9ydCB0eXBlIHtcbiAgSUluc3RhbmNlU2VnbWVudGVyLFxuICBJbnN0YW5jZURldGVjdGlvbixcbiAgSW5zdGFuY2VTZWdtZW50YXRpb24sXG4gIEluc3RhbmNlU2VnbWVudE9wdGlvbnMsXG4gIEluc3RhbmNlU2VnbWVudFByb2dyZXNzLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW5zdGFuY2Utc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHsgWW9sb1NlZ21lbnRlciB9IGZyb20gJ3lvbG8tc2VnZGV0ZWN0LWpzJztcblxuLyoqXG4gKiBEZWZhdWx0IGluLWxpYnJhcnkge0BsaW5rIElJbnN0YW5jZVNlZ21lbnRlcn0sIGJhY2tlZCBieSB5b2xvLXNlZ2RldGVjdC1qc1xuICogKFlPTE92OC1zZWcgb24gV2ViR1BVLCBmYWxsaW5nIGJhY2sgdG8gV0FTTSkuXG4gKlxuICogYHlvbG8tc2VnZGV0ZWN0LWpzYCBpcyBhIHJlZ3VsYXIgZGVwZW5kZW5jeSBidXQgaXMgKipsYXp5LWltcG9ydGVkKiogb24gZmlyc3RcbiAqIHVzZSwgc28gYXBwcyB0aGF0IG5ldmVyIHJ1biBZT0xPIHBheSBub3RoaW5nIGZvciBpdCDigJQgb3IgZm9yIG9ubnhydW50aW1lLXdlYiDigJRcbiAqIGluIHRoZWlyIGluaXRpYWwgYnVuZGxlLiBUaGlzIG1pcnJvcnMge0BsaW5rIENlbGxwb3NlU2VnbWVudGVyU2VydmljZX0uXG4gKlxuICogVGhlIG9uZSBzdHJ1Y3R1cmFsIGRpZmZlcmVuY2UgZnJvbSB0aGUgQ2VsbHBvc2Ugc2VydmljZTogdGhlcmUgYXJlIGZvdXIgWU9MT1xuICogY2hlY2twb2ludHMsIG5vdCBvbmUsIHNvIGluc3RhbmNlcyBhcmUgY2FjaGVkICoqcGVyIG1vZGVsIGlkKiogcmF0aGVyIHRoYW4gYXNcbiAqIGEgc2luZ2xlIHNpbmdsZXRvbi4gRWFjaCBlbnRyeSBvd25zIGl0cyBvd24gd29ya2VyIGFuZCBPUlQgc2Vzc2lvbiwgc28gYSBob3N0XG4gKiB0aGF0IHN3aXRjaGVzIG1vZGVscyBwYXlzIGEgc2Vjb25kIGxvYWQgYnV0IGtlZXBzIHRoZSBmaXJzdCBvbmUgd2FybS4gTm90aGluZ1xuICogZXZpY3RzIGF1dG9tYXRpY2FsbHkg4oCUIHRoZXNlIGFyZSB+MTQ0IE1CIGVhY2gsIHNvIGEgaG9zdCB0aGF0IGN5Y2xlcyB0aHJvdWdoXG4gKiBhbGwgZm91ciBzaG91bGQgY2FsbCB7QGxpbmsgZGlzcG9zZX0gZm9yIHRoZSBvbmVzIGl0IGlzIGRvbmUgd2l0aC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBZb2xvU2VnbWVudGVyU2VydmljZSBpbXBsZW1lbnRzIElJbnN0YW5jZVNlZ21lbnRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VzID0gbmV3IE1hcDxzdHJpbmcsIFlvbG9TZWdtZW50ZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFlvbG9TZWdtZW50ZXI+PigpO1xuXG4gIGFzeW5jIHNlZ21lbnRJbnN0YW5jZXMoXG4gICAgaW1hZ2U6IHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXG4gICAgb3B0czogSW5zdGFuY2VTZWdtZW50T3B0aW9ucyA9IHt9LFxuICAgIHByb2dyZXNzPzogSW5zdGFuY2VTZWdtZW50UHJvZ3Jlc3MsXG4gICk6IFByb21pc2U8SW5zdGFuY2VTZWdtZW50YXRpb24+IHtcbiAgICBjb25zdCBtb2RlbElkID0gb3B0cy5tb2RlbElkID8/IGdldERlZmF1bHRZb2xvTW9kZWxJZCgpO1xuICAgIGNvbnN0IGRlZiA9IHRoaXMucmVxdWlyZU1vZGVsKG1vZGVsSWQpO1xuXG4gICAgbGV0IGFubm91bmNlZERvd25sb2FkID0gZmFsc2U7XG4gICAgY29uc3Qgc2VnID0gYXdhaXQgdGhpcy5nZXRNb2RlbChcbiAgICAgIG1vZGVsSWQsXG4gICAgICAobG9hZGVkLCB0b3RhbCkgPT4ge1xuICAgICAgICBpZiAodG90YWwpIHByb2dyZXNzPy5vblByb2dyZXNzPy4obG9hZGVkIC8gdG90YWwpO1xuICAgICAgICBwcm9ncmVzcz8ub25CeXRlcz8uKGxvYWRlZCwgdG90YWwpO1xuICAgICAgICBpZiAobG9hZGVkID4gMCAmJiAhYW5ub3VuY2VkRG93bmxvYWQpIHtcbiAgICAgICAgICBhbm5vdW5jZWREb3dubG9hZCA9IHRydWU7XG4gICAgICAgICAgcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oYERvd25sb2FkaW5nICR7ZGVmLmxhYmVsfSBtb2RlbOKApmApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKHN0YXR1cykgPT4gcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oc3RhdHVzKSxcbiAgICApO1xuXG4gICAgcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oJ1J1bm5pbmcgaW5mZXJlbmNl4oCmJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VnLnNlZ21lbnQoXG4gICAgICB7IGRhdGE6IGltYWdlLmRhdGEsIHdpZHRoOiBpbWFnZS53aWR0aCwgaGVpZ2h0OiBpbWFnZS5oZWlnaHQgfSxcbiAgICAgIHtcbiAgICAgICAgY29uZlRocmVzaG9sZDogb3B0cy5jb25maWRlbmNlID8/IGRlZi5kZWZhdWx0cy5jb25maWRlbmNlLFxuICAgICAgICBpb3VUaHJlc2hvbGQ6IG9wdHMuaW91VGhyZXNob2xkID8/IGRlZi5kZWZhdWx0cy5pb3VUaHJlc2hvbGQsXG4gICAgICAgIHRocmVzaG9sZDogb3B0cy5tZXJnZVRocmVzaG9sZCA/PyBkZWYuZGVmYXVsdHMubWVyZ2VUaHJlc2hvbGQsXG4gICAgICAgIG92ZXJsYXBYOiBvcHRzLm92ZXJsYXBYID8/IGRlZi5kZWZhdWx0cy5vdmVybGFwWCxcbiAgICAgICAgb3ZlcmxhcFk6IG9wdHMub3ZlcmxhcFkgPz8gZGVmLmRlZmF1bHRzLm92ZXJsYXBZLFxuICAgICAgICAuLi4ob3B0cy5tYXNrVGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IG1hc2tUaHJlc2hvbGQ6IG9wdHMubWFza1RocmVzaG9sZCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5tYXhEZXRlY3Rpb25zICE9PSB1bmRlZmluZWQgPyB7IG1heERldGVjdGlvbnM6IG9wdHMubWF4RGV0ZWN0aW9ucyB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5jbGFzc0ZpbHRlciA/IHsgY2xhc3NGaWx0ZXI6IG9wdHMuY2xhc3NGaWx0ZXIgfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMud2l0aE1hc2tzICE9PSB1bmRlZmluZWQgPyB7IHdpdGhNYXNrczogb3B0cy53aXRoTWFza3MgfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMuc2lnbmFsID8geyBzaWduYWw6IG9wdHMuc2lnbmFsIH0gOiB7fSksXG4gICAgICAgIC8vIE9ubHkgd29ydGggdHJhY2luZyB3aGVuIHRoZXJlIGFyZSBtYXNrcyB0byB0cmFjZS5cbiAgICAgICAgdHJhY2VQb2x5Z29uczogb3B0cy53aXRoTWFza3MgIT09IGZhbHNlLFxuICAgICAgICB0cmFjZU9wdGlvbnM6IHtcbiAgICAgICAgICAuLi4ob3B0cy5zaW1wbGlmeVRvbGVyYW5jZSAhPT0gdW5kZWZpbmVkID8geyBzaW1wbGlmeVRvbGVyYW5jZTogb3B0cy5zaW1wbGlmeVRvbGVyYW5jZSB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRzLm1pbkFyZWEgIT09IHVuZGVmaW5lZCA/IHsgbWluQXJlYTogb3B0cy5taW5BcmVhIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIG9uVGlsZVByb2dyZXNzOiAoZG9uZSwgdG90YWwpID0+XG4gICAgICAgICAgcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oZG9uZSA8IHRvdGFsID8gYFJ1bm5pbmcgaW5mZXJlbmNlICh0aWxlICR7ZG9uZX0vJHt0b3RhbH0p4oCmYCA6ICdUcmFjaW5nIG91dGxpbmVz4oCmJyksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBEZXRlY3Rpb25zIHdpdGhvdXQgZ2VvbWV0cnkgYXJlIGRyb3BwZWQgcmF0aGVyIHRoYW4gc3VyZmFjZWQgYXMgZW1wdHlcbiAgICAvLyByZWdpb25zIOKAlCBhIGRldGVjdGlvbiB3aG9zZSBtYXNrIHZhbmlzaGVkIHVuZGVyIHRocmVzaG9sZGluZyBoYXMgbm90aGluZ1xuICAgIC8vIG1lYW5pbmdmdWwgdG8gZHJhdyBvciBlZGl0LlxuICAgIGNvbnN0IGRldGVjdGlvbnM6IEluc3RhbmNlRGV0ZWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGQgb2YgcmVzdWx0LmRldGVjdGlvbnMpIHtcbiAgICAgIGlmICghZC5wb2x5Z29ucyB8fCBkLnBvbHlnb25zLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgICBkZXRlY3Rpb25zLnB1c2goe1xuICAgICAgICBwb2x5Z29uczogZC5wb2x5Z29ucy5tYXAoKHApID0+ICh7XG4gICAgICAgICAgZXh0ZXJpb3I6IHAuZXh0ZXJpb3IubWFwKChbeCwgeV0pOiBbbnVtYmVyLCBudW1iZXJdID0+IFt4LCB5XSksXG4gICAgICAgICAgaG9sZXM6IHAuaG9sZXMubWFwKChoKSA9PiBoLm1hcCgoW3gsIHldKTogW251bWJlciwgbnVtYmVyXSA9PiBbeCwgeV0pKSxcbiAgICAgICAgfSkpLFxuICAgICAgICBib3g6IFtkLmJveFswXSwgZC5ib3hbMV0sIGQuYm94WzJdLCBkLmJveFszXV0sXG4gICAgICAgIHNjb3JlOiBkLnNjb3JlLFxuICAgICAgICBjbGFzc0lkOiBkLmNsYXNzSWQsXG4gICAgICAgIGNsYXNzTmFtZTogZC5jbGFzc05hbWUgPz8gYGNsYXNzJHtkLmNsYXNzSWR9YCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkZXRlY3Rpb25zLFxuICAgICAgd2lkdGg6IHJlc3VsdC53aWR0aCxcbiAgICAgIGhlaWdodDogcmVzdWx0LmhlaWdodCxcbiAgICAgIGNsYXNzTmFtZXM6IHJlc3VsdC5jbGFzc05hbWVzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNoYXJlZCBzZWdtZW50ZXIgZm9yIGEgbW9kZWwgaWQsIGNyZWF0ZWQgb24gZmlyc3QgdXNlIGFuZCByZXVzZWRcbiAgICogdGhlcmVhZnRlciAoZGVkdXBlZCBhY3Jvc3MgY29uY3VycmVudCBjYWxsZXJzKS4gRXhwb3NlZCBzbyBhIGhvc3Qnc1xuICAgKiBwcm9jZXNzaW5nIHBpcGVsaW5lIGNhbiBkcml2ZSByaWNoZXIgYHNlZ21lbnQoKWAgb3B0aW9ucyBvbiB0aGUgc2FtZSBsb2FkZWRcbiAgICogc2Vzc2lvbiBpbnN0ZWFkIG9mIGxvYWRpbmcgdGhlIG1vZGVsIHR3aWNlLlxuICAgKi9cbiAgZ2V0TW9kZWwoXG4gICAgbW9kZWxJZDogc3RyaW5nID0gZ2V0RGVmYXVsdFlvbG9Nb2RlbElkKCksXG4gICAgb25Qcm9ncmVzcz86IChsb2FkZWQ6IG51bWJlciwgdG90YWw6IG51bWJlciB8IG51bGwpID0+IHZvaWQsXG4gICAgb25TdGF0dXM/OiAoc3RhdHVzOiBzdHJpbmcpID0+IHZvaWQsXG4gICk6IFByb21pc2U8WW9sb1NlZ21lbnRlcj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5pbnN0YW5jZXMuZ2V0KG1vZGVsSWQpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShleGlzdGluZyk7XG5cbiAgICBjb25zdCBpbkZsaWdodCA9IHRoaXMubG9hZGluZy5nZXQobW9kZWxJZCk7XG4gICAgaWYgKGluRmxpZ2h0KSByZXR1cm4gaW5GbGlnaHQ7XG5cbiAgICBjb25zdCBkZWYgPSB0aGlzLnJlcXVpcmVNb2RlbChtb2RlbElkKTtcbiAgICBjb25zdCBsb2FkID0gKGFzeW5jICgpID0+IHtcbiAgICAgIC8vIExhenk6IGtlZXAgeW9sby1zZWdkZXRlY3QtanMgKyBpdHMgT1JUIHJ1bnRpbWUgb3V0IG9mIHRoZSBpbml0aWFsIGJ1bmRsZS5cbiAgICAgIGNvbnN0IHsgWW9sb1NlZ21lbnRlciwgY29uZmlndXJlT3J0IH0gPSBhd2FpdCBpbXBvcnQoJ3lvbG8tc2VnZGV0ZWN0LWpzJyk7XG4gICAgICBjb25maWd1cmVPcnQoeyB3YXNtUGF0aHM6IGdldE9ydFdhc21CYXNlKCkgfSk7XG4gICAgICBjb25zdCBzZWcgPSBhd2FpdCBZb2xvU2VnbWVudGVyLmZyb21QcmV0cmFpbmVkKGRlZi5tb2RlbFVybCwge1xuICAgICAgICBwcmVsb2FkOiB0cnVlLFxuICAgICAgICAuLi4oZGVmLm1ldGFVcmwgPyB7IG1ldGFVcmw6IGRlZi5tZXRhVXJsIH0gOiB7fSksXG4gICAgICAgIG9uUHJvZ3Jlc3M6ICh7IGxvYWRlZCwgdG90YWwgfSkgPT4gb25Qcm9ncmVzcz8uKGxvYWRlZCwgdG90YWwpLFxuICAgICAgICBvblN0YXR1czogKHMpID0+IG9uU3RhdHVzPy4ocyksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuaW5zdGFuY2VzLnNldChtb2RlbElkLCBzZWcpO1xuICAgICAgcmV0dXJuIHNlZztcbiAgICB9KSgpO1xuXG4gICAgdGhpcy5sb2FkaW5nLnNldChtb2RlbElkLCBsb2FkKTtcbiAgICAvLyBBIGZhaWxlZCBsb2FkIG11c3Qgbm90IHBvaXNvbiB0aGUgY2FjaGUg4oCUIHRoZSBuZXh0IGNhbGxlciBzaG91bGQgcmV0cnlcbiAgICAvLyByYXRoZXIgdGhhbiBpbmhlcml0IHRoZSByZWplY3RlZCBwcm9taXNlIGZvcmV2ZXIuXG4gICAgbG9hZC5jYXRjaCgoKSA9PiB0aGlzLmxvYWRpbmcuZGVsZXRlKG1vZGVsSWQpKTtcbiAgICByZXR1cm4gbG9hZDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGEgbW9kZWwgaXMgYWxyZWFkeSBsb2FkZWQgKHdhcm0pLiAqL1xuICBpc0xvYWRlZChtb2RlbElkOiBzdHJpbmcgPSBnZXREZWZhdWx0WW9sb01vZGVsSWQoKSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluc3RhbmNlcy5oYXMobW9kZWxJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSBvbmUgbW9kZWwsIG9yIGFsbCBvZiB0aGVtLiBTYWZlIHRvIGNhbGwgb24gYSBtb2RlbCBuZXZlciBsb2FkZWQuXG4gICAqXG4gICAqIEluLWZsaWdodCBsb2FkcyBhcmUgdG9ybiBkb3duIHRvbywgbm90IGp1c3Qgd2FybSBvbmVzLiBTaW1wbHkgZHJvcHBpbmcgdGhlXG4gICAqIHBlbmRpbmcgcHJvbWlzZSBhbmQgcmV0dXJuaW5nIHdvdWxkIGxldCB0aGUgbG9hZCBmaW5pc2ggYWZ0ZXJ3YXJkcyxcbiAgICogcmUtcG9wdWxhdGUge0BsaW5rIGluc3RhbmNlc30sIGFuZCBzdHJhbmQgYSBsaXZlIHdvcmtlciBhbmQgT1JUIHNlc3Npb24gdGhhdFxuICAgKiBub3RoaW5nIG93bnMg4oCUIGRpc3Bvc2FsIHdvdWxkIGhhdmUgcmVwb3J0ZWQgc3VjY2VzcyB3aGlsZSBsZWFraW5nLiBTbyBhIGxvYWRcbiAgICogdGhhdCBpcyBzdGlsbCBydW5uaW5nIGlzIGF3YWl0ZWQgYW5kIHRoZW4gcmVsZWFzZWQuXG4gICAqL1xuICBhc3luYyBkaXNwb3NlKG1vZGVsSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpZHMgPSBtb2RlbElkID8gW21vZGVsSWRdIDogWy4uLm5ldyBTZXQoWy4uLnRoaXMuaW5zdGFuY2VzLmtleXMoKSwgLi4udGhpcy5sb2FkaW5nLmtleXMoKV0pXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChpZHMubWFwKChpZCkgPT4gdGhpcy5kaXNwb3NlT25lKGlkKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNwb3NlT25lKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5sb2FkaW5nLmdldChpZCk7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5pbnN0YW5jZXMuZ2V0KGlkKTtcbiAgICB0aGlzLmluc3RhbmNlcy5kZWxldGUoaWQpO1xuICAgIHRoaXMubG9hZGluZy5kZWxldGUoaWQpO1xuXG4gICAgaWYgKGxvYWRlZCkgYXdhaXQgbG9hZGVkLmRpc3Bvc2UoKTtcbiAgICBpZiAoIXBlbmRpbmcpIHJldHVybjtcblxuICAgIC8vIEEgcGVuZGluZyBsb2FkIGFzc2lnbnMgaW5zdGFuY2VzW2lkXSBiZWZvcmUgaXRzIHByb21pc2UgcmVzb2x2ZXMsIHNvIGJ5XG4gICAgLy8gdGhlIHRpbWUgdGhpcyBhd2FpdCByZXR1cm5zIHRoZSBlbnRyeSBpcyBiYWNrLiBDbGVhciBpdCBvbmx5IGlmIGl0IHN0aWxsXG4gICAgLy8gcG9pbnRzIGF0IHdoYXQgKnRoaXMqIGxvYWQgcHJvZHVjZWQg4oCUIGEgbmV3ZXIgbG9hZCBzdGFydGVkIGluIHRoZVxuICAgIC8vIG1lYW50aW1lIG93bnMgaXRzIG93biBlbnRyeSBhbmQgbXVzdCBub3QgYmUgZXZpY3RlZC5cbiAgICBjb25zdCBzZWcgPSBhd2FpdCBwZW5kaW5nLmNhdGNoKCgpID0+IG51bGwpO1xuICAgIGlmICghc2VnIHx8IHNlZyA9PT0gbG9hZGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaW5zdGFuY2VzLmdldChpZCkgPT09IHNlZykgdGhpcy5pbnN0YW5jZXMuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBzZWcuZGlzcG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1aXJlTW9kZWwobW9kZWxJZDogc3RyaW5nKTogWW9sb01vZGVsRGVmIHtcbiAgICBjb25zdCBkZWYgPSBnZXRZb2xvTW9kZWwobW9kZWxJZCk7XG4gICAgaWYgKCFkZWYpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBZT0xPIG1vZGVsIGlkIFwiJHttb2RlbElkfVwiLmApO1xuICAgIGlmICghZGVmLm1vZGVsVXJsLnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBZT0xPIG1vZGVsIFwiJHttb2RlbElkfVwiIGlzIG5vdCBjb25maWd1cmVkIOKAlCBpdHMgbW9kZWxVcmwgaXMgZW1wdHkuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWY7XG4gIH1cbn1cbiJdfQ==