@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
|
@@ -965,6 +965,9 @@ export class RoutingVisualizerService {
|
|
|
965
965
|
async selectRegionClasses(classes, additive) {
|
|
966
966
|
await this.regionStore.selectClasses(classes, additive);
|
|
967
967
|
}
|
|
968
|
+
getPickedRegionClasses$() {
|
|
969
|
+
return this.regionStore.getPickedClasses$();
|
|
970
|
+
}
|
|
968
971
|
getGeoJsonStringWithSource(regions, slice) {
|
|
969
972
|
return this.regionStore.getGeoJsonWithSource(regions, slice);
|
|
970
973
|
}
|
|
@@ -1309,4 +1312,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
1309
1312
|
type: Inject,
|
|
1310
1313
|
args: [SPATIAL_DATA_PORT]
|
|
1311
1314
|
}] }] });
|
|
1312
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQztBQWUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFFekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBa0MsTUFBTSwrQkFBK0IsQ0FBQztBQUl4RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztB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akYsOEJBQThCLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxLQUFhLEVBQUUsTUFBYyxFQUFFLE1BQWM7UUFDaEcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDhCQUE4QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQ7Ozs2RkFHeUY7SUFDekYsTUFBTTtRQUNKLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDOzhHQTV5Q1Usd0JBQXdCLG1LQTBFekIsVUFBVSxvSEFPVixpQkFBaUI7a0hBakZoQix3QkFBd0IsY0FEWCxNQUFNOzsyRkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBMkU3QixNQUFNOzJCQUFDLFVBQVU7OzBCQU1qQixRQUFROzswQkFDUixNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgbWVyZ2UsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICdpbWFnZS1qcyc7XG5pbXBvcnQgeyByZXNvbHZlQ29sb3JtYXAgfSBmcm9tICduYXBhcmktanMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvLCBJSW1hZ2VNZXRhZGF0YSB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlZ2lvbiB9IGZyb20gJy4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0IH0gZnJvbSAnLi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmltcG9ydCB7IFBsb3RseVNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9wbG90bHkvcGxvdGx5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvb3NkL29wZW5zZWFkcmFnb24tdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIGlzTmFwYXJpM2QsXG4gIGlzTmFwYXJpU2NhdHRlcixcbiAgaXNTcGF0aWFsT21pY3MsXG4gIGlzU3BhdGlhbE9taWNzM2QsXG4gIGlzTmFwYXJpSXNvc3VyZmFjZSxcbiAgaXNOYXBhcmlWb2x1bWUsXG59IGZyb20gJy4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBJVmlld2VyQmFja2VuZCxcbiAgSVZpc3VhbGl6ZXIsXG4gIExvYWRlZEltYWdlLFxuICBQaXhlbERhdGEsXG4gIEludGVuc2l0eVByb2ZpbGUsXG4gIElJc29zdXJmYWNlQ29udHJvbHMsXG4gIElJbnRlbnNpdHlDb250cm9scyxcbiAgSVN1cmZhY2UzZENvbnRyb2xzLFxuICBJU3BhdGlhbENvbnRyb2xzLFxuICBJSW50ZW5zaXR5U2FtcGxpbmcsXG4gIElPc2RWaWV3T3B0aW9ucyxcbiAgSVZvbHVtZVJlc29sdXRpb24sXG59IGZyb20gJy4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgU1BBVElBTF9EQVRBX1BPUlQsIFNwYXRpYWxEYXRhUG9ydCB9IGZyb20gJy4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7IENhbnZhc1Rvb2xPcHRpb25zLCBDb2xvcm1hcE5vZGUsIElCcnVzaE9wdGlvbnMsIElXYW5kT3B0aW9ucyB9IGZyb20gJy4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgU3BhdGlhbENvbnRyb2xzRmFjYWRlIH0gZnJvbSAnLi9zcGF0aWFsL3NwYXRpYWwtY29udHJvbHMuZmFjYWRlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TY29wZUNhY2hlIH0gZnJvbSAnLi9zdG9yZS9yZWdpb24tc2NvcGUtY2FjaGUnO1xuaW1wb3J0IHsgUkVHSU9OX1NPVVJDRV9NSU5fQ0hBUlMsIFJlZ2lvblNvdXJjZSwgUmVnaW9uU291cmNlVmlldyB9IGZyb20gJy4vcmVnaW9uLXNvdXJjZS9yZWdpb24tc291cmNlJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uSW5kZXhQYWdlLCBSZWdpb25JbmRleFF1ZXJ5IH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3JlZ2lvbi10aWxlcyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lvblN0eWxlIH0gZnJvbSAnLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tc3R5bGUnO1xuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSAnbmFwYXJpLWpzL2dlb21ldHJ5JztcbmltcG9ydCB7IG9wZW5HZW9Kc29uUmVnaW9uU291cmNlIH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3dvcmtlci1yZWdpb24tc291cmNlJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU291cmNlT3BlbmVyLCBSZWdpb25Tb3VyY2VTbGljZXMgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zb3VyY2Utc2NvcGUnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcyB9IGZyb20gJy4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25FZGl0b3JBcGkgfSBmcm9tICcuL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ2hhbm5lbEhpc3RvZ3JhbUFwaSwgSUNoYW5uZWxTdGF0ZSwgSUhpc3RvZ3JhbSB9IGZyb20gJy4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBhdXRvV2luZG93RnJvbUhpc3RvZ3JhbSB9IGZyb20gJy4vY29udHJhY3RzL2ludGVuc2l0eSc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7IGNoYW5uZWxUaW50Q29sb3JtYXAsIHZvbHVtZUNvbG9ybWFwIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS1kaXNwbGF5LXN0YXRlJztcbmltcG9ydCB7IFZJWl9DT05GSUcsIFZpekNvbmZpZyB9IGZyb20gJy4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgUGxvdE1vZGVWaWV3cG9ydCB9IGZyb20gJy4vY29udHJhY3RzL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UgfSBmcm9tICcuL2ludGVuc2l0eS9pbnRlbnNpdHktcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IGNoYW5nZWRDbGFzc2VzLCBjbGFzc1NpZ25hdHVyZXMgfSBmcm9tICcuL3N0b3JlL2NsYXNzLXNpZ25hdHVyZXMnO1xuaW1wb3J0IHsgVm9sdW1lU2VjdGlvbnMgfSBmcm9tICcuL3Zpc3VhbGl6ZXIvdm9sdW1lLXNlY3Rpb25zJztcbmltcG9ydCB0eXBlIHsgU2VjdGlvbkF4aXMsIFNlY3Rpb25WaWV3cyB9IGZyb20gJy4vY29udHJhY3RzL3NlY3Rpb24tdmlldy5jb250cmFjdCc7XG5cbi8qKiBIb3cgbG9uZyBhZnRlciB0aGUgbGFzdCBlZGl0IHRoZSBzdXJmYWNlcyBvZiB0aGUgY2xhc3NlcyBpdCB0b3VjaGVkIGFyZSByZWJ1aWx0IChtcykuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX1NVUkZBQ0VfUkVCVUlMRF9NUyA9IDYwMDtcblxuLyoqIEludGVuc2l0eS1wcm9maWxlIGxpbmUgUk9JcyBhcmUgb3duZWQgYnkgdGhlIGludGVuc2l0eSB0b29sLCBub3QgdGhlIGVkaXRvci5cbiAqICBQYWNrYWdlLWludGVybmFsIHByZWRpY2F0ZSAocHJvcGVydHktYmFzZWQgc28gaXQgYWxzbyBtYXRjaGVzIHBsYWluIG9iamVjdHNcbiAqICBhZnRlciBhIGRyYWcgcm91bmQtdHJpcCkuICovXG5mdW5jdGlvbiBpc1Byb2ZpbGVSZWdpb24ocjogeyBraW5kPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiByPy5raW5kID09PSAncHJvZmlsZSc7XG59XG5cbi8qKlxuICogVGhlIHZpc3VhbGl6ZXIgY2hhaW4ncyBmcm9udCBkb29yOiBpbXBsZW1lbnRzIGBJVmlzdWFsaXplcmAsIGBJUmVnaW9uRWRpdG9yQXBpYFxuICogYW5kIGBJQ2hhbm5lbEhpc3RvZ3JhbUFwaWAgKGJvdW5kIHRvIHRoZSBgVklTVUFMSVpFUmAgLyBgUkVHSU9OX0VESVRPUl9BUElgIC9cbiAqIGBDSEFOTkVMX0hJU1RPR1JBTV9BUElgIHRva2Vucykgb3ZlciB0aHJlZSByZW5kZXJpbmcgYmFja2VuZHMsIGNob3NlbiBwZXIgcGxvdCB0eXBlOlxuICogIC0gKipJbWFnZSoqIHJlbmRlcnMgdGhyb3VnaCBPcGVuU2VhZHJhZ29uIChuYXRpdmVseSB0aWxlZCwgcmVnaW9uIHRvb2xzLFxuICogICAgY2xpZW50LXNpZGUgY29sb3JtYXApLCBvciB0aHJvdWdoIG5hcGFyaS1qcyB3aGVuIGBWaXpDb25maWcudXNlTmFwYXJpUmVuZGVyZXJgXG4gKiAgICBvcHRzIGluOyB0aGUgbmFwYXJpIGltYWdlIHR5cGVzIGFuZCB0aGUgMkQgc3BhdGlhbC1vbWljcyBtb2RlIHJlbmRlciB0aHJvdWdoXG4gKiAgICBuYXBhcmktanMuIEEgZmFpbGVkIGxvYWQgZmFsbHMgYmFjayBuYXBhcmktanMg4oaSIE9TRCDihpIgUGxvdGx5IGZvciB0aGF0IGltYWdlIG9ubHlcbiAqICAgIChzZWUgYG5hcGFyaUZlbGxCYWNrYCAvIGBvc2RGZWxsQmFja2AsIGNsZWFyZWQgYnkgYHJlc2V0KClgKS5cbiAqICAtIHRoZSBuYXBhcmkgM0QgdHlwZXMgKHZvbHVtZSwgaXNvc3VyZmFjZSwgc3VyZmFjZSwgM0Qgc2NhdHRlciwgdGhlIDNEIHNwYXRpYWxcbiAqICAgIGNsb3VkKSByZW5kZXIgdGhyb3VnaCBuYXBhcmktanMsIGZhbGxpbmcgYmFjayB0byBQbG90bHkuXG4gKiAgLSBldmVyeSBvdGhlciBwbG90IHR5cGUgKGhlYXRtYXAsIGNvbnRvdXIsIHN1cmZhY2UsIHNjYXR0ZXIsIGxpbmUsIOKApikgcmVuZGVyc1xuICogICAgdGhyb3VnaCBQbG90bHkuXG4gKlxuICogT25seSByZW5kZXJpbmcgYW5kIHRoZSB2aWV3cG9ydCBhcmUgcm91dGVkIHRvIHRoZSBiYWNrZW5kIG9uIHNjcmVlbi4gUmVnaW9uIHN0YXRlXG4gKiBsaXZlcyBpbiB0aGUgc2hhcmVkIGBSZWdpb25TdG9yZWAgYW5kIGRpc3BsYXkgc3RhdGUgKGNvbG9ybWFwLCBjaGFubmVscywgcHJlc2V0cyxcbiAqIHNwYXRpYWwgdmlldykgaW4gdGhlIHNoYXJlZCBgVmlzdWFsaXplclN0b3JlYCwgc28gZXZlcnkgYmFja2VuZCBzZWVzIHRoZSBzYW1lXG4gKiB2YWx1ZXM7IHRoZSBiYWNrZW5kcyBzdWJzY3JpYmUgdG8gdGhlbSB0byByZWRyYXcuXG4gKlxuICogUGFja2FnZS1pbnRlcm5hbDogaG9zdHMgZGVwZW5kIG9uIHRoZSB0b2tlbnMsIG5vdCBvbiB0aGlzIGNsYXNzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSBpbXBsZW1lbnRzIElWaXN1YWxpemVyLCBJUmVnaW9uRWRpdG9yQXBpLCBJQ2hhbm5lbEhpc3RvZ3JhbUFwaSwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBjdXJyZW50UGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gIHByaXZhdGUgbGFzdFJlbmRlcmVkOiBJVmlld2VyQmFja2VuZCB8IG51bGwgPSBudWxsO1xuICAvKiogT1NEIGZhaWxlZCBmb3IgdGhlICpjdXJyZW50KiByZW5kZXIgY3ljbGUgKGUuZy4gYSBmcmVzaCBmaWxlIHN0aWxsIGNhY2hpbmdcbiAgICogIHBhc3QgdGhlIGRlYWRsaW5lKSDihpIgZmFsbCBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZSBvbmx5LiBSZXNldCBieVxuICAgKiAgcmVzZXQoKSBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgcmVuZGVyIGN5Y2xlLCBzbyB0aGUgbmV4dCBmaWxlIOKAlCBvciBhXG4gICAqICByZS1zZWxlY3Qgb25jZSB0aGUgZmlsZSBpcyBjYWNoZWQg4oCUIHJldHJpZXMgT1NELiAoV2FzIGEgcGVybWFuZW50IGZsYWcsXG4gICAqICB3aGljaCBsZWZ0IHRoZSB3aG9sZSBzZXNzaW9uIHN0dWNrIG9uIFBsb3RseSBhZnRlciBvbmUgc2xvdyBsb2FkLikgKi9cbiAgcHJpdmF0ZSBvc2RGZWxsQmFjayA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIGZhaWxlZCBmb3IgdGhlIGN1cnJlbnQgcmVuZGVyIGN5Y2xlIOKGkiBmYWxsIGJhY2sgdG8gT1NEICh0aGVuIFBsb3RseSkuXG4gICAqICBSZXNldCBieSByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSBjeWNsZSwgbGlrZSB7QGxpbmsgb3NkRmVsbEJhY2t9LiAqL1xuICBwcml2YXRlIG5hcGFyaUZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBUaGUgZmlsZSBuYW1lIG9mIHRoZSBpbWFnZSBsYXN0IHBsb3R0ZWQgKG5hbWVzIGEgR2VvSlNPTiBleHBvcnQpLiAqL1xuICBwcml2YXRlIHBsb3R0ZWRGaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIGRpdiB0aGUgYmFja2VuZHMgcmVuZGVyIGludG8gKGV2ZXJ5IGJhY2tlbmQgc2hhcmVzIGl0KTsgJycgYmVmb3JlIHRoZSBmaXJzdCBwbG90LiAqL1xuICBwcml2YXRlIHBsb3REaXYgPSAnJztcbiAgLyoqXG4gICAqIFdoZXRoZXIgcmVnaW9ucyBjYW4gYmUgc2hvd24gaW4gM0Qgb24gc2NyZWVuOiBhIG5hcGFyaSB2b2x1bWUgKG9yIGlzb3N1cmZhY2UpIHZpZXcsIG9yIHRoZSAzRFxuICAgKiBzcGF0aWFsIGNsb3VkIG92ZXIgYSBzdGFjayBpbWFnZSAoaXRzIHJlZmVyZW5jZSB2b2x1bWUncywgc2VlIHNob3dWb2x1bWVBc0ltYWdlKS4gQm90aCBkcmF3IHRoZVxuICAgKiByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRoZSBzYW1lIHdheSAoVm9sdW1lUmVnaW9uTWVzaGVzKSwgaW4gdGhlIHZvbHVtZSdzIGJveC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdm9sdW1lVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFdoZXRoZXIgYSBuYXBhcmkgdm9sdW1lIChvciBpc29zdXJmYWNlKSB2aWV3IGlzIHRoZSBjdXJyZW50IHBsb3QgdHlwZTogdGhlIHNsaWNlIHBhbmUncy4gKi9cbiAgcHJpdmF0ZSBpbWFnZVZvbHVtZVZpZXcgPSBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3J3Mgc2xpY2UgcGFuZSBpcyB3YW50ZWQgKHNlZSB7QGxpbmsgc2V0U2xpY2VFZGl0b3J9KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzbGljZUVkaXRvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3IGRyYXdzIHRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRocm91Z2ggdGhlIHZvbHVtZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25zVGhyb3VnaFZvbHVtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgYnVpbHQgc28gZmFyLCBieSBpbWFnZSwgcmVzb2x1dGlvbiBhbmQgY2xhc3NlcyAod2l0aCB0aG9zZSBjbGFzc2VzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtZXNoQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBtZXNoOiBNZXNoOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9PigpO1xuICAvKiogQnVtcGVkIHBlciB7QGxpbmsgc2hvd1JlZ2lvbkNsYXNzZXMzZH0gKGFuZCBwZXIgbmV3IGltYWdlKSwgc28gb25seSB0aGUgbGF0ZXN0IG9uZSBzaG93cy4gKi9cbiAgcHJpdmF0ZSBtZXNoUmVxdWVzdCA9IDA7XG4gIC8qKiBUaGUgY2xhc3MgZ3JvdXBzIHNob3duIGluIDNELCBhbmQgdGhlIGltYWdlIHRoZXkgYmVsb25nIHRvLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNsYXNzZXMzZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlYWRvbmx5QXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10gfT4+KFxuICAgIFtdLFxuICApO1xuICBwcml2YXRlIGNsYXNzZXMzZEltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZ3JvdXBzIGxhc3QgYXNrZWQgZm9yIGluIDNELCB3aXRoIHRoZWlyIGNvbG91cnM6IHdoYXQgYW4gZWRpdCdzIHJlYnVpbGQgc2hvd3MgYWdhaW4uICovXG4gIHByaXZhdGUgc2hvd24zZDogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4gPSBbXTtcbiAgLyoqXG4gICAqIEVhY2ggY2xhc3MncyBmaW5nZXJwcmludCBvbiB0aGUgbGl2ZSBzbGljZSAoc2VlIGNsYXNzU2lnbmF0dXJlcyksIHdoaWNoIGltYWdlIGFuZCBzbGljZSwgYW5kXG4gICAqIHdoYXQgdGhlIHJlZ2lvbiBzb3VyY2VzIGhvbGQgKHNlZSBSZWdpb25TdG9yZS5nZXRTb3VyY2VTdGF0ZUtleSkuIE51bGwgd2hpbGUgbm90aGluZyBmb2xsb3dzXG4gICAqIHRoZSBlZGl0cyAobm8gc3VyZmFjZSBidWlsdCwgbm8gc2VjdGlvbnMpLlxuICAgKi9cbiAgcHJpdmF0ZSBsaXZlQ2xhc3NlczogeyBhdDogc3RyaW5nOyBzaWduYXR1cmVzOiBNYXA8c3RyaW5nLCBudW1iZXI+OyBzb3VyY2VzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHBlbmRpbmcgcmVidWlsZCBvZiB0aGUgc3VyZmFjZXMgYW4gZWRpdCB0b3VjaGVkLiAqL1xuICBwcml2YXRlIHJlYnVpbGRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25VcGRhdGVzOiBTdWJzY3JpcHRpb247XG5cbiAgLy8g4pSA4pSAIFRoZSBzbGljZSBwYW5lICh0aGUgdm9sdW1lIHZpZXcncyBzcGxpdCk6IE9TRCBlZGl0aW5nIG9uZSBzbGljZSBiZXNpZGUgdGhlIDNEIHZpZXcg4pSA4pSAXG4gIC8qKiBUaGUgZGl2IHRoZSBzbGljZSBwYW5lIHJlbmRlcnMgaW50byB3aGlsZSBpdCBpcyB3YW50ZWQgKG51bGw6IG5vIHNwbGl0KS4gKi9cbiAgcHJpdmF0ZSBzbGljZURpdjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIE9TRCBpcyBtb3VudGVkIGluIHRoZSBzbGljZSBwYW5lOiByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgZ28gdG8gaXQuICovXG4gIHByaXZhdGUgc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gIC8qKiBUaGUgaW1hZ2UgdGhlIHNsaWNlIHBhbmUgc2hvd3MuICovXG4gIHByaXZhdGUgc2xpY2VGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBCdW1wZWQgcGVyIHNsaWNlLXBhbmUgbW91bnQgb3IgdGVhcmRvd24sIHNvIG9ubHkgdGhlIGxhdGVzdCBvbmUgbGFuZHMuICovXG4gIHByaXZhdGUgc2xpY2VSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHNwbGl0IHZvbHVtZSB2aWV3ICh0aGUgcGxhbmVzIHggYW5kIHkgdGhyb3VnaCB0aGUgc3RhY2spLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3Rpb25zOiBWb2x1bWVTZWN0aW9ucztcbiAgLyoqIFRoZSB6IHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZTogdGhlIHNsaWNlIHRvIHNob3cgKHNlZSB7QGxpbmsgZ2V0U2xpY2VEcmFnJH0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRHJhZyQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvblN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBUaGUgaW1hZ2UgaW5mbyBhbmQgc2NyZWVuIGhlaWdodCBvZiB0aGUgbGFzdCBwbG90ICh3aGF0IHRoZSBzbGljZSBwYW5lIG1vdW50cykuICovXG4gIHByaXZhdGUgcGxvdHRlZEluZm86IElJbWFnZUluZm8gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHJlZ2lvbiBpbXBvcnQgKHNlZSByZWdpb25JbXBvcnRUaWNrZXQpOiBpdHMgaWQgYW5kIHRoZSBpbWFnZSBpdCB3YXMgdGFrZW4gZm9yLiAqL1xuICBwcml2YXRlIGltcG9ydFRpY2tldDogeyBpZDogbnVtYmVyOyBpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7IGlkOiAwLCBpbWFnZTogdW5kZWZpbmVkIH07XG4gIHByaXZhdGUgcGxvdHRlZEhlaWdodCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbG90bHk6IFBsb3RseVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvc2Q6IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSxcbiAgICBwcml2YXRlIG5hcGFyaTogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZpekNvbmZpZyxcbiAgICAvLyBPcHRpb25hbDogYSBob3N0IHRoYXQgc2VydmVzIG5vIHNwYXRpYWwtb21pY3MgZGF0YSBiaW5kcyBub3RoaW5nLFxuICAgIC8vIGFuZCBgZ2V0U3BhdGlhbENvbnRyb2xzKClgIHRoZW4gcmV0dXJucyBudWxsLlxuICAgIHByaXZhdGUgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSxcbiAgICBwcml2YXRlIGludGVuc2l0eTogSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKVxuICAgIHByaXZhdGUgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25SZWdpb25zQ2hhbmdlZCgpKTtcbiAgICB0aGlzLnNlY3Rpb25zID0gbmV3IFZvbHVtZVNlY3Rpb25zKHtcbiAgICAgIHZvbHVtZTogKCkgPT4gdGhpcy5uYXBhcmkudm9sdW1lVm94ZWxzKCksXG4gICAgICBpbWFnZTogKCkgPT4gdGhpcy5wbG90dGVkRmlsZU5hbWUsXG4gICAgICBzaG93UGxhbmVzOiAocGxhbmVzKSA9PiB0aGlzLm5hcGFyaS5zZXRTbGljZVBsYW5lcyhwbGFuZXMpLFxuICAgICAgb3V0bGluZXNCeUNsYXNzOiAobGV2ZWwpID0+IHRoaXMucmVnaW9uU3RvcmUub3V0bGluZXNCeUNsYXNzKGxldmVsKSxcbiAgICAgIGlzQ2xhc3NIaWRkZW46IChsYWJlbCkgPT4gdGhpcy5yZWdpb25TdG9yZS5pc0NsYXNzSGlkZGVuKGxhYmVsKSxcbiAgICAgIGNvbG9yT2Y6IChsYWJlbCkgPT4gdGhpcy5jbGFzc0NvbG9yKGxhYmVsKSxcbiAgICAgIGNoYW5uZWxTdGF0ZXM6ICgpID0+IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIGNvbG9ybWFwOiAoc3QsIG11bHRpY2hhbm5lbCkgPT4ge1xuICAgICAgICAvLyBBcyB0aGUgdm9sdW1lIHNjZW5lIGNvbG91cnMgdGhlIGNoYW5uZWwgKGludmVydCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUgY29sb3JtYXApLlxuICAgICAgICBjb25zdCBkaXNwbGF5ID0ge1xuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnN0b3JlLmN1cnJlbnRDb2xvcm1hcCgpLFxuICAgICAgICAgIHJldmVyc2U6IHRoaXMuc3RvcmUuY3VycmVudFJldmVyc2VTY2FsZSgpLFxuICAgICAgICAgIGludmVydDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29sb3JtYXAoXG4gICAgICAgICAgbXVsdGljaGFubmVsID8gY2hhbm5lbFRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnLCBkaXNwbGF5KSA6IHZvbHVtZUNvbG9ybWFwKHN0LCBkaXNwbGF5KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBpbnZlcnQ6ICgpID0+IHRoaXMuc3RvcmUuY3VycmVudEludmVydCgpLFxuICAgICAgc2xpY2U6ICgpID0+IHRoaXMuY3VycmVudFpJbmRleCxcbiAgICB9KTtcbiAgICAvLyBBIHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZTogdGhlIHogcGxhbmUgcGlja3MgdGhlIHNsaWNlICh0aHJvdWdoIHRoZSBob3N0J3Mgc2xpZGVyLCBzb1xuICAgIC8vIHRoZSBzdG9yZSBhbmQgdGhlIHNsaWNlIHBhbmUgZm9sbG93KSwgdGhlIG90aGVycyBtb3ZlIHRoZWlyIHNlY3Rpb24uXG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQoXG4gICAgICB0aGlzLm5hcGFyaS5nZXRTbGljZVBsYW5lTW92ZSQoKS5zdWJzY3JpYmUoKHsgYXhpcywgdmFsdWUgfSkgPT4ge1xuICAgICAgICBpZiAoYXhpcyA9PT0gJ3onKSB0aGlzLnNsaWNlRHJhZyQubmV4dChNYXRoLnJvdW5kKHZhbHVlKSk7XG4gICAgICAgIGVsc2UgdGhpcy5zZWN0aW9ucy5zZXRQbGFuZShheGlzLCB2YWx1ZSk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCkpKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZCh0aGlzLnN0b3JlLmdldEludmVydCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCkpKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZCh0aGlzLnN0b3JlLmdldENvbG9ybWFwKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICB9XG5cbiAgLyoqIEEgY2xhc3MncyBjb2xvdXI6IGl0cyBjbGFzc2lmaWNhdGlvbiBjb2xvdXIsIGVsc2UgaXRzIHJlZ2lvbiBzb3VyY2UncywgZWxzZSBhIGRlZmF1bHQuICovXG4gIHByaXZhdGUgY2xhc3NDb2xvcihsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdG9yZS5nZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpLmdldChsYWJlbCkgPz9cbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldygpPy5jb2xvck9mKHsgbGFiZWwsIGNvbG9yOiBudWxsIH0pID8/XG4gICAgICAnI2ZmY2MwMCdcbiAgICApO1xuICB9XG5cbiAgLyoqIFRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHNwbGl0IHZvbHVtZSB2aWV3IChudWxscyB3aGlsZSBpdCBpcyBub3Qgc3BsaXQpLiAqL1xuICBnZXRTZWN0aW9uVmlld3MkKCk6IE9ic2VydmFibGU8U2VjdGlvblZpZXdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VjdGlvbnMuZ2V0Vmlld3MkKCk7XG4gIH1cblxuICAvKiogTW92ZSBhIHNlY3Rpb24ncyBwbGFuZSB0byBgYXRgIChpbWFnZSBweCkuICovXG4gIHNldFNlY3Rpb25QbGFuZShheGlzOiBTZWN0aW9uQXhpcywgYXQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VjdGlvbnMuc2V0UGxhbmUoYXhpcywgYXQpO1xuICB9XG5cbiAgLyoqIFRoZSBzbGljZSBwaWNrZWQgYnkgZHJhZ2dpbmcgdGhlIHogcGxhbmUgaW4gdGhlIHZvbHVtZTogdGhlIGhvc3Qgc2hvd3MgaXQgKGl0cyBzbGlkZXIpLiAqL1xuICBnZXRTbGljZURyYWckKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VEcmFnJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbWFnZVR5cGUodDogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdCA9PT0gUGxvdFR5cGUuSU1BR0U7XG4gIH1cblxuICAvKiogVGhlIDJEIG5hcGFyaSB0eXBlcyAoaW1hZ2UsIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyLCBzcGF0aWFsIG9taWNzKSDigJQgYSAyRCBmYWxsYmFjayBjaGFpblxuICAgKiAgKE9TRCwgdGhlbiBQbG90bHkpLlxuICAgKlxuICAgKiAgTk9URSBmb3IgU1BBVElBTF9PTUlDUzogb25seSBuYXBhcmktanMgZHJhd3MgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMuIElmIGl0IGZhaWxzIChubyBXZWJHUFUsXG4gICAqICBkZXZpY2UgbG9zcykgdGhlIGZhbGxiYWNrIHJlbmRlcnMgdGhlIHRpc3N1ZSBpbWFnZSBBTE9ORSDigJQgdGhlIHNwYXRpYWwgbGF5ZXIgaXMgYWJzZW50LCBub3RcbiAgICogIGRlZ3JhZGVkLiBUaGF0IGlzIGRlbGliZXJhdGUgZm9yIG5vdzogc2hvd2luZyB0aGUgc2xpZGUgYmVhdHMgc2hvd2luZyBub3RoaW5nLCBhbmQgYSBQbG90bHlcbiAgICogIGBzY2F0dGVyZ2xgIHNwYXRpYWwgbW9kZSBpcyB0aGUgcGxhbm5lZCByZWFsIGZhbGxiYWNrIChzZWUgdGhlIHBsb3QtbW9kZSBkZXNpZ24gZG9jKS4gKi9cbiAgcHJpdmF0ZSBpc05hcGFyaUltYWdlVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ID09PSBQbG90VHlwZS5OQVBBUklfSU1BR0UgfHwgaXNOYXBhcmlTY2F0dGVyKHQpIHx8IGlzU3BhdGlhbE9taWNzKHQpO1xuICB9XG5cbiAgLyoqIFRoZSAzRCBuYXBhcmkgdHlwZXMgKHZvbHVtZS9pc29zdXJmYWNlL3N1cmZhY2Uvc2NhdHRlciwgcGx1cyB0aGUgM0Qgc3BhdGlhbCBjbG91ZCkg4oCUIG5vIDJEXG4gICAqICBmYWxsYmFjayBleGlzdHMgKE9TRCBpcyBpbWFnZS1vbmx5KSwgc28gdGhleSBmYWxsIHN0cmFpZ2h0IHRvIFBsb3RseS4gKi9cbiAgcHJpdmF0ZSBpc05hcGFyaTNkVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05hcGFyaTNkKHQpIHx8IGlzU3BhdGlhbE9taWNzM2QodCk7XG4gIH1cblxuICAvKipcbiAgICogQmFja2VuZCB0byBhdHRlbXB0IGZvciB0aGUgY3VycmVudCBwbG90IHR5cGUgdGhpcyByZW5kZXIuIFRoZSBmYWxsYmFjayBjaGFpbnMgYmVsb3cgYXJlXG4gICAqIG1pcnJvcmVkIGV4YWN0bHkgYnkge0BsaW5rIGxvYWR9IHNvIHRoZSBoYW5kbGUgYHBsb3QoKWAgcmVjZWl2ZXMgYWx3YXlzIGNvbWVzIGZyb20gdGhlXG4gICAqIGJhY2tlbmQgYHBsb3QoKWAgc2VsZWN0cyAobm8gbG9hZC9wbG90IGJhY2tlbmQgbWlzbWF0Y2gpOlxuICAgKiAgLSAyRCBpbWFnZSAoZXhwbGljaXQgYE5BUEFSSV9JTUFHRWAsIG9yIGBJTUFHRWAgd2l0aCB0aGUgV2ViR1BVIG9wdC1pbik6IG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkuXG4gICAqICAtIHBsYWluIGBJTUFHRWAgKG5vIG9wdC1pbik6IE9TRCDihpIgUGxvdGx5LlxuICAgKiAgLSAzRCBuYXBhcmkgKGBOQVBBUklfVk9MVU1FYC9gTkFQQVJJX0lTT1NVUkZBQ0VgKTogbmFwYXJpLWpzIOKGkiBQbG90bHkgKE9TRCBjYW4ndCByZW5kZXIgM0QpLlxuICAgKi9cbiAgcHJpdmF0ZSBpbWFnZUJhY2tlbmQoKTogSVZpZXdlckJhY2tlbmQge1xuICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQbG90VHlwZTtcbiAgICAvLyAyRCBpbWFnZSB3aXRoIGEgbmFwYXJpLWpzIGF0dGVtcHQgKGV4cGxpY2l0IG5hcGFyaSBpbWFnZSwgb3Igb3B0LWluIG9uIHRoZSBJbWFnZSB0eXBlKS5cbiAgICBpZiAodGhpcy5pc05hcGFyaUltYWdlVHlwZSh0KSB8fCAodGhpcy5pc0ltYWdlVHlwZSh0KSAmJiB0aGlzLmNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcikpIHtcbiAgICAgIGlmICghdGhpcy5uYXBhcmlGZWxsQmFjaykgcmV0dXJuIHRoaXMubmFwYXJpO1xuICAgICAgaWYgKCF0aGlzLm9zZEZlbGxCYWNrKSByZXR1cm4gdGhpcy5vc2Q7XG4gICAgICByZXR1cm4gdGhpcy5wbG90bHk7XG4gICAgfVxuICAgIC8vIFBsYWluIEltYWdlIHR5cGUgKG5vIG5hcGFyaSBvcHQtaW4pOiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgIGlmICh0aGlzLmlzSW1hZ2VUeXBlKHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2RGZWxsQmFjayA/IHRoaXMucGxvdGx5IDogdGhpcy5vc2Q7XG4gICAgfVxuICAgIC8vIDNEIG5hcGFyaSB0eXBlczogbmFwYXJpLWpzLCB3aXRoIFBsb3RseSBhcyB0aGUgb25seSB2aWFibGUgZmFsbGJhY2suXG4gICAgaWYgKHRoaXMuaXNOYXBhcmkzZFR5cGUodCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hcGFyaUZlbGxCYWNrID8gdGhpcy5wbG90bHkgOiB0aGlzLm5hcGFyaTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5O1xuICB9XG5cbiAgLyoqIEJhY2tlbmQgY3VycmVudGx5IG9uIHNjcmVlbiDigJQgd2hhdCBvbmdvaW5nIHpvb20vdG9vbC9yZWdpb24gb3BzIGFjdCBvbi4gKi9cbiAgcHJpdmF0ZSByZW5kZXJlcigpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlbmRlcmVkID8/IHRoaXMucGxvdGx5O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhY2tlbmQgcmVnaW9uLCB0b29sIGFuZCBvdmVybGF5IGNhbGxzIGFjdCBvbjogdGhlIHNsaWNlIHBhbmUncyBPU0Qgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzXG4gICAqIHNwbGl0IChyZWdpb25zIGFyZSBlZGl0ZWQgdGhlcmUpLCBlbHNlIHRoZSBiYWNrZW5kIG9uIHNjcmVlbi4gVmlldyBjYWxscyAoem9vbSwgZml0LCBjb2xvdXIsXG4gICAqIGV4cG9ydCkgc3RheSB3aXRoIHtAbGluayByZW5kZXJlcn0uXG4gICAqL1xuICBwcml2YXRlIHJlZ2lvbkJhY2tlbmQoKTogSVZpZXdlckJhY2tlbmQge1xuICAgIHJldHVybiB0aGlzLnNsaWNlTW91bnRlZCA/IHRoaXMub3NkIDogdGhpcy5yZW5kZXJlcigpO1xuICB9XG5cbiAgLy8gU3lzdGVtIGNhcGFiaWxpdGllcyBhcmUgUGxvdGx5J3MgKHRoZSBmdWxsLWZlYXR1cmVkIGJhY2tlbmQpIHNvIHRoZSBVSVxuICAvLyBrZWVwcyBvZmZlcmluZyBldmVyeSBwbG90IHR5cGUgcmVnYXJkbGVzcyBvZiB3aGljaCBvbmUgaXMgb24gc2NyZWVuLlxuICBnZXQgY2FwYWJpbGl0aWVzKCk6IFZpZXdlckNhcGFiaWxpdGllcyB7XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmNhcGFiaWxpdGllcztcbiAgfVxuXG4gIC8vIOKUgOKUgCByZW5kZXIgLyB2aWV3cG9ydCDihpIgYWN0aXZlIHJlbmRlcmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIC8vIEEgc3RhY2sgY2FuIG9wZW4gYXdheSBmcm9tIHNsaWNlIDAgKGBpbml0aWFsWkluZGV4YCDigJQgYSB2b2x1bWUgb3BlbnNcbiAgICAvLyBtaWQtc3BlY2ltZW4pLCBhbmQgdGhhdCBhcnJpdmVzIGhlcmUgcmF0aGVyIHRoYW4gdGhyb3VnaCBzZXRaSW5kZXguXG4gICAgdGhpcy5jdXJyZW50WkluZGV4ID0gekluZGV4O1xuICAgIGNvbnN0IGJhY2tlbmQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIGlmIChiYWNrZW5kID09PSB0aGlzLm5hcGFyaSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubmFwYXJpLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWJvcnRlZDogbm9ib2R5IHdhbnRzIHRoaXMgaW1hZ2UgYW55IG1vcmUsIHNvIGRvbid0IGdvIG9uIHRvIGxvYWQgaXQgZWxzZXdoZXJlLlxuICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSB0cnVlO1xuICAgICAgICAvLyBNaXJyb3IgaW1hZ2VCYWNrZW5kKCkncyBmYWxsYmFjayBzbyBsb2FkICsgcGxvdCBwaWNrIHRoZSBzYW1lIGJhY2tlbmQ6XG4gICAgICAgIC8vICAtIDNEIG5hcGFyaSB0eXBlcyBoYXZlIG5vIDJEIGZhbGxiYWNrIOKGkiBzdHJhaWdodCB0byBQbG90bHkuXG4gICAgICAgIC8vICAtIDJEIGltYWdlIOKGkiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgICAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBQbG90bHkuJywgZXJyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBPcGVuU2VhZHJhZ29uLicsIGVycik7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmFja2VuZCA9PT0gdGhpcy5vc2QpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUcnkgT1NEOyBvbiBmYWlsdXJlIGZhbGwgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UgKG5vdCBwZXJtYW5lbnQg4oCUIHNlZSByZXNldCgpKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlhT3NkVGhlblBsb3RseShcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgekluZGV4OiBudW1iZXIsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub3NkLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBPcGVuU2VhZHJhZ29uIGxvYWQgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlLicsIGVycik7XG4gICAgICB0aGlzLm9zZEZlbGxCYWNrID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgfVxuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMucGxvdHRlZEZpbGVOYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICB0aGlzLnBsb3R0ZWRJbmZvID0gaW1hZ2VJbmZvID8/IG51bGw7XG4gICAgdGhpcy5wbG90dGVkSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuICAgIHRoaXMudXBkYXRlVm9sdW1lVmlldyhwbG90VHlwZSk7XG4gICAgLy8gVGhlIHNsaWNlIHBhbmUgYmVsb25ncyB0byB0aGUgdm9sdW1lIHZpZXc6IGFub3RoZXIgcGxvdCB0eXBlIHRha2VzIGl0IGRvd24gKE9TRCBtYXkgYmVcbiAgICAvLyBhYm91dCB0byBkcmF3IHRoZSBtYWluIHZpZXcsIHdoaWNoIG11c3Qgbm90IGZpbmQgdGhlIHBhbmUncyB2aWV3ZXIgc3RpbGwgbW91bnRlZCkuXG4gICAgaWYgKCF0aGlzLmltYWdlVm9sdW1lVmlldykgdGhpcy51bm1vdW50U2xpY2UoKTtcbiAgICAvLyBSZWdpb24gc3VyZmFjZXMgYmVsb25nIHRvIHRoZSBpbWFnZSB0aGV5IHdlcmUgYnVpbHQgZnJvbTogYW5vdGhlciBpbWFnZSBkcm9wcyB0aGVtLlxuICAgIGlmICh0aGlzLmNsYXNzZXMzZCQudmFsdWUubGVuZ3RoICYmIHRoaXMucGxvdHRlZEZpbGVOYW1lICE9PSB0aGlzLmNsYXNzZXMzZEltYWdlKSB0aGlzLmNsZWFyUmVnaW9uQ2xhc3NlczNkKCk7XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICAvLyBBcHBseSB0aGUgcGVyLWltYWdlIHJlZ2lvbiBjYWNoZSAoc25hcHNob3Qgb2xkIHJlZ2lvbnMsIHJlc3RvcmUgdGhlIG5ld1xuICAgIC8vIGltYWdlJ3MsIGNsZWFyIHNlbGVjdGlvbikgZm9yIHdoaWNoZXZlciBiYWNrZW5kIHJlbmRlcnMg4oCUIFBsb3RseSBkb2VzXG4gICAgLy8gdGhpcyBpbnNpZGUgaXRzIG93biBwbG90KCksIGJ1dCBPU0QgZG9lc24ndCwgc28gZHJpdmUgaXQgaGVyZS4gSWRlbXBvdGVudFxuICAgIC8vIGZvciB0aGUgc2FtZSBpbWFnZSwgc28gaXQncyBzYWZlIHRvIGNhbGwgb24gZXZlcnkgKHJlKXBsb3QuXG4gICAgdGhpcy5wbG90bHkuc2V0QWN0aXZlSW1hZ2UoaW1hZ2VJbmZvKTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5pbWFnZUJhY2tlbmQoKTtcbiAgICAvLyBCb3RoIGJhY2tlbmRzIHNoYXJlIHRoZSBzYW1lIGRpdiDigJQgdGVhciBkb3duIHRoZSBvdXRnb2luZyBvbmUgb24gc3dpdGNoLlxuICAgIC8vIFBsb3RseSBtdXN0IGJlICpwdXJnZWQqIChub3QgcmVzZXQsIHdoaWNoIHJlLWRyYXdzIGVtcHR5IGF4ZXMpIGJlZm9yZSBPU0RcbiAgICAvLyB0YWtlcyB0aGUgZGl2LlxuICAgIGlmICh0aGlzLmxhc3RSZW5kZXJlZCAmJiB0aGlzLmxhc3RSZW5kZXJlZCAhPT0gbmV4dCkge1xuICAgICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkID09PSB0aGlzLnBsb3RseSkgdGhpcy5wbG90bHkucHVyZ2VQbG90KCk7XG4gICAgICBlbHNlIHRoaXMubGFzdFJlbmRlcmVkLnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMubGFzdFJlbmRlcmVkID0gbmV4dDtcbiAgICBjb25zdCBwbG90dGVkID0gbmV4dC5wbG90KHBsb3REaXYsIGltYWdlTG9hZGVkLCBpbWFnZUluZm8sIHNjcmVlbkhlaWdodCwgcGxvdFR5cGUsIGluUGxhY2UpO1xuICAgIGlmICghdGhpcy5zbGljZURpdiB8fCAhdGhpcy5pbWFnZVZvbHVtZVZpZXcpIHJldHVybiBwbG90dGVkO1xuICAgIC8vIFRoZSBzcGxpdCB2b2x1bWUgdmlldzogdGhlIHNsaWNlIHBhbmUgZm9sbG93cyB0aGUgaW1hZ2UgKGEgbmV3IG9uZSwgb3IgaXRzIHNoYXJwZXIgcGFzcykuXG4gICAgcmV0dXJuIHBsb3R0ZWQudGhlbigob2spID0+IHtcbiAgICAgIGlmIChvayAmJiAoIXRoaXMuc2xpY2VNb3VudGVkIHx8IHRoaXMuc2xpY2VGaWxlICE9PSBpbWFnZUluZm8/LmZpbGVOYW1lIHx8IGluUGxhY2UpKSB7XG4gICAgICAgIHZvaWQgdGhpcy5tb3VudFNsaWNlKCEhaW5QbGFjZSAmJiB0aGlzLnNsaWNlTW91bnRlZCAmJiB0aGlzLnNsaWNlRmlsZSA9PT0gaW1hZ2VJbmZvPy5maWxlTmFtZSk7XG4gICAgICB9XG4gICAgICAvLyBUaGUgdm9sdW1lIHdhcyBhc3NlbWJsZWQgYWdhaW4gKGFub3RoZXIgaW1hZ2UsIG9yIHJlc29sdXRpb24pOiBjdXQgdGhlIHNlY3Rpb25zIGZyb20gaXQuXG4gICAgICBpZiAob2spIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgICAgIHJldHVybiBvaztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGUgdm9sdW1lIHZpZXc6IHNob3cgdGhlIHNsaWNlIGJlaW5nIGVkaXRlZCBpbiBgZGl2YCAoT3BlblNlYWRyYWdvbiwgd2l0aCBldmVyeSByZWdpb25cbiAgICogdG9vbCkgYmVzaWRlIHRoZSAzRCB2aWV3LCBvciBzdG9wIChudWxsKS4gS2VwdCBhY3Jvc3MgcmUtcGxvdHMgb2YgYSB2b2x1bWUgdmlldzsgYW5vdGhlciBwbG90XG4gICAqIHR5cGUgdGFrZXMgdGhlIHBhbmUgZG93biBhbmQgYSB2b2x1bWUgdmlldyBicmluZ3MgaXQgYmFjay4gUmVzb2x2ZXMgd2hldGhlciB0aGUgcGFuZSBzaG93cy5cbiAgICovXG4gIGFzeW5jIHNldFNsaWNlRWRpdG9yKGRpdjogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuc2xpY2VEaXYgPSBkaXY7XG4gICAgaWYgKHRoaXMuc2xpY2VFZGl0b3IkLnZhbHVlICE9PSAhIWRpdikgdGhpcy5zbGljZUVkaXRvciQubmV4dCghIWRpdik7XG4gICAgaWYgKCFkaXYpIHtcbiAgICAgIHRoaXMudW5tb3VudFNsaWNlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vdW50U2xpY2UoZmFsc2UpO1xuICB9XG5cbiAgLyoqIE1vdW50IChvciByZWZyZXNoIGluIHBsYWNlKSBPU0QgaW4gdGhlIHNsaWNlIHBhbmUgb24gdGhlIGRpc3BsYXllZCBzbGljZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNsaWNlKGluUGxhY2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkaXYgPSB0aGlzLnNsaWNlRGl2O1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnBsb3R0ZWRJbmZvO1xuICAgIGlmICghZGl2IHx8ICFpbmZvPy51cmxzPy5sZW5ndGggfHwgIXRoaXMuaW1hZ2VWb2x1bWVWaWV3KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5zbGljZVJlcXVlc3Q7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHRoaXMub3NkLmxvYWQoaW5mbywgdGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLm9zZC5wbG90KGRpdiwgbG9hZGVkLCBpbmZvLCB0aGlzLnBsb3R0ZWRIZWlnaHQsIFBsb3RUeXBlLklNQUdFLCBpblBsYWNlKTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5zbGljZU1vdW50ZWQgPSBvaztcbiAgICAgIHRoaXMuc2xpY2VGaWxlID0gaW5mby5maWxlTmFtZTtcbiAgICAgIGlmIChvaykge1xuICAgICAgICAvLyBUaGUgc2xpY2UgbWF5IGhhdmUgbW92ZWQgd2hpbGUgdGhlIHBhbmUgbG9hZGVkLlxuICAgICAgICB0aGlzLm9zZC5zZXRaSW5kZXgodGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgICAgdGhpcy50cmFja0xpdmVDbGFzc2VzKCk7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMuc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvaztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChyZXF1ZXN0ID09PSB0aGlzLnNsaWNlUmVxdWVzdClcbiAgICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gVGhlIHNsaWNlIHBhbmUgY291bGQgbm90IHNob3cgdGhlIGltYWdlLicsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRha2UgdGhlIHNsaWNlIHBhbmUncyB2aWV3ZXIgZG93biAodGhlIHNwbGl0IHN0YXlzIHdhbnRlZCB3aGlsZSB7QGxpbmsgc2xpY2VEaXZ9IGlzIHNldCkuICovXG4gIHByaXZhdGUgdW5tb3VudFNsaWNlKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VSZXF1ZXN0Kys7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB7XG4gICAgICB0aGlzLm9zZC5yZXNldCgpO1xuICAgICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgfVxuICAgIHRoaXMuc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZUZpbGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZWxvYWRBbmRQbG90KCk7XG4gIH1cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgb2YgYSByZW5kZXIgY3ljbGU6IHJlLWVuYWJsZSBuYXBhcmktanMvT1NEIGF0dGVtcHRzIChjbGVhciBhbnkgcHJpb3JcbiAgICAvLyBwZXItaW1hZ2UgZmFsbGJhY2spIGFuZCB0ZWFyIGRvd24gd2hhdGV2ZXIncyBvbiBzY3JlZW4uXG4gICAgdGhpcy5vc2RGZWxsQmFjayA9IGZhbHNlO1xuICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVzZXQoKTtcbiAgfVxuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVsYXlvdXQodHJ1ZUltYWdlU2l6ZSk7XG4gIH1cbiAgcmVzZXRBeGVzKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZXNldEF4ZXMoKTtcbiAgfVxuICBmaXRUb1ZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmZpdFRvVmlldygpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30uICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpdFRvVmlldygpO1xuICB9XG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbUluKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbU91dCgpO1xuICB9XG4gIHNldERyYWdNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldERyYWdNb2RlKG1vZGUpO1xuICAgIGlmICh0aGlzLnNsaWNlTW91bnRlZCkgdGhpcy5vc2Quc2V0RHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEV2ZXJ5IGJhY2tlbmQsIG9uIHNjcmVlbiBvciBub3QuICovXG4gIHByaXZhdGUgYmFja2VuZHMoKTogSVZpZXdlckJhY2tlbmRbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmF2aWdhdG9yIC8gc21vb3RoaW5nIG9wdGlvbnMsIGFwcGxpZWQgdG8gRVZFUlkgYmFja2VuZCB0aGF0IGhhcyB0aGVtIChub3RcbiAgICoganVzdCB0aGUgYWN0aXZlIHJlbmRlcmVyKTogY29uc3VtZXJzIHNldCB0aGVtIGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyLCB3aGVuXG4gICAqIGByZW5kZXJlcigpYCBpcyBzdGlsbCB0aGUgUGxvdGx5IGRlZmF1bHQsIGFuZCBPU0QvbmFwYXJpLWpzIG11c3QgcmVjZWl2ZSB0aGVtXG4gICAqIHRvIGhvbm91ciB0aGVtIGF0IHZpZXdlciBjcmVhdGlvbi5cbiAgICovXG4gIGdldE9zZFZpZXdPcHRpb25zKCk6IElPc2RWaWV3T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMudmlld09wdGlvbnM7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3T3B0aW9uczogSU9zZFZpZXdPcHRpb25zID0ge1xuICAgIHNldE5hdmlnYXRvclZpc2libGU6ICh2aXNpYmxlKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZSk7XG4gICAgfSxcbiAgICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQ6IChlbmFibGVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgICB9LFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldE5hdmlnYXRvclZpc2libGUoKWAuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlld09wdGlvbnMuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYC4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdPcHRpb25zLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgfVxuICBzZXRTaG93U3RhY2soc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFNob3dTdGFjayhzaG93c3RhY2spO1xuICB9XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFpJbmRleCA9IHpJbmRleDtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0WkluZGV4KHpJbmRleCk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB7XG4gICAgICB0aGlzLm9zZC5zZXRaSW5kZXgoekluZGV4KTtcbiAgICAgIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgICB9XG4gIH1cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFRydWVJbWFnZVNpemUoKTtcbiAgfVxuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEN1cnJlbnRJbWFnZSgpO1xuICB9XG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldERpc3BsYXllZFBpeGVsRGF0YSgpO1xuICB9XG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpO1xuICB9XG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmRvd25sb2FkSW1hZ2UoKTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgICB0aGlzLnVwZGF0ZVZvbHVtZVZpZXcocGxvdFR5cGUpO1xuICAgIHRoaXMucGxvdGx5LnNldFBsb3RUeXBlKHBsb3RUeXBlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRTdXJmYWNlM2RDb250cm9scygpYC4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0U3VyZmFjZURyYWdNb2RlKG1vZGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgLiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdXJmYWNlM2RDb250cm9scygpPy5yZXNldFN1cmZhY2VDYW1lcmEoKTtcbiAgfVxuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3RvciBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4gKG5hcGFyaS1qcyksIGVsc2UgbnVsbC4gKi9cbiAgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpOiBJVm9sdW1lUmVzb2x1dGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0Vm9sdW1lUmVzb2x1dGlvbigpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFZvbHVtZVJlc29sdXRpb24oKT8uc2V0KClgLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoc2NhbGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFZvbHVtZVJlc29sdXRpb24oKT8uZ2V0KClgLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWb2x1bWVSZXNvbHV0aW9uKCk/LmdldCgpID8/IDE7XG4gIH1cbiAgLyoqIFRoZSB2aWV3cG9ydCBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIGZvciBhIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZS4gTnVsbFxuICAgKiAgd2hlbiB0aGF0IGJhY2tlbmQgY2Fubm90IHByb3ZpZGUgb25lIChlLmcuIE9TRCBmZWxsIGJhY2sgdG8gUGxvdGx5KS4gKi9cbiAgZ2V0UGxvdE1vZGVWaWV3cG9ydCgpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRQbG90TW9kZVZpZXdwb3J0Py4oKSA/PyBudWxsO1xuICB9XG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTogUGxvdFR5cGVEZXNjcmlwdG9yW10ge1xuICAgIC8vIFBsb3RseSBlbnVtZXJhdGVzIHRoZSBmdWxsIFBMT1RfVFlQRV9ERVNDUklQVE9SUyBtYXAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgdGhlXG4gICAgLy8gbmFwYXJpLWpzIFdlYkdQVSB0eXBlcyAoaml0LXVpIzEwMikg4oCUIHNvIHRoaXMgc2luZ2xlIHNvdXJjZSBjb3ZlcnMgdGhlbSAobm8gZHVwbGljYXRlcykuXG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBsb25nLWxpdmVkIG9ic2VydmFibGVzICsgc3RhY2sgZmxhZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHNldFN0YWNrTG9hZGluZyhiOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0U3RhY2tMb2FkaW5nKGIpO1xuICB9XG4gIC8vIENhbmNlbCBpbi1mbGlnaHQgbG9hZGluZyBvbiBldmVyeSBiYWNrZW5kIOKAlCB0aGUgdXNlcidzIENhbmNlbCBzaG91bGRuJ3QgZGVwZW5kIG9uIHdoaWNoIG9uZSBpc1xuICAvLyBhY3RpdmUuIE9ubHkgYmFja2VuZHMgdGhhdCBzdHJlYW0gZnJhbWVzIChuYXBhcmktanMpIGRvIHJlYWwgd29yazsgdGhlIHJlc3Qgbm8tb3AuIFRoZSBjb25jcmV0ZVxuICAvLyBiYWNrZW5kIGNsYXNzZXMgZG9uJ3QgYWxsIGRlY2xhcmUgdGhlIG9wdGlvbmFsIGNvbnRyYWN0IG1ldGhvZCwgc28gY2FsbCBpdCB2aWEgSVZpZXdlckJhY2tlbmQuXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBiYWNrZW5kIG9mIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXSBhcyBJVmlld2VyQmFja2VuZFtdKSB7XG4gICAgICBiYWNrZW5kLmNhbmNlbExvYWRpbmc/LigpO1xuICAgIH1cbiAgfVxuICAvLyBMb2FkaW5nIHN0YXRlIGlzIHN1cmZhY2VkIGZyb20gd2hpY2hldmVyIGJhY2tlbmQgaXMgZG9pbmcgdGhlIHdvcms6IE9TRCBhbmQgbmFwYXJpLWpzICh2b2x1bWVcbiAgLy8gYXNzZW1ibHkpIGRyaXZlIHRoZWlyIG93biBzdWJqZWN0cywgc28gbWVyZ2UgYWxsIHRocmVlIGludG8gb25lIHN0YWJsZSBzdHJlYW0gdGhlIGhvc3RcbiAgLy8gc3Vic2NyaWJlcyB0byBvbmNlLiAoUHJldmlvdXNseSBoYXJkY29kZWQgdG8gUGxvdGx5LCBzbyBuYXBhcmkvT1NEIHByb2dyZXNzIG5ldmVyIHNob3dlZC4pXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMucGxvdGx5LmlzU3RhY2tMb2FkaW5nKCksXG4gICAgICB0aGlzLm9zZC5pc1N0YWNrTG9hZGluZygpLFxuICAgICAgdGhpcy5uYXBhcmkuaXNTdGFja0xvYWRpbmcoKSxcbiAgICBdKS5waXBlKG1hcCgoZmxhZ3MpID0+IGZsYWdzLnNvbWUoQm9vbGVhbikpKTtcbiAgfVxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIC8vIFJlcG9ydCB0aGUgcHJvZ3Jlc3Mgb2Ygd2hpY2hldmVyIGJhY2tlbmQgaXMgQUNUSVZFTFkgbG9hZGluZyAobWF4IGFjcm9zcyBhY3RpdmUgb25lcykuIEEgcGxhaW5cbiAgICAvLyBtZXJnZSBsZXQgYW4gaWRsZSBiYWNrZW5kJ3Mgc3RhbGUgdmFsdWUgd2luIHRoZSBzdHJlYW0gb24gYSByZS1sb2FkIOKAlCBsZWF2aW5nIHRoZSBiYXIgYmVsb3cgdGhlXG4gICAgLy8gYWN0aXZlIGJhY2tlbmQncyByZWFsIHByb2dyZXNzIChlLmcuIHN0dWNrIH7ihZMgd2hpbGUgdGhlICUgcmVhZCAxMDApLiBHYXRpbmcgYnkgdGhlIGxvYWRpbmcgZmxhZ1xuICAgIC8vIGlnbm9yZXMgaWRsZSBiYWNrZW5kcywgc28gdGhlIGJhciB0cmFja3MgdGhlIG9uZSBkb2luZyB0aGUgd29yayBhbmQgcmVhY2hlcyAxMDAlLlxuICAgIGNvbnN0IHRyYWNrID0gKHY6IElWaWV3ZXJCYWNrZW5kKTogT2JzZXJ2YWJsZTxbbnVtYmVyLCBib29sZWFuXT4gPT5cbiAgICAgIGNvbWJpbmVMYXRlc3QoW3YuZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKSwgdi5pc1N0YWNrTG9hZGluZygpXSk7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RyYWNrKHRoaXMucGxvdGx5KSwgdHJhY2sodGhpcy5vc2QpLCB0cmFjayh0aGlzLm5hcGFyaSldKS5waXBlKFxuICAgICAgbWFwKChwYWlycykgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBwYWlycy5maWx0ZXIoKFssIGxvYWRpbmddKSA9PiBsb2FkaW5nKS5tYXAoKFtwXSkgPT4gcCk7XG4gICAgICAgIHJldHVybiBhY3RpdmUubGVuZ3RoID8gTWF0aC5tYXgoLi4uYWN0aXZlKSA6IDA7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIC8vIEV2ZXJ5IGJhY2tlbmQgZml0cyB0byB2aWV3IG9uIGl0cyBvd24gKFBsb3RseSdzIGF1dG9zY2FsZSwgT1NEJ3MgZ29Ib21lLCBuYXBhcmkncyBjYW1lcmFcbiAgLy8gZml0KSBhbmQgZWFjaCBlbWl0cyBmcm9tIGl0cyBvd24gc3ViamVjdCwgc28gbWVyZ2UgYWxsIHRocmVlOiBsaXN0ZW5pbmcgdG8gUGxvdGx5IGFsb25lXG4gIC8vIG1pc3NlZCB0aGUgY29udGV4dC1tZW51IEF1dG9zY2FsZSBvbiB0aGUgSW1hZ2UgYW5kIG5hcGFyaSB2aWV3cy5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgdGhpcy5wbG90bHkuZ2V0QXV0b3NjYWxlRXZlbnQoKSxcbiAgICAgIHRoaXMub3NkLmdldEF1dG9zY2FsZUV2ZW50KCksXG4gICAgICB0aGlzLm5hcGFyaS5nZXRBdXRvc2NhbGVFdmVudCgpLFxuICAgICkucGlwZShtYXAoKCkgPT4gdW5kZWZpbmVkKSk7XG4gIH1cbiAgLyoqIFRoZSBsaW5lLVJPSSBwcm9maWxlczogc2FtcGxlZCBieSB0aGUgYmFja2VuZC1uZXV0cmFsIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlLiAqL1xuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eS5nZXRJbnRlbnNpdHlQcm9maWxlJCgpO1xuICB9XG4gIC8vIFRoZSBpbnRlbnNpdHkgaW5zZXQgaXMgYSBQbG90bHkgTElORSBjaGFydCDigJQgcmVuZGVyIGl0IHRocm91Z2ggUGxvdGx5IHdoaWNoZXZlclxuICAvLyBiYWNrZW5kIGRyYXdzIHRoZSBtYWluIGltYWdlLlxuICByZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZDogc3RyaW5nLCBwcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkucmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQsIHByb2ZpbGVzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCByZWdpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBSZWdpb24gc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBSZWdpb25TdG9yZSwgc28gZXZlcnkgcmVhZCBhbmQgd3JpdGUgZ29lc1xuICAvLyBzdHJhaWdodCB0byBpdC4gRXZlcnkgYmFja2VuZCBkcmF3cyBmcm9tIHRoZSBzdG9yZSdzIGV2ZW50czogdGhlIE9TRCBhbmRcbiAgLy8gbmFwYXJpLWpzIG92ZXJsYXlzIGFuZCBQbG90bHkncyBzaGFwZSBwcm9qZWN0aW9uIHJlZHJhdyBvbiBpdHMgcmVnaW9uLXVwZGF0ZVxuICAvLyBhbmQgc2VsZWN0aW9uIHN0cmVhbXMsIGFuZCB0aGUgY2FudmFzIHRvb2xzIHJlc2V0IG9uIGdldFJlZ2lvblNldFJlcGxhY2VkJFxuICAvLyAodW5kbywgcmVkbywgYSBzbGljZSBzd2l0Y2gpLlxuICBzZXRSZWdpb25zKFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcbiAgICBhcHBlbmQ/OiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucywgc2hvd1JlZ2lvbkxhYmVsLCBpc1JlZ2lvblNhdmVPbiwgZmlsbENvbG9yLCBhcHBlbmQpO1xuICB9XG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgfVxuICBnZXRSZWdpb25Qb2x5Z29ucygpOiBQb2x5Z29uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblBvbHlnb25zKCk7XG4gIH1cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpO1xuICB9XG4gIHNlbGVjdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0UmVnaW9uKHJlZ2lvbik7XG4gIH1cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTtcbiAgfVxuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7XG4gIH1cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKTtcbiAgfVxuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpO1xuICB9XG4gIGdldEZpbGxDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEZpbGxDb2xvcigpO1xuICB9XG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk7XG4gIH1cbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsLCBjb2xvcik7XG4gIH1cbiAgLy8gQW5ub3RhdGlvbi1jbGFzcyBwcmVzZXRzIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUgKGJhY2tlbmQtbmV1dHJhbFxuICAvLyBzZXNzaW9uIHN0YXRlKSwgc28gcm91dGUgc3RyYWlnaHQgdG8gaXQgcmF0aGVyIHRoYW4gdGhyb3VnaCByZW5kZXJlcigpLiAoaml0LXVpIzcwKVxuICBnZXRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQoKTtcbiAgfVxuICBnZXRQcmVzZXRTZXQkKCk6IE9ic2VydmFibGU8UHJlc2V0U2V0PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UHJlc2V0U2V0JCgpO1xuICB9XG4gIHNldFByZXNldFNldChzZXQ6IFByZXNldFNldCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0UHJlc2V0U2V0KHNldCk7XG4gIH1cbiAgdXBzZXJ0Q2xhc3MocHJlc2V0OiBDbGFzc1ByZXNldCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUudXBzZXJ0Q2xhc3MocHJlc2V0KTtcbiAgfVxuICByZW1vdmVDbGFzcyhuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnJlbW92ZUNsYXNzKG5hbWUpO1xuICB9XG4gIHJlc2V0UHJlc2V0cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnJlc2V0UHJlc2V0cygpO1xuICB9XG4gIHVuZG8oKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS51bmRvKCk7XG4gIH1cbiAgcmVkbygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlZG8oKTtcbiAgfVxuICBjYW5VbmRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblVuZG8oKTtcbiAgfVxuICBjYW5SZWRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblJlZG8oKTtcbiAgfVxuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRDYW5VbmRvJCgpO1xuICB9XG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblJlZG8kKCk7XG4gIH1cbiAgcmVzZXRVbmRvSGlzdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgfVxuICBpbXBvcnRSZWdpb25zKGdlb0pzb25TdHI6IHN0cmluZyk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5pbXBvcnRSZWdpb25zKGdlb0pzb25TdHIpO1xuICB9XG4gIC8qKiBEb3dubG9hZCBgcmVnaW9uc2AgYXMgR2VvSlNPTiwgbmFtZWQgYWZ0ZXIgdGhlIGltYWdlIGxhc3QgcGxvdHRlZC4gKi9cbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZXhwb3J0UmVnaW9ucyhyZWdpb25zLCB0aGlzLnBsb3R0ZWRGaWxlTmFtZSk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zOiBSZWdpb25bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zKTtcbiAgfVxuXG4gIC8qKiBIb2xkIGEgbGFyZ2UgcmVnaW9uIHNldCBhcyBhIHRpbGVkIHJlZ2lvbiBzb3VyY2UgKHNlZSBSZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UpLiAqL1xuICBhdHRhY2hSZWdpb25Tb3VyY2Uoc291cmNlOiBSZWdpb25Tb3VyY2UgfCBSZWdpb25Tb3VyY2VPcGVuZXIsIHNsaWNlcz86IFJlZ2lvblNvdXJjZVNsaWNlcyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHNvdXJjZSwgc2xpY2VzKTtcbiAgfVxuICBhc3luYyBpbXBvcnRSZWdpb25Tb3VyY2UoZ2VvSnNvblN0cjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGdlb0pzb25TdHIubGVuZ3RoIDwgKHRoaXMuY29uZmlnPy5yZWdpb25Tb3VyY2VNaW5DaGFycyA/PyBSRUdJT05fU09VUkNFX01JTl9DSEFSUykpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgb3BlbmVkOiBSZWdpb25Tb3VyY2UgfCBudWxsID0gYXdhaXQgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoZ2VvSnNvblN0cik7XG4gICAgLy8gVGhlIGZpcnN0IG9wZW4gaXMgdGhlIG9uZSBqdXN0IG1hZGU7IGEgc291cmNlIGNsb3NlZCB0byBzYXZlIG1lbW9yeSBwYXJzZXMgYWdhaW4uXG4gICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UoKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gb3BlbmVkO1xuICAgICAgb3BlbmVkID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW5HZW9Kc29uUmVnaW9uU291cmNlKGdlb0pzb25TdHIpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGRyb3BSZWdpb25Tb3VyY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZHJvcFNsaWNlUmVnaW9uU291cmNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQSB0aWNrZXQgZm9yIGEgcmVnaW9uIGltcG9ydCB0aGF0IGlzIGFib3V0IHRvIHJlYWQgb3IgZGVjb2RlIGl0cyBmaWxlczogdGhlIGltcG9ydCBtZXRob2RzXG4gICAqIGdpdmVuIGl0IGNoYW5nZSBub3RoaW5nIG9uY2UgaXQgaXMgc3RhbGUg4oCUIGFub3RoZXIgaW1wb3J0IHRvb2sgYSB0aWNrZXQgc2luY2UsIGFub3RoZXIgaW1hZ2VcbiAgICogd2FzIHBsb3R0ZWQsIG9yIHRoZSBzZXJ2aWNlIHdhcyBkZXN0cm95ZWQg4oCUIHNvIGFuIGltcG9ydCB0aGF0IGZpbmlzaGVzIGxhdGUgbmV2ZXIgbGFuZHMgb24gYW5cbiAgICogaW1hZ2UgaXQgd2FzIG5vdCBzdGFydGVkIGZvci5cbiAgICovXG4gIHJlZ2lvbkltcG9ydFRpY2tldCgpOiBudW1iZXIge1xuICAgIHRoaXMuaW1wb3J0VGlja2V0ID0geyBpZDogdGhpcy5pbXBvcnRUaWNrZXQuaWQgKyAxLCBpbWFnZTogdGhpcy5pbXBvcnRJbWFnZUtleSgpIH07XG4gICAgcmV0dXJuIHRoaXMuaW1wb3J0VGlja2V0LmlkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYHRpY2tldGAgaXMgc3RpbGwgdGhlIGN1cnJlbnQgaW1wb3J0J3MsIG9uIHRoZSBpbWFnZSBpdCB3YXMgdGFrZW4gZm9yLiAqL1xuICBwcml2YXRlIGltcG9ydFRpY2tldFZhbGlkKHRpY2tldDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRpY2tldCA9PT0gdGhpcy5pbXBvcnRUaWNrZXQuaWQgJiYgdGhpcy5pbXBvcnRUaWNrZXQuaW1hZ2UgPT09IHRoaXMuaW1wb3J0SW1hZ2VLZXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW1wb3J0SW1hZ2VLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gUmVnaW9uU2NvcGVDYWNoZS5pbWFnZUtleSh0aGlzLnBsb3R0ZWRJbmZvID8/IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgaW1hZ2UncyByZWdpb25zIGFuZCByZWdpb24gc291cmNlcyB3aXRoIG9uZSBzb3VyY2UgcGVyIHNsaWNlLCBhcyBhbiBpbXBvcnRlZCBsYWJlbFxuICAgKiB2b2x1bWUgb3IgZm9sZGVyIG9mIHBlci1zbGljZSByZWdpb24gZmlsZXMgZ2l2ZXMgdGhlbTogYG9wZW5lcnNgIGJ5IHNsaWNlIGluZGV4LCBlYWNoIG9wZW5lZFxuICAgKiB0aGUgZmlyc3QgdGltZSBpdHMgc2xpY2UgaXMgc2hvd24uIEEgc2luZ2xlIGltYWdlIHRha2VzIHNsaWNlIDAncy4gUmV0dXJucyBob3cgbWFueSBzbGljZXNcbiAgICogaGF2ZSBhIHNvdXJjZSwgb3IgbnVsbCAoY2hhbmdpbmcgbm90aGluZykgd2hlbiBgdGlja2V0YCBpcyBzdGFsZSAoc2VlXG4gICAqIHtAbGluayByZWdpb25JbXBvcnRUaWNrZXR9KS4gVGhlIHNvdXJjZXMgYXJlIG1hcmtlZCBpbXBvcnRlZCwgc28gYSBzYXZlIHdyaXRlcyBldmVyeSBzbGljZS5cbiAgICovXG4gIGltcG9ydFNsaWNlUmVnaW9uU291cmNlcyhvcGVuZXJzOiBSZWFkb25seU1hcDxudW1iZXIsIFJlZ2lvblNvdXJjZU9wZW5lcj4sIHRpY2tldD86IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgIGlmICh0aWNrZXQgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pbXBvcnRUaWNrZXRWYWxpZCh0aWNrZXQpKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLnJlZ2lvbkltcG9ydFRpY2tldCgpOyAvLyBzdXBlcnNlZGVzIGFueSBpbXBvcnQgc3RpbGwgaW4gZmxpZ2h0XG4gICAgY29uc3QgaW5mbyA9IHRoaXMucGxvdHRlZEluZm87XG4gICAgdGhpcy5yZWdpb25TdG9yZS5kZXRhY2hSZWdpb25Tb3VyY2VzKCk7XG4gICAgaWYgKCFpbmZvPy5pc1N0YWNrKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IG9wZW5lcnMuZ2V0KDApID8/IG9wZW5lcnMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgICAgaWYgKCFmaXJzdCkgcmV0dXJuIDA7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShmaXJzdCwgeyBzbGljZTogMCB9LCB0cnVlKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aGlzLmVudGVySW1wb3J0ZWRTdGFjayhpbmZvKTtcbiAgICBmb3IgKGNvbnN0IFt6LCBvcGVuXSBvZiBvcGVuZXJzKSB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShvcGVuLCB7IHNsaWNlOiB6IH0sIHRydWUpO1xuICAgIHJldHVybiBvcGVuZXJzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgaW1hZ2UncyByZWdpb25zIGFuZCByZWdpb24gc291cmNlcyB3aXRoIG9uZSBpbXBvcnRlZCBzb3VyY2UgKGEgcmVnaW9uIHNldCB0aGVcbiAgICogaG9zdCdzIHNlcnZlciBzZXJ2ZXMpOiBvdmVyIGV2ZXJ5IHNsaWNlIG9mIGEgc3RhY2sgd2hlbiBpdCBpcyB6LWluZGV4ZWQsIGVsc2Ugb24gdGhlIHNsaWNlXG4gICAqIHNob3duLCBhcyB7QGxpbmsgYXBwbHlJbWFnZVJvaXN9IGxheXMgb3V0IGFuIGltYWdlJ3Mgb3duLiBSZXNvbHZlcyBmYWxzZSwgY2hhbmdpbmcgbm90aGluZ1xuICAgKiAoYW5kIGRpc3Bvc2luZyB0aGUgc291cmNlKSwgd2hlbiB0aGUgaW1wb3J0IHdlbnQgc3RhbGUgd2hpbGUgaXQgb3BlbmVkOiBhbm90aGVyIGltcG9ydCwgb3JcbiAgICogYW5vdGhlciBpbWFnZSAoc2VlIHtAbGluayByZWdpb25JbXBvcnRUaWNrZXR9OyBvbmUgaXMgdGFrZW4gaGVyZSB3aGVuIGB0aWNrZXRgIGlzIG5vdCBnaXZlbikuXG4gICAqL1xuICBhc3luYyBpbXBvcnRSZWdpb25Tb3VyY2VPcGVuZXIob3BlbjogUmVnaW9uU291cmNlT3BlbmVyLCB0aWNrZXQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBtaW5lID0gdGlja2V0ID8/IHRoaXMucmVnaW9uSW1wb3J0VGlja2V0KCk7XG4gICAgaWYgKCF0aGlzLmltcG9ydFRpY2tldFZhbGlkKG1pbmUpKSByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGZpcnN0OiBSZWdpb25Tb3VyY2UgfCBudWxsID0gYXdhaXQgb3BlbigpO1xuICAgIGlmICghdGhpcy5pbXBvcnRUaWNrZXRWYWxpZChtaW5lKSkge1xuICAgICAgZmlyc3QuZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZXVzZTogUmVnaW9uU291cmNlT3BlbmVyID0gKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gZmlyc3Q7XG4gICAgICBmaXJzdCA9IG51bGw7XG4gICAgICByZXR1cm4gc291cmNlID8gUHJvbWlzZS5yZXNvbHZlKHNvdXJjZSkgOiBvcGVuKCk7XG4gICAgfTtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICBjb25zdCBwbGFuZXMgPSBmaXJzdC5pbmZvLnBsYW5lcztcbiAgICBjb25zdCB6SW5kZXhlZCA9ICEhaW5mbz8uaXNTdGFjayAmJiBwbGFuZXMuc29tZSgocCkgPT4gcCAhPT0gMCk7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5kZXRhY2hSZWdpb25Tb3VyY2VzKCk7XG4gICAgaWYgKHpJbmRleGVkKSB7XG4gICAgICB0aGlzLmVudGVySW1wb3J0ZWRTdGFjayhpbmZvIGFzIElJbWFnZUluZm8pO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UocmV1c2UsICdwbGFuZXMnLCBbLi4ucGxhbmVzXSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShyZXVzZSwgeyBzbGljZTogdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKSB9LCB0cnVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBFbXB0eSBldmVyeSBzbGljZSBvZiBhIHN0YWNrIChpdHMgcmVnaW9ucyBhbmQgdW5kbyBoaXN0b3J5KSBmb3IgcmVnaW9ucyBpbXBvcnRlZCBvdmVyIGl0LiAqL1xuICBwcml2YXRlIGVudGVySW1wb3J0ZWRTdGFjayhpbmZvOiBJSW1hZ2VJbmZvKTogdm9pZCB7XG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpXG4gICAgICA/IHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlTGF5b3V0KClcbiAgICAgIDogaW5mby50aWxlZCA9PT0gZmFsc2VcbiAgICAgICAgPyAncGVyLXNsaWNlLWZpbGUnXG4gICAgICAgIDogJ2NvbWJpbmVkJztcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKG5ldyBNYXAoKSwgdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKSwgbGF5b3V0KTtcbiAgfVxuICBnZXRSZWdpb25Tb3VyY2VWaWV3JCgpOiBPYnNlcnZhYmxlPFJlZ2lvblNvdXJjZVZpZXcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldyQoKTtcbiAgfVxuICBnZXRSZWdpb25Tb3VyY2VJbmRleChxdWVyeTogT21pdDxSZWdpb25JbmRleFF1ZXJ5LCAnZXhjbHVkZSc+KTogUHJvbWlzZTxSZWdpb25JbmRleFBhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VJbmRleChxdWVyeSk7XG4gIH1cbiAgc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSwgYWRkaXRpdmU/OiBib29sZWFuKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLnNlbGVjdFNvdXJjZUZlYXR1cmVzKGlkcywgYWRkaXRpdmUpO1xuICB9XG4gIGRlbGV0ZVNvdXJjZUZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZVNvdXJjZUZlYXR1cmVzKGlkcyk7XG4gIH1cbiAgZ2V0UmVnaW9uU3R5bGUkKCk6IE9ic2VydmFibGU8UmVnaW9uU3R5bGU+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25TdHlsZSQoKTtcbiAgfVxuICBzZXRSZWdpb25TdHlsZShwYXRjaDogUGFydGlhbDxSZWdpb25TdHlsZT4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvblN0eWxlKHBhdGNoKTtcbiAgfVxuICAvLyDilIDilIAgUmVnaW9ucyBpbiAzRDogdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIHNob3duIGluIHRoZSB2b2x1bWUgdmlldyDilIDilIDilIDilIDilIBcblxuICAvKiogUmVjb21wdXRlIHdoaWNoIDNEIHZpZXcgaXMgb24gc2NyZWVuIGZvciBgcGxvdFR5cGVgIChzZWUge0BsaW5rIHZvbHVtZVZpZXckfSkuICovXG4gIHByaXZhdGUgdXBkYXRlVm9sdW1lVmlldyhwbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlVm9sdW1lVmlldyA9IGlzTmFwYXJpVm9sdW1lKHBsb3RUeXBlKSB8fCBpc05hcGFyaUlzb3N1cmZhY2UocGxvdFR5cGUpO1xuICAgIGNvbnN0IHJlZ2lvbnMzZCA9IHRoaXMuaW1hZ2VWb2x1bWVWaWV3IHx8IChpc1NwYXRpYWxPbWljczNkKHBsb3RUeXBlKSAmJiAhIXRoaXMucGxvdHRlZEluZm8/LmlzU3RhY2spO1xuICAgIC8vIEV2ZXJ5IHBsb3QsIGFzIGJlZm9yZTogdGhlIFJlZ2lvbiBFZGl0b3IgZHJvcHMgaXRzIHBlci1jbGFzcyB2b2x1bWVzIG9uIGVhY2ggKGEgbmV3IGltYWdlKS5cbiAgICB0aGlzLnZvbHVtZVZpZXckLm5leHQocmVnaW9uczNkKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGEgbmFwYXJpIHZvbHVtZSAob3IgaXNvc3VyZmFjZSkgdmlldyBpcyBvbiBzY3JlZW46IHJlZ2lvbnMgY2FuIGJlIHNob3duIGluIDNELiAqL1xuICBnZXRWb2x1bWVWaWV3JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy52b2x1bWVWaWV3JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB2b2x1bWUgdmlldydzIHNsaWNlIHBhbmUgaXMgd2FudGVkIChpdCBzaG93cyB3aGlsZSBhIHZvbHVtZSB2aWV3IGlzIG9uIHNjcmVlbikuICovXG4gIGdldFNsaWNlRWRpdG9yJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zbGljZUVkaXRvciQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcgZHJhd3MgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUgdm9sdW1lLiAqL1xuICBnZXRSZWdpb25zVGhyb3VnaFZvbHVtZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUgdm9sdW1lIChpdCBoaWRlcyBub25lIG9mIHRoZW06IHN1cmZhY2VzIGluc2lkZSBpdHNcbiAgICogYnJpZ2h0IHN0cnVjdHVyZXMsIGFuIE9DVCdzIGxheWVyIGJvdW5kYXJpZXMpIG9yIGhpZGRlbiBiZWhpbmQgd2hhdCBpdCBzaG93cyAodGhlIGRlZmF1bHQpLlxuICAgKi9cbiAgc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUodGhyb3VnaDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZ2lvbnNUaHJvdWdoVm9sdW1lJC52YWx1ZSA9PT0gdGhyb3VnaCkgcmV0dXJuO1xuICAgIHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUkLm5leHQodGhyb3VnaCk7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUodGhyb3VnaCk7XG4gIH1cblxuICAvKiogVGhlIGNsYXNzIGdyb3VwcyBzaG93biBpbiAzRCBvbiB0aGlzIGltYWdlIChbXSBhZnRlciBhIHN3aXRjaCB0byBhbm90aGVyIGltYWdlKS4gKi9cbiAgZ2V0UmVnaW9uQ2xhc3NlczNkJCgpOiBPYnNlcnZhYmxlPFJlYWRvbmx5QXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10gfT4+IHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc2VzM2QkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIEhpZGUgZXZlcnkgcmVnaW9uIHN1cmZhY2UgYW5kIGZvcmdldCB0aGVtIChhIGJ1aWxkIHN0aWxsIHJ1bm5pbmcgaXMgZHJvcHBlZCkuICovXG4gIHByaXZhdGUgY2xlYXJSZWdpb25DbGFzc2VzM2QoKTogdm9pZCB7XG4gICAgdGhpcy5tZXNoUmVxdWVzdCsrO1xuICAgIHRoaXMuc2hvd24zZCA9IFtdO1xuICAgIHRoaXMuY2xhc3NlczNkJC5uZXh0KFtdKTtcbiAgICB0aGlzLmNsYXNzZXMzZEltYWdlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbk1lc2hlcyhbXSwgdW5kZWZpbmVkKTtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25IaWdobGlnaHQoW10pO1xuICB9XG5cbiAgLyoqIEhpZ2hsaWdodCB0aGUgc3VyZmFjZXMgb2YgdGhlc2UgZ3JvdXAga2V5cyBpbiB0aGUgdm9sdW1lIHZpZXcgKG5vbmU6IGFsbCBhcyB1c3VhbCkuICovXG4gIGhpZ2hsaWdodFJlZ2lvbkNsYXNzZXMzZChrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbkhpZ2hsaWdodChrZXlzKTtcbiAgfVxuXG4gIC8qKiBBIHN1cmZhY2UgY2xpY2tlZCBpbiB0aGUgdm9sdW1lIHZpZXcgd2l0aCB0aGUgc2VsZWN0aW9uIHRvb2wgKGl0cyBncm91cCBrZXkpLCBvciBub25lIChudWxsKS4gKi9cbiAgZ2V0UmVnaW9uUGlja2VkM2QkKCk6IE9ic2VydmFibGU8eyBrZXk6IHN0cmluZyB8IG51bGw7IGFkZGl0aXZlOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5uYXBhcmkuZ2V0UmVnaW9uTWVzaFBpY2skKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyB0aGVzZSBncm91cHMgb2YgY2xhc3NlcyBpbiB0aGUgdm9sdW1lIHZpZXcgYXMgM0QgcmVjb25zdHJ1Y3Rpb25zIChlYWNoIGdyb3VwIG9uZSBzdXJmYWNlXG4gICAqIGluIGl0cyBjb2xvdXI6IGFuIGF0bGFzIHN0cnVjdHVyZSB3aXRoIGl0cyBzdWJzdHJ1Y3R1cmVzKSwgYW5kIG9ubHkgdGhlc2U7IFtdIGhpZGVzIHRoZW0uXG4gICAqIFJlY29uc3RydWN0ZWQgZnJvbSBldmVyeSBzbGljZSdzIG91dGxpbmVzIGF0IHRoZSB2b2x1bWUncyByZXNvbHV0aW9uLCBjYWNoZWQgcGVyIGltYWdlLlxuICAgKi9cbiAgYXN5bmMgc2hvd1JlZ2lvbkNsYXNzZXMzZChcbiAgICBncm91cHM6IFJlYWRvbmx5QXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW107IGNvbG9yOiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH0+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLm1lc2hSZXF1ZXN0O1xuICAgIHRoaXMuY2xhc3NlczNkSW1hZ2UgPSB0aGlzLnBsb3R0ZWRGaWxlTmFtZTtcbiAgICB0aGlzLnNob3duM2QgPSBncm91cHM7XG4gICAgLy8gV2hhdCBhbiBlZGl0IGZyb20gbm93IG9uIGlzIGNvbXBhcmVkIHdpdGggKHRoZSBsaXZlIHNsaWNlIG1heSBub3QgaGF2ZSBjaGFuZ2VkIHlldCkuXG4gICAgdGhpcy5saXZlQ2xhc3NlcyA9IG51bGw7XG4gICAgdGhpcy50cmFja0xpdmVDbGFzc2VzKCk7XG4gICAgdGhpcy5jbGFzc2VzM2QkLm5leHQoZ3JvdXBzLm1hcCgoZykgPT4gKHsga2V5OiBnLmtleSwgY2xhc3NlczogZy5jbGFzc2VzIH0pKSk7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFRydWVJbWFnZVNpemUoKT8ud2lkdGggPz8gMTAyNDtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5uYXBhcmkucmVnaW9uVm94ZWxTdGVwKCkgPz8gTWF0aC5tYXgoMSwgd2lkdGggLyAyNTYpO1xuICAgIGNvbnN0IGltYWdlID0gdGhpcy5wbG90dGVkRmlsZU5hbWUgPz8gJyc7XG4gICAgY29uc3QgY2FjaGVLZXkgPSAoZzogeyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9KSA9PiBgJHtpbWFnZX18JHtzdGVwLnRvRml4ZWQoMyl9fCR7Zy5jbGFzc2VzLmpvaW4oJywnKX1gO1xuICAgIGNvbnN0IG1pc3NpbmcgPSBncm91cHMuZmlsdGVyKChnKSA9PiAhdGhpcy5tZXNoQ2FjaGUuaGFzKGNhY2hlS2V5KGcpKSk7XG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IG1pc3NpbmcubWFwKChnKSA9PiBnLmtleSk7XG4gICAgICBjb25zdCB3aGF0ID0gbmFtZXMubGVuZ3RoID4gMyA/IGAke25hbWVzLmxlbmd0aH0gcmVnaW9uc2AgOiBuYW1lcy5qb2luKCcsICcpO1xuICAgICAgY29uc3QgZG9uZSA9IHRoaXMubmFwYXJpLmJlZ2luVGFzayhgQnVpbGRpbmcgJHt3aGF0fSBpbiAzROKApmApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYnVpbHQgPSBhd2FpdCB0aGlzLnJlZ2lvblN0b3JlLnJlY29uc3RydWN0Q2xhc3NlcyhcbiAgICAgICAgICBtaXNzaW5nLm1hcCgoZykgPT4gKHsga2V5OiBjYWNoZUtleShnKSwgY2xhc3NlczogZy5jbGFzc2VzIH0pKSxcbiAgICAgICAgICBzdGVwLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjbGFzc2VzT2YgPSBuZXcgTWFwKG1pc3NpbmcubWFwKChnKSA9PiBbY2FjaGVLZXkoZyksIGcuY2xhc3Nlc10pKTtcbiAgICAgICAgZm9yIChjb25zdCBiIG9mIGJ1aWx0KSB0aGlzLm1lc2hDYWNoZS5zZXQoYi5rZXksIHsgbWVzaDogYi5tZXNoLCBjbGFzc2VzOiBjbGFzc2VzT2YuZ2V0KGIua2V5KSA/PyBbXSB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlcXVlc3QgIT09IHRoaXMubWVzaFJlcXVlc3QpIHJldHVybjtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25NZXNoZXMoXG4gICAgICBncm91cHMubWFwKChnKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc2ggPSB0aGlzLm1lc2hDYWNoZS5nZXQoY2FjaGVLZXkoZykpIS5tZXNoO1xuICAgICAgICByZXR1cm4geyBrZXk6IGcua2V5LCBjb2xvcjogZy5jb2xvciwgbGFiZWw6IGcubGFiZWwsIHZlcnRpY2VzOiBtZXNoLnZlcnRpY2VzLCBmYWNlczogbWVzaC5mYWNlcyB9O1xuICAgICAgfSksXG4gICAgICB0aGlzLnBsb3R0ZWRGaWxlTmFtZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb25zIGNoYW5nZWQ6IHdoZW4gdGhlIGxpdmUgc2xpY2UncyByZWdpb25zIG9mIHNvbWUgY2xhc3NlcyBkaWQgKGFuIGVkaXQsIGFuIHVuZG8sIG5vdFxuICAgKiBhIHNsaWNlIG9yIGltYWdlIHN3aXRjaCksIHRoZWlyIHJlY29uc3RydWN0aW9ucyBhcmUgc3RhbGUuIFRoZXkgYXJlIGRyb3BwZWQsIGFuZCB0aG9zZSBzaG93blxuICAgKiBpbiAzRCBhcmUgcmVidWlsdCBvbmNlIHRoZSBlZGl0cyBwYXVzZS5cbiAgICovXG4gIHByaXZhdGUgb25SZWdpb25zQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICAvLyBOb3RoaW5nIGZvbGxvd3MgdGhlIGVkaXRzIChubyBzdXJmYWNlIGJ1aWx0IG9yIHNob3duLCBubyBzZWN0aW9ucyk6IHNraXAgdGhlIGZpbmdlcnByaW50cy5cbiAgICBpZiAoIXRoaXMuc2xpY2VNb3VudGVkICYmICF0aGlzLnNob3duM2QubGVuZ3RoICYmICF0aGlzLm1lc2hDYWNoZS5zaXplKSB7XG4gICAgICB0aGlzLmxpdmVDbGFzc2VzID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy5saXZlQ2xhc3NlcztcbiAgICB0aGlzLmxpdmVDbGFzc2VzID0gbnVsbDtcbiAgICBjb25zdCBub3cgPSB0aGlzLnRyYWNrTGl2ZUNsYXNzZXMoKTtcbiAgICAvLyBBbm90aGVyIHNsaWNlIG9yIGltYWdlIGNhbWUgdXA6IG5vIHJlZ2lvbiBjaGFuZ2VkICh0aGUgc2VjdGlvbnMgcmVjdXQgZm9yIHRoZSBzbGljZSkuXG4gICAgaWYgKCFiZWZvcmUgfHwgYmVmb3JlLmF0ICE9PSBub3cuYXQpIHJldHVybjtcbiAgICBjb25zdCBjaGFuZ2VkID0gY2hhbmdlZENsYXNzZXMoYmVmb3JlLnNpZ25hdHVyZXMsIG5vdy5zaWduYXR1cmVzKTtcbiAgICAvLyBTb3VyY2UgZmVhdHVyZXMgZGVsZXRlZCAob3IgdGhhdCB1bmRvbmUpIGNoYW5nZSBubyBsaXZlIHJlZ2lvbiwgYW5kIHdoaWNoIGNsYXNzZXMgdGhleSB3ZXJlXG4gICAgLy8gaXMgbm90IGtub3duIGhlcmU6IGV2ZXJ5IGNsYXNzIGlzIHN0YWxlLiBBIGZlYXR1cmUgdGFrZW4gc2hvd3MgYXMgaXRzIGNsYXNzJ3MgY2hhbmdlLlxuICAgIGNvbnN0IGV2ZXJ5Q2xhc3MgPSAhY2hhbmdlZC5zaXplICYmIGJlZm9yZS5zb3VyY2VzICE9PSBub3cuc291cmNlcztcbiAgICBpZiAoIWNoYW5nZWQuc2l6ZSAmJiAhZXZlcnlDbGFzcykgcmV0dXJuO1xuICAgIGNvbnN0IHRvdWNoZWQgPSAoYzogc3RyaW5nKSA9PiBldmVyeUNsYXNzIHx8IGNoYW5nZWQuaGFzKGMpO1xuICAgIGlmICh0aGlzLnNsaWNlTW91bnRlZCkgdGhpcy5zZWN0aW9ucy5yZWdpb25zQ2hhbmdlZCgpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIFsuLi50aGlzLm1lc2hDYWNoZV0pIHtcbiAgICAgIGlmIChlbnRyeS5jbGFzc2VzLnNvbWUodG91Y2hlZCkpIHRoaXMubWVzaENhY2hlLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2hvd24zZC5zb21lKChnKSA9PiBnLmNsYXNzZXMuc29tZSh0b3VjaGVkKSkpIHJldHVybjtcbiAgICBpZiAodGhpcy5yZWJ1aWxkVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlYnVpbGRUaW1lcik7XG4gICAgdGhpcy5yZWJ1aWxkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVidWlsZFRpbWVyID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnNob3duM2QubGVuZ3RoICYmIHRoaXMuY2xhc3NlczNkSW1hZ2UgPT09IHRoaXMucGxvdHRlZEZpbGVOYW1lKSB7XG4gICAgICAgIHZvaWQgdGhpcy5zaG93UmVnaW9uQ2xhc3NlczNkKHRoaXMuc2hvd24zZCk7XG4gICAgICB9XG4gICAgfSwgUkVHSU9OX1NVUkZBQ0VfUkVCVUlMRF9NUyk7XG4gIH1cblxuICAvKiogRmluZ2VycHJpbnQgdGhlIGxpdmUgc2xpY2UncyBjbGFzc2VzLCB1bmxlc3MgYWxyZWFkeTogd2hhdCB0aGUgbmV4dCBlZGl0IGlzIGNvbXBhcmVkIHdpdGguICovXG4gIHByaXZhdGUgdHJhY2tMaXZlQ2xhc3NlcygpOiB7IGF0OiBzdHJpbmc7IHNpZ25hdHVyZXM6IE1hcDxzdHJpbmcsIG51bWJlcj47IHNvdXJjZXM6IHN0cmluZyB9IHtcbiAgICB0aGlzLmxpdmVDbGFzc2VzID8/PSB7XG4gICAgICBhdDogdGhpcy5saXZlU2xpY2VLZXkoKSxcbiAgICAgIHNpZ25hdHVyZXM6IGNsYXNzU2lnbmF0dXJlcyh0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSksXG4gICAgICBzb3VyY2VzOiB0aGlzLnJlZ2lvblN0b3JlLmdldFNvdXJjZVN0YXRlS2V5KCksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5saXZlQ2xhc3NlcztcbiAgfVxuXG4gIC8qKiBXaGljaCBzbGljZSBvZiB3aGljaCBpbWFnZSB0aGUgbGl2ZSByZWdpb25zIGFyZS4gKi9cbiAgcHJpdmF0ZSBsaXZlU2xpY2VLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKX1cXG4ke3RoaXMucGxvdHRlZEZpbGVOYW1lID8/ICcnfWA7XG4gIH1cblxuICAvKiogRWFjaCBjbGFzcydzIHZvbHVtZSBvdmVyIHRoZSB3aG9sZSBzdGFjaywgaW4gcHjCsiDDlyBzbGljZXMgKHNlZSBSZWdpb25TdG9yZS5jbGFzc1ZvbHVtZXMpLiAqL1xuICBhc3luYyBnZXRDbGFzc1ZvbHVtZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGF3YWl0IHRoaXMucmVnaW9uU3RvcmUuY2xhc3NWb2x1bWVzKGNsYXNzZXMpKTtcbiAgfVxuXG4gIGdldFJlZ2lvblNvdXJjZUNsYXNzQ291bnRzKHN0YWNrPzogYm9vbGVhbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblNvdXJjZUNsYXNzQ291bnRzKHN0YWNrKTtcbiAgfVxuICBnZXRIaWRkZW5DbGFzc2VzJCgpOiBPYnNlcnZhYmxlPFJlYWRvbmx5U2V0PHN0cmluZz4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRIaWRkZW5DbGFzc2VzJCgpO1xuICB9XG4gIHNldENsYXNzZXNIaWRkZW4oY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGhpZGRlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0Q2xhc3Nlc0hpZGRlbihjbGFzc2VzLCBoaWRkZW4pO1xuICAgIC8vIEEgc3VyZmFjZSBpcyBpdHMgY2xhc3MncyAoaXRzIGdyb3VwIGtleSBpcyB0aGUgY2xhc3MgbmFtZSkuXG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uSGlkZGVuKFsuLi50aGlzLnJlZ2lvblN0b3JlLmdldEhpZGRlbkNsYXNzZXMoKV0pO1xuICAgIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgfVxuICBhc3luYyBzZWxlY3RSZWdpb25DbGFzc2VzKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBhZGRpdGl2ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlZ2lvblN0b3JlLnNlbGVjdENsYXNzZXMoY2xhc3NlcywgYWRkaXRpdmUpO1xuICB9XG4gIGdldEdlb0pzb25TdHJpbmdXaXRoU291cmNlKHJlZ2lvbnM6IFJlZ2lvbltdLCBzbGljZT86IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0R2VvSnNvbldpdGhTb3VyY2UocmVnaW9ucywgc2xpY2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBlci1zbGljZSB6LXN0YWNrIHJlZ2lvbnMgKGppdC11aSM5MyksIGZyb20gdGhlIHNoYXJlZCBSZWdpb25TdG9yZS4g4pSA4pSAXG4gIGVudGVyU3RhY2tNb2RlKFxuICAgIHNsaWNlczogTWFwPG51bWJlciwgUmVnaW9uW10+LFxuICAgIGluaXRpYWxaPzogbnVtYmVyLFxuICAgIHNhdmVMYXlvdXQ/OiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5lbnRlclN0YWNrTW9kZShzbGljZXMsIGluaXRpYWxaLCBzYXZlTGF5b3V0KTtcbiAgfVxuICBleGl0U3RhY2tNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZXhpdFN0YWNrTW9kZSgpO1xuICB9XG4gIGlzU3RhY2tNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmlzU3RhY2tNb2RlKCk7XG4gIH1cbiAgLyoqIFRoZSBzbGljZSB0aGUgcmVnaW9ucyBhcmUgc2hvd24gZm9yIChyZWNvcmRlZCBvdXRzaWRlIHN0YWNrIG1vZGUgdG9vKS4gKi9cbiAgZ2V0RGlzcGxheVNsaWNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0RGlzcGxheVNsaWNlKCk7XG4gIH1cbiAgZ2V0U3RhY2tTYXZlTGF5b3V0KCk6ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVMYXlvdXQoKTtcbiAgfVxuICBzZXREaXNwbGF5U2xpY2UoejogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXREaXNwbGF5U2xpY2Uoeik7XG4gIH1cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTbGljZVJlZ2lvbnMoKTtcbiAgfVxuICBnZXRTdGFja1NhdmVTbGljZXMoKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVTbGljZXMoKTtcbiAgfVxuICAvKiogQWxsIHNsaWNlcycgQU5OT1RBVElPTiByZWdpb25zIGZvciBhIHotc3RhY2sgc2F2ZSAoaml0LXVpIzkzKSwgZWFjaCB0YWdnZWRcbiAgICogIHdpdGggaXRzIHplcm8tYmFzZWQgUmVnaW9uLno7IHByb2ZpbGUgbGluZXMgZXhjbHVkZWQuIEZsYXQgYW5ub3RhdGlvbiBzZXRcbiAgICogIG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VBbm5vdGF0aW9uUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2xpY2VSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgfVxuICAvKiogUGVyLXNsaWNlIGFubm90YXRpb24gcmVnaW9ucyB0byB3cml0ZSBvbiBhIGZvbGRlci1zdGFjayBzYXZlIChqaXQtdWkjOTMpOlxuICAgKiAgc2xpY2UgaW5kZXgg4oaSIHRoYXQgc2xpY2UncyBhbm5vdGF0aW9uIHJlZ2lvbnMgKHByb2ZpbGUgbGluZXMgZXhjbHVkZWQpLFxuICAgKiAgaW5jbHVkaW5nIG5vdy1lbXB0eSBzbGljZXMgdGhhdCB3ZXJlIGxvYWRlZCBub24tZW1wdHkgKHNvIHRoZXkgb3ZlcndyaXRlKS4gKi9cbiAgZ2V0U3RhY2tTYXZlQW5ub3RhdGlvblNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICBmb3IgKGNvbnN0IFt6LCByZWdzXSBvZiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZVNsaWNlcygpKSB7XG4gICAgICBvdXQuc2V0KFxuICAgICAgICB6LFxuICAgICAgICByZWdzLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIEF1dGhvcml0YXRpdmUgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHNpemUgZm9yIG1hc2sgZXhwb3J0LiBQcmVmZXJzIHRoZVxuICAgKiAgYWN0aXZlIHJlbmRlcmVyJ3MgcmVwb3J0ZWQgc2l6ZSwgZmFsbGluZyBiYWNrIHRvIHRoZSBpbWFnZSBtZXRhZGF0YSAoeC95XG4gICAqICBhcmUgdGhlIGZ1bGwtcmVzIHBpeGVsIGRpbWVuc2lvbnMgdXNlZCBhY3Jvc3MgdGhlIGFwcCkuIFJlamVjdHMgbm9uLWZpbml0ZVxuICAgKiAgb3Igbm9uLXBvc2l0aXZlIHNpemVzIOKAlCB0aGUgUGxvdGx5IGJvdW5kcyBjYW4geWllbGQgTmFOIGJlZm9yZSBhIHBsb3QgaXNcbiAgICogIGZ1bGx5IGxhaWQgb3V0LCB3aGljaCB3b3VsZCBvdGhlcndpc2UgY3Jhc2ggbWFzayBjcmVhdGlvbi4gKi9cbiAgZ2V0TWFza0ltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2YWxpZCA9IChzOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHwgdW5kZWZpbmVkKSA9PlxuICAgICAgcyAmJiBOdW1iZXIuaXNGaW5pdGUocy53aWR0aCkgJiYgTnVtYmVyLmlzRmluaXRlKHMuaGVpZ2h0KSAmJiBzLndpZHRoID49IDEgJiYgcy5oZWlnaHQgPj0gMVxuICAgICAgICA/IHsgd2lkdGg6IE1hdGgucm91bmQocy53aWR0aCksIGhlaWdodDogTWF0aC5yb3VuZChzLmhlaWdodCkgfVxuICAgICAgICA6IG51bGw7XG5cbiAgICBjb25zdCBmcm9tUmVuZGVyZXIgPSB2YWxpZCh0aGlzLmdldFRydWVJbWFnZVNpemUoKSk7XG4gICAgaWYgKGZyb21SZW5kZXJlcikgcmV0dXJuIGZyb21SZW5kZXJlcjtcblxuICAgIGxldCBtZXRhOiBJSW1hZ2VNZXRhZGF0YVtdID0gW107XG4gICAgdGhpcy5nZXRJbWFnZU1ldGEoKVxuICAgICAgLnN1YnNjcmliZSgobSkgPT4gKG1ldGEgPSBtKSlcbiAgICAgIC51bnN1YnNjcmliZSgpO1xuICAgIGNvbnN0IG0wID0gbWV0YT8uWzBdO1xuICAgIHJldHVybiBtMCA/IHZhbGlkKHsgd2lkdGg6IG0wLngsIGhlaWdodDogbTAueSB9KSA6IG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvbkVkaXRvckFwaTogYW5ub3RhdGlvbi1vbmx5IHN1cmZhY2UgZm9yIHRoZSBSZWdpb24gRWRpdG9yIOKUgOKUgOKUgFxuICAvLyBJbnRlbnNpdHktcHJvZmlsZSBsaW5lcyAoa2luZD0ncHJvZmlsZScpIGJlbG9uZyB0byB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdFxuICAvLyB0aGUgZWRpdG9yLiBUaGVzZSBtZXRob2RzIGdpdmUgZXh0ZXJuYWwgY29uc3VtZXJzIGFuIGFubm90YXRpb24tb25seSB2aWV3XG4gIC8vIGFuZCBndWFyYW50ZWUgcHJvZmlsZSBsaW5lcyBhcmUgcHJlc2VydmVkLiBUaGUgd3JpdGVzIGxhbmQgaW4gdGhlIHN0b3JlIGxpa2VcbiAgLy8gYW55IG90aGVyLCBhbmQgZXZlcnkgYmFja2VuZCByZWRyYXdzIGZyb20gaXRzIGV2ZW50cy5cblxuICBnZXRBbm5vdGF0aW9uUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gIH1cbiAgc2V0QW5ub3RhdGlvblJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICAvLyBSZS1hcHBlbmQgdGhlIHN0b3JlJ3MgcHJvZmlsZSBsaW5lcyBzbyBhbiBlZGl0b3Igc2F2ZS9kZWxldGUgY2FuJ3QgZHJvcCB0aGVtLlxuICAgIGNvbnN0IHByb2ZpbGVzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiBpc1Byb2ZpbGVSZWdpb24ocikpO1xuICAgIGNvbnN0IGFubm90YXRpb25zID0gKHJlZ2lvbnMgfHwgW10pLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgdGhpcy5zZXRSZWdpb25zKFsuLi5hbm5vdGF0aW9ucywgLi4ucHJvZmlsZXNdLCBzaG93UmVnaW9uTGFiZWwsIGlzUmVnaW9uU2F2ZU9uLCBmaWxsQ29sb3IsIGZhbHNlKTtcbiAgfVxuICBnZXRTZWxlY3RlZFJlZ2lvbnMkKCk6IE9ic2VydmFibGU8UmVnaW9uW10+IHtcbiAgICAvLyBNYXAgdGhlIGludGVybmFsIGluZGV4LWJhc2VkIHNlbGVjdGlvbiB0byB0aGUgc2VsZWN0ZWQgYW5ub3RhdGlvbiByZWdpb25zLlxuICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpLnBpcGUoXG4gICAgICBtYXAoKGlkeHMpID0+IHtcbiAgICAgICAgY29uc3QgcmVncyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICAgICAgICByZXR1cm4gaWR4cy5tYXAoKGkpID0+IHJlZ3NbaV0pLmZpbHRlcigocik6IHIgaXMgUmVnaW9uID0+ICEhciAmJiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgY29uc3QgcmVncyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IGluZGljZXMgPSAocmVnaW9ucyB8fCBbXSkubWFwKChyKSA9PiByZWdzLmZpbmRJbmRleCgoeCkgPT4geC5pZCA9PT0gci5pZCkpLmZpbHRlcigoaSkgPT4gaSA+PSAwKTtcbiAgICB0aGlzLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIHRvb2xzIOKGkiBhY3RpdmUgcmVuZGVyZXIgKHJ1biBvbiBlaXRoZXIgYmFja2VuZCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFRoZSB3YW5kLCB2ZXJ0ZXggZXJhc2VyIGFuZCB6b29tLXRvLWJveCBhcmUgaW1wbGVtZW50ZWQgb24gYm90aCBiYWNrZW5kc1xuICAvLyB2aWEgSUNvb3JkaW5hdGVUcmFuc2Zvcm0gKCsgYSB2aWV3cG9ydCBwaXhlbCByZWFkYmFjayBmb3IgdGhlIHdhbmQpLCBzbyB0aGV5XG4gIC8vIGZvbGxvdyB0aGUgYWN0aXZlIHJlbmRlcmVyIOKAlCB0aGUgc2xpY2UgcGFuZSdzIHdoaWxlIHRoZSB2b2x1bWUgdmlldyBpcyBzcGxpdC5cbiAgc2V0QWN0aXZlVG9vbChpZDogc3RyaW5nIHwgbnVsbCwgb3B0aW9ucz86IENhbnZhc1Rvb2xPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0QWN0aXZlVG9vbChpZCwgb3B0aW9ucyk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFdhbmRNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0V2FuZE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLmNsZWFyQWN0aXZlV2FuZFJlZ2lvbigpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldEJydXNoTW9kZShhY3RpdmUsIG9wdGlvbnMpO1xuICB9XG4gIHNldEJydXNoT3B0aW9ucyhvcHRpb25zOiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0Wm9vbVRvQm94TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRab29tVG9Cb3hNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2VnbWVudFJlY3RhbmdsZXMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25CYWNrZW5kKCkuc2VnbWVudFJlY3RhbmdsZXMoKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uQmFja2VuZCgpLnNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0U2FtTW9kZWwoaWQpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRTYW1Qb2ludE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgY29tbWl0U2FtUG9pbnRzKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLmNvbW1pdFNhbVBvaW50cygpO1xuICB9XG4gIGNsZWFyU2FtUG9pbnRzKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLmNsZWFyU2FtUG9pbnRzKCk7XG4gIH1cblxuICAvLyDilIDilIAgZGlzcGxheSBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBTdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSDigJQgcmVhZHMgZ28gc3RyYWlnaHQgdG8gaXQuXG4gIC8vIFRoZSB0d28gU0VUVEVSUyBzdGlsbCByb3V0ZSB0aHJvdWdoIFBsb3RseSBiZWNhdXNlIGl0cyBpbXBsZW1lbnRhdGlvbnNcbiAgLy8gY2FycnkgcmVuZGVyIGdsdWUgYmV5b25kIHRoZSBzdG9yZSB3cml0ZSAoYSBsaXZlIFBsb3RseS5yZXN0eWxlIG9mXG4gIC8vIGNvbG9yc2NhbGUvcmV2ZXJzZXNjYWxlIG9uIHRoZSBtb3VudGVkIGhlYXRtYXApOyBPU0QgcmVjb2xvcnMgdmlhIGl0cyBvd25cbiAgLy8gc3RvcmUgc3Vic2NyaXB0aW9uIGVpdGhlciB3YXkuXG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8Q29sb3JtYXBOb2RlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCk7XG4gIH1cbiAgc2V0Q29sb3JtYXAoY29sb3JtYXA6IENvbG9ybWFwTm9kZSk6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnNldENvbG9ybWFwKGNvbG9ybWFwKTtcbiAgfVxuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogQ29sb3JtYXBOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwT3B0aW9ucygpO1xuICB9XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKTtcbiAgfVxuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnNldFJldmVyc2VTY2FsZShyZXZlcnNlKTtcbiAgfVxuICBzZXRJbWFnZU1ldGEoaW1hZ2VNZXRhOiBJSW1hZ2VNZXRhZGF0YVtdLCBpbWFnZUtleT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0SW1hZ2VNZXRhKGltYWdlTWV0YSwgaW1hZ2VLZXkpO1xuICB9XG4gIGdldEltYWdlTWV0YSgpOiBPYnNlcnZhYmxlPElJbWFnZU1ldGFkYXRhW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRJbWFnZU1ldGEoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJQ2hhbm5lbEhpc3RvZ3JhbUFwaTogQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSBzdXJmYWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBDaGFubmVsL2dyYXlzY2FsZS9pbnZlcnQgc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmU7IGJvdGhcbiAgLy8gYmFja2VuZHMgc3Vic2NyaWJlIGFuZCByZWNvbG9yIGxpdmUsIHNvIHNldHRlcnMganVzdCB3cml0ZSB0aGUgc3RvcmUuIFRoZVxuICAvLyBoaXN0b2dyYW0gY29tZXMgZnJvbSB3aGljaGV2ZXIgYmFja2VuZCBpcyBvbiBzY3JlZW4gKGl0cyBuYXRpdmUgcGl4ZWxzKS5cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleCwgYmlucyk7XG4gIH1cbiAgLyoqIEV4cG9ydCB0aGUgdW5kZXJseWluZyBkYXRhICgxNi1iaXQgbXVsdGktYmFuZCBUSUZGKSB2aWEgdGhlIGFjdGl2ZSBiYWNrZW5kLiAqL1xuICBleHBvcnREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5leHBvcnREYXRhKCk7XG4gIH1cbiAgZ2V0Q2hhbm5lbHMkKCk6IE9ic2VydmFibGU8SUNoYW5uZWxTdGF0ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpO1xuICB9XG4gIHNldFNlbGVjdGVkQ2hhbm5lbChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRTZWxlY3RlZENoYW5uZWwoaW5kZXgpO1xuICB9XG4gIHNldENoYW5uZWxTdGF0ZShpbmRleDogbnVtYmVyLCBwYXJ0aWFsOiBQYXJ0aWFsPElDaGFubmVsU3RhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoaW5kZXgsIHBhcnRpYWwpO1xuICB9XG4gIHJlc2V0Q29udHJhc3QoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICAvLyBGdWxsIHJlc2V0OiB3aW5kb3cgKDAuLjI1NSksIGdhbW1hICgxKSBBTkQgdGhlIGNoYW5uZWwncyBkZWZhdWx0IHRpbnQuXG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHRoaXMuc3RvcmUucmVzZXRDaGFubmVsU3RhdGUoaSk7XG4gIH1cbiAgLyoqIEF1dG8td2luZG93IGVhY2ggY2hhbm5lbCBieSBzYXR1cmF0aW5nIGBzYXR1cmF0aW9uYCAoMC4uMSkgb2YgcGl4ZWxzIGF0IGVhY2hcbiAgICogIGVuZCBvZiBpdHMgaGlzdG9ncmFtIChza2lwcGluZyBvdXRsaWVyIGZpcnN0L2xhc3QgYmlucykuICovXG4gIGF1dG9Db250cmFzdChpbmRpY2VzOiBudW1iZXJbXSwgc2F0dXJhdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICAgIGNvbnN0IGggPSB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtKGksIDI1Nik7XG4gICAgICBpZiAoIWgpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtKGgsIHNhdHVyYXRpb24sIFswLCAyNTVdKTtcbiAgICAgIGlmIChtYXggPiBtaW4pIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKGksIHsgbWluLCBtYXggfSk7XG4gICAgfVxuICB9XG4gIGdldEdyYXlzY2FsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0R3JheXNjYWxlKCk7XG4gIH1cbiAgc2V0R3JheXNjYWxlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRHcmF5c2NhbGUob24pO1xuICB9XG4gIGdldEludmVydCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCk7XG4gIH1cbiAgc2V0SW52ZXJ0KG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRJbnZlcnQob24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3RpdmUgYmFja2VuZCdzIHJlZ2lvbiBvdmVybGF5ICh0aGUgc2xpY2UgcGFuZSdzIHdoaWxlIHRoZSB2b2x1bWUgdmlldyBpcyBzcGxpdCkuIEZhbGxzXG4gICAqIGJhY2sgdG8gUGxvdGx5J3Mgd2hlbiB0aGUgYWN0aXZlIGJhY2tlbmRcbiAgICogKE9TRCBvciBuYXBhcmktanMpIGlzIHNlbGVjdGVkIGJ1dCBhIHBsb3QgaXNuJ3QgbW91bnRlZCB5ZXQsIHNvIGNhbGxlcnMgYWx3YXlzIGdldCBhXG4gICAqIHVzYWJsZSBvdmVybGF5LlxuICAgKi9cbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB7XG4gICAgY29uc3QgciA9IHRoaXMucmVnaW9uQmFja2VuZCgpO1xuICAgIGlmIChyID09PSB0aGlzLm9zZCkge1xuICAgICAgcmV0dXJuIHRoaXMub3NkLmdldFJlZ2lvbk92ZXJsYXkoKSA/PyB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gICAgfVxuICAgIGlmIChyID09PSB0aGlzLm5hcGFyaSkge1xuICAgICAgcmV0dXJuIHRoaXMubmFwYXJpLmdldFJlZ2lvbk92ZXJsYXkoKSA/PyB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gIH1cblxuICAvKiogSXNvc3VyZmFjZSBjb250cm9scyBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIHdoZW4gaXQgcmVuZGVycyBpc29zdXJmYWNlcy4gKi9cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldElzb3N1cmZhY2VDb250cm9scygpO1xuICB9XG5cbiAgLyoqIDNEIHNjZW5lIGNvbnRyb2xzIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiAoUGxvdGx5IG9yIG5hcGFyaS1qcyksIG9yIG51bGwgb24gYVxuICAgKiAgMkQtb25seSBvbmUuICovXG4gIGdldFN1cmZhY2UzZENvbnRyb2xzKCk6IElTdXJmYWNlM2RDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTtcbiAgfVxuXG4gIC8qKiBJbnRlbnNpdHkgKGxpbmUtUk9JKSBjb250cm9scywgd2hpY2hldmVyIGJhY2tlbmQgZHJhd3MgdGhlIGltYWdlOiB0aGVcbiAgICogIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlIGFkZHMgdGhlIGxpbmUgdG8gdGhlIHN0b3JlLCBhbmQgZXZlcnkgYmFja2VuZFxuICAgKiAgKFBsb3RseSBpbmNsdWRlZCkgZHJhd3MgaXQgZnJvbSB0aGUgc3RvcmUncyB1cGRhdGUgZXZlbnQuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF0aWFsLW9taWNzIGNvbnRyb2xzLCBvciBudWxsIHdoZW4gbm8gYFNQQVRJQUxfREFUQV9QT1JUYCBpcyBib3VuZC4gU2VydmVkIGJ5IGFcbiAgICogYmFja2VuZC1uZXV0cmFsIHtAbGluayBTcGF0aWFsQ29udHJvbHNGYWNhZGV9IChzdGF0ZSBpbiB0aGUgc2hhcmVkIHN0b3JlcyksIHNvIHRoZVxuICAgKiBjb250cm9scyB3b3JrIGFjcm9zcyBhIHBsb3QtdHlwZSBzd2l0Y2ggYW5kIGJlZm9yZSBhbnkgYmFja2VuZCBoYXMgbW91bnRlZC5cbiAgICovXG4gIGdldFNwYXRpYWxDb250cm9scygpOiBJU3BhdGlhbENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnNwYXRpYWxEYXRhKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGUgPz89IG5ldyBTcGF0aWFsQ29udHJvbHNGYWNhZGUodGhpcy5zcGF0aWFsRGF0YSwge1xuICAgICAgc3RvcmU6IHRoaXMuc3RvcmUsXG4gICAgICByZWdpb25TdG9yZTogdGhpcy5yZWdpb25TdG9yZSxcbiAgICAgIHNlbGVjdGlvblN0b3JlOiB0aGlzLnNlbGVjdGlvblN0b3JlLFxuICAgICAgbmFwYXJpOiB0aGlzLm5hcGFyaSxcbiAgICAgIHBsb3RUeXBlOiAoKSA9PiB0aGlzLmN1cnJlbnRQbG90VHlwZSxcbiAgICAgIHpJbmRleDogKCkgPT4gdGhpcy5jdXJyZW50WkluZGV4LFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnNwYXRpYWxGYWNhZGUuY29udHJvbHM7XG4gIH1cblxuICAvKiogQ3JlYXRlZCBvbiBmaXJzdCB1c2U7IG93bnMgdGhlIGRhdGFzZXQgc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHNwYXRpYWxGYWNhZGU6IFNwYXRpYWxDb250cm9sc0ZhY2FkZSB8IG51bGwgPSBudWxsO1xuICAvKiogRGlzcGxheWVkIHNsaWNlLiBPbmx5IGEgdm9sdW1lLWJhY2tlZCBzcGF0aWFsIGRhdGFzZXQgcmVhZHMgaXQsIHRvIGtlZXAgYVxuICAgKiAgcmVnaW9uIGRyYXduIG92ZXIgb25lIHNlY3Rpb24gZnJvbSBzZWxlY3RpbmcgdGhlIHdob2xlIGRlcHRoIGJlaGluZCBpdC4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50WkluZGV4ID0gMDtcblxuICAvKiogQW5ndWxhciBjYWxscyB0aGlzIHdoZW4gdGhlIGluamVjdG9yIHByb3ZpZGluZyB0aGUgcm91dGVyIGlzIGRlc3Ryb3llZCDigJQgdGhlIGhvc3RcbiAgICogIGNvbXBvbmVudCBmb3IgYSBgcHJvdmlkZVZpc3VhbGl6YXRpb24oKWAgY2hhaW4uIFRoZSBkYXRhc2V0IHN1YnNjcmlwdGlvbiB3b3VsZFxuICAgKiAgb3RoZXJ3aXNlIGtlZXAgdGhlIHdob2xlIGlzb2xhdGVkIGNoYWluIHJlYWNoYWJsZSBmcm9tIHRoZSByb290IGRhdGEgcG9ydC4gKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRUaWNrZXQgPSB7IGlkOiB0aGlzLmltcG9ydFRpY2tldC5pZCArIDEsIGltYWdlOiB1bmRlZmluZWQgfTsgLy8gYSBsYXRlIGltcG9ydCBjaGFuZ2VzIG5vdGhpbmdcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGUgPSBudWxsO1xuICAgIHRoaXMucmVnaW9uVXBkYXRlcy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNlY3Rpb25zLnN0b3AoKTtcbiAgICBpZiAodGhpcy5yZWJ1aWxkVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlYnVpbGRUaW1lcik7XG4gIH1cblxuICAvKipcbiAgICogSW50ZW5zaXR5LXByb2ZpbGUgc2FtcGxpbmcsIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbjogdGhlIHNhbXBsaW5nIGlzIHRoZVxuICAgKiBiYWNrZW5kLW5ldXRyYWwgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UnczsgdGhlIHZpZXdwb3J0IGNoYW5nZXMgY29tZSBmcm9tIGV2ZXJ5XG4gICAqIGJhY2tlbmQgdGhhdCByZXBvcnRzIHRoZW0gKE9wZW5TZWFkcmFnb24sIG5hcGFyaS1qcyksIG1lcmdlZCBpbnRvIG9uZSBzdGFibGVcbiAgICogc3RyZWFtIHRoZSBpbnNldCBzdWJzY3JpYmVzIHRvIG9uY2UuXG4gICAqL1xuICBnZXRJbnRlbnNpdHlTYW1wbGluZygpOiBJSW50ZW5zaXR5U2FtcGxpbmcge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eVNhbXBsaW5nO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZW5zaXR5U2FtcGxpbmc6IElJbnRlbnNpdHlTYW1wbGluZyA9IHtcbiAgICAvLyBMb2FkIHRoZSBkaXNwbGF5ZWQgc2xpY2UncyBwaXhlbHMgZm9yIGEgYmFja2VuZCB0aGF0IGhhcyBubyBmcmFtZXMgb2YgaXRzIG93blxuICAgIC8vIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanM7IFBsb3RseSBmZWVkcyBpdHMgZnJhbWVzIHRvIHRoZSBzZXJ2aWNlIHdoZW4gaXQgcGxvdHMpLlxuICAgIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nOiAoaW1hZ2VJbmZvLCB6SW5kZXgpID0+IHtcbiAgICAgIHRoaXMucG9pbnRTYW1wbGluZ0F0UGxvdCgpO1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5LmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbywgekluZGV4KTtcbiAgICB9LFxuICAgIC8vIFJlLXNhbXBsZSBmcm9tIGEgZnJlc2ggY3JvcCBvZiB0aGUgaW1hZ2UtcGl4ZWwgUk9JIGF0IGRpc3BsYXkgcmVzb2x1dGlvbi5cbiAgICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2k6ICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpID0+IHtcbiAgICAgIHRoaXMucG9pbnRTYW1wbGluZ0F0UGxvdCgpO1xuICAgICAgdGhpcy5pbnRlbnNpdHkucmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHgsIHksIHdpZHRoLCBoZWlnaHQsIHpJbmRleCk7XG4gICAgfSxcbiAgICBnZXRWaWV3cG9ydENoYW5nZSQ6ICgpID0+XG4gICAgICBtZXJnZSguLi50aGlzLmJhY2tlbmRzKCkubWFwKChiKSA9PiBiLmdldEludGVuc2l0eVNhbXBsaW5nKCk/LmdldFZpZXdwb3J0Q2hhbmdlJCgpID8/IEVNUFRZKSksXG4gIH07XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldEludGVuc2l0eVNhbXBsaW5nKCkuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoKWAuICovXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlTYW1wbGluZy5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm8sIHpJbmRleCk7XG4gIH1cblxuICAvKiogQ3JvcHMgZm9yIHNhbXBsaW5nIGFyZSBzaXplZCBmcm9tIHRoZSBwbG90IGRpdiAod2hpY2hldmVyIGJhY2tlbmQgcmVuZGVycyBpbnRvIGl0KS4gKi9cbiAgcHJpdmF0ZSBwb2ludFNhbXBsaW5nQXRQbG90KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHRoaXMuaW50ZW5zaXR5LnNldFNhbXBsaW5nRWxlbWVudCh0aGlzLnBsb3REaXYpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5nZXRWaWV3cG9ydENoYW5nZSQoKWAuICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlTYW1wbGluZy5nZXRWaWV3cG9ydENoYW5nZSQoKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldEludGVuc2l0eVNhbXBsaW5nKCkucmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKClgLiAqL1xuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCB6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcucmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHgsIHksIHdpZHRoLCBoZWlnaHQsIHpJbmRleCk7XG4gIH1cblxuICAvKiogVGhlIHZpc3VhbGl6ZXIgdmlldyBpcyBnb2luZyBhd2F5OiBkZXRhY2ggZXZlcnkgYmFja2VuZCDigJQgZHJvcHBpbmcgdGhlaXIgdmlldy1ib3VuZFxuICAgKiAgc3Vic2NyaXB0aW9ucyBhbmQgZGlzcG9zaW5nIHRoZSBuYXBhcmktanMgdmlld2VyLCB3aG9zZSBjYW52YXMsIHJlbmRlciBsb29wIGFuZCBHUFVcbiAgICogIGJ1ZmZlcnMgd291bGQgb3RoZXJ3aXNlIG91dGxpdmUgdGhlIHZpZXcgKGZvciBhIGNvbXBvbmVudC1zY29wZWQgY2hhaW4sIGZvcmV2ZXIpLlxuICAgKiAgTm90aGluZyBpcyBvbiBzY3JlZW4gYWZ0ZXJ3YXJkcywgc28gdGhlIG5leHQgcGxvdCBzdGFydHMgZnJvbSB0aGUgZGVmYXVsdCBiYWNrZW5kLiAqL1xuICBkZXRhY2goKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVJlcXVlc3QrKztcbiAgICB0aGlzLnNlY3Rpb25zLnN0b3AoKTtcbiAgICB0aGlzLnNsaWNlTW91bnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2xpY2VEaXYgPSBudWxsO1xuICAgIHRoaXMucGxvdGx5LmRldGFjaCgpO1xuICAgIHRoaXMub3NkLmRldGFjaCgpO1xuICAgIHRoaXMubmFwYXJpLmRldGFjaCgpO1xuICAgIHRoaXMubGFzdFJlbmRlcmVkID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGRldGFjaH0uICovXG4gIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoKCk7XG4gIH1cbn1cbiJdfQ==
|
|
1315
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQztBQWUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFFekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBa0MsTUFBTSwrQkFBK0IsQ0FBQztBQUl4RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztB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LE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVELGlGQUFpRjtJQUNqRiw4QkFBOEIsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsTUFBYztRQUNoRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsOEJBQThCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7OzZGQUd5RjtJQUN6RixNQUFNO1FBQ0osSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxXQUFXO1FBQ1QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7OEdBL3lDVSx3QkFBd0IsbUtBMEV6QixVQUFVLG9IQU9WLGlCQUFpQjtrSEFqRmhCLHdCQUF3QixjQURYLE1BQU07OzJGQUNuQix3QkFBd0I7a0JBRHBDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkEyRTdCLE1BQU07MkJBQUMsVUFBVTs7MEJBTWpCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBtZXJnZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHJlc29sdmVDb2xvcm1hcCB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8sIElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUG9seWdvbiwgUmVnaW9uIH0gZnJvbSAnLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IENsYXNzUHJlc2V0LCBQcmVzZXRTZXQgfSBmcm9tICcuL21vZGVscy9jbGFzcy1wcmVzZXQnO1xuaW1wb3J0IHsgUGxvdGx5U2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL3Bsb3RseS9wbG90bHkuc2VydmljZSc7XG5pbXBvcnQgeyBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUGxvdFR5cGUsXG4gIFBsb3RUeXBlRGVzY3JpcHRvcixcbiAgaXNOYXBhcmkzZCxcbiAgaXNOYXBhcmlTY2F0dGVyLFxuICBpc1NwYXRpYWxPbWljcyxcbiAgaXNTcGF0aWFsT21pY3MzZCxcbiAgaXNOYXBhcmlJc29zdXJmYWNlLFxuICBpc05hcGFyaVZvbHVtZSxcbn0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIElWaWV3ZXJCYWNrZW5kLFxuICBJVmlzdWFsaXplcixcbiAgTG9hZGVkSW1hZ2UsXG4gIFBpeGVsRGF0YSxcbiAgSW50ZW5zaXR5UHJvZmlsZSxcbiAgSUlzb3N1cmZhY2VDb250cm9scyxcbiAgSUludGVuc2l0eUNvbnRyb2xzLFxuICBJU3VyZmFjZTNkQ29udHJvbHMsXG4gIElTcGF0aWFsQ29udHJvbHMsXG4gIElJbnRlbnNpdHlTYW1wbGluZyxcbiAgSU9zZFZpZXdPcHRpb25zLFxuICBJVm9sdW1lUmVzb2x1dGlvbixcbn0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgQ2FudmFzVG9vbE9wdGlvbnMsIENvbG9ybWFwTm9kZSwgSUJydXNoT3B0aW9ucywgSVdhbmRPcHRpb25zIH0gZnJvbSAnLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBTcGF0aWFsQ29udHJvbHNGYWNhZGUgfSBmcm9tICcuL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblNjb3BlQ2FjaGUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zY29wZS1jYWNoZSc7XG5pbXBvcnQgeyBSRUdJT05fU09VUkNFX01JTl9DSEFSUywgUmVnaW9uU291cmNlLCBSZWdpb25Tb3VyY2VWaWV3IH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25JbmRleFBhZ2UsIFJlZ2lvbkluZGV4UXVlcnkgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3R5bGUgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdHlsZSc7XG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tICduYXBhcmktanMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25Tb3VyY2VPcGVuZXIsIFJlZ2lvblNvdXJjZVNsaWNlcyB9IGZyb20gJy4vc3RvcmUvcmVnaW9uLXNvdXJjZS1zY29wZSc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRvckFwaSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1lZGl0b3ItYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IElDaGFubmVsSGlzdG9ncmFtQXBpLCBJQ2hhbm5lbFN0YXRlLCBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvaW50ZW5zaXR5JztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbm5lbFRpbnRDb2xvcm1hcCwgdm9sdW1lQ29sb3JtYXAgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90TW9kZVZpZXdwb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlLWNvbnRyaWJ1dGlvbi5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlU2VydmljZSB9IGZyb20gJy4vaW50ZW5zaXR5L2ludGVuc2l0eS1wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbmdlZENsYXNzZXMsIGNsYXNzU2lnbmF0dXJlcyB9IGZyb20gJy4vc3RvcmUvY2xhc3Mtc2lnbmF0dXJlcyc7XG5pbXBvcnQgeyBWb2x1bWVTZWN0aW9ucyB9IGZyb20gJy4vdmlzdWFsaXplci92b2x1bWUtc2VjdGlvbnMnO1xuaW1wb3J0IHR5cGUgeyBTZWN0aW9uQXhpcywgU2VjdGlvblZpZXdzIH0gZnJvbSAnLi9jb250cmFjdHMvc2VjdGlvbi12aWV3LmNvbnRyYWN0JztcblxuLyoqIEhvdyBsb25nIGFmdGVyIHRoZSBsYXN0IGVkaXQgdGhlIHN1cmZhY2VzIG9mIHRoZSBjbGFzc2VzIGl0IHRvdWNoZWQgYXJlIHJlYnVpbHQgKG1zKS4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TID0gNjAwO1xuXG4vKiogSW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0lzIGFyZSBvd25lZCBieSB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdCB0aGUgZWRpdG9yLlxuICogIFBhY2thZ2UtaW50ZXJuYWwgcHJlZGljYXRlIChwcm9wZXJ0eS1iYXNlZCBzbyBpdCBhbHNvIG1hdGNoZXMgcGxhaW4gb2JqZWN0c1xuICogIGFmdGVyIGEgZHJhZyByb3VuZC10cmlwKS4gKi9cbmZ1bmN0aW9uIGlzUHJvZmlsZVJlZ2lvbihyOiB7IGtpbmQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHI/LmtpbmQgPT09ICdwcm9maWxlJztcbn1cblxuLyoqXG4gKiBUaGUgdmlzdWFsaXplciBjaGFpbidzIGZyb250IGRvb3I6IGltcGxlbWVudHMgYElWaXN1YWxpemVyYCwgYElSZWdpb25FZGl0b3JBcGlgXG4gKiBhbmQgYElDaGFubmVsSGlzdG9ncmFtQXBpYCAoYm91bmQgdG8gdGhlIGBWSVNVQUxJWkVSYCAvIGBSRUdJT05fRURJVE9SX0FQSWAgL1xuICogYENIQU5ORUxfSElTVE9HUkFNX0FQSWAgdG9rZW5zKSBvdmVyIHRocmVlIHJlbmRlcmluZyBiYWNrZW5kcywgY2hvc2VuIHBlciBwbG90IHR5cGU6XG4gKiAgLSAqKkltYWdlKiogcmVuZGVycyB0aHJvdWdoIE9wZW5TZWFkcmFnb24gKG5hdGl2ZWx5IHRpbGVkLCByZWdpb24gdG9vbHMsXG4gKiAgICBjbGllbnQtc2lkZSBjb2xvcm1hcCksIG9yIHRocm91Z2ggbmFwYXJpLWpzIHdoZW4gYFZpekNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcmBcbiAqICAgIG9wdHMgaW47IHRoZSBuYXBhcmkgaW1hZ2UgdHlwZXMgYW5kIHRoZSAyRCBzcGF0aWFsLW9taWNzIG1vZGUgcmVuZGVyIHRocm91Z2hcbiAqICAgIG5hcGFyaS1qcy4gQSBmYWlsZWQgbG9hZCBmYWxscyBiYWNrIG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkgZm9yIHRoYXQgaW1hZ2Ugb25seVxuICogICAgKHNlZSBgbmFwYXJpRmVsbEJhY2tgIC8gYG9zZEZlbGxCYWNrYCwgY2xlYXJlZCBieSBgcmVzZXQoKWApLlxuICogIC0gdGhlIG5hcGFyaSAzRCB0eXBlcyAodm9sdW1lLCBpc29zdXJmYWNlLCBzdXJmYWNlLCAzRCBzY2F0dGVyLCB0aGUgM0Qgc3BhdGlhbFxuICogICAgY2xvdWQpIHJlbmRlciB0aHJvdWdoIG5hcGFyaS1qcywgZmFsbGluZyBiYWNrIHRvIFBsb3RseS5cbiAqICAtIGV2ZXJ5IG90aGVyIHBsb3QgdHlwZSAoaGVhdG1hcCwgY29udG91ciwgc3VyZmFjZSwgc2NhdHRlciwgbGluZSwg4oCmKSByZW5kZXJzXG4gKiAgICB0aHJvdWdoIFBsb3RseS5cbiAqXG4gKiBPbmx5IHJlbmRlcmluZyBhbmQgdGhlIHZpZXdwb3J0IGFyZSByb3V0ZWQgdG8gdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBSZWdpb24gc3RhdGVcbiAqIGxpdmVzIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCBhbmQgZGlzcGxheSBzdGF0ZSAoY29sb3JtYXAsIGNoYW5uZWxzLCBwcmVzZXRzLFxuICogc3BhdGlhbCB2aWV3KSBpbiB0aGUgc2hhcmVkIGBWaXN1YWxpemVyU3RvcmVgLCBzbyBldmVyeSBiYWNrZW5kIHNlZXMgdGhlIHNhbWVcbiAqIHZhbHVlczsgdGhlIGJhY2tlbmRzIHN1YnNjcmliZSB0byB0aGVtIHRvIHJlZHJhdy5cbiAqXG4gKiBQYWNrYWdlLWludGVybmFsOiBob3N0cyBkZXBlbmQgb24gdGhlIHRva2Vucywgbm90IG9uIHRoaXMgY2xhc3MuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIsIElSZWdpb25FZGl0b3JBcGksIElDaGFubmVsSGlzdG9ncmFtQXBpLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGN1cnJlbnRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgcHJpdmF0ZSBsYXN0UmVuZGVyZWQ6IElWaWV3ZXJCYWNrZW5kIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPU0QgZmFpbGVkIGZvciB0aGUgKmN1cnJlbnQqIHJlbmRlciBjeWNsZSAoZS5nLiBhIGZyZXNoIGZpbGUgc3RpbGwgY2FjaGluZ1xuICAgKiAgcGFzdCB0aGUgZGVhZGxpbmUpIOKGkiBmYWxsIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlIG9ubHkuIFJlc2V0IGJ5XG4gICAqICByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSByZW5kZXIgY3ljbGUsIHNvIHRoZSBuZXh0IGZpbGUg4oCUIG9yIGFcbiAgICogIHJlLXNlbGVjdCBvbmNlIHRoZSBmaWxlIGlzIGNhY2hlZCDigJQgcmV0cmllcyBPU0QuIChXYXMgYSBwZXJtYW5lbnQgZmxhZyxcbiAgICogIHdoaWNoIGxlZnQgdGhlIHdob2xlIHNlc3Npb24gc3R1Y2sgb24gUGxvdGx5IGFmdGVyIG9uZSBzbG93IGxvYWQuKSAqL1xuICBwcml2YXRlIG9zZEZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgZmFpbGVkIGZvciB0aGUgY3VycmVudCByZW5kZXIgY3ljbGUg4oaSIGZhbGwgYmFjayB0byBPU0QgKHRoZW4gUGxvdGx5KS5cbiAgICogIFJlc2V0IGJ5IHJlc2V0KCkgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGN5Y2xlLCBsaWtlIHtAbGluayBvc2RGZWxsQmFja30uICovXG4gIHByaXZhdGUgbmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgLyoqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGltYWdlIGxhc3QgcGxvdHRlZCAobmFtZXMgYSBHZW9KU09OIGV4cG9ydCkuICovXG4gIHByaXZhdGUgcGxvdHRlZEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZGl2IHRoZSBiYWNrZW5kcyByZW5kZXIgaW50byAoZXZlcnkgYmFja2VuZCBzaGFyZXMgaXQpOyAnJyBiZWZvcmUgdGhlIGZpcnN0IHBsb3QuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKipcbiAgICogV2hldGhlciByZWdpb25zIGNhbiBiZSBzaG93biBpbiAzRCBvbiBzY3JlZW46IGEgbmFwYXJpIHZvbHVtZSAob3IgaXNvc3VyZmFjZSkgdmlldywgb3IgdGhlIDNEXG4gICAqIHNwYXRpYWwgY2xvdWQgb3ZlciBhIHN0YWNrIGltYWdlIChpdHMgcmVmZXJlbmNlIHZvbHVtZSdzLCBzZWUgc2hvd1ZvbHVtZUFzSW1hZ2UpLiBCb3RoIGRyYXcgdGhlXG4gICAqIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhlIHNhbWUgd2F5IChWb2x1bWVSZWdpb25NZXNoZXMpLCBpbiB0aGUgdm9sdW1lJ3MgYm94LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVWaWV3JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogV2hldGhlciBhIG5hcGFyaSB2b2x1bWUgKG9yIGlzb3N1cmZhY2UpIHZpZXcgaXMgdGhlIGN1cnJlbnQgcGxvdCB0eXBlOiB0aGUgc2xpY2UgcGFuZSdzLiAqL1xuICBwcml2YXRlIGltYWdlVm9sdW1lVmlldyA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcncyBzbGljZSBwYW5lIGlzIHdhbnRlZCAoc2VlIHtAbGluayBzZXRTbGljZUVkaXRvcn0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRWRpdG9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcgZHJhd3MgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUgdm9sdW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbnNUaHJvdWdoVm9sdW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogUmVnaW9uIHJlY29uc3RydWN0aW9ucyBidWlsdCBzbyBmYXIsIGJ5IGltYWdlLCByZXNvbHV0aW9uIGFuZCBjbGFzc2VzICh3aXRoIHRob3NlIGNsYXNzZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc2hDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IG1lc2g6IE1lc2g7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0+KCk7XG4gIC8qKiBCdW1wZWQgcGVyIHtAbGluayBzaG93UmVnaW9uQ2xhc3NlczNkfSAoYW5kIHBlciBuZXcgaW1hZ2UpLCBzbyBvbmx5IHRoZSBsYXRlc3Qgb25lIHNob3dzLiAqL1xuICBwcml2YXRlIG1lc2hSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBjbGFzcyBncm91cHMgc2hvd24gaW4gM0QsIGFuZCB0aGUgaW1hZ2UgdGhleSBiZWxvbmcgdG8uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xhc3NlczNkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9Pj4oXG4gICAgW10sXG4gICk7XG4gIHByaXZhdGUgY2xhc3NlczNkSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBncm91cHMgbGFzdCBhc2tlZCBmb3IgaW4gM0QsIHdpdGggdGhlaXIgY29sb3Vyczogd2hhdCBhbiBlZGl0J3MgcmVidWlsZCBzaG93cyBhZ2Fpbi4gKi9cbiAgcHJpdmF0ZSBzaG93bjNkOiBSZWFkb25seUFycmF5PHsga2V5OiBzdHJpbmc7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdOyBjb2xvcjogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9PiA9IFtdO1xuICAvKipcbiAgICogRWFjaCBjbGFzcydzIGZpbmdlcnByaW50IG9uIHRoZSBsaXZlIHNsaWNlIChzZWUgY2xhc3NTaWduYXR1cmVzKSwgd2hpY2ggaW1hZ2UgYW5kIHNsaWNlLCBhbmRcbiAgICogd2hhdCB0aGUgcmVnaW9uIHNvdXJjZXMgaG9sZCAoc2VlIFJlZ2lvblN0b3JlLmdldFNvdXJjZVN0YXRlS2V5KS4gTnVsbCB3aGlsZSBub3RoaW5nIGZvbGxvd3NcbiAgICogdGhlIGVkaXRzIChubyBzdXJmYWNlIGJ1aWx0LCBubyBzZWN0aW9ucykuXG4gICAqL1xuICBwcml2YXRlIGxpdmVDbGFzc2VzOiB7IGF0OiBzdHJpbmc7IHNpZ25hdHVyZXM6IE1hcDxzdHJpbmcsIG51bWJlcj47IHNvdXJjZXM6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgcGVuZGluZyByZWJ1aWxkIG9mIHRoZSBzdXJmYWNlcyBhbiBlZGl0IHRvdWNoZWQuICovXG4gIHByaXZhdGUgcmVidWlsZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvblVwZGF0ZXM6IFN1YnNjcmlwdGlvbjtcblxuICAvLyDilIDilIAgVGhlIHNsaWNlIHBhbmUgKHRoZSB2b2x1bWUgdmlldydzIHNwbGl0KTogT1NEIGVkaXRpbmcgb25lIHNsaWNlIGJlc2lkZSB0aGUgM0QgdmlldyDilIDilIBcbiAgLyoqIFRoZSBkaXYgdGhlIHNsaWNlIHBhbmUgcmVuZGVycyBpbnRvIHdoaWxlIGl0IGlzIHdhbnRlZCAobnVsbDogbm8gc3BsaXQpLiAqL1xuICBwcml2YXRlIHNsaWNlRGl2OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoZXRoZXIgT1NEIGlzIG1vdW50ZWQgaW4gdGhlIHNsaWNlIHBhbmU6IHJlZ2lvbiwgdG9vbCBhbmQgb3ZlcmxheSBjYWxscyBnbyB0byBpdC4gKi9cbiAgcHJpdmF0ZSBzbGljZU1vdW50ZWQgPSBmYWxzZTtcbiAgLyoqIFRoZSBpbWFnZSB0aGUgc2xpY2UgcGFuZSBzaG93cy4gKi9cbiAgcHJpdmF0ZSBzbGljZUZpbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEJ1bXBlZCBwZXIgc2xpY2UtcGFuZSBtb3VudCBvciB0ZWFyZG93biwgc28gb25seSB0aGUgbGF0ZXN0IG9uZSBsYW5kcy4gKi9cbiAgcHJpdmF0ZSBzbGljZVJlcXVlc3QgPSAwO1xuICAvKiogVGhlIHNlY3Rpb25zIGJlc2lkZSB0aGUgc3BsaXQgdm9sdW1lIHZpZXcgKHRoZSBwbGFuZXMgeCBhbmQgeSB0aHJvdWdoIHRoZSBzdGFjaykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvbnM6IFZvbHVtZVNlY3Rpb25zO1xuICAvKiogVGhlIHogcGxhbmUgZHJhZ2dlZCBpbiB0aGUgdm9sdW1lOiB0aGUgc2xpY2UgdG8gc2hvdyAoc2VlIHtAbGluayBnZXRTbGljZURyYWckfSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2xpY2VEcmFnJCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWN0aW9uU3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgLyoqIFRoZSBpbWFnZSBpbmZvIGFuZCBzY3JlZW4gaGVpZ2h0IG9mIHRoZSBsYXN0IHBsb3QgKHdoYXQgdGhlIHNsaWNlIHBhbmUgbW91bnRzKS4gKi9cbiAgcHJpdmF0ZSBwbG90dGVkSW5mbzogSUltYWdlSW5mbyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGN1cnJlbnQgcmVnaW9uIGltcG9ydCAoc2VlIHJlZ2lvbkltcG9ydFRpY2tldCk6IGl0cyBpZCBhbmQgdGhlIGltYWdlIGl0IHdhcyB0YWtlbiBmb3IuICovXG4gIHByaXZhdGUgaW1wb3J0VGlja2V0OiB7IGlkOiBudW1iZXI7IGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgfSA9IHsgaWQ6IDAsIGltYWdlOiB1bmRlZmluZWQgfTtcbiAgcHJpdmF0ZSBwbG90dGVkSGVpZ2h0ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBsb3RseTogUGxvdGx5U2VydmljZSxcbiAgICBwcml2YXRlIG9zZDogT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmFwYXJpOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgQEluamVjdChWSVpfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVml6Q29uZmlnLFxuICAgIC8vIE9wdGlvbmFsOiBhIGhvc3QgdGhhdCBzZXJ2ZXMgbm8gc3BhdGlhbC1vbWljcyBkYXRhIGJpbmRzIG5vdGhpbmcsXG4gICAgLy8gYW5kIGBnZXRTcGF0aWFsQ29udHJvbHMoKWAgdGhlbiByZXR1cm5zIG51bGwuXG4gICAgcHJpdmF0ZSByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25TdG9yZTogU3BhdGlhbFNlbGVjdGlvblN0b3JlLFxuICAgIHByaXZhdGUgaW50ZW5zaXR5OiBJbnRlbnNpdHlQcm9maWxlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpXG4gICAgcHJpdmF0ZSBzcGF0aWFsRGF0YTogU3BhdGlhbERhdGFQb3J0IHwgbnVsbCA9IG51bGwsXG4gICkge1xuICAgIHRoaXMucmVnaW9uVXBkYXRlcyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblJlZ2lvbnNDaGFuZ2VkKCkpO1xuICAgIHRoaXMuc2VjdGlvbnMgPSBuZXcgVm9sdW1lU2VjdGlvbnMoe1xuICAgICAgdm9sdW1lOiAoKSA9PiB0aGlzLm5hcGFyaS52b2x1bWVWb3hlbHMoKSxcbiAgICAgIGltYWdlOiAoKSA9PiB0aGlzLnBsb3R0ZWRGaWxlTmFtZSxcbiAgICAgIHNob3dQbGFuZXM6IChwbGFuZXMpID0+IHRoaXMubmFwYXJpLnNldFNsaWNlUGxhbmVzKHBsYW5lcyksXG4gICAgICBvdXRsaW5lc0J5Q2xhc3M6IChsZXZlbCkgPT4gdGhpcy5yZWdpb25TdG9yZS5vdXRsaW5lc0J5Q2xhc3MobGV2ZWwpLFxuICAgICAgaXNDbGFzc0hpZGRlbjogKGxhYmVsKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmlzQ2xhc3NIaWRkZW4obGFiZWwpLFxuICAgICAgY29sb3JPZjogKGxhYmVsKSA9PiB0aGlzLmNsYXNzQ29sb3IobGFiZWwpLFxuICAgICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgY29sb3JtYXA6IChzdCwgbXVsdGljaGFubmVsKSA9PiB7XG4gICAgICAgIC8vIEFzIHRoZSB2b2x1bWUgc2NlbmUgY29sb3VycyB0aGUgY2hhbm5lbCAoaW52ZXJ0IGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBjb2xvcm1hcCkuXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB7XG4gICAgICAgICAgY29sb3JtYXA6IHRoaXMuc3RvcmUuY3VycmVudENvbG9ybWFwKCksXG4gICAgICAgICAgcmV2ZXJzZTogdGhpcy5zdG9yZS5jdXJyZW50UmV2ZXJzZVNjYWxlKCksXG4gICAgICAgICAgaW52ZXJ0OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVDb2xvcm1hcChcbiAgICAgICAgICBtdWx0aWNoYW5uZWwgPyBjaGFubmVsVGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicsIGRpc3BsYXkpIDogdm9sdW1lQ29sb3JtYXAoc3QsIGRpc3BsYXkpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGludmVydDogKCkgPT4gdGhpcy5zdG9yZS5jdXJyZW50SW52ZXJ0KCksXG4gICAgICBzbGljZTogKCkgPT4gdGhpcy5jdXJyZW50WkluZGV4LFxuICAgIH0pO1xuICAgIC8vIEEgcGxhbmUgZHJhZ2dlZCBpbiB0aGUgdm9sdW1lOiB0aGUgeiBwbGFuZSBwaWNrcyB0aGUgc2xpY2UgKHRocm91Z2ggdGhlIGhvc3QncyBzbGlkZXIsIHNvXG4gICAgLy8gdGhlIHN0b3JlIGFuZCB0aGUgc2xpY2UgcGFuZSBmb2xsb3cpLCB0aGUgb3RoZXJzIG1vdmUgdGhlaXIgc2VjdGlvbi5cbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZChcbiAgICAgIHRoaXMubmFwYXJpLmdldFNsaWNlUGxhbmVNb3ZlJCgpLnN1YnNjcmliZSgoeyBheGlzLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgIGlmIChheGlzID09PSAneicpIHRoaXMuc2xpY2VEcmFnJC5uZXh0KE1hdGgucm91bmQodmFsdWUpKTtcbiAgICAgICAgZWxzZSB0aGlzLnNlY3Rpb25zLnNldFBsYW5lKGF4aXMsIHZhbHVlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQodGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpKSk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQodGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpKSk7XG4gIH1cblxuICAvKiogQSBjbGFzcydzIGNvbG91cjogaXRzIGNsYXNzaWZpY2F0aW9uIGNvbG91ciwgZWxzZSBpdHMgcmVnaW9uIHNvdXJjZSdzLCBlbHNlIGEgZGVmYXVsdC4gKi9cbiAgcHJpdmF0ZSBjbGFzc0NvbG9yKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCkuZ2V0KGxhYmVsKSA/P1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3KCk/LmNvbG9yT2YoeyBsYWJlbCwgY29sb3I6IG51bGwgfSkgPz9cbiAgICAgICcjZmZjYzAwJ1xuICAgICk7XG4gIH1cblxuICAvKiogVGhlIHNlY3Rpb25zIGJlc2lkZSB0aGUgc3BsaXQgdm9sdW1lIHZpZXcgKG51bGxzIHdoaWxlIGl0IGlzIG5vdCBzcGxpdCkuICovXG4gIGdldFNlY3Rpb25WaWV3cyQoKTogT2JzZXJ2YWJsZTxTZWN0aW9uVmlld3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5nZXRWaWV3cyQoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIGEgc2VjdGlvbidzIHBsYW5lIHRvIGBhdGAgKGltYWdlIHB4KS4gKi9cbiAgc2V0U2VjdGlvblBsYW5lKGF4aXM6IFNlY3Rpb25BeGlzLCBhdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWN0aW9ucy5zZXRQbGFuZShheGlzLCBhdCk7XG4gIH1cblxuICAvKiogVGhlIHNsaWNlIHBpY2tlZCBieSBkcmFnZ2luZyB0aGUgeiBwbGFuZSBpbiB0aGUgdm9sdW1lOiB0aGUgaG9zdCBzaG93cyBpdCAoaXRzIHNsaWRlcikuICovXG4gIGdldFNsaWNlRHJhZyQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zbGljZURyYWckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ltYWdlVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ID09PSBQbG90VHlwZS5JTUFHRTtcbiAgfVxuXG4gIC8qKiBUaGUgMkQgbmFwYXJpIHR5cGVzIChpbWFnZSwgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIsIHNwYXRpYWwgb21pY3MpIOKAlCBhIDJEIGZhbGxiYWNrIGNoYWluXG4gICAqICAoT1NELCB0aGVuIFBsb3RseSkuXG4gICAqXG4gICAqICBOT1RFIGZvciBTUEFUSUFMX09NSUNTOiBvbmx5IG5hcGFyaS1qcyBkcmF3cyB0aGUgb2JzZXJ2YXRpb24gbWFya2Vycy4gSWYgaXQgZmFpbHMgKG5vIFdlYkdQVSxcbiAgICogIGRldmljZSBsb3NzKSB0aGUgZmFsbGJhY2sgcmVuZGVycyB0aGUgdGlzc3VlIGltYWdlIEFMT05FIOKAlCB0aGUgc3BhdGlhbCBsYXllciBpcyBhYnNlbnQsIG5vdFxuICAgKiAgZGVncmFkZWQuIFRoYXQgaXMgZGVsaWJlcmF0ZSBmb3Igbm93OiBzaG93aW5nIHRoZSBzbGlkZSBiZWF0cyBzaG93aW5nIG5vdGhpbmcsIGFuZCBhIFBsb3RseVxuICAgKiAgYHNjYXR0ZXJnbGAgc3BhdGlhbCBtb2RlIGlzIHRoZSBwbGFubmVkIHJlYWwgZmFsbGJhY2sgKHNlZSB0aGUgcGxvdC1tb2RlIGRlc2lnbiBkb2MpLiAqL1xuICBwcml2YXRlIGlzTmFwYXJpSW1hZ2VUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHQgPT09IFBsb3RUeXBlLk5BUEFSSV9JTUFHRSB8fCBpc05hcGFyaVNjYXR0ZXIodCkgfHwgaXNTcGF0aWFsT21pY3ModCk7XG4gIH1cblxuICAvKiogVGhlIDNEIG5hcGFyaSB0eXBlcyAodm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZS9zY2F0dGVyLCBwbHVzIHRoZSAzRCBzcGF0aWFsIGNsb3VkKSDigJQgbm8gMkRcbiAgICogIGZhbGxiYWNrIGV4aXN0cyAoT1NEIGlzIGltYWdlLW9ubHkpLCBzbyB0aGV5IGZhbGwgc3RyYWlnaHQgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIGlzTmFwYXJpM2RUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmFwYXJpM2QodCkgfHwgaXNTcGF0aWFsT21pY3MzZCh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrZW5kIHRvIGF0dGVtcHQgZm9yIHRoZSBjdXJyZW50IHBsb3QgdHlwZSB0aGlzIHJlbmRlci4gVGhlIGZhbGxiYWNrIGNoYWlucyBiZWxvdyBhcmVcbiAgICogbWlycm9yZWQgZXhhY3RseSBieSB7QGxpbmsgbG9hZH0gc28gdGhlIGhhbmRsZSBgcGxvdCgpYCByZWNlaXZlcyBhbHdheXMgY29tZXMgZnJvbSB0aGVcbiAgICogYmFja2VuZCBgcGxvdCgpYCBzZWxlY3RzIChubyBsb2FkL3Bsb3QgYmFja2VuZCBtaXNtYXRjaCk6XG4gICAqICAtIDJEIGltYWdlIChleHBsaWNpdCBgTkFQQVJJX0lNQUdFYCwgb3IgYElNQUdFYCB3aXRoIHRoZSBXZWJHUFUgb3B0LWluKTogbmFwYXJpLWpzIOKGkiBPU0Qg4oaSIFBsb3RseS5cbiAgICogIC0gcGxhaW4gYElNQUdFYCAobm8gb3B0LWluKTogT1NEIOKGkiBQbG90bHkuXG4gICAqICAtIDNEIG5hcGFyaSAoYE5BUEFSSV9WT0xVTUVgL2BOQVBBUklfSVNPU1VSRkFDRWApOiBuYXBhcmktanMg4oaSIFBsb3RseSAoT1NEIGNhbid0IHJlbmRlciAzRCkuXG4gICAqL1xuICBwcml2YXRlIGltYWdlQmFja2VuZCgpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgY29uc3QgdCA9IHRoaXMuY3VycmVudFBsb3RUeXBlO1xuICAgIC8vIDJEIGltYWdlIHdpdGggYSBuYXBhcmktanMgYXR0ZW1wdCAoZXhwbGljaXQgbmFwYXJpIGltYWdlLCBvciBvcHQtaW4gb24gdGhlIEltYWdlIHR5cGUpLlxuICAgIGlmICh0aGlzLmlzTmFwYXJpSW1hZ2VUeXBlKHQpIHx8ICh0aGlzLmlzSW1hZ2VUeXBlKHQpICYmIHRoaXMuY29uZmlnLnVzZU5hcGFyaVJlbmRlcmVyKSkge1xuICAgICAgaWYgKCF0aGlzLm5hcGFyaUZlbGxCYWNrKSByZXR1cm4gdGhpcy5uYXBhcmk7XG4gICAgICBpZiAoIXRoaXMub3NkRmVsbEJhY2spIHJldHVybiB0aGlzLm9zZDtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseTtcbiAgICB9XG4gICAgLy8gUGxhaW4gSW1hZ2UgdHlwZSAobm8gbmFwYXJpIG9wdC1pbik6IE9TRCwgdGhlbiBQbG90bHkuXG4gICAgaWYgKHRoaXMuaXNJbWFnZVR5cGUodCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9zZEZlbGxCYWNrID8gdGhpcy5wbG90bHkgOiB0aGlzLm9zZDtcbiAgICB9XG4gICAgLy8gM0QgbmFwYXJpIHR5cGVzOiBuYXBhcmktanMsIHdpdGggUGxvdGx5IGFzIHRoZSBvbmx5IHZpYWJsZSBmYWxsYmFjay5cbiAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0KSkge1xuICAgICAgcmV0dXJuIHRoaXMubmFwYXJpRmVsbEJhY2sgPyB0aGlzLnBsb3RseSA6IHRoaXMubmFwYXJpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHk7XG4gIH1cblxuICAvKiogQmFja2VuZCBjdXJyZW50bHkgb24gc2NyZWVuIOKAlCB3aGF0IG9uZ29pbmcgem9vbS90b29sL3JlZ2lvbiBvcHMgYWN0IG9uLiAqL1xuICBwcml2YXRlIHJlbmRlcmVyKCk6IElWaWV3ZXJCYWNrZW5kIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0UmVuZGVyZWQgPz8gdGhpcy5wbG90bHk7XG4gIH1cblxuICAvKipcbiAgICogQmFja2VuZCByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgYWN0IG9uOiB0aGUgc2xpY2UgcGFuZSdzIE9TRCB3aGlsZSB0aGUgdm9sdW1lIHZpZXcgaXNcbiAgICogc3BsaXQgKHJlZ2lvbnMgYXJlIGVkaXRlZCB0aGVyZSksIGVsc2UgdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBWaWV3IGNhbGxzICh6b29tLCBmaXQsIGNvbG91cixcbiAgICogZXhwb3J0KSBzdGF5IHdpdGgge0BsaW5rIHJlbmRlcmVyfS5cbiAgICovXG4gIHByaXZhdGUgcmVnaW9uQmFja2VuZCgpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VNb3VudGVkID8gdGhpcy5vc2QgOiB0aGlzLnJlbmRlcmVyKCk7XG4gIH1cblxuICAvLyBTeXN0ZW0gY2FwYWJpbGl0aWVzIGFyZSBQbG90bHkncyAodGhlIGZ1bGwtZmVhdHVyZWQgYmFja2VuZCkgc28gdGhlIFVJXG4gIC8vIGtlZXBzIG9mZmVyaW5nIGV2ZXJ5IHBsb3QgdHlwZSByZWdhcmRsZXNzIG9mIHdoaWNoIG9uZSBpcyBvbiBzY3JlZW4uXG4gIGdldCBjYXBhYmlsaXRpZXMoKTogVmlld2VyQ2FwYWJpbGl0aWVzIHtcbiAgICByZXR1cm4gdGhpcy5wbG90bHkuY2FwYWJpbGl0aWVzO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlbmRlciAvIHZpZXdwb3J0IOKGkiBhY3RpdmUgcmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgLy8gQSBzdGFjayBjYW4gb3BlbiBhd2F5IGZyb20gc2xpY2UgMCAoYGluaXRpYWxaSW5kZXhgIOKAlCBhIHZvbHVtZSBvcGVuc1xuICAgIC8vIG1pZC1zcGVjaW1lbiksIGFuZCB0aGF0IGFycml2ZXMgaGVyZSByYXRoZXIgdGhhbiB0aHJvdWdoIHNldFpJbmRleC5cbiAgICB0aGlzLmN1cnJlbnRaSW5kZXggPSB6SW5kZXg7XG4gICAgY29uc3QgYmFja2VuZCA9IHRoaXMuaW1hZ2VCYWNrZW5kKCk7XG4gICAgaWYgKGJhY2tlbmQgPT09IHRoaXMubmFwYXJpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5uYXBhcmkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBYm9ydGVkOiBub2JvZHkgd2FudHMgdGhpcyBpbWFnZSBhbnkgbW9yZSwgc28gZG9uJ3QgZ28gb24gdG8gbG9hZCBpdCBlbHNld2hlcmUuXG4gICAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IGVycjtcbiAgICAgICAgdGhpcy5uYXBhcmlGZWxsQmFjayA9IHRydWU7XG4gICAgICAgIC8vIE1pcnJvciBpbWFnZUJhY2tlbmQoKSdzIGZhbGxiYWNrIHNvIGxvYWQgKyBwbG90IHBpY2sgdGhlIHNhbWUgYmFja2VuZDpcbiAgICAgICAgLy8gIC0gM0QgbmFwYXJpIHR5cGVzIGhhdmUgbm8gMkQgZmFsbGJhY2sg4oaSIHN0cmFpZ2h0IHRvIFBsb3RseS5cbiAgICAgICAgLy8gIC0gMkQgaW1hZ2Ug4oaSIE9TRCwgdGhlbiBQbG90bHkuXG4gICAgICAgIGlmICh0aGlzLmlzTmFwYXJpM2RUeXBlKHRoaXMuY3VycmVudFBsb3RUeXBlKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIG5hcGFyaS1qcyBsb2FkIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIFBsb3RseS4nLCBlcnIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIG5hcGFyaS1qcyBsb2FkIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIE9wZW5TZWFkcmFnb24uJywgZXJyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZFZpYU9zZFRoZW5QbG90bHkoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiYWNrZW5kID09PSB0aGlzLm9zZCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZFZpYU9zZFRoZW5QbG90bHkoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFRyeSBPU0Q7IG9uIGZhaWx1cmUgZmFsbCBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZSAobm90IHBlcm1hbmVudCDigJQgc2VlIHJlc2V0KCkpLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRWaWFPc2RUaGVuUGxvdGx5KFxuICAgIGltYWdlSW5mbzogSUltYWdlSW5mbyxcbiAgICB6SW5kZXg6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5vc2QubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IGVycjtcbiAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIE9wZW5TZWFkcmFnb24gbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UuJywgZXJyKTtcbiAgICAgIHRoaXMub3NkRmVsbEJhY2sgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMucGxvdGx5LmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfVxuICB9XG4gIHBsb3QoXG4gICAgcGxvdERpdjogc3RyaW5nLFxuICAgIGltYWdlTG9hZGVkOiB1bmtub3duLFxuICAgIGltYWdlSW5mbzogSUltYWdlSW5mbyxcbiAgICBzY3JlZW5IZWlnaHQ6IG51bWJlcixcbiAgICBwbG90VHlwZTogUGxvdFR5cGUsXG4gICAgaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuY3VycmVudFBsb3RUeXBlID0gcGxvdFR5cGU7XG4gICAgdGhpcy5wbG90dGVkRmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMucGxvdHRlZEluZm8gPSBpbWFnZUluZm8gPz8gbnVsbDtcbiAgICB0aGlzLnBsb3R0ZWRIZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG4gICAgdGhpcy51cGRhdGVWb2x1bWVWaWV3KHBsb3RUeXBlKTtcbiAgICAvLyBUaGUgc2xpY2UgcGFuZSBiZWxvbmdzIHRvIHRoZSB2b2x1bWUgdmlldzogYW5vdGhlciBwbG90IHR5cGUgdGFrZXMgaXQgZG93biAoT1NEIG1heSBiZVxuICAgIC8vIGFib3V0IHRvIGRyYXcgdGhlIG1haW4gdmlldywgd2hpY2ggbXVzdCBub3QgZmluZCB0aGUgcGFuZSdzIHZpZXdlciBzdGlsbCBtb3VudGVkKS5cbiAgICBpZiAoIXRoaXMuaW1hZ2VWb2x1bWVWaWV3KSB0aGlzLnVubW91bnRTbGljZSgpO1xuICAgIC8vIFJlZ2lvbiBzdXJmYWNlcyBiZWxvbmcgdG8gdGhlIGltYWdlIHRoZXkgd2VyZSBidWlsdCBmcm9tOiBhbm90aGVyIGltYWdlIGRyb3BzIHRoZW0uXG4gICAgaWYgKHRoaXMuY2xhc3NlczNkJC52YWx1ZS5sZW5ndGggJiYgdGhpcy5wbG90dGVkRmlsZU5hbWUgIT09IHRoaXMuY2xhc3NlczNkSW1hZ2UpIHRoaXMuY2xlYXJSZWdpb25DbGFzc2VzM2QoKTtcbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIC8vIEFwcGx5IHRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChzbmFwc2hvdCBvbGQgcmVnaW9ucywgcmVzdG9yZSB0aGUgbmV3XG4gICAgLy8gaW1hZ2UncywgY2xlYXIgc2VsZWN0aW9uKSBmb3Igd2hpY2hldmVyIGJhY2tlbmQgcmVuZGVycyDigJQgUGxvdGx5IGRvZXNcbiAgICAvLyB0aGlzIGluc2lkZSBpdHMgb3duIHBsb3QoKSwgYnV0IE9TRCBkb2Vzbid0LCBzbyBkcml2ZSBpdCBoZXJlLiBJZGVtcG90ZW50XG4gICAgLy8gZm9yIHRoZSBzYW1lIGltYWdlLCBzbyBpdCdzIHNhZmUgdG8gY2FsbCBvbiBldmVyeSAocmUpcGxvdC5cbiAgICB0aGlzLnBsb3RseS5zZXRBY3RpdmVJbWFnZShpbWFnZUluZm8pO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIC8vIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlIHNhbWUgZGl2IOKAlCB0ZWFyIGRvd24gdGhlIG91dGdvaW5nIG9uZSBvbiBzd2l0Y2guXG4gICAgLy8gUGxvdGx5IG11c3QgYmUgKnB1cmdlZCogKG5vdCByZXNldCwgd2hpY2ggcmUtZHJhd3MgZW1wdHkgYXhlcykgYmVmb3JlIE9TRFxuICAgIC8vIHRha2VzIHRoZSBkaXYuXG4gICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkICYmIHRoaXMubGFzdFJlbmRlcmVkICE9PSBuZXh0KSB7XG4gICAgICBpZiAodGhpcy5sYXN0UmVuZGVyZWQgPT09IHRoaXMucGxvdGx5KSB0aGlzLnBsb3RseS5wdXJnZVBsb3QoKTtcbiAgICAgIGVsc2UgdGhpcy5sYXN0UmVuZGVyZWQucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBuZXh0O1xuICAgIGNvbnN0IHBsb3R0ZWQgPSBuZXh0LnBsb3QocGxvdERpdiwgaW1hZ2VMb2FkZWQsIGltYWdlSW5mbywgc2NyZWVuSGVpZ2h0LCBwbG90VHlwZSwgaW5QbGFjZSk7XG4gICAgaWYgKCF0aGlzLnNsaWNlRGl2IHx8ICF0aGlzLmltYWdlVm9sdW1lVmlldykgcmV0dXJuIHBsb3R0ZWQ7XG4gICAgLy8gVGhlIHNwbGl0IHZvbHVtZSB2aWV3OiB0aGUgc2xpY2UgcGFuZSBmb2xsb3dzIHRoZSBpbWFnZSAoYSBuZXcgb25lLCBvciBpdHMgc2hhcnBlciBwYXNzKS5cbiAgICByZXR1cm4gcGxvdHRlZC50aGVuKChvaykgPT4ge1xuICAgICAgaWYgKG9rICYmICghdGhpcy5zbGljZU1vdW50ZWQgfHwgdGhpcy5zbGljZUZpbGUgIT09IGltYWdlSW5mbz8uZmlsZU5hbWUgfHwgaW5QbGFjZSkpIHtcbiAgICAgICAgdm9pZCB0aGlzLm1vdW50U2xpY2UoISFpblBsYWNlICYmIHRoaXMuc2xpY2VNb3VudGVkICYmIHRoaXMuc2xpY2VGaWxlID09PSBpbWFnZUluZm8/LmZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB2b2x1bWUgd2FzIGFzc2VtYmxlZCBhZ2FpbiAoYW5vdGhlciBpbWFnZSwgb3IgcmVzb2x1dGlvbik6IGN1dCB0aGUgc2VjdGlvbnMgZnJvbSBpdC5cbiAgICAgIGlmIChvaykgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICAgICAgcmV0dXJuIG9rO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoZSB2b2x1bWUgdmlldzogc2hvdyB0aGUgc2xpY2UgYmVpbmcgZWRpdGVkIGluIGBkaXZgIChPcGVuU2VhZHJhZ29uLCB3aXRoIGV2ZXJ5IHJlZ2lvblxuICAgKiB0b29sKSBiZXNpZGUgdGhlIDNEIHZpZXcsIG9yIHN0b3AgKG51bGwpLiBLZXB0IGFjcm9zcyByZS1wbG90cyBvZiBhIHZvbHVtZSB2aWV3OyBhbm90aGVyIHBsb3RcbiAgICogdHlwZSB0YWtlcyB0aGUgcGFuZSBkb3duIGFuZCBhIHZvbHVtZSB2aWV3IGJyaW5ncyBpdCBiYWNrLiBSZXNvbHZlcyB3aGV0aGVyIHRoZSBwYW5lIHNob3dzLlxuICAgKi9cbiAgYXN5bmMgc2V0U2xpY2VFZGl0b3IoZGl2OiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5zbGljZURpdiA9IGRpdjtcbiAgICBpZiAodGhpcy5zbGljZUVkaXRvciQudmFsdWUgIT09ICEhZGl2KSB0aGlzLnNsaWNlRWRpdG9yJC5uZXh0KCEhZGl2KTtcbiAgICBpZiAoIWRpdikge1xuICAgICAgdGhpcy51bm1vdW50U2xpY2UoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW91bnRTbGljZShmYWxzZSk7XG4gIH1cblxuICAvKiogTW91bnQgKG9yIHJlZnJlc2ggaW4gcGxhY2UpIE9TRCBpbiB0aGUgc2xpY2UgcGFuZSBvbiB0aGUgZGlzcGxheWVkIHNsaWNlLiAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U2xpY2UoaW5QbGFjZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRpdiA9IHRoaXMuc2xpY2VEaXY7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMucGxvdHRlZEluZm87XG4gICAgaWYgKCFkaXYgfHwgIWluZm8/LnVybHM/Lmxlbmd0aCB8fCAhdGhpcy5pbWFnZVZvbHVtZVZpZXcpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLnNsaWNlUmVxdWVzdDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgdGhpcy5vc2QubG9hZChpbmZvLCB0aGlzLmN1cnJlbnRaSW5kZXgpO1xuICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMuc2xpY2VSZXF1ZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBvayA9IGF3YWl0IHRoaXMub3NkLnBsb3QoZGl2LCBsb2FkZWQsIGluZm8sIHRoaXMucGxvdHRlZEhlaWdodCwgUGxvdFR5cGUuSU1BR0UsIGluUGxhY2UpO1xuICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMuc2xpY2VSZXF1ZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgICB0aGlzLnNsaWNlTW91bnRlZCA9IG9rO1xuICAgICAgdGhpcy5zbGljZUZpbGUgPSBpbmZvLmZpbGVOYW1lO1xuICAgICAgaWYgKG9rKSB7XG4gICAgICAgIC8vIFRoZSBzbGljZSBtYXkgaGF2ZSBtb3ZlZCB3aGlsZSB0aGUgcGFuZSBsb2FkZWQuXG4gICAgICAgIHRoaXMub3NkLnNldFpJbmRleCh0aGlzLmN1cnJlbnRaSW5kZXgpO1xuICAgICAgICB0aGlzLnRyYWNrTGl2ZUNsYXNzZXMoKTtcbiAgICAgICAgdGhpcy5zZWN0aW9ucy5zdGFydCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9rO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHJlcXVlc3QgPT09IHRoaXMuc2xpY2VSZXF1ZXN0KVxuICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBUaGUgc2xpY2UgcGFuZSBjb3VsZCBub3Qgc2hvdyB0aGUgaW1hZ2UuJywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogVGFrZSB0aGUgc2xpY2UgcGFuZSdzIHZpZXdlciBkb3duICh0aGUgc3BsaXQgc3RheXMgd2FudGVkIHdoaWxlIHtAbGluayBzbGljZURpdn0gaXMgc2V0KS4gKi9cbiAgcHJpdmF0ZSB1bm1vdW50U2xpY2UoKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVJlcXVlc3QrKztcbiAgICBpZiAodGhpcy5zbGljZU1vdW50ZWQpIHtcbiAgICAgIHRoaXMub3NkLnJlc2V0KCk7XG4gICAgICB0aGlzLnNlY3Rpb25zLnN0b3AoKTtcbiAgICB9XG4gICAgdGhpcy5zbGljZU1vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNsaWNlRmlsZSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnJlbG9hZEFuZFBsb3QoKTtcbiAgfVxuICByZXNldCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCBvZiBhIHJlbmRlciBjeWNsZTogcmUtZW5hYmxlIG5hcGFyaS1qcy9PU0QgYXR0ZW1wdHMgKGNsZWFyIGFueSBwcmlvclxuICAgIC8vIHBlci1pbWFnZSBmYWxsYmFjaykgYW5kIHRlYXIgZG93biB3aGF0ZXZlcidzIG9uIHNjcmVlbi5cbiAgICB0aGlzLm9zZEZlbGxCYWNrID0gZmFsc2U7XG4gICAgdGhpcy5uYXBhcmlGZWxsQmFjayA9IGZhbHNlO1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZXNldCgpO1xuICB9XG4gIHJlbGF5b3V0KHRydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZWxheW91dCh0cnVlSW1hZ2VTaXplKTtcbiAgfVxuICByZXNldEF4ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnJlc2V0QXhlcygpO1xuICB9XG4gIGZpdFRvVmlldygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZml0VG9WaWV3KCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZml0VG9WaWV3fS4gKi9cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMuZml0VG9WaWV3KCk7XG4gIH1cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS56b29tSW4oKTtcbiAgfVxuICB6b29tT3V0KCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS56b29tT3V0KCk7XG4gIH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0RHJhZ01vZGUobW9kZSk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB0aGlzLm9zZC5zZXREcmFnTW9kZShtb2RlKTtcbiAgfVxuICAvKiogRXZlcnkgYmFja2VuZCwgb24gc2NyZWVuIG9yIG5vdC4gKi9cbiAgcHJpdmF0ZSBiYWNrZW5kcygpOiBJVmlld2VyQmFja2VuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMucGxvdGx5LCB0aGlzLm9zZCwgdGhpcy5uYXBhcmldO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYXZpZ2F0b3IgLyBzbW9vdGhpbmcgb3B0aW9ucywgYXBwbGllZCB0byBFVkVSWSBiYWNrZW5kIHRoYXQgaGFzIHRoZW0gKG5vdFxuICAgKiBqdXN0IHRoZSBhY3RpdmUgcmVuZGVyZXIpOiBjb25zdW1lcnMgc2V0IHRoZW0gYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIsIHdoZW5cbiAgICogYHJlbmRlcmVyKClgIGlzIHN0aWxsIHRoZSBQbG90bHkgZGVmYXVsdCwgYW5kIE9TRC9uYXBhcmktanMgbXVzdCByZWNlaXZlIHRoZW1cbiAgICogdG8gaG9ub3VyIHRoZW0gYXQgdmlld2VyIGNyZWF0aW9uLlxuICAgKi9cbiAgZ2V0T3NkVmlld09wdGlvbnMoKTogSU9zZFZpZXdPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy52aWV3T3B0aW9ucztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdPcHRpb25zOiBJT3NkVmlld09wdGlvbnMgPSB7XG4gICAgc2V0TmF2aWdhdG9yVmlzaWJsZTogKHZpc2libGUpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLmJhY2tlbmRzKCkpIGIuZ2V0T3NkVmlld09wdGlvbnMoKT8uc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9LFxuICAgIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZDogKGVuYWJsZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLmJhY2tlbmRzKCkpIGIuZ2V0T3NkVmlld09wdGlvbnMoKT8uc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpO1xuICAgIH0sXG4gIH07XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0TmF2aWdhdG9yVmlzaWJsZSgpYC4gKi9cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52aWV3T3B0aW9ucy5zZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKClgLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlld09wdGlvbnMuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpO1xuICB9XG4gIHNldFNob3dTdGFjayhzaG93c3RhY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0U2hvd1N0YWNrKHNob3dzdGFjayk7XG4gIH1cbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50WkluZGV4ID0gekluZGV4O1xuICAgIHRoaXMucmVuZGVyZXIoKS5zZXRaSW5kZXgoekluZGV4KTtcbiAgICBpZiAodGhpcy5zbGljZU1vdW50ZWQpIHtcbiAgICAgIHRoaXMub3NkLnNldFpJbmRleCh6SW5kZXgpO1xuICAgICAgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICAgIH1cbiAgfVxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICB9XG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0Q3VycmVudEltYWdlKCk7XG4gIH1cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk7XG4gIH1cbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk7XG4gIH1cbiAgZG93bmxvYWRJbWFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZG93bmxvYWRJbWFnZSgpO1xuICB9XG4gIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZXhwb3J0Q29tcG9zaXRlKCk7XG4gIH1cblxuICBzZXRQbG90VHlwZShwbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMudXBkYXRlVm9sdW1lVmlldyhwbG90VHlwZSk7XG4gICAgdGhpcy5wbG90bHkuc2V0UGxvdFR5cGUocGxvdFR5cGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKWAuICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICB0aGlzLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnJlc2V0U3VyZmFjZUNhbWVyYSgpO1xuICB9XG4gIC8qKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiAobmFwYXJpLWpzKSwgZWxzZSBudWxsLiAqL1xuICBnZXRWb2x1bWVSZXNvbHV0aW9uKCk6IElWb2x1bWVSZXNvbHV0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRWb2x1bWVSZXNvbHV0aW9uKCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoKWAuICovXG4gIHNldFJlc29sdXRpb25TY2FsZShzY2FsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5nZXRWb2x1bWVSZXNvbHV0aW9uKCk/LnNldChzY2FsZSk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5nZXQoKWAuICovXG4gIGdldFJlc29sdXRpb25TY2FsZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFZvbHVtZVJlc29sdXRpb24oKT8uZ2V0KCkgPz8gMTtcbiAgfVxuICAvKiogVGhlIHZpZXdwb3J0IG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgZm9yIGEgY29udHJpYnV0ZWQgcGxvdCBtb2RlLiBOdWxsXG4gICAqICB3aGVuIHRoYXQgYmFja2VuZCBjYW5ub3QgcHJvdmlkZSBvbmUgKGUuZy4gT1NEIGZlbGwgYmFjayB0byBQbG90bHkpLiAqL1xuICBnZXRQbG90TW9kZVZpZXdwb3J0KCk6IFBsb3RNb2RlVmlld3BvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFBsb3RNb2RlVmlld3BvcnQ/LigpID8/IG51bGw7XG4gIH1cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gUGxvdGx5IGVudW1lcmF0ZXMgdGhlIGZ1bGwgUExPVF9UWVBFX0RFU0NSSVBUT1JTIG1hcCwgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB0aGVcbiAgICAvLyBuYXBhcmktanMgV2ViR1BVIHR5cGVzIChqaXQtdWkjMTAyKSDigJQgc28gdGhpcyBzaW5nbGUgc291cmNlIGNvdmVycyB0aGVtIChubyBkdXBsaWNhdGVzKS5cbiAgICByZXR1cm4gdGhpcy5wbG90bHkuZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGxvbmctbGl2ZWQgb2JzZXJ2YWJsZXMgKyBzdGFjayBmbGFncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgc2V0U3RhY2tMb2FkaW5nKGI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5zZXRTdGFja0xvYWRpbmcoYik7XG4gIH1cbiAgLy8gQ2FuY2VsIGluLWZsaWdodCBsb2FkaW5nIG9uIGV2ZXJ5IGJhY2tlbmQg4oCUIHRoZSB1c2VyJ3MgQ2FuY2VsIHNob3VsZG4ndCBkZXBlbmQgb24gd2hpY2ggb25lIGlzXG4gIC8vIGFjdGl2ZS4gT25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBmcmFtZXMgKG5hcGFyaS1qcykgZG8gcmVhbCB3b3JrOyB0aGUgcmVzdCBuby1vcC4gVGhlIGNvbmNyZXRlXG4gIC8vIGJhY2tlbmQgY2xhc3NlcyBkb24ndCBhbGwgZGVjbGFyZSB0aGUgb3B0aW9uYWwgY29udHJhY3QgbWV0aG9kLCBzbyBjYWxsIGl0IHZpYSBJVmlld2VyQmFja2VuZC5cbiAgY2FuY2VsTG9hZGluZygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGJhY2tlbmQgb2YgW3RoaXMucGxvdGx5LCB0aGlzLm9zZCwgdGhpcy5uYXBhcmldIGFzIElWaWV3ZXJCYWNrZW5kW10pIHtcbiAgICAgIGJhY2tlbmQuY2FuY2VsTG9hZGluZz8uKCk7XG4gICAgfVxuICB9XG4gIC8vIExvYWRpbmcgc3RhdGUgaXMgc3VyZmFjZWQgZnJvbSB3aGljaGV2ZXIgYmFja2VuZCBpcyBkb2luZyB0aGUgd29yazogT1NEIGFuZCBuYXBhcmktanMgKHZvbHVtZVxuICAvLyBhc3NlbWJseSkgZHJpdmUgdGhlaXIgb3duIHN1YmplY3RzLCBzbyBtZXJnZSBhbGwgdGhyZWUgaW50byBvbmUgc3RhYmxlIHN0cmVhbSB0aGUgaG9zdFxuICAvLyBzdWJzY3JpYmVzIHRvIG9uY2UuIChQcmV2aW91c2x5IGhhcmRjb2RlZCB0byBQbG90bHksIHNvIG5hcGFyaS9PU0QgcHJvZ3Jlc3MgbmV2ZXIgc2hvd2VkLilcbiAgaXNTdGFja0xvYWRpbmcoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5wbG90bHkuaXNTdGFja0xvYWRpbmcoKSxcbiAgICAgIHRoaXMub3NkLmlzU3RhY2tMb2FkaW5nKCksXG4gICAgICB0aGlzLm5hcGFyaS5pc1N0YWNrTG9hZGluZygpLFxuICAgIF0pLnBpcGUobWFwKChmbGFncykgPT4gZmxhZ3Muc29tZShCb29sZWFuKSkpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgLy8gUmVwb3J0IHRoZSBwcm9ncmVzcyBvZiB3aGljaGV2ZXIgYmFja2VuZCBpcyBBQ1RJVkVMWSBsb2FkaW5nIChtYXggYWNyb3NzIGFjdGl2ZSBvbmVzKS4gQSBwbGFpblxuICAgIC8vIG1lcmdlIGxldCBhbiBpZGxlIGJhY2tlbmQncyBzdGFsZSB2YWx1ZSB3aW4gdGhlIHN0cmVhbSBvbiBhIHJlLWxvYWQg4oCUIGxlYXZpbmcgdGhlIGJhciBiZWxvdyB0aGVcbiAgICAvLyBhY3RpdmUgYmFja2VuZCdzIHJlYWwgcHJvZ3Jlc3MgKGUuZy4gc3R1Y2sgfuKFkyB3aGlsZSB0aGUgJSByZWFkIDEwMCkuIEdhdGluZyBieSB0aGUgbG9hZGluZyBmbGFnXG4gICAgLy8gaWdub3JlcyBpZGxlIGJhY2tlbmRzLCBzbyB0aGUgYmFyIHRyYWNrcyB0aGUgb25lIGRvaW5nIHRoZSB3b3JrIGFuZCByZWFjaGVzIDEwMCUuXG4gICAgY29uc3QgdHJhY2sgPSAodjogSVZpZXdlckJhY2tlbmQpOiBPYnNlcnZhYmxlPFtudW1iZXIsIGJvb2xlYW5dPiA9PlxuICAgICAgY29tYmluZUxhdGVzdChbdi5nZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpLCB2LmlzU3RhY2tMb2FkaW5nKCldKTtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdHJhY2sodGhpcy5wbG90bHkpLCB0cmFjayh0aGlzLm9zZCksIHRyYWNrKHRoaXMubmFwYXJpKV0pLnBpcGUoXG4gICAgICBtYXAoKHBhaXJzKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHBhaXJzLmZpbHRlcigoWywgbG9hZGluZ10pID0+IGxvYWRpbmcpLm1hcCgoW3BdKSA9PiBwKTtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZS5sZW5ndGggPyBNYXRoLm1heCguLi5hY3RpdmUpIDogMDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbiAgLy8gRXZlcnkgYmFja2VuZCBmaXRzIHRvIHZpZXcgb24gaXRzIG93biAoUGxvdGx5J3MgYXV0b3NjYWxlLCBPU0QncyBnb0hvbWUsIG5hcGFyaSdzIGNhbWVyYVxuICAvLyBmaXQpIGFuZCBlYWNoIGVtaXRzIGZyb20gaXRzIG93biBzdWJqZWN0LCBzbyBtZXJnZSBhbGwgdGhyZWU6IGxpc3RlbmluZyB0byBQbG90bHkgYWxvbmVcbiAgLy8gbWlzc2VkIHRoZSBjb250ZXh0LW1lbnUgQXV0b3NjYWxlIG9uIHRoZSBJbWFnZSBhbmQgbmFwYXJpIHZpZXdzLlxuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICB0aGlzLnBsb3RseS5nZXRBdXRvc2NhbGVFdmVudCgpLFxuICAgICAgdGhpcy5vc2QuZ2V0QXV0b3NjYWxlRXZlbnQoKSxcbiAgICAgIHRoaXMubmFwYXJpLmdldEF1dG9zY2FsZUV2ZW50KCksXG4gICAgKS5waXBlKG1hcCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgfVxuICAvKiogVGhlIGxpbmUtUk9JIHByb2ZpbGVzOiBzYW1wbGVkIGJ5IHRoZSBiYWNrZW5kLW5ldXRyYWwgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UuICovXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5LmdldEludGVuc2l0eVByb2ZpbGUkKCk7XG4gIH1cbiAgLy8gVGhlIGludGVuc2l0eSBpbnNldCBpcyBhIFBsb3RseSBMSU5FIGNoYXJ0IOKAlCByZW5kZXIgaXQgdGhyb3VnaCBQbG90bHkgd2hpY2hldmVyXG4gIC8vIGJhY2tlbmQgZHJhd3MgdGhlIG1haW4gaW1hZ2UuXG4gIHJlbmRlckludGVuc2l0eUluc2V0KGRpdklkOiBzdHJpbmcsIHByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZCwgcHJvZmlsZXMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlZ2lvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFJlZ2lvbiBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyBldmVyeSByZWFkIGFuZCB3cml0ZSBnb2VzXG4gIC8vIHN0cmFpZ2h0IHRvIGl0LiBFdmVyeSBiYWNrZW5kIGRyYXdzIGZyb20gdGhlIHN0b3JlJ3MgZXZlbnRzOiB0aGUgT1NEIGFuZFxuICAvLyBuYXBhcmktanMgb3ZlcmxheXMgYW5kIFBsb3RseSdzIHNoYXBlIHByb2plY3Rpb24gcmVkcmF3IG9uIGl0cyByZWdpb24tdXBkYXRlXG4gIC8vIGFuZCBzZWxlY3Rpb24gc3RyZWFtcywgYW5kIHRoZSBjYW52YXMgdG9vbHMgcmVzZXQgb24gZ2V0UmVnaW9uU2V0UmVwbGFjZWQkXG4gIC8vICh1bmRvLCByZWRvLCBhIHNsaWNlIHN3aXRjaCkuXG4gIHNldFJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIGFwcGVuZD86IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zLCBzaG93UmVnaW9uTGFiZWwsIGlzUmVnaW9uU2F2ZU9uLCBmaWxsQ29sb3IsIGFwcGVuZCk7XG4gIH1cbiAgZ2V0UmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICB9XG4gIGdldFJlZ2lvblBvbHlnb25zKCk6IFBvbHlnb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uUG9seWdvbnMoKTtcbiAgfVxuICBnZXRSZWdpb25VcGRhdGVFdmVudCgpOiBPYnNlcnZhYmxlPFJlZ2lvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTtcbiAgfVxuICBzZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cbiAgc2VsZWN0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZWxlY3RSZWdpb24ocmVnaW9uKTtcbiAgfVxuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpO1xuICB9XG4gIGRlbGV0ZUFjdGl2ZVNoYXBlKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlQWN0aXZlU2hhcGUoKTtcbiAgfVxuICBnZXRTaG93U2hhcGVMYWJlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpO1xuICB9XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gIH1cbiAgZ2V0RmlsbENvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCk7XG4gIH1cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTtcbiAgfVxuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTtcbiAgfVxuICAvLyBBbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSAoYmFja2VuZC1uZXV0cmFsXG4gIC8vIHNlc3Npb24gc3RhdGUpLCBzbyByb3V0ZSBzdHJhaWdodCB0byBpdCByYXRoZXIgdGhhbiB0aHJvdWdoIHJlbmRlcmVyKCkuIChqaXQtdWkjNzApXG4gIGdldFByZXNldFNldCgpOiBQcmVzZXRTZXQge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFByZXNldFNldCgpO1xuICB9XG4gIGdldFByZXNldFNldCQoKTogT2JzZXJ2YWJsZTxQcmVzZXRTZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQkKCk7XG4gIH1cbiAgc2V0UHJlc2V0U2V0KHNldDogUHJlc2V0U2V0KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRQcmVzZXRTZXQoc2V0KTtcbiAgfVxuICB1cHNlcnRDbGFzcyhwcmVzZXQ6IENsYXNzUHJlc2V0KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS51cHNlcnRDbGFzcyhwcmVzZXQpO1xuICB9XG4gIHJlbW92ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucmVtb3ZlQ2xhc3MobmFtZSk7XG4gIH1cbiAgcmVzZXRQcmVzZXRzKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucmVzZXRQcmVzZXRzKCk7XG4gIH1cbiAgdW5kbygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnVuZG8oKTtcbiAgfVxuICByZWRvKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVkbygpO1xuICB9XG4gIGNhblVuZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuVW5kbygpO1xuICB9XG4gIGNhblJlZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuUmVkbygpO1xuICB9XG4gIGdldENhblVuZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblVuZG8kKCk7XG4gIH1cbiAgZ2V0Q2FuUmVkbyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0Q2FuUmVkbyQoKTtcbiAgfVxuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICB9XG4gIGltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cjogc3RyaW5nKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cik7XG4gIH1cbiAgLyoqIERvd25sb2FkIGByZWdpb25zYCBhcyBHZW9KU09OLCBuYW1lZCBhZnRlciB0aGUgaW1hZ2UgbGFzdCBwbG90dGVkLiAqL1xuICBleHBvcnRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5leHBvcnRSZWdpb25zKHJlZ2lvbnMsIHRoaXMucGxvdHRlZEZpbGVOYW1lKTtcbiAgfVxuICBnZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnM6IFJlZ2lvbltdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnMpO1xuICB9XG5cbiAgLyoqIEhvbGQgYSBsYXJnZSByZWdpb24gc2V0IGFzIGEgdGlsZWQgcmVnaW9uIHNvdXJjZSAoc2VlIFJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZSkuICovXG4gIGF0dGFjaFJlZ2lvblNvdXJjZShzb3VyY2U6IFJlZ2lvblNvdXJjZSB8IFJlZ2lvblNvdXJjZU9wZW5lciwgc2xpY2VzPzogUmVnaW9uU291cmNlU2xpY2VzKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2Uoc291cmNlLCBzbGljZXMpO1xuICB9XG4gIGFzeW5jIGltcG9ydFJlZ2lvblNvdXJjZShnZW9Kc29uU3RyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZ2VvSnNvblN0ci5sZW5ndGggPCAodGhpcy5jb25maWc/LnJlZ2lvblNvdXJjZU1pbkNoYXJzID8/IFJFR0lPTl9TT1VSQ0VfTUlOX0NIQVJTKSkgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBvcGVuZWQ6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBhd2FpdCBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZShnZW9Kc29uU3RyKTtcbiAgICAvLyBUaGUgZmlyc3Qgb3BlbiBpcyB0aGUgb25lIGp1c3QgbWFkZTsgYSBzb3VyY2UgY2xvc2VkIHRvIHNhdmUgbWVtb3J5IHBhcnNlcyBhZ2Fpbi5cbiAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZSgoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBvcGVuZWQ7XG4gICAgICBvcGVuZWQgPSBudWxsO1xuICAgICAgcmV0dXJuIHNvdXJjZSA/IFByb21pc2UucmVzb2x2ZShzb3VyY2UpIDogb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoZ2VvSnNvblN0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZHJvcFJlZ2lvblNvdXJjZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5kcm9wU2xpY2VSZWdpb25Tb3VyY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRpY2tldCBmb3IgYSByZWdpb24gaW1wb3J0IHRoYXQgaXMgYWJvdXQgdG8gcmVhZCBvciBkZWNvZGUgaXRzIGZpbGVzOiB0aGUgaW1wb3J0IG1ldGhvZHNcbiAgICogZ2l2ZW4gaXQgY2hhbmdlIG5vdGhpbmcgb25jZSBpdCBpcyBzdGFsZSDigJQgYW5vdGhlciBpbXBvcnQgdG9vayBhIHRpY2tldCBzaW5jZSwgYW5vdGhlciBpbWFnZVxuICAgKiB3YXMgcGxvdHRlZCwgb3IgdGhlIHNlcnZpY2Ugd2FzIGRlc3Ryb3llZCDigJQgc28gYW4gaW1wb3J0IHRoYXQgZmluaXNoZXMgbGF0ZSBuZXZlciBsYW5kcyBvbiBhblxuICAgKiBpbWFnZSBpdCB3YXMgbm90IHN0YXJ0ZWQgZm9yLlxuICAgKi9cbiAgcmVnaW9uSW1wb3J0VGlja2V0KCk6IG51bWJlciB7XG4gICAgdGhpcy5pbXBvcnRUaWNrZXQgPSB7IGlkOiB0aGlzLmltcG9ydFRpY2tldC5pZCArIDEsIGltYWdlOiB0aGlzLmltcG9ydEltYWdlS2V5KCkgfTtcbiAgICByZXR1cm4gdGhpcy5pbXBvcnRUaWNrZXQuaWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgdGlja2V0YCBpcyBzdGlsbCB0aGUgY3VycmVudCBpbXBvcnQncywgb24gdGhlIGltYWdlIGl0IHdhcyB0YWtlbiBmb3IuICovXG4gIHByaXZhdGUgaW1wb3J0VGlja2V0VmFsaWQodGlja2V0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGlja2V0ID09PSB0aGlzLmltcG9ydFRpY2tldC5pZCAmJiB0aGlzLmltcG9ydFRpY2tldC5pbWFnZSA9PT0gdGhpcy5pbXBvcnRJbWFnZUtleSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbXBvcnRJbWFnZUtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBSZWdpb25TY29wZUNhY2hlLmltYWdlS2V5KHRoaXMucGxvdHRlZEluZm8gPz8gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYW5kIHJlZ2lvbiBzb3VyY2VzIHdpdGggb25lIHNvdXJjZSBwZXIgc2xpY2UsIGFzIGFuIGltcG9ydGVkIGxhYmVsXG4gICAqIHZvbHVtZSBvciBmb2xkZXIgb2YgcGVyLXNsaWNlIHJlZ2lvbiBmaWxlcyBnaXZlcyB0aGVtOiBgb3BlbmVyc2AgYnkgc2xpY2UgaW5kZXgsIGVhY2ggb3BlbmVkXG4gICAqIHRoZSBmaXJzdCB0aW1lIGl0cyBzbGljZSBpcyBzaG93bi4gQSBzaW5nbGUgaW1hZ2UgdGFrZXMgc2xpY2UgMCdzLiBSZXR1cm5zIGhvdyBtYW55IHNsaWNlc1xuICAgKiBoYXZlIGEgc291cmNlLCBvciBudWxsIChjaGFuZ2luZyBub3RoaW5nKSB3aGVuIGB0aWNrZXRgIGlzIHN0YWxlIChzZWVcbiAgICoge0BsaW5rIHJlZ2lvbkltcG9ydFRpY2tldH0pLiBUaGUgc291cmNlcyBhcmUgbWFya2VkIGltcG9ydGVkLCBzbyBhIHNhdmUgd3JpdGVzIGV2ZXJ5IHNsaWNlLlxuICAgKi9cbiAgaW1wb3J0U2xpY2VSZWdpb25Tb3VyY2VzKG9wZW5lcnM6IFJlYWRvbmx5TWFwPG51bWJlciwgUmVnaW9uU291cmNlT3BlbmVyPiwgdGlja2V0PzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKHRpY2tldCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmltcG9ydFRpY2tldFZhbGlkKHRpY2tldCkpIHJldHVybiBudWxsO1xuICAgIHRoaXMucmVnaW9uSW1wb3J0VGlja2V0KCk7IC8vIHN1cGVyc2VkZXMgYW55IGltcG9ydCBzdGlsbCBpbiBmbGlnaHRcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRldGFjaFJlZ2lvblNvdXJjZXMoKTtcbiAgICBpZiAoIWluZm8/LmlzU3RhY2spIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gb3BlbmVycy5nZXQoMCkgPz8gb3BlbmVycy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMoW10pO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgICBpZiAoIWZpcnN0KSByZXR1cm4gMDtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKGZpcnN0LCB7IHNsaWNlOiAwIH0sIHRydWUpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHRoaXMuZW50ZXJJbXBvcnRlZFN0YWNrKGluZm8pO1xuICAgIGZvciAoY29uc3QgW3osIG9wZW5dIG9mIG9wZW5lcnMpIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKG9wZW4sIHsgc2xpY2U6IHogfSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG9wZW5lcnMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYW5kIHJlZ2lvbiBzb3VyY2VzIHdpdGggb25lIGltcG9ydGVkIHNvdXJjZSAoYSByZWdpb24gc2V0IHRoZVxuICAgKiBob3N0J3Mgc2VydmVyIHNlcnZlcyk6IG92ZXIgZXZlcnkgc2xpY2Ugb2YgYSBzdGFjayB3aGVuIGl0IGlzIHotaW5kZXhlZCwgZWxzZSBvbiB0aGUgc2xpY2VcbiAgICogc2hvd24sIGFzIHtAbGluayBhcHBseUltYWdlUm9pc30gbGF5cyBvdXQgYW4gaW1hZ2UncyBvd24uIFJlc29sdmVzIGZhbHNlLCBjaGFuZ2luZyBub3RoaW5nXG4gICAqIChhbmQgZGlzcG9zaW5nIHRoZSBzb3VyY2UpLCB3aGVuIHRoZSBpbXBvcnQgd2VudCBzdGFsZSB3aGlsZSBpdCBvcGVuZWQ6IGFub3RoZXIgaW1wb3J0LCBvclxuICAgKiBhbm90aGVyIGltYWdlIChzZWUge0BsaW5rIHJlZ2lvbkltcG9ydFRpY2tldH07IG9uZSBpcyB0YWtlbiBoZXJlIHdoZW4gYHRpY2tldGAgaXMgbm90IGdpdmVuKS5cbiAgICovXG4gIGFzeW5jIGltcG9ydFJlZ2lvblNvdXJjZU9wZW5lcihvcGVuOiBSZWdpb25Tb3VyY2VPcGVuZXIsIHRpY2tldD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG1pbmUgPSB0aWNrZXQgPz8gdGhpcy5yZWdpb25JbXBvcnRUaWNrZXQoKTtcbiAgICBpZiAoIXRoaXMuaW1wb3J0VGlja2V0VmFsaWQobWluZSkpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZmlyc3Q6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBhd2FpdCBvcGVuKCk7XG4gICAgaWYgKCF0aGlzLmltcG9ydFRpY2tldFZhbGlkKG1pbmUpKSB7XG4gICAgICBmaXJzdC5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJldXNlOiBSZWdpb25Tb3VyY2VPcGVuZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBmaXJzdDtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW4oKTtcbiAgICB9O1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnBsb3R0ZWRJbmZvO1xuICAgIGNvbnN0IHBsYW5lcyA9IGZpcnN0LmluZm8ucGxhbmVzO1xuICAgIGNvbnN0IHpJbmRleGVkID0gISFpbmZvPy5pc1N0YWNrICYmIHBsYW5lcy5zb21lKChwKSA9PiBwICE9PSAwKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRldGFjaFJlZ2lvblNvdXJjZXMoKTtcbiAgICBpZiAoekluZGV4ZWQpIHtcbiAgICAgIHRoaXMuZW50ZXJJbXBvcnRlZFN0YWNrKGluZm8gYXMgSUltYWdlSW5mbyk7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShyZXVzZSwgJ3BsYW5lcycsIFsuLi5wbGFuZXNdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMoW10pO1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHJldXNlLCB7IHNsaWNlOiB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpIH0sIHRydWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEVtcHR5IGV2ZXJ5IHNsaWNlIG9mIGEgc3RhY2sgKGl0cyByZWdpb25zIGFuZCB1bmRvIGhpc3RvcnkpIGZvciByZWdpb25zIGltcG9ydGVkIG92ZXIgaXQuICovXG4gIHByaXZhdGUgZW50ZXJJbXBvcnRlZFN0YWNrKGluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLnJlZ2lvblN0b3JlLmlzU3RhY2tNb2RlKClcbiAgICAgID8gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVMYXlvdXQoKVxuICAgICAgOiBpbmZvLnRpbGVkID09PSBmYWxzZVxuICAgICAgICA/ICdwZXItc2xpY2UtZmlsZSdcbiAgICAgICAgOiAnY29tYmluZWQnO1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUobmV3IE1hcCgpLCB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpLCBsYXlvdXQpO1xuICB9XG4gIGdldFJlZ2lvblNvdXJjZVZpZXckKCk6IE9ic2VydmFibGU8UmVnaW9uU291cmNlVmlldyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3JCgpO1xuICB9XG4gIGdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5OiBPbWl0PFJlZ2lvbkluZGV4UXVlcnksICdleGNsdWRlJz4pOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5KTtcbiAgfVxuICBzZWxlY3RTb3VyY2VGZWF0dXJlcyhpZHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBhZGRpdGl2ZT86IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzLCBhZGRpdGl2ZSk7XG4gIH1cbiAgZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzKTtcbiAgfVxuICBnZXRSZWdpb25TdHlsZSQoKTogT2JzZXJ2YWJsZTxSZWdpb25TdHlsZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblN0eWxlJCgpO1xuICB9XG4gIHNldFJlZ2lvblN0eWxlKHBhdGNoOiBQYXJ0aWFsPFJlZ2lvblN0eWxlPik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9uU3R5bGUocGF0Y2gpO1xuICB9XG4gIC8vIOKUgOKUgCBSZWdpb25zIGluIDNEOiB0aGVpciByZWNvbnN0cnVjdGlvbnMgc2hvd24gaW4gdGhlIHZvbHVtZSB2aWV3IOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZWNvbXB1dGUgd2hpY2ggM0QgdmlldyBpcyBvbiBzY3JlZW4gZm9yIGBwbG90VHlwZWAgKHNlZSB7QGxpbmsgdm9sdW1lVmlldyR9KS4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVWb2x1bWVWaWV3KHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VWb2x1bWVWaWV3ID0gaXNOYXBhcmlWb2x1bWUocGxvdFR5cGUpIHx8IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSk7XG4gICAgY29uc3QgcmVnaW9uczNkID0gdGhpcy5pbWFnZVZvbHVtZVZpZXcgfHwgKGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpICYmICEhdGhpcy5wbG90dGVkSW5mbz8uaXNTdGFjayk7XG4gICAgLy8gRXZlcnkgcGxvdCwgYXMgYmVmb3JlOiB0aGUgUmVnaW9uIEVkaXRvciBkcm9wcyBpdHMgcGVyLWNsYXNzIHZvbHVtZXMgb24gZWFjaCAoYSBuZXcgaW1hZ2UpLlxuICAgIHRoaXMudm9sdW1lVmlldyQubmV4dChyZWdpb25zM2QpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYSBuYXBhcmkgdm9sdW1lIChvciBpc29zdXJmYWNlKSB2aWV3IGlzIG9uIHNjcmVlbjogcmVnaW9ucyBjYW4gYmUgc2hvd24gaW4gM0QuICovXG4gIGdldFZvbHVtZVZpZXckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnZvbHVtZVZpZXckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3J3Mgc2xpY2UgcGFuZSBpcyB3YW50ZWQgKGl0IHNob3dzIHdoaWxlIGEgdm9sdW1lIHZpZXcgaXMgb24gc2NyZWVuKS4gKi9cbiAgZ2V0U2xpY2VFZGl0b3IkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnNsaWNlRWRpdG9yJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB2b2x1bWUgdmlldyBkcmF3cyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUuICovXG4gIGdldFJlZ2lvbnNUaHJvdWdoVm9sdW1lJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUgKGl0IGhpZGVzIG5vbmUgb2YgdGhlbTogc3VyZmFjZXMgaW5zaWRlIGl0c1xuICAgKiBicmlnaHQgc3RydWN0dXJlcywgYW4gT0NUJ3MgbGF5ZXIgYm91bmRhcmllcykgb3IgaGlkZGVuIGJlaGluZCB3aGF0IGl0IHNob3dzICh0aGUgZGVmYXVsdCkuXG4gICAqL1xuICBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUkLnZhbHVlID09PSB0aHJvdWdoKSByZXR1cm47XG4gICAgdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQubmV4dCh0aHJvdWdoKTtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoKTtcbiAgfVxuXG4gIC8qKiBUaGUgY2xhc3MgZ3JvdXBzIHNob3duIGluIDNEIG9uIHRoaXMgaW1hZ2UgKFtdIGFmdGVyIGEgc3dpdGNoIHRvIGFub3RoZXIgaW1hZ2UpLiAqL1xuICBnZXRSZWdpb25DbGFzc2VzM2QkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9Pj4ge1xuICAgIHJldHVybiB0aGlzLmNsYXNzZXMzZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogSGlkZSBldmVyeSByZWdpb24gc3VyZmFjZSBhbmQgZm9yZ2V0IHRoZW0gKGEgYnVpbGQgc3RpbGwgcnVubmluZyBpcyBkcm9wcGVkKS4gKi9cbiAgcHJpdmF0ZSBjbGVhclJlZ2lvbkNsYXNzZXMzZCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lc2hSZXF1ZXN0Kys7XG4gICAgdGhpcy5zaG93bjNkID0gW107XG4gICAgdGhpcy5jbGFzc2VzM2QkLm5leHQoW10pO1xuICAgIHRoaXMuY2xhc3NlczNkSW1hZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uTWVzaGVzKFtdLCB1bmRlZmluZWQpO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbkhpZ2hsaWdodChbXSk7XG4gIH1cblxuICAvKiogSGlnaGxpZ2h0IHRoZSBzdXJmYWNlcyBvZiB0aGVzZSBncm91cCBrZXlzIGluIHRoZSB2b2x1bWUgdmlldyAobm9uZTogYWxsIGFzIHVzdWFsKS4gKi9cbiAgaGlnaGxpZ2h0UmVnaW9uQ2xhc3NlczNkKGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uSGlnaGxpZ2h0KGtleXMpO1xuICB9XG5cbiAgLyoqIEEgc3VyZmFjZSBjbGlja2VkIGluIHRoZSB2b2x1bWUgdmlldyB3aXRoIHRoZSBzZWxlY3Rpb24gdG9vbCAoaXRzIGdyb3VwIGtleSksIG9yIG5vbmUgKG51bGwpLiAqL1xuICBnZXRSZWdpb25QaWNrZWQzZCQoKTogT2JzZXJ2YWJsZTx7IGtleTogc3RyaW5nIHwgbnVsbDsgYWRkaXRpdmU6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm5hcGFyaS5nZXRSZWdpb25NZXNoUGljayQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZXNlIGdyb3VwcyBvZiBjbGFzc2VzIGluIHRoZSB2b2x1bWUgdmlldyBhcyAzRCByZWNvbnN0cnVjdGlvbnMgKGVhY2ggZ3JvdXAgb25lIHN1cmZhY2VcbiAgICogaW4gaXRzIGNvbG91cjogYW4gYXRsYXMgc3RydWN0dXJlIHdpdGggaXRzIHN1YnN0cnVjdHVyZXMpLCBhbmQgb25seSB0aGVzZTsgW10gaGlkZXMgdGhlbS5cbiAgICogUmVjb25zdHJ1Y3RlZCBmcm9tIGV2ZXJ5IHNsaWNlJ3Mgb3V0bGluZXMgYXQgdGhlIHZvbHVtZSdzIHJlc29sdXRpb24sIGNhY2hlZCBwZXIgaW1hZ2UuXG4gICAqL1xuICBhc3luYyBzaG93UmVnaW9uQ2xhc3NlczNkKFxuICAgIGdyb3VwczogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSArK3RoaXMubWVzaFJlcXVlc3Q7XG4gICAgdGhpcy5jbGFzc2VzM2RJbWFnZSA9IHRoaXMucGxvdHRlZEZpbGVOYW1lO1xuICAgIHRoaXMuc2hvd24zZCA9IGdyb3VwcztcbiAgICAvLyBXaGF0IGFuIGVkaXQgZnJvbSBub3cgb24gaXMgY29tcGFyZWQgd2l0aCAodGhlIGxpdmUgc2xpY2UgbWF5IG5vdCBoYXZlIGNoYW5nZWQgeWV0KS5cbiAgICB0aGlzLmxpdmVDbGFzc2VzID0gbnVsbDtcbiAgICB0aGlzLnRyYWNrTGl2ZUNsYXNzZXMoKTtcbiAgICB0aGlzLmNsYXNzZXMzZCQubmV4dChncm91cHMubWFwKChnKSA9PiAoeyBrZXk6IGcua2V5LCBjbGFzc2VzOiBnLmNsYXNzZXMgfSkpKTtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpPy53aWR0aCA/PyAxMDI0O1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLm5hcGFyaS5yZWdpb25Wb3hlbFN0ZXAoKSA/PyBNYXRoLm1heCgxLCB3aWR0aCAvIDI1Nik7XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnBsb3R0ZWRGaWxlTmFtZSA/PyAnJztcbiAgICBjb25zdCBjYWNoZUtleSA9IChnOiB7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0pID0+IGAke2ltYWdlfXwke3N0ZXAudG9GaXhlZCgzKX18JHtnLmNsYXNzZXMuam9pbignLCcpfWA7XG4gICAgY29uc3QgbWlzc2luZyA9IGdyb3Vwcy5maWx0ZXIoKGcpID0+ICF0aGlzLm1lc2hDYWNoZS5oYXMoY2FjaGVLZXkoZykpKTtcbiAgICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gbWlzc2luZy5tYXAoKGcpID0+IGcua2V5KTtcbiAgICAgIGNvbnN0IHdoYXQgPSBuYW1lcy5sZW5ndGggPiAzID8gYCR7bmFtZXMubGVuZ3RofSByZWdpb25zYCA6IG5hbWVzLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBkb25lID0gdGhpcy5uYXBhcmkuYmVnaW5UYXNrKGBCdWlsZGluZyAke3doYXR9IGluIDNE4oCmYCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBidWlsdCA9IGF3YWl0IHRoaXMucmVnaW9uU3RvcmUucmVjb25zdHJ1Y3RDbGFzc2VzKFxuICAgICAgICAgIG1pc3NpbmcubWFwKChnKSA9PiAoeyBrZXk6IGNhY2hlS2V5KGcpLCBjbGFzc2VzOiBnLmNsYXNzZXMgfSkpLFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNsYXNzZXNPZiA9IG5ldyBNYXAobWlzc2luZy5tYXAoKGcpID0+IFtjYWNoZUtleShnKSwgZy5jbGFzc2VzXSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGIgb2YgYnVpbHQpIHRoaXMubWVzaENhY2hlLnNldChiLmtleSwgeyBtZXNoOiBiLm1lc2gsIGNsYXNzZXM6IGNsYXNzZXNPZi5nZXQoYi5rZXkpID8/IFtdIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy5tZXNoUmVxdWVzdCkgcmV0dXJuO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbk1lc2hlcyhcbiAgICAgIGdyb3Vwcy5tYXAoKGcpID0+IHtcbiAgICAgICAgY29uc3QgbWVzaCA9IHRoaXMubWVzaENhY2hlLmdldChjYWNoZUtleShnKSkhLm1lc2g7XG4gICAgICAgIHJldHVybiB7IGtleTogZy5rZXksIGNvbG9yOiBnLmNvbG9yLCBsYWJlbDogZy5sYWJlbCwgdmVydGljZXM6IG1lc2gudmVydGljZXMsIGZhY2VzOiBtZXNoLmZhY2VzIH07XG4gICAgICB9KSxcbiAgICAgIHRoaXMucGxvdHRlZEZpbGVOYW1lLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZ2lvbnMgY2hhbmdlZDogd2hlbiB0aGUgbGl2ZSBzbGljZSdzIHJlZ2lvbnMgb2Ygc29tZSBjbGFzc2VzIGRpZCAoYW4gZWRpdCwgYW4gdW5kbywgbm90XG4gICAqIGEgc2xpY2Ugb3IgaW1hZ2Ugc3dpdGNoKSwgdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIGFyZSBzdGFsZS4gVGhleSBhcmUgZHJvcHBlZCwgYW5kIHRob3NlIHNob3duXG4gICAqIGluIDNEIGFyZSByZWJ1aWx0IG9uY2UgdGhlIGVkaXRzIHBhdXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJlZ2lvbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgZm9sbG93cyB0aGUgZWRpdHMgKG5vIHN1cmZhY2UgYnVpbHQgb3Igc2hvd24sIG5vIHNlY3Rpb25zKTogc2tpcCB0aGUgZmluZ2VycHJpbnRzLlxuICAgIGlmICghdGhpcy5zbGljZU1vdW50ZWQgJiYgIXRoaXMuc2hvd24zZC5sZW5ndGggJiYgIXRoaXMubWVzaENhY2hlLnNpemUpIHtcbiAgICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLmxpdmVDbGFzc2VzO1xuICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgIGNvbnN0IG5vdyA9IHRoaXMudHJhY2tMaXZlQ2xhc3NlcygpO1xuICAgIC8vIEFub3RoZXIgc2xpY2Ugb3IgaW1hZ2UgY2FtZSB1cDogbm8gcmVnaW9uIGNoYW5nZWQgKHRoZSBzZWN0aW9ucyByZWN1dCBmb3IgdGhlIHNsaWNlKS5cbiAgICBpZiAoIWJlZm9yZSB8fCBiZWZvcmUuYXQgIT09IG5vdy5hdCkgcmV0dXJuO1xuICAgIGNvbnN0IGNoYW5nZWQgPSBjaGFuZ2VkQ2xhc3NlcyhiZWZvcmUuc2lnbmF0dXJlcywgbm93LnNpZ25hdHVyZXMpO1xuICAgIC8vIFNvdXJjZSBmZWF0dXJlcyBkZWxldGVkIChvciB0aGF0IHVuZG9uZSkgY2hhbmdlIG5vIGxpdmUgcmVnaW9uLCBhbmQgd2hpY2ggY2xhc3NlcyB0aGV5IHdlcmVcbiAgICAvLyBpcyBub3Qga25vd24gaGVyZTogZXZlcnkgY2xhc3MgaXMgc3RhbGUuIEEgZmVhdHVyZSB0YWtlbiBzaG93cyBhcyBpdHMgY2xhc3MncyBjaGFuZ2UuXG4gICAgY29uc3QgZXZlcnlDbGFzcyA9ICFjaGFuZ2VkLnNpemUgJiYgYmVmb3JlLnNvdXJjZXMgIT09IG5vdy5zb3VyY2VzO1xuICAgIGlmICghY2hhbmdlZC5zaXplICYmICFldmVyeUNsYXNzKSByZXR1cm47XG4gICAgY29uc3QgdG91Y2hlZCA9IChjOiBzdHJpbmcpID0+IGV2ZXJ5Q2xhc3MgfHwgY2hhbmdlZC5oYXMoYyk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB0aGlzLnNlY3Rpb25zLnJlZ2lvbnNDaGFuZ2VkKCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgWy4uLnRoaXMubWVzaENhY2hlXSkge1xuICAgICAgaWYgKGVudHJ5LmNsYXNzZXMuc29tZSh0b3VjaGVkKSkgdGhpcy5tZXNoQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zaG93bjNkLnNvbWUoKGcpID0+IGcuY2xhc3Nlcy5zb21lKHRvdWNoZWQpKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYnVpbGRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucmVidWlsZFRpbWVyKTtcbiAgICB0aGlzLnJlYnVpbGRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWJ1aWxkVGltZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuc2hvd24zZC5sZW5ndGggJiYgdGhpcy5jbGFzc2VzM2RJbWFnZSA9PT0gdGhpcy5wbG90dGVkRmlsZU5hbWUpIHtcbiAgICAgICAgdm9pZCB0aGlzLnNob3dSZWdpb25DbGFzc2VzM2QodGhpcy5zaG93bjNkKTtcbiAgICAgIH1cbiAgICB9LCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TKTtcbiAgfVxuXG4gIC8qKiBGaW5nZXJwcmludCB0aGUgbGl2ZSBzbGljZSdzIGNsYXNzZXMsIHVubGVzcyBhbHJlYWR5OiB3aGF0IHRoZSBuZXh0IGVkaXQgaXMgY29tcGFyZWQgd2l0aC4gKi9cbiAgcHJpdmF0ZSB0cmFja0xpdmVDbGFzc2VzKCk6IHsgYXQ6IHN0cmluZzsgc2lnbmF0dXJlczogTWFwPHN0cmluZywgbnVtYmVyPjsgc291cmNlczogc3RyaW5nIH0ge1xuICAgIHRoaXMubGl2ZUNsYXNzZXMgPz89IHtcbiAgICAgIGF0OiB0aGlzLmxpdmVTbGljZUtleSgpLFxuICAgICAgc2lnbmF0dXJlczogY2xhc3NTaWduYXR1cmVzKHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKSxcbiAgICAgIHNvdXJjZXM6IHRoaXMucmVnaW9uU3RvcmUuZ2V0U291cmNlU3RhdGVLZXkoKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmxpdmVDbGFzc2VzO1xuICB9XG5cbiAgLyoqIFdoaWNoIHNsaWNlIG9mIHdoaWNoIGltYWdlIHRoZSBsaXZlIHJlZ2lvbnMgYXJlLiAqL1xuICBwcml2YXRlIGxpdmVTbGljZUtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpfVxcbiR7dGhpcy5wbG90dGVkRmlsZU5hbWUgPz8gJyd9YDtcbiAgfVxuXG4gIC8qKiBFYWNoIGNsYXNzJ3Mgdm9sdW1lIG92ZXIgdGhlIHdob2xlIHN0YWNrLCBpbiBweMKyIMOXIHNsaWNlcyAoc2VlIFJlZ2lvblN0b3JlLmNsYXNzVm9sdW1lcykuICovXG4gIGFzeW5jIGdldENsYXNzVm9sdW1lcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoYXdhaXQgdGhpcy5yZWdpb25TdG9yZS5jbGFzc1ZvbHVtZXMoY2xhc3NlcykpO1xuICB9XG5cbiAgZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2s/OiBib29sZWFuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2spO1xuICB9XG4gIGdldEhpZGRlbkNsYXNzZXMkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlTZXQ8c3RyaW5nPj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEhpZGRlbkNsYXNzZXMkKCk7XG4gIH1cbiAgc2V0Q2xhc3Nlc0hpZGRlbihjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSwgaGlkZGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXMsIGhpZGRlbik7XG4gICAgLy8gQSBzdXJmYWNlIGlzIGl0cyBjbGFzcydzIChpdHMgZ3JvdXAga2V5IGlzIHRoZSBjbGFzcyBuYW1lKS5cbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25IaWRkZW4oWy4uLnRoaXMucmVnaW9uU3RvcmUuZ2V0SGlkZGVuQ2xhc3NlcygpXSk7XG4gICAgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICB9XG4gIGFzeW5jIHNlbGVjdFJlZ2lvbkNsYXNzZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGFkZGl0aXZlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0Q2xhc3NlcyhjbGFzc2VzLCBhZGRpdGl2ZSk7XG4gIH1cbiAgZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyQoKTogT2JzZXJ2YWJsZTxyZWFkb25seSBzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMkKCk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZ1dpdGhTb3VyY2UocmVnaW9uczogUmVnaW9uW10sIHNsaWNlPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRHZW9Kc29uV2l0aFNvdXJjZShyZWdpb25zLCBzbGljZSk7XG4gIH1cblxuICAvLyDilIDilIAgUGVyLXNsaWNlIHotc3RhY2sgcmVnaW9ucyAoaml0LXVpIzkzKSwgZnJvbSB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLiDilIDilIBcbiAgZW50ZXJTdGFja01vZGUoXG4gICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKHNsaWNlcywgaW5pdGlhbFosIHNhdmVMYXlvdXQpO1xuICB9XG4gIGV4aXRTdGFja01vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5leGl0U3RhY2tNb2RlKCk7XG4gIH1cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuaXNTdGFja01vZGUoKTtcbiAgfVxuICAvKiogVGhlIHNsaWNlIHRoZSByZWdpb25zIGFyZSBzaG93biBmb3IgKHJlY29yZGVkIG91dHNpZGUgc3RhY2sgbW9kZSB0b28pLiAqL1xuICBnZXREaXNwbGF5U2xpY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKTtcbiAgfVxuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZUxheW91dCgpO1xuICB9XG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldERpc3BsYXlTbGljZSh6KTtcbiAgfVxuICBnZXRTbGljZVJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNsaWNlUmVnaW9ucygpO1xuICB9XG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZVNsaWNlcygpO1xuICB9XG4gIC8qKiBBbGwgc2xpY2VzJyBBTk5PVEFUSU9OIHJlZ2lvbnMgZm9yIGEgei1zdGFjayBzYXZlIChqaXQtdWkjOTMpLCBlYWNoIHRhZ2dlZFxuICAgKiAgd2l0aCBpdHMgemVyby1iYXNlZCBSZWdpb24uejsgcHJvZmlsZSBsaW5lcyBleGNsdWRlZC4gRmxhdCBhbm5vdGF0aW9uIHNldFxuICAgKiAgb3V0c2lkZSBzdGFjayBtb2RlLiAqL1xuICBnZXRTbGljZUFubm90YXRpb25SZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTbGljZVJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICB9XG4gIC8qKiBQZXItc2xpY2UgYW5ub3RhdGlvbiByZWdpb25zIHRvIHdyaXRlIG9uIGEgZm9sZGVyLXN0YWNrIHNhdmUgKGppdC11aSM5Myk6XG4gICAqICBzbGljZSBpbmRleCDihpIgdGhhdCBzbGljZSdzIGFubm90YXRpb24gcmVnaW9ucyAocHJvZmlsZSBsaW5lcyBleGNsdWRlZCksXG4gICAqICBpbmNsdWRpbmcgbm93LWVtcHR5IHNsaWNlcyB0aGF0IHdlcmUgbG9hZGVkIG5vbi1lbXB0eSAoc28gdGhleSBvdmVyd3JpdGUpLiAqL1xuICBnZXRTdGFja1NhdmVBbm5vdGF0aW9uU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlU2xpY2VzKCkpIHtcbiAgICAgIG91dC5zZXQoXG4gICAgICAgIHosXG4gICAgICAgIHJlZ3MuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogQXV0aG9yaXRhdGl2ZSBmdWxsLXJlc29sdXRpb24gaW1hZ2Ugc2l6ZSBmb3IgbWFzayBleHBvcnQuIFByZWZlcnMgdGhlXG4gICAqICBhY3RpdmUgcmVuZGVyZXIncyByZXBvcnRlZCBzaXplLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGltYWdlIG1ldGFkYXRhICh4L3lcbiAgICogIGFyZSB0aGUgZnVsbC1yZXMgcGl4ZWwgZGltZW5zaW9ucyB1c2VkIGFjcm9zcyB0aGUgYXBwKS4gUmVqZWN0cyBub24tZmluaXRlXG4gICAqICBvciBub24tcG9zaXRpdmUgc2l6ZXMg4oCUIHRoZSBQbG90bHkgYm91bmRzIGNhbiB5aWVsZCBOYU4gYmVmb3JlIGEgcGxvdCBpc1xuICAgKiAgZnVsbHkgbGFpZCBvdXQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBjcmFzaCBtYXNrIGNyZWF0aW9uLiAqL1xuICBnZXRNYXNrSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZhbGlkID0gKHM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgfCB1bmRlZmluZWQpID0+XG4gICAgICBzICYmIE51bWJlci5pc0Zpbml0ZShzLndpZHRoKSAmJiBOdW1iZXIuaXNGaW5pdGUocy5oZWlnaHQpICYmIHMud2lkdGggPj0gMSAmJiBzLmhlaWdodCA+PSAxXG4gICAgICAgID8geyB3aWR0aDogTWF0aC5yb3VuZChzLndpZHRoKSwgaGVpZ2h0OiBNYXRoLnJvdW5kKHMuaGVpZ2h0KSB9XG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IGZyb21SZW5kZXJlciA9IHZhbGlkKHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpKTtcbiAgICBpZiAoZnJvbVJlbmRlcmVyKSByZXR1cm4gZnJvbVJlbmRlcmVyO1xuXG4gICAgbGV0IG1ldGE6IElJbWFnZU1ldGFkYXRhW10gPSBbXTtcbiAgICB0aGlzLmdldEltYWdlTWV0YSgpXG4gICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWV0YSA9IG0pKVxuICAgICAgLnVuc3Vic2NyaWJlKCk7XG4gICAgY29uc3QgbTAgPSBtZXRhPy5bMF07XG4gICAgcmV0dXJuIG0wID8gdmFsaWQoeyB3aWR0aDogbTAueCwgaGVpZ2h0OiBtMC55IH0pIDogbnVsbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uRWRpdG9yQXBpOiBhbm5vdGF0aW9uLW9ubHkgc3VyZmFjZSBmb3IgdGhlIFJlZ2lvbiBFZGl0b3Ig4pSA4pSA4pSAXG4gIC8vIEludGVuc2l0eS1wcm9maWxlIGxpbmVzIChraW5kPSdwcm9maWxlJykgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90XG4gIC8vIHRoZSBlZGl0b3IuIFRoZXNlIG1ldGhvZHMgZ2l2ZSBleHRlcm5hbCBjb25zdW1lcnMgYW4gYW5ub3RhdGlvbi1vbmx5IHZpZXdcbiAgLy8gYW5kIGd1YXJhbnRlZSBwcm9maWxlIGxpbmVzIGFyZSBwcmVzZXJ2ZWQuIFRoZSB3cml0ZXMgbGFuZCBpbiB0aGUgc3RvcmUgbGlrZVxuICAvLyBhbnkgb3RoZXIsIGFuZCBldmVyeSBiYWNrZW5kIHJlZHJhd3MgZnJvbSBpdHMgZXZlbnRzLlxuXG4gIGdldEFubm90YXRpb25SZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgfVxuICBzZXRBbm5vdGF0aW9uUmVnaW9ucyhcbiAgICByZWdpb25zOiBSZWdpb25bXSxcbiAgICBzaG93UmVnaW9uTGFiZWw/OiBib29sZWFuLFxuICAgIGlzUmVnaW9uU2F2ZU9uPzogYm9vbGVhbixcbiAgICBmaWxsQ29sb3I/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIFJlLWFwcGVuZCB0aGUgc3RvcmUncyBwcm9maWxlIGxpbmVzIHNvIGFuIGVkaXRvciBzYXZlL2RlbGV0ZSBjYW4ndCBkcm9wIHRoZW0uXG4gICAgY29uc3QgcHJvZmlsZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+IGlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSAocmVnaW9ucyB8fCBbXSkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICB0aGlzLnNldFJlZ2lvbnMoWy4uLmFubm90YXRpb25zLCAuLi5wcm9maWxlc10sIHNob3dSZWdpb25MYWJlbCwgaXNSZWdpb25TYXZlT24sIGZpbGxDb2xvciwgZmFsc2UpO1xuICB9XG4gIGdldFNlbGVjdGVkUmVnaW9ucyQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIC8vIE1hcCB0aGUgaW50ZXJuYWwgaW5kZXgtYmFzZWQgc2VsZWN0aW9uIHRvIHRoZSBzZWxlY3RlZCBhbm5vdGF0aW9uIHJlZ2lvbnMuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkucGlwZShcbiAgICAgIG1hcCgoaWR4cykgPT4ge1xuICAgICAgICBjb25zdCByZWdzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgICAgIHJldHVybiBpZHhzLm1hcCgoaSkgPT4gcmVnc1tpXSkuZmlsdGVyKChyKTogciBpcyBSZWdpb24gPT4gISFyICYmICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICBzZXRTZWxlY3RlZFJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCByZWdzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3QgaW5kaWNlcyA9IChyZWdpb25zIHx8IFtdKS5tYXAoKHIpID0+IHJlZ3MuZmluZEluZGV4KCh4KSA9PiB4LmlkID09PSByLmlkKSkuZmlsdGVyKChpKSA9PiBpID49IDApO1xuICAgIHRoaXMuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cblxuICAvLyDilIDilIAgdG9vbHMg4oaSIGFjdGl2ZSByZW5kZXJlciAocnVuIG9uIGVpdGhlciBiYWNrZW5kKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gVGhlIHdhbmQsIHZlcnRleCBlcmFzZXIgYW5kIHpvb20tdG8tYm94IGFyZSBpbXBsZW1lbnRlZCBvbiBib3RoIGJhY2tlbmRzXG4gIC8vIHZpYSBJQ29vcmRpbmF0ZVRyYW5zZm9ybSAoKyBhIHZpZXdwb3J0IHBpeGVsIHJlYWRiYWNrIGZvciB0aGUgd2FuZCksIHNvIHRoZXlcbiAgLy8gZm9sbG93IHRoZSBhY3RpdmUgcmVuZGVyZXIg4oCUIHRoZSBzbGljZSBwYW5lJ3Mgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzIHNwbGl0LlxuICBzZXRBY3RpdmVUb29sKGlkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogQ2FudmFzVG9vbE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRBY3RpdmVUb29sKGlkLCBvcHRpb25zKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0V2FuZE1vZGUoYWN0aXZlLCBvcHRpb25zKTtcbiAgfVxuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRXYW5kT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0QnJ1c2hNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRCcnVzaE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmUpO1xuICB9XG4gIHNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFpvb21Ub0JveE1vZGUoYWN0aXZlKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZWdtZW50UmVjdGFuZ2xlcygpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25CYWNrZW5kKCkuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpO1xuICB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRTYW1Nb2RlbChpZCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRTYW1Qb2ludE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY29tbWl0U2FtUG9pbnRzKCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY2xlYXJTYW1Qb2ludHMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBkaXNwbGF5IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIOKAlCByZWFkcyBnbyBzdHJhaWdodCB0byBpdC5cbiAgLy8gVGhlIHR3byBTRVRURVJTIHN0aWxsIHJvdXRlIHRocm91Z2ggUGxvdGx5IGJlY2F1c2UgaXRzIGltcGxlbWVudGF0aW9uc1xuICAvLyBjYXJyeSByZW5kZXIgZ2x1ZSBiZXlvbmQgdGhlIHN0b3JlIHdyaXRlIChhIGxpdmUgUGxvdGx5LnJlc3R5bGUgb2ZcbiAgLy8gY29sb3JzY2FsZS9yZXZlcnNlc2NhbGUgb24gdGhlIG1vdW50ZWQgaGVhdG1hcCk7IE9TRCByZWNvbG9ycyB2aWEgaXRzIG93blxuICAvLyBzdG9yZSBzdWJzY3JpcHRpb24gZWl0aGVyIHdheS5cbiAgZ2V0Q29sb3JtYXAoKTogT2JzZXJ2YWJsZTxDb2xvcm1hcE5vZGUgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKTtcbiAgfVxuICBzZXRDb2xvcm1hcChjb2xvcm1hcDogQ29sb3JtYXBOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0Q29sb3JtYXAoY29sb3JtYXApO1xuICB9XG4gIGdldENvbG9ybWFwT3B0aW9ucygpOiBDb2xvcm1hcE5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXBPcHRpb25zKCk7XG4gIH1cbiAgZ2V0UmV2ZXJzZVNjYWxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpO1xuICB9XG4gIHNldFJldmVyc2VTY2FsZShyZXZlcnNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2UpO1xuICB9XG4gIHNldEltYWdlTWV0YShpbWFnZU1ldGE6IElJbWFnZU1ldGFkYXRhW10sIGltYWdlS2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRJbWFnZU1ldGEoaW1hZ2VNZXRhLCBpbWFnZUtleSk7XG4gIH1cbiAgZ2V0SW1hZ2VNZXRhKCk6IE9ic2VydmFibGU8SUltYWdlTWV0YWRhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEltYWdlTWV0YSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElDaGFubmVsSGlzdG9ncmFtQXBpOiBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lIHN1cmZhY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENoYW5uZWwvZ3JheXNjYWxlL2ludmVydCBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZTsgYm90aFxuICAvLyBiYWNrZW5kcyBzdWJzY3JpYmUgYW5kIHJlY29sb3IgbGl2ZSwgc28gc2V0dGVycyBqdXN0IHdyaXRlIHRoZSBzdG9yZS4gVGhlXG4gIC8vIGhpc3RvZ3JhbSBjb21lcyBmcm9tIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbiAoaXRzIG5hdGl2ZSBwaXhlbHMpLlxuICBnZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgfVxuICAvKiogRXhwb3J0IHRoZSB1bmRlcmx5aW5nIGRhdGEgKDE2LWJpdCBtdWx0aS1iYW5kIFRJRkYpIHZpYSB0aGUgYWN0aXZlIGJhY2tlbmQuICovXG4gIGV4cG9ydERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmV4cG9ydERhdGEoKTtcbiAgfVxuICBnZXRDaGFubmVscyQoKTogT2JzZXJ2YWJsZTxJQ2hhbm5lbFN0YXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkQ2hhbm5lbChpbmRleCk7XG4gIH1cbiAgc2V0Q2hhbm5lbFN0YXRlKGluZGV4OiBudW1iZXIsIHBhcnRpYWw6IFBhcnRpYWw8SUNoYW5uZWxTdGF0ZT4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZShpbmRleCwgcGFydGlhbCk7XG4gIH1cbiAgcmVzZXRDb250cmFzdChpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIC8vIEZ1bGwgcmVzZXQ6IHdpbmRvdyAoMC4uMjU1KSwgZ2FtbWEgKDEpIEFORCB0aGUgY2hhbm5lbCdzIGRlZmF1bHQgdGludC5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykgdGhpcy5zdG9yZS5yZXNldENoYW5uZWxTdGF0ZShpKTtcbiAgfVxuICAvKiogQXV0by13aW5kb3cgZWFjaCBjaGFubmVsIGJ5IHNhdHVyYXRpbmcgYHNhdHVyYXRpb25gICgwLi4xKSBvZiBwaXhlbHMgYXQgZWFjaFxuICAgKiAgZW5kIG9mIGl0cyBoaXN0b2dyYW0gKHNraXBwaW5nIG91dGxpZXIgZmlyc3QvbGFzdCBiaW5zKS4gKi9cbiAgYXV0b0NvbnRyYXN0KGluZGljZXM6IG51bWJlcltdLCBzYXR1cmF0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgICAgY29uc3QgaCA9IHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0oaSwgMjU2KTtcbiAgICAgIGlmICghaCkgY29udGludWU7XG4gICAgICBjb25zdCBbbWluLCBtYXhdID0gYXV0b1dpbmRvd0Zyb21IaXN0b2dyYW0oaCwgc2F0dXJhdGlvbiwgWzAsIDI1NV0pO1xuICAgICAgaWYgKG1heCA+IG1pbikgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoaSwgeyBtaW4sIG1heCB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0R3JheXNjYWxlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRHcmF5c2NhbGUoKTtcbiAgfVxuICBzZXRHcmF5c2NhbGUob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEdyYXlzY2FsZShvbik7XG4gIH1cbiAgZ2V0SW52ZXJ0JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRJbnZlcnQoKTtcbiAgfVxuICBzZXRJbnZlcnQob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEludmVydChvbik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFjdGl2ZSBiYWNrZW5kJ3MgcmVnaW9uIG92ZXJsYXkgKHRoZSBzbGljZSBwYW5lJ3Mgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzIHNwbGl0KS4gRmFsbHNcbiAgICogYmFjayB0byBQbG90bHkncyB3aGVuIHRoZSBhY3RpdmUgYmFja2VuZFxuICAgKiAoT1NEIG9yIG5hcGFyaS1qcykgaXMgc2VsZWN0ZWQgYnV0IGEgcGxvdCBpc24ndCBtb3VudGVkIHlldCwgc28gY2FsbGVycyBhbHdheXMgZ2V0IGFcbiAgICogdXNhYmxlIG92ZXJsYXkuXG4gICAqL1xuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHtcbiAgICBjb25zdCByID0gdGhpcy5yZWdpb25CYWNrZW5kKCk7XG4gICAgaWYgKHIgPT09IHRoaXMub3NkKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2QuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgaWYgKHIgPT09IHRoaXMubmFwYXJpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXBhcmkuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgfVxuXG4gIC8qKiBJc29zdXJmYWNlIGNvbnRyb2xzIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgd2hlbiBpdCByZW5kZXJzIGlzb3N1cmZhY2VzLiAqL1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk7XG4gIH1cblxuICAvKiogM0Qgc2NlbmUgY29udHJvbHMgb2YgdGhlIGJhY2tlbmQgb24gc2NyZWVuIChQbG90bHkgb3IgbmFwYXJpLWpzKSwgb3IgbnVsbCBvbiBhXG4gICAqICAyRC1vbmx5IG9uZS4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTdXJmYWNlM2RDb250cm9scygpO1xuICB9XG5cbiAgLyoqIEludGVuc2l0eSAobGluZS1ST0kpIGNvbnRyb2xzLCB3aGljaGV2ZXIgYmFja2VuZCBkcmF3cyB0aGUgaW1hZ2U6IHRoZVxuICAgKiAgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UgYWRkcyB0aGUgbGluZSB0byB0aGUgc3RvcmUsIGFuZCBldmVyeSBiYWNrZW5kXG4gICAqICAoUGxvdGx5IGluY2x1ZGVkKSBkcmF3cyBpdCBmcm9tIHRoZSBzdG9yZSdzIHVwZGF0ZSBldmVudC4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNwYXRpYWwtb21pY3MgY29udHJvbHMsIG9yIG51bGwgd2hlbiBubyBgU1BBVElBTF9EQVRBX1BPUlRgIGlzIGJvdW5kLiBTZXJ2ZWQgYnkgYVxuICAgKiBiYWNrZW5kLW5ldXRyYWwge0BsaW5rIFNwYXRpYWxDb250cm9sc0ZhY2FkZX0gKHN0YXRlIGluIHRoZSBzaGFyZWQgc3RvcmVzKSwgc28gdGhlXG4gICAqIGNvbnRyb2xzIHdvcmsgYWNyb3NzIGEgcGxvdC10eXBlIHN3aXRjaCBhbmQgYmVmb3JlIGFueSBiYWNrZW5kIGhhcyBtb3VudGVkLlxuICAgKi9cbiAgZ2V0U3BhdGlhbENvbnRyb2xzKCk6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc3BhdGlhbERhdGEpIHJldHVybiBudWxsO1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZSA/Pz0gbmV3IFNwYXRpYWxDb250cm9sc0ZhY2FkZSh0aGlzLnNwYXRpYWxEYXRhLCB7XG4gICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgIHJlZ2lvblN0b3JlOiB0aGlzLnJlZ2lvblN0b3JlLFxuICAgICAgc2VsZWN0aW9uU3RvcmU6IHRoaXMuc2VsZWN0aW9uU3RvcmUsXG4gICAgICBuYXBhcmk6IHRoaXMubmFwYXJpLFxuICAgICAgcGxvdFR5cGU6ICgpID0+IHRoaXMuY3VycmVudFBsb3RUeXBlLFxuICAgICAgekluZGV4OiAoKSA9PiB0aGlzLmN1cnJlbnRaSW5kZXgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbEZhY2FkZS5jb250cm9scztcbiAgfVxuXG4gIC8qKiBDcmVhdGVkIG9uIGZpcnN0IHVzZTsgb3ducyB0aGUgZGF0YXNldCBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc3BhdGlhbEZhY2FkZTogU3BhdGlhbENvbnRyb2xzRmFjYWRlIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEaXNwbGF5ZWQgc2xpY2UuIE9ubHkgYSB2b2x1bWUtYmFja2VkIHNwYXRpYWwgZGF0YXNldCByZWFkcyBpdCwgdG8ga2VlcCBhXG4gICAqICByZWdpb24gZHJhd24gb3ZlciBvbmUgc2VjdGlvbiBmcm9tIHNlbGVjdGluZyB0aGUgd2hvbGUgZGVwdGggYmVoaW5kIGl0LiAqL1xuICBwcml2YXRlIGN1cnJlbnRaSW5kZXggPSAwO1xuXG4gIC8qKiBBbmd1bGFyIGNhbGxzIHRoaXMgd2hlbiB0aGUgaW5qZWN0b3IgcHJvdmlkaW5nIHRoZSByb3V0ZXIgaXMgZGVzdHJveWVkIOKAlCB0aGUgaG9zdFxuICAgKiAgY29tcG9uZW50IGZvciBhIGBwcm92aWRlVmlzdWFsaXphdGlvbigpYCBjaGFpbi4gVGhlIGRhdGFzZXQgc3Vic2NyaXB0aW9uIHdvdWxkXG4gICAqICBvdGhlcndpc2Uga2VlcCB0aGUgd2hvbGUgaXNvbGF0ZWQgY2hhaW4gcmVhY2hhYmxlIGZyb20gdGhlIHJvb3QgZGF0YSBwb3J0LiAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydFRpY2tldCA9IHsgaWQ6IHRoaXMuaW1wb3J0VGlja2V0LmlkICsgMSwgaW1hZ2U6IHVuZGVmaW5lZCB9OyAvLyBhIGxhdGUgaW1wb3J0IGNoYW5nZXMgbm90aGluZ1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZSA9IG51bGw7XG4gICAgdGhpcy5yZWdpb25VcGRhdGVzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2VjdGlvbnMuc3RvcCgpO1xuICAgIGlmICh0aGlzLnJlYnVpbGRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucmVidWlsZFRpbWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlbnNpdHktcHJvZmlsZSBzYW1wbGluZywgd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuOiB0aGUgc2FtcGxpbmcgaXMgdGhlXG4gICAqIGJhY2tlbmQtbmV1dHJhbCBJbnRlbnNpdHlQcm9maWxlU2VydmljZSdzOyB0aGUgdmlld3BvcnQgY2hhbmdlcyBjb21lIGZyb20gZXZlcnlcbiAgICogYmFja2VuZCB0aGF0IHJlcG9ydHMgdGhlbSAoT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzKSwgbWVyZ2VkIGludG8gb25lIHN0YWJsZVxuICAgKiBzdHJlYW0gdGhlIGluc2V0IHN1YnNjcmliZXMgdG8gb25jZS5cbiAgICovXG4gIGdldEludGVuc2l0eVNhbXBsaW5nKCk6IElJbnRlbnNpdHlTYW1wbGluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmc7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlTYW1wbGluZzogSUludGVuc2l0eVNhbXBsaW5nID0ge1xuICAgIC8vIExvYWQgdGhlIGRpc3BsYXllZCBzbGljZSdzIHBpeGVscyBmb3IgYSBiYWNrZW5kIHRoYXQgaGFzIG5vIGZyYW1lcyBvZiBpdHMgb3duXG4gICAgLy8gKE9wZW5TZWFkcmFnb24sIG5hcGFyaS1qczsgUGxvdGx5IGZlZWRzIGl0cyBmcmFtZXMgdG8gdGhlIHNlcnZpY2Ugd2hlbiBpdCBwbG90cykuXG4gICAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmc6IChpbWFnZUluZm8sIHpJbmRleCkgPT4ge1xuICAgICAgdGhpcy5wb2ludFNhbXBsaW5nQXRQbG90KCk7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHkuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICAgIH0sXG4gICAgLy8gUmUtc2FtcGxlIGZyb20gYSBmcmVzaCBjcm9wIG9mIHRoZSBpbWFnZS1waXhlbCBST0kgYXQgZGlzcGxheSByZXNvbHV0aW9uLlxuICAgIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaTogKHgsIHksIHdpZHRoLCBoZWlnaHQsIHpJbmRleCkgPT4ge1xuICAgICAgdGhpcy5wb2ludFNhbXBsaW5nQXRQbG90KCk7XG4gICAgICB0aGlzLmludGVuc2l0eS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KTtcbiAgICB9LFxuICAgIGdldFZpZXdwb3J0Q2hhbmdlJDogKCkgPT5cbiAgICAgIG1lcmdlKC4uLnRoaXMuYmFja2VuZHMoKS5tYXAoKGIpID0+IGIuZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKT8uZ2V0Vmlld3BvcnRDaGFuZ2UkKCkgPz8gRU1QVFkpKSxcbiAgfTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZygpYC4gKi9cbiAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eVNhbXBsaW5nLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbywgekluZGV4KTtcbiAgfVxuXG4gIC8qKiBDcm9wcyBmb3Igc2FtcGxpbmcgYXJlIHNpemVkIGZyb20gdGhlIHBsb3QgZGl2ICh3aGljaGV2ZXIgYmFja2VuZCByZW5kZXJzIGludG8gaXQpLiAqL1xuICBwcml2YXRlIHBvaW50U2FtcGxpbmdBdFBsb3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGxvdERpdikgdGhpcy5pbnRlbnNpdHkuc2V0U2FtcGxpbmdFbGVtZW50KHRoaXMucGxvdERpdik7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmdldFZpZXdwb3J0Q2hhbmdlJCgpYC4gKi9cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eVNhbXBsaW5nLmdldFZpZXdwb3J0Q2hhbmdlJCgpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koKWAuICovXG4gIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlbnNpdHlTYW1wbGluZy5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KTtcbiAgfVxuXG4gIC8qKiBUaGUgdmlzdWFsaXplciB2aWV3IGlzIGdvaW5nIGF3YXk6IGRldGFjaCBldmVyeSBiYWNrZW5kIOKAlCBkcm9wcGluZyB0aGVpciB2aWV3LWJvdW5kXG4gICAqICBzdWJzY3JpcHRpb25zIGFuZCBkaXNwb3NpbmcgdGhlIG5hcGFyaS1qcyB2aWV3ZXIsIHdob3NlIGNhbnZhcywgcmVuZGVyIGxvb3AgYW5kIEdQVVxuICAgKiAgYnVmZmVycyB3b3VsZCBvdGhlcndpc2Ugb3V0bGl2ZSB0aGUgdmlldyAoZm9yIGEgY29tcG9uZW50LXNjb3BlZCBjaGFpbiwgZm9yZXZlcikuXG4gICAqICBOb3RoaW5nIGlzIG9uIHNjcmVlbiBhZnRlcndhcmRzLCBzbyB0aGUgbmV4dCBwbG90IHN0YXJ0cyBmcm9tIHRoZSBkZWZhdWx0IGJhY2tlbmQuICovXG4gIGRldGFjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlUmVxdWVzdCsrO1xuICAgIHRoaXMuc2VjdGlvbnMuc3RvcCgpO1xuICAgIHRoaXMuc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZURpdiA9IG51bGw7XG4gICAgdGhpcy5wbG90bHkuZGV0YWNoKCk7XG4gICAgdGhpcy5vc2QuZGV0YWNoKCk7XG4gICAgdGhpcy5uYXBhcmkuZGV0YWNoKCk7XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBudWxsO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZGV0YWNofS4gKi9cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2goKTtcbiAgfVxufVxuIl19
|