@jax-data-science/sci-image-visualizer 0.12.0 → 0.13.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/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/reconstruct.mjs +11 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +18 -6
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +29 -14
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +6 -1
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +9 -4
- package/esm2022/lib/region-editor/region-editor.component.mjs +13 -1
- package/esm2022/lib/routing-visualizer.service.mjs +4 -1
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +71 -21
- package/esm2022/lib/spatial/spatial-selection.mjs +70 -1
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +53 -11
- package/esm2022/lib/store/region-selection.mjs +21 -4
- package/esm2022/lib/store/region-store.service.mjs +22 -3
- package/esm2022/lib/store/spatial-selection.service.mjs +13 -1
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +3 -3
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs} +770 -500
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -2
- package/lib/contracts/region-editor-api.contract.d.ts +3 -0
- package/lib/contracts/visualizer.contract.d.ts +25 -2
- package/lib/geometry/reconstruct.d.ts +6 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +13 -1
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +11 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +3 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +6 -1
- package/lib/routing-visualizer.service.d.ts +1 -0
- package/lib/spatial/spatial-controls.facade.d.ts +16 -2
- package/lib/spatial/spatial-selection.d.ts +16 -1
- package/lib/spatial-controls/spatial-controls.component.d.ts +14 -3
- package/lib/store/region-selection.d.ts +14 -3
- package/lib/store/region-store.service.d.ts +14 -1
- package/lib/store/spatial-selection.service.d.ts +8 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs.map +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { firstValueFrom } from 'rxjs';
|
|
2
2
|
import { isSpatialOmics3d } from '../contracts/plot-type';
|
|
3
|
-
import { isCategoricalColumn } from '../contracts/spatial-dataset.contract';
|
|
3
|
+
import { isCategoricalColumn, } from '../contracts/spatial-dataset.contract';
|
|
4
4
|
import { resolveCategoryColors } from './spatial-encoding';
|
|
5
5
|
import { sectionsOf } from './spatial-sections';
|
|
6
6
|
import { observationsInSlice, volumeImageRef } from './spatial-volume-image';
|
|
7
|
-
import { emptySelection, selectByCategory, selectByIndices, selectInRegions, selectInRegionsProjected, } from './spatial-selection';
|
|
7
|
+
import { emptySelection, selectByCategory, selectByIndices, selectInClassVolumes, selectInRegions, selectInRegionsProjected, } from './spatial-selection';
|
|
8
8
|
/**
|
|
9
9
|
* The spatial-omics controls (`ISpatialControls`) over a host's `SPATIAL_DATA_PORT`.
|
|
10
10
|
*
|
|
@@ -19,9 +19,11 @@ export class SpatialControlsFacade {
|
|
|
19
19
|
constructor(port, ctx) {
|
|
20
20
|
this.port = port;
|
|
21
21
|
this.ctx = ctx;
|
|
22
|
-
/** Latest dataset, mirrored so `selectFromRegions()`
|
|
23
|
-
* runs from a button click and must not await a round-trip. */
|
|
22
|
+
/** Latest dataset, mirrored so `selectFromRegions()` answers from the dataset on
|
|
23
|
+
* screen — it runs from a button click and must not await a round-trip. */
|
|
24
24
|
this.dataset = null;
|
|
25
|
+
/** Bumped per class-volume selection (and on dispose): only the latest may publish. */
|
|
26
|
+
this.roiRequest = 0;
|
|
25
27
|
// Mirror the dataset (and drop a stale selection when it changes — the masks are
|
|
26
28
|
// index-based, so they are meaningless against different observations).
|
|
27
29
|
this.sub = port.getDataset$().subscribe((dataset) => {
|
|
@@ -42,6 +44,23 @@ export class SpatialControlsFacade {
|
|
|
42
44
|
/** Release the port subscription (the router's injector is being destroyed). */
|
|
43
45
|
dispose() {
|
|
44
46
|
this.sub.unsubscribe();
|
|
47
|
+
// A class-volume selection still reading its outlines publishes nothing.
|
|
48
|
+
this.roiRequest++;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* How "Select from ROIs" selects now — the one rule its executor and the panel's description
|
|
52
|
+
* share: inside the picked classes' volumes in the 3D cloud, when the dataset has a reference
|
|
53
|
+
* volume (and no tissue image) and the plotted image is that volume's stack, so the regions sit
|
|
54
|
+
* in its grid; by the drawn regions otherwise.
|
|
55
|
+
*/
|
|
56
|
+
roiSelectionMode() {
|
|
57
|
+
const dataset = this.dataset;
|
|
58
|
+
const eligible = !!dataset?.volume &&
|
|
59
|
+
!dataset.imageRef &&
|
|
60
|
+
isSpatialOmics3d(this.ctx.plotType()) &&
|
|
61
|
+
this.ctx.regionStore.getPickedClasses().length > 0 &&
|
|
62
|
+
this.ctx.napari.regionVoxelStep() !== null;
|
|
63
|
+
return eligible ? 'class-volumes' : 'regions';
|
|
45
64
|
}
|
|
46
65
|
build() {
|
|
47
66
|
const port = this.port;
|
|
@@ -136,31 +155,62 @@ export class SpatialControlsFacade {
|
|
|
136
155
|
return obs ? sectionsOf(obs) : null;
|
|
137
156
|
},
|
|
138
157
|
getSelection$: () => this.ctx.selectionStore.getSelection$(),
|
|
139
|
-
selectFromRegions: () => {
|
|
158
|
+
selectFromRegions: async () => {
|
|
140
159
|
const dataset = this.dataset;
|
|
141
160
|
if (!dataset)
|
|
142
161
|
return 0;
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
//
|
|
162
|
+
const is3d = isSpatialOmics3d(this.ctx.plotType());
|
|
163
|
+
const volume = !dataset.imageRef ? dataset.volume : undefined;
|
|
164
|
+
// In the 3D cloud, region classes picked in the Region Editor (a class
|
|
165
|
+
// tree node with its subclasses, a surface clicked in 3D) select the
|
|
166
|
+
// cells inside their volumes — the structures shown among the cells.
|
|
167
|
+
if (volume && this.roiSelectionMode() === 'class-volumes') {
|
|
168
|
+
const classes = this.ctx.regionStore.getPickedClasses();
|
|
169
|
+
const request = ++this.roiRequest;
|
|
170
|
+
const revision = this.ctx.selectionStore.revision();
|
|
171
|
+
const outlines = await this.ctx.regionStore.classSliceOutlines(classes);
|
|
172
|
+
// Superseded while the outlines were read: a newer request, any newer selection
|
|
173
|
+
// (a Clear, a legend click, a linked chart's brush), another dataset, view or pick,
|
|
174
|
+
// or the facade disposed. Its mask would overwrite what the user did since.
|
|
175
|
+
const current = this.ctx.regionStore.getPickedClasses();
|
|
176
|
+
if (request !== this.roiRequest ||
|
|
177
|
+
revision !== this.ctx.selectionStore.revision() ||
|
|
178
|
+
this.dataset !== dataset ||
|
|
179
|
+
this.roiSelectionMode() !== 'class-volumes' ||
|
|
180
|
+
current.length !== classes.length ||
|
|
181
|
+
current.some((c, i) => c !== classes[i])) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
const selection = selectInClassVolumes(dataset.observations, volume, outlines);
|
|
185
|
+
this.ctx.selectionStore.set(selection);
|
|
186
|
+
return selection.count;
|
|
187
|
+
}
|
|
188
|
+
// Otherwise the union of every drawn region — so every ROI tool the
|
|
189
|
+
// library already has doubles as a spatial selection tool.
|
|
146
190
|
//
|
|
147
191
|
// In the 3D cloud there is no data-space affine to push a drawn shape
|
|
148
192
|
// through, so the observations are projected to canvas pixels by the
|
|
149
|
-
// renderer (which owns the camera) and tested in screen space instead
|
|
150
|
-
//
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
193
|
+
// renderer (which owns the camera) and tested in screen space instead —
|
|
194
|
+
// against the lassos drawn there only: every other region is in image
|
|
195
|
+
// space. Falls back to the 2D path whenever the cloud is not mounted.
|
|
196
|
+
const projected = is3d ? this.ctx.napari.getSpatialScreenProjection(dataset.observations) : null;
|
|
197
|
+
let selection;
|
|
198
|
+
if (projected) {
|
|
199
|
+
const lassos = new Set(this.ctx.napari.getSpatialLassoIds());
|
|
200
|
+
const regions = this.ctx.regionStore.getRegions().filter((r) => lassos.has(r.id));
|
|
201
|
+
selection = selectInRegionsProjected(projected, dataset.observations.count, regions);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// In the 2D view of a volume-backed dataset the shape was drawn over ONE
|
|
205
|
+
// section, in the volume's pixel grid: it selects the cells of that
|
|
206
|
+
// section, not the whole depth of brain standing behind them.
|
|
207
|
+
selection = selectInRegions(dataset.observations, volume ? volumeImageRef(volume, dataset.micronsPerUnit) : dataset.imageRef, this.ctx.regionStore.getRegions(), volume ? observationsInSlice(dataset.observations, volume, this.ctx.zIndex()) : undefined);
|
|
208
|
+
}
|
|
161
209
|
this.ctx.selectionStore.set(selection);
|
|
162
210
|
return selection.count;
|
|
163
211
|
},
|
|
212
|
+
roiSelectionMode: () => this.roiSelectionMode(),
|
|
213
|
+
getPickedRegionClasses$: () => this.ctx.regionStore.getPickedClasses$(),
|
|
164
214
|
selectCategory: async (column, categoryIndex) => {
|
|
165
215
|
const loaded = await port.getColumn(column);
|
|
166
216
|
if (!isCategoricalColumn(loaded)) {
|
|
@@ -197,4 +247,4 @@ function canColorBy(dataset, by) {
|
|
|
197
247
|
const names = dataset.features?.names;
|
|
198
248
|
return !!dataset.features && (!names || names.includes(by.name));
|
|
199
249
|
}
|
|
200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jb250cm9scy5mYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFaEUsT0FBTyxFQUFZLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHcEUsT0FBTyxFQUF1QyxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBS2pILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0UsT0FBTyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSxxQkFBcUIsQ0FBQztBQXVCN0I7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQVFoQyxZQUNtQixJQUFxQixFQUNyQixHQUEyQjtRQUQzQixTQUFJLEdBQUosSUFBSSxDQUFpQjtRQUNyQixRQUFHLEdBQUgsR0FBRyxDQUF3QjtRQVA5Qzt3RUFDZ0U7UUFDeEQsWUFBTyxHQUEwQixJQUFJLENBQUM7UUFPNUMsaUZBQWlGO1FBQ2pGLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNsRCxNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFD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LGVBQWUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkMsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ3pCLENBQUM7WUFFRCxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFO1NBQ3RELENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxPQUE4QixFQUFFLEVBQWtCO0lBQ3BFLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0IsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQztJQUN0QyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNuRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBQbG90VHlwZSwgaXNTcGF0aWFsT21pY3MzZCB9IGZyb20gJy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHsgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7IFNwYXRpYWxDb2xvckJ5IH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgU3BhdGlhbERhdGFzZXQsIFNwYXRpYWxPYnNlcnZhdGlvbnMsIGlzQ2F0ZWdvcmljYWxDb2x1bW4gfSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IElTcGF0aWFsQ29udHJvbHMgfSBmcm9tICcuLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB9IGZyb20gJy4uL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IHJlc29sdmVDYXRlZ29yeUNvbG9ycyB9IGZyb20gJy4vc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBzZWN0aW9uc09mIH0gZnJvbSAnLi9zcGF0aWFsLXNlY3Rpb25zJztcbmltcG9ydCB7IG9ic2VydmF0aW9uc0luU2xpY2UsIHZvbHVtZUltYWdlUmVmIH0gZnJvbSAnLi9zcGF0aWFsLXZvbHVtZS1pbWFnZSc7XG5pbXBvcnQge1xuICBlbXB0eVNlbGVjdGlvbixcbiAgc2VsZWN0QnlDYXRlZ29yeSxcbiAgc2VsZWN0QnlJbmRpY2VzLFxuICBzZWxlY3RJblJlZ2lvbnMsXG4gIHNlbGVjdEluUmVnaW9uc1Byb2plY3RlZCxcbn0gZnJvbSAnLi9zcGF0aWFsLXNlbGVjdGlvbic7XG5cbi8qKiBUaGUgcmVuZGVyZXItc2lkZSBzcGF0aWFsIHJlYWRvdXRzIHRoZSBjb250cm9scyBzdXJmYWNlICh0aGUgbmFwYXJpLWpzIGJhY2tlbmQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsUmVuZGVyZXJGZWVkcyB7XG4gIHJlYWRvbmx5IHRyYW5zY3JpcHRFc3RpbWF0ZSQ6IHsgYXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8eyBwb2ludHM6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+IH07XG4gIHJlYWRvbmx5IGdlbmVDb3VudHNJblZpZXckOiB7IGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsPiB9O1xuICByZWFkb25seSBkZW5zaXR5U3RhdHMkOiB7IGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+IH07XG4gIC8qKiBPYnNlcnZhdGlvbnMgcHJvamVjdGVkIHRvIGNhbnZhcyBwaXhlbHMgYnkgdGhlIDNEIGNhbWVyYSwgb3IgbnVsbCB3aGVuIHRoZSBjbG91ZCBpcyBub3QgbW91bnRlZC4gKi9cbiAgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb24ob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbDtcbn1cblxuLyoqIFdoYXQgdGhlIGZhY2FkZSB3b3JrcyBvdmVyOiB0aGUgc2hhcmVkIHN0b3JlcywgdGhlIHJlbmRlcmVyIGZlZWRzIGFuZCB0aGUgcm91dGVyJ3MgdmlldyBzdGF0ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbENvbnRyb2xzQ29udGV4dCB7XG4gIHJlYWRvbmx5IHN0b3JlOiBWaXN1YWxpemVyU3RvcmU7XG4gIHJlYWRvbmx5IHJlZ2lvblN0b3JlOiBSZWdpb25TdG9yZTtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZTtcbiAgcmVhZG9ubHkgbmFwYXJpOiBTcGF0aWFsUmVuZGVyZXJGZWVkcztcbiAgLyoqIFRoZSBwbG90IHR5cGUgb24gc2NyZWVuICh0aGUgM0QgY2xvdWQgc2VsZWN0cyBpbiBzY3JlZW4gc3BhY2UpLiAqL1xuICBwbG90VHlwZSgpOiBQbG90VHlwZTtcbiAgLyoqIFRoZSBkaXNwbGF5ZWQgc2xpY2UgKGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHNlbGVjdHMgd2l0aGluIG9uZSBzZWN0aW9uKS4gKi9cbiAgekluZGV4KCk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgc3BhdGlhbC1vbWljcyBjb250cm9scyAoYElTcGF0aWFsQ29udHJvbHNgKSBvdmVyIGEgaG9zdCdzIGBTUEFUSUFMX0RBVEFfUE9SVGAuXG4gKlxuICogQmFja2VuZC1uZXV0cmFsOiB0aGUgdmlldyBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIGBWaXN1YWxpemVyU3RvcmVgIChsaWtlIHRoZVxuICogY29sb3JtYXApIGFuZCB0aGUgc2VsZWN0aW9uIGluIHRoZSBgU3BhdGlhbFNlbGVjdGlvblN0b3JlYCwgc28gdGhlIGNvbnRyb2xzIGtlZXBcbiAqIHdvcmtpbmcgYWNyb3NzIGEgcGxvdC10eXBlIHN3aXRjaCBhbmQgYSBob3N0IGNhbiBkcml2ZSB0aGVtIGJlZm9yZSBhbnkgYmFja2VuZCBoYXNcbiAqIG1vdW50ZWQuIE93bnMgaXRzIG1pcnJvciBvZiB0aGUgcG9ydCdzIGRhdGFzZXQg4oCUIGRyb3BwaW5nIGEgc3RhbGUgc2VsZWN0aW9uIGFuZCBhblxuICogdW5zYXRpc2ZpYWJsZSBjb2xvdXIgc291cmNlIHdoZW4gdGhlIGRhdGFzZXQgY2hhbmdlcyDigJQgYW5kIHRoZSBzdWJzY3JpcHRpb24gYmVoaW5kXG4gKiBpdCwgcmVsZWFzZWQgYnkge0BsaW5rIGRpc3Bvc2V9IChyZXZpZXcgQ09SRS0zMCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGF0aWFsQ29udHJvbHNGYWNhZGUge1xuICAvKiogVGhlIGNvbnRyb2xzOyBvbmUgb2JqZWN0IGZvciB0aGUgZmFjYWRlJ3MgbGlmZSwgc28gY29uc3VtZXJzIGNhbiBob2xkIGl0LiAqL1xuICByZWFkb25seSBjb250cm9sczogSVNwYXRpYWxDb250cm9scztcbiAgLyoqIExhdGVzdCBkYXRhc2V0LCBtaXJyb3JlZCBzbyBgc2VsZWN0RnJvbVJlZ2lvbnMoKWAgY2FuIGFuc3dlciBzeW5jaHJvbm91c2x5IOKAlCBpdFxuICAgKiAgcnVucyBmcm9tIGEgYnV0dG9uIGNsaWNrIGFuZCBtdXN0IG5vdCBhd2FpdCBhIHJvdW5kLXRyaXAuICovXG4gIHByaXZhdGUgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWI6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcnQ6IFNwYXRpYWxEYXRhUG9ydCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN0eDogU3BhdGlhbENvbnRyb2xzQ29udGV4dCxcbiAgKSB7XG4gICAgLy8gTWlycm9yIHRoZSBkYXRhc2V0IChhbmQgZHJvcCBhIHN0YWxlIHNlbGVjdGlvbiB3aGVuIGl0IGNoYW5nZXMg4oCUIHRoZSBtYXNrcyBhcmVcbiAgICAvLyBpbmRleC1iYXNlZCwgc28gdGhleSBhcmUgbWVhbmluZ2xlc3MgYWdhaW5zdCBkaWZmZXJlbnQgb2JzZXJ2YXRpb25zKS5cbiAgICB0aGlzLnN1YiA9IHBvcnQuZ2V0RGF0YXNldCQoKS5zdWJzY3JpYmUoKGRhdGFzZXQpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZWQgPSBkYXRhc2V0Py5pZCAhPT0gdGhpcy5kYXRhc2V0Py5pZDtcbiAgICAgIHRoaXMuZGF0YXNldCA9IGRhdGFzZXQ7XG4gICAgICBpZiAoIWNoYW5nZWQpIHJldHVybjtcbiAgICAgIGN0eC5zZWxlY3Rpb25TdG9yZS5zZXQoZW1wdHlTZWxlY3Rpb24oZGF0YXNldD8ub2JzZXJ2YXRpb25zLmNvdW50ID8/IDApKTtcbiAgICAgIC8vIEEgY29sb3VyIHNvdXJjZSB0aGUgbmV3IGRhdGFzZXQgY2Fubm90IHNhdGlzZnkgd291bGQgbGVhdmUgdGhlIG1hcCBmbGF0IHdoaWxlXG4gICAgICAvLyB0aGUgcGFuZWwgYW5kIHRoZSBjaGFydHMga2VwdCBuYW1pbmcgdGhlIG9sZCBjb2x1bW4g4oCUIHNvIGRyb3AgaXQsIGFuZCBvbmx5IGl0OlxuICAgICAgLy8gcG9pbnQgc2l6ZSwgb3BhY2l0eSBhbmQgdGhlIHJlc3QgYXJlIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMuXG4gICAgICBjb25zdCBieSA9IGN0eC5zdG9yZS5jdXJyZW50U3BhdGlhbFZpZXcoKS5jb2xvckJ5O1xuICAgICAgaWYgKGJ5ICYmICFjYW5Db2xvckJ5KGRhdGFzZXQsIGJ5KSkgY3R4LnN0b3JlLnNldFNwYXRpYWxWaWV3KHsgY29sb3JCeTogbnVsbCB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRyb2xzID0gdGhpcy5idWlsZCgpO1xuICB9XG5cbiAgLyoqIFJlbGVhc2UgdGhlIHBvcnQgc3Vic2NyaXB0aW9uICh0aGUgcm91dGVyJ3MgaW5qZWN0b3IgaXMgYmVpbmcgZGVzdHJveWVkKS4gKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1Yi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZCgpOiBJU3BhdGlhbENvbnRyb2xzIHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5wb3J0O1xuICAgIHJldHVybiB7XG4gICAgICBnZXREYXRhc2V0JDogKCkgPT4gcG9ydC5nZXREYXRhc2V0JCgpLFxuICAgICAgZ2V0Vmlld1N0YXRlJDogKCkgPT4gdGhpcy5jdHguc3RvcmUuZ2V0U3BhdGlhbFZpZXckKCksXG4gICAgICB2aWV3U3RhdGU6ICgpID0+IHRoaXMuY3R4LnN0b3JlLmN1cnJlbnRTcGF0aWFsVmlldygpLFxuICAgICAgc2V0Vmlld1N0YXRlOiAocGFydGlhbCkgPT4gdGhpcy5jdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcocGFydGlhbCksXG4gICAgICAvLyBUaGUgaGludCBTRUVEUyB0aGUgdG9nZ2xlIHdoZW4gdGhlIHNvdXJjZSBjaGFuZ2VzLCBhbmQgbm90aGluZyBjb25zdWx0cyBpdFxuICAgICAgLy8gYWZ0ZXJ3YXJkcy4gSXQgdXNlZCB0byBiZSBPUmVkIGluIGF0IHJlbmRlciB0aW1lLCB3aGljaCBtZWFudCBhbiB1bmNoZWNrZWRcbiAgICAgIC8vIGJveCBjb3VsZCBub3QgdHVybiBsb2cgc2NhbGluZyBvZmYgZm9yIGEgaGludGVkIGNvbHVtbiDigJQgYW5kIHRoZSBsaW5rZWRcbiAgICAgIC8vIGNoYXJ0LCB3aGljaCByZWFkcyBgbG9nU2NhbGVgIGFsb25lLCBkaXNhZ3JlZWQgd2l0aCB0aGUgbWFwIGFib3V0IHdoYXQgaXRcbiAgICAgIC8vIHdhcyBzaG93aW5nLiBPbmUgYXV0aG9yaXR5LCBzZXQgb25jZSBwZXIgc291cmNlLlxuICAgICAgY29sb3JCeUNvbHVtbjogKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5kYXRhc2V0Py5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgIGNvbnN0IGhpbnQgPSBtZXRhPy5raW5kID09PSAnY29udGludW91cycgPyAhIW1ldGEubG9nU2NhbGVIaW50IDogZmFsc2U7XG4gICAgICAgIHRoaXMuY3R4LnN0b3JlLnNldFNwYXRpYWxWaWV3KHsgY29sb3JCeTogeyBraW5kOiAnY29sdW1uJywgbmFtZSB9LCBsb2dTY2FsZTogaGludCB9KTtcbiAgICAgIH0sXG4gICAgICBjb2xvckJ5RmVhdHVyZTogKG5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5jdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoe1xuICAgICAgICAgIGNvbG9yQnk6IHsga2luZDogJ2ZlYXR1cmUnLCBuYW1lIH0sXG4gICAgICAgICAgbG9nU2NhbGU6ICEhdGhpcy5kYXRhc2V0Py5mZWF0dXJlcz8ubG9nU2NhbGVIaW50LFxuICAgICAgICB9KSxcbiAgICAgIGNsZWFyQ29sb3JCeTogKCkgPT4gdGhpcy5jdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBjb2xvckJ5OiBudWxsIH0pLFxuICAgICAgc2VhcmNoRmVhdHVyZXM6IGFzeW5jIChxdWVyeTogc3RyaW5nLCBsaW1pdCA9IDUwKSA9PiB7XG4gICAgICAgIC8vIFByZWZlciB0aGUgcG9ydCdzIHNlYXJjaCAoYSAzMWstZ2VuZSBkYXRhc2V0IGRvZXMgbm90IHNoaXAgaXRzIG5hbWVzKTtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZpbHRlciB3aGF0ZXZlciB0aGUgbWFuaWZlc3QgaW5saW5lZC5cbiAgICAgICAgaWYgKHBvcnQuc2VhcmNoRmVhdHVyZXMpIHJldHVybiBwb3J0LnNlYXJjaEZlYXR1cmVzKHF1ZXJ5LCBsaW1pdCk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShwb3J0LmdldERhdGFzZXQkKCkpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IGRhdGFzZXQ/LmZlYXR1cmVzPy5uYW1lcyA/PyBbXTtcbiAgICAgICAgY29uc3QgcSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBuYW1lcy5maWx0ZXIoKG4pID0+IG4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkuc2xpY2UoMCwgbGltaXQpO1xuICAgICAgfSxcbiAgICAgIC4uLihwb3J0LmltcG9ydEdyb3Vwc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIGltcG9ydEdyb3VwczogKGxhYmVsOiBzdHJpbmcsIHRhYmxlOiBzdHJpbmcpID0+IHBvcnQuaW1wb3J0R3JvdXBzIShsYWJlbCwgdGFibGUpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4ocG9ydC5nZXRUcmFuc2NyaXB0Q291bnRzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdHJhbnNjcmlwdENvdW50czogKGdlbmVzOiBzdHJpbmdbXSkgPT4gcG9ydC5nZXRUcmFuc2NyaXB0Q291bnRzIShnZW5lcyksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihwb3J0LmdldE1hcmtlckdlbmVzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbWFya2VyR2VuZXM6IChjb2x1bW46IHN0cmluZywgcGVyR3JvdXA/OiBudW1iZXIpID0+IHBvcnQuZ2V0TWFya2VyR2VuZXMhKGNvbHVtbiwgcGVyR3JvdXApLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBnZXRUcmFuc2NyaXB0RXN0aW1hdGUkOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkudHJhbnNjcmlwdEVzdGltYXRlJC5hc09ic2VydmFibGUoKSxcbiAgICAgIGdldEdlbmVDb3VudHNJblZpZXckOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkuZ2VuZUNvdW50c0luVmlldyQuYXNPYnNlcnZhYmxlKCksXG4gICAgICBnZXREZW5zaXR5U3RhdHMkOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkuZGVuc2l0eVN0YXRzJC5hc09ic2VydmFibGUoKSxcbiAgICAgIGNhdGVnb3J5Q29sb3JzOiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKG5hbWUpO1xuICAgICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7bmFtZX1cIiBpcyBjb250aW51b3VzIOKAlCBpdCBoYXMgbm8gY2F0ZWdvcmllc2ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc29sdmVkIGJ5IHRoZSBTQU1FIGZ1bmN0aW9uIHRoZSByZW5kZXJlciB1c2VzLCBzbyBhIGxlZ2VuZCBzd2F0Y2hcbiAgICAgICAgLy8gY2FuIG5ldmVyIGRpc2FncmVlIHdpdGggdGhlIGNvbG91ciBvbiBzY3JlZW4uXG4gICAgICAgIHJldHVybiByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29sdW1uLm1ldGEpO1xuICAgICAgfSxcblxuICAgICAgY29udGludW91c1ZhbHVlczogYXN5bmMgKHNvdXJjZSkgPT4ge1xuICAgICAgICBpZiAoc291cmNlLmtpbmQgPT09ICdmZWF0dXJlJykgcmV0dXJuIHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihzb3VyY2UubmFtZSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKHNvdXJjZS5uYW1lKTtcbiAgICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7c291cmNlLm5hbWV9XCIgaXMgY2F0ZWdvcmljYWwg4oCUIGl0IGhhcyBubyB2YWx1ZXMgdG8gY2hhcnRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sdW1uLnZhbHVlcztcbiAgICAgIH0sXG5cbiAgICAgIGNhdGVnb3JpY2FsVmlldzogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihuYW1lKTtcbiAgICAgICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSBjb2x1bW4gXCIke25hbWV9XCIgaXMgY29udGludW91cyDigJQgaXQgaGFzIG5vIGNhdGVnb3JpZXNgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgY2F0ZWdvcmllczogY29sdW1uLm1ldGEuY2F0ZWdvcmllcyxcbiAgICAgICAgICBjb2xvcnM6IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSksXG4gICAgICAgICAgY29kZXM6IGNvbHVtbi5jb2RlcyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFNwcmVhZCByYXRoZXIgdGhhbiBhbHdheXMgZGVmaW5lZDogYGdldEVtYmVkZGluZ2AgaXMgb3B0aW9uYWwgb24gYm90aCB0aGUgcG9ydFxuICAgICAgLy8gYW5kIHRoaXMgZmFjYWRlLCBhbmQgYSBwYW5lbCBjaGVja3MgZm9yIGl0cyBwcmVzZW5jZSB0byBkZWNpZGUgd2hldGhlciB0aGUgdmlld1xuICAgICAgLy8gaXMgb2ZmZXJlZCBhdCBhbGwuIERlZmluaW5nIGl0IGFzIGEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHdvdWxkIG1ha2UgYW5cbiAgICAgIC8vIGVtYmVkZGluZy1sZXNzIHNvdXJjZSBsb29rIGxpa2UgYSBicm9rZW4gb25lLlxuICAgICAgLi4uKHBvcnQuZ2V0RW1iZWRkaW5nID8geyBnZXRFbWJlZGRpbmc6IChuYW1lOiBzdHJpbmcpID0+IHBvcnQuZ2V0RW1iZWRkaW5nIShuYW1lKSB9IDoge30pLFxuXG4gICAgICBjYXRlZ29yaWNhbENvbHVtbnM6ICgpID0+XG4gICAgICAgICh0aGlzLmRhdGFzZXQ/LmNvbHVtbnMgPz8gW10pLmZpbHRlcigoYykgPT4gYy5raW5kID09PSAnY2F0ZWdvcmljYWwnKS5tYXAoKGMpID0+IGMubmFtZSksXG5cbiAgICAgIC8vIE1lbW9pemVkIG9uIHRoZSBvYnNlcnZhdGlvbnMgb2JqZWN0LCBzbyB0aGUgcmVuZGVyZXIncyBvd24gbG9va3VwIGFuZFxuICAgICAgLy8gdGhpcyBvbmUgYXJlIHRoZSBzYW1lIHNpbmdsZSBzY2FuIG9mIHVwIHRvIDMuN00geiB2YWx1ZXMuXG4gICAgICBzYW1wbGVkU2VjdGlvbnM6ICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2JzID0gdGhpcy5kYXRhc2V0Py5vYnNlcnZhdGlvbnM7XG4gICAgICAgIHJldHVybiBvYnMgPyBzZWN0aW9uc09mKG9icykgOiBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0aW9uJDogKCkgPT4gdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuZ2V0U2VsZWN0aW9uJCgpLFxuXG4gICAgICBzZWxlY3RGcm9tUmVnaW9uczogKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5kYXRhc2V0O1xuICAgICAgICBpZiAoIWRhdGFzZXQpIHJldHVybiAwO1xuICAgICAgICBjb25zdCByZWdpb25zID0gdGhpcy5jdHgucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICAgICAgICAvLyBUaGUgdW5pb24gb2YgZXZlcnkgZHJhd24gcmVnaW9uIOKAlCBzbyBldmVyeSBST0kgdG9vbCB0aGUgbGlicmFyeVxuICAgICAgICAvLyBhbHJlYWR5IGhhcyBkb3VibGVzIGFzIGEgc3BhdGlhbCBzZWxlY3Rpb24gdG9vbC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSW4gdGhlIDNEIGNsb3VkIHRoZXJlIGlzIG5vIGRhdGEtc3BhY2UgYWZmaW5lIHRvIHB1c2ggYSBkcmF3biBzaGFwZVxuICAgICAgICAvLyB0aHJvdWdoLCBzbyB0aGUgb2JzZXJ2YXRpb25zIGFyZSBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyBieSB0aGVcbiAgICAgICAgLy8gcmVuZGVyZXIgKHdoaWNoIG93bnMgdGhlIGNhbWVyYSkgYW5kIHRlc3RlZCBpbiBzY3JlZW4gc3BhY2UgaW5zdGVhZC5cbiAgICAgICAgLy8gRmFsbHMgYmFjayB0byB0aGUgMkQgcGF0aCB3aGVuZXZlciB0aGUgY2xvdWQgaXMgbm90IG1vdW50ZWQuXG4gICAgICAgIGNvbnN0IHByb2plY3RlZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdHgucGxvdFR5cGUoKSlcbiAgICAgICAgICA/IHRoaXMuY3R4Lm5hcGFyaS5nZXRTcGF0aWFsU2NyZWVuUHJvamVjdGlvbihkYXRhc2V0Lm9ic2VydmF0aW9ucylcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIC8vIEluIHRoZSAyRCB2aWV3IG9mIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBzaGFwZSB3YXMgZHJhd24gb3ZlciBPTkVcbiAgICAgICAgLy8gc2VjdGlvbiwgaW4gdGhlIHZvbHVtZSdzIHBpeGVsIGdyaWQ6IGl0IHNlbGVjdHMgdGhlIGNlbGxzIG9mIHRoYXRcbiAgICAgICAgLy8gc2VjdGlvbiwgbm90IHRoZSB3aG9sZSBkZXB0aCBvZiBicmFpbiBzdGFuZGluZyBiZWhpbmQgdGhlbS5cbiAgICAgICAgY29uc3Qgdm9sdW1lID0gIWRhdGFzZXQuaW1hZ2VSZWYgPyBkYXRhc2V0LnZvbHVtZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gcHJvamVjdGVkXG4gICAgICAgICAgPyBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQocHJvamVjdGVkLCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCwgcmVnaW9ucylcbiAgICAgICAgICA6IHNlbGVjdEluUmVnaW9ucyhcbiAgICAgICAgICAgICAgZGF0YXNldC5vYnNlcnZhdGlvbnMsXG4gICAgICAgICAgICAgIHZvbHVtZSA/IHZvbHVtZUltYWdlUmVmKHZvbHVtZSwgZGF0YXNldC5taWNyb25zUGVyVW5pdCkgOiBkYXRhc2V0LmltYWdlUmVmLFxuICAgICAgICAgICAgICByZWdpb25zLFxuICAgICAgICAgICAgICB2b2x1bWUgPyBvYnNlcnZhdGlvbnNJblNsaWNlKGRhdGFzZXQub2JzZXJ2YXRpb25zLCB2b2x1bWUsIHRoaXMuY3R4LnpJbmRleCgpKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLnNldChzZWxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmNvdW50O1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0Q2F0ZWdvcnk6IGFzeW5jIChjb2x1bW46IHN0cmluZywgY2F0ZWdvcnlJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgICAgIGlmICghaXNDYXRlZ29yaWNhbENvbHVtbihsb2FkZWQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gY29sdW1uIFwiJHtjb2x1bW59XCIgaXMgY29udGludW91cyDigJQgaXQgaGFzIG5vIGNhdGVnb3JpZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBzZWxlY3RCeUNhdGVnb3J5KGxvYWRlZC5jb2RlcywgY2F0ZWdvcnlJbmRleCk7XG4gICAgICAgIHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLnNldChzZWxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmNvdW50O1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0SW5kaWNlczogKGluZGljZXM6IEl0ZXJhYmxlPG51bWJlcj4pID0+IHtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmRhdGFzZXQ/Lm9ic2VydmF0aW9ucy5jb3VudCA/PyAwO1xuICAgICAgICBpZiAoY291bnQgPT09IDApIHJldHVybiAwO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBzZWxlY3RCeUluZGljZXMoaW5kaWNlcywgY291bnQpO1xuICAgICAgICB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5zZXQoc2VsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5jb3VudDtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyU2VsZWN0aW9uOiAoKSA9PiB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5jbGVhcigpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBkYXRhc2V0YCBjYW4gYW5zd2VyIHRoaXMgY29sb3VyIHNvdXJjZS4gQSBjb2x1bW4gaXMgY2hlY2thYmxlIGFnYWluc3QgdGhlXG4gKiBkZWNsYXJlZCBsaXN0LiBBIGdlbmUgaXMgY2hlY2thYmxlIG9ubHkgd2hlbiB0aGUgZGF0YXNldCBpbmxpbmVzIGl0cyBmZWF0dXJlIG5hbWVzIOKAlFxuICogYSBkYXRhc2V0IHRvbyB3aWRlIHRvIGlubGluZSB0aGVtICh0eXBlYWhlYWQtb25seSkga2VlcHMgdGhlIHNvdXJjZSwgYW5kIGEgbmFtZSB0aGF0XG4gKiB0dXJucyBvdXQgbm90IHRvIGV4aXN0IHN1cmZhY2VzIGFzIHRoZSBjaGFydCdzIFwiY291bGQgbm90IGJlIGNoYXJ0ZWRcIiByYXRoZXIgdGhhbiBhc1xuICogYSBzaWxlbnQgcmVzZXQuXG4gKi9cbmZ1bmN0aW9uIGNhbkNvbG9yQnkoZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLCBieTogU3BhdGlhbENvbG9yQnkpOiBib29sZWFuIHtcbiAgaWYgKCFkYXRhc2V0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChieS5raW5kID09PSAnY29sdW1uJykgcmV0dXJuIGRhdGFzZXQuY29sdW1ucy5zb21lKChjKSA9PiBjLm5hbWUgPT09IGJ5Lm5hbWUpO1xuICBjb25zdCBuYW1lcyA9IGRhdGFzZXQuZmVhdHVyZXM/Lm5hbWVzO1xuICByZXR1cm4gISFkYXRhc2V0LmZlYXR1cmVzICYmICghbmFtZXMgfHwgbmFtZXMuaW5jbHVkZXMoYnkubmFtZSkpO1xufVxuIl19
|
|
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
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { fillOutlines } from '../geometry/reconstruct';
|
|
1
2
|
import { pointInRing as ringContainsPoint, ringBounds } from '../geometry/ring';
|
|
2
3
|
/** An empty selection over `count` observations. */
|
|
3
4
|
export function emptySelection(count = 0) {
|
|
@@ -215,6 +216,74 @@ export function selectInRegionsProjected(screen, count, regions) {
|
|
|
215
216
|
}
|
|
216
217
|
return { mask, count: hits };
|
|
217
218
|
}
|
|
219
|
+
/**
|
|
220
|
+
* Observations inside the VOLUME a stack of outlines encloses: a region class (an
|
|
221
|
+
* atlas structure with its substructures) through every section of the dataset's
|
|
222
|
+
* reference volume, as its 3D reconstruction shows it.
|
|
223
|
+
*
|
|
224
|
+
* The outlines are in the volume's own grid — x, y in voxels, z the slice — which
|
|
225
|
+
* is where regions imported onto the volume's stack sit. An observation is in voxel
|
|
226
|
+
* `(⌊x / vx⌋, ⌊y / vy⌋, ⌊z / vz⌋)` (see `volumeImageRef`), and selected when its
|
|
227
|
+
* slice's outlines cover that voxel, filled as the reconstruction fills them. One
|
|
228
|
+
* slice is rasterised at a time, so a structure through the whole brain costs one
|
|
229
|
+
* slice's mask, not the volume's. An observation outside the volume, or without a
|
|
230
|
+
* z, is never selected.
|
|
231
|
+
*/
|
|
232
|
+
export function selectInClassVolumes(observations, volume, slices) {
|
|
233
|
+
const n = observations.count;
|
|
234
|
+
const mask = new Uint8Array(n);
|
|
235
|
+
const z = observations.z;
|
|
236
|
+
const { width, height, depth } = volume;
|
|
237
|
+
const [vx, vy, vz] = volume.voxelSize;
|
|
238
|
+
const bySlice = new Map();
|
|
239
|
+
for (const s of slices) {
|
|
240
|
+
if (!s.rings.length || s.z < 0 || s.z >= depth)
|
|
241
|
+
continue;
|
|
242
|
+
const list = bySlice.get(s.z);
|
|
243
|
+
if (list)
|
|
244
|
+
list.push(s);
|
|
245
|
+
else
|
|
246
|
+
bySlice.set(s.z, [s]);
|
|
247
|
+
}
|
|
248
|
+
if (!z || !bySlice.size)
|
|
249
|
+
return { mask, count: 0 };
|
|
250
|
+
// The observations of each outlined slice (a counting sort by slice).
|
|
251
|
+
const sliceOf = new Int32Array(n).fill(-1);
|
|
252
|
+
const counts = new Uint32Array(depth + 1);
|
|
253
|
+
for (let i = 0; i < n; i++) {
|
|
254
|
+
const k = Math.floor(z[i] / vz);
|
|
255
|
+
if (!bySlice.has(k))
|
|
256
|
+
continue;
|
|
257
|
+
sliceOf[i] = k;
|
|
258
|
+
counts[k + 1]++;
|
|
259
|
+
}
|
|
260
|
+
for (let k = 0; k < depth; k++)
|
|
261
|
+
counts[k + 1] += counts[k];
|
|
262
|
+
const order = new Uint32Array(counts[depth]);
|
|
263
|
+
const at = counts.slice(0, depth);
|
|
264
|
+
for (let i = 0; i < n; i++)
|
|
265
|
+
if (sliceOf[i] >= 0)
|
|
266
|
+
order[at[sliceOf[i]]++] = i;
|
|
267
|
+
const plane = new Uint8Array(width * height);
|
|
268
|
+
let count = 0;
|
|
269
|
+
for (const [k, outlines] of bySlice) {
|
|
270
|
+
plane.fill(0);
|
|
271
|
+
for (const s of outlines)
|
|
272
|
+
fillOutlines(plane, width, height, s);
|
|
273
|
+
for (let o = counts[k]; o < counts[k + 1]; o++) {
|
|
274
|
+
const i = order[o];
|
|
275
|
+
const px = Math.floor(observations.x[i] / vx);
|
|
276
|
+
const py = Math.floor(observations.y[i] / vy);
|
|
277
|
+
if (px < 0 || py < 0 || px >= width || py >= height)
|
|
278
|
+
continue;
|
|
279
|
+
if (plane[py * width + px]) {
|
|
280
|
+
mask[i] = 1;
|
|
281
|
+
count++;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return { mask, count };
|
|
286
|
+
}
|
|
218
287
|
/**
|
|
219
288
|
* Whether two selections hold exactly the same observations.
|
|
220
289
|
*
|
|
@@ -248,4 +317,4 @@ export function selectByCategory(codes, code) {
|
|
|
248
317
|
}
|
|
249
318
|
return { mask, count };
|
|
250
319
|
}
|
|
251
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF3QixXQUFXLElBQUksaUJBQWlCLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUEwQnRHLG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQUssR0FBRyxDQUFDO0lBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ25ELENBQUM7QUFFRCx1Q0FBdUM7QUFDdkMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFnQjtJQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN2RCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFnQjtJQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsT0FBTyxHQUFHLENBQUM7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RUFBRSxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFJpbmdCb3VuZHMgYXMgQm91bmRzLCBwb2ludEluUmluZyBhcyByaW5nQ29udGFpbnNQb2ludCwgcmluZ0JvdW5kcyB9IGZyb20gJy4uL2dlb21ldHJ5L3JpbmcnO1xuaW1wb3J0IHsgU3BhdGlhbEltYWdlUmVmLCBTcGF0aWFsT2JzZXJ2YXRpb25zLCBTcGF0aWFsU2VsZWN0aW9uTWFzayB9IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFdoaWNoIG9ic2VydmF0aW9ucyBmYWxsIGluc2lkZSBhIHNldCBvZiBkcmF3biByZWdpb25zLlxuICpcbiAqIFB1cmUsIGxpa2UgYHNwYXRpYWwtZW5jb2RpbmcudHNgIOKAlCBubyBzdG9yZSwgbm8gcmVuZGVyZXIg4oCUIHNvIHRoZSBnZW9tZXRyeSBpc1xuICogdGVzdGFibGUgb24gaXRzIG93bi5cbiAqXG4gKiBXSFkgVEhJUyBJUyBUSEUgV0hPTEUgU0VMRUNUSU9OIE1FQ0hBTklTTVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYWxyZWFkeSBjb21lIGZyb20gZXZlcnkgb24tY2FudmFzIHRvb2wgdGhlIGxpYnJhcnkgaGFzOiByZWN0YW5nbGUsXG4gKiBwb2x5Z29uLCBmcmVlaGFuZCwgbWFnaWMgd2FuZCwgYnJ1c2guIFRlc3Rpbmcgb2JzZXJ2YXRpb25zIGFnYWluc3QgdGhlbSB0dXJuc1xuICogYWxsIG9mIHRob3NlIGludG8gc3BhdGlhbC1vbWljcyBzZWxlY3Rpb24gdG9vbHMgd2l0aG91dCBhZGRpbmcgYSBzaW5nbGUgbmV3XG4gKiBjYW52YXMgaW50ZXJhY3Rpb24g4oCUIHdoaWNoIGlzIHdoeSB0aGVyZSBpcyBubyBiZXNwb2tlIG1hcnF1ZWUgaGVyZS5cbiAqXG4gKiBDT09SRElOQVRFIEZSQU1FU1xuICogLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYXJlIGRyYXduIGluIFdPUkxEIChpbWFnZSkgY29vcmRpbmF0ZXMuIE9ic2VydmF0aW9ucyBsaXZlIGluIHRoZVxuICogZGF0YXNldCdzIG93biBmcmFtZSBhbmQgcmVhY2ggdGhlIHdvcmxkIHRocm91Z2ggYGltYWdlUmVmYCDigJQgc28gdGhleSBhcmVcbiAqIHRyYW5zZm9ybWVkIGZvcndhcmQgYmVmb3JlIHRlc3RpbmcsIG1hdGNoaW5nIGV4YWN0bHkgd2hhdCB0aGUgcmVuZGVyZXIgZHJhd3MuXG4gKi9cblxuLyoqIE1vdmVkIHRvIHRoZSBkYXRhc2V0IGNvbnRyYWN0IChhIHB1cmUgZGF0YSB0eXBlKTsgcmUtZXhwb3J0ZWQgaGVyZSBmb3IgZXhpc3RpbmcgaW1wb3J0ZXJzLiAqL1xuZXhwb3J0IHR5cGUgeyBTcGF0aWFsU2VsZWN0aW9uTWFzayB9O1xuXG4vKiogQW4gZW1wdHkgc2VsZWN0aW9uIG92ZXIgYGNvdW50YCBvYnNlcnZhdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlTZWxlY3Rpb24oY291bnQgPSAwKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICByZXR1cm4geyBtYXNrOiBuZXcgVWludDhBcnJheShjb3VudCksIGNvdW50OiAwIH07XG59XG5cbi8qKiBOdW1iZXIgb2Ygc2V0IGVudHJpZXMgaW4gYSBtYXNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50TWFzayhtYXNrOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hc2subGVuZ3RoOyBpKyspIGlmIChtYXNrW2ldKSBuKys7XG4gIHJldHVybiBuO1xufVxuXG4vKiogU2VsZWN0ZWQgaW5kaWNlcywgZm9yIGV4cG9ydCBvciBhIGRvd25zdHJlYW0gcXVlcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1RvSW5kaWNlcyhtYXNrOiBVaW50OEFycmF5KTogVWludDMyQXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkoY291bnRNYXNrKG1hc2spKTtcbiAgbGV0IGF0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgb3V0W2F0KytdID0gaTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZW5kZXJlci1mYWNpbmcgaW52ZXJzZTogd2hpY2ggb2JzZXJ2YXRpb25zIHRvIE1VVEUuIFdpdGggbm90aGluZyBzZWxlY3RlZFxuICogbm90aGluZyBpcyBtdXRlZCAodGhlIHdob2xlIHRpc3N1ZSByZWFkcyBub3JtYWxseSk7IHdpdGggYSBzZWxlY3Rpb24sIGV2ZXJ5XG4gKiB1bnNlbGVjdGVkIG9ic2VydmF0aW9uIGlzIG11dGVkIOKAlCB0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbXV0ZWQgPSBuZXcgVWludDhBcnJheShzZWxlY3Rpb24ubWFzay5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGVkLmxlbmd0aDsgaSsrKSBtdXRlZFtpXSA9IHNlbGVjdGlvbi5tYXNrW2ldID8gMCA6IDE7XG4gIHJldHVybiBtdXRlZDtcbn1cblxuLyoqXG4gKiBFdmVuLW9kZCByYXkgY2FzdDogaXMgKHB4LCBweSkgaW5zaWRlIHRoZSBjbG9zZWQgcmluZyB4cy95cz9cbiAqXG4gKiBQdWJsaWMgQVBJIGtlcHQgd2l0aCBpdHMgKHJpbmcsIHBvaW50KSBhcmd1bWVudCBvcmRlcjsgdGhlIHRlc3QgaXRzZWxmIGlzXG4gKiB0aGUgc2hhcmVkIGBnZW9tZXRyeS9yaW5nYCBvbmUgdGhlIHJlZ2lvbiBvdmVybGF5cyBhbmQgdG9vbHMgdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRJblJpbmcoeHM6IHJlYWRvbmx5IG51bWJlcltdLCB5czogcmVhZG9ubHkgbnVtYmVyW10sIHB4OiBudW1iZXIsIHB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJpbmdDb250YWluc1BvaW50KHB4LCBweSwgeHMsIHlzKTtcbn1cblxuZnVuY3Rpb24gaW5Cb3VuZHMoYjogQm91bmRzLCBweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBweCA+PSBiLm1pblggJiYgcHggPD0gYi5tYXhYICYmIHB5ID49IGIubWluWSAmJiBweSA8PSBiLm1heFk7XG59XG5cbi8qKiBBIHJlZ2lvbiBmbGF0dGVuZWQgdG8gc29tZXRoaW5nIHRlc3RhYmxlOiBib3VuZHMgKyBhIGhpdCB0ZXN0LiAqL1xuaW50ZXJmYWNlIFNoYXBlIHtcbiAgYm91bmRzOiBCb3VuZHM7XG4gIGhpdChweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbjtcbn1cblxuLyoqIFBvbHlnb24td2l0aC1ob2xlczogaW5zaWRlIHRoZSBleHRlcmlvciBhbmQgb3V0c2lkZSBldmVyeSBob2xlLiAqL1xuZnVuY3Rpb24gcG9seWdvblNoYXBlKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLCBob2xlcz86IG51bWJlcltdW11bXSk6IFNoYXBlIHwgbnVsbCB7XG4gIGlmICh4cy5sZW5ndGggPCAzKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYm91bmRzID0gcmluZ0JvdW5kcyh4cywgeXMpO1xuICAvLyBTcGxpdCBhbmQgYm91bmRlZCBPTkNFIHBlciBzaGFwZTogdGhlIGhpdCB0ZXN0IHJ1bnMgZm9yIGV2ZXJ5IGNhbmRpZGF0ZSBwb2ludFxuICAvLyBpbnNpZGUgdGhlIGV4dGVyaW9yIOKAlCB1cCB0byBtaWxsaW9ucyBvZiBjZWxscyBwZXIgc2VsZWN0aW9uLlxuICBjb25zdCBob2xlUmluZ3MgPSAoaG9sZXMgPz8gW10pXG4gICAgLmZpbHRlcigocmluZykgPT4gcmluZy5sZW5ndGggPj0gMylcbiAgICAubWFwKChyaW5nKSA9PiB7XG4gICAgICBjb25zdCBoeCA9IHJpbmcubWFwKChwKSA9PiBwWzBdKTtcbiAgICAgIGNvbnN0IGh5ID0gcmluZy5tYXAoKHApID0+IHBbMV0pO1xuICAgICAgcmV0dXJuIHsgeHM6IGh4LCB5czogaHksIGJvdW5kczogcmluZ0JvdW5kcyhoeCwgaHkpIH07XG4gICAgfSk7XG4gIHJldHVybiB7XG4gICAgYm91bmRzLFxuICAgIGhpdDogKHB4LCBweSkgPT4ge1xuICAgICAgaWYgKCFwb2ludEluUmluZyh4cywgeXMsIHB4LCBweSkpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFRoZSByZWdpb24gbW9kZWwgaXMgZXhwbGljaXQ6IGEgcG9pbnQgaW5zaWRlIHRoZSBleHRlcmlvciBBTkQgaW5zaWRlIGFcbiAgICAgIC8vIGhvbGUgaXMgT1VUU0lERSB0aGUgcmVnaW9uLlxuICAgICAgZm9yIChjb25zdCBob2xlIG9mIGhvbGVSaW5ncykge1xuICAgICAgICBpZiAoaW5Cb3VuZHMoaG9sZS5ib3VuZHMsIHB4LCBweSkgJiYgcG9pbnRJblJpbmcoaG9sZS54cywgaG9sZS55cywgcHgsIHB5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGEgcmVnaW9uIHRvIHRlc3RhYmxlIHNoYXBlcy4gUmV0dXJucyBhbiBlbXB0eSBhcnJheSBmb3IgYW55dGhpbmcgdGhhdFxuICogZW5jbG9zZXMgbm8gYXJlYSDigJQgYW4gb3BlbiBwb2x5bGluZSwgYW4gaW50ZW5zaXR5LXByb2ZpbGUgbGluZSwgYSBkZWdlbmVyYXRlXG4gKiByZWN0YW5nbGUg4oCUIHNvIHRob3NlIG5ldmVyIGNvbnRyaWJ1dGUgdG8gYSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb25TaGFwZXMocmVnaW9uOiBSZWdpb24pOiBTaGFwZVtdIHtcbiAgLy8gUHJvZmlsZSBsaW5lcyBiZWxvbmcgdG8gdGhlIGludGVuc2l0eSB0b29sLCBub3QgdGhlIGFubm90YXRpb24gc2V0LlxuICBpZiAoKHJlZ2lvbiBhcyB1bmtub3duIGFzIHsga2luZD86IHN0cmluZyB9KT8ua2luZCA9PT0gJ3Byb2ZpbGUnKSByZXR1cm4gW107XG4gIGNvbnN0IGIgPSByZWdpb24/LmJvdW5kcyBhcyB1bmtub3duIGFzXG4gICAgfCB7XG4gICAgICAgIHg/OiBudW1iZXI7XG4gICAgICAgIHk/OiBudW1iZXI7XG4gICAgICAgIHdpZHRoPzogbnVtYmVyO1xuICAgICAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgICAgIHhwb2ludHM/OiBudW1iZXJbXTtcbiAgICAgICAgeXBvaW50cz86IG51bWJlcltdO1xuICAgICAgICBjbG9zZWQ/OiBib29sZWFuO1xuICAgICAgICBob2xlcz86IG51bWJlcltdW11bXTtcbiAgICAgICAgcG9seWdvbnM/OiB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXTsgY2xvc2VkPzogYm9vbGVhbjsgaG9sZXM/OiBudW1iZXJbXVtdW10gfVtdO1xuICAgICAgfVxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkO1xuICBpZiAoIWIpIHJldHVybiBbXTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShiLnBvbHlnb25zKSkge1xuICAgIHJldHVybiBiLnBvbHlnb25zLmZsYXRNYXAoKHApID0+XG4gICAgICBwLmNsb3NlZCA9PT0gZmFsc2UgPyBbXSA6IChwb2x5Z29uU2hhcGUocC54cG9pbnRzID8/IFtdLCBwLnlwb2ludHMgPz8gW10sIHAuaG9sZXMpID8/IFtdKSxcbiAgICApO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGIueHBvaW50cykpIHtcbiAgICBpZiAoYi5jbG9zZWQgPT09IGZhbHNlKSByZXR1cm4gW107IC8vIG9wZW4gcG9seWxpbmUgZW5jbG9zZXMgbm90aGluZ1xuICAgIGNvbnN0IHNoYXBlID0gcG9seWdvblNoYXBlKGIueHBvaW50cywgYi55cG9pbnRzID8/IFtdLCBiLmhvbGVzKTtcbiAgICByZXR1cm4gc2hhcGUgPyBbc2hhcGVdIDogW107XG4gIH1cbiAgaWYgKHR5cGVvZiBiLndpZHRoID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYi5oZWlnaHQgPT09ICdudW1iZXInKSB7XG4gICAgY29uc3QgeCA9IGIueCA/PyAwO1xuICAgIGNvbnN0IHkgPSBiLnkgPz8gMDtcbiAgICAvLyBOb3JtYWxpc2UgYSByZWN0YW5nbGUgZHJhZ2dlZCByaWdodC10by1sZWZ0IC8gYm90dG9tLXRvLXRvcC5cbiAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeCwgeCArIGIud2lkdGgpO1xuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4LCB4ICsgYi53aWR0aCk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHksIHkgKyBiLmhlaWdodCk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHksIHkgKyBiLmhlaWdodCk7XG4gICAgaWYgKG1heFggPT09IG1pblggfHwgbWF4WSA9PT0gbWluWSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGJvdW5kcyA9IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9O1xuICAgIHJldHVybiBbeyBib3VuZHMsIGhpdDogKHB4LCBweSkgPT4gaW5Cb3VuZHMoYm91bmRzLCBweCwgcHkpIH1dO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLyoqXG4gKiBBIHNlbGVjdGlvbiBmcm9tIGFuIGV4cGxpY2l0IGxpc3Qgb2Ygb2JzZXJ2YXRpb24gaW5kaWNlcy5cbiAqXG4gKiBXaGF0IGEgbGFzc28gaW4gYSBsaW5rZWQgcGxvdCBwcm9kdWNlczogdGhlIHBsb3Qga25vd3Mgd2hpY2ggcG9pbnRzIHRoZSB1c2VyIGRyZXdcbiAqIGFyb3VuZCwgYW5kIHRoZSBtYXAgbmVlZHMgdGhhdCBhcyBhIG1hc2sgb3ZlciBBTEwgb2JzZXJ2YXRpb25zLiBPdXQtb2YtcmFuZ2UgYW5kXG4gKiBkdXBsaWNhdGUgaW5kaWNlcyBhcmUgaWdub3JlZCByYXRoZXIgdGhhbiByZWplY3RlZCDigJQgYSBwbG90IG1heSBoYW5kIGJhY2sgdGhlIHNhbWVcbiAqIHBvaW50IHR3aWNlLCBhbmQgYSBzdGFsZSBpbmRleCBmcm9tIGEgcGxvdCBkcmF3biBiZWZvcmUgYSBkYXRhc2V0IGNoYW5nZSBtdXN0IG5vdFxuICogdGhyb3cgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbGVjdGlvbiBnZXN0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0QnlJbmRpY2VzKGluZGljZXM6IEl0ZXJhYmxlPG51bWJlcj4sIG9ic2VydmF0aW9uQ291bnQ6IG51bWJlcik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG9ic2VydmF0aW9uQ291bnQpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpKSB8fCBpIDwgMCB8fCBpID49IG9ic2VydmF0aW9uQ291bnQpIGNvbnRpbnVlO1xuICAgIGlmIChtYXNrW2ldKSBjb250aW51ZTtcbiAgICBtYXNrW2ldID0gMTtcbiAgICBjb3VudCsrO1xuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG5cbi8qKlxuICogT2JzZXJ2YXRpb25zIGluc2lkZSBBTlkgb2YgYHJlZ2lvbnNgICh1bmlvbikuIENvb3JkaW5hdGVzIGFyZSB0cmFuc2Zvcm1lZCBieVxuICogYGltYWdlUmVmYCBmaXJzdCwgc28gdGhlIHRlc3QgaGFwcGVucyBpbiB0aGUgc2FtZSB3b3JsZCBzcGFjZSB0aGUgcmVnaW9ucyB3ZXJlXG4gKiBkcmF3biBpbi5cbiAqXG4gKiBgY2FuZGlkYXRlc2AsIHdoZW4gZ2l2ZW4sIHJlc3RyaWN0cyB0aGUgdGVzdCB0byB0aG9zZSBvYnNlcnZhdGlvbiBpbmRpY2VzIOKAlCBob3dcbiAqIGEgMkQgdmlldyBvZiBhIDNEIGRhdGFzZXQga2VlcHMgYSBkcmF3biByZWdpb24gbWVhbmluZyB3aGF0IGl0IGxvb2tzIGxpa2UgaXRcbiAqIG1lYW5zOiB0aGUgc2hhcGUgd2FzIGRyYXduIG92ZXIgT05FIHNlY3Rpb24sIHNvIGl0IHNlbGVjdHMgdGhhdCBzZWN0aW9uJ3MgY2VsbHNcbiAqIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBkZXB0aCBvZiB0aGUgc3BlY2ltZW4gYmVoaW5kIHRoZW0uIFRoZSByZXR1cm5lZCBtYXNrIHN0YXlzXG4gKiBpbmRleGVkIGJ5IG9ic2VydmF0aW9uLCBzbyBldmVyeSBjb25zdW1lciAoY2hhcnRzLCBsZWdlbmQsIHRoZSAzRCBjbG91ZCkgcmVhZHMgaXRcbiAqIHRoZSBzYW1lIHdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluUmVnaW9ucyhcbiAgb2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBpbWFnZVJlZjogU3BhdGlhbEltYWdlUmVmIHwgdW5kZWZpbmVkLFxuICByZWdpb25zOiByZWFkb25seSBSZWdpb25bXSxcbiAgY2FuZGlkYXRlcz86IFVpbnQzMkFycmF5LFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBuID0gb2JzZXJ2YXRpb25zLmNvdW50O1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGNvbnN0IHNoYXBlcyA9IHJlZ2lvbnMuZmxhdE1hcCgocikgPT4gcmVnaW9uU2hhcGVzKHIpKTtcbiAgaWYgKHNoYXBlcy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hc2ssIGNvdW50OiAwIH07XG5cbiAgY29uc3QgW3N4LCBzeV0gPSBpbWFnZVJlZj8uc2NhbGUgPz8gWzEsIDFdO1xuICBjb25zdCBbdHgsIHR5XSA9IGltYWdlUmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdO1xuICBsZXQgY291bnQgPSAwO1xuICBjb25zdCB0b3RhbCA9IGNhbmRpZGF0ZXMgPyBjYW5kaWRhdGVzLmxlbmd0aCA6IG47XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgdG90YWw7IGsrKykge1xuICAgIGNvbnN0IGkgPSBjYW5kaWRhdGVzID8gY2FuZGlkYXRlc1trXSA6IGs7XG4gICAgY29uc3QgcHggPSBvYnNlcnZhdGlvbnMueFtpXSAqIHN4ICsgdHg7XG4gICAgY29uc3QgcHkgPSBvYnNlcnZhdGlvbnMueVtpXSAqIHN5ICsgdHk7XG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiBzaGFwZXMpIHtcbiAgICAgIC8vIEJvdW5kcyBmaXJzdDogYSByYXkgY2FzdCBwZXIgb2JzZXJ2YXRpb24gcGVyIHJlZ2lvbiB3b3VsZCBkb21pbmF0ZSBhdFxuICAgICAgLy8gMTBeNSBvYnNlcnZhdGlvbnMsIGFuZCBtb3N0IHBvaW50cyBtaXNzIG1vc3QgcmVnaW9ucy5cbiAgICAgIGlmICghaW5Cb3VuZHMoc2hhcGUuYm91bmRzLCBweCwgcHkpKSBjb250aW51ZTtcbiAgICAgIGlmIChzaGFwZS5oaXQocHgsIHB5KSkge1xuICAgICAgICBtYXNrW2ldID0gMTtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG5cbi8qKlxuICogU2VsZWN0IG9ic2VydmF0aW9ucyB3aG9zZSBTQ1JFRU4gcHJvamVjdGlvbiBmYWxscyBpbnNpZGUgdGhlIGRyYXduIHJlZ2lvbnMuXG4gKlxuICogVGhpcyBpcyBob3cgYSByZWdpb24gc2VsZWN0aW9uIHdvcmtzIGluIHRoZSAzRCBjbG91ZC4gVGhlcmUgaXMgbm8gZGF0YS1zcGFjZVxuICogYWZmaW5lIHRvIG1hcCBhIGRyYXduIHNoYXBlIHRocm91Z2gsIGJlY2F1c2UgdGhlIHNoYXBlIHdhcyBkcmF3biBvbiBhIDJEIHNjcmVlblxuICogYWdhaW5zdCBhIHBlcnNwZWN0aXZlIGNhbWVyYSDigJQgc28gdGhlIG9ic2VydmF0aW9ucyBjb21lIHRoZSBvdGhlciB3YXksIGFscmVhZHlcbiAqIHByb2plY3RlZCB0byBjYW52YXMgcGl4ZWxzIGJ5IHRoZSByZW5kZXJlciAod2hpY2ggb3ducyB0aGUgY2FtZXJhKSwgYW5kIHRoZVxuICogcmVnaW9ucyBhcmUgdGVzdGVkIGluIHRoYXQgc2FtZSBzY3JlZW4gc3BhY2UuXG4gKlxuICogVGhlIGNvbnNlcXVlbmNlIGlzIHdvcnRoIGJlaW5nIGV4cGxpY2l0IGFib3V0OiBhIHNjcmVlbi1zcGFjZSBsYXNzbyBzZWxlY3RzXG4gKiB0aHJvdWdoIHRoZSBXSE9MRSBERVBUSCBvZiB0aGUgY2xvdWQsIGxpa2UgYSBjb29raWUgY3V0dGVyLCBub3QgYSBzbGFiIGF0IHNvbWVcbiAqIGNob3NlbiB6LiBUaGF0IGlzIGluaGVyZW50IHRvIGRyYXdpbmcgb24gYSBmbGF0IHNjcmVlbiwgYW5kIGl0IGlzIHdoYXQgbmFwYXJpXG4gKiBhbmQgZXZlcnkgb3RoZXIgb3JiaXQtY2FtZXJhIHBvaW50IHBpY2tlciBkby4gT3JiaXQgYW5kIGRyYXcgYWdhaW4gdG8gY3V0IGZyb21cbiAqIGFub3RoZXIgYW5nbGUuXG4gKlxuICogYHNjcmVlbmAgaXMgYFt4MCwgeTAsIHgxLCB5MSwg4oCmXWAgaW4gY2FudmFzIHBpeGVscywgYGNvdW50YCBlbnRyaWVzIGxvbmcuIEFuXG4gKiBvYnNlcnZhdGlvbiB0aGUgY2FtZXJhIHB1dHMgYmVoaW5kIHRoZSBleWUgaXMgZ2l2ZW4gTmFOIGJ5IHRoZSBwcm9qZWN0b3IgYW5kXG4gKiBuZXZlciBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluUmVnaW9uc1Byb2plY3RlZChcbiAgc2NyZWVuOiBGbG9hdDMyQXJyYXksXG4gIGNvdW50OiBudW1iZXIsXG4gIHJlZ2lvbnM6IHJlYWRvbmx5IFJlZ2lvbltdLFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkoY291bnQpO1xuICBjb25zdCBzaGFwZXMgPSByZWdpb25zLmZsYXRNYXAoKHIpID0+IHJlZ2lvblNoYXBlcyhyKSk7XG4gIGlmIChzaGFwZXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIGxldCBoaXRzID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY29uc3QgcHggPSBzY3JlZW5baSAqIDJdO1xuICAgIGNvbnN0IHB5ID0gc2NyZWVuW2kgKiAyICsgMV07XG4gICAgLy8gQmVoaW5kIHRoZSBjYW1lcmEsIG9yIG90aGVyd2lzZSB1bnByb2plY3RhYmxlLlxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHB4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHB5KSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiBzaGFwZXMpIHtcbiAgICAgIGlmICghaW5Cb3VuZHMoc2hhcGUuYm91bmRzLCBweCwgcHkpKSBjb250aW51ZTtcbiAgICAgIGlmIChzaGFwZS5oaXQocHgsIHB5KSkge1xuICAgICAgICBtYXNrW2ldID0gMTtcbiAgICAgICAgaGl0cysrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQ6IGhpdHMgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHR3byBzZWxlY3Rpb25zIGhvbGQgZXhhY3RseSB0aGUgc2FtZSBvYnNlcnZhdGlvbnMuXG4gKlxuICogTGV0cyBhIGNsaWNrIHRvZ2dsZSBhZ2FpbnN0IHRoZSBTRUxFQ1RJT04gcmF0aGVyIHRoYW4gYWdhaW5zdCBhIHJlbWVtYmVyZWRcbiAqIGNsaWNrOiBwaWNraW5nIGEgY2xhc3MgaW4gdGhlIGxlZ2VuZCBhbmQgdGhlbiBjbGlja2luZyB0aGF0IHNhbWUgY2xhc3Mgb24gdGhlXG4gKiBjYW52YXMgc2hvdWxkIGNsZWFyIGl0LCBhbmQgYSByZW1lbWJlcmVkIGNsaWNrIGNhbm5vdCBrbm93IGFib3V0IHRoZSBsZWdlbmQuXG4gKiBDb3VudHMgYXJlIGNvbXBhcmVkIGZpcnN0LCBzbyB0d28gZGlmZmVyZW50IHNlbGVjdGlvbnMgdXN1YWxseSBjb3N0IG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW1lU2VsZWN0aW9uKGE6IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBiOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IGJvb2xlYW4ge1xuICBpZiAoYS5jb3VudCAhPT0gYi5jb3VudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5tYXNrLmxlbmd0aCAhPT0gYi5tYXNrLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubWFzay5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vcm1hbGlzZWQgdG8gMC8xOiB0aGUgbWFza3MgYXJlIGZsYWdzLCBhbmQgYSB3cml0ZXIgaXMgZnJlZSB0byB1c2UgYW55XG4gICAgLy8gbm9uLXplcm8gdmFsdWUgZm9yIFwic2VsZWN0ZWRcIi5cbiAgICBpZiAoKGEubWFza1tpXSA/IDEgOiAwKSAhPT0gKGIubWFza1tpXSA/IDEgOiAwKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogRXZlcnkgb2JzZXJ2YXRpb24gd2hvc2UgY2F0ZWdvcmljYWwgY29kZSBlcXVhbHMgYGNvZGVgIOKAlCB0aGUgbGVnZW5kIGNsaWNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJ5Q2F0ZWdvcnkoY29kZXM6IFVpbnQxNkFycmF5LCBjb2RlOiBudW1iZXIpOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShjb2Rlcy5sZW5ndGgpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvZGVzW2ldID09PSBjb2RlKSB7XG4gICAgICBtYXNrW2ldID0gMTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG4iXX0=
|
|
320
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFpQixZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQXdCLFdBQVcsSUFBSSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQStCdEcsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBSyxHQUFHLENBQUM7SUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbkQsQ0FBQztBQUVELHVDQUF1QztBQUN2QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWdCO0lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3ZELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELDBEQUEwRDtBQUMxRCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWdCO0lBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLEdBQUcsQ0FBQyxFQUFFLEVB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TSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQzlCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTdFLE1BQU0sS0FB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QUFDLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBTbGljZU91dGxpbmVzLCBmaWxsT3V0bGluZXMgfSBmcm9tICcuLi9nZW9tZXRyeS9yZWNvbnN0cnVjdCc7XG5pbXBvcnQgeyBSaW5nQm91bmRzIGFzIEJvdW5kcywgcG9pbnRJblJpbmcgYXMgcmluZ0NvbnRhaW5zUG9pbnQsIHJpbmdCb3VuZHMgfSBmcm9tICcuLi9nZW9tZXRyeS9yaW5nJztcbmltcG9ydCB7XG4gIFNwYXRpYWxJbWFnZVJlZixcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIFNwYXRpYWxWb2x1bWVNZXRhLFxufSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcblxuLyoqXG4gKiBXaGljaCBvYnNlcnZhdGlvbnMgZmFsbCBpbnNpZGUgYSBzZXQgb2YgZHJhd24gcmVnaW9ucy5cbiAqXG4gKiBQdXJlLCBsaWtlIGBzcGF0aWFsLWVuY29kaW5nLnRzYCDigJQgbm8gc3RvcmUsIG5vIHJlbmRlcmVyIOKAlCBzbyB0aGUgZ2VvbWV0cnkgaXNcbiAqIHRlc3RhYmxlIG9uIGl0cyBvd24uXG4gKlxuICogV0hZIFRISVMgSVMgVEhFIFdIT0xFIFNFTEVDVElPTiBNRUNIQU5JU01cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBSZWdpb25zIGFscmVhZHkgY29tZSBmcm9tIGV2ZXJ5IG9uLWNhbnZhcyB0b29sIHRoZSBsaWJyYXJ5IGhhczogcmVjdGFuZ2xlLFxuICogcG9seWdvbiwgZnJlZWhhbmQsIG1hZ2ljIHdhbmQsIGJydXNoLiBUZXN0aW5nIG9ic2VydmF0aW9ucyBhZ2FpbnN0IHRoZW0gdHVybnNcbiAqIGFsbCBvZiB0aG9zZSBpbnRvIHNwYXRpYWwtb21pY3Mgc2VsZWN0aW9uIHRvb2xzIHdpdGhvdXQgYWRkaW5nIGEgc2luZ2xlIG5ld1xuICogY2FudmFzIGludGVyYWN0aW9uIOKAlCB3aGljaCBpcyB3aHkgdGhlcmUgaXMgbm8gYmVzcG9rZSBtYXJxdWVlIGhlcmUuXG4gKlxuICogQ09PUkRJTkFURSBGUkFNRVNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tXG4gKiBSZWdpb25zIGFyZSBkcmF3biBpbiBXT1JMRCAoaW1hZ2UpIGNvb3JkaW5hdGVzLiBPYnNlcnZhdGlvbnMgbGl2ZSBpbiB0aGVcbiAqIGRhdGFzZXQncyBvd24gZnJhbWUgYW5kIHJlYWNoIHRoZSB3b3JsZCB0aHJvdWdoIGBpbWFnZVJlZmAg4oCUIHNvIHRoZXkgYXJlXG4gKiB0cmFuc2Zvcm1lZCBmb3J3YXJkIGJlZm9yZSB0ZXN0aW5nLCBtYXRjaGluZyBleGFjdGx5IHdoYXQgdGhlIHJlbmRlcmVyIGRyYXdzLlxuICovXG5cbi8qKiBNb3ZlZCB0byB0aGUgZGF0YXNldCBjb250cmFjdCAoYSBwdXJlIGRhdGEgdHlwZSk7IHJlLWV4cG9ydGVkIGhlcmUgZm9yIGV4aXN0aW5nIGltcG9ydGVycy4gKi9cbmV4cG9ydCB0eXBlIHsgU3BhdGlhbFNlbGVjdGlvbk1hc2sgfTtcblxuLyoqIEFuIGVtcHR5IHNlbGVjdGlvbiBvdmVyIGBjb3VudGAgb2JzZXJ2YXRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5U2VsZWN0aW9uKGNvdW50ID0gMCk6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgcmV0dXJuIHsgbWFzazogbmV3IFVpbnQ4QXJyYXkoY291bnQpLCBjb3VudDogMCB9O1xufVxuXG4vKiogTnVtYmVyIG9mIHNldCBlbnRyaWVzIGluIGEgbWFzay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudE1hc2sobWFzazogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGxldCBuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgbisrO1xuICByZXR1cm4gbjtcbn1cblxuLyoqIFNlbGVjdGVkIGluZGljZXMsIGZvciBleHBvcnQgb3IgYSBkb3duc3RyZWFtIHF1ZXJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tUb0luZGljZXMobWFzazogVWludDhBcnJheSk6IFVpbnQzMkFycmF5IHtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQzMkFycmF5KGNvdW50TWFzayhtYXNrKSk7XG4gIGxldCBhdCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFzay5sZW5ndGg7IGkrKykgaWYgKG1hc2tbaV0pIG91dFthdCsrXSA9IGk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmVuZGVyZXItZmFjaW5nIGludmVyc2U6IHdoaWNoIG9ic2VydmF0aW9ucyB0byBNVVRFLiBXaXRoIG5vdGhpbmcgc2VsZWN0ZWRcbiAqIG5vdGhpbmcgaXMgbXV0ZWQgKHRoZSB3aG9sZSB0aXNzdWUgcmVhZHMgbm9ybWFsbHkpOyB3aXRoIGEgc2VsZWN0aW9uLCBldmVyeVxuICogdW5zZWxlY3RlZCBvYnNlcnZhdGlvbiBpcyBtdXRlZCDigJQgdGhlIENvc014IGhpZ2hsaWdodC12cy1tdXRlIHJ1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgaWYgKHNlbGVjdGlvbi5jb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG11dGVkID0gbmV3IFVpbnQ4QXJyYXkoc2VsZWN0aW9uLm1hc2subGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRlZC5sZW5ndGg7IGkrKykgbXV0ZWRbaV0gPSBzZWxlY3Rpb24ubWFza1tpXSA/IDAgOiAxO1xuICByZXR1cm4gbXV0ZWQ7XG59XG5cbi8qKlxuICogRXZlbi1vZGQgcmF5IGNhc3Q6IGlzIChweCwgcHkpIGluc2lkZSB0aGUgY2xvc2VkIHJpbmcgeHMveXM/XG4gKlxuICogUHVibGljIEFQSSBrZXB0IHdpdGggaXRzIChyaW5nLCBwb2ludCkgYXJndW1lbnQgb3JkZXI7IHRoZSB0ZXN0IGl0c2VsZiBpc1xuICogdGhlIHNoYXJlZCBgZ2VvbWV0cnkvcmluZ2Agb25lIHRoZSByZWdpb24gb3ZlcmxheXMgYW5kIHRvb2xzIHVzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50SW5SaW5nKHhzOiByZWFkb25seSBudW1iZXJbXSwgeXM6IHJlYWRvbmx5IG51bWJlcltdLCBweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiByaW5nQ29udGFpbnNQb2ludChweCwgcHksIHhzLCB5cyk7XG59XG5cbmZ1bmN0aW9uIGluQm91bmRzKGI6IEJvdW5kcywgcHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gcHggPj0gYi5taW5YICYmIHB4IDw9IGIubWF4WCAmJiBweSA+PSBiLm1pblkgJiYgcHkgPD0gYi5tYXhZO1xufVxuXG4vKiogQSByZWdpb24gZmxhdHRlbmVkIHRvIHNvbWV0aGluZyB0ZXN0YWJsZTogYm91bmRzICsgYSBoaXQgdGVzdC4gKi9cbmludGVyZmFjZSBTaGFwZSB7XG4gIGJvdW5kczogQm91bmRzO1xuICBoaXQocHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW47XG59XG5cbi8qKiBQb2x5Z29uLXdpdGgtaG9sZXM6IGluc2lkZSB0aGUgZXh0ZXJpb3IgYW5kIG91dHNpZGUgZXZlcnkgaG9sZS4gKi9cbmZ1bmN0aW9uIHBvbHlnb25TaGFwZSh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSwgaG9sZXM/OiBudW1iZXJbXVtdW10pOiBTaGFwZSB8IG51bGwge1xuICBpZiAoeHMubGVuZ3RoIDwgMykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGJvdW5kcyA9IHJpbmdCb3VuZHMoeHMsIHlzKTtcbiAgLy8gU3BsaXQgYW5kIGJvdW5kZWQgT05DRSBwZXIgc2hhcGU6IHRoZSBoaXQgdGVzdCBydW5zIGZvciBldmVyeSBjYW5kaWRhdGUgcG9pbnRcbiAgLy8gaW5zaWRlIHRoZSBleHRlcmlvciDigJQgdXAgdG8gbWlsbGlvbnMgb2YgY2VsbHMgcGVyIHNlbGVjdGlvbi5cbiAgY29uc3QgaG9sZVJpbmdzID0gKGhvbGVzID8/IFtdKVxuICAgIC5maWx0ZXIoKHJpbmcpID0+IHJpbmcubGVuZ3RoID49IDMpXG4gICAgLm1hcCgocmluZykgPT4ge1xuICAgICAgY29uc3QgaHggPSByaW5nLm1hcCgocCkgPT4gcFswXSk7XG4gICAgICBjb25zdCBoeSA9IHJpbmcubWFwKChwKSA9PiBwWzFdKTtcbiAgICAgIHJldHVybiB7IHhzOiBoeCwgeXM6IGh5LCBib3VuZHM6IHJpbmdCb3VuZHMoaHgsIGh5KSB9O1xuICAgIH0pO1xuICByZXR1cm4ge1xuICAgIGJvdW5kcyxcbiAgICBoaXQ6IChweCwgcHkpID0+IHtcbiAgICAgIGlmICghcG9pbnRJblJpbmcoeHMsIHlzLCBweCwgcHkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBUaGUgcmVnaW9uIG1vZGVsIGlzIGV4cGxpY2l0OiBhIHBvaW50IGluc2lkZSB0aGUgZXh0ZXJpb3IgQU5EIGluc2lkZSBhXG4gICAgICAvLyBob2xlIGlzIE9VVFNJREUgdGhlIHJlZ2lvbi5cbiAgICAgIGZvciAoY29uc3QgaG9sZSBvZiBob2xlUmluZ3MpIHtcbiAgICAgICAgaWYgKGluQm91bmRzKGhvbGUuYm91bmRzLCBweCwgcHkpICYmIHBvaW50SW5SaW5nKGhvbGUueHMsIGhvbGUueXMsIHB4LCBweSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIHJlZ2lvbiB0byB0ZXN0YWJsZSBzaGFwZXMuIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgZm9yIGFueXRoaW5nIHRoYXRcbiAqIGVuY2xvc2VzIG5vIGFyZWEg4oCUIGFuIG9wZW4gcG9seWxpbmUsIGFuIGludGVuc2l0eS1wcm9maWxlIGxpbmUsIGEgZGVnZW5lcmF0ZVxuICogcmVjdGFuZ2xlIOKAlCBzbyB0aG9zZSBuZXZlciBjb250cmlidXRlIHRvIGEgc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uU2hhcGVzKHJlZ2lvbjogUmVnaW9uKTogU2hhcGVbXSB7XG4gIC8vIFByb2ZpbGUgbGluZXMgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90IHRoZSBhbm5vdGF0aW9uIHNldC5cbiAgaWYgKChyZWdpb24gYXMgdW5rbm93biBhcyB7IGtpbmQ/OiBzdHJpbmcgfSk/LmtpbmQgPT09ICdwcm9maWxlJykgcmV0dXJuIFtdO1xuICBjb25zdCBiID0gcmVnaW9uPy5ib3VuZHMgYXMgdW5rbm93biBhc1xuICAgIHwge1xuICAgICAgICB4PzogbnVtYmVyO1xuICAgICAgICB5PzogbnVtYmVyO1xuICAgICAgICB3aWR0aD86IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgICAgICB4cG9pbnRzPzogbnVtYmVyW107XG4gICAgICAgIHlwb2ludHM/OiBudW1iZXJbXTtcbiAgICAgICAgY2xvc2VkPzogYm9vbGVhbjtcbiAgICAgICAgaG9sZXM/OiBudW1iZXJbXVtdW107XG4gICAgICAgIHBvbHlnb25zPzogeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW107IGNsb3NlZD86IGJvb2xlYW47IGhvbGVzPzogbnVtYmVyW11bXVtdIH1bXTtcbiAgICAgIH1cbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZDtcbiAgaWYgKCFiKSByZXR1cm4gW107XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYi5wb2x5Z29ucykpIHtcbiAgICByZXR1cm4gYi5wb2x5Z29ucy5mbGF0TWFwKChwKSA9PlxuICAgICAgcC5jbG9zZWQgPT09IGZhbHNlID8gW10gOiAocG9seWdvblNoYXBlKHAueHBvaW50cyA/PyBbXSwgcC55cG9pbnRzID8/IFtdLCBwLmhvbGVzKSA/PyBbXSksXG4gICAgKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShiLnhwb2ludHMpKSB7XG4gICAgaWYgKGIuY2xvc2VkID09PSBmYWxzZSkgcmV0dXJuIFtdOyAvLyBvcGVuIHBvbHlsaW5lIGVuY2xvc2VzIG5vdGhpbmdcbiAgICBjb25zdCBzaGFwZSA9IHBvbHlnb25TaGFwZShiLnhwb2ludHMsIGIueXBvaW50cyA/PyBbXSwgYi5ob2xlcyk7XG4gICAgcmV0dXJuIHNoYXBlID8gW3NoYXBlXSA6IFtdO1xuICB9XG4gIGlmICh0eXBlb2YgYi53aWR0aCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGIuaGVpZ2h0ID09PSAnbnVtYmVyJykge1xuICAgIGNvbnN0IHggPSBiLnggPz8gMDtcbiAgICBjb25zdCB5ID0gYi55ID8/IDA7XG4gICAgLy8gTm9ybWFsaXNlIGEgcmVjdGFuZ2xlIGRyYWdnZWQgcmlnaHQtdG8tbGVmdCAvIGJvdHRvbS10by10b3AuXG4gICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgsIHggKyBiLndpZHRoKTtcbiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeCwgeCArIGIud2lkdGgpO1xuICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5LCB5ICsgYi5oZWlnaHQpO1xuICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCh5LCB5ICsgYi5oZWlnaHQpO1xuICAgIGlmIChtYXhYID09PSBtaW5YIHx8IG1heFkgPT09IG1pblkpIHJldHVybiBbXTtcbiAgICBjb25zdCBib3VuZHMgPSB7IG1pblgsIG1pblksIG1heFgsIG1heFkgfTtcbiAgICByZXR1cm4gW3sgYm91bmRzLCBoaXQ6IChweCwgcHkpID0+IGluQm91bmRzKGJvdW5kcywgcHgsIHB5KSB9XTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbi8qKlxuICogQSBzZWxlY3Rpb24gZnJvbSBhbiBleHBsaWNpdCBsaXN0IG9mIG9ic2VydmF0aW9uIGluZGljZXMuXG4gKlxuICogV2hhdCBhIGxhc3NvIGluIGEgbGlua2VkIHBsb3QgcHJvZHVjZXM6IHRoZSBwbG90IGtub3dzIHdoaWNoIHBvaW50cyB0aGUgdXNlciBkcmV3XG4gKiBhcm91bmQsIGFuZCB0aGUgbWFwIG5lZWRzIHRoYXQgYXMgYSBtYXNrIG92ZXIgQUxMIG9ic2VydmF0aW9ucy4gT3V0LW9mLXJhbmdlIGFuZFxuICogZHVwbGljYXRlIGluZGljZXMgYXJlIGlnbm9yZWQgcmF0aGVyIHRoYW4gcmVqZWN0ZWQg4oCUIGEgcGxvdCBtYXkgaGFuZCBiYWNrIHRoZSBzYW1lXG4gKiBwb2ludCB0d2ljZSwgYW5kIGEgc3RhbGUgaW5kZXggZnJvbSBhIHBsb3QgZHJhd24gYmVmb3JlIGEgZGF0YXNldCBjaGFuZ2UgbXVzdCBub3RcbiAqIHRocm93IGluIHRoZSBtaWRkbGUgb2YgYSBzZWxlY3Rpb24gZ2VzdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJ5SW5kaWNlcyhpbmRpY2VzOiBJdGVyYWJsZTxudW1iZXI+LCBvYnNlcnZhdGlvbkNvdW50OiBudW1iZXIpOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShvYnNlcnZhdGlvbkNvdW50KTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoaSkgfHwgaSA8IDAgfHwgaSA+PSBvYnNlcnZhdGlvbkNvdW50KSBjb250aW51ZTtcbiAgICBpZiAobWFza1tpXSkgY29udGludWU7XG4gICAgbWFza1tpXSA9IDE7XG4gICAgY291bnQrKztcbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIE9ic2VydmF0aW9ucyBpbnNpZGUgQU5ZIG9mIGByZWdpb25zYCAodW5pb24pLiBDb29yZGluYXRlcyBhcmUgdHJhbnNmb3JtZWQgYnlcbiAqIGBpbWFnZVJlZmAgZmlyc3QsIHNvIHRoZSB0ZXN0IGhhcHBlbnMgaW4gdGhlIHNhbWUgd29ybGQgc3BhY2UgdGhlIHJlZ2lvbnMgd2VyZVxuICogZHJhd24gaW4uXG4gKlxuICogYGNhbmRpZGF0ZXNgLCB3aGVuIGdpdmVuLCByZXN0cmljdHMgdGhlIHRlc3QgdG8gdGhvc2Ugb2JzZXJ2YXRpb24gaW5kaWNlcyDigJQgaG93XG4gKiBhIDJEIHZpZXcgb2YgYSAzRCBkYXRhc2V0IGtlZXBzIGEgZHJhd24gcmVnaW9uIG1lYW5pbmcgd2hhdCBpdCBsb29rcyBsaWtlIGl0XG4gKiBtZWFuczogdGhlIHNoYXBlIHdhcyBkcmF3biBvdmVyIE9ORSBzZWN0aW9uLCBzbyBpdCBzZWxlY3RzIHRoYXQgc2VjdGlvbidzIGNlbGxzXG4gKiByYXRoZXIgdGhhbiB0aGUgd2hvbGUgZGVwdGggb2YgdGhlIHNwZWNpbWVuIGJlaGluZCB0aGVtLiBUaGUgcmV0dXJuZWQgbWFzayBzdGF5c1xuICogaW5kZXhlZCBieSBvYnNlcnZhdGlvbiwgc28gZXZlcnkgY29uc3VtZXIgKGNoYXJ0cywgbGVnZW5kLCB0aGUgM0QgY2xvdWQpIHJlYWRzIGl0XG4gKiB0aGUgc2FtZSB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnMoXG4gIG9ic2VydmF0aW9uczogU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgaW1hZ2VSZWY6IFNwYXRpYWxJbWFnZVJlZiB8IHVuZGVmaW5lZCxcbiAgcmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sXG4gIGNhbmRpZGF0ZXM/OiBVaW50MzJBcnJheSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbiA9IG9ic2VydmF0aW9ucy5jb3VudDtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBjb25zdCBzaGFwZXMgPSByZWdpb25zLmZsYXRNYXAoKHIpID0+IHJlZ2lvblNoYXBlcyhyKSk7XG4gIGlmIChzaGFwZXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIGNvbnN0IFtzeCwgc3ldID0gaW1hZ2VSZWY/LnNjYWxlID8/IFsxLCAxXTtcbiAgY29uc3QgW3R4LCB0eV0gPSBpbWFnZVJlZj8udHJhbnNsYXRlID8/IFswLCAwXTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgY29uc3QgdG90YWwgPSBjYW5kaWRhdGVzID8gY2FuZGlkYXRlcy5sZW5ndGggOiBuO1xuICBmb3IgKGxldCBrID0gMDsgayA8IHRvdGFsOyBrKyspIHtcbiAgICBjb25zdCBpID0gY2FuZGlkYXRlcyA/IGNhbmRpZGF0ZXNba10gOiBrO1xuICAgIGNvbnN0IHB4ID0gb2JzZXJ2YXRpb25zLnhbaV0gKiBzeCArIHR4O1xuICAgIGNvbnN0IHB5ID0gb2JzZXJ2YXRpb25zLnlbaV0gKiBzeSArIHR5O1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICAvLyBCb3VuZHMgZmlyc3Q6IGEgcmF5IGNhc3QgcGVyIG9ic2VydmF0aW9uIHBlciByZWdpb24gd291bGQgZG9taW5hdGUgYXRcbiAgICAgIC8vIDEwXjUgb2JzZXJ2YXRpb25zLCBhbmQgbW9zdCBwb2ludHMgbWlzcyBtb3N0IHJlZ2lvbnMuXG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIFNlbGVjdCBvYnNlcnZhdGlvbnMgd2hvc2UgU0NSRUVOIHByb2plY3Rpb24gZmFsbHMgaW5zaWRlIHRoZSBkcmF3biByZWdpb25zLlxuICpcbiAqIFRoaXMgaXMgaG93IGEgcmVnaW9uIHNlbGVjdGlvbiB3b3JrcyBpbiB0aGUgM0QgY2xvdWQuIFRoZXJlIGlzIG5vIGRhdGEtc3BhY2VcbiAqIGFmZmluZSB0byBtYXAgYSBkcmF3biBzaGFwZSB0aHJvdWdoLCBiZWNhdXNlIHRoZSBzaGFwZSB3YXMgZHJhd24gb24gYSAyRCBzY3JlZW5cbiAqIGFnYWluc3QgYSBwZXJzcGVjdGl2ZSBjYW1lcmEg4oCUIHNvIHRoZSBvYnNlcnZhdGlvbnMgY29tZSB0aGUgb3RoZXIgd2F5LCBhbHJlYWR5XG4gKiBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyBieSB0aGUgcmVuZGVyZXIgKHdoaWNoIG93bnMgdGhlIGNhbWVyYSksIGFuZCB0aGVcbiAqIHJlZ2lvbnMgYXJlIHRlc3RlZCBpbiB0aGF0IHNhbWUgc2NyZWVuIHNwYWNlLlxuICpcbiAqIFRoZSBjb25zZXF1ZW5jZSBpcyB3b3J0aCBiZWluZyBleHBsaWNpdCBhYm91dDogYSBzY3JlZW4tc3BhY2UgbGFzc28gc2VsZWN0c1xuICogdGhyb3VnaCB0aGUgV0hPTEUgREVQVEggb2YgdGhlIGNsb3VkLCBsaWtlIGEgY29va2llIGN1dHRlciwgbm90IGEgc2xhYiBhdCBzb21lXG4gKiBjaG9zZW4gei4gVGhhdCBpcyBpbmhlcmVudCB0byBkcmF3aW5nIG9uIGEgZmxhdCBzY3JlZW4sIGFuZCBpdCBpcyB3aGF0IG5hcGFyaVxuICogYW5kIGV2ZXJ5IG90aGVyIG9yYml0LWNhbWVyYSBwb2ludCBwaWNrZXIgZG8uIE9yYml0IGFuZCBkcmF3IGFnYWluIHRvIGN1dCBmcm9tXG4gKiBhbm90aGVyIGFuZ2xlLlxuICpcbiAqIGBzY3JlZW5gIGlzIGBbeDAsIHkwLCB4MSwgeTEsIOKApl1gIGluIGNhbnZhcyBwaXhlbHMsIGBjb3VudGAgZW50cmllcyBsb25nLiBBblxuICogb2JzZXJ2YXRpb24gdGhlIGNhbWVyYSBwdXRzIGJlaGluZCB0aGUgZXllIGlzIGdpdmVuIE5hTiBieSB0aGUgcHJvamVjdG9yIGFuZFxuICogbmV2ZXIgc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQoXG4gIHNjcmVlbjogRmxvYXQzMkFycmF5LFxuICBjb3VudDogbnVtYmVyLFxuICByZWdpb25zOiByZWFkb25seSBSZWdpb25bXSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvdW50KTtcbiAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5mbGF0TWFwKChyKSA9PiByZWdpb25TaGFwZXMocikpO1xuICBpZiAoc2hhcGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbWFzaywgY291bnQ6IDAgfTtcblxuICBsZXQgaGl0cyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IHB4ID0gc2NyZWVuW2kgKiAyXTtcbiAgICBjb25zdCBweSA9IHNjcmVlbltpICogMiArIDFdO1xuICAgIC8vIEJlaGluZCB0aGUgY2FtZXJhLCBvciBvdGhlcndpc2UgdW5wcm9qZWN0YWJsZS5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShweCkgfHwgIU51bWJlci5pc0Zpbml0ZShweSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGhpdHMrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50OiBoaXRzIH07XG59XG5cbi8qKlxuICogT2JzZXJ2YXRpb25zIGluc2lkZSB0aGUgVk9MVU1FIGEgc3RhY2sgb2Ygb3V0bGluZXMgZW5jbG9zZXM6IGEgcmVnaW9uIGNsYXNzIChhblxuICogYXRsYXMgc3RydWN0dXJlIHdpdGggaXRzIHN1YnN0cnVjdHVyZXMpIHRocm91Z2ggZXZlcnkgc2VjdGlvbiBvZiB0aGUgZGF0YXNldCdzXG4gKiByZWZlcmVuY2Ugdm9sdW1lLCBhcyBpdHMgM0QgcmVjb25zdHJ1Y3Rpb24gc2hvd3MgaXQuXG4gKlxuICogVGhlIG91dGxpbmVzIGFyZSBpbiB0aGUgdm9sdW1lJ3Mgb3duIGdyaWQg4oCUIHgsIHkgaW4gdm94ZWxzLCB6IHRoZSBzbGljZSDigJQgd2hpY2hcbiAqIGlzIHdoZXJlIHJlZ2lvbnMgaW1wb3J0ZWQgb250byB0aGUgdm9sdW1lJ3Mgc3RhY2sgc2l0LiBBbiBvYnNlcnZhdGlvbiBpcyBpbiB2b3hlbFxuICogYCjijIp4IC8gdnjijIssIOKMinkgLyB2eeKMiywg4oyKeiAvIHZ64oyLKWAgKHNlZSBgdm9sdW1lSW1hZ2VSZWZgKSwgYW5kIHNlbGVjdGVkIHdoZW4gaXRzXG4gKiBzbGljZSdzIG91dGxpbmVzIGNvdmVyIHRoYXQgdm94ZWwsIGZpbGxlZCBhcyB0aGUgcmVjb25zdHJ1Y3Rpb24gZmlsbHMgdGhlbS4gT25lXG4gKiBzbGljZSBpcyByYXN0ZXJpc2VkIGF0IGEgdGltZSwgc28gYSBzdHJ1Y3R1cmUgdGhyb3VnaCB0aGUgd2hvbGUgYnJhaW4gY29zdHMgb25lXG4gKiBzbGljZSdzIG1hc2ssIG5vdCB0aGUgdm9sdW1lJ3MuIEFuIG9ic2VydmF0aW9uIG91dHNpZGUgdGhlIHZvbHVtZSwgb3Igd2l0aG91dCBhXG4gKiB6LCBpcyBuZXZlciBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluQ2xhc3NWb2x1bWVzKFxuICBvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIHZvbHVtZTogU3BhdGlhbFZvbHVtZU1ldGEsXG4gIHNsaWNlczogcmVhZG9ubHkgU2xpY2VPdXRsaW5lc1tdLFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBuID0gb2JzZXJ2YXRpb25zLmNvdW50O1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGNvbnN0IHogPSBvYnNlcnZhdGlvbnMuejtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9ID0gdm9sdW1lO1xuICBjb25zdCBbdngsIHZ5LCB2el0gPSB2b2x1bWUudm94ZWxTaXplO1xuICBjb25zdCBieVNsaWNlID0gbmV3IE1hcDxudW1iZXIsIFNsaWNlT3V0bGluZXNbXT4oKTtcbiAgZm9yIChjb25zdCBzIG9mIHNsaWNlcykge1xuICAgIGlmICghcy5yaW5ncy5sZW5ndGggfHwgcy56IDwgMCB8fCBzLnogPj0gZGVwdGgpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxpc3QgPSBieVNsaWNlLmdldChzLnopO1xuICAgIGlmIChsaXN0KSBsaXN0LnB1c2gocyk7XG4gICAgZWxzZSBieVNsaWNlLnNldChzLnosIFtzXSk7XG4gIH1cbiAgaWYgKCF6IHx8ICFieVNsaWNlLnNpemUpIHJldHVybiB7IG1hc2ssIGNvdW50OiAwIH07XG5cbiAgLy8gVGhlIG9ic2VydmF0aW9ucyBvZiBlYWNoIG91dGxpbmVkIHNsaWNlIChhIGNvdW50aW5nIHNvcnQgYnkgc2xpY2UpLlxuICBjb25zdCBzbGljZU9mID0gbmV3IEludDMyQXJyYXkobikuZmlsbCgtMSk7XG4gIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShkZXB0aCArIDEpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IGsgPSBNYXRoLmZsb29yKHpbaV0gLyB2eik7XG4gICAgaWYgKCFieVNsaWNlLmhhcyhrKSkgY29udGludWU7XG4gICAgc2xpY2VPZltpXSA9IGs7XG4gICAgY291bnRzW2sgKyAxXSsrO1xuICB9XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgZGVwdGg7IGsrKykgY291bnRzW2sgKyAxXSArPSBjb3VudHNba107XG4gIGNvbnN0IG9yZGVyID0gbmV3IFVpbnQzMkFycmF5KGNvdW50c1tkZXB0aF0pO1xuICBjb25zdCBhdCA9IGNvdW50cy5zbGljZSgwLCBkZXB0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSBpZiAoc2xpY2VPZltpXSA+PSAwKSBvcmRlclthdFtzbGljZU9mW2ldXSsrXSA9IGk7XG5cbiAgY29uc3QgcGxhbmUgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgW2ssIG91dGxpbmVzXSBvZiBieVNsaWNlKSB7XG4gICAgcGxhbmUuZmlsbCgwKTtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygb3V0bGluZXMpIGZpbGxPdXRsaW5lcyhwbGFuZSwgd2lkdGgsIGhlaWdodCwgcyk7XG4gICAgZm9yIChsZXQgbyA9IGNvdW50c1trXTsgbyA8IGNvdW50c1trICsgMV07IG8rKykge1xuICAgICAgY29uc3QgaSA9IG9yZGVyW29dO1xuICAgICAgY29uc3QgcHggPSBNYXRoLmZsb29yKG9ic2VydmF0aW9ucy54W2ldIC8gdngpO1xuICAgICAgY29uc3QgcHkgPSBNYXRoLmZsb29yKG9ic2VydmF0aW9ucy55W2ldIC8gdnkpO1xuICAgICAgaWYgKHB4IDwgMCB8fCBweSA8IDAgfHwgcHggPj0gd2lkdGggfHwgcHkgPj0gaGVpZ2h0KSBjb250aW51ZTtcbiAgICAgIGlmIChwbGFuZVtweSAqIHdpZHRoICsgcHhdKSB7XG4gICAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdHdvIHNlbGVjdGlvbnMgaG9sZCBleGFjdGx5IHRoZSBzYW1lIG9ic2VydmF0aW9ucy5cbiAqXG4gKiBMZXRzIGEgY2xpY2sgdG9nZ2xlIGFnYWluc3QgdGhlIFNFTEVDVElPTiByYXRoZXIgdGhhbiBhZ2FpbnN0IGEgcmVtZW1iZXJlZFxuICogY2xpY2s6IHBpY2tpbmcgYSBjbGFzcyBpbiB0aGUgbGVnZW5kIGFuZCB0aGVuIGNsaWNraW5nIHRoYXQgc2FtZSBjbGFzcyBvbiB0aGVcbiAqIGNhbnZhcyBzaG91bGQgY2xlYXIgaXQsIGFuZCBhIHJlbWVtYmVyZWQgY2xpY2sgY2Fubm90IGtub3cgYWJvdXQgdGhlIGxlZ2VuZC5cbiAqIENvdW50cyBhcmUgY29tcGFyZWQgZmlyc3QsIHNvIHR3byBkaWZmZXJlbnQgc2VsZWN0aW9ucyB1c3VhbGx5IGNvc3Qgbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbWVTZWxlY3Rpb24oYTogU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGI6IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogYm9vbGVhbiB7XG4gIGlmIChhLmNvdW50ICE9PSBiLmNvdW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChhLm1hc2subGVuZ3RoICE9PSBiLm1hc2subGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5tYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9ybWFsaXNlZCB0byAwLzE6IHRoZSBtYXNrcyBhcmUgZmxhZ3MsIGFuZCBhIHdyaXRlciBpcyBmcmVlIHRvIHVzZSBhbnlcbiAgICAvLyBub24temVybyB2YWx1ZSBmb3IgXCJzZWxlY3RlZFwiLlxuICAgIGlmICgoYS5tYXNrW2ldID8gMSA6IDApICE9PSAoYi5tYXNrW2ldID8gMSA6IDApKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBFdmVyeSBvYnNlcnZhdGlvbiB3aG9zZSBjYXRlZ29yaWNhbCBjb2RlIGVxdWFscyBgY29kZWAg4oCUIHRoZSBsZWdlbmQgY2xpY2suICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0QnlDYXRlZ29yeShjb2RlczogVWludDE2QXJyYXksIGNvZGU6IG51bWJlcik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvZGVzLmxlbmd0aCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY29kZXNbaV0gPT09IGNvZGUpIHtcbiAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQgfTtcbn1cbiJdfQ==
|