@jax-data-science/sci-image-visualizer 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +19 -1
- package/esm2022/lib/contracts/display-types.mjs +7 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +4 -1
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +3 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
- package/esm2022/lib/spatial/lod.mjs +6 -3
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +8 -3
- package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +4 -3
- package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
- package/esm2022/lib/store/visualizer-store.service.mjs +50 -1
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs} +1064 -318
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/lib/contracts/channel-histogram-api.contract.d.ts +14 -0
- package/lib/contracts/display-types.d.ts +27 -0
- package/lib/contracts/image.contract.d.ts +2 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
- package/lib/contracts/visualizer.contract.d.ts +3 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
- package/lib/spatial/lod.d.ts +3 -1
- package/lib/spatial/spatial-controls.facade.d.ts +3 -0
- package/lib/spatial/spatial-gene-filter.d.ts +44 -0
- package/lib/spatial/spatial-tile-merge.d.ts +17 -0
- package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
- package/lib/store/visualizer-store.service.d.ts +13 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { firstValueFrom } from 'rxjs';
|
|
1
|
+
import { firstValueFrom, of } from 'rxjs';
|
|
2
2
|
import { isSpatialOmics3d } from '../contracts/plot-type';
|
|
3
3
|
import { isCategoricalColumn, } from '../contracts/spatial-dataset.contract';
|
|
4
4
|
import { resolveCategoryColors } from './spatial-encoding';
|
|
@@ -35,9 +35,13 @@ export class SpatialControlsFacade {
|
|
|
35
35
|
// A colour source the new dataset cannot satisfy would leave the map flat while
|
|
36
36
|
// the panel and the charts kept naming the old column — so drop it, and only it:
|
|
37
37
|
// point size, opacity and the rest are the user's preferences.
|
|
38
|
-
const
|
|
38
|
+
const current = ctx.store.currentSpatialView();
|
|
39
|
+
const by = current.colorBy;
|
|
39
40
|
if (by && !canColorBy(dataset, by))
|
|
40
41
|
ctx.store.setSpatialView({ colorBy: null });
|
|
42
|
+
// The gene filter names the old dataset's genes: kept, it could hide every observation.
|
|
43
|
+
if (current.observationGenes?.length)
|
|
44
|
+
ctx.store.setSpatialView({ observationGenes: [] });
|
|
41
45
|
});
|
|
42
46
|
this.controls = this.build();
|
|
43
47
|
}
|
|
@@ -112,6 +116,7 @@ export class SpatialControlsFacade {
|
|
|
112
116
|
getTranscriptEstimate$: () => this.ctx.napari.transcriptEstimate$.asObservable(),
|
|
113
117
|
getGeneCountsInView$: () => this.ctx.napari.geneCountsInView$.asObservable(),
|
|
114
118
|
getDensityStats$: () => this.ctx.napari.densityStats$.asObservable(),
|
|
119
|
+
getGeneFilterFailed$: () => this.ctx.napari.geneFilterFailed$?.asObservable() ?? of(false),
|
|
115
120
|
categoryColors: async (name) => {
|
|
116
121
|
const column = await port.getColumn(name);
|
|
117
122
|
if (!isCategoricalColumn(column)) {
|
|
@@ -247,4 +252,4 @@ function canColorBy(dataset, by) {
|
|
|
247
252
|
const names = dataset.features?.names;
|
|
248
253
|
return !!dataset.features && (!names || names.includes(by.name));
|
|
249
254
|
}
|
|
250
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jb250cm9scy5mYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFaEUsT0FBTyxFQUFZLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHcEUsT0FBTyxFQUlMLG1CQUFtQixHQUNwQixNQUFNLHVDQUF1QyxDQUFDO0FBSy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0UsT0FBTyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixlQUFlLEVBQ2Ysd0JBQXdCLEdBQ3pCLE1BQU0scUJBQXFCLENBQUM7QUE0QjdCOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFVaEMsWUFDbUIsSUFBcUIsRUFDckIsR0FBMkI7UUFEM0IsU0FBSSxHQUFKLElBQUksQ0FBaUI7UUFDckIsUUFBRyxHQUFILEdBQUcsQ0FBd0I7UUFUOUM7b0ZBQzRFO1FBQ3BFLFlBQU8sR0FBMEIsSUFBSSxDQUFDO1FBRTlDLHVGQUF1RjtRQUMvRSxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBTXJCLGlGQUFpRjtRQUNqRix3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEQsTUFBTSxPQUFPLEdBQUcsT0FBTyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FB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LEVBQUUsRUFBRTtnQkFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxLQUFLLEtBQUssQ0FBQztvQkFBRSxPQUFPLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QyxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDekIsQ0FBQztZQUVELGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUU7U0FDdEQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsVUFBVSxDQUFDLE9BQThCLEVBQUUsRUFBa0I7SUFDcEUsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO0lBQ3RDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ25FLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFBsb3RUeXBlLCBpc1NwYXRpYWxPbWljczNkIH0gZnJvbSAnLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQgeyBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgU3BhdGlhbENvbG9yQnkgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgSVNwYXRpYWxDb250cm9scywgUm9pU2VsZWN0aW9uTW9kZSB9IGZyb20gJy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi4vc3RvcmUvc3BhdGlhbC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzIH0gZnJvbSAnLi9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IHNlY3Rpb25zT2YgfSBmcm9tICcuL3NwYXRpYWwtc2VjdGlvbnMnO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TbGljZSwgdm9sdW1lSW1hZ2VSZWYgfSBmcm9tICcuL3NwYXRpYWwtdm9sdW1lLWltYWdlJztcbmltcG9ydCB7XG4gIGVtcHR5U2VsZWN0aW9uLFxuICBzZWxlY3RCeUNhdGVnb3J5LFxuICBzZWxlY3RCeUluZGljZXMsXG4gIHNlbGVjdEluQ2xhc3NWb2x1bWVzLFxuICBzZWxlY3RJblJlZ2lvbnMsXG4gIHNlbGVjdEluUmVnaW9uc1Byb2plY3RlZCxcbn0gZnJvbSAnLi9zcGF0aWFsLXNlbGVjdGlvbic7XG5cbi8qKiBUaGUgcmVuZGVyZXItc2lkZSBzcGF0aWFsIHJlYWRvdXRzIHRoZSBjb250cm9scyBzdXJmYWNlICh0aGUgbmFwYXJpLWpzIGJhY2tlbmQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsUmVuZGVyZXJGZWVkcyB7XG4gIHJlYWRvbmx5IHRyYW5zY3JpcHRFc3RpbWF0ZSQ6IHsgYXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8eyBwb2ludHM6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+IH07XG4gIHJlYWRvbmx5IGdlbmVDb3VudHNJblZpZXckOiB7IGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsPiB9O1xuICByZWFkb25seSBkZW5zaXR5U3RhdHMkOiB7IGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+IH07XG4gIC8qKiBPYnNlcnZhdGlvbnMgcHJvamVjdGVkIHRvIGNhbnZhcyBwaXhlbHMgYnkgdGhlIDNEIGNhbWVyYSwgb3IgbnVsbCB3aGVuIHRoZSBjbG91ZCBpcyBub3QgbW91bnRlZC4gKi9cbiAgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb24ob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbDtcbiAgLyoqIFRoZSBpZHMgb2YgdGhlIHJlZ2lvbnMgZHJhd24gb3ZlciB0aGUgM0QgY2xvdWQgaW4gc2NyZWVuIHNwYWNlIChpdHMgbGFzc29zKS4gKi9cbiAgZ2V0U3BhdGlhbExhc3NvSWRzKCk6IG51bWJlcltdO1xuICAvKiogSW1hZ2UgcHggcGVyIHZveGVsIG9mIHRoZSB2b2x1bWUgdGhlIHJlZ2lvbiBzdXJmYWNlcyBzaXQgaW47IG51bGwgd2hlbiB0aGUgcGxvdHRlZCBpbWFnZSBpc1xuICAgKiAgbm90IGEgdm9sdW1lJ3Mgc3RhY2sgKHRoZSByZWdpb25zIGFyZSB0aGVuIG5vdCBpbiB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIGdyaWQpLiAqL1xuICByZWdpb25Wb3hlbFN0ZXAoKTogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqIFdoYXQgdGhlIGZhY2FkZSB3b3JrcyBvdmVyOiB0aGUgc2hhcmVkIHN0b3JlcywgdGhlIHJlbmRlcmVyIGZlZWRzIGFuZCB0aGUgcm91dGVyJ3MgdmlldyBzdGF0ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbENvbnRyb2xzQ29udGV4dCB7XG4gIHJlYWRvbmx5IHN0b3JlOiBWaXN1YWxpemVyU3RvcmU7XG4gIHJlYWRvbmx5IHJlZ2lvblN0b3JlOiBSZWdpb25TdG9yZTtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZTtcbiAgcmVhZG9ubHkgbmFwYXJpOiBTcGF0aWFsUmVuZGVyZXJGZWVkcztcbiAgLyoqIFRoZSBwbG90IHR5cGUgb24gc2NyZWVuICh0aGUgM0QgY2xvdWQgc2VsZWN0cyBpbiBzY3JlZW4gc3BhY2UpLiAqL1xuICBwbG90VHlwZSgpOiBQbG90VHlwZTtcbiAgLyoqIFRoZSBkaXNwbGF5ZWQgc2xpY2UgKGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHNlbGVjdHMgd2l0aGluIG9uZSBzZWN0aW9uKS4gKi9cbiAgekluZGV4KCk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgc3BhdGlhbC1vbWljcyBjb250cm9scyAoYElTcGF0aWFsQ29udHJvbHNgKSBvdmVyIGEgaG9zdCdzIGBTUEFUSUFMX0RBVEFfUE9SVGAuXG4gKlxuICogQmFja2VuZC1uZXV0cmFsOiB0aGUgdmlldyBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIGBWaXN1YWxpemVyU3RvcmVgIChsaWtlIHRoZVxuICogY29sb3JtYXApIGFuZCB0aGUgc2VsZWN0aW9uIGluIHRoZSBgU3BhdGlhbFNlbGVjdGlvblN0b3JlYCwgc28gdGhlIGNvbnRyb2xzIGtlZXBcbiAqIHdvcmtpbmcgYWNyb3NzIGEgcGxvdC10eXBlIHN3aXRjaCBhbmQgYSBob3N0IGNhbiBkcml2ZSB0aGVtIGJlZm9yZSBhbnkgYmFja2VuZCBoYXNcbiAqIG1vdW50ZWQuIE93bnMgaXRzIG1pcnJvciBvZiB0aGUgcG9ydCdzIGRhdGFzZXQg4oCUIGRyb3BwaW5nIGEgc3RhbGUgc2VsZWN0aW9uIGFuZCBhblxuICogdW5zYXRpc2ZpYWJsZSBjb2xvdXIgc291cmNlIHdoZW4gdGhlIGRhdGFzZXQgY2hhbmdlcyDigJQgYW5kIHRoZSBzdWJzY3JpcHRpb24gYmVoaW5kXG4gKiBpdCwgcmVsZWFzZWQgYnkge0BsaW5rIGRpc3Bvc2V9IChyZXZpZXcgQ09SRS0zMCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGF0aWFsQ29udHJvbHNGYWNhZGUge1xuICAvKiogVGhlIGNvbnRyb2xzOyBvbmUgb2JqZWN0IGZvciB0aGUgZmFjYWRlJ3MgbGlmZSwgc28gY29uc3VtZXJzIGNhbiBob2xkIGl0LiAqL1xuICByZWFkb25seSBjb250cm9sczogSVNwYXRpYWxDb250cm9scztcbiAgLyoqIExhdGVzdCBkYXRhc2V0LCBtaXJyb3JlZCBzbyBgc2VsZWN0RnJvbVJlZ2lvbnMoKWAgYW5zd2VycyBmcm9tIHRoZSBkYXRhc2V0IG9uXG4gICAqICBzY3JlZW4g4oCUIGl0IHJ1bnMgZnJvbSBhIGJ1dHRvbiBjbGljayBhbmQgbXVzdCBub3QgYXdhaXQgYSByb3VuZC10cmlwLiAqL1xuICBwcml2YXRlIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViOiBTdWJzY3JpcHRpb247XG4gIC8qKiBCdW1wZWQgcGVyIGNsYXNzLXZvbHVtZSBzZWxlY3Rpb24gKGFuZCBvbiBkaXNwb3NlKTogb25seSB0aGUgbGF0ZXN0IG1heSBwdWJsaXNoLiAqL1xuICBwcml2YXRlIHJvaVJlcXVlc3QgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9ydDogU3BhdGlhbERhdGFQb3J0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBTcGF0aWFsQ29udHJvbHNDb250ZXh0LFxuICApIHtcbiAgICAvLyBNaXJyb3IgdGhlIGRhdGFzZXQgKGFuZCBkcm9wIGEgc3RhbGUgc2VsZWN0aW9uIHdoZW4gaXQgY2hhbmdlcyDigJQgdGhlIG1hc2tzIGFyZVxuICAgIC8vIGluZGV4LWJhc2VkLCBzbyB0aGV5IGFyZSBtZWFuaW5nbGVzcyBhZ2FpbnN0IGRpZmZlcmVudCBvYnNlcnZhdGlvbnMpLlxuICAgIHRoaXMuc3ViID0gcG9ydC5nZXREYXRhc2V0JCgpLnN1YnNjcmliZSgoZGF0YXNldCkgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlZCA9IGRhdGFzZXQ/LmlkICE9PSB0aGlzLmRhdGFzZXQ/LmlkO1xuICAgICAgdGhpcy5kYXRhc2V0ID0gZGF0YXNldDtcbiAgICAgIGlmICghY2hhbmdlZCkgcmV0dXJuO1xuICAgICAgY3R4LnNlbGVjdGlvblN0b3JlLnNldChlbXB0eVNlbGVjdGlvbihkYXRhc2V0Py5vYnNlcnZhdGlvbnMuY291bnQgPz8gMCkpO1xuICAgICAgLy8gQSBjb2xvdXIgc291cmNlIHRoZSBuZXcgZGF0YXNldCBjYW5ub3Qgc2F0aXNmeSB3b3VsZCBsZWF2ZSB0aGUgbWFwIGZsYXQgd2hpbGVcbiAgICAgIC8vIHRoZSBwYW5lbCBhbmQgdGhlIGNoYXJ0cyBrZXB0IG5hbWluZyB0aGUgb2xkIGNvbHVtbiDigJQgc28gZHJvcCBpdCwgYW5kIG9ubHkgaXQ6XG4gICAgICAvLyBwb2ludCBzaXplLCBvcGFjaXR5IGFuZCB0aGUgcmVzdCBhcmUgdGhlIHVzZXIncyBwcmVmZXJlbmNlcy5cbiAgICAgIGNvbnN0IGJ5ID0gY3R4LnN0b3JlLmN1cnJlbnRTcGF0aWFsVmlldygpLmNvbG9yQnk7XG4gICAgICBpZiAoYnkgJiYgIWNhbkNvbG9yQnkoZGF0YXNldCwgYnkpKSBjdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBjb2xvckJ5OiBudWxsIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuY29udHJvbHMgPSB0aGlzLmJ1aWxkKCk7XG4gIH1cblxuICAvKiogUmVsZWFzZSB0aGUgcG9ydCBzdWJzY3JpcHRpb24gKHRoZSByb3V0ZXIncyBpbmplY3RvciBpcyBiZWluZyBkZXN0cm95ZWQpLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgLy8gQSBjbGFzcy12b2x1bWUgc2VsZWN0aW9uIHN0aWxsIHJlYWRpbmcgaXRzIG91dGxpbmVzIHB1Ymxpc2hlcyBub3RoaW5nLlxuICAgIHRoaXMucm9pUmVxdWVzdCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyBcIlNlbGVjdCBmcm9tIFJPSXNcIiBzZWxlY3RzIG5vdyDigJQgdGhlIG9uZSBydWxlIGl0cyBleGVjdXRvciBhbmQgdGhlIHBhbmVsJ3MgZGVzY3JpcHRpb25cbiAgICogc2hhcmU6IGluc2lkZSB0aGUgcGlja2VkIGNsYXNzZXMnIHZvbHVtZXMgaW4gdGhlIDNEIGNsb3VkLCB3aGVuIHRoZSBkYXRhc2V0IGhhcyBhIHJlZmVyZW5jZVxuICAgKiB2b2x1bWUgKGFuZCBubyB0aXNzdWUgaW1hZ2UpIGFuZCB0aGUgcGxvdHRlZCBpbWFnZSBpcyB0aGF0IHZvbHVtZSdzIHN0YWNrLCBzbyB0aGUgcmVnaW9ucyBzaXRcbiAgICogaW4gaXRzIGdyaWQ7IGJ5IHRoZSBkcmF3biByZWdpb25zIG90aGVyd2lzZS5cbiAgICovXG4gIHByaXZhdGUgcm9pU2VsZWN0aW9uTW9kZSgpOiBSb2lTZWxlY3Rpb25Nb2RlIHtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5kYXRhc2V0O1xuICAgIGNvbnN0IGVsaWdpYmxlID1cbiAgICAgICEhZGF0YXNldD8udm9sdW1lICYmXG4gICAgICAhZGF0YXNldC5pbWFnZVJlZiAmJlxuICAgICAgaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN0eC5wbG90VHlwZSgpKSAmJlxuICAgICAgdGhpcy5jdHgucmVnaW9uU3RvcmUuZ2V0UGlja2VkQ2xhc3NlcygpLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMuY3R4Lm5hcGFyaS5yZWdpb25Wb3hlbFN0ZXAoKSAhPT0gbnVsbDtcbiAgICByZXR1cm4gZWxpZ2libGUgPyAnY2xhc3Mtdm9sdW1lcycgOiAncmVnaW9ucyc7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkKCk6IElTcGF0aWFsQ29udHJvbHMge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldERhdGFzZXQkOiAoKSA9PiBwb3J0LmdldERhdGFzZXQkKCksXG4gICAgICBnZXRWaWV3U3RhdGUkOiAoKSA9PiB0aGlzLmN0eC5zdG9yZS5nZXRTcGF0aWFsVmlldyQoKSxcbiAgICAgIHZpZXdTdGF0ZTogKCkgPT4gdGhpcy5jdHguc3RvcmUuY3VycmVudFNwYXRpYWxWaWV3KCksXG4gICAgICBzZXRWaWV3U3RhdGU6IChwYXJ0aWFsKSA9PiB0aGlzLmN0eC5zdG9yZS5zZXRTcGF0aWFsVmlldyhwYXJ0aWFsKSxcbiAgICAgIC8vIFRoZSBoaW50IFNFRURTIHRoZSB0b2dnbGUgd2hlbiB0aGUgc291cmNlIGNoYW5nZXMsIGFuZCBub3RoaW5nIGNvbnN1bHRzIGl0XG4gICAgICAvLyBhZnRlcndhcmRzLiBJdCB1c2VkIHRvIGJlIE9SZWQgaW4gYXQgcmVuZGVyIHRpbWUsIHdoaWNoIG1lYW50IGFuIHVuY2hlY2tlZFxuICAgICAgLy8gYm94IGNvdWxkIG5vdCB0dXJuIGxvZyBzY2FsaW5nIG9mZiBmb3IgYSBoaW50ZWQgY29sdW1uIOKAlCBhbmQgdGhlIGxpbmtlZFxuICAgICAgLy8gY2hhcnQsIHdoaWNoIHJlYWRzIGBsb2dTY2FsZWAgYWxvbmUsIGRpc2FncmVlZCB3aXRoIHRoZSBtYXAgYWJvdXQgd2hhdCBpdFxuICAgICAgLy8gd2FzIHNob3dpbmcuIE9uZSBhdXRob3JpdHksIHNldCBvbmNlIHBlciBzb3VyY2UuXG4gICAgICBjb2xvckJ5Q29sdW1uOiAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmRhdGFzZXQ/LmNvbHVtbnMuZmluZCgoYykgPT4gYy5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgY29uc3QgaGludCA9IG1ldGE/LmtpbmQgPT09ICdjb250aW51b3VzJyA/ICEhbWV0YS5sb2dTY2FsZUhpbnQgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5jdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBjb2xvckJ5OiB7IGtpbmQ6ICdjb2x1bW4nLCBuYW1lIH0sIGxvZ1NjYWxlOiBoaW50IH0pO1xuICAgICAgfSxcbiAgICAgIGNvbG9yQnlGZWF0dXJlOiAobmFtZTogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLmN0eC5zdG9yZS5zZXRTcGF0aWFsVmlldyh7XG4gICAgICAgICAgY29sb3JCeTogeyBraW5kOiAnZmVhdHVyZScsIG5hbWUgfSxcbiAgICAgICAgICBsb2dTY2FsZTogISF0aGlzLmRhdGFzZXQ/LmZlYXR1cmVzPy5sb2dTY2FsZUhpbnQsXG4gICAgICAgIH0pLFxuICAgICAgY2xlYXJDb2xvckJ5OiAoKSA9PiB0aGlzLmN0eC5zdG9yZS5zZXRTcGF0aWFsVmlldyh7IGNvbG9yQnk6IG51bGwgfSksXG4gICAgICBzZWFyY2hGZWF0dXJlczogYXN5bmMgKHF1ZXJ5OiBzdHJpbmcsIGxpbWl0ID0gNTApID0+IHtcbiAgICAgICAgLy8gUHJlZmVyIHRoZSBwb3J0J3Mgc2VhcmNoIChhIDMxay1nZW5lIGRhdGFzZXQgZG9lcyBub3Qgc2hpcCBpdHMgbmFtZXMpO1xuICAgICAgICAvLyBvdGhlcndpc2UgZmlsdGVyIHdoYXRldmVyIHRoZSBtYW5pZmVzdCBpbmxpbmVkLlxuICAgICAgICBpZiAocG9ydC5zZWFyY2hGZWF0dXJlcykgcmV0dXJuIHBvcnQuc2VhcmNoRmVhdHVyZXMocXVlcnksIGxpbWl0KTtcbiAgICAgICAgY29uc3QgZGF0YXNldCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHBvcnQuZ2V0RGF0YXNldCQoKSk7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gZGF0YXNldD8uZmVhdHVyZXM/Lm5hbWVzID8/IFtdO1xuICAgICAgICBjb25zdCBxID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIG5hbWVzLmZpbHRlcigobikgPT4gbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKS5zbGljZSgwLCBsaW1pdCk7XG4gICAgICB9LFxuICAgICAgLi4uKHBvcnQuaW1wb3J0R3JvdXBzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW1wb3J0R3JvdXBzOiAobGFiZWw6IHN0cmluZywgdGFibGU6IHN0cmluZykgPT4gcG9ydC5pbXBvcnRHcm91cHMhKGxhYmVsLCB0YWJsZSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihwb3J0LmdldFRyYW5zY3JpcHRDb3VudHNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0cmFuc2NyaXB0Q291bnRzOiAoZ2VuZXM6IHN0cmluZ1tdKSA9PiBwb3J0LmdldFRyYW5zY3JpcHRDb3VudHMhKGdlbmVzKSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKHBvcnQuZ2V0TWFya2VyR2VuZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBtYXJrZXJHZW5lczogKGNvbHVtbjogc3RyaW5nLCBwZXJHcm91cD86IG51bWJlcikgPT4gcG9ydC5nZXRNYXJrZXJHZW5lcyEoY29sdW1uLCBwZXJHcm91cCksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIGdldFRyYW5zY3JpcHRFc3RpbWF0ZSQ6ICgpID0+IHRoaXMuY3R4Lm5hcGFyaS50cmFuc2NyaXB0RXN0aW1hdGUkLmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgZ2V0R2VuZUNvdW50c0luVmlldyQ6ICgpID0+IHRoaXMuY3R4Lm5hcGFyaS5nZW5lQ291bnRzSW5WaWV3JC5hc09ic2VydmFibGUoKSxcbiAgICAgIGdldERlbnNpdHlTdGF0cyQ6ICgpID0+IHRoaXMuY3R4Lm5hcGFyaS5kZW5zaXR5U3RhdHMkLmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgY2F0ZWdvcnlDb2xvcnM6IGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4obmFtZSk7XG4gICAgICAgIGlmICghaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gY29sdW1uIFwiJHtuYW1lfVwiIGlzIGNvbnRpbnVvdXMg4oCUIGl0IGhhcyBubyBjYXRlZ29yaWVzYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzb2x2ZWQgYnkgdGhlIFNBTUUgZnVuY3Rpb24gdGhlIHJlbmRlcmVyIHVzZXMsIHNvIGEgbGVnZW5kIHN3YXRjaFxuICAgICAgICAvLyBjYW4gbmV2ZXIgZGlzYWdyZWUgd2l0aCB0aGUgY29sb3VyIG9uIHNjcmVlbi5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSk7XG4gICAgICB9LFxuXG4gICAgICBjb250aW51b3VzVmFsdWVzOiBhc3luYyAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2Uua2luZCA9PT0gJ2ZlYXR1cmUnKSByZXR1cm4gcG9ydC5nZXRGZWF0dXJlVmVjdG9yKHNvdXJjZS5uYW1lKTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oc291cmNlLm5hbWUpO1xuICAgICAgICBpZiAoaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gY29sdW1uIFwiJHtzb3VyY2UubmFtZX1cIiBpcyBjYXRlZ29yaWNhbCDigJQgaXQgaGFzIG5vIHZhbHVlcyB0byBjaGFydGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW4udmFsdWVzO1xuICAgICAgfSxcblxuICAgICAgY2F0ZWdvcmljYWxWaWV3OiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKG5hbWUpO1xuICAgICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7bmFtZX1cIiBpcyBjb250aW51b3VzIOKAlCBpdCBoYXMgbm8gY2F0ZWdvcmllc2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBjYXRlZ29yaWVzOiBjb2x1bW4ubWV0YS5jYXRlZ29yaWVzLFxuICAgICAgICAgIGNvbG9yczogcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSxcbiAgICAgICAgICBjb2RlczogY29sdW1uLmNvZGVzLFxuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgLy8gU3ByZWFkIHJhdGhlciB0aGFuIGFsd2F5cyBkZWZpbmVkOiBgZ2V0RW1iZWRkaW5nYCBpcyBvcHRpb25hbCBvbiBib3RoIHRoZSBwb3J0XG4gICAgICAvLyBhbmQgdGhpcyBmYWNhZGUsIGFuZCBhIHBhbmVsIGNoZWNrcyBmb3IgaXRzIHByZXNlbmNlIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB2aWV3XG4gICAgICAvLyBpcyBvZmZlcmVkIGF0IGFsbC4gRGVmaW5pbmcgaXQgYXMgYSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgd291bGQgbWFrZSBhblxuICAgICAgLy8gZW1iZWRkaW5nLWxlc3Mgc291cmNlIGxvb2sgbGlrZSBhIGJyb2tlbiBvbmUuXG4gICAgICAuLi4ocG9ydC5nZXRFbWJlZGRpbmcgPyB7IGdldEVtYmVkZGluZzogKG5hbWU6IHN0cmluZykgPT4gcG9ydC5nZXRFbWJlZGRpbmchKG5hbWUpIH0gOiB7fSksXG5cbiAgICAgIGNhdGVnb3JpY2FsQ29sdW1uczogKCkgPT5cbiAgICAgICAgKHRoaXMuZGF0YXNldD8uY29sdW1ucyA/PyBbXSkuZmlsdGVyKChjKSA9PiBjLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpLm1hcCgoYykgPT4gYy5uYW1lKSxcblxuICAgICAgLy8gTWVtb2l6ZWQgb24gdGhlIG9ic2VydmF0aW9ucyBvYmplY3QsIHNvIHRoZSByZW5kZXJlcidzIG93biBsb29rdXAgYW5kXG4gICAgICAvLyB0aGlzIG9uZSBhcmUgdGhlIHNhbWUgc2luZ2xlIHNjYW4gb2YgdXAgdG8gMy43TSB6IHZhbHVlcy5cbiAgICAgIHNhbXBsZWRTZWN0aW9uczogKCkgPT4ge1xuICAgICAgICBjb25zdCBvYnMgPSB0aGlzLmRhdGFzZXQ/Lm9ic2VydmF0aW9ucztcbiAgICAgICAgcmV0dXJuIG9icyA/IHNlY3Rpb25zT2Yob2JzKSA6IG51bGw7XG4gICAgICB9LFxuXG4gICAgICBnZXRTZWxlY3Rpb24kOiAoKSA9PiB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5nZXRTZWxlY3Rpb24kKCksXG5cbiAgICAgIHNlbGVjdEZyb21SZWdpb25zOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmRhdGFzZXQ7XG4gICAgICAgIGlmICghZGF0YXNldCkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IGlzM2QgPSBpc1NwYXRpYWxPbWljczNkKHRoaXMuY3R4LnBsb3RUeXBlKCkpO1xuICAgICAgICBjb25zdCB2b2x1bWUgPSAhZGF0YXNldC5pbWFnZVJlZiA/IGRhdGFzZXQudm9sdW1lIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBJbiB0aGUgM0QgY2xvdWQsIHJlZ2lvbiBjbGFzc2VzIHBpY2tlZCBpbiB0aGUgUmVnaW9uIEVkaXRvciAoYSBjbGFzc1xuICAgICAgICAvLyB0cmVlIG5vZGUgd2l0aCBpdHMgc3ViY2xhc3NlcywgYSBzdXJmYWNlIGNsaWNrZWQgaW4gM0QpIHNlbGVjdCB0aGVcbiAgICAgICAgLy8gY2VsbHMgaW5zaWRlIHRoZWlyIHZvbHVtZXMg4oCUIHRoZSBzdHJ1Y3R1cmVzIHNob3duIGFtb25nIHRoZSBjZWxscy5cbiAgICAgICAgaWYgKHZvbHVtZSAmJiB0aGlzLnJvaVNlbGVjdGlvbk1vZGUoKSA9PT0gJ2NsYXNzLXZvbHVtZXMnKSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NlcyA9IHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMoKTtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLnJvaVJlcXVlc3Q7XG4gICAgICAgICAgY29uc3QgcmV2aXNpb24gPSB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5yZXZpc2lvbigpO1xuICAgICAgICAgIGNvbnN0IG91dGxpbmVzID0gYXdhaXQgdGhpcy5jdHgucmVnaW9uU3RvcmUuY2xhc3NTbGljZU91dGxpbmVzKGNsYXNzZXMpO1xuICAgICAgICAgIC8vIFN1cGVyc2VkZWQgd2hpbGUgdGhlIG91dGxpbmVzIHdlcmUgcmVhZDogYSBuZXdlciByZXF1ZXN0LCBhbnkgbmV3ZXIgc2VsZWN0aW9uXG4gICAgICAgICAgLy8gKGEgQ2xlYXIsIGEgbGVnZW5kIGNsaWNrLCBhIGxpbmtlZCBjaGFydCdzIGJydXNoKSwgYW5vdGhlciBkYXRhc2V0LCB2aWV3IG9yIHBpY2ssXG4gICAgICAgICAgLy8gb3IgdGhlIGZhY2FkZSBkaXNwb3NlZC4gSXRzIG1hc2sgd291bGQgb3ZlcndyaXRlIHdoYXQgdGhlIHVzZXIgZGlkIHNpbmNlLlxuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN0eC5yZWdpb25TdG9yZS5nZXRQaWNrZWRDbGFzc2VzKCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVxdWVzdCAhPT0gdGhpcy5yb2lSZXF1ZXN0IHx8XG4gICAgICAgICAgICByZXZpc2lvbiAhPT0gdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUucmV2aXNpb24oKSB8fFxuICAgICAgICAgICAgdGhpcy5kYXRhc2V0ICE9PSBkYXRhc2V0IHx8XG4gICAgICAgICAgICB0aGlzLnJvaVNlbGVjdGlvbk1vZGUoKSAhPT0gJ2NsYXNzLXZvbHVtZXMnIHx8XG4gICAgICAgICAgICBjdXJyZW50Lmxlbmd0aCAhPT0gY2xhc3Nlcy5sZW5ndGggfHxcbiAgICAgICAgICAgIGN1cnJlbnQuc29tZSgoYywgaSkgPT4gYyAhPT0gY2xhc3Nlc1tpXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBzZWxlY3RJbkNsYXNzVm9sdW1lcyhkYXRhc2V0Lm9ic2VydmF0aW9ucywgdm9sdW1lLCBvdXRsaW5lcyk7XG4gICAgICAgICAgdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuc2V0KHNlbGVjdGlvbik7XG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5jb3VudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgdGhlIHVuaW9uIG9mIGV2ZXJ5IGRyYXduIHJlZ2lvbiDigJQgc28gZXZlcnkgUk9JIHRvb2wgdGhlXG4gICAgICAgIC8vIGxpYnJhcnkgYWxyZWFkeSBoYXMgZG91YmxlcyBhcyBhIHNwYXRpYWwgc2VsZWN0aW9uIHRvb2wuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEluIHRoZSAzRCBjbG91ZCB0aGVyZSBpcyBubyBkYXRhLXNwYWNlIGFmZmluZSB0byBwdXNoIGEgZHJhd24gc2hhcGVcbiAgICAgICAgLy8gdGhyb3VnaCwgc28gdGhlIG9ic2VydmF0aW9ucyBhcmUgcHJvamVjdGVkIHRvIGNhbnZhcyBwaXhlbHMgYnkgdGhlXG4gICAgICAgIC8vIHJlbmRlcmVyICh3aGljaCBvd25zIHRoZSBjYW1lcmEpIGFuZCB0ZXN0ZWQgaW4gc2NyZWVuIHNwYWNlIGluc3RlYWQg4oCUXG4gICAgICAgIC8vIGFnYWluc3QgdGhlIGxhc3NvcyBkcmF3biB0aGVyZSBvbmx5OiBldmVyeSBvdGhlciByZWdpb24gaXMgaW4gaW1hZ2VcbiAgICAgICAgLy8gc3BhY2UuIEZhbGxzIGJhY2sgdG8gdGhlIDJEIHBhdGggd2hlbmV2ZXIgdGhlIGNsb3VkIGlzIG5vdCBtb3VudGVkLlxuICAgICAgICBjb25zdCBwcm9qZWN0ZWQgPSBpczNkID8gdGhpcy5jdHgubmFwYXJpLmdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9uKGRhdGFzZXQub2JzZXJ2YXRpb25zKSA6IG51bGw7XG4gICAgICAgIGxldCBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrO1xuICAgICAgICBpZiAocHJvamVjdGVkKSB7XG4gICAgICAgICAgY29uc3QgbGFzc29zID0gbmV3IFNldCh0aGlzLmN0eC5uYXBhcmkuZ2V0U3BhdGlhbExhc3NvSWRzKCkpO1xuICAgICAgICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLmN0eC5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiBsYXNzb3MuaGFzKHIuaWQpKTtcbiAgICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQocHJvamVjdGVkLCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCwgcmVnaW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSW4gdGhlIDJEIHZpZXcgb2YgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgdGhlIHNoYXBlIHdhcyBkcmF3biBvdmVyIE9ORVxuICAgICAgICAgIC8vIHNlY3Rpb24sIGluIHRoZSB2b2x1bWUncyBwaXhlbCBncmlkOiBpdCBzZWxlY3RzIHRoZSBjZWxscyBvZiB0aGF0XG4gICAgICAgICAgLy8gc2VjdGlvbiwgbm90IHRoZSB3aG9sZSBkZXB0aCBvZiBicmFpbiBzdGFuZGluZyBiZWhpbmQgdGhlbS5cbiAgICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3RJblJlZ2lvbnMoXG4gICAgICAgICAgICBkYXRhc2V0Lm9ic2VydmF0aW9ucyxcbiAgICAgICAgICAgIHZvbHVtZSA/IHZvbHVtZUltYWdlUmVmKHZvbHVtZSwgZGF0YXNldC5taWNyb25zUGVyVW5pdCkgOiBkYXRhc2V0LmltYWdlUmVmLFxuICAgICAgICAgICAgdGhpcy5jdHgucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgICAgICAgdm9sdW1lID8gb2JzZXJ2YXRpb25zSW5TbGljZShkYXRhc2V0Lm9ic2VydmF0aW9ucywgdm9sdW1lLCB0aGlzLmN0eC56SW5kZXgoKSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5zZXQoc2VsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5jb3VudDtcbiAgICAgIH0sXG5cbiAgICAgIHJvaVNlbGVjdGlvbk1vZGU6ICgpID0+IHRoaXMucm9pU2VsZWN0aW9uTW9kZSgpLFxuXG4gICAgICBnZXRQaWNrZWRSZWdpb25DbGFzc2VzJDogKCkgPT4gdGhpcy5jdHgucmVnaW9uU3RvcmUuZ2V0UGlja2VkQ2xhc3NlcyQoKSxcblxuICAgICAgc2VsZWN0Q2F0ZWdvcnk6IGFzeW5jIChjb2x1bW46IHN0cmluZywgY2F0ZWdvcnlJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgICAgIGlmICghaXNDYXRlZ29yaWNhbENvbHVtbihsb2FkZWQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gY29sdW1uIFwiJHtjb2x1bW59XCIgaXMgY29udGludW91cyDigJQgaXQgaGFzIG5vIGNhdGVnb3JpZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBzZWxlY3RCeUNhdGVnb3J5KGxvYWRlZC5jb2RlcywgY2F0ZWdvcnlJbmRleCk7XG4gICAgICAgIHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLnNldChzZWxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmNvdW50O1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0SW5kaWNlczogKGluZGljZXM6IEl0ZXJhYmxlPG51bWJlcj4pID0+IHtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmRhdGFzZXQ/Lm9ic2VydmF0aW9ucy5jb3VudCA/PyAwO1xuICAgICAgICBpZiAoY291bnQgPT09IDApIHJldHVybiAwO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBzZWxlY3RCeUluZGljZXMoaW5kaWNlcywgY291bnQpO1xuICAgICAgICB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5zZXQoc2VsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5jb3VudDtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyU2VsZWN0aW9uOiAoKSA9PiB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5jbGVhcigpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBkYXRhc2V0YCBjYW4gYW5zd2VyIHRoaXMgY29sb3VyIHNvdXJjZS4gQSBjb2x1bW4gaXMgY2hlY2thYmxlIGFnYWluc3QgdGhlXG4gKiBkZWNsYXJlZCBsaXN0LiBBIGdlbmUgaXMgY2hlY2thYmxlIG9ubHkgd2hlbiB0aGUgZGF0YXNldCBpbmxpbmVzIGl0cyBmZWF0dXJlIG5hbWVzIOKAlFxuICogYSBkYXRhc2V0IHRvbyB3aWRlIHRvIGlubGluZSB0aGVtICh0eXBlYWhlYWQtb25seSkga2VlcHMgdGhlIHNvdXJjZSwgYW5kIGEgbmFtZSB0aGF0XG4gKiB0dXJucyBvdXQgbm90IHRvIGV4aXN0IHN1cmZhY2VzIGFzIHRoZSBjaGFydCdzIFwiY291bGQgbm90IGJlIGNoYXJ0ZWRcIiByYXRoZXIgdGhhbiBhc1xuICogYSBzaWxlbnQgcmVzZXQuXG4gKi9cbmZ1bmN0aW9uIGNhbkNvbG9yQnkoZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLCBieTogU3BhdGlhbENvbG9yQnkpOiBib29sZWFuIHtcbiAgaWYgKCFkYXRhc2V0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChieS5raW5kID09PSAnY29sdW1uJykgcmV0dXJuIGRhdGFzZXQuY29sdW1ucy5zb21lKChjKSA9PiBjLm5hbWUgPT09IGJ5Lm5hbWUpO1xuICBjb25zdCBuYW1lcyA9IGRhdGFzZXQuZmVhdHVyZXM/Lm5hbWVzO1xuICByZXR1cm4gISFkYXRhc2V0LmZlYXR1cmVzICYmICghbmFtZXMgfHwgbmFtZXMuaW5jbHVkZXMoYnkubmFtZSkpO1xufVxuIl19
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jb250cm9scy5mYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBYyxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBWSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3BFLE9BQU8sRUFJTCxtQkFBbUIsR0FDcEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUsvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdFLE9BQU8sRUFDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLHdCQUF3QixHQUN6QixNQUFNLHFCQUFxQixDQUFDO0FBNkI3Qjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBVWhDLFlBQ21CLElBQXFCLEVBQ3JCLEdBQTJCO1FBRDNCLFNBQUksR0FBSixJQUFJLENBQWlCO1FBQ3JCLFFBQUcsR0FBSCxHQUFHLENBQXdCO1FBVDlDO29GQUM0RTtRQUNwRSxZQUFPLEdBQTBCLElBQUksQ0FBQztRQUU5Qyx1RkFBdUY7UUFDL0UsZUFBVSxHQUFHLENBQUMsQ0FBQztRQU1yQixpRkFBaUY7UUFDakYsd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2xELE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxFQUFFLEtBQUssSUFB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QUM7SUFDakYsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFDdEMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFBsb3RUeXBlLCBpc1NwYXRpYWxPbWljczNkIH0gZnJvbSAnLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQgeyBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgU3BhdGlhbENvbG9yQnkgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgSVNwYXRpYWxDb250cm9scywgUm9pU2VsZWN0aW9uTW9kZSB9IGZyb20gJy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi4vc3RvcmUvc3BhdGlhbC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzIH0gZnJvbSAnLi9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IHNlY3Rpb25zT2YgfSBmcm9tICcuL3NwYXRpYWwtc2VjdGlvbnMnO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TbGljZSwgdm9sdW1lSW1hZ2VSZWYgfSBmcm9tICcuL3NwYXRpYWwtdm9sdW1lLWltYWdlJztcbmltcG9ydCB7XG4gIGVtcHR5U2VsZWN0aW9uLFxuICBzZWxlY3RCeUNhdGVnb3J5LFxuICBzZWxlY3RCeUluZGljZXMsXG4gIHNlbGVjdEluQ2xhc3NWb2x1bWVzLFxuICBzZWxlY3RJblJlZ2lvbnMsXG4gIHNlbGVjdEluUmVnaW9uc1Byb2plY3RlZCxcbn0gZnJvbSAnLi9zcGF0aWFsLXNlbGVjdGlvbic7XG5cbi8qKiBUaGUgcmVuZGVyZXItc2lkZSBzcGF0aWFsIHJlYWRvdXRzIHRoZSBjb250cm9scyBzdXJmYWNlICh0aGUgbmFwYXJpLWpzIGJhY2tlbmQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsUmVuZGVyZXJGZWVkcyB7XG4gIHJlYWRvbmx5IHRyYW5zY3JpcHRFc3RpbWF0ZSQ6IHsgYXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8eyBwb2ludHM6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+IH07XG4gIHJlYWRvbmx5IGdlbmVDb3VudHNJblZpZXckOiB7IGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsPiB9O1xuICByZWFkb25seSBkZW5zaXR5U3RhdHMkOiB7IGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+IH07XG4gIHJlYWRvbmx5IGdlbmVGaWx0ZXJGYWlsZWQkPzogeyBhc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB9O1xuICAvKiogT2JzZXJ2YXRpb25zIHByb2plY3RlZCB0byBjYW52YXMgcGl4ZWxzIGJ5IHRoZSAzRCBjYW1lcmEsIG9yIG51bGwgd2hlbiB0aGUgY2xvdWQgaXMgbm90IG1vdW50ZWQuICovXG4gIGdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9uKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGw7XG4gIC8qKiBUaGUgaWRzIG9mIHRoZSByZWdpb25zIGRyYXduIG92ZXIgdGhlIDNEIGNsb3VkIGluIHNjcmVlbiBzcGFjZSAoaXRzIGxhc3NvcykuICovXG4gIGdldFNwYXRpYWxMYXNzb0lkcygpOiBudW1iZXJbXTtcbiAgLyoqIEltYWdlIHB4IHBlciB2b3hlbCBvZiB0aGUgdm9sdW1lIHRoZSByZWdpb24gc3VyZmFjZXMgc2l0IGluOyBudWxsIHdoZW4gdGhlIHBsb3R0ZWQgaW1hZ2UgaXNcbiAgICogIG5vdCBhIHZvbHVtZSdzIHN0YWNrICh0aGUgcmVnaW9ucyBhcmUgdGhlbiBub3QgaW4gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBncmlkKS4gKi9cbiAgcmVnaW9uVm94ZWxTdGVwKCk6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKiBXaGF0IHRoZSBmYWNhZGUgd29ya3Mgb3ZlcjogdGhlIHNoYXJlZCBzdG9yZXMsIHRoZSByZW5kZXJlciBmZWVkcyBhbmQgdGhlIHJvdXRlcidzIHZpZXcgc3RhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxDb250cm9sc0NvbnRleHQge1xuICByZWFkb25seSBzdG9yZTogVmlzdWFsaXplclN0b3JlO1xuICByZWFkb25seSByZWdpb25TdG9yZTogUmVnaW9uU3RvcmU7XG4gIHJlYWRvbmx5IHNlbGVjdGlvblN0b3JlOiBTcGF0aWFsU2VsZWN0aW9uU3RvcmU7XG4gIHJlYWRvbmx5IG5hcGFyaTogU3BhdGlhbFJlbmRlcmVyRmVlZHM7XG4gIC8qKiBUaGUgcGxvdCB0eXBlIG9uIHNjcmVlbiAodGhlIDNEIGNsb3VkIHNlbGVjdHMgaW4gc2NyZWVuIHNwYWNlKS4gKi9cbiAgcGxvdFR5cGUoKTogUGxvdFR5cGU7XG4gIC8qKiBUaGUgZGlzcGxheWVkIHNsaWNlIChhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCBzZWxlY3RzIHdpdGhpbiBvbmUgc2VjdGlvbikuICovXG4gIHpJbmRleCgpOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHNwYXRpYWwtb21pY3MgY29udHJvbHMgKGBJU3BhdGlhbENvbnRyb2xzYCkgb3ZlciBhIGhvc3QncyBgU1BBVElBTF9EQVRBX1BPUlRgLlxuICpcbiAqIEJhY2tlbmQtbmV1dHJhbDogdGhlIHZpZXcgc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBgVmlzdWFsaXplclN0b3JlYCAobGlrZSB0aGVcbiAqIGNvbG9ybWFwKSBhbmQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgYFNwYXRpYWxTZWxlY3Rpb25TdG9yZWAsIHNvIHRoZSBjb250cm9scyBrZWVwXG4gKiB3b3JraW5nIGFjcm9zcyBhIHBsb3QtdHlwZSBzd2l0Y2ggYW5kIGEgaG9zdCBjYW4gZHJpdmUgdGhlbSBiZWZvcmUgYW55IGJhY2tlbmQgaGFzXG4gKiBtb3VudGVkLiBPd25zIGl0cyBtaXJyb3Igb2YgdGhlIHBvcnQncyBkYXRhc2V0IOKAlCBkcm9wcGluZyBhIHN0YWxlIHNlbGVjdGlvbiBhbmQgYW5cbiAqIHVuc2F0aXNmaWFibGUgY29sb3VyIHNvdXJjZSB3aGVuIHRoZSBkYXRhc2V0IGNoYW5nZXMg4oCUIGFuZCB0aGUgc3Vic2NyaXB0aW9uIGJlaGluZFxuICogaXQsIHJlbGVhc2VkIGJ5IHtAbGluayBkaXNwb3NlfSAocmV2aWV3IENPUkUtMzApLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbENvbnRyb2xzRmFjYWRlIHtcbiAgLyoqIFRoZSBjb250cm9sczsgb25lIG9iamVjdCBmb3IgdGhlIGZhY2FkZSdzIGxpZmUsIHNvIGNvbnN1bWVycyBjYW4gaG9sZCBpdC4gKi9cbiAgcmVhZG9ubHkgY29udHJvbHM6IElTcGF0aWFsQ29udHJvbHM7XG4gIC8qKiBMYXRlc3QgZGF0YXNldCwgbWlycm9yZWQgc28gYHNlbGVjdEZyb21SZWdpb25zKClgIGFuc3dlcnMgZnJvbSB0aGUgZGF0YXNldCBvblxuICAgKiAgc2NyZWVuIOKAlCBpdCBydW5zIGZyb20gYSBidXR0b24gY2xpY2sgYW5kIG11c3Qgbm90IGF3YWl0IGEgcm91bmQtdHJpcC4gKi9cbiAgcHJpdmF0ZSBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YjogU3Vic2NyaXB0aW9uO1xuICAvKiogQnVtcGVkIHBlciBjbGFzcy12b2x1bWUgc2VsZWN0aW9uIChhbmQgb24gZGlzcG9zZSk6IG9ubHkgdGhlIGxhdGVzdCBtYXkgcHVibGlzaC4gKi9cbiAgcHJpdmF0ZSByb2lSZXF1ZXN0ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcnQ6IFNwYXRpYWxEYXRhUG9ydCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN0eDogU3BhdGlhbENvbnRyb2xzQ29udGV4dCxcbiAgKSB7XG4gICAgLy8gTWlycm9yIHRoZSBkYXRhc2V0IChhbmQgZHJvcCBhIHN0YWxlIHNlbGVjdGlvbiB3aGVuIGl0IGNoYW5nZXMg4oCUIHRoZSBtYXNrcyBhcmVcbiAgICAvLyBpbmRleC1iYXNlZCwgc28gdGhleSBhcmUgbWVhbmluZ2xlc3MgYWdhaW5zdCBkaWZmZXJlbnQgb2JzZXJ2YXRpb25zKS5cbiAgICB0aGlzLnN1YiA9IHBvcnQuZ2V0RGF0YXNldCQoKS5zdWJzY3JpYmUoKGRhdGFzZXQpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZWQgPSBkYXRhc2V0Py5pZCAhPT0gdGhpcy5kYXRhc2V0Py5pZDtcbiAgICAgIHRoaXMuZGF0YXNldCA9IGRhdGFzZXQ7XG4gICAgICBpZiAoIWNoYW5nZWQpIHJldHVybjtcbiAgICAgIGN0eC5zZWxlY3Rpb25TdG9yZS5zZXQoZW1wdHlTZWxlY3Rpb24oZGF0YXNldD8ub2JzZXJ2YXRpb25zLmNvdW50ID8/IDApKTtcbiAgICAgIC8vIEEgY29sb3VyIHNvdXJjZSB0aGUgbmV3IGRhdGFzZXQgY2Fubm90IHNhdGlzZnkgd291bGQgbGVhdmUgdGhlIG1hcCBmbGF0IHdoaWxlXG4gICAgICAvLyB0aGUgcGFuZWwgYW5kIHRoZSBjaGFydHMga2VwdCBuYW1pbmcgdGhlIG9sZCBjb2x1bW4g4oCUIHNvIGRyb3AgaXQsIGFuZCBvbmx5IGl0OlxuICAgICAgLy8gcG9pbnQgc2l6ZSwgb3BhY2l0eSBhbmQgdGhlIHJlc3QgYXJlIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMuXG4gICAgICBjb25zdCBjdXJyZW50ID0gY3R4LnN0b3JlLmN1cnJlbnRTcGF0aWFsVmlldygpO1xuICAgICAgY29uc3QgYnkgPSBjdXJyZW50LmNvbG9yQnk7XG4gICAgICBpZiAoYnkgJiYgIWNhbkNvbG9yQnkoZGF0YXNldCwgYnkpKSBjdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBjb2xvckJ5OiBudWxsIH0pO1xuICAgICAgLy8gVGhlIGdlbmUgZmlsdGVyIG5hbWVzIHRoZSBvbGQgZGF0YXNldCdzIGdlbmVzOiBrZXB0LCBpdCBjb3VsZCBoaWRlIGV2ZXJ5IG9ic2VydmF0aW9uLlxuICAgICAgaWYgKGN1cnJlbnQub2JzZXJ2YXRpb25HZW5lcz8ubGVuZ3RoKSBjdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBvYnNlcnZhdGlvbkdlbmVzOiBbXSB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRyb2xzID0gdGhpcy5idWlsZCgpO1xuICB9XG5cbiAgLyoqIFJlbGVhc2UgdGhlIHBvcnQgc3Vic2NyaXB0aW9uICh0aGUgcm91dGVyJ3MgaW5qZWN0b3IgaXMgYmVpbmcgZGVzdHJveWVkKS4gKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1Yi51bnN1YnNjcmliZSgpO1xuICAgIC8vIEEgY2xhc3Mtdm9sdW1lIHNlbGVjdGlvbiBzdGlsbCByZWFkaW5nIGl0cyBvdXRsaW5lcyBwdWJsaXNoZXMgbm90aGluZy5cbiAgICB0aGlzLnJvaVJlcXVlc3QrKztcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3cgXCJTZWxlY3QgZnJvbSBST0lzXCIgc2VsZWN0cyBub3cg4oCUIHRoZSBvbmUgcnVsZSBpdHMgZXhlY3V0b3IgYW5kIHRoZSBwYW5lbCdzIGRlc2NyaXB0aW9uXG4gICAqIHNoYXJlOiBpbnNpZGUgdGhlIHBpY2tlZCBjbGFzc2VzJyB2b2x1bWVzIGluIHRoZSAzRCBjbG91ZCwgd2hlbiB0aGUgZGF0YXNldCBoYXMgYSByZWZlcmVuY2VcbiAgICogdm9sdW1lIChhbmQgbm8gdGlzc3VlIGltYWdlKSBhbmQgdGhlIHBsb3R0ZWQgaW1hZ2UgaXMgdGhhdCB2b2x1bWUncyBzdGFjaywgc28gdGhlIHJlZ2lvbnMgc2l0XG4gICAqIGluIGl0cyBncmlkOyBieSB0aGUgZHJhd24gcmVnaW9ucyBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIHJvaVNlbGVjdGlvbk1vZGUoKTogUm9pU2VsZWN0aW9uTW9kZSB7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZGF0YXNldDtcbiAgICBjb25zdCBlbGlnaWJsZSA9XG4gICAgICAhIWRhdGFzZXQ/LnZvbHVtZSAmJlxuICAgICAgIWRhdGFzZXQuaW1hZ2VSZWYgJiZcbiAgICAgIGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdHgucGxvdFR5cGUoKSkgJiZcbiAgICAgIHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMoKS5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLmN0eC5uYXBhcmkucmVnaW9uVm94ZWxTdGVwKCkgIT09IG51bGw7XG4gICAgcmV0dXJuIGVsaWdpYmxlID8gJ2NsYXNzLXZvbHVtZXMnIDogJ3JlZ2lvbnMnO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZCgpOiBJU3BhdGlhbENvbnRyb2xzIHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5wb3J0O1xuICAgIHJldHVybiB7XG4gICAgICBnZXREYXRhc2V0JDogKCkgPT4gcG9ydC5nZXREYXRhc2V0JCgpLFxuICAgICAgZ2V0Vmlld1N0YXRlJDogKCkgPT4gdGhpcy5jdHguc3RvcmUuZ2V0U3BhdGlhbFZpZXckKCksXG4gICAgICB2aWV3U3RhdGU6ICgpID0+IHRoaXMuY3R4LnN0b3JlLmN1cnJlbnRTcGF0aWFsVmlldygpLFxuICAgICAgc2V0Vmlld1N0YXRlOiAocGFydGlhbCkgPT4gdGhpcy5jdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcocGFydGlhbCksXG4gICAgICAvLyBUaGUgaGludCBTRUVEUyB0aGUgdG9nZ2xlIHdoZW4gdGhlIHNvdXJjZSBjaGFuZ2VzLCBhbmQgbm90aGluZyBjb25zdWx0cyBpdFxuICAgICAgLy8gYWZ0ZXJ3YXJkcy4gSXQgdXNlZCB0byBiZSBPUmVkIGluIGF0IHJlbmRlciB0aW1lLCB3aGljaCBtZWFudCBhbiB1bmNoZWNrZWRcbiAgICAgIC8vIGJveCBjb3VsZCBub3QgdHVybiBsb2cgc2NhbGluZyBvZmYgZm9yIGEgaGludGVkIGNvbHVtbiDigJQgYW5kIHRoZSBsaW5rZWRcbiAgICAgIC8vIGNoYXJ0LCB3aGljaCByZWFkcyBgbG9nU2NhbGVgIGFsb25lLCBkaXNhZ3JlZWQgd2l0aCB0aGUgbWFwIGFib3V0IHdoYXQgaXRcbiAgICAgIC8vIHdhcyBzaG93aW5nLiBPbmUgYXV0aG9yaXR5LCBzZXQgb25jZSBwZXIgc291cmNlLlxuICAgICAgY29sb3JCeUNvbHVtbjogKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5kYXRhc2V0Py5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgIGNvbnN0IGhpbnQgPSBtZXRhPy5raW5kID09PSAnY29udGludW91cycgPyAhIW1ldGEubG9nU2NhbGVIaW50IDogZmFsc2U7XG4gICAgICAgIHRoaXMuY3R4LnN0b3JlLnNldFNwYXRpYWxWaWV3KHsgY29sb3JCeTogeyBraW5kOiAnY29sdW1uJywgbmFtZSB9LCBsb2dTY2FsZTogaGludCB9KTtcbiAgICAgIH0sXG4gICAgICBjb2xvckJ5RmVhdHVyZTogKG5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5jdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoe1xuICAgICAgICAgIGNvbG9yQnk6IHsga2luZDogJ2ZlYXR1cmUnLCBuYW1lIH0sXG4gICAgICAgICAgbG9nU2NhbGU6ICEhdGhpcy5kYXRhc2V0Py5mZWF0dXJlcz8ubG9nU2NhbGVIaW50LFxuICAgICAgICB9KSxcbiAgICAgIGNsZWFyQ29sb3JCeTogKCkgPT4gdGhpcy5jdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBjb2xvckJ5OiBudWxsIH0pLFxuICAgICAgc2VhcmNoRmVhdHVyZXM6IGFzeW5jIChxdWVyeTogc3RyaW5nLCBsaW1pdCA9IDUwKSA9PiB7XG4gICAgICAgIC8vIFByZWZlciB0aGUgcG9ydCdzIHNlYXJjaCAoYSAzMWstZ2VuZSBkYXRhc2V0IGRvZXMgbm90IHNoaXAgaXRzIG5hbWVzKTtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZpbHRlciB3aGF0ZXZlciB0aGUgbWFuaWZlc3QgaW5saW5lZC5cbiAgICAgICAgaWYgKHBvcnQuc2VhcmNoRmVhdHVyZXMpIHJldHVybiBwb3J0LnNlYXJjaEZlYXR1cmVzKHF1ZXJ5LCBsaW1pdCk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShwb3J0LmdldERhdGFzZXQkKCkpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IGRhdGFzZXQ/LmZlYXR1cmVzPy5uYW1lcyA/PyBbXTtcbiAgICAgICAgY29uc3QgcSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBuYW1lcy5maWx0ZXIoKG4pID0+IG4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkuc2xpY2UoMCwgbGltaXQpO1xuICAgICAgfSxcbiAgICAgIC4uLihwb3J0LmltcG9ydEdyb3Vwc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIGltcG9ydEdyb3VwczogKGxhYmVsOiBzdHJpbmcsIHRhYmxlOiBzdHJpbmcpID0+IHBvcnQuaW1wb3J0R3JvdXBzIShsYWJlbCwgdGFibGUpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4ocG9ydC5nZXRUcmFuc2NyaXB0Q291bnRzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdHJhbnNjcmlwdENvdW50czogKGdlbmVzOiBzdHJpbmdbXSkgPT4gcG9ydC5nZXRUcmFuc2NyaXB0Q291bnRzIShnZW5lcyksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihwb3J0LmdldE1hcmtlckdlbmVzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbWFya2VyR2VuZXM6IChjb2x1bW46IHN0cmluZywgcGVyR3JvdXA/OiBudW1iZXIpID0+IHBvcnQuZ2V0TWFya2VyR2VuZXMhKGNvbHVtbiwgcGVyR3JvdXApLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBnZXRUcmFuc2NyaXB0RXN0aW1hdGUkOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkudHJhbnNjcmlwdEVzdGltYXRlJC5hc09ic2VydmFibGUoKSxcbiAgICAgIGdldEdlbmVDb3VudHNJblZpZXckOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkuZ2VuZUNvdW50c0luVmlldyQuYXNPYnNlcnZhYmxlKCksXG4gICAgICBnZXREZW5zaXR5U3RhdHMkOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkuZGVuc2l0eVN0YXRzJC5hc09ic2VydmFibGUoKSxcbiAgICAgIGdldEdlbmVGaWx0ZXJGYWlsZWQkOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkuZ2VuZUZpbHRlckZhaWxlZCQ/LmFzT2JzZXJ2YWJsZSgpID8/IG9mKGZhbHNlKSxcbiAgICAgIGNhdGVnb3J5Q29sb3JzOiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKG5hbWUpO1xuICAgICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7bmFtZX1cIiBpcyBjb250aW51b3VzIOKAlCBpdCBoYXMgbm8gY2F0ZWdvcmllc2ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc29sdmVkIGJ5IHRoZSBTQU1FIGZ1bmN0aW9uIHRoZSByZW5kZXJlciB1c2VzLCBzbyBhIGxlZ2VuZCBzd2F0Y2hcbiAgICAgICAgLy8gY2FuIG5ldmVyIGRpc2FncmVlIHdpdGggdGhlIGNvbG91ciBvbiBzY3JlZW4uXG4gICAgICAgIHJldHVybiByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29sdW1uLm1ldGEpO1xuICAgICAgfSxcblxuICAgICAgY29udGludW91c1ZhbHVlczogYXN5bmMgKHNvdXJjZSkgPT4ge1xuICAgICAgICBpZiAoc291cmNlLmtpbmQgPT09ICdmZWF0dXJlJykgcmV0dXJuIHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihzb3VyY2UubmFtZSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKHNvdXJjZS5uYW1lKTtcbiAgICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7c291cmNlLm5hbWV9XCIgaXMgY2F0ZWdvcmljYWwg4oCUIGl0IGhhcyBubyB2YWx1ZXMgdG8gY2hhcnRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sdW1uLnZhbHVlcztcbiAgICAgIH0sXG5cbiAgICAgIGNhdGVnb3JpY2FsVmlldzogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihuYW1lKTtcbiAgICAgICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSBjb2x1bW4gXCIke25hbWV9XCIgaXMgY29udGludW91cyDigJQgaXQgaGFzIG5vIGNhdGVnb3JpZXNgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgY2F0ZWdvcmllczogY29sdW1uLm1ldGEuY2F0ZWdvcmllcyxcbiAgICAgICAgICBjb2xvcnM6IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSksXG4gICAgICAgICAgY29kZXM6IGNvbHVtbi5jb2RlcyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFNwcmVhZCByYXRoZXIgdGhhbiBhbHdheXMgZGVmaW5lZDogYGdldEVtYmVkZGluZ2AgaXMgb3B0aW9uYWwgb24gYm90aCB0aGUgcG9ydFxuICAgICAgLy8gYW5kIHRoaXMgZmFjYWRlLCBhbmQgYSBwYW5lbCBjaGVja3MgZm9yIGl0cyBwcmVzZW5jZSB0byBkZWNpZGUgd2hldGhlciB0aGUgdmlld1xuICAgICAgLy8gaXMgb2ZmZXJlZCBhdCBhbGwuIERlZmluaW5nIGl0IGFzIGEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHdvdWxkIG1ha2UgYW5cbiAgICAgIC8vIGVtYmVkZGluZy1sZXNzIHNvdXJjZSBsb29rIGxpa2UgYSBicm9rZW4gb25lLlxuICAgICAgLi4uKHBvcnQuZ2V0RW1iZWRkaW5nID8geyBnZXRFbWJlZGRpbmc6IChuYW1lOiBzdHJpbmcpID0+IHBvcnQuZ2V0RW1iZWRkaW5nIShuYW1lKSB9IDoge30pLFxuXG4gICAgICBjYXRlZ29yaWNhbENvbHVtbnM6ICgpID0+XG4gICAgICAgICh0aGlzLmRhdGFzZXQ/LmNvbHVtbnMgPz8gW10pLmZpbHRlcigoYykgPT4gYy5raW5kID09PSAnY2F0ZWdvcmljYWwnKS5tYXAoKGMpID0+IGMubmFtZSksXG5cbiAgICAgIC8vIE1lbW9pemVkIG9uIHRoZSBvYnNlcnZhdGlvbnMgb2JqZWN0LCBzbyB0aGUgcmVuZGVyZXIncyBvd24gbG9va3VwIGFuZFxuICAgICAgLy8gdGhpcyBvbmUgYXJlIHRoZSBzYW1lIHNpbmdsZSBzY2FuIG9mIHVwIHRvIDMuN00geiB2YWx1ZXMuXG4gICAgICBzYW1wbGVkU2VjdGlvbnM6ICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2JzID0gdGhpcy5kYXRhc2V0Py5vYnNlcnZhdGlvbnM7XG4gICAgICAgIHJldHVybiBvYnMgPyBzZWN0aW9uc09mKG9icykgOiBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0aW9uJDogKCkgPT4gdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuZ2V0U2VsZWN0aW9uJCgpLFxuXG4gICAgICBzZWxlY3RGcm9tUmVnaW9uczogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5kYXRhc2V0O1xuICAgICAgICBpZiAoIWRhdGFzZXQpIHJldHVybiAwO1xuICAgICAgICBjb25zdCBpczNkID0gaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN0eC5wbG90VHlwZSgpKTtcbiAgICAgICAgY29uc3Qgdm9sdW1lID0gIWRhdGFzZXQuaW1hZ2VSZWYgPyBkYXRhc2V0LnZvbHVtZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gSW4gdGhlIDNEIGNsb3VkLCByZWdpb24gY2xhc3NlcyBwaWNrZWQgaW4gdGhlIFJlZ2lvbiBFZGl0b3IgKGEgY2xhc3NcbiAgICAgICAgLy8gdHJlZSBub2RlIHdpdGggaXRzIHN1YmNsYXNzZXMsIGEgc3VyZmFjZSBjbGlja2VkIGluIDNEKSBzZWxlY3QgdGhlXG4gICAgICAgIC8vIGNlbGxzIGluc2lkZSB0aGVpciB2b2x1bWVzIOKAlCB0aGUgc3RydWN0dXJlcyBzaG93biBhbW9uZyB0aGUgY2VsbHMuXG4gICAgICAgIGlmICh2b2x1bWUgJiYgdGhpcy5yb2lTZWxlY3Rpb25Nb2RlKCkgPT09ICdjbGFzcy12b2x1bWVzJykge1xuICAgICAgICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLmN0eC5yZWdpb25TdG9yZS5nZXRQaWNrZWRDbGFzc2VzKCk7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5yb2lSZXF1ZXN0O1xuICAgICAgICAgIGNvbnN0IHJldmlzaW9uID0gdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUucmV2aXNpb24oKTtcbiAgICAgICAgICBjb25zdCBvdXRsaW5lcyA9IGF3YWl0IHRoaXMuY3R4LnJlZ2lvblN0b3JlLmNsYXNzU2xpY2VPdXRsaW5lcyhjbGFzc2VzKTtcbiAgICAgICAgICAvLyBTdXBlcnNlZGVkIHdoaWxlIHRoZSBvdXRsaW5lcyB3ZXJlIHJlYWQ6IGEgbmV3ZXIgcmVxdWVzdCwgYW55IG5ld2VyIHNlbGVjdGlvblxuICAgICAgICAgIC8vIChhIENsZWFyLCBhIGxlZ2VuZCBjbGljaywgYSBsaW5rZWQgY2hhcnQncyBicnVzaCksIGFub3RoZXIgZGF0YXNldCwgdmlldyBvciBwaWNrLFxuICAgICAgICAgIC8vIG9yIHRoZSBmYWNhZGUgZGlzcG9zZWQuIEl0cyBtYXNrIHdvdWxkIG92ZXJ3cml0ZSB3aGF0IHRoZSB1c2VyIGRpZCBzaW5jZS5cbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdHgucmVnaW9uU3RvcmUuZ2V0UGlja2VkQ2xhc3NlcygpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlcXVlc3QgIT09IHRoaXMucm9pUmVxdWVzdCB8fFxuICAgICAgICAgICAgcmV2aXNpb24gIT09IHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLnJldmlzaW9uKCkgfHxcbiAgICAgICAgICAgIHRoaXMuZGF0YXNldCAhPT0gZGF0YXNldCB8fFxuICAgICAgICAgICAgdGhpcy5yb2lTZWxlY3Rpb25Nb2RlKCkgIT09ICdjbGFzcy12b2x1bWVzJyB8fFxuICAgICAgICAgICAgY3VycmVudC5sZW5ndGggIT09IGNsYXNzZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBjdXJyZW50LnNvbWUoKGMsIGkpID0+IGMgIT09IGNsYXNzZXNbaV0pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0SW5DbGFzc1ZvbHVtZXMoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgb3V0bGluZXMpO1xuICAgICAgICAgIHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLnNldChzZWxlY3Rpb24pO1xuICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24uY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSB1bmlvbiBvZiBldmVyeSBkcmF3biByZWdpb24g4oCUIHNvIGV2ZXJ5IFJPSSB0b29sIHRoZVxuICAgICAgICAvLyBsaWJyYXJ5IGFscmVhZHkgaGFzIGRvdWJsZXMgYXMgYSBzcGF0aWFsIHNlbGVjdGlvbiB0b29sLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJbiB0aGUgM0QgY2xvdWQgdGhlcmUgaXMgbm8gZGF0YS1zcGFjZSBhZmZpbmUgdG8gcHVzaCBhIGRyYXduIHNoYXBlXG4gICAgICAgIC8vIHRocm91Z2gsIHNvIHRoZSBvYnNlcnZhdGlvbnMgYXJlIHByb2plY3RlZCB0byBjYW52YXMgcGl4ZWxzIGJ5IHRoZVxuICAgICAgICAvLyByZW5kZXJlciAod2hpY2ggb3ducyB0aGUgY2FtZXJhKSBhbmQgdGVzdGVkIGluIHNjcmVlbiBzcGFjZSBpbnN0ZWFkIOKAlFxuICAgICAgICAvLyBhZ2FpbnN0IHRoZSBsYXNzb3MgZHJhd24gdGhlcmUgb25seTogZXZlcnkgb3RoZXIgcmVnaW9uIGlzIGluIGltYWdlXG4gICAgICAgIC8vIHNwYWNlLiBGYWxscyBiYWNrIHRvIHRoZSAyRCBwYXRoIHdoZW5ldmVyIHRoZSBjbG91ZCBpcyBub3QgbW91bnRlZC5cbiAgICAgICAgY29uc3QgcHJvamVjdGVkID0gaXMzZCA/IHRoaXMuY3R4Lm5hcGFyaS5nZXRTcGF0aWFsU2NyZWVuUHJvamVjdGlvbihkYXRhc2V0Lm9ic2VydmF0aW9ucykgOiBudWxsO1xuICAgICAgICBsZXQgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzaztcbiAgICAgICAgaWYgKHByb2plY3RlZCkge1xuICAgICAgICAgIGNvbnN0IGxhc3NvcyA9IG5ldyBTZXQodGhpcy5jdHgubmFwYXJpLmdldFNwYXRpYWxMYXNzb0lkcygpKTtcbiAgICAgICAgICBjb25zdCByZWdpb25zID0gdGhpcy5jdHgucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gbGFzc29zLmhhcyhyLmlkKSk7XG4gICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0SW5SZWdpb25zUHJvamVjdGVkKHByb2plY3RlZCwgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQsIHJlZ2lvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEluIHRoZSAyRCB2aWV3IG9mIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBzaGFwZSB3YXMgZHJhd24gb3ZlciBPTkVcbiAgICAgICAgICAvLyBzZWN0aW9uLCBpbiB0aGUgdm9sdW1lJ3MgcGl4ZWwgZ3JpZDogaXQgc2VsZWN0cyB0aGUgY2VsbHMgb2YgdGhhdFxuICAgICAgICAgIC8vIHNlY3Rpb24sIG5vdCB0aGUgd2hvbGUgZGVwdGggb2YgYnJhaW4gc3RhbmRpbmcgYmVoaW5kIHRoZW0uXG4gICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0SW5SZWdpb25zKFxuICAgICAgICAgICAgZGF0YXNldC5vYnNlcnZhdGlvbnMsXG4gICAgICAgICAgICB2b2x1bWUgPyB2b2x1bWVJbWFnZVJlZih2b2x1bWUsIGRhdGFzZXQubWljcm9uc1BlclVuaXQpIDogZGF0YXNldC5pbWFnZVJlZixcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSxcbiAgICAgICAgICAgIHZvbHVtZSA/IG9ic2VydmF0aW9uc0luU2xpY2UoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgdGhpcy5jdHguekluZGV4KCkpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuc2V0KHNlbGVjdGlvbik7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24uY291bnQ7XG4gICAgICB9LFxuXG4gICAgICByb2lTZWxlY3Rpb25Nb2RlOiAoKSA9PiB0aGlzLnJvaVNlbGVjdGlvbk1vZGUoKSxcblxuICAgICAgZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyQ6ICgpID0+IHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMkKCksXG5cbiAgICAgIHNlbGVjdENhdGVnb3J5OiBhc3luYyAoY29sdW1uOiBzdHJpbmcsIGNhdGVnb3J5SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2x1bW4pO1xuICAgICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4obG9hZGVkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7Y29sdW1ufVwiIGlzIGNvbnRpbnVvdXMg4oCUIGl0IGhhcyBubyBjYXRlZ29yaWVzYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0QnlDYXRlZ29yeShsb2FkZWQuY29kZXMsIGNhdGVnb3J5SW5kZXgpO1xuICAgICAgICB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5zZXQoc2VsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5jb3VudDtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdEluZGljZXM6IChpbmRpY2VzOiBJdGVyYWJsZTxudW1iZXI+KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kYXRhc2V0Py5vYnNlcnZhdGlvbnMuY291bnQgPz8gMDtcbiAgICAgICAgaWYgKGNvdW50ID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0QnlJbmRpY2VzKGluZGljZXMsIGNvdW50KTtcbiAgICAgICAgdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuc2V0KHNlbGVjdGlvbik7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24uY291bnQ7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclNlbGVjdGlvbjogKCkgPT4gdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuY2xlYXIoKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBgZGF0YXNldGAgY2FuIGFuc3dlciB0aGlzIGNvbG91ciBzb3VyY2UuIEEgY29sdW1uIGlzIGNoZWNrYWJsZSBhZ2FpbnN0IHRoZVxuICogZGVjbGFyZWQgbGlzdC4gQSBnZW5lIGlzIGNoZWNrYWJsZSBvbmx5IHdoZW4gdGhlIGRhdGFzZXQgaW5saW5lcyBpdHMgZmVhdHVyZSBuYW1lcyDigJRcbiAqIGEgZGF0YXNldCB0b28gd2lkZSB0byBpbmxpbmUgdGhlbSAodHlwZWFoZWFkLW9ubHkpIGtlZXBzIHRoZSBzb3VyY2UsIGFuZCBhIG5hbWUgdGhhdFxuICogdHVybnMgb3V0IG5vdCB0byBleGlzdCBzdXJmYWNlcyBhcyB0aGUgY2hhcnQncyBcImNvdWxkIG5vdCBiZSBjaGFydGVkXCIgcmF0aGVyIHRoYW4gYXNcbiAqIGEgc2lsZW50IHJlc2V0LlxuICovXG5mdW5jdGlvbiBjYW5Db2xvckJ5KGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgYnk6IFNwYXRpYWxDb2xvckJ5KTogYm9vbGVhbiB7XG4gIGlmICghZGF0YXNldCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYnkua2luZCA9PT0gJ2NvbHVtbicpIHJldHVybiBkYXRhc2V0LmNvbHVtbnMuc29tZSgoYykgPT4gYy5uYW1lID09PSBieS5uYW1lKTtcbiAgY29uc3QgbmFtZXMgPSBkYXRhc2V0LmZlYXR1cmVzPy5uYW1lcztcbiAgcmV0dXJuICEhZGF0YXNldC5mZWF0dXJlcyAmJiAoIW5hbWVzIHx8IG5hbWVzLmluY2x1ZGVzKGJ5Lm5hbWUpKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { NO_CATEGORY } from '../contracts/spatial-dataset.contract';
|
|
2
|
+
import { DEFAULT_CATEGORICAL_PALETTE } from './spatial-encoding';
|
|
3
|
+
/** Whether the view draws only the observations expressing some genes. */
|
|
4
|
+
export function hasGeneFilter(view) {
|
|
5
|
+
return !!view.observationGenes?.length;
|
|
6
|
+
}
|
|
7
|
+
/** What decides the gene filter, for the layers' cache keys: '' when there is none. */
|
|
8
|
+
export function geneFilterKey(view) {
|
|
9
|
+
if (!hasGeneFilter(view))
|
|
10
|
+
return '';
|
|
11
|
+
return `${view.observationGenesMatch ?? 'any'}:${view.observationGenes.join('\u0001')}`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 1 for each of `count` observations that expresses the genes — a value above 0 in any of
|
|
15
|
+
* `vectors`, or in all of them — else 0. A missing value (NaN) is not expressed.
|
|
16
|
+
*/
|
|
17
|
+
export function expressingMask(vectors, count, match) {
|
|
18
|
+
const mask = new Uint8Array(count);
|
|
19
|
+
if (!vectors.length)
|
|
20
|
+
return mask;
|
|
21
|
+
if (match === 'all') {
|
|
22
|
+
mask.fill(1);
|
|
23
|
+
for (const v of vectors) {
|
|
24
|
+
for (let i = 0; i < count; i++)
|
|
25
|
+
if (!(v[i] > 0))
|
|
26
|
+
mask[i] = 0;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
for (const v of vectors) {
|
|
31
|
+
for (let i = 0; i < count; i++)
|
|
32
|
+
if (v[i] > 0)
|
|
33
|
+
mask[i] = 1;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return mask;
|
|
37
|
+
}
|
|
38
|
+
/** The last mask built, reused while the same vectors (the port caches them) and rule ask again. */
|
|
39
|
+
let last = null;
|
|
40
|
+
/**
|
|
41
|
+
* The view's gene filter as a per-observation mask (1 = drawn), or null when it has none. Every
|
|
42
|
+
* layer asks on every rebuild, so the mask of the same vectors is built once.
|
|
43
|
+
*/
|
|
44
|
+
export async function observationGeneMask(view, count, read) {
|
|
45
|
+
if (!hasGeneFilter(view))
|
|
46
|
+
return null;
|
|
47
|
+
const vectors = await Promise.all(view.observationGenes.map((g) => read(g)));
|
|
48
|
+
const match = view.observationGenesMatch ?? 'any';
|
|
49
|
+
if (last &&
|
|
50
|
+
last.match === match &&
|
|
51
|
+
last.count === count &&
|
|
52
|
+
last.vectors.length === vectors.length &&
|
|
53
|
+
last.vectors.every((v, i) => v === vectors[i])) {
|
|
54
|
+
return last.mask;
|
|
55
|
+
}
|
|
56
|
+
const mask = expressingMask(vectors, count, match);
|
|
57
|
+
last = { vectors, match, count, mask };
|
|
58
|
+
return mask;
|
|
59
|
+
}
|
|
60
|
+
/** The colour a gene of the observation filter is drawn in: the view's own, else the palette's
|
|
61
|
+
* for its place in the list. */
|
|
62
|
+
export function observationGeneColor(view, gene) {
|
|
63
|
+
const own = view.observationGeneColors?.[gene];
|
|
64
|
+
if (own)
|
|
65
|
+
return own;
|
|
66
|
+
const at = Math.max(0, view.observationGenes.indexOf(gene));
|
|
67
|
+
return DEFAULT_CATEGORICAL_PALETTE[at % DEFAULT_CATEGORICAL_PALETTE.length];
|
|
68
|
+
}
|
|
69
|
+
/** The icon a gene of the observation filter is drawn as (2D): the view's own, else a circle. */
|
|
70
|
+
export function observationGeneGlyph(view, gene) {
|
|
71
|
+
return view.observationGeneGlyphs?.[gene] ?? 'circle';
|
|
72
|
+
}
|
|
73
|
+
/** Whether the filtered observations are coloured by their gene (rather than by `colorBy`). */
|
|
74
|
+
export function colorsByObservationGene(view) {
|
|
75
|
+
return hasGeneFilter(view) && view.observationGenesColorBy !== false;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Each observation's gene among `vectors`: the index of the one it expresses most relative to
|
|
79
|
+
* that gene's own highest value — so a gene expressed at low counts everywhere is not always
|
|
80
|
+
* outvoted by a highly expressed one — or {@link NO_CATEGORY} where it expresses none.
|
|
81
|
+
*/
|
|
82
|
+
export function dominantGenes(vectors, count) {
|
|
83
|
+
const out = new Uint16Array(count).fill(NO_CATEGORY);
|
|
84
|
+
const best = new Float32Array(count);
|
|
85
|
+
vectors.forEach((v, g) => {
|
|
86
|
+
let max = 0;
|
|
87
|
+
for (let i = 0; i < count; i++)
|
|
88
|
+
if (v[i] > max)
|
|
89
|
+
max = v[i];
|
|
90
|
+
if (!(max > 0))
|
|
91
|
+
return;
|
|
92
|
+
for (let i = 0; i < count; i++) {
|
|
93
|
+
const r = v[i] / max;
|
|
94
|
+
if (r > 0 && r > best[i]) {
|
|
95
|
+
best[i] = r;
|
|
96
|
+
out[i] = g;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
/** The last codes built, reused while the same vectors ask again (as for the mask). */
|
|
103
|
+
let lastCodes = null;
|
|
104
|
+
/**
|
|
105
|
+
* How the filtered observations are drawn, by gene: each observation's gene (an index into the
|
|
106
|
+
* view's genes, see {@link dominantGenes}) with the genes' colours and icons. Null when the view
|
|
107
|
+
* does not colour by them.
|
|
108
|
+
*/
|
|
109
|
+
export async function observationGeneStyle(view, count, read) {
|
|
110
|
+
if (!colorsByObservationGene(view))
|
|
111
|
+
return null;
|
|
112
|
+
const vectors = await Promise.all(view.observationGenes.map((g) => read(g)));
|
|
113
|
+
let codes;
|
|
114
|
+
if (lastCodes &&
|
|
115
|
+
lastCodes.count === count &&
|
|
116
|
+
lastCodes.vectors.length === vectors.length &&
|
|
117
|
+
lastCodes.vectors.every((v, i) => v === vectors[i])) {
|
|
118
|
+
codes = lastCodes.codes;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
codes = dominantGenes(vectors, count);
|
|
122
|
+
lastCodes = { vectors, count, codes };
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
codes,
|
|
126
|
+
colors: view.observationGenes.map((g) => observationGeneColor(view, g)),
|
|
127
|
+
glyphs: view.observationGenes.map((g) => observationGeneGlyph(view, g)),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** What decides how the filtered observations are drawn by gene, for cache keys. */
|
|
131
|
+
export function observationGeneStyleKey(view) {
|
|
132
|
+
if (!colorsByObservationGene(view))
|
|
133
|
+
return '';
|
|
134
|
+
return view.observationGenes
|
|
135
|
+
.map((g) => `${g}=${observationGeneColor(view, g)}/${observationGeneGlyph(view, g)}`)
|
|
136
|
+
.join('\u0001');
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1nZW5lLWZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWdlbmUtZmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU9qRSwwRUFBMEU7QUFDMUUsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUE2QjtJQUN6RCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0FBQ3pDLENBQUM7QUFFRCx1RkFBdUY7QUFDdkYsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUE2QjtJQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3BDLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUMzRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxPQUFnQyxFQUFFLEtBQWEsRUFBRSxLQUFvQjtJQUNsRyxNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqQyxJQUFJLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRTtnQkFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRTtnQkFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxvR0FBb0c7QUFDcEcsSUFBSSxJQUFJLEdBQ04sSUFBSSxDQUFDO0FBRVA7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsSUFBb0IsRUFDcEIsS0FBYSxFQUNiLElBQXlCO0lBRXpCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixJQUFJLEtBQUssQ0FBQztJQUNsRCxJQUNFLElBQUk7UUFDSixJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUs7UUFDcEIsSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLO1FBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNO1FBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUM5QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxJQUFJLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN2QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDtpQ0FDaUM7QUFDakMsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxJQUEwRSxFQUMxRSxJQUFZO0lBRVosTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsSUFBSSxHQUFHO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVELE9BQU8sMkJBQTJCLENBQUMsRUFBRSxHQUFHLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxpR0FBaUc7QUFDakcsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxJQUFxRCxFQUNyRCxJQUFZO0lBRVosT0FBTyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUM7QUFDeEQsQ0FBQztBQUVELCtGQUErRjtBQUMvRixNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQTRFO0lBRTVFLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxLQUFLLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE9BQWdDLEVBQUUsS0FBYTtJQUMzRSxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckQsTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN2QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7Z0JBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDYixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsdUZBQXVGO0FBQ3ZGLElBQUksU0FBUyxHQUFtRixJQUFJLENBQUM7QUFFckc7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLElBQ3VHLEVBQ3ZHLEtBQWEsRUFDYixJQUF5QjtJQUV6QixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsSUFBSSxLQUFrQixDQUFDO0lBQ3ZCLElBQ0UsU0FBUztRQUNULFNBQVMsQ0FBQyxLQUFLLEtBQUssS0FBSztRQUN6QixTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsTUFBTTtRQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkQsQ0FBQztRQUNELEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQzFCLENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEMsU0FBUyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTztRQUNMLEtBQUs7UUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDeEUsQ0FBQztBQUNKLENBQUM7QUFFRCxvRkFBb0Y7QUFDcEYsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxJQUdDO0lBRUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzlDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQjtTQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNwRixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3BhdGlhbFZpZXdTdGF0ZSwgVHJhbnNjcmlwdEdseXBoTmFtZSB9IGZyb20gJy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IE5PX0NBVEVHT1JZIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUgfSBmcm9tICcuL3NwYXRpYWwtZW5jb2RpbmcnO1xuXG4vKiogT25lIGdlbmUncyB2YWx1ZSBmb3IgZXZlcnkgb2JzZXJ2YXRpb246IHRoZSBwb3J0J3MgYGdldEZlYXR1cmVWZWN0b3JgLiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZVZlY3RvclNvdXJjZSA9IChnZW5lOiBzdHJpbmcpID0+IFByb21pc2U8RmxvYXQzMkFycmF5PjtcblxudHlwZSBHZW5lRmlsdGVyVmlldyA9IFBpY2s8U3BhdGlhbFZpZXdTdGF0ZSwgJ29ic2VydmF0aW9uR2VuZXMnIHwgJ29ic2VydmF0aW9uR2VuZXNNYXRjaCc+O1xuXG4vKiogV2hldGhlciB0aGUgdmlldyBkcmF3cyBvbmx5IHRoZSBvYnNlcnZhdGlvbnMgZXhwcmVzc2luZyBzb21lIGdlbmVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0dlbmVGaWx0ZXIodmlldzogUGFydGlhbDxHZW5lRmlsdGVyVmlldz4pOiBib29sZWFuIHtcbiAgcmV0dXJuICEhdmlldy5vYnNlcnZhdGlvbkdlbmVzPy5sZW5ndGg7XG59XG5cbi8qKiBXaGF0IGRlY2lkZXMgdGhlIGdlbmUgZmlsdGVyLCBmb3IgdGhlIGxheWVycycgY2FjaGUga2V5czogJycgd2hlbiB0aGVyZSBpcyBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVGaWx0ZXJLZXkodmlldzogUGFydGlhbDxHZW5lRmlsdGVyVmlldz4pOiBzdHJpbmcge1xuICBpZiAoIWhhc0dlbmVGaWx0ZXIodmlldykpIHJldHVybiAnJztcbiAgcmV0dXJuIGAke3ZpZXcub2JzZXJ2YXRpb25HZW5lc01hdGNoID8/ICdhbnknfToke3ZpZXcub2JzZXJ2YXRpb25HZW5lcyEuam9pbignXFx1MDAwMScpfWA7XG59XG5cbi8qKlxuICogMSBmb3IgZWFjaCBvZiBgY291bnRgIG9ic2VydmF0aW9ucyB0aGF0IGV4cHJlc3NlcyB0aGUgZ2VuZXMg4oCUIGEgdmFsdWUgYWJvdmUgMCBpbiBhbnkgb2ZcbiAqIGB2ZWN0b3JzYCwgb3IgaW4gYWxsIG9mIHRoZW0g4oCUIGVsc2UgMC4gQSBtaXNzaW5nIHZhbHVlIChOYU4pIGlzIG5vdCBleHByZXNzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHByZXNzaW5nTWFzayh2ZWN0b3JzOiByZWFkb25seSBGbG9hdDMyQXJyYXlbXSwgY291bnQ6IG51bWJlciwgbWF0Y2g6ICdhbnknIHwgJ2FsbCcpOiBVaW50OEFycmF5IHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvdW50KTtcbiAgaWYgKCF2ZWN0b3JzLmxlbmd0aCkgcmV0dXJuIG1hc2s7XG4gIGlmIChtYXRjaCA9PT0gJ2FsbCcpIHtcbiAgICBtYXNrLmZpbGwoMSk7XG4gICAgZm9yIChjb25zdCB2IG9mIHZlY3RvcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgaWYgKCEodltpXSA+IDApKSBtYXNrW2ldID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCB2IG9mIHZlY3RvcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgaWYgKHZbaV0gPiAwKSBtYXNrW2ldID0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hc2s7XG59XG5cbi8qKiBUaGUgbGFzdCBtYXNrIGJ1aWx0LCByZXVzZWQgd2hpbGUgdGhlIHNhbWUgdmVjdG9ycyAodGhlIHBvcnQgY2FjaGVzIHRoZW0pIGFuZCBydWxlIGFzayBhZ2Fpbi4gKi9cbmxldCBsYXN0OiB7IHZlY3RvcnM6IHJlYWRvbmx5IEZsb2F0MzJBcnJheVtdOyBtYXRjaDogJ2FueScgfCAnYWxsJzsgY291bnQ6IG51bWJlcjsgbWFzazogVWludDhBcnJheSB9IHwgbnVsbCA9XG4gIG51bGw7XG5cbi8qKlxuICogVGhlIHZpZXcncyBnZW5lIGZpbHRlciBhcyBhIHBlci1vYnNlcnZhdGlvbiBtYXNrICgxID0gZHJhd24pLCBvciBudWxsIHdoZW4gaXQgaGFzIG5vbmUuIEV2ZXJ5XG4gKiBsYXllciBhc2tzIG9uIGV2ZXJ5IHJlYnVpbGQsIHNvIHRoZSBtYXNrIG9mIHRoZSBzYW1lIHZlY3RvcnMgaXMgYnVpbHQgb25jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9ic2VydmF0aW9uR2VuZU1hc2soXG4gIHZpZXc6IEdlbmVGaWx0ZXJWaWV3LFxuICBjb3VudDogbnVtYmVyLFxuICByZWFkOiBGZWF0dXJlVmVjdG9yU291cmNlLFxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4ge1xuICBpZiAoIWhhc0dlbmVGaWx0ZXIodmlldykpIHJldHVybiBudWxsO1xuICBjb25zdCB2ZWN0b3JzID0gYXdhaXQgUHJvbWlzZS5hbGwodmlldy5vYnNlcnZhdGlvbkdlbmVzLm1hcCgoZykgPT4gcmVhZChnKSkpO1xuICBjb25zdCBtYXRjaCA9IHZpZXcub2JzZXJ2YXRpb25HZW5lc01hdGNoID8/ICdhbnknO1xuICBpZiAoXG4gICAgbGFzdCAmJlxuICAgIGxhc3QubWF0Y2ggPT09IG1hdGNoICYmXG4gICAgbGFzdC5jb3VudCA9PT0gY291bnQgJiZcbiAgICBsYXN0LnZlY3RvcnMubGVuZ3RoID09PSB2ZWN0b3JzLmxlbmd0aCAmJlxuICAgIGxhc3QudmVjdG9ycy5ldmVyeSgodiwgaSkgPT4gdiA9PT0gdmVjdG9yc1tpXSlcbiAgKSB7XG4gICAgcmV0dXJuIGxhc3QubWFzaztcbiAgfVxuICBjb25zdCBtYXNrID0gZXhwcmVzc2luZ01hc2sodmVjdG9ycywgY291bnQsIG1hdGNoKTtcbiAgbGFzdCA9IHsgdmVjdG9ycywgbWF0Y2gsIGNvdW50LCBtYXNrIH07XG4gIHJldHVybiBtYXNrO1xufVxuXG4vKiogVGhlIGNvbG91ciBhIGdlbmUgb2YgdGhlIG9ic2VydmF0aW9uIGZpbHRlciBpcyBkcmF3biBpbjogdGhlIHZpZXcncyBvd24sIGVsc2UgdGhlIHBhbGV0dGUnc1xuICogIGZvciBpdHMgcGxhY2UgaW4gdGhlIGxpc3QuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2YXRpb25HZW5lQ29sb3IoXG4gIHZpZXc6IFBpY2s8U3BhdGlhbFZpZXdTdGF0ZSwgJ29ic2VydmF0aW9uR2VuZXMnIHwgJ29ic2VydmF0aW9uR2VuZUNvbG9ycyc+LFxuICBnZW5lOiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBjb25zdCBvd24gPSB2aWV3Lm9ic2VydmF0aW9uR2VuZUNvbG9ycz8uW2dlbmVdO1xuICBpZiAob3duKSByZXR1cm4gb3duO1xuICBjb25zdCBhdCA9IE1hdGgubWF4KDAsIHZpZXcub2JzZXJ2YXRpb25HZW5lcy5pbmRleE9mKGdlbmUpKTtcbiAgcmV0dXJuIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURVthdCAlIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURS5sZW5ndGhdO1xufVxuXG4vKiogVGhlIGljb24gYSBnZW5lIG9mIHRoZSBvYnNlcnZhdGlvbiBmaWx0ZXIgaXMgZHJhd24gYXMgKDJEKTogdGhlIHZpZXcncyBvd24sIGVsc2UgYSBjaXJjbGUuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2YXRpb25HZW5lR2x5cGgoXG4gIHZpZXc6IFBpY2s8U3BhdGlhbFZpZXdTdGF0ZSwgJ29ic2VydmF0aW9uR2VuZUdseXBocyc+LFxuICBnZW5lOiBzdHJpbmcsXG4pOiBUcmFuc2NyaXB0R2x5cGhOYW1lIHtcbiAgcmV0dXJuIHZpZXcub2JzZXJ2YXRpb25HZW5lR2x5cGhzPy5bZ2VuZV0gPz8gJ2NpcmNsZSc7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBmaWx0ZXJlZCBvYnNlcnZhdGlvbnMgYXJlIGNvbG91cmVkIGJ5IHRoZWlyIGdlbmUgKHJhdGhlciB0aGFuIGJ5IGBjb2xvckJ5YCkuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JzQnlPYnNlcnZhdGlvbkdlbmUoXG4gIHZpZXc6IFBpY2s8U3BhdGlhbFZpZXdTdGF0ZSwgJ29ic2VydmF0aW9uR2VuZXMnIHwgJ29ic2VydmF0aW9uR2VuZXNDb2xvckJ5Jz4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc0dlbmVGaWx0ZXIodmlldykgJiYgdmlldy5vYnNlcnZhdGlvbkdlbmVzQ29sb3JCeSAhPT0gZmFsc2U7XG59XG5cbi8qKlxuICogRWFjaCBvYnNlcnZhdGlvbidzIGdlbmUgYW1vbmcgYHZlY3RvcnNgOiB0aGUgaW5kZXggb2YgdGhlIG9uZSBpdCBleHByZXNzZXMgbW9zdCByZWxhdGl2ZSB0b1xuICogdGhhdCBnZW5lJ3Mgb3duIGhpZ2hlc3QgdmFsdWUg4oCUIHNvIGEgZ2VuZSBleHByZXNzZWQgYXQgbG93IGNvdW50cyBldmVyeXdoZXJlIGlzIG5vdCBhbHdheXNcbiAqIG91dHZvdGVkIGJ5IGEgaGlnaGx5IGV4cHJlc3NlZCBvbmUg4oCUIG9yIHtAbGluayBOT19DQVRFR09SWX0gd2hlcmUgaXQgZXhwcmVzc2VzIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb21pbmFudEdlbmVzKHZlY3RvcnM6IHJlYWRvbmx5IEZsb2F0MzJBcnJheVtdLCBjb3VudDogbnVtYmVyKTogVWludDE2QXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDE2QXJyYXkoY291bnQpLmZpbGwoTk9fQ0FURUdPUlkpO1xuICBjb25zdCBiZXN0ID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCk7XG4gIHZlY3RvcnMuZm9yRWFjaCgodiwgZykgPT4ge1xuICAgIGxldCBtYXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgaWYgKHZbaV0gPiBtYXgpIG1heCA9IHZbaV07XG4gICAgaWYgKCEobWF4ID4gMCkpIHJldHVybjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHIgPSB2W2ldIC8gbWF4O1xuICAgICAgaWYgKHIgPiAwICYmIHIgPiBiZXN0W2ldKSB7XG4gICAgICAgIGJlc3RbaV0gPSByO1xuICAgICAgICBvdXRbaV0gPSBnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgbGFzdCBjb2RlcyBidWlsdCwgcmV1c2VkIHdoaWxlIHRoZSBzYW1lIHZlY3RvcnMgYXNrIGFnYWluIChhcyBmb3IgdGhlIG1hc2spLiAqL1xubGV0IGxhc3RDb2RlczogeyB2ZWN0b3JzOiByZWFkb25seSBGbG9hdDMyQXJyYXlbXTsgY291bnQ6IG51bWJlcjsgY29kZXM6IFVpbnQxNkFycmF5IH0gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBIb3cgdGhlIGZpbHRlcmVkIG9ic2VydmF0aW9ucyBhcmUgZHJhd24sIGJ5IGdlbmU6IGVhY2ggb2JzZXJ2YXRpb24ncyBnZW5lIChhbiBpbmRleCBpbnRvIHRoZVxuICogdmlldydzIGdlbmVzLCBzZWUge0BsaW5rIGRvbWluYW50R2VuZXN9KSB3aXRoIHRoZSBnZW5lcycgY29sb3VycyBhbmQgaWNvbnMuIE51bGwgd2hlbiB0aGUgdmlld1xuICogZG9lcyBub3QgY29sb3VyIGJ5IHRoZW0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvYnNlcnZhdGlvbkdlbmVTdHlsZShcbiAgdmlldzogR2VuZUZpbHRlclZpZXcgJlxuICAgIFBpY2s8U3BhdGlhbFZpZXdTdGF0ZSwgJ29ic2VydmF0aW9uR2VuZXNDb2xvckJ5JyB8ICdvYnNlcnZhdGlvbkdlbmVDb2xvcnMnIHwgJ29ic2VydmF0aW9uR2VuZUdseXBocyc+LFxuICBjb3VudDogbnVtYmVyLFxuICByZWFkOiBGZWF0dXJlVmVjdG9yU291cmNlLFxuKTogUHJvbWlzZTx7IGNvZGVzOiBVaW50MTZBcnJheTsgY29sb3JzOiBzdHJpbmdbXTsgZ2x5cGhzOiBUcmFuc2NyaXB0R2x5cGhOYW1lW10gfSB8IG51bGw+IHtcbiAgaWYgKCFjb2xvcnNCeU9ic2VydmF0aW9uR2VuZSh2aWV3KSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHZlY3RvcnMgPSBhd2FpdCBQcm9taXNlLmFsbCh2aWV3Lm9ic2VydmF0aW9uR2VuZXMubWFwKChnKSA9PiByZWFkKGcpKSk7XG4gIGxldCBjb2RlczogVWludDE2QXJyYXk7XG4gIGlmIChcbiAgICBsYXN0Q29kZXMgJiZcbiAgICBsYXN0Q29kZXMuY291bnQgPT09IGNvdW50ICYmXG4gICAgbGFzdENvZGVzLnZlY3RvcnMubGVuZ3RoID09PSB2ZWN0b3JzLmxlbmd0aCAmJlxuICAgIGxhc3RDb2Rlcy52ZWN0b3JzLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSB2ZWN0b3JzW2ldKVxuICApIHtcbiAgICBjb2RlcyA9IGxhc3RDb2Rlcy5jb2RlcztcbiAgfSBlbHNlIHtcbiAgICBjb2RlcyA9IGRvbWluYW50R2VuZXModmVjdG9ycywgY291bnQpO1xuICAgIGxhc3RDb2RlcyA9IHsgdmVjdG9ycywgY291bnQsIGNvZGVzIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb2RlcyxcbiAgICBjb2xvcnM6IHZpZXcub2JzZXJ2YXRpb25HZW5lcy5tYXAoKGcpID0+IG9ic2VydmF0aW9uR2VuZUNvbG9yKHZpZXcsIGcpKSxcbiAgICBnbHlwaHM6IHZpZXcub2JzZXJ2YXRpb25HZW5lcy5tYXAoKGcpID0+IG9ic2VydmF0aW9uR2VuZUdseXBoKHZpZXcsIGcpKSxcbiAgfTtcbn1cblxuLyoqIFdoYXQgZGVjaWRlcyBob3cgdGhlIGZpbHRlcmVkIG9ic2VydmF0aW9ucyBhcmUgZHJhd24gYnkgZ2VuZSwgZm9yIGNhY2hlIGtleXMuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2YXRpb25HZW5lU3R5bGVLZXkoXG4gIHZpZXc6IFBpY2s8XG4gICAgU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICAnb2JzZXJ2YXRpb25HZW5lcycgfCAnb2JzZXJ2YXRpb25HZW5lc0NvbG9yQnknIHwgJ29ic2VydmF0aW9uR2VuZUNvbG9ycycgfCAnb2JzZXJ2YXRpb25HZW5lR2x5cGhzJ1xuICA+LFxuKTogc3RyaW5nIHtcbiAgaWYgKCFjb2xvcnNCeU9ic2VydmF0aW9uR2VuZSh2aWV3KSkgcmV0dXJuICcnO1xuICByZXR1cm4gdmlldy5vYnNlcnZhdGlvbkdlbmVzXG4gICAgLm1hcCgoZykgPT4gYCR7Z309JHtvYnNlcnZhdGlvbkdlbmVDb2xvcih2aWV3LCBnKX0vJHtvYnNlcnZhdGlvbkdlbmVHbHlwaCh2aWV3LCBnKX1gKVxuICAgIC5qb2luKCdcXHUwMDAxJyk7XG59XG4iXX0=
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* These work on SIV's own tile contract, so they stay in SIV rather than moving to napari-js.
|
|
7
7
|
*/
|
|
8
|
+
import { ALL_GENES } from '../contracts/ports/spatial-data.port';
|
|
8
9
|
import { NO_CATEGORY, NO_OBSERVATION, } from '../contracts/spatial-dataset.contract';
|
|
9
10
|
/** Rings whose owning cell is in a switched-off group removed. */
|
|
10
11
|
export function filterRings(rings, hidden) {
|
|
@@ -43,6 +44,46 @@ export function hiddenGeneSlots(view) {
|
|
|
43
44
|
const off = new Set(view.transcriptHiddenGenes);
|
|
44
45
|
return Uint8Array.from(view.transcriptGenes, (g) => (off.has(g) ? 1 : 0));
|
|
45
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Whether "All genes" is switched off as a whole with the gene tree's root eye: its hidden
|
|
49
|
+
* list is `[ALL_GENES]` (every gene hidden, none excepted). Hiding every gene by name would
|
|
50
|
+
* need the gene list, which a dataset need not have.
|
|
51
|
+
*/
|
|
52
|
+
export function allGenesHidden(view) {
|
|
53
|
+
return view.transcriptAllGenes && everyGeneOff(view.transcriptAllGenesHidden);
|
|
54
|
+
}
|
|
55
|
+
/** Whether an "All genes" hidden list hides every gene, none excepted. */
|
|
56
|
+
export function everyGeneOff(off) {
|
|
57
|
+
return off.length === 1 && off[0] === ALL_GENES;
|
|
58
|
+
}
|
|
59
|
+
/** Whether a gene of "All genes" is drawn, by its hidden list (see `transcriptAllGenesHidden`). */
|
|
60
|
+
export function allGeneShownBy(off) {
|
|
61
|
+
const listed = new Set(off);
|
|
62
|
+
const except = off[0] === ALL_GENES;
|
|
63
|
+
return (gene) => listed.has(gene) === except;
|
|
64
|
+
}
|
|
65
|
+
/** "All genes"'s hidden list with `gene` shown (`on`) or hidden, in the list's own form. */
|
|
66
|
+
export function toggleAllGeneHidden(off, gene, on) {
|
|
67
|
+
const except = off[0] === ALL_GENES;
|
|
68
|
+
// Hidden by name: listed means off. Led by ALL_GENES: listed means on.
|
|
69
|
+
const listed = new Set(except ? off.slice(1) : off);
|
|
70
|
+
if (on === except)
|
|
71
|
+
listed.add(gene);
|
|
72
|
+
else
|
|
73
|
+
listed.delete(gene);
|
|
74
|
+
return except ? [ALL_GENES, ...listed] : [...listed];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Codes (indices into `genes`, the dataset's all-gene code order) switched off with their eye
|
|
78
|
+
* toggle while every gene is drawn; null when none is, or without the gene list.
|
|
79
|
+
*/
|
|
80
|
+
export function hiddenAllGeneCodes(view, genes) {
|
|
81
|
+
if (!genes || !view.transcriptAllGenesHidden.length)
|
|
82
|
+
return null;
|
|
83
|
+
const shown = allGeneShownBy(view.transcriptAllGenesHidden);
|
|
84
|
+
const codes = Uint8Array.from(genes, (g) => (shown(g) ? 0 : 1));
|
|
85
|
+
return codes.includes(1) ? codes : null;
|
|
86
|
+
}
|
|
46
87
|
/** Entries in a hidden group's cell, or of a hidden gene, removed (with their sizes). */
|
|
47
88
|
export function filterTranscripts(t, px, hidden, hiddenGenes) {
|
|
48
89
|
if (!hidden && !hiddenGenes)
|
|
@@ -216,4 +257,4 @@ export function clusterMarkers(rasters, slots, bin, area) {
|
|
|
216
257
|
group: Int32Array.from(group),
|
|
217
258
|
};
|
|
218
259
|
}
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC10aWxlLW1lcmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGNBQWMsR0FJZixNQUFNLHVDQUF1QyxDQUFDO0FBRy9DLGtFQUFrRTtBQUNsRSxNQUFNLFVBQVUsV0FBVyxDQUN6QixLQUF5QixFQUN6QixNQUF5RDtJQUV6RCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDYixRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELE1BQU0sT0FB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Q0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQixPQUFPO1FBQ0wsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLENBQUM7WUFDUixVQUFVLEVBQUUsSUFBSTtZQUNoQixDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3BELElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUNELEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVyZ2luZyBhbmQgZmlsdGVyaW5nIG9mIHRoZSBzcGF0aWFsLXRpbGUgd2lyZSBmb3JtYXQgKG9ic2VydmF0aW9uIGlkcywgTk9fQ0FURUdPUlkpOiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgMkQgdmlldydzIHRpbGUgbG9vcCB0aGF0IGFyZSBwdXJlIOKAlCBjb25jYXRlbmF0aW5nIHRpbGVzLCBkcm9wcGluZyBoaWRkZW5cbiAqIGdyb3VwcyBhbmQgZ2VuZXMsIGFuZCB0aGUgZGVuc2l0eS1ncmlkIG1hcmtlcnMgb2YgYSB6b29tZWQtb3V0IGdlbmUgc2VsZWN0aW9uLlxuICpcbiAqIFRoZXNlIHdvcmsgb24gU0lWJ3Mgb3duIHRpbGUgY29udHJhY3QsIHNvIHRoZXkgc3RheSBpbiBTSVYgcmF0aGVyIHRoYW4gbW92aW5nIHRvIG5hcGFyaS1qcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBOT19DQVRFR09SWSxcbiAgTk9fT0JTRVJWQVRJT04sXG4gIFNwYXRpYWxEZW5zaXR5UmFzdGVyLFxuICBTcGF0aWFsUG9seWdvblRpbGUsXG4gIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbn0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IERhdGFSZWN0IH0gZnJvbSAnLi9sb2QnO1xuXG4vKiogUmluZ3Mgd2hvc2Ugb3duaW5nIGNlbGwgaXMgaW4gYSBzd2l0Y2hlZC1vZmYgZ3JvdXAgcmVtb3ZlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJSaW5ncyhcbiAgcmluZ3M6IFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLFxuKTogU3BhdGlhbFBvbHlnb25UaWxlIHtcbiAgaWYgKCFoaWRkZW4pIHJldHVybiByaW5ncztcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgbGV0IHZlcnRpY2VzID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5ncy5jb3VudDsgaSsrKSB7XG4gICAgY29uc3QgY29kZSA9IGhpZGRlbi5jb2Rlc1tyaW5ncy5vYnNlcnZhdGlvbltpXV07XG4gICAgaWYgKGNvZGUgIT09IE5PX0NBVEVHT1JZICYmIGhpZGRlbi5oaWRkZW5bY29kZV0pIGNvbnRpbnVlO1xuICAgIGtlZXAucHVzaChpKTtcbiAgICB2ZXJ0aWNlcyArPSByaW5ncy5vZmZzZXRzW2kgKyAxXSAtIHJpbmdzLm9mZnNldHNbaV07XG4gIH1cbiAgaWYgKGtlZXAubGVuZ3RoID09PSByaW5ncy5jb3VudCkgcmV0dXJuIHJpbmdzO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShrZWVwLmxlbmd0aCk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkoa2VlcC5sZW5ndGggKyAxKTtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyAqIDIpO1xuICBsZXQgdiA9IDA7XG4gIGtlZXAuZm9yRWFjaCgoaSwgcikgPT4ge1xuICAgIG9ic2VydmF0aW9uW3JdID0gcmluZ3Mub2JzZXJ2YXRpb25baV07XG4gICAgb2Zmc2V0c1tyXSA9IHY7XG4gICAgY29uc3QgYSA9IHJpbmdzLm9mZnNldHNbaV0gKiAyO1xuICAgIGNvbnN0IGIgPSByaW5ncy5vZmZzZXRzW2kgKyAxXSAqIDI7XG4gICAgY29vcmRzLnNldChyaW5ncy5jb29yZHMuc3ViYXJyYXkoYSwgYiksIHYgKiAyKTtcbiAgICB2ICs9IChiIC0gYSkgLyAyO1xuICB9KTtcbiAgb2Zmc2V0c1trZWVwLmxlbmd0aF0gPSB2O1xuICByZXR1cm4geyBjb3VudDoga2VlcC5sZW5ndGgsIG9ic2VydmF0aW9uLCBvZmZzZXRzLCBjb29yZHMgfTtcbn1cblxuLyoqIFNsb3RzIChpbmRpY2VzIGludG8gdGhlIHNlbGVjdGVkIGdlbmVzKSBzd2l0Y2hlZCBvZmYgd2l0aCB0aGVpciBleWUgdG9nZ2xlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGRlbkdlbmVTbG90cyh2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIXZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG9mZiA9IG5ldyBTZXQodmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMpO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKHZpZXcudHJhbnNjcmlwdEdlbmVzLCAoZykgPT4gKG9mZi5oYXMoZykgPyAxIDogMCkpO1xufVxuXG4vKiogRW50cmllcyBpbiBhIGhpZGRlbiBncm91cCdzIGNlbGwsIG9yIG9mIGEgaGlkZGVuIGdlbmUsIHJlbW92ZWQgKHdpdGggdGhlaXIgc2l6ZXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclRyYW5zY3JpcHRzKFxuICB0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG4gIHB4OiBGbG9hdDMyQXJyYXksXG4gIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCxcbiAgaGlkZGVuR2VuZXM6IFVpbnQ4QXJyYXkgfCBudWxsLFxuKTogeyBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgcHg6IEZsb2F0MzJBcnJheSB9IHtcbiAgaWYgKCFoaWRkZW4gJiYgIWhpZGRlbkdlbmVzKSByZXR1cm4geyBtZXJnZWQ6IHQsIHB4IH07XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgaWYgKGhpZGRlbkdlbmVzICYmIGhpZGRlbkdlbmVzW3QuZ2VuZVtpXV0pIGNvbnRpbnVlO1xuICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgIGlmIChoaWRkZW4gJiYgbyAhPT0gTk9fT0JTRVJWQVRJT04pIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBoaWRkZW4uY29kZXNbb107XG4gICAgICBpZiAoY29kZSAhPT0gTk9fQ0FURUdPUlkgJiYgaGlkZGVuLmhpZGRlbltjb2RlXSkgY29udGludWU7XG4gICAgfVxuICAgIGtlZXAucHVzaChpKTtcbiAgfVxuICBjb25zdCBwaWNrID0gPFQgZXh0ZW5kcyBGbG9hdDMyQXJyYXkgfCBVaW50MzJBcnJheSB8IFVpbnQxNkFycmF5PihhOiBUKTogVCA9PiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IChhLmNvbnN0cnVjdG9yIGFzIG5ldyAobjogbnVtYmVyKSA9PiBUKShrZWVwLmxlbmd0aCk7XG4gICAga2VlcC5mb3JFYWNoKChpLCBrKSA9PiB7XG4gICAgICBvdXRba10gPSBhW2ldO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWVyZ2VkOiB7XG4gICAgICBjb3VudDoga2VlcC5sZW5ndGgsXG4gICAgICBhZ2dyZWdhdGVkOiB0LmFnZ3JlZ2F0ZWQsXG4gICAgICB4OiBwaWNrKHQueCksXG4gICAgICB5OiBwaWNrKHQueSksXG4gICAgICB6OiBwaWNrKHQueiksXG4gICAgICB3ZWlnaHQ6IHBpY2sodC53ZWlnaHQpLFxuICAgICAgb2JzZXJ2YXRpb246IHBpY2sodC5vYnNlcnZhdGlvbiksXG4gICAgICBnZW5lOiBwaWNrKHQuZ2VuZSksXG4gICAgfSxcbiAgICBweDogcGljayhweCksXG4gIH07XG59XG5cbi8qKiBUaGUgbWVkaWFuIG9mIGB2YCwgZnJvbSBhIHNhbXBsZSBvZiBhYm91dCAxMDI0IHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW4odjogRmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgaWYgKCF2Lmxlbmd0aCkgcmV0dXJuIDA7XG4gIGNvbnN0IHN0ZXAgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHYubGVuZ3RoIC8gMTAyNCkpO1xuICBjb25zdCBzYW1wbGU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkgKz0gc3RlcCkgc2FtcGxlLnB1c2godltpXSk7XG4gIHNhbXBsZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIHJldHVybiBzYW1wbGVbc2FtcGxlLmxlbmd0aCA+PiAxXTtcbn1cblxuLyoqIENvbmNhdGVuYXRlIHRpbGVzJyByaW5ncyBpbnRvIG9uZSBzZXQsIGRyb3BwaW5nIHJpbmdzIGFscmVhZHkgc2VlbiAoYSBjZWxsIHN0cmFkZGxpbmdcbiAqICB0d28gdGlsZXMgbWF5IGJlIGxpc3RlZCBieSBib3RoKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVBvbHlnb25UaWxlcyh0aWxlczogU3BhdGlhbFBvbHlnb25UaWxlW10pOiBTcGF0aWFsUG9seWdvblRpbGUge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGxldCByaW5ncyA9IDA7XG4gIGxldCB2ZXJ0aWNlcyA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBpZiAoc2Vlbi5oYXModC5vYnNlcnZhdGlvbltpXSkpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQodC5vYnNlcnZhdGlvbltpXSk7XG4gICAgICByaW5ncysrO1xuICAgICAgdmVydGljZXMgKz0gdC5vZmZzZXRzW2kgKyAxXSAtIHQub2Zmc2V0c1tpXTtcbiAgICB9XG4gIH1cbiAgc2Vlbi5jbGVhcigpO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShyaW5ncyk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkocmluZ3MgKyAxKTtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyAqIDIpO1xuICBsZXQgciA9IDA7XG4gIGxldCB2ID0gMDtcbiAgZm9yIChjb25zdCB0IG9mIHRpbGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgICAgaWYgKHNlZW4uaGFzKG8pKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKG8pO1xuICAgICAgb2JzZXJ2YXRpb25bcl0gPSBvO1xuICAgICAgb2Zmc2V0c1tyXSA9IHY7XG4gICAgICBjb25zdCBhID0gdC5vZmZzZXRzW2ldICogMjtcbiAgICAgIGNvbnN0IGIgPSB0Lm9mZnNldHNbaSArIDFdICogMjtcbiAgICAgIGNvb3Jkcy5zZXQodC5jb29yZHMuc3ViYXJyYXkoYSwgYiksIHYgKiAyKTtcbiAgICAgIHYgKz0gKGIgLSBhKSAvIDI7XG4gICAgICByKys7XG4gICAgfVxuICB9XG4gIG9mZnNldHNbcmluZ3NdID0gdjtcbiAgcmV0dXJuIHsgY291bnQ6IHJpbmdzLCBvYnNlcnZhdGlvbiwgb2Zmc2V0cywgY29vcmRzIH07XG59XG5cbi8qKiBDb25jYXRlbmF0ZSB0cmFuc2NyaXB0IHRpbGVzLCBzdG9wcGluZyBhdCBgbGltaXRgIGVudHJpZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUcmFuc2NyaXB0VGlsZXModGlsZXM6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZVtdLCBsaW1pdCA9IEluZmluaXR5KTogU3BhdGlhbFRyYW5zY3JpcHRUaWxlIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIG4gKz0gdC5jb3VudDtcbiAgbiA9IE1hdGgubWluKG4sIGxpbWl0KTtcbiAgY29uc3Qgb3V0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUgPSB7XG4gICAgY291bnQ6IG4sXG4gICAgYWdncmVnYXRlZDogdGlsZXMuc29tZSgodCkgPT4gdC5hZ2dyZWdhdGVkKSxcbiAgICB4OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgIHk6IG5ldyBGbG9hdDMyQXJyYXkobiksXG4gICAgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShuKSxcbiAgICBvYnNlcnZhdGlvbjogbmV3IFVpbnQzMkFycmF5KG4pLFxuICAgIGdlbmU6IG5ldyBVaW50MTZBcnJheShuKSxcbiAgfTtcbiAgbGV0IG8gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBjb25zdCBrID0gTWF0aC5taW4odC5jb3VudCwgbiAtIG8pO1xuICAgIGlmIChrIDw9IDApIGJyZWFrO1xuICAgIGZvciAoY29uc3QgZiBvZiBbJ3gnLCAneScsICd6JywgJ3dlaWdodCcsICdvYnNlcnZhdGlvbicsICdnZW5lJ10gYXMgY29uc3QpIHtcbiAgICAgIChvdXRbZl0gYXMgRmxvYXQzMkFycmF5KS5zZXQoKHRbZl0gYXMgRmxvYXQzMkFycmF5KS5zdWJhcnJheSgwLCBrKSwgbyk7XG4gICAgfVxuICAgIG8gKz0gaztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE9uZSBtYXJrZXIgcGVyIChjbHVzdGVyLCBgYmluYCBzcXVhcmUpIGZyb20gcGVyLWNsdXN0ZXIgZGVuc2l0eSBncmlkczogdGhlIGNvdW50cyBvZiB0aGUgZ3JpZFxuICogY2VsbHMgaW5zaWRlIGBhcmVhYCBzdW1tZWQgcGVyIHNxdWFyZSwgYXQgdGhlaXIgY291bnQtd2VpZ2h0ZWQgY2VudHJlLiBgc2xvdHNbY11gIGlzIHRoZSBnZW5lXG4gKiBzbG90IHdob3NlIGljb24gY2x1c3RlciBjJ3MgbWFya2VycyB0YWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2x1c3Rlck1hcmtlcnMoXG4gIHJhc3RlcnM6IFNwYXRpYWxEZW5zaXR5UmFzdGVyW10sXG4gIHNsb3RzOiBudW1iZXJbXSxcbiAgYmluOiBudW1iZXIsXG4gIGFyZWE6IERhdGFSZWN0LFxuKTogeyB0aWxlOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7IGdyb3VwOiBJbnQzMkFycmF5IH0ge1xuICBjb25zdCB4OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB5OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB3OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBnZW5lOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBncm91cDogbnVtYmVyW10gPSBbXTtcbiAgcmFzdGVycy5mb3JFYWNoKChyLCBjKSA9PiB7XG4gICAgY29uc3QgW2N3LCBjaF0gPSByLm1ldGEuZ3JpZFNpemU7XG4gICAgY29uc3QgW294LCBveV0gPSByLm1ldGEub3JpZ2luO1xuICAgIGNvbnN0IHsgcm93cywgY29scyB9ID0gci5tZXRhO1xuICAgIGNvbnN0IGMwID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigoYXJlYS54MCAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgYzEgPSBNYXRoLm1pbihjb2xzIC0gMSwgTWF0aC5mbG9vcigoYXJlYS54MSAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgcjAgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChhcmVhLnkwIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCByMSA9IE1hdGgubWluKHJvd3MgLSAxLCBNYXRoLmZsb29yKChhcmVhLnkxIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCBzcXVhcmVzID0gbmV3IE1hcDxudW1iZXIsIHsgbjogbnVtYmVyOyBzeDogbnVtYmVyOyBzeTogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgcm93ID0gcjA7IHJvdyA8PSByMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IGMwOyBjb2wgPD0gYzE7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IHYgPSByLnZhbHVlc1tyb3cgKiBjb2xzICsgY29sXTtcbiAgICAgICAgaWYgKCEodiA+IDApKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY3ggPSBveCArIChjb2wgKyAwLjUpICogY3c7XG4gICAgICAgIGNvbnN0IGN5ID0gb3kgKyAocm93ICsgMC41KSAqIGNoO1xuICAgICAgICBjb25zdCBrZXkgPSBNYXRoLmZsb29yKChjeSAtIG95KSAvIGJpbikgKiAxZTYgKyBNYXRoLmZsb29yKChjeCAtIG94KSAvIGJpbik7XG4gICAgICAgIGNvbnN0IHMgPSBzcXVhcmVzLmdldChrZXkpID8/IHsgbjogMCwgc3g6IDAsIHN5OiAwIH07XG4gICAgICAgIHMubiArPSB2O1xuICAgICAgICBzLnN4ICs9IHYgKiBjeDtcbiAgICAgICAgcy5zeSArPSB2ICogY3k7XG4gICAgICAgIHNxdWFyZXMuc2V0KGtleSwgcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcyBvZiBzcXVhcmVzLnZhbHVlcygpKSB7XG4gICAgICB4LnB1c2gocy5zeCAvIHMubik7XG4gICAgICB5LnB1c2gocy5zeSAvIHMubik7XG4gICAgICB3LnB1c2goTWF0aC5yb3VuZChzLm4pKTtcbiAgICAgIGdlbmUucHVzaChzbG90c1tjXSk7XG4gICAgICBncm91cC5wdXNoKGMpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IG4gPSB3Lmxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICB0aWxlOiB7XG4gICAgICBjb3VudDogbixcbiAgICAgIGFnZ3JlZ2F0ZWQ6IHRydWUsXG4gICAgICB4OiBGbG9hdDMyQXJyYXkuZnJvbSh4KSxcbiAgICAgIHk6IEZsb2F0MzJBcnJheS5mcm9tKHkpLFxuICAgICAgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICAgIHdlaWdodDogVWludDMyQXJyYXkuZnJvbSh3KSxcbiAgICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkobikuZmlsbChOT19PQlNFUlZBVElPTiksXG4gICAgICBnZW5lOiBVaW50MTZBcnJheS5mcm9tKGdlbmUpLFxuICAgIH0sXG4gICAgZ3JvdXA6IEludDMyQXJyYXkuZnJvbShncm91cCksXG4gIH07XG59XG4iXX0=
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC10aWxlLW1lcmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakUsT0FBTyxFQUNMLFdBQVcsRUFDWCxjQUFjLEdBSWYsTUFBTSx1Q0FBdUMsQ0FBQztBQUcvQyxrRUFBa0U7QUFDbEUsTUFBTSxVQUFVLFdBQVcsQ0FDekIsS0FBeUIsRUFDekIsTUFBeUQ7SUFFekQsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxQixNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxJQUFJLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUztRQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxD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QyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3BELElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUNELEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVyZ2luZyBhbmQgZmlsdGVyaW5nIG9mIHRoZSBzcGF0aWFsLXRpbGUgd2lyZSBmb3JtYXQgKG9ic2VydmF0aW9uIGlkcywgTk9fQ0FURUdPUlkpOiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgMkQgdmlldydzIHRpbGUgbG9vcCB0aGF0IGFyZSBwdXJlIOKAlCBjb25jYXRlbmF0aW5nIHRpbGVzLCBkcm9wcGluZyBoaWRkZW5cbiAqIGdyb3VwcyBhbmQgZ2VuZXMsIGFuZCB0aGUgZGVuc2l0eS1ncmlkIG1hcmtlcnMgb2YgYSB6b29tZWQtb3V0IGdlbmUgc2VsZWN0aW9uLlxuICpcbiAqIFRoZXNlIHdvcmsgb24gU0lWJ3Mgb3duIHRpbGUgY29udHJhY3QsIHNvIHRoZXkgc3RheSBpbiBTSVYgcmF0aGVyIHRoYW4gbW92aW5nIHRvIG5hcGFyaS1qcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBBTExfR0VORVMgfSBmcm9tICcuLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHtcbiAgTk9fQ0FURUdPUlksXG4gIE5PX09CU0VSVkFUSU9OLFxuICBTcGF0aWFsRGVuc2l0eVJhc3RlcixcbiAgU3BhdGlhbFBvbHlnb25UaWxlLFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBEYXRhUmVjdCB9IGZyb20gJy4vbG9kJztcblxuLyoqIFJpbmdzIHdob3NlIG93bmluZyBjZWxsIGlzIGluIGEgc3dpdGNoZWQtb2ZmIGdyb3VwIHJlbW92ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUmluZ3MoXG4gIHJpbmdzOiBTcGF0aWFsUG9seWdvblRpbGUsXG4gIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCxcbik6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGlmICghaGlkZGVuKSByZXR1cm4gcmluZ3M7XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGxldCB2ZXJ0aWNlcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZ3MuY291bnQ7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBoaWRkZW4uY29kZXNbcmluZ3Mub2JzZXJ2YXRpb25baV1dO1xuICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBoaWRkZW4uaGlkZGVuW2NvZGVdKSBjb250aW51ZTtcbiAgICBrZWVwLnB1c2goaSk7XG4gICAgdmVydGljZXMgKz0gcmluZ3Mub2Zmc2V0c1tpICsgMV0gLSByaW5ncy5vZmZzZXRzW2ldO1xuICB9XG4gIGlmIChrZWVwLmxlbmd0aCA9PT0gcmluZ3MuY291bnQpIHJldHVybiByaW5ncztcbiAgY29uc3Qgb2JzZXJ2YXRpb24gPSBuZXcgVWludDMyQXJyYXkoa2VlcC5sZW5ndGgpO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGtlZXAubGVuZ3RoICsgMSk7XG4gIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXMgKiAyKTtcbiAgbGV0IHYgPSAwO1xuICBrZWVwLmZvckVhY2goKGksIHIpID0+IHtcbiAgICBvYnNlcnZhdGlvbltyXSA9IHJpbmdzLm9ic2VydmF0aW9uW2ldO1xuICAgIG9mZnNldHNbcl0gPSB2O1xuICAgIGNvbnN0IGEgPSByaW5ncy5vZmZzZXRzW2ldICogMjtcbiAgICBjb25zdCBiID0gcmluZ3Mub2Zmc2V0c1tpICsgMV0gKiAyO1xuICAgIGNvb3Jkcy5zZXQocmluZ3MuY29vcmRzLnN1YmFycmF5KGEsIGIpLCB2ICogMik7XG4gICAgdiArPSAoYiAtIGEpIC8gMjtcbiAgfSk7XG4gIG9mZnNldHNba2VlcC5sZW5ndGhdID0gdjtcbiAgcmV0dXJuIHsgY291bnQ6IGtlZXAubGVuZ3RoLCBvYnNlcnZhdGlvbiwgb2Zmc2V0cywgY29vcmRzIH07XG59XG5cbi8qKiBTbG90cyAoaW5kaWNlcyBpbnRvIHRoZSBzZWxlY3RlZCBnZW5lcykgc3dpdGNoZWQgb2ZmIHdpdGggdGhlaXIgZXllIHRvZ2dsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWRkZW5HZW5lU2xvdHModmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgaWYgKCF2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICBjb25zdCBvZmYgPSBuZXcgU2V0KHZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzKTtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbSh2aWV3LnRyYW5zY3JpcHRHZW5lcywgKGcpID0+IChvZmYuaGFzKGcpID8gMSA6IDApKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIFwiQWxsIGdlbmVzXCIgaXMgc3dpdGNoZWQgb2ZmIGFzIGEgd2hvbGUgd2l0aCB0aGUgZ2VuZSB0cmVlJ3Mgcm9vdCBleWU6IGl0cyBoaWRkZW5cbiAqIGxpc3QgaXMgYFtBTExfR0VORVNdYCAoZXZlcnkgZ2VuZSBoaWRkZW4sIG5vbmUgZXhjZXB0ZWQpLiBIaWRpbmcgZXZlcnkgZ2VuZSBieSBuYW1lIHdvdWxkXG4gKiBuZWVkIHRoZSBnZW5lIGxpc3QsIHdoaWNoIGEgZGF0YXNldCBuZWVkIG5vdCBoYXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsR2VuZXNIaWRkZW4oXG4gIHZpZXc6IFBpY2s8U3BhdGlhbFZpZXdTdGF0ZSwgJ3RyYW5zY3JpcHRBbGxHZW5lcycgfCAndHJhbnNjcmlwdEFsbEdlbmVzSGlkZGVuJz4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzICYmIGV2ZXJ5R2VuZU9mZih2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc0hpZGRlbik7XG59XG5cbi8qKiBXaGV0aGVyIGFuIFwiQWxsIGdlbmVzXCIgaGlkZGVuIGxpc3QgaGlkZXMgZXZlcnkgZ2VuZSwgbm9uZSBleGNlcHRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVyeUdlbmVPZmYob2ZmOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2ZmLmxlbmd0aCA9PT0gMSAmJiBvZmZbMF0gPT09IEFMTF9HRU5FUztcbn1cblxuLyoqIFdoZXRoZXIgYSBnZW5lIG9mIFwiQWxsIGdlbmVzXCIgaXMgZHJhd24sIGJ5IGl0cyBoaWRkZW4gbGlzdCAoc2VlIGB0cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW5gKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxHZW5lU2hvd25CeShvZmY6IHJlYWRvbmx5IHN0cmluZ1tdKTogKGdlbmU6IHN0cmluZykgPT4gYm9vbGVhbiB7XG4gIGNvbnN0IGxpc3RlZCA9IG5ldyBTZXQob2ZmKTtcbiAgY29uc3QgZXhjZXB0ID0gb2ZmWzBdID09PSBBTExfR0VORVM7XG4gIHJldHVybiAoZ2VuZSkgPT4gbGlzdGVkLmhhcyhnZW5lKSA9PT0gZXhjZXB0O1xufVxuXG4vKiogXCJBbGwgZ2VuZXNcIidzIGhpZGRlbiBsaXN0IHdpdGggYGdlbmVgIHNob3duIChgb25gKSBvciBoaWRkZW4sIGluIHRoZSBsaXN0J3Mgb3duIGZvcm0uICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlQWxsR2VuZUhpZGRlbihvZmY6IHJlYWRvbmx5IHN0cmluZ1tdLCBnZW5lOiBzdHJpbmcsIG9uOiBib29sZWFuKTogc3RyaW5nW10ge1xuICBjb25zdCBleGNlcHQgPSBvZmZbMF0gPT09IEFMTF9HRU5FUztcbiAgLy8gSGlkZGVuIGJ5IG5hbWU6IGxpc3RlZCBtZWFucyBvZmYuIExlZCBieSBBTExfR0VORVM6IGxpc3RlZCBtZWFucyBvbi5cbiAgY29uc3QgbGlzdGVkID0gbmV3IFNldChleGNlcHQgPyBvZmYuc2xpY2UoMSkgOiBvZmYpO1xuICBpZiAob24gPT09IGV4Y2VwdCkgbGlzdGVkLmFkZChnZW5lKTtcbiAgZWxzZSBsaXN0ZWQuZGVsZXRlKGdlbmUpO1xuICByZXR1cm4gZXhjZXB0ID8gW0FMTF9HRU5FUywgLi4ubGlzdGVkXSA6IFsuLi5saXN0ZWRdO1xufVxuXG4vKipcbiAqIENvZGVzIChpbmRpY2VzIGludG8gYGdlbmVzYCwgdGhlIGRhdGFzZXQncyBhbGwtZ2VuZSBjb2RlIG9yZGVyKSBzd2l0Y2hlZCBvZmYgd2l0aCB0aGVpciBleWVcbiAqIHRvZ2dsZSB3aGlsZSBldmVyeSBnZW5lIGlzIGRyYXduOyBudWxsIHdoZW4gbm9uZSBpcywgb3Igd2l0aG91dCB0aGUgZ2VuZSBsaXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZGVuQWxsR2VuZUNvZGVzKFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICd0cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW4nPixcbiAgZ2VuZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIWdlbmVzIHx8ICF2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc0hpZGRlbi5sZW5ndGgpIHJldHVybiBudWxsO1xuICBjb25zdCBzaG93biA9IGFsbEdlbmVTaG93bkJ5KHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzSGlkZGVuKTtcbiAgY29uc3QgY29kZXMgPSBVaW50OEFycmF5LmZyb20oZ2VuZXMsIChnKSA9PiAoc2hvd24oZykgPyAwIDogMSkpO1xuICByZXR1cm4gY29kZXMuaW5jbHVkZXMoMSkgPyBjb2RlcyA6IG51bGw7XG59XG5cbi8qKiBFbnRyaWVzIGluIGEgaGlkZGVuIGdyb3VwJ3MgY2VsbCwgb3Igb2YgYSBoaWRkZW4gZ2VuZSwgcmVtb3ZlZCAod2l0aCB0aGVpciBzaXplcykuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVHJhbnNjcmlwdHMoXG4gIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgcHg6IEZsb2F0MzJBcnJheSxcbiAgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLFxuICBoaWRkZW5HZW5lczogVWludDhBcnJheSB8IG51bGwsXG4pOiB7IG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlOyBweDogRmxvYXQzMkFycmF5IH0ge1xuICBpZiAoIWhpZGRlbiAmJiAhaGlkZGVuR2VuZXMpIHJldHVybiB7IG1lcmdlZDogdCwgcHggfTtcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICBpZiAoaGlkZGVuR2VuZXMgJiYgaGlkZGVuR2VuZXNbdC5nZW5lW2ldXSkgY29udGludWU7XG4gICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgaWYgKGhpZGRlbiAmJiBvICE9PSBOT19PQlNFUlZBVElPTikge1xuICAgICAgY29uc3QgY29kZSA9IGhpZGRlbi5jb2Rlc1tvXTtcbiAgICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBoaWRkZW4uaGlkZGVuW2NvZGVdKSBjb250aW51ZTtcbiAgICB9XG4gICAga2VlcC5wdXNoKGkpO1xuICB9XG4gIGNvbnN0IHBpY2sgPSA8VCBleHRlbmRzIEZsb2F0MzJBcnJheSB8IFVpbnQzMkFycmF5IHwgVWludDE2QXJyYXk+KGE6IFQpOiBUID0+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgKGEuY29uc3RydWN0b3IgYXMgbmV3IChuOiBudW1iZXIpID0+IFQpKGtlZXAubGVuZ3RoKTtcbiAgICBrZWVwLmZvckVhY2goKGksIGspID0+IHtcbiAgICAgIG91dFtrXSA9IGFbaV07XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtZXJnZWQ6IHtcbiAgICAgIGNvdW50OiBrZWVwLmxlbmd0aCxcbiAgICAgIGFnZ3JlZ2F0ZWQ6IHQuYWdncmVnYXRlZCxcbiAgICAgIHg6IHBpY2sodC54KSxcbiAgICAgIHk6IHBpY2sodC55KSxcbiAgICAgIHo6IHBpY2sodC56KSxcbiAgICAgIHdlaWdodDogcGljayh0LndlaWdodCksXG4gICAgICBvYnNlcnZhdGlvbjogcGljayh0Lm9ic2VydmF0aW9uKSxcbiAgICAgIGdlbmU6IHBpY2sodC5nZW5lKSxcbiAgICB9LFxuICAgIHB4OiBwaWNrKHB4KSxcbiAgfTtcbn1cblxuLyoqIFRoZSBtZWRpYW4gb2YgYHZgLCBmcm9tIGEgc2FtcGxlIG9mIGFib3V0IDEwMjQgdmFsdWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lZGlhbih2OiBGbG9hdDMyQXJyYXkpOiBudW1iZXIge1xuICBpZiAoIXYubGVuZ3RoKSByZXR1cm4gMDtcbiAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iodi5sZW5ndGggLyAxMDI0KSk7XG4gIGNvbnN0IHNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSArPSBzdGVwKSBzYW1wbGUucHVzaCh2W2ldKTtcbiAgc2FtcGxlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgcmV0dXJuIHNhbXBsZVtzYW1wbGUubGVuZ3RoID4+IDFdO1xufVxuXG4vKiogQ29uY2F0ZW5hdGUgdGlsZXMnIHJpbmdzIGludG8gb25lIHNldCwgZHJvcHBpbmcgcmluZ3MgYWxyZWFkeSBzZWVuIChhIGNlbGwgc3RyYWRkbGluZ1xuICogIHR3byB0aWxlcyBtYXkgYmUgbGlzdGVkIGJ5IGJvdGgpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUG9seWdvblRpbGVzKHRpbGVzOiBTcGF0aWFsUG9seWdvblRpbGVbXSk6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgbGV0IHJpbmdzID0gMDtcbiAgbGV0IHZlcnRpY2VzID0gMDtcbiAgZm9yIChjb25zdCB0IG9mIHRpbGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGlmIChzZWVuLmhhcyh0Lm9ic2VydmF0aW9uW2ldKSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZCh0Lm9ic2VydmF0aW9uW2ldKTtcbiAgICAgIHJpbmdzKys7XG4gICAgICB2ZXJ0aWNlcyArPSB0Lm9mZnNldHNbaSArIDFdIC0gdC5vZmZzZXRzW2ldO1xuICAgIH1cbiAgfVxuICBzZWVuLmNsZWFyKCk7XG4gIGNvbnN0IG9ic2VydmF0aW9uID0gbmV3IFVpbnQzMkFycmF5KHJpbmdzKTtcbiAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShyaW5ncyArIDEpO1xuICBjb25zdCBjb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzICogMik7XG4gIGxldCByID0gMDtcbiAgbGV0IHYgPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQuY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgICBpZiAoc2Vlbi5oYXMobykpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQobyk7XG4gICAgICBvYnNlcnZhdGlvbltyXSA9IG87XG4gICAgICBvZmZzZXRzW3JdID0gdjtcbiAgICAgIGNvbnN0IGEgPSB0Lm9mZnNldHNbaV0gKiAyO1xuICAgICAgY29uc3QgYiA9IHQub2Zmc2V0c1tpICsgMV0gKiAyO1xuICAgICAgY29vcmRzLnNldCh0LmNvb3Jkcy5zdWJhcnJheShhLCBiKSwgdiAqIDIpO1xuICAgICAgdiArPSAoYiAtIGEpIC8gMjtcbiAgICAgIHIrKztcbiAgICB9XG4gIH1cbiAgb2Zmc2V0c1tyaW5nc10gPSB2O1xuICByZXR1cm4geyBjb3VudDogcmluZ3MsIG9ic2VydmF0aW9uLCBvZmZzZXRzLCBjb29yZHMgfTtcbn1cblxuLyoqIENvbmNhdGVuYXRlIHRyYW5zY3JpcHQgdGlsZXMsIHN0b3BwaW5nIGF0IGBsaW1pdGAgZW50cmllcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRyYW5zY3JpcHRUaWxlcyh0aWxlczogU3BhdGlhbFRyYW5zY3JpcHRUaWxlW10sIGxpbWl0ID0gSW5maW5pdHkpOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUge1xuICBsZXQgbiA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykgbiArPSB0LmNvdW50O1xuICBuID0gTWF0aC5taW4obiwgbGltaXQpO1xuICBjb25zdCBvdXQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSA9IHtcbiAgICBjb3VudDogbixcbiAgICBhZ2dyZWdhdGVkOiB0aWxlcy5zb21lKCh0KSA9PiB0LmFnZ3JlZ2F0ZWQpLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkobiksXG4gICAgeTogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICB6OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgIHdlaWdodDogbmV3IFVpbnQzMkFycmF5KG4pLFxuICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkobiksXG4gICAgZ2VuZTogbmV3IFVpbnQxNkFycmF5KG4pLFxuICB9O1xuICBsZXQgbyA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykge1xuICAgIGNvbnN0IGsgPSBNYXRoLm1pbih0LmNvdW50LCBuIC0gbyk7XG4gICAgaWYgKGsgPD0gMCkgYnJlYWs7XG4gICAgZm9yIChjb25zdCBmIG9mIFsneCcsICd5JywgJ3onLCAnd2VpZ2h0JywgJ29ic2VydmF0aW9uJywgJ2dlbmUnXSBhcyBjb25zdCkge1xuICAgICAgKG91dFtmXSBhcyBGbG9hdDMyQXJyYXkpLnNldCgodFtmXSBhcyBGbG9hdDMyQXJyYXkpLnN1YmFycmF5KDAsIGspLCBvKTtcbiAgICB9XG4gICAgbyArPSBrO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogT25lIG1hcmtlciBwZXIgKGNsdXN0ZXIsIGBiaW5gIHNxdWFyZSkgZnJvbSBwZXItY2x1c3RlciBkZW5zaXR5IGdyaWRzOiB0aGUgY291bnRzIG9mIHRoZSBncmlkXG4gKiBjZWxscyBpbnNpZGUgYGFyZWFgIHN1bW1lZCBwZXIgc3F1YXJlLCBhdCB0aGVpciBjb3VudC13ZWlnaHRlZCBjZW50cmUuIGBzbG90c1tjXWAgaXMgdGhlIGdlbmVcbiAqIHNsb3Qgd2hvc2UgaWNvbiBjbHVzdGVyIGMncyBtYXJrZXJzIHRha2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbHVzdGVyTWFya2VycyhcbiAgcmFzdGVyczogU3BhdGlhbERlbnNpdHlSYXN0ZXJbXSxcbiAgc2xvdHM6IG51bWJlcltdLFxuICBiaW46IG51bWJlcixcbiAgYXJlYTogRGF0YVJlY3QsXG4pOiB7IHRpbGU6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgZ3JvdXA6IEludDMyQXJyYXkgfSB7XG4gIGNvbnN0IHg6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHk6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHc6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGdlbmU6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGdyb3VwOiBudW1iZXJbXSA9IFtdO1xuICByYXN0ZXJzLmZvckVhY2goKHIsIGMpID0+IHtcbiAgICBjb25zdCBbY3csIGNoXSA9IHIubWV0YS5ncmlkU2l6ZTtcbiAgICBjb25zdCBbb3gsIG95XSA9IHIubWV0YS5vcmlnaW47XG4gICAgY29uc3QgeyByb3dzLCBjb2xzIH0gPSByLm1ldGE7XG4gICAgY29uc3QgYzAgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChhcmVhLngwIC0gb3gpIC8gY3cpKTtcbiAgICBjb25zdCBjMSA9IE1hdGgubWluKGNvbHMgLSAxLCBNYXRoLmZsb29yKChhcmVhLngxIC0gb3gpIC8gY3cpKTtcbiAgICBjb25zdCByMCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKGFyZWEueTAgLSBveSkgLyBjaCkpO1xuICAgIGNvbnN0IHIxID0gTWF0aC5taW4ocm93cyAtIDEsIE1hdGguZmxvb3IoKGFyZWEueTEgLSBveSkgLyBjaCkpO1xuICAgIGNvbnN0IHNxdWFyZXMgPSBuZXcgTWFwPG51bWJlciwgeyBuOiBudW1iZXI7IHN4OiBudW1iZXI7IHN5OiBudW1iZXIgfT4oKTtcbiAgICBmb3IgKGxldCByb3cgPSByMDsgcm93IDw9IHIxOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gYzA7IGNvbCA8PSBjMTsgY29sKyspIHtcbiAgICAgICAgY29uc3QgdiA9IHIudmFsdWVzW3JvdyAqIGNvbHMgKyBjb2xdO1xuICAgICAgICBpZiAoISh2ID4gMCkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBjeCA9IG94ICsgKGNvbCArIDAuNSkgKiBjdztcbiAgICAgICAgY29uc3QgY3kgPSBveSArIChyb3cgKyAwLjUpICogY2g7XG4gICAgICAgIGNvbnN0IGtleSA9IE1hdGguZmxvb3IoKGN5IC0gb3kpIC8gYmluKSAqIDFlNiArIE1hdGguZmxvb3IoKGN4IC0gb3gpIC8gYmluKTtcbiAgICAgICAgY29uc3QgcyA9IHNxdWFyZXMuZ2V0KGtleSkgPz8geyBuOiAwLCBzeDogMCwgc3k6IDAgfTtcbiAgICAgICAgcy5uICs9IHY7XG4gICAgICAgIHMuc3ggKz0gdiAqIGN4O1xuICAgICAgICBzLnN5ICs9IHYgKiBjeTtcbiAgICAgICAgc3F1YXJlcy5zZXQoa2V5LCBzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBzIG9mIHNxdWFyZXMudmFsdWVzKCkpIHtcbiAgICAgIHgucHVzaChzLnN4IC8gcy5uKTtcbiAgICAgIHkucHVzaChzLnN5IC8gcy5uKTtcbiAgICAgIHcucHVzaChNYXRoLnJvdW5kKHMubikpO1xuICAgICAgZ2VuZS5wdXNoKHNsb3RzW2NdKTtcbiAgICAgIGdyb3VwLnB1c2goYyk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgbiA9IHcubGVuZ3RoO1xuICByZXR1cm4ge1xuICAgIHRpbGU6IHtcbiAgICAgIGNvdW50OiBuLFxuICAgICAgYWdncmVnYXRlZDogdHJ1ZSxcbiAgICAgIHg6IEZsb2F0MzJBcnJheS5mcm9tKHgpLFxuICAgICAgeTogRmxvYXQzMkFycmF5LmZyb20oeSksXG4gICAgICB6OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgICAgd2VpZ2h0OiBVaW50MzJBcnJheS5mcm9tKHcpLFxuICAgICAgb2JzZXJ2YXRpb246IG5ldyBVaW50MzJBcnJheShuKS5maWxsKE5PX09CU0VSVkFUSU9OKSxcbiAgICAgIGdlbmU6IFVpbnQxNkFycmF5LmZyb20oZ2VuZSksXG4gICAgfSxcbiAgICBncm91cDogSW50MzJBcnJheS5mcm9tKGdyb3VwKSxcbiAgfTtcbn1cbiJdfQ==
|