@jax-data-science/sci-image-visualizer 0.11.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +4 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +18 -6
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +70 -2
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +29 -14
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +11 -1
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +9 -4
- package/esm2022/lib/region-editor/region-editor.component.mjs +46 -41
- package/esm2022/lib/region-import/label-volume.mjs +35 -4
- package/esm2022/lib/region-import/ome-zarr-labels.mjs +253 -0
- package/esm2022/lib/region-import/open-annotations.mjs +289 -0
- package/esm2022/lib/region-import/zarr-codecs.mjs +167 -0
- package/esm2022/lib/region-import/zip.mjs +157 -0
- package/esm2022/lib/routing-visualizer.service.mjs +20 -7
- package/esm2022/lib/visualizer/region-load.mjs +16 -1
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs} +1103 -71
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs} +4 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/index.d.ts +6 -0
- package/lib/contracts/image.contract.d.ts +7 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +13 -1
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +40 -1
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +11 -0
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +5 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +6 -1
- package/lib/region-editor/region-editor.component.d.ts +5 -4
- package/lib/region-import/label-volume.d.ts +4 -0
- package/lib/region-import/ome-zarr-labels.d.ts +36 -0
- package/lib/region-import/open-annotations.d.ts +73 -0
- package/lib/region-import/zarr-codecs.d.ts +14 -0
- package/lib/region-import/zip.d.ts +31 -0
- package/lib/routing-visualizer.service.d.ts +9 -1
- package/package.json +2 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +0 -1
|
@@ -110,27 +110,38 @@ export class NapariToolBridge {
|
|
|
110
110
|
* A screen-space shape stops meaning anything the moment the camera moves, so an orbit clears
|
|
111
111
|
* the regions drawn in this view (and only those). The SELECTION they produced is kept: that is
|
|
112
112
|
* the durable artefact, and the highlighted points stay highlighted from every angle.
|
|
113
|
+
*
|
|
114
|
+
* Every other region in the store is in image space - the image's own, an imported set,
|
|
115
|
+
* structures a tree click took from a region source - so the overlay neither draws nor picks it
|
|
116
|
+
* (it would lie flat at canvas pixels over the cloud), and an orbit leaves it alone: they show
|
|
117
|
+
* in 3D as their reconstructions instead.
|
|
113
118
|
*/
|
|
114
119
|
install3dInteraction(viewer, host) {
|
|
115
120
|
const { regionStore } = this.deps;
|
|
116
121
|
// World here is the canvas, not the image: no region source to draw.
|
|
117
|
-
|
|
122
|
+
const overlay = new NapariRegionOverlay(host, this.screenSpaceViewer(viewer), regionStore, {
|
|
118
123
|
regionSource: false,
|
|
124
|
+
screenSpace: true,
|
|
119
125
|
});
|
|
126
|
+
this.regionOverlay = overlay;
|
|
120
127
|
this.buildCoordinateTransform();
|
|
121
|
-
// Regions already in the shared store when the 3D view mounted (the image's own, say) are
|
|
122
|
-
// not screen-space shapes and must survive an orbit; only those drawn here are cleared.
|
|
123
128
|
// (No mid-gesture case to guard: the overlay disables the camera controls while drawing.)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
129
|
+
this.cameraOff = viewer.camera3d.changed.connect(() => this.clearOwnLassos());
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Remove the regions the 3D overlay drew in screen space (only those) from the store: a lasso
|
|
133
|
+
* means nothing once the camera it was drawn under moves or the scene goes. Not an edit of the
|
|
134
|
+
* user's: no undo step (NAPARI-SVC-11).
|
|
135
|
+
*/
|
|
136
|
+
clearOwnLassos() {
|
|
137
|
+
const overlay = this.regionOverlay;
|
|
138
|
+
if (!overlay)
|
|
139
|
+
return;
|
|
140
|
+
const { regionStore } = this.deps;
|
|
141
|
+
const present = new Set(regionStore.getRegions().map((r) => r.id));
|
|
142
|
+
const drawn = overlay.ownRegionIds().filter((id) => present.has(id));
|
|
143
|
+
if (drawn.length)
|
|
144
|
+
this.host.inZone(() => regionStore.removeRegions(drawn, { recordUndo: false }));
|
|
134
145
|
}
|
|
135
146
|
/**
|
|
136
147
|
* The {@link OverlayViewer} the 3D region overlay draws through: "world" is the canvas, in
|
|
@@ -152,6 +163,10 @@ export class NapariToolBridge {
|
|
|
152
163
|
/** End the scene's interaction: the overlay, the camera hook, the pending timers and the
|
|
153
164
|
* pixels read from the old canvas. The armed tool and the pixel-tool set persist. */
|
|
154
165
|
teardown() {
|
|
166
|
+
// The overlay's record of its lassos goes with it: remove them first, or they would stay in
|
|
167
|
+
// the store unowned - hidden by the next 3D overlay, beyond an orbit's reach, and still
|
|
168
|
+
// feeding "Select from ROIs" with screen coordinates of a camera that is gone.
|
|
169
|
+
this.clearOwnLassos();
|
|
155
170
|
this.regionOverlay?.destroy();
|
|
156
171
|
this.regionOverlay = null;
|
|
157
172
|
this.cachedImage = null;
|
|
@@ -344,4 +359,4 @@ export class NapariToolBridge {
|
|
|
344
359
|
return this.deps.cellSegmentTool.segmentBoxes(this.toolHost, segmenter);
|
|
345
360
|
}
|
|
346
361
|
}
|
|
347
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXRvb2wtYnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS10b29sLWJyaWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHM0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBS2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBaUIsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVV4RCwrRkFBK0Y7QUFDL0YsTUFBTSxPQUFPLHlCQUF5QjtJQUNwQyxZQUNtQixNQUdoQixFQUNnQixLQUFvQjtRQUpwQixXQUFNLEdBQU4sTUFBTSxDQUd0QjtRQUNnQixVQUFLLEdBQUwsS0FBSyxDQUFlO0lBQ3BDLENBQUM7SUFDSixZQUFZLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDM0MsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0QsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsVUFBa0I7UUFDbkMsT0FBTyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsd0JBQXdCO0lBQ3ZFLENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBNkJEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLGdC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QUFJLENBQUMsU0FBUztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFZpZXdlciB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IENhbnZhc1Rvb2xJZCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IElDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Nvb3JkaW5hdGUtdHJhbnNmb3JtLmNvbnRyYWN0JztcbmltcG9ydCB7IFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSURFTlRJVFlfQUZGSU5FIH0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlcic7XG5pbXBvcnQgeyBDYWNoZWRJbWFnZURhdGEsIENhbnZhc1Rvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sLWtpdC9jYW52YXMtdG9vbCc7XG5pbXBvcnQgeyBDYW52YXNUb29sTWFuYWdlciB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvdG9vbC1raXQvY2FudmFzLXRvb2wtbWFuYWdlcic7XG5pbXBvcnQgeyBjcmVhdGVDYW52YXNUb29sTWFuYWdlciB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvY2FudmFzLXRvb2xzJztcbmltcG9ydCB7IHBhY2tlZEZyYW1lIH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sLWtpdC9mcmFtZS1waXhlbHMnO1xuaW1wb3J0IHsgV2FuZFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlSZWdpb25PdmVybGF5LCBPdmVybGF5Vmlld2VyIH0gZnJvbSAnLi9uYXBhcmktcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgUkVBREJBQ0tfREVCT1VOQ0VfTVMgfSBmcm9tICcuL25hcGFyaS1oZWxwZXJzJztcblxuLyoqIEEgd29ybGQtc3BhY2UgcmVjdGFuZ2xlICh4LCB5ID0gdG9wLWxlZnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JsZFJlY3Qge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBJQ29vcmRpbmF0ZVRyYW5zZm9ybSBvdmVyIHRoZSBuYXBhcmkgY2FtZXJhOiBwb2ludGVyIGNsaWVudCBjb29yZHMg4oaUIGltYWdlL3dvcmxkIGNvb3Jkcy4gKi9cbmV4cG9ydCBjbGFzcyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtIGltcGxlbWVudHMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjoge1xuICAgICAgY2FudmFzVG9Xb3JsZChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICByZWFkb25seSBjYW1lcmE6IHsgem9vbTogbnVtYmVyIH07XG4gICAgfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWR5OiAoKSA9PiBib29sZWFuLFxuICApIHt9XG4gIGNsaWVudFRvRGF0YShjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cbiAgZGF0YUxlbmd0aFRvU2NyZWVuKGRhdGFMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGFMZW5ndGggKiB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTsgLy8gQ1NTIHB4IHBlciB3b3JsZCB1bml0XG4gIH1cbiAgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG59XG5cbi8qKiBXaGF0IHRoZSBicmlkZ2UgcmVhZHMgZnJvbSB0aGUgc2VydmljZTogdGhlIGxpdmUgdmlld2VyIGFuZCBpdHMgRE9NLCB0aGUgaW1hZ2Ugb24gc2NyZWVuLCBhbmRcbiAqICB3aGVyZSB0aGUgdmlld3BvcnQgYW5kIHpvbmUtY3Jvc3Npbmcgb3V0cHV0IGdvLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sQnJpZGdlSG9zdCB7XG4gIHZpZXdlcigpOiBWaWV3ZXIgfCBudWxsO1xuICBob3N0KCk6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgY2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgLyoqIFRoZSBpbWFnZSdzIGZ1bGwtcmVzb2x1dGlvbiBzaXplLCBvciBudWxsIGJlZm9yZSBvbmUgaXMgZHJhd24uICovXG4gIGltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsO1xuICBmcmFtZUluZGV4KCk6IG51bWJlcjtcbiAgZmlsZU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIHZpc2libGUgcmVnaW9uIGNoYW5nZWQgKGNsYW1wZWQgdG8gdGhlIGltYWdlKTsgY2FsbGVkIG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZS4gKi9cbiAgdmlld3BvcnRDaGFuZ2VkKHJlY3Q6IFdvcmxkUmVjdCk6IHZvaWQ7XG4gIC8qKiBSdW4gYGZuYCBvdXRzaWRlIC8gaW5zaWRlIHRoZSBBbmd1bGFyIHpvbmUuICovXG4gIG91dHNpZGVab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbiAgaW5ab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbn1cblxuLyoqIFRoZSBzZXJ2aWNlcyB0aGUgcGl4ZWwgdG9vbHMgYW5kIHNlZ21lbnRhdGlvbiBydW5zIG5lZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xCcmlkZ2VEZXBzIHtcbiAgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlO1xuICB3YW5kU2VydmljZTogV2FuZFNlcnZpY2U7XG4gIHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlO1xuICBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2U7XG4gIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZTtcbiAgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBuYXBhcmkgYmFja2VuZCdzIHNpZGUgb2YgdGhlIHNoYXJlZCBjYW52YXMgdG9vbHMgKHJldmlldyBBcHBlbmRpeCBCLCBzdGVwIDQpOiB0aGUgcmVnaW9uXG4gKiBvdmVybGF5LCB0aGUge0BsaW5rIENhbnZhc1Rvb2xNYW5hZ2VyfSBhbmQgaXRzIGhvc3QsIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSwgYW5kIHRoZVxuICogZGlzcGxheWVkLXBpeGVsIHJlYWRiYWNrIHRoZSB3YW5kLCBicnVzaCwgZXJhc2VyIGFuZCBTQU0vY2VsbHBvc2UgcmVhZCDigJQga2VwdCBjdXJyZW50IGFzIHRoZVxuICogY2FtZXJhIG1vdmVzLCBidXQgb25seSBwYWlkIGZvciB3aGlsZSBhIHBpeGVsIHRvb2wgbmVlZHMgaXQgKE5BUEFSSS1TVkMtMjYpLlxuICpcbiAqIE9uZSBwZXIgc2VydmljZTsge0BsaW5rIHRlYXJkb3dufSBlbmRzIGEgc2NlbmUncyBpbnRlcmFjdGlvbiAob3ZlcmxheSwgY2FtZXJhIGhvb2ssIHRpbWVycyxcbiAqIHBpeGVscykgYW5kIGFuIGBpbnN0YWxs4oCmSW50ZXJhY3Rpb25gIHN0YXJ0cyB0aGUgbmV4dCBvbmUncy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5hcGFyaVRvb2xCcmlkZ2Uge1xuICAvKiogV2hhdCB0aGlzIGJhY2tlbmQncyBjYW52YXMgdG9vbHMgcmVhZCBhbmQgd3JpdGUgKG9uZSBob3N0IGZvciBldmVyeSB0b29sKS4gKi9cbiAgcmVhZG9ubHkgdG9vbEhvc3Q6IENhbnZhc1Rvb2xIb3N0O1xuICAvKiogVGhpcyBiYWNrZW5kJ3Mgb3duIHdhbmQsIGJydXNoLCBlcmFzZXIsIHpvb20tdG8tYm94IGFuZCBTQU0gcG9pbnQgdG9vbHMuICovXG4gIHJlYWRvbmx5IGNhbnZhc1Rvb2xzOiBDYW52YXNUb29sTWFuYWdlcjtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IChudWxsIHVudGlsIGEgMkQvM0QgaW50ZXJhY3Rpb24gaXMgaW5zdGFsbGVkKS4gKi9cbiAgcmVnaW9uT3ZlcmxheTogTmFwYXJpUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHBpeGVsIHRvb2xzJyBwb2ludGVyIOKGlCB3b3JsZCB0cmFuc2Zvcm0gZm9yIHRoZSBjdXJyZW50IHZpZXdlci4gKi9cbiAgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgbGFzdCByZWFkYmFjayBvZiB0aGUgZGlzcGxheWVkIGNvbXBvc2l0ZSAodGhlIHBpeGVsIHRvb2xzJyBzb3VyY2UpLiAqL1xuICBsYXN0UGl4ZWxzOiBQaXhlbERhdGEgfCBudWxsID0gbnVsbDtcbiAgLyoqIFZpc2libGUgd29ybGQgcmVjdCBjYXB0dXJlZCBBVCB0aGUgbGFzdCByZWFkYmFjayDigJQgbXVzdCBwYWlyIHdpdGggYGxhc3RQaXhlbHNgIHNvIHRoZSBwaXhlbFxuICAgKiAgdG9vbHMnIHJhdGlvcy9vcmlnaW4gbWF0Y2ggdGhlIG1hdHJpeCdzIGNhbWVyYSAodXNpbmcgdGhlIGxpdmUgcmVjdCBhZnRlciBhIHBhbi96b29tIHdvdWxkXG4gICAqICBtaXMtc2NhbGUgdGhlIHJlZ2lvbikuICovXG4gIGxhc3RQaXhlbHNSZWN0OiBXb3JsZFJlY3QgfCBudWxsID0gbnVsbDtcbiAgLyoqIEFjdGl2ZSB0b29scyB0aGF0IHJlYWQgdGhlIGRpc3BsYXllZCBwaXhlbHM7IGEgcGFuL3pvb20gcmUtcmVhZHMgdGhlbSBvbmx5IHdoaWxlIG5vbi1lbXB0eS4gKi9cbiAgcmVhZG9ubHkgcGl4ZWxUb29scyA9IG5ldyBTZXQ8Q2FudmFzVG9vbElkPigpO1xuICAvKiogVGhlIGNhbWVyYSBtb3ZlZCBzaW5jZSB7QGxpbmsgbGFzdFBpeGVsc30gd2FzIHJlYWQuICovXG4gIHBpeGVsc1N0YWxlID0gZmFsc2U7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEZWJvdW5jZWQgcmVhZGJhY2sgdGltZXIgKyBjYW1lcmEtY2hhbmdlIHVuc3Vic2NyaWJlIChrZWVwIGxhc3RQaXhlbHMgY3VycmVudCBmb3IgdG9vbHMpLiAqL1xuICBwcml2YXRlIHJlYWRiYWNrVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEZWJvdW5jZWQgdmlld3BvcnQgZW1pc3Npb24gZm9yIGEgY2FtZXJhIGNoYW5nZSB0aGF0IG5lZWRzIG5vIHBpeGVscy4gKi9cbiAgcHJpdmF0ZSB2aWV3cG9ydFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYU9mZjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBUb29sQnJpZGdlSG9zdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IFRvb2xCcmlkZ2VEZXBzLFxuICApIHtcbiAgICBjb25zdCB7IHJlZ2lvblN0b3JlIH0gPSBkZXBzO1xuICAgIC8vIFRoZSBwaXhlbCB0b29scyByZWFkIGRpc3BsYXllZCBwaXhlbHMgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIGFuZCBjb252ZXJ0XG4gICAgLy8gcG9pbnRlciBjb29yZHMgdmlhIHRoZSBuYXBhcmkgY2FtZXJhLCBtaXJyb3JpbmcgdGhlIE9TRCBob3N0LiBUaGlzIGJhY2tlbmQgb3ducyBpdHMgb3duIHRvb2xcbiAgICAvLyBpbnN0YW5jZXMgKFJULTIxKTsgdGhlIGhvc3QgcmVhZHMgbGl2ZSBzdGF0ZSwgc28gaXQgaXMgYnVpbHQgb25jZS5cbiAgICB0aGlzLnRvb2xIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gcmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvblN0b3JlLnNldFJlZ2lvbnMociksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuY2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiBob3N0LmZyYW1lSW5kZXgoKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IGhvc3QuaG9zdCgpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiBob3N0LmZpbGVOYW1lKCksXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiByZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCksXG4gICAgICBwaXhlbFRvRGF0YTogKHB4LCBweSkgPT4ge1xuICAgICAgICBjb25zdCByZWN0ID0gaG9zdC5ob3N0KCk/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB2aWV3ZXIgPSBob3N0LnZpZXdlcigpO1xuICAgICAgICBpZiAoIXZpZXdlciB8fCAhcmVjdCkgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICAgICAgICBjb25zdCBbeCwgeV0gPSB2aWV3ZXIuY2FudmFzVG9Xb3JsZChyZWN0LmxlZnQgKyBweCwgcmVjdC50b3AgKyBweSk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgIH0sXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gICAgdGhpcy5jYW52YXNUb29scyA9IGNyZWF0ZUNhbnZhc1Rvb2xNYW5hZ2VyKHRoaXMudG9vbEhvc3QsIHtcbiAgICAgIHdhbmRTZXJ2aWNlOiBkZXBzLndhbmRTZXJ2aWNlLFxuICAgICAgcmVnaW9uU3RvcmUsXG4gICAgICBzYW1Qb2ludDogZGVwcy5zYW1Qb2ludFRvb2wsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGludGVyYWN0aW9uIHN0YWNrIGV2ZXJ5IDJEIG1vZGUgbmVlZHM6IHRoZSByZWdpb24gb3ZlcmxheSAoZHJhdy9zZWxlY3QvZWRpdCksIHRoZSBwaXhlbFxuICAgKiB0b29scyB0aGF0IHJlYWQgYmFjayBkaXNwbGF5ZWQgcGl4ZWxzICh3YW5kLCBicnVzaCwgdmVydGV4IGVyYXNlciwgem9vbS10by1ib3gsIFNBTS9jZWxscG9zZSksXG4gICAqIGFuZCBhIGNhbWVyYSBob29rIHRoYXQga2VlcHMgdGhhdCByZWFkYmFjayBjdXJyZW50IGFzIHRoZSB2aWV3IHBhbnMvem9vbXMgYW5kIHRpbGVkIGxldmVsc1xuICAgKiBsb2FkLlxuICAgKlxuICAgKiBPbmUgY2FsbCBmb3IgYWxsIG9mIGl0IGJlY2F1c2UgZm9yZ2V0dGluZyBpdCBpcyBpbnZpc2libGU6IHRoZSB0b29sYmFyIGdhdGVzIGl0cyByZWdpb24gYnV0dG9uc1xuICAgKiBvbiAyRC12cy0zRCByYXRoZXIgdGhhbiBvbiBwbG90IHR5cGUsIHNvIGEgMkQgbW9kZSB0aGF0IHNraXBzIHRoaXMgc2hvd3MgZXZlcnkgdG9vbCBhbmQgc2lsZW50bHlcbiAgICogZG9lcyBub3RoaW5nLiBUaGF0IGlzIGV4YWN0bHkgd2hhdCBoYXBwZW5lZCB0byB0aGUgc3BhdGlhbCBhbmQgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIgbW9kZXMuXG4gICAqL1xuICBpbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCB2aWV3ZXIsIHRoaXMuZGVwcy5yZWdpb25TdG9yZSk7XG4gICAgdGhpcy5idWlsZENvb3JkaW5hdGVUcmFuc2Zvcm0oKTtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IHZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMub25WaWV3Q2hhbmdlZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpb24gZHJhd2luZyBmb3IgdGhlIDNEIGNsb3VkLlxuICAgKlxuICAgKiBSZXVzZXMge0BsaW5rIE5hcGFyaVJlZ2lvbk92ZXJsYXl9IHZlcmJhdGltIGJ5IGhhbmRpbmcgaXQgYSBTQ1JFRU4tU1BBQ0Ugdmlld2VyOiB0aGUgZHJhd25cbiAgICogc2hhcGUgaXMgYSBsYXNzbyBpbiBjYW52YXMgcGl4ZWxzLCBzbyBcIndvcmxkXCIgaXMgdGhlIGNhbnZhcyBhbmQgYm90aCB0cmFuc2Zvcm1zIGFyZSBpZGVudGl0eVxuICAgKiAoYmFyIHRoZSBjbGllbnTihpJjYW52YXMgb2Zmc2V0KS4gRXZlcnkgZXhpc3RpbmcgdG9vbCDigJQgcmVjdGFuZ2xlLCBwb2x5Z29uLCBmcmVlaGFuZCDigJQgdGhlcmVmb3JlXG4gICAqIHdvcmtzIGluIDNEIHdpdGggbm8gbmV3IGRyYXdpbmcgY29kZS5cbiAgICpcbiAgICogQSBzY3JlZW4tc3BhY2Ugc2hhcGUgc3RvcHMgbWVhbmluZyBhbnl0aGluZyB0aGUgbW9tZW50IHRoZSBjYW1lcmEgbW92ZXMsIHNvIGFuIG9yYml0IGNsZWFyc1xuICAgKiB0aGUgcmVnaW9ucyBkcmF3biBpbiB0aGlzIHZpZXcgKGFuZCBvbmx5IHRob3NlKS4gVGhlIFNFTEVDVElPTiB0aGV5IHByb2R1Y2VkIGlzIGtlcHQ6IHRoYXQgaXNcbiAgICogdGhlIGR1cmFibGUgYXJ0ZWZhY3QsIGFuZCB0aGUgaGlnaGxpZ2h0ZWQgcG9pbnRzIHN0YXkgaGlnaGxpZ2h0ZWQgZnJvbSBldmVyeSBhbmdsZS5cbiAgICovXG4gIGluc3RhbGwzZEludGVyYWN0aW9uKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVnaW9uU3RvcmUgfSA9IHRoaXMuZGVwcztcbiAgICAvLyBXb3JsZCBoZXJlIGlzIHRoZSBjYW52YXMsIG5vdCB0aGUgaW1hZ2U6IG5vIHJlZ2lvbiBzb3VyY2UgdG8gZHJhdy5cbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCB0aGlzLnNjcmVlblNwYWNlVmlld2VyKHZpZXdlciksIHJlZ2lvblN0b3JlLCB7XG4gICAgICByZWdpb25Tb3VyY2U6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMuYnVpbGRDb29yZGluYXRlVHJhbnNmb3JtKCk7XG4gICAgLy8gUmVnaW9ucyBhbHJlYWR5IGluIHRoZSBzaGFyZWQgc3RvcmUgd2hlbiB0aGUgM0QgdmlldyBtb3VudGVkICh0aGUgaW1hZ2UncyBvd24sIHNheSkgYXJlXG4gICAgLy8gbm90IHNjcmVlbi1zcGFjZSBzaGFwZXMgYW5kIG11c3Qgc3Vydml2ZSBhbiBvcmJpdDsgb25seSB0aG9zZSBkcmF3biBoZXJlIGFyZSBjbGVhcmVkLlxuICAgIC8vIChObyBtaWQtZ2VzdHVyZSBjYXNlIHRvIGd1YXJkOiB0aGUgb3ZlcmxheSBkaXNhYmxlcyB0aGUgY2FtZXJhIGNvbnRyb2xzIHdoaWxlIGRyYXdpbmcuKVxuICAgIGNvbnN0IGZvcmVpZ24gPSBuZXcgU2V0KHJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IHZpZXdlci5jYW1lcmEzZC5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4ge1xuICAgICAgY29uc3QgZHJhd24gPSByZWdpb25TdG9yZVxuICAgICAgICAuZ2V0UmVnaW9ucygpXG4gICAgICAgIC5maWx0ZXIoKHIpID0+ICFmb3JlaWduLmhhcyhyLmlkKSlcbiAgICAgICAgLm1hcCgocikgPT4gci5pZCk7XG4gICAgICAvLyBOb3QgYW4gZWRpdCBvZiB0aGUgdXNlcidzOiBubyB1bmRvIHN0ZXAgKE5BUEFSSS1TVkMtMTEpLlxuICAgICAgaWYgKGRyYXduLmxlbmd0aCkgdGhpcy5ob3N0LmluWm9uZSgoKSA9PiByZWdpb25TdG9yZS5yZW1vdmVSZWdpb25zKGRyYXduLCB7IHJlY29yZFVuZG86IGZhbHNlIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIE92ZXJsYXlWaWV3ZXJ9IHRoZSAzRCByZWdpb24gb3ZlcmxheSBkcmF3cyB0aHJvdWdoOiBcIndvcmxkXCIgaXMgdGhlIGNhbnZhcywgaW5cbiAgICogY2FudmFzLWxvY2FsIENTUyBwaXhlbHMuIEEgcG9pbnRlciBhcnJpdmVzIGluIENMSUVOVCBwaXhlbHMsIHNvIGBjYW52YXNUb1dvcmxkYCBzdWJ0cmFjdHMgdGhlXG4gICAqIGNhbnZhcydzIGNsaWVudCBvZmZzZXQgKHdpdGhvdXQgaXQgdGhlIGxhc3NvIHdhcyBkcmF3biBvZmZzZXQgZnJvbSB0aGUgY3Vyc29yIHdoZW5ldmVyIHRoZVxuICAgKiBjYW52YXMgd2FzIG5vdCBhdCB0aGUgcGFnZSBvcmlnaW4pOyBkcmF3aW5nIGlzIHRoZW4gdGhlIGlkZW50aXR5LCB3aXRoIG5vIGxheW91dCByZWFkLlxuICAgKi9cbiAgc2NyZWVuU3BhY2VWaWV3ZXIodmlld2VyOiBWaWV3ZXIpOiBPdmVybGF5Vmlld2VyIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2FudmFzVG9Xb3JsZDogKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmhvc3QuY2FudmFzKCk/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4gciA/IFtjbGllbnRYIC0gci5sZWZ0LCBjbGllbnRZIC0gci50b3BdIDogW2NsaWVudFgsIGNsaWVudFldO1xuICAgICAgfSxcbiAgICAgIGNhbnZhc1RyYW5zZm9ybTogKCkgPT4gSURFTlRJVFlfQUZGSU5FLFxuICAgICAgc2V0Q29udHJvbHNFbmFibGVkOiAoZW5hYmxlZDogYm9vbGVhbikgPT4gdmlld2VyLnNldENvbnRyb2xzRW5hYmxlZChlbmFibGVkKSxcbiAgICAgIGNhbWVyYTogdmlld2VyLmNhbWVyYTNkLFxuICAgIH07XG4gIH1cblxuICAvKiogRW5kIHRoZSBzY2VuZSdzIGludGVyYWN0aW9uOiB0aGUgb3ZlcmxheSwgdGhlIGNhbWVyYSBob29rLCB0aGUgcGVuZGluZyB0aW1lcnMgYW5kIHRoZVxuICAgKiAgcGl4ZWxzIHJlYWQgZnJvbSB0aGUgb2xkIGNhbnZhcy4gVGhlIGFybWVkIHRvb2wgYW5kIHRoZSBwaXhlbC10b29sIHNldCBwZXJzaXN0LiAqL1xuICB0ZWFyZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXk/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3cG9ydFRpbWVyICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdwb3J0VGltZXIpO1xuICAgICAgdGhpcy52aWV3cG9ydFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5waXhlbHNTdGFsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2FtZXJhT2ZmPy4oKTtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IG51bGw7XG4gICAgdGhpcy5sYXN0UGl4ZWxzID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBSZWFkIHRoZSBkaXNwbGF5ZWQgY29tcG9zaXRlIGludG8gYGxhc3RQaXhlbHNgICh0aGUgcGl4ZWwtdG9vbHMnIHNvdXJjZSkgKyBlbWl0IHRoZSBjbGFtcGVkXG4gICAqICB2aXNpYmxlIHJlZ2lvbi4gQSBmcmVzaCBQaXhlbERhdGEgb2JqZWN0IG1lYW5zIGNhY2hlZEltYWdlRGF0YSgpIHJlYnVpbGRzIGF1dG9tYXRpY2FsbHkuICovXG4gIGFzeW5jIHJ1blJlYWRiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLmhvc3Qudmlld2VyKCk7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHB4ID0gYXdhaXQgdi5yZWFkRGlzcGxheWVkUGl4ZWxzKCk7XG4gICAgICBpZiAodGhpcy5ob3N0LnZpZXdlcigpICE9PSB2KSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gdi52aXNpYmxlV29ybGRSZWN0KCk7IC8vIGNhcHR1cmUgV0lUSCB0aGUgcGl4ZWxzIChzYW1lIGNhbWVyYSlcbiAgICAgIHRoaXMubGFzdFBpeGVscyA9IHB4O1xuICAgICAgdGhpcy5sYXN0UGl4ZWxzUmVjdCA9IHJlY3Q7XG4gICAgICB0aGlzLnBpeGVsc1N0YWxlID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXRWaWV3cG9ydChyZWN0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHJlYWRiYWNrIHVuYXZhaWxhYmxlIChubyBkZXZpY2UgeWV0LCBvciBpdCB3YXMgbG9zdCk6IHRoZSB0b29scyBrZWVwIHRoZSBsYXN0IHBpeGVscyAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIHJlYWRiYWNrIG9uIHRoZSBuZXh0IGZyYW1lIOKAlCBhZnRlciBhIHBsb3Qgb3IgYSBzY2VuZSBjaGFuZ2UgZHJldyBzb21ldGhpbmcgbmV3LiAqL1xuICBzY2hlZHVsZVJlYWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ob3N0LnZpZXdlcigpKSByZXR1cm47XG4gICAgdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCkpO1xuICAgICAgZWxzZSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy5ydW5SZWFkYmFjaygpLCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEZWJvdW5jZWQgcmVhZGJhY2sg4oCUIGFybWVkIG9uIGNhbWVyYSBjaGFuZ2VzIHdoaWxlIGEgcGl4ZWwgdG9vbCBpcyBhY3RpdmUsIHNvIGBsYXN0UGl4ZWxzYFxuICAgKiAgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXcgYWZ0ZXIgYSBwYW4vem9vbSBzZXR0bGVzLCB3aGljaCB0aGUgb24tY2FudmFzIHBpeGVsIHRvb2xzXG4gICAqICAod2FuZC9icnVzaC9TQU0pIHJlYWQgc3luY2hyb25vdXNseS4gQ29hbGVzY2VzIHJhcGlkIGNoYW5nZXMuICovXG4gIGFybVJlYWRiYWNrKGRlbGF5TXMgPSBSRUFEQkFDS19ERUJPVU5DRV9NUyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgdGhpcy5yZWFkYmFja1RpbWVyID0gdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWFkYmFja1RpbWVyID0gbnVsbDtcbiAgICAgICAgdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCk7XG4gICAgICB9LCBkZWxheU1zKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEVtaXQgdGhlIHZpc2libGUgcmVnaW9uLCBjbGFtcGVkIHRvIHRoZSBpbWFnZS4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnQocmVjdDogV29ybGRSZWN0KTogdm9pZCB7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuaG9zdC5pbWFnZVNpemUoKTtcbiAgICBpZiAoIXNpemUgfHwgIXJlY3QpIHJldHVybjtcbiAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2l6ZS53aWR0aCwgcmVjdC54KSk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0LCByZWN0LnkpKTtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgubWluKHNpemUud2lkdGggLSB4LCByZWN0LndpZHRoKSk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS5oZWlnaHQgLSB5LCByZWN0LmhlaWdodCkpO1xuICAgIHRoaXMuaG9zdC52aWV3cG9ydENoYW5nZWQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgMkQgcGFuL3pvb20uIFRoZSBmdWxsLWNhbnZhcyBHUFUgcmVhZGJhY2sgaXMgcGFpZCBmb3Igb25seSB3aGlsZSBhIHBpeGVsIHRvb2wgcmVhZHMgaXRcbiAgICogKHtAbGluayBwaXhlbFRvb2xzfSk7IG90aGVyd2lzZSBvbmx5IHRoZSB2aWV3cG9ydCByZWN0IGlzIGVtaXR0ZWQgKGRlYm91bmNlZCksIGFuZCB0aGUgcGl4ZWxzXG4gICAqIGFyZSBtYXJrZWQgc3RhbGUgZm9yIHdob2V2ZXIgbmV4dCBuZWVkcyB0aGVtIChhIHRvb2wgYXJtcyBhIGZyZXNoIHJlYWRiYWNrIGFzIGl0IGFjdGl2YXRlcykuXG4gICAqL1xuICBwcml2YXRlIG9uVmlld0NoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5waXhlbHNTdGFsZSA9IHRydWU7XG4gICAgaWYgKHRoaXMucGl4ZWxUb29scy5zaXplID4gMCkge1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygpOyAvLyBlbWl0cyB0aGUgdmlld3BvcnQgd2l0aCB0aGUgcGl4ZWxzXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdwb3J0VGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMudmlld3BvcnRUaW1lcik7XG4gICAgdGhpcy52aWV3cG9ydFRpbWVyID0gdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy52aWV3cG9ydFRpbWVyID0gbnVsbDtcbiAgICAgICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgICAgICBpZiAodmlld2VyKSB0aGlzLmVtaXRWaWV3cG9ydCh2aWV3ZXIudmlzaWJsZVdvcmxkUmVjdCgpKTtcbiAgICAgIH0sIFJFQURCQUNLX0RFQk9VTkNFX01TKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBwaXhlbCB0b29scycgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gZm9yIHRoZSBjdXJyZW50IHZpZXdlci4gKi9cbiAgcHJpdmF0ZSBidWlsZENvb3JkaW5hdGVUcmFuc2Zvcm0oKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICghdmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG5ldyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgdmlld2VyLFxuICAgICAgKCkgPT4gISF0aGlzLmhvc3Qudmlld2VyKCkgJiYgKHRoaXMuaG9zdC5pbWFnZVNpemUoKT8ud2lkdGggPz8gMCkgPiAwLFxuICAgICk7XG4gIH1cblxuICAvKiogWm9vbS9wYW4gdGhlIGNhbWVyYSB0byBmaXQgYSBkYXRhLXNwYWNlIHJlY3RhbmdsZSBgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dYC4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuaG9zdC5jYW52YXMoKTtcbiAgICBpZiAoIXYgfHwgIWNhbnZhcyB8fCBjb29yZGluYXRlcy5sZW5ndGggPCA0KSByZXR1cm47XG4gICAgY29uc3QgW3hNaW4sIHhNYXgsIHlBLCB5Ql0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4MCA9IE1hdGgubWluKHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoeE1pbiwgeE1heCk7XG4gICAgY29uc3QgeTAgPSBNYXRoLm1pbih5QSwgeUIpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoeUEsIHlCKTtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoMSwgeDEgLSB4MCk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIHkxIC0geTApO1xuICAgIGNvbnN0IHZ3ID0gY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgdmggPSBjYW52YXMuY2xpZW50SGVpZ2h0IHx8IGg7XG4gICAgdi5jYW1lcmEuY2VudGVyID0gWyh4MCArIHgxKSAvIDIsICh5MCArIHkxKSAvIDJdO1xuICAgIHYuY2FtZXJhLnpvb20gPSBNYXRoLm1pbih2dyAvIHcsIHZoIC8gaCk7XG4gICAgdi5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQnVpbGQgQ2FjaGVkSW1hZ2VEYXRhIGZyb20gdGhlIG1vc3QgcmVjZW50IHJlYWRiYWNrIOKAlCBpdHMgUkdCQSBkZXZpY2UgcGl4ZWxzIGFyZSB0aGUgZnJhbWVcbiAgICogIGFzLWlzIChwYWNrZWQsIG5vIHBlci1waXhlbCBhcnJheXM6IE5BUEFSSS1TVkMtMjMpIOKAlCB3aXRoIHJhdGlvcy9vcmlnaW4gbWFwcGluZyBpbWFnZSBjb29yZHNcbiAgICogIOKGlCByZWFkYmFjayBwaXhlbHMuIENhY2hlZCB1bnRpbCB0aGUgcmVhZGJhY2sgY2hhbmdlcy4gKi9cbiAgY2FjaGVkSW1hZ2VEYXRhKCk6IENhY2hlZEltYWdlRGF0YSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXB4IHx8ICF2aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNhY2hlZEltYWdlICYmIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPT09IHB4KSByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgICBjb25zdCB3ID0gcHgud2lkdGg7XG4gICAgY29uc3QgaCA9IHB4LmhlaWdodDtcbiAgICAvLyBVc2UgdGhlIHJlY3QgY2FwdHVyZWQgV0lUSCB0aGlzIHJlYWRiYWNrIChub3QgdGhlIGxpdmUgb25lKSBzbyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZVxuICAgIC8vIG1hdHJpeCdzIGNhbWVyYSDigJQgb3RoZXJ3aXNlIGEgcGFuL3pvb20gc2luY2UgdGhlIHJlYWRiYWNrIG1pcy1zY2FsZXMgdGhlIHRyYWNlZCByZWdpb24uXG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGFzdFBpeGVsc1JlY3QgPz8gdmlld2VyLnZpc2libGVXb3JsZFJlY3QoKTtcbiAgICB0aGlzLmNhY2hlZEltYWdlID0ge1xuICAgICAgZnJhbWVzOiBbcGFja2VkRnJhbWUocHguZGF0YSwgdywgaCldLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyZWN0LndpZHRoIC8gdywgcmVjdC5oZWlnaHQgLyBoXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIG9yaWdpblg6IHJlY3QueCxcbiAgICAgIG9yaWdpblk6IHJlY3QueSxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBweDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSdzIGBiZWZvcmVUb29sQ2hhbmdlYDogdHJhY2sgdGhlIHBpeGVsLXJlYWRpbmcgdG9vbCAoc2VlIHtAbGluayBvblZpZXdDaGFuZ2VkfSksXG4gICAqIGdhdGUgdGhlIGNhbWVyYSwgYW5kIGFybSBhIGZyZXNoIHJlYWRiYWNrIGZvciBhIHBpeGVsIHRvb2wuIE5vdGhpbmcgaXMgYXJtZWQgd2l0aG91dCBhXG4gICAqIHZpZXdlciwgbm9yIGEgcGl4ZWwgdG9vbCBiZWZvcmUgYSBwbG90IGJ1aWx0IGl0cyBjb29yZGluYXRlIHRyYW5zZm9ybS5cbiAgICpcbiAgICogQ29udHJvbCBnYXRpbmc6IGEgdG9vbCB0aGF0IEFDVElWQVRFUyBkaXNhYmxlcyB0aGUgY2FtZXJhIGNvbnRyb2xzOyBkZWFjdGl2YXRpb24gaXMgYSBuby1vcFxuICAgKiBiZWNhdXNlIHRoZSBob3N0IGFsd2F5cyBjYWxscyB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIEZJUlNUIGluIGVhY2ggdG9nZ2xlICh3aGljaCBzZXRzXG4gICAqIHRoZSBiYXNlbGluZSBlbmFibGVkL2Rpc2FibGVkKSwgc28gcmUtZW5hYmxpbmcgaGVyZSB3b3VsZCBmaWdodCBhIGZyZXNobHktYWN0aXZhdGVkIGRyYXcgbW9kZS5cbiAgICovXG4gIGJlZm9yZVRvb2xDaGFuZ2UobmV4dDogQ2FudmFzVG9vbElkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucGl4ZWxUb29scy5jbGVhcigpO1xuICAgIGlmIChuZXh0ICE9PSBudWxsICYmIG5leHQgIT09ICd6b29tVG9Cb3gnKSB0aGlzLnBpeGVsVG9vbHMuYWRkKG5leHQpO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXZpZXdlcikgcmV0dXJuIGZhbHNlOyAvLyBubyBwbG90IHlldCDihpIgbm90aGluZyB0byBkcml2ZVxuICAgIGlmIChuZXh0ID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobmV4dCAhPT0gJ3pvb21Ub0JveCcgJiYgIXRoaXMuY29vcmRUcmFuc2Zvcm0pIHJldHVybiBmYWxzZTtcbiAgICB2aWV3ZXIuc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICBpZiAobmV4dCA9PT0gJ3pvb21Ub0JveCcpIHJldHVybiB0cnVlO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIC8vIFRoZSBlcmFzZXIgb25seSBjb252ZXJ0cyBjb29yZGluYXRlcyB3aXRoIHRoZSByZWFkYmFjaywgc28gYSBjdXJyZW50IG9uZSB3aWxsIGRvLlxuICAgIGlmIChuZXh0ICE9PSAnZXJhc2VWZXJ0ZXgnIHx8IHRoaXMucGl4ZWxzU3RhbGUpIHRoaXMuYXJtUmVhZGJhY2soMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogU0FNIG92ZXIgdGhlIGRyYXduIHJlY3RhbmdsZXMg4oCUIGEgc2VydmVyIHJvdW5kLXRyaXAgdGhhdCByZWFkcyB0aGUgcmVjdGFuZ2xlcyBmcm9tIHRoZVxuICAgKiAgUmVnaW9uU3RvcmUgYW5kIHRoZSBpbWFnZSBmcm9tIGEgZnJlc2ggcmVhZGJhY2suIFJldHVybnMgdGhlIHJlZ2lvbnMgYWRkZWQuICovXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLmhvc3Qudmlld2VyKCkgfHwgIXRoaXMuY29vcmRUcmFuc2Zvcm0pIHJldHVybiAwO1xuICAgIGF3YWl0IHRoaXMucnVuUmVhZGJhY2soKTsgLy8gdGhlIFNBTSBlbWJlZGRpbmcgc2FtcGxlcyB0aGUgY3VycmVudGx5LWRpc3BsYXllZCBpbWFnZVxuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmRlcHMuc2FtVG9vbC5zZWdtZW50Qm94ZXModGhpcy50b29sSG9zdCk7XG4gIH1cblxuICAvKiogQ2VsbHBvc2Ugb3ZlciB0aGUgZHJhd24gcmVjdGFuZ2xlcyAoc2VlIHtAbGluayBzZWdtZW50UmVjdGFuZ2xlc30pLiAqL1xuICBhc3luYyBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgc2VnbWVudGVyID0gdGhpcy5kZXBzLmNlbGxTZWdtZW50ZXI7XG4gICAgaWYgKCF0aGlzLmhvc3Qudmlld2VyKCkgfHwgIXRoaXMuY29vcmRUcmFuc2Zvcm0gfHwgIXNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmRlcHMuY2VsbFNlZ21lbnRUb29sLnNlZ21lbnRCb3hlcyh0aGlzLnRvb2xIb3N0LCBzZWdtZW50ZXIpO1xuICB9XG59XG4iXX0=
|
|
362
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXRvb2wtYnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS10b29sLWJyaWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHM0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBS2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBaUIsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVV4RCwrRkFBK0Y7QUFDL0YsTUFBTSxPQUFPLHlCQUF5QjtJQUNwQyxZQUNtQixNQUdoQixFQUNnQixLQUFvQjtRQUpwQixXQUFNLEdBQU4sTUFBTSxDQUd0QjtRQUNnQixVQUFLLEdBQUwsS0FBSyxDQUFlO0lBQ3BDLENBQUM7SUFDSixZQUFZLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDM0MsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0QsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsVUFBa0I7UUFDbkMsT0FBTyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsd0JBQXdCO0lBQ3ZFLENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBNkJEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQTRCM0IsWUFDbUIsSUFBb0IsRUFDcEIsSUFBb0I7UUFEcEIsU0FBSSxHQUFKLElBQUksQ0FBZ0I7UUFDcEIsU0FBSSxHQUFKLElBQUksQ0FBZ0I7UUF6QnZDLGdGQUFnRjtRQUNoRixrQkFBYSxHQUErQixJQUFJLENBQUM7UUFDakQseUVBQXlFO1FBQ3pFLG1CQUFjLEdBQWdDLElBQUksQ0FBQztRQUNuRCw4RUFBOEU7UUFDOUUsZUFBVSxHQUFxQixJQUFJLENBQUM7UUFDcEM7O3FDQUU2QjtRQUM3QixtQkFBYyxHQUFxQixJQUFJLENBQUM7UUFDeEMsa0dBQWtHO1FBQ3pGLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBZ0IsQ0FBQztRQUM5QywwREFBMEQ7UUFDMUQsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsNkZBQTZGO1FBQ3JGLGdCQUFXLEdBQTJCLElBQUksQ0FBQztRQUMzQyxzQkFBaUIsR0FBcUIsSUFBSSxDQUFDO1FBQ25ELGdHQUFnRztRQUN4RixrQkFBYSxHQUF5QyxJQUFJLENBQUM7UUFDbkUsNEVBQTRFO1FBQ3BFLGtCQUFhLEdBQXlDLElBQUksQ0FBQztRQUMzRCxjQUFTLEdBQXdCLElBQUksQ0FBQztRQU01QyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzdCLHlGQUF5RjtRQUN6RiwrRkFBK0Y7UUFDL0YscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRTtZQUMxQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzVDLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDaEQsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM1QyxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3RDLHNCQUFzQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFzQztZQUN6RSxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQyxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTtZQUNoRCxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQ3RCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJO29CQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ25FLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEIsQ0FBQztZQUNELGNBQWMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7U0FDeEQsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN4RCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsV0FBVztZQUNYLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWTtTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsb0JBQW9CLENBQUMsTUFBYyxFQUFFLElBQWlCO1FBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsb0JBQW9CLENBQUMsTUFBYyxFQUFFLElBQWlCO1FBQ3BELE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2xDLHFFQUFxRTtRQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFtQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFO1lBQ3pGLFlBQVksRUFBRSxLQUFLO1lBQ25CLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLDBGQUEwRjtRQUMxRixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGNBQWM7UUFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDckIsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksS0FBSyxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUJBQWlCLENBQUMsTUFBYztRQUM5QixPQUFPO1lBQ0wsYUFBYSxFQUFFLENBQUMsT0FBZSxFQUFFLE9BQWUsRUFBRSxFQUFFO2dCQUNsRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3RELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFDRCxlQUFlLEVBQUUsR0FBRyxFQUFFLENBQUMsZUFBZTtZQUN0QyxrQkFBa0IsRUFBRSxDQUFDLE9BQWdCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7WUFDNUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1NBQ3hCLENBQUM7SUFDSixDQUFDO0lBRUQ7MEZBQ3NGO0lBQ3RGLFFBQVE7UUFDTiw0RkFBNEY7UUFDNUYsd0ZBQXdGO1FBQ3hGLCtFQUErRTtRQUMvRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQixZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7WUFDL0IsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVEO21HQUMrRjtJQUMvRixLQUFLLENBQUMsV0FBVztRQUNmLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztnQkFBRSxPQUFPO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsd0NBQXdDO1lBQzNFLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLDBGQUEwRjtRQUM1RixDQUFDO0lBQ0gsQ0FBQztJQUVELHdGQUF3RjtJQUN4RixnQkFBZ0I7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUN6QixJQUFJLE9BQU8scUJBQXFCLEtBQUssVUFBVTtnQkFBRSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDOztnQkFDakcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzt3RUFFb0U7SUFDcEUsV0FBVyxDQUFDLE9BQU8sR0FBRyxvQkFBb0I7UUFDeEMsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUk7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQzlDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQixDQUFDLEVBQUUsT0FBTyxDQUFDLENBQ1osQ0FBQztJQUNKLENBQUM7SUFFRCxxREFBcUQ7SUFDN0MsWUFBWSxDQUFDLElBQWU7UUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssYUFBYTtRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLHFDQUFxQztZQUN6RCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJO1lBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUM5QyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxJQUFJLE1BQU07Z0JBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUN6QixDQUFDO0lBQ0osQ0FBQztJQUVELDBFQUEwRTtJQUNsRSx3QkFBd0I7UUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDcEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLHlCQUF5QixDQUNqRCxNQUFNLEVBQ04sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQ3RFLENBQUM7SUFDSixDQUFDO0lBRUQsb0ZBQW9GO0lBQzVFLGNBQWMsQ0FBQyxXQUFxQjtRQUMxQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxPQUFPO1FBQ3BELE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMvQixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUNuQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O2dFQUU0RDtJQUM1RCxlQUFlO1FBQ2IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQy9FLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDbkIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNwQix5RkFBeUY7UUFDekYsMEZBQTBGO1FBQzFGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUQsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQixNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEMsS0FBSyxFQUFFLENBQUM7WUFDUixNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNoQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsZ0JBQWdCLENBQUMsSUFBeUI7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFdBQVc7WUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxpQ0FBaUM7UUFDNUQsSUFBSSxJQUFJLEtBQUssSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9CLElBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDL0QsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLElBQUksSUFBSSxLQUFLLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLG9GQUFvRjtRQUNwRixJQUFJLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEO3NGQUNrRjtJQUNsRixLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxRCxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLDBEQUEwRDtRQUNwRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLEtBQUssQ0FBQyx5QkFBeUI7UUFDN0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFZpZXdlciB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IENhbnZhc1Rvb2xJZCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IElDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Nvb3JkaW5hdGUtdHJhbnNmb3JtLmNvbnRyYWN0JztcbmltcG9ydCB7IFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSURFTlRJVFlfQUZGSU5FIH0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlcic7XG5pbXBvcnQgeyBDYWNoZWRJbWFnZURhdGEsIENhbnZhc1Rvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sLWtpdC9jYW52YXMtdG9vbCc7XG5pbXBvcnQgeyBDYW52YXNUb29sTWFuYWdlciB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvdG9vbC1raXQvY2FudmFzLXRvb2wtbWFuYWdlcic7XG5pbXBvcnQgeyBjcmVhdGVDYW52YXNUb29sTWFuYWdlciB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvY2FudmFzLXRvb2xzJztcbmltcG9ydCB7IHBhY2tlZEZyYW1lIH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sLWtpdC9mcmFtZS1waXhlbHMnO1xuaW1wb3J0IHsgV2FuZFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlSZWdpb25PdmVybGF5LCBPdmVybGF5Vmlld2VyIH0gZnJvbSAnLi9uYXBhcmktcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgUkVBREJBQ0tfREVCT1VOQ0VfTVMgfSBmcm9tICcuL25hcGFyaS1oZWxwZXJzJztcblxuLyoqIEEgd29ybGQtc3BhY2UgcmVjdGFuZ2xlICh4LCB5ID0gdG9wLWxlZnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JsZFJlY3Qge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBJQ29vcmRpbmF0ZVRyYW5zZm9ybSBvdmVyIHRoZSBuYXBhcmkgY2FtZXJhOiBwb2ludGVyIGNsaWVudCBjb29yZHMg4oaUIGltYWdlL3dvcmxkIGNvb3Jkcy4gKi9cbmV4cG9ydCBjbGFzcyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtIGltcGxlbWVudHMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjoge1xuICAgICAgY2FudmFzVG9Xb3JsZChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICByZWFkb25seSBjYW1lcmE6IHsgem9vbTogbnVtYmVyIH07XG4gICAgfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWR5OiAoKSA9PiBib29sZWFuLFxuICApIHt9XG4gIGNsaWVudFRvRGF0YShjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cbiAgZGF0YUxlbmd0aFRvU2NyZWVuKGRhdGFMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGFMZW5ndGggKiB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTsgLy8gQ1NTIHB4IHBlciB3b3JsZCB1bml0XG4gIH1cbiAgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG59XG5cbi8qKiBXaGF0IHRoZSBicmlkZ2UgcmVhZHMgZnJvbSB0aGUgc2VydmljZTogdGhlIGxpdmUgdmlld2VyIGFuZCBpdHMgRE9NLCB0aGUgaW1hZ2Ugb24gc2NyZWVuLCBhbmRcbiAqICB3aGVyZSB0aGUgdmlld3BvcnQgYW5kIHpvbmUtY3Jvc3Npbmcgb3V0cHV0IGdvLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sQnJpZGdlSG9zdCB7XG4gIHZpZXdlcigpOiBWaWV3ZXIgfCBudWxsO1xuICBob3N0KCk6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgY2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgLyoqIFRoZSBpbWFnZSdzIGZ1bGwtcmVzb2x1dGlvbiBzaXplLCBvciBudWxsIGJlZm9yZSBvbmUgaXMgZHJhd24uICovXG4gIGltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsO1xuICBmcmFtZUluZGV4KCk6IG51bWJlcjtcbiAgZmlsZU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIHZpc2libGUgcmVnaW9uIGNoYW5nZWQgKGNsYW1wZWQgdG8gdGhlIGltYWdlKTsgY2FsbGVkIG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZS4gKi9cbiAgdmlld3BvcnRDaGFuZ2VkKHJlY3Q6IFdvcmxkUmVjdCk6IHZvaWQ7XG4gIC8qKiBSdW4gYGZuYCBvdXRzaWRlIC8gaW5zaWRlIHRoZSBBbmd1bGFyIHpvbmUuICovXG4gIG91dHNpZGVab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbiAgaW5ab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbn1cblxuLyoqIFRoZSBzZXJ2aWNlcyB0aGUgcGl4ZWwgdG9vbHMgYW5kIHNlZ21lbnRhdGlvbiBydW5zIG5lZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xCcmlkZ2VEZXBzIHtcbiAgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlO1xuICB3YW5kU2VydmljZTogV2FuZFNlcnZpY2U7XG4gIHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlO1xuICBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2U7XG4gIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZTtcbiAgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBuYXBhcmkgYmFja2VuZCdzIHNpZGUgb2YgdGhlIHNoYXJlZCBjYW52YXMgdG9vbHMgKHJldmlldyBBcHBlbmRpeCBCLCBzdGVwIDQpOiB0aGUgcmVnaW9uXG4gKiBvdmVybGF5LCB0aGUge0BsaW5rIENhbnZhc1Rvb2xNYW5hZ2VyfSBhbmQgaXRzIGhvc3QsIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSwgYW5kIHRoZVxuICogZGlzcGxheWVkLXBpeGVsIHJlYWRiYWNrIHRoZSB3YW5kLCBicnVzaCwgZXJhc2VyIGFuZCBTQU0vY2VsbHBvc2UgcmVhZCDigJQga2VwdCBjdXJyZW50IGFzIHRoZVxuICogY2FtZXJhIG1vdmVzLCBidXQgb25seSBwYWlkIGZvciB3aGlsZSBhIHBpeGVsIHRvb2wgbmVlZHMgaXQgKE5BUEFSSS1TVkMtMjYpLlxuICpcbiAqIE9uZSBwZXIgc2VydmljZTsge0BsaW5rIHRlYXJkb3dufSBlbmRzIGEgc2NlbmUncyBpbnRlcmFjdGlvbiAob3ZlcmxheSwgY2FtZXJhIGhvb2ssIHRpbWVycyxcbiAqIHBpeGVscykgYW5kIGFuIGBpbnN0YWxs4oCmSW50ZXJhY3Rpb25gIHN0YXJ0cyB0aGUgbmV4dCBvbmUncy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5hcGFyaVRvb2xCcmlkZ2Uge1xuICAvKiogV2hhdCB0aGlzIGJhY2tlbmQncyBjYW52YXMgdG9vbHMgcmVhZCBhbmQgd3JpdGUgKG9uZSBob3N0IGZvciBldmVyeSB0b29sKS4gKi9cbiAgcmVhZG9ubHkgdG9vbEhvc3Q6IENhbnZhc1Rvb2xIb3N0O1xuICAvKiogVGhpcyBiYWNrZW5kJ3Mgb3duIHdhbmQsIGJydXNoLCBlcmFzZXIsIHpvb20tdG8tYm94IGFuZCBTQU0gcG9pbnQgdG9vbHMuICovXG4gIHJlYWRvbmx5IGNhbnZhc1Rvb2xzOiBDYW52YXNUb29sTWFuYWdlcjtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IChudWxsIHVudGlsIGEgMkQvM0QgaW50ZXJhY3Rpb24gaXMgaW5zdGFsbGVkKS4gKi9cbiAgcmVnaW9uT3ZlcmxheTogTmFwYXJpUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHBpeGVsIHRvb2xzJyBwb2ludGVyIOKGlCB3b3JsZCB0cmFuc2Zvcm0gZm9yIHRoZSBjdXJyZW50IHZpZXdlci4gKi9cbiAgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgbGFzdCByZWFkYmFjayBvZiB0aGUgZGlzcGxheWVkIGNvbXBvc2l0ZSAodGhlIHBpeGVsIHRvb2xzJyBzb3VyY2UpLiAqL1xuICBsYXN0UGl4ZWxzOiBQaXhlbERhdGEgfCBudWxsID0gbnVsbDtcbiAgLyoqIFZpc2libGUgd29ybGQgcmVjdCBjYXB0dXJlZCBBVCB0aGUgbGFzdCByZWFkYmFjayDigJQgbXVzdCBwYWlyIHdpdGggYGxhc3RQaXhlbHNgIHNvIHRoZSBwaXhlbFxuICAgKiAgdG9vbHMnIHJhdGlvcy9vcmlnaW4gbWF0Y2ggdGhlIG1hdHJpeCdzIGNhbWVyYSAodXNpbmcgdGhlIGxpdmUgcmVjdCBhZnRlciBhIHBhbi96b29tIHdvdWxkXG4gICAqICBtaXMtc2NhbGUgdGhlIHJlZ2lvbikuICovXG4gIGxhc3RQaXhlbHNSZWN0OiBXb3JsZFJlY3QgfCBudWxsID0gbnVsbDtcbiAgLyoqIEFjdGl2ZSB0b29scyB0aGF0IHJlYWQgdGhlIGRpc3BsYXllZCBwaXhlbHM7IGEgcGFuL3pvb20gcmUtcmVhZHMgdGhlbSBvbmx5IHdoaWxlIG5vbi1lbXB0eS4gKi9cbiAgcmVhZG9ubHkgcGl4ZWxUb29scyA9IG5ldyBTZXQ8Q2FudmFzVG9vbElkPigpO1xuICAvKiogVGhlIGNhbWVyYSBtb3ZlZCBzaW5jZSB7QGxpbmsgbGFzdFBpeGVsc30gd2FzIHJlYWQuICovXG4gIHBpeGVsc1N0YWxlID0gZmFsc2U7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEZWJvdW5jZWQgcmVhZGJhY2sgdGltZXIgKyBjYW1lcmEtY2hhbmdlIHVuc3Vic2NyaWJlIChrZWVwIGxhc3RQaXhlbHMgY3VycmVudCBmb3IgdG9vbHMpLiAqL1xuICBwcml2YXRlIHJlYWRiYWNrVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEZWJvdW5jZWQgdmlld3BvcnQgZW1pc3Npb24gZm9yIGEgY2FtZXJhIGNoYW5nZSB0aGF0IG5lZWRzIG5vIHBpeGVscy4gKi9cbiAgcHJpdmF0ZSB2aWV3cG9ydFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYU9mZjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBUb29sQnJpZGdlSG9zdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IFRvb2xCcmlkZ2VEZXBzLFxuICApIHtcbiAgICBjb25zdCB7IHJlZ2lvblN0b3JlIH0gPSBkZXBzO1xuICAgIC8vIFRoZSBwaXhlbCB0b29scyByZWFkIGRpc3BsYXllZCBwaXhlbHMgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIGFuZCBjb252ZXJ0XG4gICAgLy8gcG9pbnRlciBjb29yZHMgdmlhIHRoZSBuYXBhcmkgY2FtZXJhLCBtaXJyb3JpbmcgdGhlIE9TRCBob3N0LiBUaGlzIGJhY2tlbmQgb3ducyBpdHMgb3duIHRvb2xcbiAgICAvLyBpbnN0YW5jZXMgKFJULTIxKTsgdGhlIGhvc3QgcmVhZHMgbGl2ZSBzdGF0ZSwgc28gaXQgaXMgYnVpbHQgb25jZS5cbiAgICB0aGlzLnRvb2xIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gcmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvblN0b3JlLnNldFJlZ2lvbnMociksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuY2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiBob3N0LmZyYW1lSW5kZXgoKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IGhvc3QuaG9zdCgpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiBob3N0LmZpbGVOYW1lKCksXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiByZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCksXG4gICAgICBwaXhlbFRvRGF0YTogKHB4LCBweSkgPT4ge1xuICAgICAgICBjb25zdCByZWN0ID0gaG9zdC5ob3N0KCk/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB2aWV3ZXIgPSBob3N0LnZpZXdlcigpO1xuICAgICAgICBpZiAoIXZpZXdlciB8fCAhcmVjdCkgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICAgICAgICBjb25zdCBbeCwgeV0gPSB2aWV3ZXIuY2FudmFzVG9Xb3JsZChyZWN0LmxlZnQgKyBweCwgcmVjdC50b3AgKyBweSk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgIH0sXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gICAgdGhpcy5jYW52YXNUb29scyA9IGNyZWF0ZUNhbnZhc1Rvb2xNYW5hZ2VyKHRoaXMudG9vbEhvc3QsIHtcbiAgICAgIHdhbmRTZXJ2aWNlOiBkZXBzLndhbmRTZXJ2aWNlLFxuICAgICAgcmVnaW9uU3RvcmUsXG4gICAgICBzYW1Qb2ludDogZGVwcy5zYW1Qb2ludFRvb2wsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGludGVyYWN0aW9uIHN0YWNrIGV2ZXJ5IDJEIG1vZGUgbmVlZHM6IHRoZSByZWdpb24gb3ZlcmxheSAoZHJhdy9zZWxlY3QvZWRpdCksIHRoZSBwaXhlbFxuICAgKiB0b29scyB0aGF0IHJlYWQgYmFjayBkaXNwbGF5ZWQgcGl4ZWxzICh3YW5kLCBicnVzaCwgdmVydGV4IGVyYXNlciwgem9vbS10by1ib3gsIFNBTS9jZWxscG9zZSksXG4gICAqIGFuZCBhIGNhbWVyYSBob29rIHRoYXQga2VlcHMgdGhhdCByZWFkYmFjayBjdXJyZW50IGFzIHRoZSB2aWV3IHBhbnMvem9vbXMgYW5kIHRpbGVkIGxldmVsc1xuICAgKiBsb2FkLlxuICAgKlxuICAgKiBPbmUgY2FsbCBmb3IgYWxsIG9mIGl0IGJlY2F1c2UgZm9yZ2V0dGluZyBpdCBpcyBpbnZpc2libGU6IHRoZSB0b29sYmFyIGdhdGVzIGl0cyByZWdpb24gYnV0dG9uc1xuICAgKiBvbiAyRC12cy0zRCByYXRoZXIgdGhhbiBvbiBwbG90IHR5cGUsIHNvIGEgMkQgbW9kZSB0aGF0IHNraXBzIHRoaXMgc2hvd3MgZXZlcnkgdG9vbCBhbmQgc2lsZW50bHlcbiAgICogZG9lcyBub3RoaW5nLiBUaGF0IGlzIGV4YWN0bHkgd2hhdCBoYXBwZW5lZCB0byB0aGUgc3BhdGlhbCBhbmQgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIgbW9kZXMuXG4gICAqL1xuICBpbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCB2aWV3ZXIsIHRoaXMuZGVwcy5yZWdpb25TdG9yZSk7XG4gICAgdGhpcy5idWlsZENvb3JkaW5hdGVUcmFuc2Zvcm0oKTtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IHZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMub25WaWV3Q2hhbmdlZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpb24gZHJhd2luZyBmb3IgdGhlIDNEIGNsb3VkLlxuICAgKlxuICAgKiBSZXVzZXMge0BsaW5rIE5hcGFyaVJlZ2lvbk92ZXJsYXl9IHZlcmJhdGltIGJ5IGhhbmRpbmcgaXQgYSBTQ1JFRU4tU1BBQ0Ugdmlld2VyOiB0aGUgZHJhd25cbiAgICogc2hhcGUgaXMgYSBsYXNzbyBpbiBjYW52YXMgcGl4ZWxzLCBzbyBcIndvcmxkXCIgaXMgdGhlIGNhbnZhcyBhbmQgYm90aCB0cmFuc2Zvcm1zIGFyZSBpZGVudGl0eVxuICAgKiAoYmFyIHRoZSBjbGllbnTihpJjYW52YXMgb2Zmc2V0KS4gRXZlcnkgZXhpc3RpbmcgdG9vbCDigJQgcmVjdGFuZ2xlLCBwb2x5Z29uLCBmcmVlaGFuZCDigJQgdGhlcmVmb3JlXG4gICAqIHdvcmtzIGluIDNEIHdpdGggbm8gbmV3IGRyYXdpbmcgY29kZS5cbiAgICpcbiAgICogQSBzY3JlZW4tc3BhY2Ugc2hhcGUgc3RvcHMgbWVhbmluZyBhbnl0aGluZyB0aGUgbW9tZW50IHRoZSBjYW1lcmEgbW92ZXMsIHNvIGFuIG9yYml0IGNsZWFyc1xuICAgKiB0aGUgcmVnaW9ucyBkcmF3biBpbiB0aGlzIHZpZXcgKGFuZCBvbmx5IHRob3NlKS4gVGhlIFNFTEVDVElPTiB0aGV5IHByb2R1Y2VkIGlzIGtlcHQ6IHRoYXQgaXNcbiAgICogdGhlIGR1cmFibGUgYXJ0ZWZhY3QsIGFuZCB0aGUgaGlnaGxpZ2h0ZWQgcG9pbnRzIHN0YXkgaGlnaGxpZ2h0ZWQgZnJvbSBldmVyeSBhbmdsZS5cbiAgICpcbiAgICogRXZlcnkgb3RoZXIgcmVnaW9uIGluIHRoZSBzdG9yZSBpcyBpbiBpbWFnZSBzcGFjZSAtIHRoZSBpbWFnZSdzIG93biwgYW4gaW1wb3J0ZWQgc2V0LFxuICAgKiBzdHJ1Y3R1cmVzIGEgdHJlZSBjbGljayB0b29rIGZyb20gYSByZWdpb24gc291cmNlIC0gc28gdGhlIG92ZXJsYXkgbmVpdGhlciBkcmF3cyBub3IgcGlja3MgaXRcbiAgICogKGl0IHdvdWxkIGxpZSBmbGF0IGF0IGNhbnZhcyBwaXhlbHMgb3ZlciB0aGUgY2xvdWQpLCBhbmQgYW4gb3JiaXQgbGVhdmVzIGl0IGFsb25lOiB0aGV5IHNob3dcbiAgICogaW4gM0QgYXMgdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIGluc3RlYWQuXG4gICAqL1xuICBpbnN0YWxsM2RJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlZ2lvblN0b3JlIH0gPSB0aGlzLmRlcHM7XG4gICAgLy8gV29ybGQgaGVyZSBpcyB0aGUgY2FudmFzLCBub3QgdGhlIGltYWdlOiBubyByZWdpb24gc291cmNlIHRvIGRyYXcuXG4gICAgY29uc3Qgb3ZlcmxheSA9IG5ldyBOYXBhcmlSZWdpb25PdmVybGF5KGhvc3QsIHRoaXMuc2NyZWVuU3BhY2VWaWV3ZXIodmlld2VyKSwgcmVnaW9uU3RvcmUsIHtcbiAgICAgIHJlZ2lvblNvdXJjZTogZmFsc2UsXG4gICAgICBzY3JlZW5TcGFjZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBvdmVybGF5O1xuICAgIHRoaXMuYnVpbGRDb29yZGluYXRlVHJhbnNmb3JtKCk7XG4gICAgLy8gKE5vIG1pZC1nZXN0dXJlIGNhc2UgdG8gZ3VhcmQ6IHRoZSBvdmVybGF5IGRpc2FibGVzIHRoZSBjYW1lcmEgY29udHJvbHMgd2hpbGUgZHJhd2luZy4pXG4gICAgdGhpcy5jYW1lcmFPZmYgPSB2aWV3ZXIuY2FtZXJhM2QuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMuY2xlYXJPd25MYXNzb3MoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSByZWdpb25zIHRoZSAzRCBvdmVybGF5IGRyZXcgaW4gc2NyZWVuIHNwYWNlIChvbmx5IHRob3NlKSBmcm9tIHRoZSBzdG9yZTogYSBsYXNzb1xuICAgKiBtZWFucyBub3RoaW5nIG9uY2UgdGhlIGNhbWVyYSBpdCB3YXMgZHJhd24gdW5kZXIgbW92ZXMgb3IgdGhlIHNjZW5lIGdvZXMuIE5vdCBhbiBlZGl0IG9mIHRoZVxuICAgKiB1c2VyJ3M6IG5vIHVuZG8gc3RlcCAoTkFQQVJJLVNWQy0xMSkuXG4gICAqL1xuICBwcml2YXRlIGNsZWFyT3duTGFzc29zKCk6IHZvaWQge1xuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gICAgY29uc3QgeyByZWdpb25TdG9yZSB9ID0gdGhpcy5kZXBzO1xuICAgIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KHJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBjb25zdCBkcmF3biA9IG92ZXJsYXkub3duUmVnaW9uSWRzKCkuZmlsdGVyKChpZCkgPT4gcHJlc2VudC5oYXMoaWQpKTtcbiAgICBpZiAoZHJhd24ubGVuZ3RoKSB0aGlzLmhvc3QuaW5ab25lKCgpID0+IHJlZ2lvblN0b3JlLnJlbW92ZVJlZ2lvbnMoZHJhd24sIHsgcmVjb3JkVW5kbzogZmFsc2UgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgT3ZlcmxheVZpZXdlcn0gdGhlIDNEIHJlZ2lvbiBvdmVybGF5IGRyYXdzIHRocm91Z2g6IFwid29ybGRcIiBpcyB0aGUgY2FudmFzLCBpblxuICAgKiBjYW52YXMtbG9jYWwgQ1NTIHBpeGVscy4gQSBwb2ludGVyIGFycml2ZXMgaW4gQ0xJRU5UIHBpeGVscywgc28gYGNhbnZhc1RvV29ybGRgIHN1YnRyYWN0cyB0aGVcbiAgICogY2FudmFzJ3MgY2xpZW50IG9mZnNldCAod2l0aG91dCBpdCB0aGUgbGFzc28gd2FzIGRyYXduIG9mZnNldCBmcm9tIHRoZSBjdXJzb3Igd2hlbmV2ZXIgdGhlXG4gICAqIGNhbnZhcyB3YXMgbm90IGF0IHRoZSBwYWdlIG9yaWdpbik7IGRyYXdpbmcgaXMgdGhlbiB0aGUgaWRlbnRpdHksIHdpdGggbm8gbGF5b3V0IHJlYWQuXG4gICAqL1xuICBzY3JlZW5TcGFjZVZpZXdlcih2aWV3ZXI6IFZpZXdlcik6IE92ZXJsYXlWaWV3ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBjYW52YXNUb1dvcmxkOiAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgciA9IHRoaXMuaG9zdC5jYW52YXMoKT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiByID8gW2NsaWVudFggLSByLmxlZnQsIGNsaWVudFkgLSByLnRvcF0gOiBbY2xpZW50WCwgY2xpZW50WV07XG4gICAgICB9LFxuICAgICAgY2FudmFzVHJhbnNmb3JtOiAoKSA9PiBJREVOVElUWV9BRkZJTkUsXG4gICAgICBzZXRDb250cm9sc0VuYWJsZWQ6IChlbmFibGVkOiBib29sZWFuKSA9PiB2aWV3ZXIuc2V0Q29udHJvbHNFbmFibGVkKGVuYWJsZWQpLFxuICAgICAgY2FtZXJhOiB2aWV3ZXIuY2FtZXJhM2QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBFbmQgdGhlIHNjZW5lJ3MgaW50ZXJhY3Rpb246IHRoZSBvdmVybGF5LCB0aGUgY2FtZXJhIGhvb2ssIHRoZSBwZW5kaW5nIHRpbWVycyBhbmQgdGhlXG4gICAqICBwaXhlbHMgcmVhZCBmcm9tIHRoZSBvbGQgY2FudmFzLiBUaGUgYXJtZWQgdG9vbCBhbmQgdGhlIHBpeGVsLXRvb2wgc2V0IHBlcnNpc3QuICovXG4gIHRlYXJkb3duKCk6IHZvaWQge1xuICAgIC8vIFRoZSBvdmVybGF5J3MgcmVjb3JkIG9mIGl0cyBsYXNzb3MgZ29lcyB3aXRoIGl0OiByZW1vdmUgdGhlbSBmaXJzdCwgb3IgdGhleSB3b3VsZCBzdGF5IGluXG4gICAgLy8gdGhlIHN0b3JlIHVub3duZWQgLSBoaWRkZW4gYnkgdGhlIG5leHQgM0Qgb3ZlcmxheSwgYmV5b25kIGFuIG9yYml0J3MgcmVhY2gsIGFuZCBzdGlsbFxuICAgIC8vIGZlZWRpbmcgXCJTZWxlY3QgZnJvbSBST0lzXCIgd2l0aCBzY3JlZW4gY29vcmRpbmF0ZXMgb2YgYSBjYW1lcmEgdGhhdCBpcyBnb25lLlxuICAgIHRoaXMuY2xlYXJPd25MYXNzb3MoKTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXk/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3cG9ydFRpbWVyICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdwb3J0VGltZXIpO1xuICAgICAgdGhpcy52aWV3cG9ydFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5waXhlbHNTdGFsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2FtZXJhT2ZmPy4oKTtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IG51bGw7XG4gICAgdGhpcy5sYXN0UGl4ZWxzID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBSZWFkIHRoZSBkaXNwbGF5ZWQgY29tcG9zaXRlIGludG8gYGxhc3RQaXhlbHNgICh0aGUgcGl4ZWwtdG9vbHMnIHNvdXJjZSkgKyBlbWl0IHRoZSBjbGFtcGVkXG4gICAqICB2aXNpYmxlIHJlZ2lvbi4gQSBmcmVzaCBQaXhlbERhdGEgb2JqZWN0IG1lYW5zIGNhY2hlZEltYWdlRGF0YSgpIHJlYnVpbGRzIGF1dG9tYXRpY2FsbHkuICovXG4gIGFzeW5jIHJ1blJlYWRiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLmhvc3Qudmlld2VyKCk7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHB4ID0gYXdhaXQgdi5yZWFkRGlzcGxheWVkUGl4ZWxzKCk7XG4gICAgICBpZiAodGhpcy5ob3N0LnZpZXdlcigpICE9PSB2KSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gdi52aXNpYmxlV29ybGRSZWN0KCk7IC8vIGNhcHR1cmUgV0lUSCB0aGUgcGl4ZWxzIChzYW1lIGNhbWVyYSlcbiAgICAgIHRoaXMubGFzdFBpeGVscyA9IHB4O1xuICAgICAgdGhpcy5sYXN0UGl4ZWxzUmVjdCA9IHJlY3Q7XG4gICAgICB0aGlzLnBpeGVsc1N0YWxlID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXRWaWV3cG9ydChyZWN0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHJlYWRiYWNrIHVuYXZhaWxhYmxlIChubyBkZXZpY2UgeWV0LCBvciBpdCB3YXMgbG9zdCk6IHRoZSB0b29scyBrZWVwIHRoZSBsYXN0IHBpeGVscyAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIHJlYWRiYWNrIG9uIHRoZSBuZXh0IGZyYW1lIOKAlCBhZnRlciBhIHBsb3Qgb3IgYSBzY2VuZSBjaGFuZ2UgZHJldyBzb21ldGhpbmcgbmV3LiAqL1xuICBzY2hlZHVsZVJlYWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ob3N0LnZpZXdlcigpKSByZXR1cm47XG4gICAgdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCkpO1xuICAgICAgZWxzZSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy5ydW5SZWFkYmFjaygpLCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEZWJvdW5jZWQgcmVhZGJhY2sg4oCUIGFybWVkIG9uIGNhbWVyYSBjaGFuZ2VzIHdoaWxlIGEgcGl4ZWwgdG9vbCBpcyBhY3RpdmUsIHNvIGBsYXN0UGl4ZWxzYFxuICAgKiAgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXcgYWZ0ZXIgYSBwYW4vem9vbSBzZXR0bGVzLCB3aGljaCB0aGUgb24tY2FudmFzIHBpeGVsIHRvb2xzXG4gICAqICAod2FuZC9icnVzaC9TQU0pIHJlYWQgc3luY2hyb25vdXNseS4gQ29hbGVzY2VzIHJhcGlkIGNoYW5nZXMuICovXG4gIGFybVJlYWRiYWNrKGRlbGF5TXMgPSBSRUFEQkFDS19ERUJPVU5DRV9NUyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgdGhpcy5yZWFkYmFja1RpbWVyID0gdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWFkYmFja1RpbWVyID0gbnVsbDtcbiAgICAgICAgdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCk7XG4gICAgICB9LCBkZWxheU1zKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEVtaXQgdGhlIHZpc2libGUgcmVnaW9uLCBjbGFtcGVkIHRvIHRoZSBpbWFnZS4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnQocmVjdDogV29ybGRSZWN0KTogdm9pZCB7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuaG9zdC5pbWFnZVNpemUoKTtcbiAgICBpZiAoIXNpemUgfHwgIXJlY3QpIHJldHVybjtcbiAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2l6ZS53aWR0aCwgcmVjdC54KSk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0LCByZWN0LnkpKTtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgubWluKHNpemUud2lkdGggLSB4LCByZWN0LndpZHRoKSk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS5oZWlnaHQgLSB5LCByZWN0LmhlaWdodCkpO1xuICAgIHRoaXMuaG9zdC52aWV3cG9ydENoYW5nZWQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgMkQgcGFuL3pvb20uIFRoZSBmdWxsLWNhbnZhcyBHUFUgcmVhZGJhY2sgaXMgcGFpZCBmb3Igb25seSB3aGlsZSBhIHBpeGVsIHRvb2wgcmVhZHMgaXRcbiAgICogKHtAbGluayBwaXhlbFRvb2xzfSk7IG90aGVyd2lzZSBvbmx5IHRoZSB2aWV3cG9ydCByZWN0IGlzIGVtaXR0ZWQgKGRlYm91bmNlZCksIGFuZCB0aGUgcGl4ZWxzXG4gICAqIGFyZSBtYXJrZWQgc3RhbGUgZm9yIHdob2V2ZXIgbmV4dCBuZWVkcyB0aGVtIChhIHRvb2wgYXJtcyBhIGZyZXNoIHJlYWRiYWNrIGFzIGl0IGFjdGl2YXRlcykuXG4gICAqL1xuICBwcml2YXRlIG9uVmlld0NoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5waXhlbHNTdGFsZSA9IHRydWU7XG4gICAgaWYgKHRoaXMucGl4ZWxUb29scy5zaXplID4gMCkge1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygpOyAvLyBlbWl0cyB0aGUgdmlld3BvcnQgd2l0aCB0aGUgcGl4ZWxzXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdwb3J0VGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMudmlld3BvcnRUaW1lcik7XG4gICAgdGhpcy52aWV3cG9ydFRpbWVyID0gdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy52aWV3cG9ydFRpbWVyID0gbnVsbDtcbiAgICAgICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgICAgICBpZiAodmlld2VyKSB0aGlzLmVtaXRWaWV3cG9ydCh2aWV3ZXIudmlzaWJsZVdvcmxkUmVjdCgpKTtcbiAgICAgIH0sIFJFQURCQUNLX0RFQk9VTkNFX01TKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBwaXhlbCB0b29scycgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gZm9yIHRoZSBjdXJyZW50IHZpZXdlci4gKi9cbiAgcHJpdmF0ZSBidWlsZENvb3JkaW5hdGVUcmFuc2Zvcm0oKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICghdmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG5ldyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgdmlld2VyLFxuICAgICAgKCkgPT4gISF0aGlzLmhvc3Qudmlld2VyKCkgJiYgKHRoaXMuaG9zdC5pbWFnZVNpemUoKT8ud2lkdGggPz8gMCkgPiAwLFxuICAgICk7XG4gIH1cblxuICAvKiogWm9vbS9wYW4gdGhlIGNhbWVyYSB0byBmaXQgYSBkYXRhLXNwYWNlIHJlY3RhbmdsZSBgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dYC4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuaG9zdC5jYW52YXMoKTtcbiAgICBpZiAoIXYgfHwgIWNhbnZhcyB8fCBjb29yZGluYXRlcy5sZW5ndGggPCA0KSByZXR1cm47XG4gICAgY29uc3QgW3hNaW4sIHhNYXgsIHlBLCB5Ql0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4MCA9IE1hdGgubWluKHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoeE1pbiwgeE1heCk7XG4gICAgY29uc3QgeTAgPSBNYXRoLm1pbih5QSwgeUIpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoeUEsIHlCKTtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoMSwgeDEgLSB4MCk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIHkxIC0geTApO1xuICAgIGNvbnN0IHZ3ID0gY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgdmggPSBjYW52YXMuY2xpZW50SGVpZ2h0IHx8IGg7XG4gICAgdi5jYW1lcmEuY2VudGVyID0gWyh4MCArIHgxKSAvIDIsICh5MCArIHkxKSAvIDJdO1xuICAgIHYuY2FtZXJhLnpvb20gPSBNYXRoLm1pbih2dyAvIHcsIHZoIC8gaCk7XG4gICAgdi5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQnVpbGQgQ2FjaGVkSW1hZ2VEYXRhIGZyb20gdGhlIG1vc3QgcmVjZW50IHJlYWRiYWNrIOKAlCBpdHMgUkdCQSBkZXZpY2UgcGl4ZWxzIGFyZSB0aGUgZnJhbWVcbiAgICogIGFzLWlzIChwYWNrZWQsIG5vIHBlci1waXhlbCBhcnJheXM6IE5BUEFSSS1TVkMtMjMpIOKAlCB3aXRoIHJhdGlvcy9vcmlnaW4gbWFwcGluZyBpbWFnZSBjb29yZHNcbiAgICogIOKGlCByZWFkYmFjayBwaXhlbHMuIENhY2hlZCB1bnRpbCB0aGUgcmVhZGJhY2sgY2hhbmdlcy4gKi9cbiAgY2FjaGVkSW1hZ2VEYXRhKCk6IENhY2hlZEltYWdlRGF0YSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXB4IHx8ICF2aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNhY2hlZEltYWdlICYmIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPT09IHB4KSByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgICBjb25zdCB3ID0gcHgud2lkdGg7XG4gICAgY29uc3QgaCA9IHB4LmhlaWdodDtcbiAgICAvLyBVc2UgdGhlIHJlY3QgY2FwdHVyZWQgV0lUSCB0aGlzIHJlYWRiYWNrIChub3QgdGhlIGxpdmUgb25lKSBzbyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZVxuICAgIC8vIG1hdHJpeCdzIGNhbWVyYSDigJQgb3RoZXJ3aXNlIGEgcGFuL3pvb20gc2luY2UgdGhlIHJlYWRiYWNrIG1pcy1zY2FsZXMgdGhlIHRyYWNlZCByZWdpb24uXG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGFzdFBpeGVsc1JlY3QgPz8gdmlld2VyLnZpc2libGVXb3JsZFJlY3QoKTtcbiAgICB0aGlzLmNhY2hlZEltYWdlID0ge1xuICAgICAgZnJhbWVzOiBbcGFja2VkRnJhbWUocHguZGF0YSwgdywgaCldLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyZWN0LndpZHRoIC8gdywgcmVjdC5oZWlnaHQgLyBoXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIG9yaWdpblg6IHJlY3QueCxcbiAgICAgIG9yaWdpblk6IHJlY3QueSxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBweDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSdzIGBiZWZvcmVUb29sQ2hhbmdlYDogdHJhY2sgdGhlIHBpeGVsLXJlYWRpbmcgdG9vbCAoc2VlIHtAbGluayBvblZpZXdDaGFuZ2VkfSksXG4gICAqIGdhdGUgdGhlIGNhbWVyYSwgYW5kIGFybSBhIGZyZXNoIHJlYWRiYWNrIGZvciBhIHBpeGVsIHRvb2wuIE5vdGhpbmcgaXMgYXJtZWQgd2l0aG91dCBhXG4gICAqIHZpZXdlciwgbm9yIGEgcGl4ZWwgdG9vbCBiZWZvcmUgYSBwbG90IGJ1aWx0IGl0cyBjb29yZGluYXRlIHRyYW5zZm9ybS5cbiAgICpcbiAgICogQ29udHJvbCBnYXRpbmc6IGEgdG9vbCB0aGF0IEFDVElWQVRFUyBkaXNhYmxlcyB0aGUgY2FtZXJhIGNvbnRyb2xzOyBkZWFjdGl2YXRpb24gaXMgYSBuby1vcFxuICAgKiBiZWNhdXNlIHRoZSBob3N0IGFsd2F5cyBjYWxscyB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIEZJUlNUIGluIGVhY2ggdG9nZ2xlICh3aGljaCBzZXRzXG4gICAqIHRoZSBiYXNlbGluZSBlbmFibGVkL2Rpc2FibGVkKSwgc28gcmUtZW5hYmxpbmcgaGVyZSB3b3VsZCBmaWdodCBhIGZyZXNobHktYWN0aXZhdGVkIGRyYXcgbW9kZS5cbiAgICovXG4gIGJlZm9yZVRvb2xDaGFuZ2UobmV4dDogQ2FudmFzVG9vbElkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucGl4ZWxUb29scy5jbGVhcigpO1xuICAgIGlmIChuZXh0ICE9PSBudWxsICYmIG5leHQgIT09ICd6b29tVG9Cb3gnKSB0aGlzLnBpeGVsVG9vbHMuYWRkKG5leHQpO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXZpZXdlcikgcmV0dXJuIGZhbHNlOyAvLyBubyBwbG90IHlldCDihpIgbm90aGluZyB0byBkcml2ZVxuICAgIGlmIChuZXh0ID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobmV4dCAhPT0gJ3pvb21Ub0JveCcgJiYgIXRoaXMuY29vcmRUcmFuc2Zvcm0pIHJldHVybiBmYWxzZTtcbiAgICB2aWV3ZXIuc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICBpZiAobmV4dCA9PT0gJ3pvb21Ub0JveCcpIHJldHVybiB0cnVlO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIC8vIFRoZSBlcmFzZXIgb25seSBjb252ZXJ0cyBjb29yZGluYXRlcyB3aXRoIHRoZSByZWFkYmFjaywgc28gYSBjdXJyZW50IG9uZSB3aWxsIGRvLlxuICAgIGlmIChuZXh0ICE9PSAnZXJhc2VWZXJ0ZXgnIHx8IHRoaXMucGl4ZWxzU3RhbGUpIHRoaXMuYXJtUmVhZGJhY2soMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogU0FNIG92ZXIgdGhlIGRyYXduIHJlY3RhbmdsZXMg4oCUIGEgc2VydmVyIHJvdW5kLXRyaXAgdGhhdCByZWFkcyB0aGUgcmVjdGFuZ2xlcyBmcm9tIHRoZVxuICAgKiAgUmVnaW9uU3RvcmUgYW5kIHRoZSBpbWFnZSBmcm9tIGEgZnJlc2ggcmVhZGJhY2suIFJldHVybnMgdGhlIHJlZ2lvbnMgYWRkZWQuICovXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLmhvc3Qudmlld2VyKCkgfHwgIXRoaXMuY29vcmRUcmFuc2Zvcm0pIHJldHVybiAwO1xuICAgIGF3YWl0IHRoaXMucnVuUmVhZGJhY2soKTsgLy8gdGhlIFNBTSBlbWJlZGRpbmcgc2FtcGxlcyB0aGUgY3VycmVudGx5LWRpc3BsYXllZCBpbWFnZVxuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmRlcHMuc2FtVG9vbC5zZWdtZW50Qm94ZXModGhpcy50b29sSG9zdCk7XG4gIH1cblxuICAvKiogQ2VsbHBvc2Ugb3ZlciB0aGUgZHJhd24gcmVjdGFuZ2xlcyAoc2VlIHtAbGluayBzZWdtZW50UmVjdGFuZ2xlc30pLiAqL1xuICBhc3luYyBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgc2VnbWVudGVyID0gdGhpcy5kZXBzLmNlbGxTZWdtZW50ZXI7XG4gICAgaWYgKCF0aGlzLmhvc3Qudmlld2VyKCkgfHwgIXRoaXMuY29vcmRUcmFuc2Zvcm0gfHwgIXNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmRlcHMuY2VsbFNlZ21lbnRUb29sLnNlZ21lbnRCb3hlcyh0aGlzLnRvb2xIb3N0LCBzZWdtZW50ZXIpO1xuICB9XG59XG4iXX0=
|