@jax-data-science/sci-image-visualizer 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -330,7 +330,13 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
330
330
  // beyond that one file's own extent).
331
331
  const info = this.loaded?.imageInfo;
332
332
  if (this.simpleStack.isSimple(info)) {
333
- const url = this.simpleStack.urlFor(info, z);
333
+ // Serverless multichannel volume: fetch the requested channel's OWN plane
334
+ // (channelUrls[z][channel]) so each band stays distinct — the client-side
335
+ // analog of the server's per-channel /tile?channel=c. Else the z-anchor URL.
336
+ const chUrls = info.channelUrls;
337
+ const url = channel != null && chUrls?.[z]?.[channel] != null
338
+ ? chUrls[z][channel]
339
+ : this.simpleStack.urlFor(info, z);
334
340
  if (!url)
335
341
  throw new Error(`[napari-js] no URL for slice ${z}`);
336
342
  return this.simpleStack.fetchAsBitmap(url);
@@ -940,8 +946,13 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
940
946
  async mountVolume(viewer, info, plotType) {
941
947
  const token = this.loadToken; // bail before rendering if a Cancel / new plot bumps this
942
948
  const desc = await this.ensureDescriptor();
943
- const channelCount = desc?.channels ?? 1;
944
- const multichannel = !!desc?.multichannel && channelCount > 1;
949
+ // Serverless multichannel (tiled:false + channelUrls): no tile descriptor, so
950
+ // derive the channel count from imageMeta and assemble each band from its own
951
+ // channelUrls[z][c] plane (fetchSlice does the per-channel routing).
952
+ const simpleMc = this.simpleStack.isSimple(info) && !!info?.channelUrls?.length
953
+ && (info?.imageMeta?.[0]?.channelCount ?? 1) > 1;
954
+ const channelCount = simpleMc ? info.imageMeta[0].channelCount : (desc?.channels ?? 1);
955
+ const multichannel = simpleMc || (!!desc?.multichannel && channelCount > 1);
945
956
  const res = volumeResolutionFor(this.resolutionScale);
946
957
  const rendering = isNapariIsosurface(plotType) ? 'iso' : 'mip';
947
958
  const states = this.store.currentChannelStates();
@@ -2280,4 +2291,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
2280
2291
  type: Inject,
2281
2292
  args: [VIZ_CONFIG]
2282
2293
  }] }] });
2283
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQWMsZUFBZSxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbkcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gscUJBQXFCLEVBQ3JCLHNCQUFzQixHQUN2QixNQUFNLFdBQVcsQ0FBQztBQWdCbkIsT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUNMLFFBQVEsRUFFUixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsZUFBZSxFQUNmLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSwyQkFBMkIsQ0FBQztBQVNuQyxPQUFPLEVBRUwsYUFBYSxFQUNiLGNBQWMsR0FDZixNQUFNLHVDQUF1QyxDQUFDO0FBSS9DLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQWtCLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFF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MkIsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDM0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxDQUFDLENBQUM7Z0JBQ25GLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUM7UUFDckQsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7OEdBMXVFVSx1QkFBdUIsa0JBb0l4QixnQkFBZ0Isd1RBVUosY0FBYyxzRUFFMUIsVUFBVTtrSEFoSlQsdUJBQXVCLGNBRFYsTUFBTTs7MkZBQ25CLHVCQUF1QjtrQkFEbkMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQXFJN0IsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQVV2QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGNBQWM7OzBCQUVqQyxNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQge1xuICBWaWV3ZXIsXG4gIGhpc3RvZ3JhbVNjYWxhcixcbiAgY29sb3JtYXBGcm9tTHV0LFxuICB0aW50Q29sb3JtYXAsXG4gIHJldmVyc2VDb2xvcm1hcCxcbiAgaGVpZ2h0RmllbGQsXG4gIE11bHRpQ2hhbm5lbEltYWdlVmlldyxcbiAgTXVsdGlDaGFubmVsVm9sdW1lVmlldyxcbn0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXhlc0xheWVyLFxuICBTdXJmYWNlTGF5ZXIsXG4gIFBvaW50c0xheWVyLFxuICBQb2ludHMzRExheWVyLFxuICBUaWxlZFNvdXJjZSxcbiAgVGlsZUtleSxcbiAgUGl4ZWxDaHVuayxcbiAgQ2hhbm5lbFZpZXcsXG4gIFZvbHVtZUNoYW5uZWwsXG4gIENvbG9ybWFwLFxufSBmcm9tICduYXBhcmktanMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IElDaGFubmVsU3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGJ1aWxkQ29sb3JtYXBMdXQsIFJnYiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHtcbiAgUGxvdFR5cGUsXG4gIFBsb3RUeXBlRGVzY3JpcHRvcixcbiAgUExPVF9UWVBFX0RFU0NSSVBUT1JTLFxuICBpc05hcGFyaTNkLFxuICBpc05hcGFyaUlzb3N1cmZhY2UsXG4gIGlzTmFwYXJpU3VyZmFjZSxcbiAgaXNOYXBhcmlTY2F0dGVyLFxuICBpc05hcGFyaVNjYXR0ZXIzZCxcbiAgTkFQQVJJX0RFRkFVTFRfREVDSU1BVEUsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHtcbiAgSVZpc3VhbGl6ZXIsXG4gIFBpeGVsRGF0YSxcbiAgSW50ZW5zaXR5UHJvZmlsZSxcbiAgSUlzb3N1cmZhY2VDb250cm9scyxcbiAgSUludGVuc2l0eUNvbnRyb2xzLFxuICBJU3VyZmFjZTNkQ29udHJvbHMsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFZpZXdlckNhcGFiaWxpdGllcyxcbiAgVmlld2VyRmVhdHVyZSxcbiAgY2FwYWJpbGl0aWVzT2YsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgQ29sb3JtYXBOb2RlLCBJV2FuZE9wdGlvbnMsIElCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBWSVpfQ09ORklHLCBWaXpDb25maWcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBUSUxFX0FDQ0VTU19QT1JULCBUaWxlQWNjZXNzUG9ydCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy90aWxlLWFjY2Vzcy5wb3J0JztcbmltcG9ydCB7IEJhc2VTdG9yZVZpc3VhbGl6ZXIgfSBmcm9tICcuLi9iYXNlLXN0b3JlLXZpc3VhbGl6ZXInO1xuaW1wb3J0IHsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2ltcGxlLXNsaWNlLWFjY2Vzcy5zZXJ2aWNlJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVNjYWxlQmFyLCBmb3JtYXRVbSB9IGZyb20gJy4vbmFwYXJpLXNjYWxlLWJhcic7XG5pbXBvcnQgeyBOYXBhcmlSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9uYXBhcmktcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgTmFwYXJpQXhlc0xhYmVscywgQXhpc0xhYmVsU3BlYyB9IGZyb20gJy4vbmFwYXJpLWF4ZXMtbGFiZWxzJztcbmltcG9ydCB7IE5hcGFyaVZvbHVtZVpIYW5kbGUgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtei1oYW5kbGUnO1xuaW1wb3J0IHtcbiAgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBXYW5kVG9vbFNlcnZpY2UsIFdhbmRUb29sSG9zdCwgQ2FjaGVkSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBCcnVzaFRvb2xTZXJ2aWNlLCBCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL2JydXNoL2JydXNoLXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSxcbiAgVmVydGV4RXJhc2VyVG9vbEhvc3QsXG59IGZyb20gJy4uLy4uL3Rvb2xiYXIvdmVydGV4LWVyYXNlci92ZXJ0ZXgtZXJhc2VyLXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgWm9vbVRvQm94VG9vbEhvc3QsXG59IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2VsbFNlZ21lbnRlciwgQ0VMTF9TRUdNRU5URVIgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2VsbC1zZWdtZW50ZXIuY29udHJhY3QnO1xuXG4vKiogSUNvb3JkaW5hdGVUcmFuc2Zvcm0gb3ZlciB0aGUgbmFwYXJpIGNhbWVyYTogcG9pbnRlciBjbGllbnQgY29vcmRzIOKGlCBpbWFnZS93b3JsZCBjb29yZHMuICovXG5jbGFzcyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtIGltcGxlbWVudHMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjoge1xuICAgICAgY2FudmFzVG9Xb3JsZChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICByZWFkb25seSBjYW1lcmE6IHsgem9vbTogbnVtYmVyIH07XG4gICAgfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWR5OiAoKSA9PiBib29sZWFuLFxuICApIHt9XG4gIGNsaWVudFRvRGF0YShjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cbiAgZGF0YUxlbmd0aFRvU2NyZWVuKGRhdGFMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGFMZW5ndGggKiB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTsgLy8gQ1NTIHB4IHBlciB3b3JsZCB1bml0XG4gIH1cbiAgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG59XG5cbi8qKiBPcGFxdWUgaGFuZGxlIGZyb20ge0BsaW5rIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLmxvYWR9LCBwYXNzZWQgYmFjayB0byBwbG90KCkuICovXG5pbnRlcmZhY2UgTmFwYXJpTG9hZGVkIHtcbiAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvO1xuICB6OiBudW1iZXI7XG4gIC8qKiBNdXN0IG1hdGNoIGBJSW1hZ2VJbmZvLmZpbGVOYW1lYCDigJQgdGhlIHJlbmRlciBvcmNoZXN0cmF0b3IgZHJvcHMgdGhlIHJlc3VsdCBpZiB0aGVcbiAgICogIGhhbmRsZSdzIGBmaWxlbmFtZWAgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWVzdGVkIGltYWdlIChndWFyZHMgYWdhaW5zdCBzdGFsZSBjbGlja3MpLiAqL1xuICBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBWT0xVTUVfTUFYX1NMSUNFID0gMTAyNDsgLy8gXCJGdWxsXCIgaW4tcGxhbmUgY2FwOyB0aGUgZGVmYXVsdCDCvCBsb2FkIHVzZXMgMjU2XG4vKiogUmVmZXJlbmNlIGluLXBsYW5lIHdvcmxkIHNpemUgKGxvbmcgc2lkZSkgZm9yIHRoZSB2b2x1bWUvYXhlcyBib3gsIGluIGFyYml0cmFyeSB3b3JsZCB1bml0cy5cbiAqICBUaGUgYm94IGlzIGFuY2hvcmVkIHRvIHRoaXMgcmVmZXJlbmNlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNob3NlbiBkZWNpbWF0ZSBmYWN0b3IsIHNvIGNoYW5naW5nIHRoZVxuICogIHJlc29sdXRpb24gY2hhbmdlcyBERVRBSUwsIG5vdCB0aGUgdm9sdW1lJ3MgcHJvcG9ydGlvbnMgKFogbm8gbG9uZ2VyIGFwcGVhcnMgdG8gc2hyaW5rIHdoZW4gdGhlXG4gKiAgaW4tcGxhbmUgc2FtcGxpbmcgZ3Jvd3MpLiBTZXQgdG8gdGhlIERFRkFVTFQgZGVjaW1hdGUncyBpbi1wbGFuZSBjYXAgc28gdGhlIGRlZmF1bHQgdmlldyBpc1xuICogIHVuY2hhbmdlZDsgaGlnaGVyL2xvd2VyIHJlc29sdXRpb25zIGtlZXAgdGhhdCBzYW1lIHNoYXBlLiBTZWUge0BsaW5rIG1vdW50Vm9sdW1lfS4gKi9cbmNvbnN0IFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRiA9IFZPTFVNRV9NQVhfU0xJQ0UgLyBOQVBBUklfREVGQVVMVF9ERUNJTUFURTtcbi8qKiBNYXggY29uY3VycmVudCBzbGljZSBmZXRjaGVzIHdoZW4gYXNzZW1ibGluZyBhIHZvbHVtZSDigJQga2VlcHMgdGhlIGNvbm5lY3Rpb24gcG9vbCBidXN5XG4gKiAgd2l0aG91dCBmbG9vZGluZyBpdCAoYnJvd3NlcnMgY2FwIH42L2hvc3QpIG9uIGEgZGVlcCBzdGFjay4gKi9cbmNvbnN0IFZPTFVNRV9GRVRDSF9DT05DVVJSRU5DWSA9IDg7XG5cbi8qKiBWb2x1bWUvaXNvc3VyZmFjZSBzYW1wbGluZyBmb3IgYSBkZWNpbWF0ZSBmYWN0b3IgYHNjYWxlYCAoMSA9IEZ1bGwgMTAyNCwgMiA9IMK9IDUxMiwgNCA9IMK8IDI1NlxuICogIGRlZmF1bHQsIDggPSDihZsgMTI4KTogdGhlIGluLXBsYW5lIGNhcCBoYWx2ZXMgZWFjaCBzdGVwOyBzbGljZXMgc3RheSB1bi1zdWJzYW1wbGVkIHVudGlsIOKFmywgdGhlblxuICogIHN1YnNhbXBsZS4gKi9cbmZ1bmN0aW9uIHZvbHVtZVJlc29sdXRpb25Gb3Ioc2NhbGU6IG51bWJlcik6IHsgbWF4U2xpY2U6IG51bWJlcjsgc2xpY2VTdGVwOiBudW1iZXIgfSB7XG4gIGNvbnN0IHMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNjYWxlKSk7XG4gIHJldHVybiB7XG4gICAgbWF4U2xpY2U6IE1hdGgubWF4KDgsIE1hdGgucm91bmQoVk9MVU1FX01BWF9TTElDRSAvIHMpKSxcbiAgICBzbGljZVN0ZXA6IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocyAvIDQpKSxcbiAgfTtcbn1cbi8qKiBGdWxseS1ub3JtYWxpemVkIGludGVuc2l0eSBoZWlnaHQgYXMgYSBmcmFjdGlvbiBvZiB0aGUgaW4tcGxhbmUgZXh0ZW50IOKAlCBtYXRjaGVzIHRoZSBQbG90bHlcbiAqICBTVVJGQUNFIHotYXNwZWN0ICh+MC40KSBzbyB0aGUgcmVsaWVmIGlzbid0IGV4YWdnZXJhdGVkLiAqL1xuY29uc3QgU1VSRkFDRV9aX0FTUEVDVCA9IDAuNDtcbi8qKiBcIkZ1bGxcIiBtZXNoIGdyaWQgY2FwOyB0aGUgZGVjaW1hdGUgZmFjdG9yIGRpdmlkZXMgaXQgKGRlZmF1bHQgwrwg4oaSIDIyMCwgwr0g4oaSIDQ0MCwgRnVsbCDihpIgODgwKS4gKi9cbmNvbnN0IFNVUkZBQ0VfTUFYX0dSSUQgPSA4ODA7XG4vKiogQ29lZmZpY2llbnQgc2NhbGluZyB0aGUgcHlyYW1pZCB0aWxlIGJ1ZGdldCB3aXRoIHRoZSB0YXJnZXQgcmVzb2x1dGlvbiDigJQgYSBoaWdoZXIgdGFyZ2V0IHB1bGxzIGFcbiAqICBmaW5lciBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gU2hhcmVkIGJ5IHRoZSBzdXJmYWNlIHBsYW5lIGZldGNoICsgdm9sdW1lIGFzc2VtYmx5LiAqL1xuY29uc3QgU1RJVENIX0JVREdFVF9DT0VGRiA9IDE2O1xuLyoqIFN1cmZhY2UgbWVzaCB0YXJnZXQgZ3JpZCBmb3IgYSBkZWNpbWF0ZSBmYWN0b3IgYHNjYWxlYDogdGhlIGdyaWQgY2FwIHNocmlua3MgYnkgYHNjYWxlYCAoZXZlcnlcbiAqICBzbGljZSBpcyBrZXB0IOKAlCB0aGUgei1zbGlkZXIgbmVlZHMgdGhlbSBhbGwpLiBUaGUgc291cmNlIGlzIGZldGNoZWQgYXQgYSBtYXRjaGluZyByZXNvbHV0aW9uLiAqL1xuZnVuY3Rpb24gc3VyZmFjZVJlc29sdXRpb25Gb3Ioc2NhbGU6IG51bWJlcik6IHsgbWF4R3JpZDogbnVtYmVyIH0ge1xuICBjb25zdCBzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICByZXR1cm4geyBtYXhHcmlkOiBNYXRoLm1heCgxNiwgTWF0aC5yb3VuZChTVVJGQUNFX01BWF9HUklEIC8gcykpIH07XG59XG5cbi8qKiAzRCBzY2F0dGVyOiBpbi1wbGFuZSBjYXAgZm9yIHRoZSBhc3NlbWJsZWQgdm94ZWwgZ3JpZCwgYW5kIHRoZSBtYXggbnVtYmVyIG9mIHBvaW50cyBlbWl0dGVkXG4gKiAgKHRoZSBncmlkIGlzIGZsYXQtc3RyaWRlZCBkb3duIHRvIHRoaXMpIOKAlCBrZWVwcyB0aGUgYmlsbGJvYXJkIGNvdW50IGludGVyYWN0aXZlLiAqL1xuY29uc3QgU0NBVFRFUjNEX01BWF9YWSA9IDY0O1xuY29uc3QgU0NBVFRFUjNEX01BWF9QT0lOVFMgPSAxNTAwMDA7XG5cbmNvbnN0IFRJTEVfU0laRSA9IDUxMjsgLy8gc2VydmVyIHRpbGUgZWRnZSAobWF0Y2hlcyB0aGUgT1NEIGJhY2tlbmQpXG4vKiogTWF4IHRpbGVzIHN0aXRjaGVkIGZvciBvbmUgZGlzcGxheWVkIHNsaWNlICg1MTJweCB0aWxlcyDihpIgdXAgdG8gfjYxNDTCsiBhdCBmdWxsIHJlcykuIEJleW9uZFxuICogIHRoaXMgd2Ugc3RlcCB0byBhIGNvYXJzZXIgcHlyYW1pZCBsZXZlbCBzbyBhIGxhcmdlIGltYWdlIHN0YXlzIHRyYWN0YWJsZS4gKi9cbmNvbnN0IE1BWF9TVElUQ0hfVElMRVMgPSAxNDQ7XG4vKiogV2ViR1BVIGRlZmF1bHQgYG1heFRleHR1cmVEaW1lbnNpb24yRGAg4oCUIGEgc3RpdGNoZWQgc2xpY2UncyBsb25nZXN0IHNpZGUgbXVzdCBmaXQgYSB0ZXh0dXJlLiAqL1xuY29uc3QgTUFYX1RFWFRVUkVfRElNID0gODE5Mjtcbi8qKiBDb25jdXJyZW50IHRpbGUgcmVxdWVzdHMgcGVyIHN0aXRjaGVkIHNsaWNlLiBGaXJpbmcgYSB3aG9sZSBncmlkIGF0IG9uY2UgKGh1bmRyZWRzIG9mIHJlcXVlc3RzXG4gKiAgZm9yIGEgbGFyZ2UgbGV2ZWwpIG92ZXJ3aGVsbWVkIHRoZSB0aWxlIHNlcnZlciAoNTA0cyk7IGEgc21hbGwgcG9vbCBrZWVwcyB0aGUgcGlwZSBmdWxsIHdpdGhvdXRcbiAqICBmbG9vZGluZyBpdCDigJQgYW5kIHNsaWNlLWxldmVsIHdvcmtlcnMgYWxyZWFkeSBydW4gc2V2ZXJhbCBzdGl0Y2hlcyBpbiBwYXJhbGxlbCBvbiB0b3Agb2YgdGhpcy4gKi9cbmNvbnN0IFRJTEVfRkVUQ0hfQ09OQ1VSUkVOQ1kgPSA2O1xuLyoqIEhvdyBsb25nIHRvIHBvbGwgYC90aWxlcy9pbmZvYCAoMjAyIHdoaWxlIHRoZSBzZXJ2ZXIgY2FjaGVzIHRoZSBzb3VyY2UpIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG9cbiAqICBhIHNpbmdsZSB0aWxlLiBHZW5lcm91cyBsaWtlIHRoZSBPU0QgYmFja2VuZCDigJQgYSBjb2xkIHdob2xlLXNsaWRlIGNhbiB0YWtlIG1pbnV0ZXMgdG8gY2FjaGUuICovXG5jb25zdCBERVNDUklQVE9SX1RJTUVPVVRfTVMgPSAxMjAwMDA7XG5cbi8qKiBEZWZhdWx0IHBlci1jaGFubmVsIHRpbnRzIChGaWppLXN0eWxlKSB3aGVuIHRoZSBzdG9yZS9kZXNjcmlwdG9yIG9mZmVycyBubyBjb2xvdXIuICovXG5jb25zdCBERUZBVUxUX1RJTlRTID0gWycjZmYwMDAwJywgJyMwMGZmMDAnLCAnIzAwMDBmZicsICcjZmZmZjAwJywgJyNmZjAwZmYnLCAnIzAwZmZmZicsICcjZmZmZmZmJ107XG5cbi8qKiBEZWZhdWx0IHRpbnQgZm9yIGEgY2hhbm5lbCBpbmRleCwgY3ljbGluZyB0aGUgRmlqaSBwYWxldHRlLiAqL1xuZnVuY3Rpb24gdGludEZvcihjaGFubmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gREVGQVVMVF9USU5UU1tjaGFubmVsICUgREVGQVVMVF9USU5UUy5sZW5ndGhdO1xufVxuXG4vKiogT25lIHB5cmFtaWQgbGV2ZWwgZnJvbSBgR0VUIC90aWxlcy9pbmZvYCAocmVzIDAgPSBmdWxsIHJlc29sdXRpb24pLiAqL1xuaW50ZXJmYWNlIFRpbGVMZXZlbCB7XG4gIHJlczogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqIFN1YnNldCBvZiB0aGUgYC90aWxlcy9pbmZvYCBkZXNjcmlwdG9yIHRoaXMgYmFja2VuZCByZWFkcyAodGlsZSBncmlkLCBjaGFubmVscywgc2NhbGUpLiAqL1xuaW50ZXJmYWNlIFRpbGVEZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgY2hhbm5lbHM6IG51bWJlcjtcbiAgbXVsdGljaGFubmVsPzogYm9vbGVhbjtcbiAgLyoqIFJlYWwgQmlvLUZvcm1hdHMgbGV2ZWxzIGF0IHRoZSBmcm9udCBvZiBgbGV2ZWxzYDsgcGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seSB0aGVyZS4gKi9cbiAgcmVhbExldmVscz86IG51bWJlcjtcbiAgY2hhbm5lbEluZm8/OiBBcnJheTx7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBjb2xvcj86IHN0cmluZztcbiAgICBiaXREZXB0aD86IG51bWJlcjtcbiAgICBtaW5BbGxvd2VkPzogbnVtYmVyO1xuICAgIG1heEFsbG93ZWQ/OiBudW1iZXI7XG4gIH0+IHwgbnVsbDtcbiAgbGV2ZWxzOiBUaWxlTGV2ZWxbXTtcbiAgbXBwWD86IG51bWJlcjtcbiAgbXBwWT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIFdlYkdQVSBpbWFnZSBiYWNrZW5kIGJ1aWx0IG9uIHRoZSBwdWJsaXNoZWQgYG5hcGFyaS1qc2AgbGlicmFyeSDigJQgdGhlIFBPQyBlbmdpbmUgZm9yXG4gKiBqaXQtdWkjMTAyIChhIGJyb3dzZXItYmFzZWQgbmFwYXJpIHNoaXBwZWQgYXMgYSBKUyBsaWJyYXJ5LCBzd2FwcGluZyBpbWFnZSBwbG90dGluZyB3aXRoXG4gKiBPcGVuU2VhZHJhZ29uIGFuZCAzRCBzbGljaW5nL2lzb3N1cmZhY2VzIHdpdGggUGxvdGx5KS5cbiAqXG4gKiBSZW5kZXIgc3RyYXRlZ3k6IHJhdGhlciB0aGFuIHJlLWltcGxlbWVudCB0aGUgc2VydmVyJ3MgdGlsZS9weXJhbWlkIHByb3RvY29sICh3aGljaCBPU0RcbiAqIGFscmVhZHkgaGFuZGxlcyksIHRoaXMgYmFja2VuZCByZW5kZXJzIHRoZSAqKmNvbXBsZXRlIHBlci1zbGljZSBpbWFnZSBVUkxzIHRoZSBhcHAgYWxyZWFkeVxuICogcHJvZHVjZXMqKiAoYElJbWFnZUluZm8udXJsc2ApIOKAlCBgdXJsc1t6XWAgZm9yIHRoZSAyRCBpbWFnZSwgYW5kIHRoZSBmdWxsIGB1cmxzYCBzdGFja1xuICogYXNzZW1ibGVkIGludG8gYSBkb3duc2FtcGxlZCB2b2x1bWUgZm9yIHRoZSAzRCB0eXBlcy4gUmVnaW9uIHN0YXRlIGFuZCBkaXNwbGF5IG9wdGlvbnNcbiAqIGRlbGVnYXRlIHRvIHRoZSBzaGFyZWQge0BsaW5rIFJlZ2lvblN0b3JlfSAvIHtAbGluayBWaXN1YWxpemVyU3RvcmV9LCBleGFjdGx5IGFzIE9TRCBkb2VzLlxuICpcbiAqIEZvbGxvdy11cHMgKGppdC11aSMxMDIpOiBuYXRpdmUtcmVzb2x1dGlvbiBweXJhbWlkYWwgdGlsaW5nLCBvbi1jYW52YXMgdG9vbHMsIHJlZ2lvblxuICogb3ZlcmxheSByZW5kZXJpbmcsIHBlci1jaGFubmVsIGhpc3RvZ3JhbXMsIFRJRkYgZXhwb3J0LlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZVN0b3JlVmlzdWFsaXplciBpbXBsZW1lbnRzIElWaXN1YWxpemVyIHtcbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiBWaWV3ZXJDYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXNPZihbXG4gICAgVmlld2VyRmVhdHVyZS5JbWFnZURpc3BsYXksXG4gICAgVmlld2VyRmVhdHVyZS5TdGFja1NsaWRlcixcbiAgICBWaWV3ZXJGZWF0dXJlLlBpeGVsUmVhZGJhY2ssXG4gICAgVmlld2VyRmVhdHVyZS5TdXJmYWNlM0QsXG4gICAgVmlld2VyRmVhdHVyZS5Jc29zdXJmYWNlLFxuICBdKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFwaTogc3RyaW5nO1xuXG4gIHByaXZhdGUgdmlld2VyOiBWaWV3ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG9zdDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2FkZWQ6IE5hcGFyaUxvYWRlZCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RQaXhlbHM6IFBpeGVsRGF0YSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5OQVBBUklfSU1BR0U7XG4gIC8qKiBuYXBhcmktanMgaGlnaC1sZXZlbCB2aWV3IG93bmluZyB0aGUgM0Qgdm9sdW1lIGxheWVycyAob25lIGFkZGl0aXZlIHRpbnRlZCBsYXllciBwZXIgY2hhbm5lbFxuICAgKiAgZm9yIG11bHRpY2hhbm5lbCwgb3IgYSBzaW5nbGUgZ3JheXNjYWxlIHZvbHVtZSkuIE51bGwgaW4gMkQuICovXG4gIHByaXZhdGUgdm9sdW1lVmlldzogTXVsdGlDaGFubmVsVm9sdW1lVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB2b2x1bWUgaXMgY29tcG9zaXRlZCBmcm9tIHBlci1jaGFubmVsIGxheWVycyAodnMgYSBzaW5nbGUgZ3JheXNjYWxlIHZvbHVtZSkuICovXG4gIHByaXZhdGUgdm9sdW1lTXVsdGljaGFubmVsID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgaGVpZ2h0LWZpZWxkIHN1cmZhY2UgbWVzaCAoTkFQQVJJX1NVUkZBQ0UgcGxvdCB0eXBlOyBudWxsIG90aGVyd2lzZSkuIEJ1aWx0IGZyb20gYVxuICAgKiAgc2luZ2xlIGdyYXlzY2FsZSBzbGljZSBieSB7QGxpbmsgYnVpbGRTdXJmYWNlfSB2aWEgbmFwYXJpLWpzJ3MgYGhlaWdodEZpZWxkYCArIGBhZGRTdXJmYWNlYC4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlTGF5ZXI6IFN1cmZhY2VMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogV2hpY2ggYmFuZCB0aGUgc3VyZmFjZSBzYW1wbGVzIChhIGNoYW5uZWwgaW5kZXggZm9yIG11bHRpY2hhbm5lbCwgZWxzZSB0aGUgY29tcG9zaXRlKS4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlQ2hhbm5lbDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAvKiogUHJlLWxvYWRlZCBwZXItc2xpY2UgbHVtaW5hbmNlIHBsYW5lcyAoYWxyZWFkeSBkZWNpbWF0ZWQgdG8gdGhlIHN1cmZhY2UgZ3JpZCksIGtleWVkIGJ5IHosXG4gICAqICBzbyB0aGUgc3RhY2sgc2xpZGVyIHJlYnVpbGRzIHRoZSBzdXJmYWNlIGluc3RhbnRseS4gRmlsbGVkIGJ5IHtAbGluayBwcmVsb2FkU3VyZmFjZVBsYW5lc30uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VyZmFjZVBsYW5lcyA9IG5ldyBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfVxuICA+KCk7XG4gIC8qKiBJbi1wbGFuZSBncmlkIGNhcCBmb3IgdGhlIGFjdGl2ZSBzdXJmYWNlIGxvYWQgKGZ1bGwgZ3JpZCDDtyB0aGUgZGVjaW1hdGUgZmFjdG9yKS4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlTWF4R3JpZCA9IFNVUkZBQ0VfTUFYX0dSSUQ7XG4gIC8qKiBDb250cmFzdCB3aW5kb3cgW21pbixtYXhdIHRoZSBjdXJyZW50IHN1cmZhY2UgbWVzaCB3YXMgYnVpbHQgd2l0aC4gQSBjaGFuZ2UgcmVzaGFwZXMgdGhlXG4gICAqICBtZXNoIChwaXhlbCBoZWlnaHQgPSBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGl0IHRyaWdnZXJzIGEgZ2VvbWV0cnkgcmVidWlsZC4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlV2luZG93OiBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQZXJzaXN0ZWQgd2lyZWZyYW1lIGNob2ljZSBmb3IgdGhlIHN1cmZhY2UgKHJlLWFwcGxpZWQgd2hlbiBhIG5ldyBzdXJmYWNlIG1vdW50cykuICovXG4gIHByaXZhdGUgc3VyZmFjZVdpcmVmcmFtZSA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIDJEIHNjYXR0ZXIgcG9pbnRzIChyZWdpb24gY2VudHJvaWRzKSArIGl0cyByZWdpb24tY2hhbmdlIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzY2F0dGVyMmRQb2ludHM6IFBvaW50c0xheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhdHRlclJlZ2lvblN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBuYXBhcmktanMgM0Qgc2NhdHRlciAodm94ZWwgcG9pbnQgY2xvdWQpLiAqL1xuICBwcml2YXRlIHNjYXR0ZXIzZExheWVyOiBQb2ludHMzRExheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBNb25vdG9uaWMgbG9hZCBnZW5lcmF0aW9uLiBCdW1wZWQgYnkge0BsaW5rIHJlc2V0fSBhbmQge0BsaW5rIGNhbmNlbExvYWRpbmd9OyB0aGUgZnJhbWUtbG9hZGluZ1xuICAgKiAgbG9vcHMgKHZvbHVtZSBhc3NlbWJseSwgc3VyZmFjZSBwcmVsb2FkKSBjYXB0dXJlIGl0IGFuZCBiYWlsIHdoZW4gaXQgY2hhbmdlcywgc28gYSBDYW5jZWwgKG9yIGFcbiAgICogIG5ldyBwbG90KSBhY3R1YWxseSBzdG9wcyBmZXRjaGluZyBmcmFtZXMgaW5zdGVhZCBvZiBydW5uaW5nIHRvIGNvbXBsZXRpb24gaW4gdGhlIGJhY2tncm91bmQuICovXG4gIHByaXZhdGUgbG9hZFRva2VuID0gMDtcbiAgLyoqIERlY2ltYXRlIGZhY3RvciBmb3IgdGhlIG5hcGFyaSAzRCB0eXBlcyAoMSA9IEZ1bGwsIDIgPSDCvSBkZWZhdWx0LCA0ID0gwrwsIDggPSDihZspLiBBcHBsaWVkIHdoZW4gYVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZSAocmUpbG9hZHM7IGNoYW5naW5nIGl0IG5lZWRzIGEgcmUtcGxvdCAoaXQgY2hhbmdlcyBmZXRjaGVkIGRhdGEpLiAqL1xuICBwcml2YXRlIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuICAvKiogM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZSB2aWV3IChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGF5ZXI6IEF4ZXNMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogRE9NIFgvWS9aICsgc2NhbGUgbGFiZWxzIHRyYWNraW5nIHRoZSAzRCBheGVzIGdpem1vIChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGFiZWxzOiBOYXBhcmlBeGVzTGFiZWxzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEcmFnZ2FibGUgWi1oZWlnaHQgZ3JpcCBvdmVyIHRoZSB2b2x1bWUgKG51bGwgdW5sZXNzIGEgdm9sdW1lL2lzb3N1cmZhY2UgaXMgbW91bnRlZCkuICovXG4gIHByaXZhdGUgekhhbmRsZTogTmFwYXJpVm9sdW1lWkhhbmRsZSB8IG51bGwgPSBudWxsO1xuICAvKiogVXNlciBaLWhlaWdodCBmYWN0b3IgZm9yIHRoZSB2b2x1bWUgKDEgPSB0aGUgdm9sdW1lJ3MgbmF0dXJhbCBwcm9wb3J0aW9ucyk7IGRyaXZlbiBieSB0aGVcbiAgICogIGluLXZpZXcgZHJhZyBoYW5kbGUuIFJlc2V0IHBlciBtb3VudC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVaU2NhbGUgPSAxO1xuICAvKiogVm9sdW1lIHdvcmxkIGJveCBhdCBgdm9sdW1lWlNjYWxlID0gMWAgKGJhc2UpICsgdGhlIHNhbXBsZWQgdm94ZWwgZGVwdGgg4oCUIGVub3VnaCB0byByZWNvbXB1dGVcbiAgICogIHRoZSBaLWF4aXMgdm94ZWwgc2NhbGUsIGF4ZXMgZGVwdGgsIGFuZCBvdmVybGF5IGFuY2hvcnMgYXMgdGhlIGhhbmRsZSBzdHJldGNoZXMgWi4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVXb3JsZEJhc2U6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZvbHVtZVNhbXBsZWREZXB0aCA9IDE7XG4gIC8qKiBQZXJzaXN0ZWQgYXhlcyBvbi9vZmYgY2hvaWNlLCByZS1hcHBsaWVkIHdoZW4gYSBuZXcgdm9sdW1lIG1vdW50cy4gRGVmYXVsdHMgb24uICovXG4gIHByaXZhdGUgYXhlc1Zpc2libGUgPSB0cnVlO1xuICBwcml2YXRlIHZvbHVtZURpbXM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogQXNzZW1ibGVkIHVpbnQ4IHZvbHVtZSBkYXRhIHBlciBjaGFubmVsIChrZXkgPSBjaGFubmVsIGluZGV4KSwga2VwdCBmb3IgdGhlIHZvbHVtZSBpbnRlbnNpdHlcbiAgICogIGhpc3RvZ3JhbS4gS2V5IDAgaG9sZHMgdGhlIGdyYXlzY2FsZS9jb21wb3NpdGUgdm9sdW1lIGluIHRoZSBzaW5nbGUtY2hhbm5lbCBjYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZvbHVtZUNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgaW1hZ2VXID0gMDtcbiAgcHJpdmF0ZSBpbWFnZUggPSAwO1xuICAvKiogTW9ub3RvbmljIHNsaWNlLXJlcXVlc3QgaWQgc28gYSBzbG93IG91dC1vZi1vcmRlciBzbGljZSBmZXRjaCBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLiAqL1xuICBwcml2YXRlIHNsaWNlUmVxID0gMDtcbiAgLyoqIENhY2hlZCBgL3RpbGVzL2luZm9gIHB5cmFtaWQgZGVzY3JpcHRvciArIHRoZSBpbmZvQjY0IGl0IHdhcyBmZXRjaGVkIGZvci4gKi9cbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3JLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgMkQgaW1hZ2UgaXMgY29tcG9zaXRlZCAoZHJpdmVzIGhpc3RvZ3JhbSArIHN0YXRlIGFwcGxpY2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbWFnZU1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJyA9ICdyZ2InO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyB0aGF0IG93bnMgdGhlIHBlci1jaGFubmVsIGxheWVyIHNldCAoYnVpbGQgKyBsaXZlIGRpc3BsYXlcbiAgICogIHVwZGF0ZXMpIGZvciB0aGUgY3VycmVudCB7QGxpbmsgaW1hZ2VNb2RlfS4gUmVidWlsdCBvbiBlYWNoIChyZSlyZW5kZXIuICovXG4gIHByaXZhdGUgY2hhbm5lbFZpZXc6IE11bHRpQ2hhbm5lbEltYWdlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogTGl2ZSBzdWJzY3JpcHRpb24gYXBwbHlpbmcgY2hhbm5lbC1zdGF0ZSAvIGNvbG9ybWFwIGNoYW5nZXMgdG8gdGhlIGxheWVycy4gKi9cbiAgcHJpdmF0ZSBkaXNwbGF5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCBncmF5c2NhbGUgY29sb3JtYXAgc2VsZWN0aW9uIGZyb20gdGhlIHN0b3JlIChhcHBsaWVkIHRvIHRoZSBzaW5nbGUgZ3JheSBsYXllcikuICovXG4gIHByaXZhdGUgY3VycmVudENvbG9ybWFwOiBDb2xvcm1hcE5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UmV2ZXJzZSA9IGZhbHNlO1xuICAvKiogTGF0ZXN0IGludmVydCB0b2dnbGUgZnJvbSB0aGUgc3RvcmUgKGZsaXBzIGludGVuc2l0eSBiZWZvcmUgdGhlIGNvbG9ybWFwLCBsaWtlIE9TRCkuICovXG4gIHByaXZhdGUgaW52ZXJ0RW5hYmxlZCA9IGZhbHNlO1xuICAvKiogUGh5c2ljYWwgc2NhbGUgYmFyIG92ZXJsYXkgZm9yIHRoZSAyRCBpbWFnZSAobnVsbCB3aGVuIDNEIG9yIHRoZSBpbWFnZSBoYXMgbm8gwrVtL3BpeGVsKS4gKi9cbiAgcHJpdmF0ZSBzY2FsZUJhcjogTmFwYXJpU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IGZvciB0aGUgMkQgaW1hZ2UgKG51bGwgdW50aWwgYSAyRCBpbWFnZSBpcyBwbG90dGVkKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25PdmVybGF5OiBOYXBhcmlSZWdpb25PdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQaXhlbC10b29sIHBsdW1iaW5nOiB0aGUgcGxvdCBkaXYgaWQsIGNvb3JkIHRyYW5zZm9ybSwgYW5kIGJvdW5kIHRvb2wgaG9zdHMuICovXG4gIHByaXZhdGUgcGxvdERpdklkID0gJyc7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3Q6IFdhbmRUb29sSG9zdCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVyYXNlckhvc3Q6IFZlcnRleEVyYXNlclRvb2xIb3N0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWaXNpYmxlIHdvcmxkIHJlY3QgY2FwdHVyZWQgQVQgdGhlIGxhc3QgcmVhZGJhY2sg4oCUIG11c3QgcGFpciB3aXRoIGBsYXN0UGl4ZWxzYCBzbyB0aGUgcGl4ZWxcbiAgICogIHRvb2xzJyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZSBtYXRyaXgncyBjYW1lcmEgKHVzaW5nIHRoZSBsaXZlIHJlY3QgYWZ0ZXIgYSBwYW4vem9vbSB3b3VsZFxuICAgKiAgbWlzLXNjYWxlIHRoZSByZWdpb24pLiAqL1xuICBwcml2YXRlIGxhc3RQaXhlbHNSZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbWFnZSBzbW9vdGhpbmcgKGJpbGluZWFyKSB2cyBuZWFyZXN0LW5laWdoYm91ciAoY3Jpc3AgcGl4ZWxzLCB0aGUgZGVmYXVsdCkuICovXG4gIHByaXZhdGUgaW1hZ2VTbW9vdGhpbmcgPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hlbiB0aGUgMkQgaW1hZ2UgaXMgcmVuZGVyZWQgdmlhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZXMgKGRlc2NyaXB0b3IgYXZhaWxhYmxlKS4gKi9cbiAgcHJpdmF0ZSB0aWxlZCA9IGZhbHNlO1xuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIHRpbWVyICsgY2FtZXJhLWNoYW5nZSB1bnN1YnNjcmliZSAoa2VlcCBsYXN0UGl4ZWxzIGN1cnJlbnQgZm9yIHRvb2xzKS4gKi9cbiAgcHJpdmF0ZSByZWFkYmFja1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYVJlYWRiYWNrT2ZmOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqIENvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIChrZXllZCBieSBjaGFubmVsIGluZGV4KSBmb3IgdGhlIGhpc3RvZ3JhbSBpbiB0aWxlZCBtb2RlLFxuICAgKiAgd2hlcmUgdGhlIGxheWVycyBoYXZlIG5vIGZ1bGwgaW4tbWVtb3J5IHBpeGVscy4gUmVmcmVzaGVkIG9uIHBsb3QgKyBzbGljZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdFNhbXBsZXMgPSBuZXcgTWFwPG51bWJlciwgVWludDhBcnJheT4oKTtcbiAgLyoqIE5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtcyBmcm9tIGAvaGlzdG9ncmFtYCwga2V5ZWQgYCR7en18JHtjaGFubmVsfWAgKD44LWJpdCBpbWFnZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSUhpc3RvZ3JhbT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmdQcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b3NjYWxlRXZlbnQkID0gbmV3IFN1YmplY3Q8dW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSBuZXcgU3ViamVjdDx7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSByZWFkb25seSB0aWxlczogVGlsZUFjY2Vzc1BvcnQsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJ1c2hUb29sOiBCcnVzaFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJhc2VyVG9vbDogVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0VMTF9TRUdNRU5URVIpIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlU3RhY2s6IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSxcbiAgICBASW5qZWN0KFZJWl9DT05GSUcpIGNvbmZpZzogVml6Q29uZmlnLFxuICApIHtcbiAgICBzdXBlcihyZWdpb25TdG9yZSwgc3RvcmUpO1xuICAgIHRoaXMuYXBpID0gY29uZmlnLnNsaWRlQ3JvcFNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCArIGNhY2hlIHRoZSBzZXJ2ZXIgcHlyYW1pZCBkZXNjcmlwdG9yIChgR0VUIC90aWxlcy9pbmZvYCk6IHRoZSBSRUFMIHBlci1sZXZlbCB0aWxlIGdyaWQsXG4gICAqIHRpbGUgc2l6ZSwgY2hhbm5lbCBtZXRhZGF0YSBhbmQgcGh5c2ljYWwgcGl4ZWwgc2l6ZS4gVGhlIGJhY2tlbmQgcmV0dXJucyAyMDIgd2hpbGUgdGhlIHNvdXJjZVxuICAgKiBpcyBzdGlsbCBjYWNoaW5nLCBzbyB3ZSBwb2xsIGJyaWVmbHkuIENhY2hlZCBwZXIgYGluZm9CNjRgOyByZXR1cm5zIG51bGwgaWYgaXQgbmV2ZXIgYmVjb21lc1xuICAgKiByZWFkeSAoY2FsbGVycyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUtdGlsZSBmZXRjaCkuIFRoaXMgaXMgdGhlIGF1dGhvcml0YXRpdmUgZ3JpZCDigJQgZ3Vlc3NpbmdcbiAgICogbGV2ZWwgZGltcyBmcm9tIGB0cnVlSW1hZ2VTaXplYCBvdmVyc2hvb3RzIHRoZSByZWFsIGdyaWQgYW5kIHRoZSBzZXJ2ZXIgNDAwcyBvdXQtb2YtcmFuZ2UgdGlsZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlc2NyaXB0b3IoKTogUHJvbWlzZTxUaWxlRGVzY3JpcHRvciB8IG51bGw+IHtcbiAgICAvLyBTZWxmLWNvbnRhaW5lZCBtdWx0aS1zbGljZSBzdGFjayAobm8gdGlsZSBzZXJ2ZXIg4oCUIGUuZy4gYSBudW1iZXJlZCBpbWFnZVxuICAgIC8vIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsIGVhY2ggc2xpY2UgYSBkaWZmZXJlbnQgZmlsZSk6IHRoZXJlIGlzIG5vXG4gICAgLy8gc2luZ2xlIHNlcnZlci10aWxlZCBweXJhbWlkIHRvIGRlc2NyaWJlLiBSZXR1cm5pbmcgbnVsbCByb3V0ZXMgZXZlcnlcbiAgICAvLyBjYWxsZXIgKDJEIGltYWdlLCB2b2x1bWUsIHN1cmZhY2UpIHRvIHRoZWlyIHN0aXRjaGVkL3NpbmdsZS1mZXRjaFxuICAgIC8vIGZhbGxiYWNrLCB3aGljaCDigJQgdmlhIGZldGNoU2xpY2UncyBvd24gU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIGJyYW5jaCDigJRcbiAgICAvLyBjb3JyZWN0bHkgZmV0Y2hlcyBlYWNoIHNsaWNlJ3Mgb3duIFVSTCBpbnN0ZWFkIG9mIG9uZSBmaXhlZCBmaWxlJ3MgdGlsZVxuICAgIC8vIHB5cmFtaWQuXG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUodGhpcy5sb2FkZWQ/LmltYWdlSW5mbykpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpO1xuICAgIGlmICghaW5mb0I2NCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRvciAmJiB0aGlzLmRlc2NyaXB0b3JLZXkgPT09IGluZm9CNjQpIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgREVTQ1JJUFRPUl9USU1FT1VUX01TO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3AuanNvbigpKSBhcyBUaWxlRGVzY3JpcHRvcjtcbiAgICAgICAgICBpZiAoYm9keT8ubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGJvZHk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3JLZXkgPSBpbmZvQjY0O1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiAoc3RpbGwgY2FjaGluZykgb3IgZW1wdHkgYm9keSDihpIgcmUtcG9sbCB1bnRpbCB0aGUgZGVhZGxpbmUuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRpbGVzL2luZm8gbm90IHJlYWR5OyBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlLXRpbGUgZmV0Y2gnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMjAwKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgQ09NUExFVEUgcmVuZGVyZWQgc2xpY2UgYXMgYW4gYEltYWdlQml0bWFwYCBieSBzdGl0Y2hpbmcgdGhlIHNlcnZlcidzIFJFQUwgdGlsZSBncmlkXG4gICAqIChmcm9tIGAvdGlsZXMvaW5mb2ApIOKAlCBub3QganVzdCB0aGUgdG9wLWxlZnQgdGlsZSwgd2hpY2ggb25seSBldmVyIHNob3dlZCBhIGxhcmdlIGltYWdlJ3NcbiAgICogY29ybmVyLiBQaWNrcyB0aGUgZmluZXN0IHB5cmFtaWQgbGV2ZWwgd2hvc2UgZ3JpZCBmaXRzIGBidWRnZXRUaWxlc2AgYW5kIHdob3NlIGxvbmdlc3Qgc2lkZSBpc1xuICAgKiB3aXRoaW4gdGhlIEdQVSB0ZXh0dXJlIGxpbWl0LCBmZXRjaGVzIHRoYXQgZ3JpZCBjb25jdXJyZW50bHksIGFuZCBzdGl0Y2hlcyBpdCBpbnRvIG9uZSBjYW52YXMuXG4gICAqXG4gICAqIGBjaGFubmVsYCBzZWxlY3RzIGEgc2luZ2xlIGJhbmQgYXMgZ3JheXNjYWxlIChyZWFsIGxldmVscyBvbmx5KTsgb21pdCBmb3IgdGhlIHNlcnZlciBjb21wb3NpdGUuXG4gICAqIGBidWRnZXRUaWxlc2AgY2FwcyB0aGUgZ3JpZDogdGhlIDJEIHZpZXcgdXNlcyB0aGUgZnVsbCBidWRnZXQgZm9yIGRldGFpbDsgdGhlIDNEIHZvbHVtZSBwYXNzZXNcbiAgICogMSBmb3IgYSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBzbGljZSAoaXQgZG93bnNhbXBsZXMgdG8ge0BsaW5rIFZPTFVNRV9NQVhfU0xJQ0V9KS4gRmFsbHMgYmFja1xuICAgKiB0byBhIHNpbmdsZSBgY29sPTAscm93PTBgIHRpbGUgd2hlbiBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSAoc21hbGwvc2ltcGxlIGltYWdlcywgdm9sdW1lcykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU2xpY2UoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM6IG51bWJlciA9IE1BWF9TVElUQ0hfVElMRVMsXG4gICAgLyoqIFdoZW4gYSBzcGVjaWZpYyBjaGFubmVsIGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiBgYnVkZ2V0VGlsZXNgLCBkcm9wIHRvIHRoZSBzZXJ2ZXJcbiAgICAgKiAgQ09NUE9TSVRFIG92ZXJ2aWV3IGluc3RlYWQgb2Ygc3RpdGNoaW5nIHRoZSBodWdlIHBlci1jaGFubmVsIGxldmVsLiBPbmx5IHNhZmUgd2hlbiB0aGUgY2FsbGVyXG4gICAgICogIHdhbnRzIGEgc2luZ2xlIGRlY2ltYXRlZCBwbGFuZSAodGhlIHN1cmZhY2UgaGVpZ2h0KTogZm9yIGEgbXVsdGljaGFubmVsIFZPTFVNRSBldmVyeSBjaGFubmVsXG4gICAgICogIHdvdWxkIHRoZW4gZmV0Y2ggdGhlIHNhbWUgY29tcG9zaXRlIGFuZCB0aGUgY2hhbm5lbHMgd291bGQgY29sbGFwc2UgaW50byBvbmUsIHNvIHZvbHVtZVxuICAgICAqICBhc3NlbWJseSBsZWF2ZXMgdGhpcyBgZmFsc2VgIHRvIGtlZXAgZWFjaCBiYW5kIGRpc3RpbmN0LiAqL1xuICAgIGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxJbWFnZUJpdG1hcD4ge1xuICAgIC8vIFNlbGYtY29udGFpbmVkIG11bHRpLXNsaWNlIHN0YWNrICh0aWxlZDpmYWxzZSk6IGB6YCBpbmRleGVzIGEgY29tcGxldGVseVxuICAgIC8vIGRpZmZlcmVudCBmaWxlJ3Mgb3duIHByZXZpZXcgVVJMLCBub3QgYW4gaW50ZXJuYWwgc2xpY2Ugb2Ygb25lIHNlcnZlci1cbiAgICAvLyB0aWxlZCBmaWxlIOKAlCByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChzaGFyZWRcbiAgICAvLyB3aXRoIE9TRDsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIGJhcmUgZmV0Y2goKSkgaW5zdGVhZCBvZlxuICAgIC8vIGJ1aWxkaW5nIGEgL3RpbGU/aW5mbz0uLi4mej0gcmVxdWVzdCBhZ2FpbnN0IHdoaWNoZXZlciBzaW5nbGUgZmlsZVxuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCgpIHBvaW50cyBhdCAod2hpY2ggd291bGQgNDAwL21pc21hdGNoIGZvciBhbnkgelxuICAgIC8vIGJleW9uZCB0aGF0IG9uZSBmaWxlJ3Mgb3duIGV4dGVudCkuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykpIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuc2ltcGxlU3RhY2sudXJsRm9yKGluZm8gYXMgSUltYWdlSW5mbywgeik7XG4gICAgICBpZiAoIXVybCkgdGhyb3cgbmV3IEVycm9yKGBbbmFwYXJpLWpzXSBubyBVUkwgZm9yIHNsaWNlICR7en1gKTtcbiAgICAgIHJldHVybiB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCaXRtYXAodXJsKTtcbiAgICB9XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIG5vIHNlbGVjdGVkIGltYWdlIGluZm8gKGdldFNlbGVjdGVkSW5mb0I2NCBudWxsKScpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuXG4gICAgLy8gVGhlIHJlcXVlc3RlZCBiYW5kOyBtYXkgYmUgZHJvcHBlZCB0byB0aGUgY29tcG9zaXRlICh1bmRlZmluZWQpIGJlbG93IHdoZW4gdGhlIGNoYW5uZWwgaGFzIG5vXG4gICAgLy8gcHlyYW1pZCBsZXZlbCBzbWFsbCBlbm91Z2ggdG8gc3RpdGNoIHdpdGhpbiBidWRnZXQuXG4gICAgbGV0IGVmZmVjdGl2ZUNoYW5uZWwgPSBjaGFubmVsO1xuICAgIGNvbnN0IGZldGNoVGlsZSA9IGFzeW5jIChcbiAgICAgIHJlczogbnVtYmVyLFxuICAgICAgY29sOiBudW1iZXIsXG4gICAgICByb3c6IG51bWJlcixcbiAgICAgIHQ6IG51bWJlcixcbiAgICApOiBQcm9taXNlPEltYWdlQml0bWFwPiA9PiB7XG4gICAgICBjb25zdCBjaCA9IGVmZmVjdGl2ZUNoYW5uZWwgPT0gbnVsbCA/ICcnIDogYCZjaGFubmVsPSR7ZWZmZWN0aXZlQ2hhbm5lbH1gO1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9dGlsZT9pbmZvPSR7aW5mb0I2NH0mcmVzPSR7cmVzfSZjb2w9JHtjb2x9JnJvdz0ke3Jvd30mej0ke3p9JnRpbGVTaXplPSR7dH0ke2NofWA7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbbmFwYXJpLWpzXSBzbGljZSBmZXRjaCBmYWlsZWQ6ICR7cmVzcC5zdGF0dXN9ICgke2NvbH0vJHtyb3d9IHJlcyAke3Jlc30pYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoYXdhaXQgcmVzcC5ibG9iKCkpO1xuICAgIH07XG5cbiAgICAvLyBObyBkZXNjcmlwdG9yIOKGkiBzaW5nbGUgdG9wLWxlZnQgdGlsZSAobGVnYWN5IGZhbGxiYWNrOyBjb3JyZWN0IGZvciBzbWFsbC9zaW1wbGUgaW1hZ2VzKS5cbiAgICBpZiAoIWRlc2MgfHwgIWRlc2MubGV2ZWxzPy5sZW5ndGgpIHJldHVybiBmZXRjaFRpbGUoMCwgMCwgMCwgVElMRV9TSVpFKTtcblxuICAgIGNvbnN0IHQgPSBkZXNjLnRpbGVTaXplIHx8IFRJTEVfU0laRTtcbiAgICAvLyBQZXItY2hhbm5lbCB0aWxlcyBleGlzdCBPTkxZIGF0IFJFQUwgQmlvLUZvcm1hdHMgbGV2ZWxzICh0aGUgZnJvbnQgb2YgYGxldmVsc2ApOyB0aGUgc2VydmVyXG4gICAgLy8gY29tcG9zaXRlIGV4aXN0cyBhdCBldmVyeSBsZXZlbCwgaW5jbHVkaW5nIHRoZSBzbWFsbCBvdmVydmlld3MuXG4gICAgY29uc3QgcGVyQ2hhbm5lbExldmVscyA9IGRlc2MucmVhbExldmVscyA/PyBkZXNjLmxldmVscy5sZW5ndGg7XG4gICAgY29uc3QgdXNhYmxlID1cbiAgICAgIGNoYW5uZWwgPT0gbnVsbCA/IGRlc2MubGV2ZWxzIDogZGVzYy5sZXZlbHMuc2xpY2UoMCwgTWF0aC5tYXgoMSwgcGVyQ2hhbm5lbExldmVscykpO1xuXG4gICAgLy8gRmluZXN0IGxldmVsIHdob3NlIHN0aXRjaGVkIGdyaWQgZml0cyBCT1RIIHRoZSB0aWxlIGJ1ZGdldCBhbmQgdGhlIEdQVSB0ZXh0dXJlIGxpbWl0OyBpZiBub25lXG4gICAgLy8gZml0cywgdGhlIGNvYXJzZXN0IGF2YWlsYWJsZSAoZml0cz1mYWxzZSkuXG4gICAgY29uc3QgdGlsZXNGb3IgPSAobHZsOiBUaWxlTGV2ZWwpOiBudW1iZXIgPT5cbiAgICAgIE1hdGgubWF4KDEsIE1hdGguY2VpbChsdmwud2lkdGggLyB0KSkgKiBNYXRoLm1heCgxLCBNYXRoLmNlaWwobHZsLmhlaWdodCAvIHQpKTtcbiAgICBjb25zdCBwaWNrID0gKGxldmVsczogVGlsZUxldmVsW10pOiB7IGx2bDogVGlsZUxldmVsOyBmaXRzOiBib29sZWFuIH0gPT4ge1xuICAgICAgbGV0IGMgPSBsZXZlbHNbMF07XG4gICAgICBmb3IgKGNvbnN0IGx2bCBvZiBsZXZlbHMpIHtcbiAgICAgICAgYyA9IGx2bDtcbiAgICAgICAgaWYgKHRpbGVzRm9yKGx2bCkgPD0gYnVkZ2V0VGlsZXMgJiYgTWF0aC5tYXgobHZsLndpZHRoLCBsdmwuaGVpZ2h0KSA8PSBNQVhfVEVYVFVSRV9ESU0pIHtcbiAgICAgICAgICByZXR1cm4geyBsdmwsIGZpdHM6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbHZsOiBjLCBmaXRzOiBmYWxzZSB9O1xuICAgIH07XG5cbiAgICBsZXQgc2VsID0gcGljayh1c2FibGUpO1xuICAgIC8vIEEgc3BlY2lmaWMgY2hhbm5lbCBvbmx5IGhhcyB0aWxlcyBhdCB0aGUgKGZldywgbGFyZ2UpIHJlYWwgbGV2ZWxzLiBXaGVuIG5vbmUgb2YgdGhlbSBmaXQgdGhlXG4gICAgLy8gYnVkZ2V0IOKAlCBlLmcuIHRoZSBjb2Fyc2VzdCByZWFsIGxldmVsIGlzIHN0aWxsIDE0OTgyw5cxODY3MCDihpIgfjExMDAgZnVsbC1yZXMgdGlsZXMg4oCUIHN0aXRjaGluZ1xuICAgIC8vIGl0IHBlciBzbGljZSBmbG9vZHMgdGhlIHNlcnZlciAoNTA0cykgYW5kIHN0YWxscyB0aGUgbG9hZC4gVGhlIGNvbXBvc2l0ZSBweXJhbWlkIGhhcyBzbWFsbFxuICAgIC8vIG92ZXJ2aWV3IGxldmVscywgc28gZmV0Y2ggdGhlIGNvbXBvc2l0ZSBpbnN0ZWFkIGFuZCBkZXJpdmUgbHVtaW5hbmNlIGZyb20gaXQuIEV2ZXJ5IGNhbGxlciBoZXJlXG4gICAgLy8gKHN1cmZhY2UgaGVpZ2h0LCB2b2x1bWUgYXNzZW1ibHksIHJlYWRiYWNrKSBkb3duc2NhbGVzIHRoZSBwbGFuZSBhbnl3YXksIHNvIGEgY29tcG9zaXRlLWRlcml2ZWRcbiAgICAvLyBwbGFuZSBpcyB0aGUgcmlnaHQgdHJhZGUgZm9yIG9uZSB0aGF0IGFjdHVhbGx5IGxvYWRzLiBPbmx5IGtpY2tzIGluIHdoZW4gdGhlIGNoYW5uZWwgY2FuJ3QgZml0LlxuICAgIGlmIChhbGxvd0NvbXBvc2l0ZUZhbGxiYWNrICYmICFzZWwuZml0cyAmJiBjaGFubmVsICE9IG51bGwgJiYgZGVzYy5sZXZlbHMubGVuZ3RoID4gcGVyQ2hhbm5lbExldmVscykge1xuICAgICAgY29uc3QgY29tcG9zaXRlID0gcGljayhkZXNjLmxldmVscyk7XG4gICAgICBpZiAoY29tcG9zaXRlLmZpdHMgfHwgdGlsZXNGb3IoY29tcG9zaXRlLmx2bCkgPCB0aWxlc0ZvcihzZWwubHZsKSkge1xuICAgICAgICBlZmZlY3RpdmVDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgICAgICBzZWwgPSBjb21wb3NpdGU7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW25hcGFyaS1qc10gY2hhbm5lbCAke2NoYW5uZWx9IGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiB0aGUgJHtidWRnZXRUaWxlc30tdGlsZSBgICtcbiAgICAgICAgICAgIGBidWRnZXQ7IHVzaW5nIHRoZSBjb21wb3NpdGUgb3ZlcnZpZXcgKHJlcyAke3NlbC5sdmwucmVzfSwgJHtzZWwubHZsLndpZHRofcOXYCArXG4gICAgICAgICAgICBgJHtzZWwubHZsLmhlaWdodH0pIGZvciB0aGlzIHBsYW5lLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNob3NlbiA9IHNlbC5sdmw7XG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjaG9zZW4ud2lkdGggLyB0KSk7XG4gICAgY29uc3Qgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjaG9zZW4uaGVpZ2h0IC8gdCkpO1xuICAgIGlmICghc2VsLmZpdHMgJiYgYnVkZ2V0VGlsZXMgPT09IE1BWF9TVElUQ0hfVElMRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtuYXBhcmktanNdIGZ1bGwgcmVzb2x1dGlvbiBleGNlZWRzIHRoZSAke2J1ZGdldFRpbGVzfS10aWxlLyR7TUFYX1RFWFRVUkVfRElNfXB4IGJ1ZGdldDsgYCArXG4gICAgICAgICAgYGRpc3BsYXlpbmcgb3ZlcnZpZXcgbGV2ZWwgcmVzICR7Y2hvc2VuLnJlc30gKCR7Y2hvc2VuLndpZHRofcOXJHtjaG9zZW4uaGVpZ2h0fSkuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbHMgPT09IDEgJiYgcm93cyA9PT0gMSkgcmV0dXJuIGZldGNoVGlsZShjaG9zZW4ucmVzLCAwLCAwLCB0KTtcblxuICAgIC8vIFN0aXRjaCBpbnRvIG9uZSBsZXZlbC1zaXplZCBjYW52YXMuIEZldGNoIHRoZSBncmlkIHdpdGggQk9VTkRFRCBjb25jdXJyZW5jeTogZmlyaW5nIGV2ZXJ5IHRpbGVcbiAgICAvLyBhdCBvbmNlIChhIGJpZyBncmlkID0gaHVuZHJlZHMgb2YgcmVxdWVzdHMpIG92ZXJ3aGVsbWVkIHRoZSB0aWxlIHNlcnZlciAoNTA0cykuIEVkZ2UgdGlsZXMgYXJlXG4gICAgLy8gbmFycm93ZXIvc2hvcnRlcjsgZHJhd0ltYWdlIHBsYWNlcyBlYWNoIGF0IGl0cyBncmlkIG9mZnNldCBzbyBwYXJ0aWFsIHRpbGVzIGxpbmUgdXAuXG4gICAgY29uc3QgY29vcmRzOiBBcnJheTx7IGNvbDogbnVtYmVyOyByb3c6IG51bWJlciB9PiA9IFtdO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykgY29vcmRzLnB1c2goeyBjb2wsIHJvdyB9KTtcbiAgICB9XG4gICAgY29uc3QgdGlsZXM6IEFycmF5PHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyOyBibXA6IEltYWdlQml0bWFwIH0+ID0gW107XG4gICAgY29uc3Qgc3RpdGNoV29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBqb2IgPSBjb29yZHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFqb2IpIHJldHVybjtcbiAgICAgICAgY29uc3QgYm1wID0gYXdhaXQgZmV0Y2hUaWxlKGNob3Nlbi5yZXMsIGpvYi5jb2wsIGpvYi5yb3csIHQpO1xuICAgICAgICB0aWxlcy5wdXNoKHsgY29sOiBqb2IuY29sLCByb3c6IGpvYi5yb3csIGJtcCB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5taW4oVElMRV9GRVRDSF9DT05DVVJSRU5DWSwgY29vcmRzLmxlbmd0aCkgfSwgKCkgPT4gc3RpdGNoV29ya2VyKCkpLFxuICAgICk7XG5cbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoY2hvc2VuLndpZHRoLCBjaG9zZW4uaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjYW52YXMud2lkdGggPSBjaG9zZW4ud2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gY2hvc2VuLmhlaWdodDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXNcbiAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgfCBudWxsO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIHNsaWNlIHN0aXRjaDogMkQgY29udGV4dCB1bmF2YWlsYWJsZScpO1xuICAgIGZvciAoY29uc3QgeyBjb2wsIHJvdywgYm1wIH0gb2YgdGlsZXMpIHtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCBjb2wgKiB0LCByb3cgKiB0KTtcbiAgICAgIGJtcC5jbG9zZT8uKCk7XG4gICAgfVxuXG4gICAgLy8gU2FmZXR5IG5ldDogaWYgdGhlIGNob3NlbiBsZXZlbCBzdGlsbCBleGNlZWRzIHRoZSBHUFUgdGV4dHVyZSBsaW1pdCAoZS5nLiBhIG11bHRpY2hhbm5lbFxuICAgIC8vIGltYWdlIHdob3NlIGNvYXJzZXN0IFJFQUwgbGV2ZWwgaXMgaHVnZSDigJQgb3ZlcnZpZXcgbGV2ZWxzIGFyZSBjb21wb3NpdGUtb25seSksIGRvd25zY2FsZSB0aGVcbiAgICAvLyBzdGl0Y2hlZCBjYW52YXMgdG8gZml0IHNvIHRoZSBXZWJHUFUgdGV4dHVyZSB1cGxvYWQgY2FuJ3QgZmFpbC5cbiAgICBjb25zdCBsb25nZXN0ID0gTWF0aC5tYXgoY2hvc2VuLndpZHRoLCBjaG9zZW4uaGVpZ2h0KTtcbiAgICBpZiAobG9uZ2VzdCA+IE1BWF9URVhUVVJFX0RJTSkge1xuICAgICAgY29uc3Qgc2NhbGUgPSBNQVhfVEVYVFVSRV9ESU0gLyBsb25nZXN0O1xuICAgICAgY29uc3Qgb3V0VyA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoY2hvc2VuLndpZHRoICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IG91dEggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGNob3Nlbi5oZWlnaHQgKiBzY2FsZSkpO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gc3RpdGNoZWQgbGV2ZWwgJHtjaG9zZW4ud2lkdGh9w5cke2Nob3Nlbi5oZWlnaHR9IGV4Y2VlZHMgdGhlIGAgK1xuICAgICAgICAgIGAke01BWF9URVhUVVJFX0RJTX1weCB0ZXh0dXJlIGxpbWl0OyBkb3duc2NhbGluZyB0byAke291dFd9w5cke291dEh9LmAsXG4gICAgICApO1xuICAgICAgbGV0IG91dDogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb3V0ID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhvdXRXLCBvdXRIKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBvdXQud2lkdGggPSBvdXRXO1xuICAgICAgICBvdXQuaGVpZ2h0ID0gb3V0SDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9jdHggPSBvdXQuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgICB8IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IG51bGw7XG4gICAgICBpZiAoIW9jdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gc2xpY2UgZG93bnNjYWxlOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgICBvY3R4LmRyYXdJbWFnZShjYW52YXMgYXMgdW5rbm93biBhcyBDYW52YXNJbWFnZVNvdXJjZSwgMCwgMCwgb3V0Vywgb3V0SCk7XG4gICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAob3V0IGFzIHVua25vd24gYXMgSW1hZ2VCaXRtYXBTb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoY2FudmFzIGFzIHVua25vd24gYXMgSW1hZ2VCaXRtYXBTb3VyY2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElEYXRhUmVuZGVyZXI6IGxvYWQgLyByZW5kZXIgLyB2aWV3cG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxOYXBhcmlMb2FkZWQ+IHtcbiAgICAvLyBLZWVwcyBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UncyBibG9iIGNhY2hlIGluIHN5bmMgZXZlbiB3aGVuIHRoZSB1c2VyXG4gICAgLy8gc3dpdGNoZXMgYmFja2VuZHMgKGUuZy4gT1NEIEltYWdlIOKGkiBuYXBhcmkgVm9sdW1lKSBvbiB0aGUgc2FtZSBmaWxlIOKAlFxuICAgIC8vIHdoaWNoZXZlciBiYWNrZW5kIGxvYWRzIGEgZ2VudWluZWx5IGRpZmZlcmVudCBmaWxlIGZpcnN0IGV2aWN0cyBpdC5cbiAgICB0aGlzLnNpbXBsZVN0YWNrLm5vdGVBY3RpdmVGaWxlKGltYWdlSW5mby5maWxlTmFtZSk7XG4gICAgdGhpcy5sb2FkZWQgPSB7IGltYWdlSW5mbywgejogekluZGV4LCBmaWxlbmFtZTogaW1hZ2VJbmZvLmZpbGVOYW1lIH07XG4gICAgcmV0dXJuIHRoaXMubG9hZGVkO1xuICB9XG5cbiAgYXN5bmMgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IHVua25vd24sXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIHBsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBfaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwbG90RGl2KTtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtuYXBhcmktanNdIHBsb3QgdGFyZ2V0ICMke3Bsb3REaXZ9IG5vdCBmb3VuZGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICB0aGlzLnBsb3REaXZJZCA9IHBsb3REaXY7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcblxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IHNjcmVlbkhlaWdodCA/IGAke3NjcmVlbkhlaWdodH1weGAgOiAnMTAwJSc7XG4gICAgaG9zdC5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuXG4gICAgY29uc3QgaW5mbyA9IChpbWFnZUxvYWRlZCBhcyBOYXBhcmlMb2FkZWQpPy5pbWFnZUluZm8gPz8gaW1hZ2VJbmZvO1xuICAgIGNvbnN0IHogPSAoaW1hZ2VMb2FkZWQgYXMgTmFwYXJpTG9hZGVkKT8ueiA/PyAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZpZXdlciA9IG5ldyBWaWV3ZXIoeyBjYW52YXMsIGJhY2tncm91bmQ6IHsgcjogMC4wNywgZzogMC4wNywgYjogMC4wOSwgYTogMSB9IH0pO1xuICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7XG4gICAgICBhd2FpdCB2aWV3ZXIucmVhZHk7XG5cbiAgICAgIGlmIChpc05hcGFyaVNjYXR0ZXIocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTY2F0dGVyKHZpZXdlciwgeik7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpU2NhdHRlcjNkKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U2NhdHRlcjNkKHZpZXdlciwgaW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpU3VyZmFjZShwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFN1cmZhY2Uodmlld2VyKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmkzZChwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFZvbHVtZSh2aWV3ZXIsIGluZm8sIHBsb3RUeXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2Uoeik7XG4gICAgICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZURpc3BsYXlTdGF0ZSgpO1xuICAgICAgICB0aGlzLmluc3RhbGxTY2FsZUJhcigpO1xuICAgICAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCB2aWV3ZXIsIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgICAgICB0aGlzLmJ1aWxkVG9vbEhvc3RzKCk7XG4gICAgICAgIC8vIEtlZXAgdGhlIHBpeGVsLXRvb2wgcmVhZGJhY2sgKGxhc3RQaXhlbHMpIGN1cnJlbnQgYXMgdGhlIHZpZXcgcGFucy96b29tcyBhbmQgdGlsZWRcbiAgICAgICAgLy8gbGV2ZWxzIGxvYWQsIHNvIHdhbmQvYnJ1c2gvU0FNIHNhbXBsZSB0aGUgYWN0dWFsbHktZGlzcGxheWVkIGltYWdlIChqaXQtdWkjMTAyKS5cbiAgICAgICAgdGhpcy5jYW1lcmFSZWFkYmFja09mZiA9IHZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMuYXJtUmVhZGJhY2soKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gcGxvdCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQ2hhbm5lbHM6IHBlci1jaGFubmVsIGNvbXBvc2l0ZSwgTFVULCBuYXRpdmUgaGlzdG9ncmFtcyAoaml0LXVpIzEwMikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRoZSBncmF5c2NhbGUgZGlzcGxheSBjb2xvcm1hcCBmcm9tIHRoZSBzdG9yZSBzZWxlY3Rpb24gKCtyZXZlcnNlKSwgZGVmYXVsdGluZyB0byBncmF5LlxuICAgKiAgTWFwcyB0aGUgaml0LXVpIHN0b3JlIGNvbG9ybWFwIG5vZGUgdG8gYSBuYXBhcmkgYENvbG9ybWFwYCB2aWEgdGhlIGxpYnJhcnkncyBMVVQgZmFjdG9yeTtcbiAgICogIHRoZSBtdWx0aWNoYW5uZWwgdGludCByYW1wcyBhcmUgYnVpbHQgaW5zaWRlIHtAbGluayBNdWx0aUNoYW5uZWxJbWFnZVZpZXd9IGZyb20gZWFjaFxuICAgKiAgY2hhbm5lbCdzIGhleCBjb2xvdXIuICovXG4gIHByaXZhdGUgZ3JheXNjYWxlQ29sb3JtYXAoKTogQ29sb3JtYXAgfCBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGwpPy5kYXRhPy52YWx1ZTtcbiAgICBjb25zdCBsdXQgPSB2YWx1ZSAhPSBudWxsID8gYnVpbGRDb2xvcm1hcEx1dCh2YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSkgOiBudWxsO1xuICAgIGlmIChsdXQpIHJldHVybiBjb2xvcm1hcEZyb21MdXQoJ2dyYXktY21hcCcsIGx1dCk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFJldmVyc2VcbiAgICAgID8gY29sb3JtYXBGcm9tTHV0KCdncmF5LXJldicsIFtbMjU1LCAyNTUsIDI1NV0sIFswLCAwLCAwXV0gYXMgUmdiW10pXG4gICAgICA6ICdncmF5JztcbiAgfVxuXG4gIC8qKiBGZXRjaCBhIHN0aXRjaGVkIHNsaWNlIGFuZCByZWFkIGl0IGJhY2sgYXMgYSBzaW5nbGUtY2hhbm5lbCB1aW50OCBwbGFuZS4gYGNoYW5uZWxgIHNlbGVjdHMgYVxuICAgKiAgYmFuZCAobXVsdGljaGFubmVsKTsgb21pdCBpdCBmb3IgdGhlIGdyYXlzY2FsZSBjb21wb3NpdGUgKGFsbCBvdmVydmlldyBsZXZlbHMgYXZhaWxhYmxlLCBzbyBhXG4gICAqICBsYXJnZSBpbWFnZSBwaWNrcyBhIGZpdHRpbmcgZG93bnNjYWxlZCBsZXZlbCByYXRoZXIgdGhhbiBvbmx5IHRoZSBmdWxsLXJlcyByZWFsIGxldmVsKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENoYW5uZWxEYXRhKFxuICAgIHo6IG51bWJlcixcbiAgICBjaGFubmVsPzogbnVtYmVyLFxuICAgIGJ1ZGdldFRpbGVzPzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJtcCA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCBjaGFubmVsLCBidWRnZXRUaWxlcyk7XG4gICAgcmV0dXJuIHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYm1wKTtcbiAgfVxuXG4gIC8qKiBEZWNvZGUgYW4gYEltYWdlQml0bWFwYCAoc2VydmVyIGJhbmRzIGFyZSBncmF5c2NhbGUsIFI9Rz1CKSB0byBhIHNpbmdsZS1jaGFubmVsIHVpbnQ4IHBsYW5lLlxuICAgKiAgYG1heFNpZGVgIGNhcHMgdGhlIGxvbmdlc3Qgc2lkZSAoZG93bnNjYWxpbmcgb24gdGhlIGNhbnZhcyBkcmF3KSDigJQgdXNlZCB0byBrZWVwIHByZS1sb2FkZWRcbiAgICogIHN1cmZhY2Ugc2xpY2UgcGxhbmVzIHNtYWxsLiAqL1xuICBwcml2YXRlIGJpdG1hcFRvTHVtaW5hbmNlKFxuICAgIGJtcDogSW1hZ2VCaXRtYXAsXG4gICAgbWF4U2lkZT86IG51bWJlcixcbiAgKTogeyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBzY2FsZSA9IG1heFNpZGUgPyBNYXRoLm1pbigxLCBtYXhTaWRlIC8gTWF0aC5tYXgoYm1wLndpZHRoLCBibXAuaGVpZ2h0LCAxKSkgOiAxO1xuICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJtcC53aWR0aCAqIHNjYWxlKSk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoYm1wLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgaWYgKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHcsIGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHc7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXNcbiAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgfCBudWxsO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIGNoYW5uZWwgcmVhZGJhY2s6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcbiAgICAvLyBTY2FsZSB0aGUgV0hPTEUgYml0bWFwIGludG8gdGhlIChwb3NzaWJseSBzbWFsbGVyKSB0YXJnZXQgY2FudmFzIOKAlCBkcmF3aW5nIGF0IG5hdHVyYWwgc2l6ZVxuICAgIC8vIHdvdWxkIGNyb3AgdG8gdGhlIHRvcC1sZWZ0IHfDl2ggY29ybmVyIHdoZW4gZG93bnNjYWxpbmcgYSBsYXJnZSBzbGljZSAobWF4U2lkZSA8IGJtcCBzaXplKS5cbiAgICBjdHguZHJhd0ltYWdlKGJtcCwgMCwgMCwgdywgaCk7XG4gICAgYm1wLmNsb3NlPy4oKTtcbiAgICBjb25zdCByZ2JhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhO1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3ICogaCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3ICogaDsgaSsrKSBkYXRhW2ldID0gcmdiYVtpICogNF07XG4gICAgcmV0dXJuIHsgZGF0YSwgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgMkQgaW1hZ2UgZm9yIHNsaWNlIGB6YC4gV2l0aCBhIHNlcnZlciBweXJhbWlkIGRlc2NyaXB0b3Igd2UgdXNlIGEgcHlyYW1pZGFsXG4gICAqIHtAbGluayBUaWxlZFNvdXJjZX0gcGVyIGxheWVyIHNvIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb24gb24gem9vbSAobGlrZSBPU0QpIGFuZFxuICAgKiBzaXRzIG5hdHVyYWxseSBpbiBmdWxsLXJlc29sdXRpb24gY29vcmRpbmF0ZXM7IHdpdGhvdXQgb25lIHdlIGZhbGwgYmFjayB0byB0aGUgc2luZ2xlLWxldmVsXG4gICAqIHN0aXRjaC4gVGhyZWUgZGlzcGxheSBtb2RlcyBlaXRoZXIgd2F5OiBtdWx0aWNoYW5uZWwgYWRkaXRpdmUgdGludCwgZ3JheXNjYWxlIGNvbG9ybWFwLCBSR0IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlKHo6IG51bWJlciwgdG9rZW4/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGlmIChkZXNjICYmIGRlc2MubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgIGlmICh0b2tlbiAhPSBudWxsICYmIHRva2VuICE9PSB0aGlzLnNsaWNlUmVxKSByZXR1cm47XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlVGlsZWQoeiwgZGVzYyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbmRlckltYWdlU3RpdGNoZWQoeiwgdG9rZW4pO1xuICB9XG5cbiAgLyoqIFNpbmdsZS1sZXZlbCBzdGl0Y2ggZmFsbGJhY2sgKG5vIGRlc2NyaXB0b3IpOiB0aGUgcHJlLXRpbGluZyBwYXRoLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlU3RpdGNoZWQoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2M/LmNoYW5uZWxzID8/IChzdGF0ZXMubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9ICEhZGVzYz8ubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG5cbiAgICAvLyAxKSBGZXRjaCBhbGwgcGl4ZWwgZGF0YSBCRUZPUkUgdG91Y2hpbmcgdGhlIHZpZXdlciwgc28gYSBzdXBlcnNlZGVkIHNjcnViIGNhbiBiYWlsIHdpdGhvdXRcbiAgICAvLyAgICBoYXZpbmcgdG9ybiBkb3duIHRoZSB2aXNpYmxlIGxheWVycyAoYXZvaWRzIGZsaWNrZXIgLyBvdXQtb2Ytb3JkZXIgbGF5ZXIgc3RhdGUpLlxuICAgIGxldCBtb2RlOiAnZ3JheXNjYWxlJyB8ICdtdWx0aWNoYW5uZWwnIHwgJ3JnYic7XG4gICAgbGV0IHBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCBiaXRtYXA6IEltYWdlQml0bWFwIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgbW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgcGxhbmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGNoYW5uZWxDb3VudCB9LCAoXywgYykgPT4gdGhpcy5mZXRjaENoYW5uZWxEYXRhKHosIGMpKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDEpIHtcbiAgICAgIG1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICAgIC8vIENvbXBvc2l0ZSBmZXRjaCAobm8gY2hhbm5lbCkg4oaSIGFsbCBvdmVydmlldyBsZXZlbHMgdXNhYmxlLCBzbyBhIGxhcmdlIGdyYXlzY2FsZSBpbWFnZVxuICAgICAgLy8gc2VsZWN0cyBhIGZpdHRpbmcgZG93bnNjYWxlZCBsZXZlbCBpbnN0ZWFkIG9mIHRoZSBmdWxsLXJlcyByZWFsIGxldmVsICh0ZXh0dXJlIGxpbWl0KS5cbiAgICAgIHBsYW5lcyA9IFthd2FpdCB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeildO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RlID0gJ3JnYic7XG4gICAgICBiaXRtYXAgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2Uoeik7XG4gICAgfVxuXG4gICAgLy8gMikgQ29tbWl0IOKAlCB1bmxlc3MgYSBuZXdlciBzY3J1YiBzdXBlcnNlZGVkIHVzIG9yIHRoZSB2aWV3ZXIgd2FzIHRvcm4gZG93bi5cbiAgICBpZiAoKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHx8IHRoaXMudmlld2VyICE9PSB2KSB7XG4gICAgICBiaXRtYXA/LmNsb3NlPy4oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgZGlzcGxheWVkIHRleHR1cmUgbWF5IGJlIGEgZG93bnNjYWxlZCBweXJhbWlkIGxldmVsOyBzY2FsZSB0aGUgbGF5ZXIgaW50byBGVUxMLVJFU09MVVRJT05cbiAgICAvLyB3b3JsZCBjb29yZGluYXRlcyAobGV2ZWwtMCBwaXhlbHMpIHNvIHRoZSBjYW1lcmEsIHJlYWRiYWNrIGFuZCDigJQgY3JpdGljYWxseSDigJQgcHJlLXNhdmVkXG4gICAgLy8gcmVnaW9ucyAoc3RvcmVkIGluIGZ1bGwtcmVzIGNvb3JkcywgZS5nLiBuZHBpKSBhbGwgbGluZSB1cCByZWdhcmRsZXNzIG9mIHdoaWNoIGxldmVsIGlzIHNob3duLlxuICAgIC8vIFRoaXMgbWlycm9ycyBPU0QsIHdob3NlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGFsd2F5cyBsZXZlbCAwLlxuICAgIGNvbnN0IHRleFcgPSBtb2RlID09PSAncmdiJyA/IChiaXRtYXAgYXMgSW1hZ2VCaXRtYXApLndpZHRoIDogcGxhbmVzWzBdPy53aWR0aCA/PyAwO1xuICAgIGNvbnN0IHRleEggPSBtb2RlID09PSAncmdiJyA/IChiaXRtYXAgYXMgSW1hZ2VCaXRtYXApLmhlaWdodCA6IHBsYW5lc1swXT8uaGVpZ2h0ID8/IDA7XG4gICAgY29uc3QgZnVsbFcgPSBkZXNjPy53aWR0aCB8fCB0ZXhXIHx8IDE7XG4gICAgY29uc3QgZnVsbEggPSBkZXNjPy5oZWlnaHQgfHwgdGV4SCB8fCAxO1xuICAgIGNvbnN0IHNjYWxlOiBbbnVtYmVyLCBudW1iZXJdID0gW3RleFcgPyBmdWxsVyAvIHRleFcgOiAxLCB0ZXhIID8gZnVsbEggLyB0ZXhIIDogMV07XG5cbiAgICB0aGlzLmltYWdlTW9kZSA9IG1vZGU7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSB0aGlzLmltYWdlU21vb3RoaW5nID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcodik7XG4gICAgaWYgKG1vZGUgPT09ICdtdWx0aWNoYW5uZWwnKSB7XG4gICAgICBjb25zdCB2aWV3czogQ2hhbm5lbFZpZXdbXSA9IHBsYW5lcy5tYXAoKGQsIGMpID0+IHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBkLndpZHRoLCBoZWlnaHQ6IGQuaGVpZ2h0LCBjaGFubmVsczogMSwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IGQuZGF0YSB9LFxuICAgICAgICAgIHRpbnQ6IGNvbG9yLFxuICAgICAgICAgIG5hbWU6IHN0Py5uYW1lID8/IGBjaCR7Y31gLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2dyYXlzY2FsZScpIHtcbiAgICAgIGNvbnN0IGQgPSBwbGFuZXNbMF07XG4gICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKFxuICAgICAgICAnZ3JheXNjYWxlJyxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogeyBraW5kOiAndHlwZWQnLCB3aWR0aDogZC53aWR0aCwgaGVpZ2h0OiBkLmhlaWdodCwgY2hhbm5lbHM6IDEsIGR0eXBlOiAndWludDgnLCBkYXRhOiBkLmRhdGEgfSxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgICBzY2FsZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB7IGludGVycG9sYXRpb24gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdyZ2InLCBbeyBzb3VyY2U6IGJpdG1hcCBhcyBJbWFnZUJpdG1hcCwgc2NhbGUgfV0sIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZVcgPSBmdWxsVztcbiAgICB0aGlzLmltYWdlSCA9IGZ1bGxIO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgMkQgaW1hZ2Ugd2l0aCBweXJhbWlkYWwge0BsaW5rIFRpbGVkU291cmNlfXMg4oCUIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb25cbiAgICogYXMgeW91IHpvb20gaW4gKHRoZSB2aXN1YWwgZmV0Y2hlcyB0aGUgbGV2ZWwgd2hvc2UgdGV4ZWxzIOKJiCBzY3JlZW4gcGl4ZWxzKSBhbmQgc2l0cyBpbiBmdWxsLXJlc1xuICAgKiBjb29yZGluYXRlcyBzbyByZWdpb25zIGFsaWduLiBTYW1lIHRocmVlIG1vZGVzIGFzIHRoZSBzdGl0Y2ggcGF0aC4gUGVyLWNoYW5uZWwgbGF5ZXJzIHVzZSB0aGVcbiAgICogUkVBTCBweXJhbWlkIGxldmVscyAocGVyLWNoYW5uZWwgdGlsZXMgb25seSBleGlzdCB0aGVyZSk7IHRoZSBjb21wb3NpdGUgdXNlcyBhbGwgbGV2ZWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJJbWFnZVRpbGVkKHo6IG51bWJlciwgZGVzYzogVGlsZURlc2NyaXB0b3IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2MuY2hhbm5lbHMgPz8gKHN0YXRlcy5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gISFkZXNjLm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxO1xuICAgIGNvbnN0IGludGVycG9sYXRpb246ICdsaW5lYXInIHwgJ25lYXJlc3QnID0gdGhpcy5pbWFnZVNtb290aGluZyA/ICdsaW5lYXInIDogJ25lYXJlc3QnO1xuXG4gICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcodik7XG5cbiAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgY29uc3Qgdmlld3M6IENoYW5uZWxWaWV3W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2MuY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgdmlld3MucHVzaCh7XG4gICAgICAgICAgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgYywgMSksXG4gICAgICAgICAgdGludDogY29sb3IsXG4gICAgICAgICAgbmFtZTogc3Q/Lm5hbWUgPz8gYGNoJHtjfWAsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcignbXVsdGljaGFubmVsJywgdmlld3MsIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgdGhpcy5pbWFnZU1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoXG4gICAgICAgICdncmF5c2NhbGUnLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCAxKSxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgeyBpbnRlcnBvbGF0aW9uIH0sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdyZ2InO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ3JnYicsIFt7IHNvdXJjZTogdGhpcy5idWlsZFRpbGVkU291cmNlKGRlc2MsIHVuZGVmaW5lZCwgNCkgfV0sIHtcbiAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmltYWdlVyA9IGRlc2Mud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkZXNjLmhlaWdodDtcbiAgICAvLyBBd2FpdCBvbiB0aGUgaW5pdGlhbCByZW5kZXIgc28gZ2V0SGlzdG9ncmFtL2F1dG9Db250cmFzdCBoYXZlIGRhdGEgaW1tZWRpYXRlbHk7IHNsaWNlIGNoYW5nZXNcbiAgICAvLyByZWZyZXNoIGZpcmUtYW5kLWZvcmdldCAodGhlIGhpc3RvZ3JhbSBwYW5lIHJldHJpZXMpLlxuICAgIGF3YWl0IHRoaXMucmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXMoeiwgZGVzYyk7XG4gIH1cblxuICAvKiogQnVpbGQgYSBweXJhbWlkYWwgVGlsZWRTb3VyY2UgYmFja2VkIGJ5IHRoZSBzZXJ2ZXIgYC90aWxlYCBlbmRwb2ludC4gYGNoYW5uZWxgIHNlbGVjdHMgYSBiYW5kXG4gICAqICAoZ3JheXNjYWxlIGx1bWluYW5jZSwgcmVhbCBsZXZlbHMgb25seSk7IG9taXQgaXQgZm9yIHRoZSBjb21wb3NpdGUgKFJHQkEsIGFsbCBsZXZlbHMpLiAqL1xuICBwcml2YXRlIGJ1aWxkVGlsZWRTb3VyY2UoXG4gICAgZGVzYzogVGlsZURlc2NyaXB0b3IsXG4gICAgY2hhbm5lbDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGNoYW5uZWxzOiAxIHwgNCxcbiAgKTogVGlsZWRTb3VyY2Uge1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpID8/ICcnO1xuICAgIC8vIFBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgYXQgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbHM7IHRoZSBjb21wb3NpdGUgZXhpc3RzIGF0IGFsbCBsZXZlbHMuXG4gICAgY29uc3QgdXNhYmxlID1cbiAgICAgIGNoYW5uZWwgPT0gbnVsbFxuICAgICAgICA/IGRlc2MubGV2ZWxzXG4gICAgICAgIDogZGVzYy5sZXZlbHMuc2xpY2UoMCwgTWF0aC5tYXgoMSwgZGVzYy5yZWFsTGV2ZWxzID8/IGRlc2MubGV2ZWxzLmxlbmd0aCkpO1xuICAgIGNvbnN0IGxldmVsU2NhbGVzID0gdXNhYmxlLm1hcCgobCkgPT4gZGVzYy53aWR0aCAvIE1hdGgubWF4KDEsIGwud2lkdGgpKTsgLy8gbGV2ZWwtMCBweCBwZXIgbGV2ZWwgcHhcbiAgICBjb25zdCB0aWxlU2l6ZSA9IGRlc2MudGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIGNvbnN0IGNoID0gY2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtjaGFubmVsfWA7XG4gICAgY29uc3QgYXBpID0gdGhpcy5hcGk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICd0aWxlZCcsXG4gICAgICB3aWR0aDogZGVzYy53aWR0aCxcbiAgICAgIGhlaWdodDogZGVzYy5oZWlnaHQsXG4gICAgICB0aWxlU2l6ZSxcbiAgICAgIGxldmVsczogdXNhYmxlLmxlbmd0aCxcbiAgICAgIGxldmVsU2NhbGVzLFxuICAgICAgZGVwdGg6IE1hdGgubWF4KDEsIGRlc2MueiB8fCAxKSxcbiAgICAgIGNoYW5uZWxzLFxuICAgICAgZHR5cGU6ICd1aW50OCcsXG4gICAgICBmZXRjaFRpbGU6IGFzeW5jIChrZXk6IFRpbGVLZXkpOiBQcm9taXNlPFBpeGVsQ2h1bms+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gdXNhYmxlW2tleS5sZXZlbF0/LnJlcyA/PyBrZXkubGV2ZWw7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke2FwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2tleS5jb2x9JnJvdz0ke2tleS5yb3d9Jno9JHtrZXkuen0mdGlsZVNpemU9JHt0aWxlU2l6ZX0ke2NofWA7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIHRpbGUgJHtrZXkubGV2ZWx9LyR7a2V5LmNvbH0vJHtrZXkucm93fSDihpIgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSk7XG4gICAgICAgIGlmIChjaGFubmVscyA9PT0gNCkgcmV0dXJuIHsgd2lkdGg6IGJtcC53aWR0aCwgaGVpZ2h0OiBibXAuaGVpZ2h0LCBkYXRhOiBibXAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYm1wKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiAoUmUpZmV0Y2ggYSBjb2Fyc2UgcGVyLWNoYW5uZWwgbHVtaW5hbmNlIHNhbXBsZSBmb3IgdGhlIGhpc3RvZ3JhbSAodGlsZWQgbW9kZSBoYXMgbm8gZnVsbFxuICAgKiAgaW4tbWVtb3J5IHBpeGVscykuIE9uZSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBjaGFubmVsOyBjYWNoZWQgYnkgY2hhbm5lbCBpbmRleC4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6OiBudW1iZXIsIGRlc2M6IFRpbGVEZXNjcmlwdG9yKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ3JnYicpIHJldHVybjsgLy8gUkdCIHVzZXMgdGhlIGRpc3BsYXllZC1waXhlbCByZWFkYmFjayAocmdiSGlzdG9ncmFtKVxuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJyA/IGRlc2MuY2hhbm5lbHMgPz8gMSA6IDE7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmltYWdlTW9kZSA9PT0gJ211bHRpY2hhbm5lbCcgPyBjIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgdGhpcy5mZXRjaENoYW5uZWxEYXRhKHosIGNoLCAxKTsgLy8gYnVkZ2V0IDEg4oaSIGNvYXJzZXN0IHNpbmdsZSB0aWxlXG4gICAgICAgIHRoaXMuaGlzdFNhbXBsZXMuc2V0KGMsIGQuZGF0YSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbGVhdmUgdGhpcyBjaGFubmVsJ3Mgc2FtcGxlIHVuc2V0ICovXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFN1YnNjcmliZSBjaGFubmVsIHN0YXRlcyArIGdyYXlzY2FsZSBjb2xvcm1hcCDihpIgbGl2ZS1hcHBseSB0byB0aGUgcmVuZGVyZWQgbGF5ZXJzIChub1xuICAgKiAgcmUtZmV0Y2g7IG9ubHkgeiBjaGFuZ2VzIHJlLWZldGNoKS4gUmVwbGFjZXMgYW55IHByaW9yIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjaGFubmVscywgY29sb3JtYXAsIHJldmVyc2UsIGludmVydF0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgdGhpcy5hcHBseURpc3BsYXlTdGF0ZShjaGFubmVscyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIHRoZSBzdG9yZSBjb2xvcm1hcCAoK3JldmVyc2UpLCBpbnZlcnQsIGFuZCBjaGFubmVsIHN0YXRlIOKGkiB0aGUgdm9sdW1lL2lzb3N1cmZhY2VcbiAgICogIHRyYW5zZmVyIGZ1bmN0aW9uOiBjb2xvdXIgKGNoYW5uZWwgdGludCBvciBzZWxlY3RlZCBjb2xvcm1hcCksIHRoZSBpbnRlbnNpdHkgKip3aW5kb3dcbiAgICogIChtaW4vbWF4IOKGkiBjb250cmFzdExpbWl0cykqKiBhbmQgKipnYW1tYSoqLCBtaXJyb3JpbmcgdGhlIGdyYXlzY2FsZSBpbWFnZSdzIGRpc3BsYXkgY29udHJvbHNcbiAgICogIHNvIHRoZSBoaXN0b2dyYW0gcGFuZSBkcml2ZXMgdGhlIDNEIHJlbmRlci4gUmVwbGFjZXMgYW55IHByaW9yIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVWb2x1bWVEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0LCBjaGFubmVsc10pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMudm9sdW1lVmlldztcbiAgICAgIGlmICghdmlldykgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMudm9sdW1lTXVsdGljaGFubmVsKSB7XG4gICAgICAgIC8vIEVhY2ggY2hhbm5lbCdzIGxheWVyIGlzIHRpbnRlZCBieSBpdHMgY29sb3VyIGFuZCBnZXRzIGl0cyBvd24gd2luZG93L2dhbW1hL3Zpc2liaWxpdHkuXG4gICAgICAgIHZpZXcubGF5ZXJzLmZvckVhY2goKF8sIGMpID0+IHtcbiAgICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbChjLCB7XG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicpLFxuICAgICAgICAgICAgLi4uKHN0XG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgIGdhbW1hOiBzdC5nYW1tYSxcbiAgICAgICAgICAgICAgICAgIHZpc2libGU6IHN0LnZpc2libGUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoMCwge1xuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgICAgICAuLi4oc3QgPyB7IGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdIGFzIFtudW1iZXIsIG51bWJlcl0sIGdhbW1hOiBzdC5nYW1tYSB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBBIGNoYW5uZWwncyB0aW50IGNvbG9ybWFwIChibGFja+KGkmNvbG91cikgd2l0aCByZXZlcnNlLXNjYWxlIC8gaW52ZXJ0IGFwcGxpZWQgYnkgZmxpcHBpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFRpbnRDb2xvcm1hcChjb2xvcjogc3RyaW5nKTogQ29sb3JtYXAgfCBzdHJpbmcge1xuICAgIGxldCBjbWFwOiBDb2xvcm1hcCB8IHN0cmluZyA9IHRpbnRDb2xvcm1hcChjb2xvcik7XG4gICAgaWYgKHRoaXMuY3VycmVudFJldmVyc2UpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgaWYgKHRoaXMuaW52ZXJ0RW5hYmxlZCkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICByZXR1cm4gY21hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xvdXIgbWFwIGZvciB0aGUgdm9sdW1lL2lzb3N1cmZhY2UuIEEgcmVhbCBjb2xvcm1hcCBzZWxlY3Rpb24gKHZpcmlkaXMvbWFnbWEv4oCmKSB3aW5zO1xuICAgKiBvdGhlcndpc2UgdGhlIGNoYW5uZWwncyBjb2xvdXIgdGludHMgaXQgKHNvIHRoZSBjaGFubmVsLWRpYWxvZyBjb2xvdXIgc3dhdGNoIHJlY29sb3JzIHRoZSAzRFxuICAgKiByZW5kZXIpLiBSZXZlcnNlLXNjYWxlIGFuZCBpbnZlcnQgZWFjaCBmbGlwIHRoZSByYW1wIOKAlCB0aGUgYFZvbHVtZUxheWVyYCBoYXMgbm8gcGVyLWxheWVyXG4gICAqIGludmVydCwgc28gYm90aCBhcmUgZW11bGF0ZWQgYnkgcmV2ZXJzaW5nIHRoZSBjb2xvcm1hcC5cbiAgICovXG4gIHByaXZhdGUgdm9sdW1lQ29sb3JtYXAoc3Q6IElDaGFubmVsU3RhdGUgfCB1bmRlZmluZWQpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgbGFiZWw/OiBzdHJpbmc7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIC8vIEEgY29sb3JlZCBjb2xvcm1hcCAodmlyaWRpcy9tYWdtYS/igKYpIGRyaXZlcyB0aGUgdm9sdW1lOyB0aGUgZGVmYXVsdCBncmF5c2NhbGUgZmFtaWx5XG4gICAgLy8gKGdyYXkgLyBHcmV5cyAvIEdyZXlzIEludikgeWllbGRzIHRvIHRoZSBjaGFubmVsJ3MgY29sb3VyIHNvIHRoZSBkaWFsb2cgY29sb3VyIHN3YXRjaFxuICAgIC8vIHJlY29sb3JzIHRoZSAzRCByZW5kZXIuXG4gICAgY29uc3QgbGFiZWwgPSAobm9kZT8ubGFiZWwgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZ3JheUZhbWlseSA9IGxhYmVsID09PSAnJyB8fCBsYWJlbC5pbmNsdWRlcygnZ3JleScpIHx8IGxhYmVsLmluY2x1ZGVzKCdncmF5Jyk7XG4gICAgY29uc3QgdmFsdWUgPSBub2RlPy5kYXRhPy52YWx1ZTtcbiAgICBjb25zdCBsdXQgPSAhZ3JheUZhbWlseSAmJiB2YWx1ZSAhPSBudWxsID8gYnVpbGRDb2xvcm1hcEx1dCh2YWx1ZSwgZmFsc2UpIDogbnVsbDtcbiAgICBsZXQgY21hcDogQ29sb3JtYXAgfCBzdHJpbmcgPSBsdXRcbiAgICAgID8gY29sb3JtYXBGcm9tTHV0KCd2b2wtY21hcCcsIGx1dClcbiAgICAgIDogdGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicpO1xuICAgIC8vIFJldmVyc2Utc2NhbGUgYW5kIGludmVydCBlYWNoIGZsaXAgdGhlIHJhbXAgKHRoZSBWb2x1bWVMYXllciBoYXMgbm8gcGVyLWxheWVyIGludmVydCkuXG4gICAgaWYgKHRoaXMuY3VycmVudFJldmVyc2UpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgaWYgKHRoaXMuaW52ZXJ0RW5hYmxlZCkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICByZXR1cm4gY21hcDtcbiAgfVxuXG4gIC8qKiBBcHBseSB0aGUgY3VycmVudCBjaGFubmVsIHN0YXRlcyAvIGNvbG9ybWFwIHRvIHRoZSBsaXZlIGxheWVycyAobm8gcmUtZmV0Y2gpLCBkZWxlZ2F0aW5nIHRoZVxuICAgKiAgcGVyLWNoYW5uZWwgbGF5ZXIgbXV0YXRpb25zIHRvIHRoZSB7QGxpbmsgTXVsdGlDaGFubmVsSW1hZ2VWaWV3fS4gKi9cbiAgcHJpdmF0ZSBhcHBseURpc3BsYXlTdGF0ZShjaGFubmVsczogSUNoYW5uZWxTdGF0ZVtdKTogdm9pZCB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuY2hhbm5lbFZpZXc7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdmlldykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ211bHRpY2hhbm5lbCcpIHtcbiAgICAgIHZpZXcubGF5ZXJzLmZvckVhY2goKF8sIGMpID0+IHtcbiAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgaWYgKCFzdCkgcmV0dXJuO1xuICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoYywge1xuICAgICAgICAgIHRpbnQ6IHN0LmNvbG9yLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdLFxuICAgICAgICAgIGdhbW1hOiBzdC5nYW1tYSxcbiAgICAgICAgICB2aXNpYmxlOiBzdC52aXNpYmxlLFxuICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnKSB7XG4gICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgdmlldy51cGRhdGVDaGFubmVsKDAsIHtcbiAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgIC4uLihzdCA/IHsgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSwgZ2FtbWE6IHN0LmdhbW1hIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogKFJlKWluc3RhbGwgdGhlIHBoeXNpY2FsIHNjYWxlIGJhciBvdmVyIHRoZSAyRCBpbWFnZSwgc2l6ZWQgZnJvbSB0aGUgaW1hZ2UncyDCtW0vcGl4ZWxcbiAgICogIChgL3RpbGVzL2luZm9gIG1wcFgsIGZhbGxpbmcgYmFjayB0byB0aGUgaW1hZ2UgbWV0YWRhdGEpLiBOby1vcCB3aXRob3V0IGEgcGh5c2ljYWwgc2l6ZS4gKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2NhbGVCYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmhvc3QgJiYgbXBwWCA+IDApIHtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBuZXcgTmFwYXJpU2NhbGVCYXIodGhpcy5ob3N0LCB0aGlzLnZpZXdlci5jYW1lcmEsIG1wcFgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDb252ZXJ0IGEgbmFwYXJpLWpzIGBIaXN0b2dyYW1gIChiaW4gY291bnQgKyBtaW4vbWF4KSB0byB0aGUgcGFuZSdzIGBJSGlzdG9ncmFtYCAoYmluIGVkZ2VzKS4gKi9cbiAgcHJpdmF0ZSB0b0lIaXN0b2dyYW0oaDogeyBjb3VudHM6IFVpbnQzMkFycmF5OyBiaW5zOiBudW1iZXI7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9KTogSUhpc3RvZ3JhbSB7XG4gICAgY29uc3Qgc3BhbiA9IGgubWF4IC0gaC5taW4gfHwgMTtcbiAgICBjb25zdCBiaW5zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogaC5iaW5zIH0sIChfLCBpKSA9PiBoLm1pbiArIChpICogc3BhbikgLyBoLmJpbnMpO1xuICAgIGNvbnN0IGNvdW50cyA9IEFycmF5LmZyb20oaC5jb3VudHMpO1xuICAgIHJldHVybiB7IGJpbnMsIGNvdW50cywgbWF4OiBjb3VudHMucmVkdWNlKChtLCBjKSA9PiAoYyA+IG0gPyBjIDogbSksIDApIH07XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIDNEIHZvbHVtZS9pc29zdXJmYWNlLiBBIG11bHRpY2hhbm5lbCBpbWFnZSBiZWNvbWVzIG9uZSBhZGRpdGl2ZSwgdGludGVkXG4gICAqIHtAbGluayBWb2x1bWVMYXllcn0gcGVyIGNoYW5uZWwgKHNvIGVhY2ggY2hhbm5lbCdzIGNvbG91ciBjb21wb3NpdGVzIGludG8gdGhlIHJlbmRlcik7IGFcbiAgICogZ3JheXNjYWxlL2NvbXBvc2l0ZSBpbWFnZSB1c2VzIGEgc2luZ2xlIHZvbHVtZS4gQWRkcyB0aGUgYXhlcyBnaXptbyArIGxhYmVscyBhbmQgd2lyZXMgdGhlXG4gICAqIGRpc3BsYXktc3RhdGUgc3Vic2NyaXB0aW9uLiBUaGUgY2FsbGVyIG93bnMgYHZpZXdlci5yZWFkeWAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50Vm9sdW1lKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMubG9hZFRva2VuOyAvLyBiYWlsIGJlZm9yZSByZW5kZXJpbmcgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzXG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2M/LmNoYW5uZWxzID8/IDE7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gISFkZXNjPy5tdWx0aWNoYW5uZWwgJiYgY2hhbm5lbENvdW50ID4gMTtcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKTtcbiAgICBjb25zdCByZW5kZXJpbmc6ICdpc28nIHwgJ21pcCcgPSBpc05hcGFyaUlzb3N1cmZhY2UocGxvdFR5cGUpID8gJ2lzbycgOiAnbWlwJztcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBtdWx0aWNoYW5uZWw7XG4gICAgdGhpcy5pbWFnZU1vZGUgPSBtdWx0aWNoYW5uZWwgPyAnbXVsdGljaGFubmVsJyA6ICdncmF5c2NhbGUnO1xuICAgIGNvbnN0IHZpZXcgPSBuZXcgTXVsdGlDaGFubmVsVm9sdW1lVmlldyh2aWV3ZXIpO1xuICAgIHRoaXMudm9sdW1lVmlldyA9IHZpZXc7XG5cbiAgICAvLyBBc3NlbWJsZSBwZXItY2hhbm5lbCBzY2FsYXIgdm9sdW1lcyBmcm9tIHRoZSBzZXJ2ZXIgdGlsZXMgKGppdC1zcGVjaWZpYyk7IHRoZSBuYXBhcmktanMgdmlld1xuICAgIC8vIG93bnMgdGhlIGxheWVyIG9yY2hlc3RyYXRpb24gKG9uZSBhZGRpdGl2ZSB0aW50ZWQgdm9sdW1lIHBlciBjaGFubmVsLCBvciBhIHNpbmdsZSBncmF5c2NhbGVcbiAgICAvLyB2b2x1bWUpLiBUaGUgYWRhcHRlciBjb21wdXRlcyBlYWNoIGNoYW5uZWwncyBjb2xvcm1hcCAoaW5jbC4gaW52ZXJ0L3JldmVyc2UgZmxpcHMpLlxuICAgIGxldCBkaW1zOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdID0gW107XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB0cnkge1xuICAgICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7XG4gICAgICAgICAgY29uc3Qgdm9sID0gYXdhaXQgdGhpcy5hc3NlbWJsZVZvbHVtZShpbmZvLCByZXMsIGMpO1xuICAgICAgICAgIGlmICghdm9sKSBjb250aW51ZTtcbiAgICAgICAgICBkaW1zID0gdm9sO1xuICAgICAgICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KGMsIHZvbC5kYXRhKTtcbiAgICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgICBjb25zdCBjb2xvciA9IHN0Py5jb2xvciA/PyBkZXNjPy5jaGFubmVsSW5mbz8uW2NdPy5jb2xvciA/PyB0aW50Rm9yKGMpO1xuICAgICAgICAgIGNoYW5uZWxzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogdm9sLmRhdGEsXG4gICAgICAgICAgICB3aWR0aDogdm9sLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2b2wuaGVpZ2h0LFxuICAgICAgICAgICAgZGVwdGg6IHZvbC5kZXB0aCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmNoYW5uZWxUaW50Q29sb3JtYXAoY29sb3IpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IHRoaXMuYXNzZW1ibGVWb2x1bWUoaW5mbywgcmVzKTtcbiAgICAgICAgaWYgKHZvbCkge1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgICAgIGNoYW5uZWxzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogdm9sLmRhdGEsXG4gICAgICAgICAgICB3aWR0aDogdm9sLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2b2wuaGVpZ2h0LFxuICAgICAgICAgICAgZGVwdGg6IHZvbC5kZXB0aCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB9XG5cbiAgICBpZiAoIWRpbXMgfHwgIWNoYW5uZWxzLmxlbmd0aCB8fCB0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybjsgLy8gY2FuY2VsbGVkIOKGkiBkb24ndCByZW5kZXJcblxuICAgIC8vIFJlc29sdXRpb24taW52YXJpYW50IHdvcmxkIGJveC4gU2l6aW5nIHRoZSBib3ggYnkgdGhlIHNhbXBsZWQgdm94ZWwgY291bnRzIG1hZGUgaGlnaGVyXG4gICAgLy8gaW4tcGxhbmUgcmVzb2x1dGlvbiBncm93IFgvWSB3aGlsZSB0aGUgZGVwdGggc3RheWVkIHRoZSAoY29uc3RhbnQpIHNsaWNlIGNvdW50IOKAlCBzbyBaIGFwcGVhcmVkXG4gICAgLy8gdG8gc2hyaW5rIGF0IGhpZ2hlciByZXNvbHV0aW9uLiBJbnN0ZWFkIGFuY2hvciB0aGUgaW4tcGxhbmUgbG9uZyBzaWRlIHRvIGEgZml4ZWQgcmVmZXJlbmNlIGFuZFxuICAgIC8vIGxldCBaIHNwYW4gdGhlIGZ1bGwgc2xpY2UgY291bnQ7IHRoZSBib3ggc2hhcGUgaXMgdGhlbiBpZGVudGljYWwgYXQgZXZlcnkgZGVjaW1hdGUgZmFjdG9yLiBUaGVcbiAgICAvLyBwZXItYXhpcyBgdm94ZWxTaXplYCAobmFwYXJpIGBzY2FsZWApIG1hcHMgdGhlIHNhbXBsZWQgZ3JpZCBvbnRvIHRoYXQgZml4ZWQgd29ybGQgYm94LlxuICAgIGNvbnN0IGZ1bGxXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyBkaW1zLndpZHRoO1xuICAgIGNvbnN0IGZ1bGxIID0gdGhpcy5kZXNjcmlwdG9yPy5oZWlnaHQgPz8gZGltcy5oZWlnaHQ7XG4gICAgY29uc3QgZnVsbEQgPVxuICAgICAgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ueiB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLnVybHM/Lmxlbmd0aCB8fCBkaW1zLmRlcHRoO1xuICAgIGNvbnN0IGZ1bGxMb25nID0gTWF0aC5tYXgoMSwgZnVsbFcsIGZ1bGxIKTtcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgIHdpZHRoOiAoZnVsbFcgKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICBoZWlnaHQ6IChmdWxsSCAqIFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRikgLyBmdWxsTG9uZyxcbiAgICAgIGRlcHRoOiBmdWxsRCxcbiAgICB9O1xuICAgIC8vIEJhc2UgYm94IChaLXNjYWxlID0gMSkgKyB0aGUgc2FtcGxlZCBkZXB0aCBkcml2ZSB0aGUgbGl2ZSBaLWhlaWdodCBoYW5kbGUgYmVsb3c7IHRoZSBwZXJzaXN0ZWRcbiAgICAvLyBgdm9sdW1lWlNjYWxlYCAodXNlciBkcmFnKSBhcHBsaWVzIG9uIHRvcCBzbyBjaGFuZ2luZyByZXNvbHV0aW9uIGtlZXBzIHRoZSBjaG9zZW4gaGVpZ2h0LlxuICAgIHRoaXMudm9sdW1lV29ybGRCYXNlID0gd29ybGQ7XG4gICAgdGhpcy52b2x1bWVTYW1wbGVkRGVwdGggPSBNYXRoLm1heCgxLCBkaW1zLmRlcHRoKTtcbiAgICBjb25zdCB3b3JsZFogPSB3b3JsZC5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZveGVsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgd29ybGQud2lkdGggLyBkaW1zLndpZHRoLFxuICAgICAgd29ybGQuaGVpZ2h0IC8gZGltcy5oZWlnaHQsXG4gICAgICB3b3JsZFogLyB0aGlzLnZvbHVtZVNhbXBsZWREZXB0aCxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgY2ggb2YgY2hhbm5lbHMpIGNoLnZveGVsU2l6ZSA9IHZveGVsU2l6ZTtcblxuICAgIHZpZXcucmVuZGVyKG11bHRpY2hhbm5lbCA/ICdtdWx0aWNoYW5uZWwnIDogJ2dyYXlzY2FsZScsIGNoYW5uZWxzLCB7IHJlbmRlcmluZyB9KTtcbiAgICB0aGlzLmltYWdlVyA9IGRpbXMud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkaW1zLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSBkaW1zO1xuXG4gICAgLy8gM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKyBsYWJlbHMsIHNoYXJpbmcgdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBzbyB0aGUgZ2l6bW8gdHJhY2tzXG4gICAgLy8gdGhlIHJlbmRlcmVkIHByb3BvcnRpb25zLiBQaHlzaWNhbCBzY2FsZSB0ZXh0IHN0aWxsIGNvbWVzIGZyb20gdGhlIEZVTEwgaW1hZ2UgZXh0ZW50LlxuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIHRoaXMuYXhlc0xheWVyID0gdmlld2VyLmFkZEF4ZXMod29ybGQud2lkdGgsIHdvcmxkLmhlaWdodCwgd29ybGRaLCB7IHZpc2libGU6IHRoaXMuYXhlc1Zpc2libGUgfSk7XG4gICAgaWYgKHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5heGVzTGFiZWxzID0gbmV3IE5hcGFyaUF4ZXNMYWJlbHMoXG4gICAgICAgIHRoaXMuaG9zdCxcbiAgICAgICAgdmlld2VyLmNhbWVyYTNkLFxuICAgICAgICB0aGlzLmJ1aWxkQXhlc0xhYmVscyh7IHdpZHRoOiB3b3JsZC53aWR0aCwgaGVpZ2h0OiB3b3JsZC5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSwgbXBwWCksXG4gICAgICApO1xuICAgICAgdGhpcy5heGVzTGFiZWxzLnNldFZpc2libGUodGhpcy5heGVzVmlzaWJsZSk7XG4gICAgICAvLyBJbi12aWV3IGRyYWcgaGFuZGxlIGF0IHRoZSBUT1AgRU5EIE9GIFRIRSBaIEFYSVMgKHRoZSBib3gncyBtaW4tWFkgY29ybmVyLCB3aGVyZSB0aGUgYmx1ZVxuICAgICAgLy8gXCJaXCIgYXhpcyArIGxhYmVsIGxpdmUpLCBzbyBpdCByZWFkcyBhcyB0aGUgWi1oZWlnaHQgY29udHJvbC4gRmxvYXRlZCBhIGxpdHRsZSBwYXN0IHRoZSBheGlzXG4gICAgICAvLyB0aXAgKMOXMS4xMikgc28gdGhlIGdyaXAgY2xlYXJzIHRoZSBcIlogwrcg4oCmXCIgbGFiZWwuIERyYWcg4oaVIHRvIHJlc3RyZXRjaCBaIGxpdmUuXG4gICAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZSh0aGlzLmhvc3QsIHZpZXdlci5jYW1lcmEzZCwge1xuICAgICAgICB0b3BBbmNob3I6ICgpID0+IFtcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLndpZHRoIC8gMixcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLmhlaWdodCAvIDIsXG4gICAgICAgICAgKCh0aGlzLnZvbHVtZVdvcmxkQmFzZSEuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZSkgLyAyKSAqIDEuMTIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFNjYWxlOiAoKSA9PiB0aGlzLnZvbHVtZVpTY2FsZSxcbiAgICAgICAgc2V0U2NhbGU6IChzKSA9PiB0aGlzLnNldFZvbHVtZVpTY2FsZShzKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZVZvbHVtZURpc3BsYXlTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyZXRjaCB0aGUgdm9sdW1lJ3MgWiBoZWlnaHQgbGl2ZSAoZHJpdmVuIGJ5IHRoZSBpbi12aWV3IHtAbGluayBOYXBhcmlWb2x1bWVaSGFuZGxlfSkuIE9ubHlcbiAgICogdGhlIHBlci1heGlzIGB2b3hlbFNpemVgIC8gYXhlcyBkZXB0aCBjaGFuZ2Ug4oCUIHRoZSB2b3hlbCB0ZXh0dXJlcyBhcmUgdW50b3VjaGVkIOKAlCBzbyBkcmFnZ2luZyBpc1xuICAgKiBzbW9vdGguIGBmYWN0b3JgIGlzIHJlbGF0aXZlIHRvIHRoZSB2b2x1bWUncyBuYXR1cmFsIHByb3BvcnRpb25zICgxKS4gUGVyc2lzdHMgYWNyb3NzIHJlLW1vdW50c1xuICAgKiAocmVzb2x1dGlvbiBjaGFuZ2VzKSBzbyB0aGUgY2hvc2VuIGhlaWdodCBzdGlja3MuXG4gICAqL1xuICBwcml2YXRlIHNldFZvbHVtZVpTY2FsZShmYWN0b3I6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudm9sdW1lWlNjYWxlID0gTWF0aC5taW4oMTAsIE1hdGgubWF4KDAuMSwgZmFjdG9yKSk7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMudm9sdW1lV29ybGRCYXNlO1xuICAgIGlmICghYmFzZSB8fCAhdGhpcy52b2x1bWVWaWV3KSByZXR1cm47XG4gICAgY29uc3Qgd29ybGRaID0gYmFzZS5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZzWiA9IHdvcmxkWiAvIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3LmxheWVycykge1xuICAgICAgY29uc3QgW3N4LCBzeV0gPSBsYXllci52b3hlbFNpemU7XG4gICAgICBsYXllci52b3hlbFNpemUgPSBbc3gsIHN5LCB2c1pdO1xuICAgIH1cbiAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHRoaXMuYXhlc0xheWVyLmRlcHRoID0gd29ybGRaO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIHRoaXMuYXhlc0xhYmVscz8udXBkYXRlQW5jaG9ycyhcbiAgICAgIHRoaXMuYnVpbGRBeGVzTGFiZWxzKHsgd2lkdGg6IGJhc2Uud2lkdGgsIGhlaWdodDogYmFzZS5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSwgbXBwWCksXG4gICAgKTtcbiAgICB0aGlzLnpIYW5kbGU/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBYL1kvWiBheGlzLWVuZCBsYWJlbCBzcGVjcyBmb3IgdGhlIDNEIGdpem1vLiBBbmNob3JzIGFyZSBpbiB0aGUgdm9sdW1lJ3MgY2VudHJlZFxuICAgKiAgd29ybGQgYm94IChtYXRjaGluZyB0aGUgQXhlc0xheWVyIGdlb21ldHJ5KTsgdGhlIHNjYWxlIHRleHQgcmVmbGVjdHMgdGhlIEZVTEwgaW1hZ2UgZXh0ZW50IOKAlFxuICAgKiAgcGh5c2ljYWwgwrVtIHdoZW4gwrVtL3BpeGVsIGlzIGtub3duLCBlbHNlIHBpeGVsIChYL1kpIC8gc2xpY2UgKFopIGNvdW50cy4gKi9cbiAgcHJpdmF0ZSBidWlsZEF4ZXNMYWJlbHMoXG4gICAgdm9sOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0sXG4gICAgbXBwWDogbnVtYmVyLFxuICApOiBBeGlzTGFiZWxTcGVjW10ge1xuICAgIGNvbnN0IGh4ID0gdm9sLndpZHRoIC8gMjtcbiAgICBjb25zdCBoeSA9IHZvbC5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IGh6ID0gdm9sLmRlcHRoIC8gMjtcbiAgICBjb25zdCBkZXNjVyA9IHRoaXMuZGVzY3JpcHRvcj8ud2lkdGggPz8gdm9sLndpZHRoO1xuICAgIGNvbnN0IGRlc2NIID0gdGhpcy5kZXNjcmlwdG9yPy5oZWlnaHQgPz8gdm9sLmhlaWdodDtcbiAgICBjb25zdCBzbGljZXMgPVxuICAgICAgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ueiB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLnVybHM/Lmxlbmd0aCB8fCB2b2wuZGVwdGg7XG4gICAgY29uc3QgbGVuID0gKHB4OiBudW1iZXIpOiBzdHJpbmcgPT4gKG1wcFggPiAwID8gZm9ybWF0VW0ocHggKiBtcHBYKSA6IGAke3B4fSBweGApO1xuICAgIHJldHVybiBbXG4gICAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKGRlc2NXKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKGRlc2NIKX1gLCBjb2xvcjogJyM0ZGQ5NTknIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6IGBaIMK3ICR7c2xpY2VzfSBweGAsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGEgZG93bnNhbXBsZWQgdWludDggdm9sdW1lIChsdW1pbmFuY2UpIGZyb20gdGhlIHBlci1zbGljZSB0aWxlIGVuZHBvaW50LiBTbGljZXMgYXJlXG4gICAqIGZldGNoZWQgd2l0aCBib3VuZGVkIGNvbmN1cnJlbmN5IChrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGZ1bGwgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXBcbiAgICogc3RhY2spIGFuZCByZWFkIGludG8gdGhlIHZvbHVtZSBhcyBlYWNoIGFycml2ZXMsIGRyaXZpbmcge0BsaW5rIHN0YWNrTG9hZGluZ1Byb2dyZXNzJH0gc28gdGhlXG4gICAqIGhvc3Qgc2hvd3MgYSBkZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIgaW5zdGVhZCBvZiBhIGJhcmUgc3Bpbm5lci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZW1ibGVWb2x1bWUoXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiB7IG1heFNsaWNlPzogbnVtYmVyOyBzbGljZVN0ZXA/OiBudW1iZXIgfSA9IHt9LFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzIHdoaWxlIHdlIGZldGNoXG4gICAgY29uc3QgZnVsbERlcHRoID0gaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LnogfHwgaW5mbz8udXJscz8ubGVuZ3RoIHx8IDE7XG4gICAgaWYgKGZ1bGxEZXB0aCA8IDEpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbm8gc2xpY2VzIHRvIGFzc2VtYmxlIGEgdm9sdW1lJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iob3B0cy5zbGljZVN0ZXAgPz8gMSkpO1xuICAgIGNvbnN0IG1heFNsaWNlID0gb3B0cy5tYXhTbGljZSA/PyBWT0xVTUVfTUFYX1NMSUNFO1xuICAgIC8vIFNvdXJjZS1zbGljZSBpbmRpY2VzIHNhbXBsZWQgaW50byB0aGUgdm9sdW1lIChldmVyeSBgc3RlcGB0aCBwbGFuZSDihpIgbG93LXJlcyBpcyBmYXN0ZXIpLlxuICAgIGNvbnN0IHpJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IHogPSAwOyB6IDwgZnVsbERlcHRoOyB6ICs9IHN0ZXApIHpJbmRpY2VzLnB1c2goeik7XG4gICAgY29uc3QgZGVwdGggPSB6SW5kaWNlcy5sZW5ndGg7XG5cbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBlYWNoIHNsaWNlIGF0IGEgcHlyYW1pZCBsZXZlbCBtYXRjaGluZyBgbWF4U2xpY2VgIChidWRnZXQgc2NhbGVzIHdpdGggdGhlIGRlY2ltYXRlXG4gICAgICAvLyBmYWN0b3IpLCBzbyBhIGhpZ2hlciBmYWN0b3IgcHVsbHMgYSBmaW5lciBsZXZlbCDihpIgbW9yZSByZWFsIGluLXBsYW5lIGRldGFpbDsgdGhlbiBkb3duc2FtcGxlXG4gICAgICAvLyB0byBgbWF4U2xpY2VgLiBgY2hhbm5lbGAgc2VsZWN0cyBhIGJhbmQgKG11bHRpY2hhbm5lbCB2b2x1bWUpOyBvbWl0IGZvciB0aGUgZ3JheXNjYWxlXG4gICAgICAvLyBjb21wb3NpdGUuIFRoZSBjYWxsZXIgb3ducyB0aGUgc3RhY2tMb2FkaW5nIGZsYWcgKG11bHRpY2hhbm5lbCBhc3NlbWJsZXMgY2hhbm5lbHMgaW4gdHVybikuXG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4U2xpY2UpO1xuICAgICAgY29uc3QgZmlyc3QgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2UoekluZGljZXNbMF0sIGNoYW5uZWwsIGJ1ZGdldCk7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIG1heFNsaWNlIC8gTWF0aC5tYXgoZmlyc3Qud2lkdGgsIGZpcnN0LmhlaWdodCwgMSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGZpcnN0LndpZHRoICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZmlyc3QuaGVpZ2h0ICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIGRlcHRoKTtcblxuICAgICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ25hcGFyaS1qcyB2b2x1bWUgYXNzZW1ibHk6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcblxuICAgICAgLy8gUmVhZCBvbmUgZmV0Y2hlZCBzbGljZSBiaXRtYXAgaW50byB0aGUgdm9sdW1lIHBsYW5lIGB6YCAobHVtaW5hbmNlKS4gU3luY2hyb25vdXMgYmV0d2VlblxuICAgICAgLy8gYXdhaXRzLCBzbyB0aGUgc2hhcmVkIDJEIGNvbnRleHQgaXMgc2FmZSB0byByZXVzZSBhY3Jvc3MgdGhlIGNvbmN1cnJlbnQgZmV0Y2ggd29ya2Vycy5cbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHJlYWRTbGljZSA9ICh6OiBudW1iZXIsIGJtcDogSW1hZ2VCaXRtYXApOiB2b2lkID0+IHtcbiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShibXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb25zdCByZ2JhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICAgICAgICBjb25zdCBiYXNlID0geiAqIHdpZHRoICogaGVpZ2h0O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoICogaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICBkYXRhW2Jhc2UgKyBpXSA9XG4gICAgICAgICAgICAocmdiYVtpICogNF0gKiAwLjI5OSArIHJnYmFbaSAqIDQgKyAxXSAqIDAuNTg3ICsgcmdiYVtpICogNCArIDJdICogMC4xMTQpIHwgMDtcbiAgICAgICAgfVxuICAgICAgICBibXAuY2xvc2U/LigpO1xuICAgICAgICBkb25lKys7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoTWF0aC5yb3VuZCgoZG9uZSAvIGRlcHRoKSAqIDEwMCkpO1xuICAgICAgfTtcblxuICAgICAgcmVhZFNsaWNlKDAsIGZpcnN0KTtcblxuICAgICAgLy8gUmVtYWluaW5nIHBsYW5lcyB2aWEgYSBzbWFsbCBwb29sIG9mIHdvcmtlcnMgZHJhaW5pbmcgYSBzaGFyZWQgcXVldWUuIEVhY2ggcGxhbmUgYHBgXG4gICAgICAvLyBtYXBzIHRvIHNvdXJjZSBzbGljZSBgekluZGljZXNbcF1gIChzdWJzYW1wbGVkIGZvciBsb3ctcmVzKS5cbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCBwID0gMTsgcCA8IGRlcHRoOyBwKyspIHBlbmRpbmcucHVzaChwKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHAgPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybjtcbiAgICAgICAgICByZWFkU2xpY2UocCwgYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHpJbmRpY2VzW3BdLCBjaGFubmVsLCBidWRnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvb2xTaXplID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCAtIDEpKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oeyBsZW5ndGg6IHBvb2xTaXplIH0sICgpID0+IHdvcmtlcigpKSk7XG5cbiAgICAgIGlmICh0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybiBudWxsOyAvLyBjYW5jZWxsZWQg4oaSIGRvbid0IHJlbmRlciBhIHBhcnRpYWwgdm9sdW1lXG4gICAgICByZXR1cm4geyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NDQVRURVIgMkQgc2NhdHRlcjogdGhlIHNsaWNlIGltYWdlIHdpdGggYSBwb2ludHMgbGF5ZXIgYXQgZWFjaCByZWdpb24nc1xuICAgKiBjZW50cm9pZCAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyByZWdpb24tY2VudHJvaWQgc2NhdHRlcikuIFJlYnVpbGRzIHRoZSBwb2ludHMgbGl2ZSBhc1xuICAgKiByZWdpb25zIGNoYW5nZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTY2F0dGVyKHZpZXdlcjogVmlld2VyLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlKHopO1xuICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgIHRoaXMuc3Vic2NyaWJlRGlzcGxheVN0YXRlKCk7XG4gICAgdGhpcy5pbnN0YWxsU2NhbGVCYXIoKTtcbiAgICB0aGlzLnJlYnVpbGRTY2F0dGVyUG9pbnRzKCk7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViID0gdGhpcy5yZWdpb25TdG9yZVxuICAgICAgLmdldFJlZ2lvblVwZGF0ZUV2ZW50KClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWJ1aWxkU2NhdHRlclBvaW50cygpKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDJEIHNjYXR0ZXIncyBwb2ludCBsYXllciBhdCB0aGUgY3VycmVudCByZWdpb24gY2VudHJvaWRzLiAqL1xuICBwcml2YXRlIHJlYnVpbGRTY2F0dGVyUG9pbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBpZiAodGhpcy5zY2F0dGVyMmRQb2ludHMpIHtcbiAgICAgIHYubGF5ZXJzLnJlbW92ZSh0aGlzLnNjYXR0ZXIyZFBvaW50cyk7XG4gICAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRoaXMucmVnaW9uQ2VudHJvaWRzKCk7XG4gICAgaWYgKGNlbnRyb2lkcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IHYuYWRkUG9pbnRzKGNlbnRyb2lkcywge1xuICAgICAgc2l6ZTogMTIsXG4gICAgICBmYWNlQ29sb3I6IFsxLCAwLjg1LCAwLjIsIDFdLFxuICAgICAgYm9yZGVyQ29sb3I6IFswLCAwLCAwLCAxXSxcbiAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lvbiBjZW50cm9pZHMgYXMgZmxhdCBgW3gsIHksIOKApl1gIGRhdGEgY29vcmRzIChyZWN0YW5nbGUgLyBwb2x5Z29uIC8gbXVsdGlwb2x5Z29uKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25DZW50cm9pZHMoKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBvdXQ6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgcG9seUNlbnRyb2lkID0gKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBuID0geHMubGVuZ3RoO1xuICAgICAgaWYgKG4gPT09IDApIHJldHVybjtcbiAgICAgIGxldCBjeCA9IDA7XG4gICAgICBsZXQgY3kgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY3ggKz0geHNbaV07XG4gICAgICAgIGN5ICs9IHlzW2ldO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goY3ggLyBuLCBjeSAvIG4pO1xuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKSB7XG4gICAgICBjb25zdCBiID0gci5ib3VuZHMgYXNcbiAgICAgICAgfCB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9XG4gICAgICAgIHwgeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW10gfVxuICAgICAgICB8IHsgcG9seWdvbnM6IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdIH1bXSB9XG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYikgY29udGludWU7XG4gICAgICBpZiAoJ3dpZHRoJyBpbiBiICYmICd4JyBpbiBiKSB7XG4gICAgICAgIG91dC5wdXNoKGIueCArIGIud2lkdGggLyAyLCBiLnkgKyBiLmhlaWdodCAvIDIpO1xuICAgICAgfSBlbHNlIGlmICgneHBvaW50cycgaW4gYikge1xuICAgICAgICBwb2x5Q2VudHJvaWQoYi54cG9pbnRzLCBiLnlwb2ludHMpO1xuICAgICAgfSBlbHNlIGlmICgncG9seWdvbnMnIGluIGIpIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGIucG9seWdvbnMpIHBvbHlDZW50cm9pZChwLnhwb2ludHMsIHAueXBvaW50cyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KG91dCk7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIE5BUEFSSV9TQ0FUVEVSM0QgM0Qgc2NhdHRlcjogdGhlIGRvd25zYW1wbGVkIHZveGVsIGdyaWQgYXMgYSAzRCBwb2ludCBjbG91ZCBjb2xvcmVkXG4gICAqIGJ5IGludGVuc2l0eSAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyB2b3hlbCBzY2F0dGVyM2QpLiBBc3NlbWJsZXMgYSBjb2Fyc2Ugdm9sdW1lLCB0aGVuXG4gICAqIGVtaXRzIGEgZmxhdC1zdHJpZGVkIHNhbXBsZSBvZiB2b3hlbHMgKGNhcHBlZCBhdCB7QGxpbmsgU0NBVFRFUjNEX01BWF9QT0lOVFN9KSB2aWEgYGFkZFBvaW50czNEYC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTY2F0dGVyM2Qodmlld2VyOiBWaWV3ZXIsIGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmltYWdlTW9kZSA9ICdncmF5c2NhbGUnO1xuICAgIHRoaXMudm9sdW1lTXVsdGljaGFubmVsID0gZmFsc2U7XG4gICAgY29uc3QgcmVzID0gdm9sdW1lUmVzb2x1dGlvbkZvcih0aGlzLnJlc29sdXRpb25TY2FsZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICBsZXQgdm9sOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdm9sID0gYXdhaXQgdGhpcy5hc3NlbWJsZVZvbHVtZShpbmZvLCB7XG4gICAgICAgIG1heFNsaWNlOiBNYXRoLm1pbihyZXMubWF4U2xpY2UsIFNDQVRURVIzRF9NQVhfWFkpLFxuICAgICAgICBzbGljZVN0ZXA6IHJlcy5zbGljZVN0ZXAsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB9XG4gICAgaWYgKCF2b2wgfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9ID0gdm9sO1xuICAgIGNvbnN0IHpTY2FsZSA9IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpIC8gTWF0aC5tYXgoMSwgZGVwdGgpOyAvLyDiiYggY3ViaWMgYXNwZWN0XG4gICAgY29uc3QgdG90YWwgPSB3aWR0aCAqIGhlaWdodCAqIGRlcHRoO1xuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0b3RhbCAvIFNDQVRURVIzRF9NQVhfUE9JTlRTKSk7XG4gICAgY29uc3QgcG9zOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHZhbDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsOyBpICs9IHN0cmlkZSkge1xuICAgICAgY29uc3QgeCA9IGkgJSB3aWR0aDtcbiAgICAgIGNvbnN0IHkgPSBNYXRoLmZsb29yKGkgLyB3aWR0aCkgJSBoZWlnaHQ7XG4gICAgICBjb25zdCB6aSA9IE1hdGguZmxvb3IoaSAvICh3aWR0aCAqIGhlaWdodCkpO1xuICAgICAgcG9zLnB1c2goeCwgeSwgemkgKiB6U2NhbGUpO1xuICAgICAgdmFsLnB1c2goZGF0YVtpXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3QgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKClbMF07XG4gICAgdGhpcy5zY2F0dGVyM2RMYXllciA9IHZpZXdlci5hZGRQb2ludHMzRChuZXcgRmxvYXQzMkFycmF5KHBvcyksIG5ldyBGbG9hdDMyQXJyYXkodmFsKSwge1xuICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgIHNpemU6IDMsXG4gICAgfSk7XG4gICAgdGhpcy5pbWFnZVcgPSB3aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IGhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoIH07XG4gICAgLy8gRmVlZCB0aGUgaW50ZW5zaXR5IGhpc3RvZ3JhbSBmcm9tIHRoZSBhc3NlbWJsZWQgdm9sdW1lIChrZXkgMCkuXG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KDAsIGRhdGEpO1xuICAgIHRoaXMuc3Vic2NyaWJlU2NhdHRlcjNkRGlzcGxheVN0YXRlKCk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogU3RvcmUgY29sb3JtYXAgLyByZXZlcnNlIC8gaW52ZXJ0IC8gY2hhbm5lbCB3aW5kb3cg4oaSIHRoZSAzRCBzY2F0dGVyJ3MgY29sb3JtYXAgKyBjb250cmFzdC4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVTY2F0dGVyM2REaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0LCBjaGFubmVsc10pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnNjYXR0ZXIzZExheWVyO1xuICAgICAgaWYgKCFsYXllcikgcmV0dXJuO1xuICAgICAgY29uc3Qgc3QgPSBjaGFubmVsc1swXTtcbiAgICAgIGxheWVyLmNvbG9ybWFwID0gdGhpcy52b2x1bWVDb2xvcm1hcChzdCk7XG4gICAgICBpZiAoc3QpIGxheWVyLmNvbnRyYXN0TGltaXRzID0gW3N0Lm1pbiwgc3QubWF4XTtcbiAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIE5BUEFSSV9TVVJGQUNFIGhlaWdodC1maWVsZCBzdXJmYWNlLiBBIGhlaWdodCBmaWVsZCBpcyBzaW5nbGUtc2NhbGFyLCBzbyBmb3IgYVxuICAgKiBtdWx0aWNoYW5uZWwgaW1hZ2UgdGhlIHN1cmZhY2UgZm9sbG93cyBPTkUgYmFuZCDigJQgdGhlIGZpcnN0IHZpc2libGUgY2hhbm5lbCAoZmFsbGJhY2sgMCkg4oCUXG4gICAqIGNvbG91cmVkIGJ5IHRoYXQgY2hhbm5lbCdzIHdpbmRvdy9jb2xvcm1hcCAobGlrZSB0aGUgUGxvdGx5IFNVUkZBQ0UsIHdoaWNoIGlzIGdyYXlzY2FsZS1vbmx5KS5cbiAgICogUHJlLWxvYWRzIGV2ZXJ5IHNsaWNlJ3MgaGVpZ2h0IGRhdGEgd2l0aCBhIHByb2dyZXNzIGJhciAoYXMgdGhlIHZvbHVtZSBkb2VzKSBzbyB0aGUgc3RhY2tcbiAgICogc2xpZGVyIHJlLXNsaWNlcyBpbnN0YW50bHksIHRoZW4gYnVpbGRzIHRoZSBtZXNoIGZvciB0aGUgY3VycmVudCBzbGljZS4gQWxsIG1lc2ggKyBHUFUgd29ya1xuICAgKiBsaXZlcyBpbiBuYXBhcmktanMgKGBoZWlnaHRGaWVsZGAgKyBgVmlld2VyLmFkZFN1cmZhY2VgKTsgdGhpcyBiYWNrZW5kIHN1cHBsaWVzIHNjYWxhciBzbGljZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U3VyZmFjZSh2aWV3ZXI6IFZpZXdlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSAhIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiAoZGVzYz8uY2hhbm5lbHMgPz8gMSkgPiAxO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gbXVsdGljaGFubmVsID8gc3RhdGVzLmZpbmQoKHMpID0+IHMudmlzaWJsZSk/LmluZGV4ID8/IDAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdXJmYWNlTWF4R3JpZCA9IHN1cmZhY2VSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKS5tYXhHcmlkO1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICBhd2FpdCB0aGlzLnByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcik7XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkU3VyZmFjZSh2aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApO1xuICAgIHRoaXMuaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcik7XG4gICAgLy8gU3Vic2NyaWJlIGFmdGVyIHRoZSBmaXJzdCBidWlsZCBzbyBkaXNwbGF5LXN0YXRlIGVkaXRzIHRhcmdldCBhIGxpdmUgbGF5ZXIuXG4gICAgdGhpcy5zdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk7XG4gIH1cblxuICAvKiogQWRkIHRoZSAzRCBheGVzIGdpem1vICsgRE9NIGxhYmVscyBhcm91bmQgdGhlIChvcmlnaW4tY2VudGVyZWQpIHN1cmZhY2UgbWVzaCwgbWF0Y2hpbmcgdGhlXG4gICAqICB2b2x1bWUvaXNvc3VyZmFjZS4gSW5zdGFsbGVkIG9uY2UgcGVyIG1vdW50OyB0aGUgYm94IHRyYWNrcyB0aGUgbWVzaCBib3VuZHMsIFgvWSBzaG93IHRoZVxuICAgKiAgcGh5c2ljYWwgKG9yIHBpeGVsKSBleHRlbnQsIGFuZCBaIGlzIHRoZSBpbnRlbnNpdHkvaGVpZ2h0IGF4aXMuICovXG4gIHByaXZhdGUgaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN1cmZhY2VMYXllcikgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSB0aGlzLnN1cmZhY2VMYXllci5ib3VuZHMoKTtcbiAgICBjb25zdCBib3hXID0gTWF0aC5tYXgoMSwgYi5tYXhbMF0gLSBiLm1pblswXSk7XG4gICAgY29uc3QgYm94SCA9IE1hdGgubWF4KDEsIGIubWF4WzFdIC0gYi5taW5bMV0pO1xuICAgIGNvbnN0IGJveEQgPSBNYXRoLm1heCgxLCBiLm1heFsyXSAtIGIubWluWzJdKTtcbiAgICBjb25zdCBtcHBYID0gdGhpcy5kZXNjcmlwdG9yPy5tcHBYIHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF0/Lm1wcFggfHwgMDtcbiAgICBjb25zdCB2b3hlbCA9IG1wcFggPiAwID8gKG1wcFggKiAodGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVykpIC8gTWF0aC5tYXgoMSwgdGhpcy5pbWFnZVcpIDogMTtcbiAgICB0aGlzLmF4ZXNMYXllciA9IHZpZXdlci5hZGRBeGVzKGJveFcsIGJveEgsIGJveEQsIHtcbiAgICAgIHZveGVsU2l6ZTogW3ZveGVsLCB2b3hlbCwgMV0sXG4gICAgICB2aXNpYmxlOiB0aGlzLmF4ZXNWaXNpYmxlLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMuYXhlc0xhYmVscyA9IG5ldyBOYXBhcmlBeGVzTGFiZWxzKFxuICAgICAgICB0aGlzLmhvc3QsXG4gICAgICAgIHZpZXdlci5jYW1lcmEzZCxcbiAgICAgICAgdGhpcy5idWlsZFN1cmZhY2VBeGVzTGFiZWxzKGJveFcsIGJveEgsIGJveEQsIG1wcFgpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXhlc0xhYmVscy5zZXRWaXNpYmxlKHRoaXMuYXhlc1Zpc2libGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBYL1kvWiBlbmQtbGFiZWxzIGZvciB0aGUgc3VyZmFjZSBnaXptbzogWC9ZIGFyZSB0aGUgcGh5c2ljYWwgKMK1bSkgb3IgcGl4ZWwgZXh0ZW50IG9mIHRoZSBGVUxMXG4gICAqICBpbWFnZTsgWiBpcyB0aGUgaW50ZW5zaXR5L2hlaWdodCBheGlzLiBBbmNob3JzIGFyZSBpbiB0aGUgY2VudGVyZWQgYm94IChtYXRjaGluZyBBeGVzTGF5ZXIpLiAqL1xuICBwcml2YXRlIGJ1aWxkU3VyZmFjZUF4ZXNMYWJlbHMoXG4gICAgYm94VzogbnVtYmVyLFxuICAgIGJveEg6IG51bWJlcixcbiAgICBib3hEOiBudW1iZXIsXG4gICAgbXBwWDogbnVtYmVyLFxuICApOiBBeGlzTGFiZWxTcGVjW10ge1xuICAgIGNvbnN0IGh4ID0gYm94VyAvIDI7XG4gICAgY29uc3QgaHkgPSBib3hIIC8gMjtcbiAgICBjb25zdCBoeiA9IGJveEQgLyAyO1xuICAgIGNvbnN0IGRlc2NXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVztcbiAgICBjb25zdCBkZXNjSCA9IHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IHRoaXMuaW1hZ2VIO1xuICAgIGNvbnN0IGxlbiA9IChweDogbnVtYmVyKTogc3RyaW5nID0+IChtcHBYID4gMCA/IGZvcm1hdFVtKHB4ICogbXBwWCkgOiBgJHtweH0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihkZXNjVyl9YCwgY29sb3I6ICcjZWQ0NTQ1JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIGh5LCAtaHpdLCB0ZXh0OiBgWSDCtyAke2xlbihkZXNjSCl9YCwgY29sb3I6ICcjNGRkOTU5JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIC1oeSwgaHpdLCB0ZXh0OiAnWiDCtyBpbnRlbnNpdHknLCBjb2xvcjogJyM2NjhjZmYnIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtZmV0Y2ggZXZlcnkgc3RhY2sgc2xpY2UncyBsdW1pbmFuY2UgcGxhbmUgKGRlY2ltYXRlZCB0byB0aGUgc3VyZmFjZSBncmlkKSBpbnRvXG4gICAqIHtAbGluayBzdXJmYWNlUGxhbmVzfSwgZHJpdmluZyB7QGxpbmsgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkfSDigJQgdGhlIHNhbWUgbG9hZC13aXRoLXByb2dyZXNzIFVYXG4gICAqIGFzIHRoZSB2b2x1bWUsIGJ1dCBrZWVwaW5nIG9uZSAyRCBwbGFuZSBwZXIgc2xpY2UgcmF0aGVyIHRoYW4gcGFja2luZyBhIDNEIHZvbHVtZS4gQm91bmRlZFxuICAgKiBjb25jdXJyZW5jeSBrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGJ1c3kgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXAgc3RhY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcjogVmlld2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmxvYWRUb2tlbjsgLy8gYmFpbCBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXMgd2hpbGUgd2UgZmV0Y2hcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXB0aCA9IGluZm8/LmltYWdlTWV0YT8uWzBdPy56IHx8IGluZm8/LnVybHM/Lmxlbmd0aCB8fCAxO1xuICAgIGNvbnN0IHsgbWF4R3JpZCB9ID0gc3VyZmFjZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCB6ID0gMDsgeiA8IGRlcHRoOyB6KyspIHBlbmRpbmcucHVzaCh6KTtcbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHogPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHogPT09IHVuZGVmaW5lZCB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN1cmZhY2VQbGFuZXMuc2V0KHosIGF3YWl0IHRoaXMuZmV0Y2hTdXJmYWNlUGxhbmUoeiwgbWF4R3JpZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBzdXJmYWNlIHNsaWNlICR7en0gcHJlbG9hZCBmYWlsZWRgLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb25lKys7XG4gICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChkb25lIC8gZGVwdGgpICogMTAwKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBwb29sID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCkpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogcG9vbCB9LCAoKSA9PiB3b3JrZXIoKSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBzbGljZSBgemAgYXMgYSBzaW5nbGUgV0hPTEUtaW1hZ2UgbHVtaW5hbmNlIHBsYW5lIChkZWNpbWF0ZWQgdG8gYG1heEdyaWRgKS4gUHJlZmVycyB0aGVcbiAgICogYXBwJ3MgY29tcGxldGUgcGVyLXNsaWNlIGltYWdlIChgc21hbGxVcmxzYC9gdXJsc2AsIGV4YWN0bHkgbGlrZSB0aGUgUGxvdGx5IHN1cmZhY2UpIHNvIHRoZVxuICAgKiBzdXJmYWNlIGFsd2F5cyBjb3ZlcnMgdGhlIEZVTEwgc2xpY2Ug4oCUIHRoZSB0aWxlLXB5cmFtaWQgYGZldGNoU2xpY2VgIHBhdGggd291bGQgZmFsbCBiYWNrIHRvIGFcbiAgICogc2luZ2xlIHRvcC1sZWZ0IHRpbGUgKGEgY29ybmVyKSBmb3Igc2VsZi1jb250YWluZWQgLyBub24tYC90aWxlcy9pbmZvYCBpbWFnZXMuIEZhbGxzIGJhY2sgdG9cbiAgICogc3RpdGNoaW5nIHRoZSB0aWxlIGdyaWQgb25seSB3aGVuIG5vIGNvbXBsZXRlLWltYWdlIFVSTCBpcyBhdmFpbGFibGUuXG4gICAqL1xuICAvKiogVGlsZSBidWRnZXQgdG8gc3RpdGNoIGEgd2hvbGUgc2xpY2UgYXQgfmB0YXJnZXRQeGAgcmVzb2x1dGlvbiBmcm9tIHRoZSBweXJhbWlkOiBhIGhpZ2hlciB0YXJnZXRcbiAgICogIHB1bGxzIGEgRklORVIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCBhbmQgdGhlIHZvbHVtZVxuICAgKiAgYXNzZW1ibHkgc28gYm90aCBzY2FsZSB0aGVpciBpbi1wbGFuZSByZXNvbHV0aW9uIHdpdGggdGhlIGRlY2ltYXRlIGZhY3Rvci4gKi9cbiAgcHJpdmF0ZSB0aWxlQnVkZ2V0Rm9yKHRhcmdldFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5kZXNjcmlwdG9yPy50aWxlU2l6ZSB8fCBUSUxFX1NJWkU7XG4gICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgTUFYX1NUSVRDSF9USUxFUyxcbiAgICAgIE1hdGgubWF4KDEsIE1hdGgucm91bmQoKHRhcmdldFB4IC8gdGlsZVNpemUpICoqIDIgKiBTVElUQ0hfQlVER0VUX0NPRUZGKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdXJmYWNlUGxhbmUoXG4gICAgejogbnVtYmVyLFxuICAgIG1heEdyaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgbGV0IHBsYW5lOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFByZWZlcnJlZDogc3RpdGNoIHRoZSBXSE9MRSBzbGljZSBmcm9tIHRoZSBzZXJ2ZXIgcHlyYW1pZCBhdCBhIHJlc29sdXRpb24gZHJpdmVuIGJ5IHRoZVxuICAgIC8vIGRlY2ltYXRlIGZhY3RvciDigJQgYSBoaWdoZXIgdGFyZ2V0IGdyaWQgcHVsbHMgYSBGSU5FUiBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gV2l0aCBhXG4gICAgLy8gZGVzY3JpcHRvciwgZmV0Y2hTbGljZSBzdGl0Y2hlcyB0aGUgd2hvbGUgY2hvc2VuIGxldmVsIChuZXZlciBhIGNvcm5lciksIHRoZW4gd2UgZG93bnNjYWxlIHRvXG4gICAgLy8gdGhlIGdyaWQuIFRoaXMgaXMgd2hhdCBtYWtlcyBcIkZ1bGxcIiBhY3R1YWxseSBoaWdoZXItcmVzIHRoYW4gXCLCvVwiLCBub3QganVzdCBhIGZpeGVkIHByZXZpZXcuXG4gICAgaWYgKGRlc2M/LmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4R3JpZCk7XG4gICAgICAvLyBUaGUgc3VyZmFjZSBpcyBhIHNpbmdsZSBkZWNpbWF0ZWQgcGxhbmUsIHNvIHRoZSBjb21wb3NpdGUgZmFsbGJhY2sgaXMgYWNjZXB0YWJsZSB3aGVuIHRoZVxuICAgICAgLy8gY2hhbm5lbCBoYXMgbm8gc21hbGwgcHlyYW1pZCBsZXZlbCAoa2VlcHMgaXQgZmFzdCk7IGEgbXVsdGljaGFubmVsIFZPTFVNRSBtdXN0IG5vdCBkbyB0aGlzLlxuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgYnVkZ2V0LCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgKG5vIHB5cmFtaWQpOiB0aGUgYXBwJ3MgQ09NUExFVEUgcGVyLXNsaWNlIGltYWdlICh1cmxzW3pdLCBub3QgdGhlIHNtYWxsIGJsdXJyeVxuICAgIC8vIHRodW1ibmFpbCkg4oCUIHdob2xlIHNsaWNlLCBhdm9pZHMgYSBjb3JuZXIgdGlsZS4gQ2FwcGVkIGF0IHRoZSBpbWFnZSdzIG93biByZXNvbHV0aW9uLlxuICAgIGlmICghcGxhbmUpIHtcbiAgICAgIGNvbnN0IHVybCA9IGluZm8/LnVybHM/Llt6XSA/PyBpbmZvPy5zbWFsbFVybHM/Llt6XTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgICBpZiAocmVzcC5vaykge1xuICAgICAgICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKSwgbWF4R3JpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIHN1cmZhY2UgdXJsIGZldGNoIGZhaWxlZCBmb3Igej0ke3p9YCwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExhc3QgcmVzb3J0IChubyBweXJhbWlkIGFuZCBubyBjb21wbGV0ZSBpbWFnZSk6IGEgc2luZ2xlIHRpbGUuXG4gICAgaWYgKCFwbGFuZSkge1xuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgdGhpcy50aWxlQnVkZ2V0Rm9yKG1heEdyaWQpLCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwbGFuZTtcbiAgfVxuXG4gIC8qKiBUaGUgY2hhbm5lbCBzdGF0ZSBkcml2aW5nIHRoZSBzdXJmYWNlOiB0aGUgY2hvc2VuIGJhbmQgZm9yIG11bHRpY2hhbm5lbCAobWF0Y2hlZCBieSBpbmRleCksXG4gICAqICBlbHNlIHRoZSBzaW5nbGUgZ3JheXNjYWxlIGNoYW5uZWwuICovXG4gIHByaXZhdGUgc3VyZmFjZVN0YXRlKGNoYW5uZWxzOiBJQ2hhbm5lbFN0YXRlW10pOiBJQ2hhbm5lbFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5zdXJmYWNlQ2hhbm5lbCA9PSBudWxsKSByZXR1cm4gY2hhbm5lbHNbMF07XG4gICAgcmV0dXJuIGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IHRoaXMuc3VyZmFjZUNoYW5uZWwpID8/IGNoYW5uZWxzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIChSZSlidWlsZCB0aGUgc3VyZmFjZSBtZXNoIGZvciBzbGljZSBgemAgZnJvbSB0aGUgcHJlLWxvYWRlZCBwbGFuZSBjYWNoZSAoaW5zdGFudCDigJQgdGhpcyBpc1xuICAgKiB3aGF0IHRoZSBzdGFjayBzbGlkZXIgY2FsbHMpOyBhIHNsaWNlIG1pc3NpbmcgZnJvbSB0aGUgY2FjaGUgaXMgZmV0Y2hlZCBvbiBkZW1hbmQuIG5hcGFyaS1qcydzXG4gICAqIHB1cmUgYGhlaWdodEZpZWxkYCBidWlsZHMgdGhlIHRyaWFuZ2xlIGdyaWQgKHogPSBub3JtYWxpemVkIGludGVuc2l0eSksIHRoZW4gYGFkZFN1cmZhY2VgXG4gICAqIHJlbmRlcnMgaXQuIFRoZSBzbGljZSBwbGFuZSBhbHNvIGZlZWRzIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtIChrZXkgMCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkU3VyZmFjZSh2aWV3ZXI6IFZpZXdlciwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHBsYW5lID0gdGhpcy5zdXJmYWNlUGxhbmVzLmdldCh6KTtcbiAgICBpZiAoIXBsYW5lKSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBsYW5lID0gYXdhaXQgdGhpcy5mZXRjaFN1cmZhY2VQbGFuZSh6LCB0aGlzLnN1cmZhY2VNYXhHcmlkKTtcbiAgICAgICAgdGhpcy5zdXJmYWNlUGxhbmVzLnNldCh6LCBwbGFuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSBzbGljZSBmZXRjaCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwbGFuZSB8fCBwbGFuZS53aWR0aCA8IDIgfHwgcGxhbmUuaGVpZ2h0IDwgMiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCBzdCA9IHRoaXMuc3VyZmFjZVN0YXRlKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSk7XG4gICAgY29uc3Qgd2luOiBbbnVtYmVyLCBudW1iZXJdID0gW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IHdpbjtcbiAgICAvLyBIZWlnaHQgQU5EIGNvbG91ciBhcmUgbm9ybWFsaXplZCBieSB0aGUgc2FtZSBjb250cmFzdCB3aW5kb3csIHNvIGNoYW5naW5nIG1pbi9tYXggcmVzaGFwZXMgdGhlXG4gICAgLy8gc3VyZmFjZSAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSkuIENlbnRlciBpdCBmb3IgdGhlIGF4ZXMgZ2l6bW8uIFRoZVxuICAgIC8vIHBsYW5lIGlzIGFscmVhZHkgZGVjaW1hdGVkIHRvIHRoZSBncmlkIGNhcCDihpIgc3RyaWRlIDEuXG4gICAgY29uc3QgelNjYWxlID0gU1VSRkFDRV9aX0FTUEVDVCAqIE1hdGgubWF4KHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQpO1xuICAgIGNvbnN0IHsgdmVydGljZXMsIGZhY2VzLCB2YWx1ZXMgfSA9IGhlaWdodEZpZWxkKHBsYW5lLmRhdGEsIHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQsIHtcbiAgICAgIHpTY2FsZSxcbiAgICAgIHpMaW1pdHM6IHdpbixcbiAgICAgIGNlbnRlcjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFByZXNlcnZlIHRoZSBvcmJpdCBjYW1lcmEgYWNyb3NzIGEgcmUtc2xpY2UgLyB3aW5kb3cgcmVidWlsZCDigJQgb25seSB0aGUgZmlyc3QgbW91bnQgZnJhbWVzLCBzb1xuICAgIC8vIHN0ZXBwaW5nIHRoZSBzdGFjayBvciBjaGFuZ2luZyB0aGUgd2luZG93IGtlZXBzIHRoZSBjdXJyZW50IHpvb20vcGFuL29yaWVudGF0aW9uLlxuICAgIGNvbnN0IGNhbSA9IHZpZXdlci5jYW1lcmEzZDtcbiAgICBjb25zdCBwcmVzZXJ2ZUNhbWVyYSA9IHRoaXMuc3VyZmFjZUxheWVyICE9IG51bGw7XG4gICAgY29uc3Qgc2F2ZWRUYXJnZXQgPSBjYW0udGFyZ2V0O1xuICAgIGNvbnN0IHNhdmVkRGlzdGFuY2UgPSBjYW0uZGlzdGFuY2U7XG4gICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnN1cmZhY2VMYXllcik7XG4gICAgICB0aGlzLnN1cmZhY2VMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gdmlld2VyLmFkZFN1cmZhY2UodmVydGljZXMsIGZhY2VzLCB2YWx1ZXMsIHtcbiAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiB3aW4sXG4gICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICB3aXJlZnJhbWU6IHRoaXMuc3VyZmFjZVdpcmVmcmFtZSxcbiAgICB9KTtcbiAgICBpZiAocHJlc2VydmVDYW1lcmEpIHtcbiAgICAgIGNhbS50YXJnZXQgPSBzYXZlZFRhcmdldDtcbiAgICAgIGNhbS5kaXN0YW5jZSA9IHNhdmVkRGlzdGFuY2U7XG4gICAgfVxuXG4gICAgdGhpcy5pbWFnZVcgPSBwbGFuZS53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IHBsYW5lLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSB7IHdpZHRoOiBwbGFuZS53aWR0aCwgaGVpZ2h0OiBwbGFuZS5oZWlnaHQsIGRlcHRoOiBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHpTY2FsZSkpIH07XG4gICAgLy8gUmV1c2UgdGhlIHZvbHVtZSBpbnRlbnNpdHktaGlzdG9ncmFtIHBhdGg6IHRoZSBzbGljZSdzIHNjYWxhciBwbGFuZSBpcyB0aGUgaGlzdG9ncmFtIHNvdXJjZS5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgcGxhbmUuZGF0YSk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIHRoZSBzdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIHN1cmZhY2UsIHNvIGhpc3RvZ3JhbVxuICAgKiAgJiBjaGFubmVsLWRpYWxvZyBlZGl0cyB1cGRhdGUgaXQgbGl2ZSB3aXRob3V0IGEgcmUtZmV0Y2guICoqbWluL21heCByZXNoYXBlcyB0aGUgc3VyZmFjZSdzXG4gICAqICBoZWlnaHQqKiAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGEgd2luZG93IGNoYW5nZSByZWJ1aWxkcyB0aGVcbiAgICogIG1lc2ggZ2VvbWV0cnkgKGZyb20gdGhlIGNhY2hlZCBzbGljZSk7IGNvbG91ci1vbmx5IGVkaXRzIChjb2xvcm1hcC9MVVQsIGdhbW1hLCByZXZlcnNlLCBpbnZlcnQpXG4gICAqICBqdXN0IHVwZGF0ZSB0aGUgbGF5ZXIncyB1bmlmb3Jtcy4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY29sb3JtYXAsIHJldmVyc2UsIGludmVydCwgY2hhbm5lbHNdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgIHRoaXMuaW52ZXJ0RW5hYmxlZCA9IGludmVydDtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zdXJmYWNlTGF5ZXI7XG4gICAgICBpZiAoIWxheWVyIHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgICAgY29uc3Qgc3QgPSB0aGlzLnN1cmZhY2VTdGF0ZShjaGFubmVscyk7XG4gICAgICBjb25zdCB3aW46IFtudW1iZXIsIG51bWJlcl0gPSBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV07XG4gICAgICBjb25zdCB3aW5kb3dDaGFuZ2VkID1cbiAgICAgICAgIXRoaXMuc3VyZmFjZVdpbmRvdyB8fCB3aW5bMF0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1swXSB8fCB3aW5bMV0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1sxXTtcbiAgICAgIGlmICh3aW5kb3dDaGFuZ2VkKSB7XG4gICAgICAgIC8vIEhlaWdodCBmb2xsb3dzIHRoZSBjb250cmFzdCB3aW5kb3cg4oaSIHJlYnVpbGQgdGhlIG1lc2ggZm9yIHRoZSBuZXcgW21pbixtYXhdIChjYW1lcmEga2VwdCkuXG4gICAgICAgIHZvaWQgdGhpcy5idWlsZFN1cmZhY2UodGhpcy52aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApLmNhdGNoKChlcnIpID0+XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSB3aW5kb3cgcmVidWlsZCBmYWlsZWQ6JywgZXJyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQ29sb3VyLW9ubHkgY2hhbmdlOiB1cGRhdGUgdW5pZm9ybXMgaW4gcGxhY2UsIG5vIGdlb21ldHJ5IHJlYnVpbGQuXG4gICAgICBsYXllci5jb2xvcm1hcCA9IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpO1xuICAgICAgaWYgKHN0KSB7XG4gICAgICAgIGxheWVyLmNvbnRyYXN0TGltaXRzID0gd2luO1xuICAgICAgICBsYXllci5nYW1tYSA9IHN0LmdhbW1hO1xuICAgICAgfVxuICAgICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXRDYW1lcmFTb29uKCk6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmNhbnZhcyAmJiB0aGlzLmltYWdlVyA+IDAgJiYgdGhpcy5pbWFnZUggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld2VyLmNhbWVyYS5maXQoXG4gICAgICAgICAgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5pbWFnZUgsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0IHx8IHRoaXMuaW1hZ2VILFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHJlcXVlc3RBbmltYXRpb25GcmFtZShydW4pO1xuICAgIGVsc2UgcnVuKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljOyBob3N0IHJlLWRyaXZlcyBwbG90KCkgZnJvbSBpdHMgaW1hZ2Ugc3RyZWFtLiAqL1xuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIC8qIG5vLW9wICovXG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRUb2tlbisrOyAvLyBpbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgZnJhbWUgbG9hZGluZyBmcm9tIHRoZSBwcmV2aW91cyBwbG90XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheT8uZGVzdHJveSgpO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheSA9IG51bGw7XG4gICAgdGhpcy5heGVzTGFiZWxzPy5kZXN0cm95KCk7XG4gICAgdGhpcy5heGVzTGFiZWxzID0gbnVsbDtcbiAgICB0aGlzLnpIYW5kbGU/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnpIYW5kbGUgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lV29ybGRCYXNlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmxhc3RQaXhlbHNSZWN0ID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuY2xlYXIoKTtcbiAgICB0aGlzLnRpbGVkID0gZmFsc2U7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmPy4oKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gbnVsbDtcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZpZXdlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5ob3N0Py5jb250YWlucyh0aGlzLmNhbnZhcykpIHRoaXMuaG9zdC5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyMmRQb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc2NhdHRlcjNkTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMuYXhlc0xheWVyID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgfVxuXG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyBheGlzIHJlc2V0LiAqL1xuICByZXNldEF4ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF1dG9zY2FsZS4gKi9cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQkLm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3ZXIpIHRoaXMudmlld2VyLmNhbWVyYS56b29tID0gdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gKiAxLjM7XG4gIH1cblxuICB6b29tT3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlcikgdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSAvIDEuMztcbiAgfVxuXG4gIHNldERyYWdNb2RlKF9tb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQge1xuICAgIC8vIE5vLW9wOiBwYW4gYW5kIHpvb20gYXJlIGFsd2F5cyB0aGUgbmFwYXJpIGNhbWVyYSdzIGRlZmF1bHQgZ2VzdHVyZXMsIGFuZCBwYW4vem9vbSBnYXRpbmcgZm9yXG4gICAgLy8gZHJhd2luZyBpcyBvd25lZCBieSB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIChzZXRDb250cm9sc0VuYWJsZWQpLiBUb2dnbGluZyBjb250cm9scyBoZXJlXG4gICAgLy8gd291bGQgZmlnaHQgdGhhdCDigJQgdGhlIGhvc3QgY2FsbHMgc2V0RHJhZ01vZGUoZmFsc2UpIGFsb25nc2lkZSBvdmVybGF5LnNldE1vZGUoPHRvb2w+KS5cbiAgfVxuXG4gIHNldE5hdmlnYXRvclZpc2libGUoX3Zpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiBuYXBhcmktanMgaGFzIG5vIG1pbmltYXA7IG5vLW9wICovXG4gIH1cblxuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VTbW9vdGhpbmcgPSBlbmFibGVkO1xuICAgIC8vIEFwcGx5IGxpdmUgdG8gdGhlIHJlbmRlcmVkIGltYWdlIGxheWVyczsgYmFrZWQgaW50byB0aGUgbmV4dCByZW5kZXIgdG9vLlxuICAgIHRoaXMuY2hhbm5lbFZpZXc/LnNldEludGVycG9sYXRpb24oZW5hYmxlZCA/ICdsaW5lYXInIDogJ25lYXJlc3QnKTtcbiAgfVxuXG4gIHNldFNob3dTdGFjayhfc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogc3RhY2sgbmF2aWdhdGVkIHZpYSBzZXRaSW5kZXggKi9cbiAgfVxuXG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvYWRlZCkgdGhpcy5sb2FkZWQueiA9IHpJbmRleDtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgLy8gU3VyZmFjZTogb25lIHNsaWNlIOKGkiBvbmUgbWVzaCwgc28gcmUtYnVpbGQgdGhlIGhlaWdodCBmaWVsZCBmb3IgdGhlIG5ldyBzbGljZS5cbiAgICBpZiAodGhpcy5zdXJmYWNlTGF5ZXIpIHtcbiAgICAgIHZvaWQgdGhpcy5idWlsZFN1cmZhY2UodiwgekluZGV4KS5jYXRjaCgoZXJyKSA9PlxuICAgICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzZXRaSW5kZXggc3VyZmFjZSBmYWlsZWQ6JywgZXJyKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFZvbHVtZSAvIGlzb3N1cmZhY2U6IHN0ZXAgdGhlIHZvbHVtZSdzIHogcGxhbmUgaW4gcGxhY2UuXG4gICAgaWYgKHRoaXMudm9sdW1lVmlldykge1xuICAgICAgdi5kaW1zLnogPSB6SW5kZXg7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGlsZWQgMkQgaW1hZ2U6IGp1c3QgbW92ZSB0aGUgZGltcyBwbGFuZSDigJQgdGhlIHRpbGVkIHZpc3VhbCBmZXRjaGVzIHRoZSBuZXcgc2xpY2UncyB0aWxlc1xuICAgIC8vIChjYWNoZWQgcGVyIHopLCBubyBsYXllciByZWJ1aWxkLiBSZWZyZXNoIHRoZSBjb2Fyc2UgaGlzdG9ncmFtIHNhbXBsZSBmb3IgdGhlIG5ldyBzbGljZS5cbiAgICBpZiAodGhpcy50aWxlZCkge1xuICAgICAgdi5kaW1zLnogPSB6SW5kZXg7XG4gICAgICBpZiAodGhpcy5kZXNjcmlwdG9yKSB2b2lkIHRoaXMucmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXMoekluZGV4LCB0aGlzLmRlc2NyaXB0b3IpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIDJEIGltYWdlIChzdGl0Y2ggZmFsbGJhY2spOiByZS1yZW5kZXIgdGhlIHNsaWNlIChyZS1mZXRjaGVzIHBlci1jaGFubmVsIC8gY29tcG9zaXRlKS4gQnJhbmNoXG4gICAgLy8gb2YgYSB2b2x1bWUgbGF5ZXIgKG5vdCBjdXJyZW50UGxvdFR5cGUsIHdoaWNoIGNvdWxkIGJlIHN0YWxlIGFuZCBzaWxlbnRseSBuby1vcCB0aGUgc3dhcCkuXG4gICAgLy8gVGhlIHRva2VuIGxldHMgcmVuZGVySW1hZ2UgZHJvcCBhIHN1cGVyc2VkZWQgc2NydWIgc28gYSBzbG93IG9sZGVyIHNsaWNlIGNhbid0IGNsb2JiZXIgYSBuZXdlciBvbmUuXG4gICAgY29uc3QgcmVxID0gKyt0aGlzLnNsaWNlUmVxO1xuICAgIHZvaWQgdGhpcy5yZW5kZXJJbWFnZSh6SW5kZXgsIHJlcSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHJlcSA9PT0gdGhpcy5zbGljZVJlcSkgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzbGljZSBmYWlsZWQ6JywgZXJyKSk7XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgaW4tZmxpZ2h0IGZyYW1lIGxvYWRpbmc6IGJ1bXAgdGhlIGxvYWQgZ2VuZXJhdGlvbiBzbyB0aGUgdm9sdW1lLWFzc2VtYmx5IC8gc3VyZmFjZVxuICAgKiAgcHJlbG9hZCB3b3JrZXJzIHN0b3AgZmV0Y2hpbmcgbW9yZSBmcmFtZXMsIGFuZCBjbGVhciB0aGUgbG9hZGluZyBmbGFnICsgcHJvZ3Jlc3MuICovXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkVG9rZW4rKztcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgfVxuXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDAgPyB7IHdpZHRoOiB0aGlzLmltYWdlVywgaGVpZ2h0OiB0aGlzLmltYWdlSCB9IDogbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFBpeGVscztcbiAgfVxuXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgaWYgKCF2IHx8ICFzaXplKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByID0gdi52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIHIueCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIHIueSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGg6IE1hdGgubWluKHNpemUud2lkdGgsIHIueCArIHIud2lkdGgpIC0geCxcbiAgICAgIGhlaWdodDogTWF0aC5taW4oc2l6ZS5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KSAtIHksXG4gICAgfTtcbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgfVxuXG4gIC8qKiBNYXAgYSBQbG90bHktc3R5bGUgM0QgZHJhZyBtb2RlIG9udG8gbmFwYXJpLWpzJ3MgY2FtZXJhIGRyYWcgbW9kZS4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCBtID0gbW9kZSA9PT0gJ3BhbicgPyAncGFuJyA6IG1vZGUgPT09ICd6b29tJyA/ICd6b29tJyA6ICdyb3RhdGUnOyAvLyBvcmJpdC90dXJudGFibGUg4oaSIHJvdGF0ZVxuICAgIHRoaXMudmlld2VyLnNldENhbWVyYURyYWdNb2RlKG0pO1xuICB9XG5cbiAgLyoqIFJlLWZyYW1lIHRoZSAzRCBjYW1lcmEgb24gdGhlIGN1cnJlbnQgM0QgbGF5ZXIuIEEgc3VyZmFjZSBtZXNoIHNpdHMgaW4gdGhlIHBvc2l0aXZlIG9jdGFudFxuICAgKiAgKG5vdCBjZW50cmVkKSwgc28gZnJhbWUgaXQgYnkgaXRzIG93biBib3VuZHM7IGEgdm9sdW1lL2lzb3N1cmZhY2UgdXNlcyBpdHMgY2VudHJlZCBib3guICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgbWVzaExheWVyID0gdGhpcy5zdXJmYWNlTGF5ZXIgPz8gdGhpcy5zY2F0dGVyM2RMYXllcjtcbiAgICBpZiAobWVzaExheWVyKSB7XG4gICAgICBjb25zdCBiID0gbWVzaExheWVyLmJvdW5kcygpO1xuICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhM2QudGFyZ2V0ID0gYi5jZW50ZXI7XG4gICAgICB0aGlzLnZpZXdlci5jYW1lcmEzZC5kaXN0YW5jZSA9IE1hdGgubWF4KGIucmFkaXVzICogMi41LCAxZS0zKTtcbiAgICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IHRoaXMudm9sdW1lRGltcztcbiAgICBpZiAoZCkgdGhpcy52aWV3ZXIuY2FtZXJhM2QuZnJhbWUoZC53aWR0aCwgZC5oZWlnaHQsIGQuZGVwdGgpO1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gVGhlIFdlYkdQVSBuYXBhcmktanMgb3B0aW9ucywgb2ZmZXJlZCBhbG9uZ3NpZGUgKG5vdCByZXBsYWNpbmcpIHRoZSBPU0QvUGxvdGx5IHR5cGVzLlxuICAgIHJldHVybiBbXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lNQUdFXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVJdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU1VSRkFDRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0RdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfVk9MVU1FXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0VdISxcbiAgICBdO1xuICB9XG5cbiAgLyoqIFRoZSBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yICgxID0gZnVsbCDigKYgOCA9IOKFmykuIFJlYWQgYnkgdGhlIHRvb2xiYXIgdG8gaW5pdCB0aGUgY29udHJvbC4gKi9cbiAgZ2V0UmVzb2x1dGlvblNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvblNjYWxlO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZGVjaW1hdGUgZmFjdG9yIGZvciB0aGUgbmFwYXJpIDNEIHR5cGVzLiBUYWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgKHJlKWxvYWQg4oCUIHRoZSBob3N0XG4gICAqICByZS1wbG90cyBhZnRlciBjYWxsaW5nIHRoaXMsIHNpbmNlIGRlY2ltYXRpb24gY2hhbmdlcyB0aGUgZmV0Y2hlZC9hc3NlbWJsZWQgZGF0YS4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc29sdXRpb25TY2FsZSA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICByZW5kZXJJbnRlbnNpdHlJbnNldChfZGl2SWQ6IHN0cmluZywgX3Byb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICAvKiBQbG90bHkgb3ducyB0aGUgaW50ZW5zaXR5IGluc2V0ICovXG4gIH1cblxuICAvKiogUmVhZCB0aGUgZGlzcGxheWVkIGNvbXBvc2l0ZSBpbnRvIGBsYXN0UGl4ZWxzYCAodGhlIHBpeGVsLXRvb2xzJyBzb3VyY2UpICsgZW1pdCB0aGUgY2xhbXBlZFxuICAgKiAgdmlzaWJsZSByZWdpb24uIEEgZnJlc2ggUGl4ZWxEYXRhIG9iamVjdCBtZWFucyBjYWNoZWRJbWFnZURhdGEoKSByZWJ1aWxkcyBhdXRvbWF0aWNhbGx5LiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blJlYWRiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHggPSBhd2FpdCB2LnJlYWREaXNwbGF5ZWRQaXhlbHMoKTtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdikgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IHYudmlzaWJsZVdvcmxkUmVjdCgpOyAvLyBjYXB0dXJlIFdJVEggdGhlIHBpeGVscyAoc2FtZSBjYW1lcmEpXG4gICAgICB0aGlzLmxhc3RQaXhlbHMgPSBweDtcbiAgICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSByZWN0O1xuICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICAgICAgaWYgKHNpemUgJiYgcmVjdCkge1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2l6ZS53aWR0aCwgcmVjdC54KSk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLmhlaWdodCwgcmVjdC55KSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS53aWR0aCAtIHgsIHJlY3Qud2lkdGgpKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS5oZWlnaHQgLSB5LCByZWN0LmhlaWdodCkpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5uZXh0KHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHJlYWRiYWNrIHVuYXZhaWxhYmxlICovXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlYWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHZvaWQgdGhpcy5ydW5SZWFkYmFjaygpKTtcbiAgICBlbHNlIHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCksIDApO1xuICB9XG5cbiAgLyoqIERlYm91bmNlZCByZWFkYmFjayDigJQgYXJtZWQgb24gY2FtZXJhIGNoYW5nZXMgc28gYGxhc3RQaXhlbHNgIHRyYWNrcyB0aGUgY3VycmVudCB2aWV3IGFmdGVyIGFcbiAgICogIHBhbi96b29tIHNldHRsZXMgKGFuZCBhZnRlciB0aWxlZCBsZXZlbHMgZmluaXNoIGxvYWRpbmcpLCB3aGljaCB0aGUgb24tY2FudmFzIHBpeGVsIHRvb2xzXG4gICAqICAod2FuZC9icnVzaC9TQU0pIHJlYWQgc3luY2hyb25vdXNseS4gQ29hbGVzY2VzIHJhcGlkIGNoYW5nZXMuICovXG4gIHByaXZhdGUgYXJtUmVhZGJhY2soZGVsYXlNcyA9IDI1MCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgdGhpcy5yZWFkYmFja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgICAgdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCk7XG4gICAgfSwgZGVsYXlNcyk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlICsgY2xhc3NpZmljYXRpb24gY29sb3VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIC8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gdGhlIE9TRCBiYWNrZW5kKS5cblxuICAvLyDilIDilIAgUGl4ZWwgdG9vbHM6IHJldXNlIHRoZSBzaGFyZWQsIGJhY2tlbmQtYWdub3N0aWMgdG9vbCBzZXJ2aWNlcyB3aXRoIGEgbmFwYXJpIGhvc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEJ1aWxkIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSArIHRvb2wgaG9zdHMgZm9yIHRoZSBjdXJyZW50IHZpZXdlciAoY2FsbGVkIGZyb20gcGxvdCgpKS4gVGhlXG4gICAqICBwaXhlbCB0b29scyByZWFkIGRpc3BsYXllZCBwaXhlbHMgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIGFuZCBjb252ZXJ0IHBvaW50ZXJcbiAgICogIGNvb3JkcyB2aWEgdGhlIG5hcGFyaSBjYW1lcmEsIGV4YWN0bHkgbWlycm9yaW5nIHRoZSBPU0QgaG9zdC4gKi9cbiAgcHJpdmF0ZSBidWlsZFRvb2xIb3N0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG5ldyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgdGhpcy52aWV3ZXIsXG4gICAgICAoKSA9PiAhIXRoaXMudmlld2VyICYmIHRoaXMuaW1hZ2VXID4gMCxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnJlZ2lvblN0b3JlO1xuICAgIHRoaXMud2FuZEhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiByZWdpb25zLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyKSA9PiByZWdpb25zLnNldFJlZ2lvbnMociksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuY2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiB0aGlzLmxvYWRlZD8ueiA/PyAwLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5ob3N0LFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiB0aGlzLmxvYWRlZD8uZmlsZW5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiByZWdpb25zLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHJlZ2lvbnMuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvbnMuc2V0UmVnaW9ucyhyKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmhvc3QsXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZURhdGEoKT8ucmF0aW9zWzBdID8/IDEsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgem9vbUJveEhvc3QoKTogWm9vbVRvQm94VG9vbEhvc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQbG90RGl2OiAoKSA9PiB0aGlzLnBsb3REaXZJZCxcbiAgICAgIHBpeGVsVG9EYXRhOiAocHgsIHB5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoIXRoaXMudmlld2VyIHx8ICFyZWN0KSByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQocmVjdC5sZWZ0ICsgcHgsIHJlY3QudG9wICsgcHkpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgICB9LFxuICAgICAgYXBwbHlab29tVG9Cb3g6IChjb29yZHMpID0+IHRoaXMuYXBwbHlab29tVG9Cb3goY29vcmRzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFpvb20vcGFuIHRoZSBjYW1lcmEgdG8gZml0IGEgZGF0YS1zcGFjZSByZWN0YW5nbGUgYFt4TWluLCB4TWF4LCB5TWF4LCB5TWluXWAuICovXG4gIHByaXZhdGUgYXBwbHlab29tVG9Cb3goY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdiB8fCAhdGhpcy5jYW52YXMgfHwgY29vcmRpbmF0ZXMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuICAgIGNvbnN0IFt4TWluLCB4TWF4LCB5QSwgeUJdID0gY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgeDAgPSBNYXRoLm1pbih4TWluLCB4TWF4KTtcbiAgICBjb25zdCB4MSA9IE1hdGgubWF4KHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHkwID0gTWF0aC5taW4oeUEsIHlCKTtcbiAgICBjb25zdCB5MSA9IE1hdGgubWF4KHlBLCB5Qik7XG4gICAgY29uc3QgdyA9IE1hdGgubWF4KDEsIHgxIC0geDApO1xuICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCB5MSAtIHkwKTtcbiAgICBjb25zdCB2dyA9IHRoaXMuY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgdmggPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgaDtcbiAgICB2LmNhbWVyYS5jZW50ZXIgPSBbKHgwICsgeDEpIC8gMiwgKHkwICsgeTEpIC8gMl07XG4gICAgdi5jYW1lcmEuem9vbSA9IE1hdGgubWluKHZ3IC8gdywgdmggLyBoKTtcbiAgICB2LnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBDYWNoZWRJbWFnZURhdGEgZnJvbSB0aGUgbW9zdCByZWNlbnQgcmVhZGJhY2sgKFJHQkEgZGV2aWNlIHBpeGVscyDihpIgW3ldW3hdPVtyLGcsYl0pLFxuICAgKiAgd2l0aCByYXRpb3Mvb3JpZ2luIG1hcHBpbmcgaW1hZ2UgY29vcmRzIOKGlCByZWFkYmFjayBwaXhlbHMuIENhY2hlZCB1bnRpbCB0aGUgcmVhZGJhY2sgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZURhdGEoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmxhc3RQaXhlbHM7XG4gICAgaWYgKCFweCB8fCAhdGhpcy52aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNhY2hlZEltYWdlICYmIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPT09IHB4KSByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgICBjb25zdCB3ID0gcHgud2lkdGg7XG4gICAgY29uc3QgaCA9IHB4LmhlaWdodDtcbiAgICBjb25zdCBkYXRhID0gcHguZGF0YTtcbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW11bXSA9IG5ldyBBcnJheShoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xuICAgICAgY29uc3Qgcm93OiBudW1iZXJbXVtdID0gbmV3IEFycmF5KHcpO1xuICAgICAgY29uc3QgYmFzZSA9IHkgKiB3ICogNDtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdzsgeCsrKSB7XG4gICAgICAgIGNvbnN0IG8gPSBiYXNlICsgeCAqIDQ7XG4gICAgICAgIHJvd1t4XSA9IFtkYXRhW29dLCBkYXRhW28gKyAxXSwgZGF0YVtvICsgMl1dO1xuICAgICAgfVxuICAgICAgbWF0cml4W3ldID0gcm93O1xuICAgIH1cbiAgICAvLyBVc2UgdGhlIHJlY3QgY2FwdHVyZWQgV0lUSCB0aGlzIHJlYWRiYWNrIChub3QgdGhlIGxpdmUgb25lKSBzbyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZVxuICAgIC8vIG1hdHJpeCdzIGNhbWVyYSDigJQgb3RoZXJ3aXNlIGEgcGFuL3pvb20gc2luY2UgdGhlIHJlYWRiYWNrIG1pcy1zY2FsZXMgdGhlIHRyYWNlZCByZWdpb24uXG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGFzdFBpeGVsc1JlY3QgPz8gdGhpcy52aWV3ZXIudmlzaWJsZVdvcmxkUmVjdCgpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSB7XG4gICAgICBmcmFtZXM6IFttYXRyaXhdLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyZWN0LndpZHRoIC8gdywgcmVjdC5oZWlnaHQgLyBoXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIG9yaWdpblg6IHJlY3QueCxcbiAgICAgIG9yaWdpblk6IHJlY3QueSxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBweDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVG9vbENvbnRyb2xsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENvbnRyb2wgZ2F0aW5nOiBhIHRvb2wgdGhhdCBBQ1RJVkFURVMgZGlzYWJsZXMgdGhlIGNhbWVyYSBjb250cm9sczsgZGVhY3RpdmF0aW9uIGlzIGEgbm8tb3BcbiAgLy8gYmVjYXVzZSB0aGUgaG9zdCBhbHdheXMgY2FsbHMgdGhlIHJlZ2lvbiBvdmVybGF5J3Mgc2V0TW9kZSBGSVJTVCBpbiBlYWNoIHRvZ2dsZSAod2hpY2ggc2V0c1xuICAvLyB0aGUgYmFzZWxpbmUgZW5hYmxlZC9kaXNhYmxlZCksIHNvIHJlLWVuYWJsaW5nIGhlcmUgd291bGQgZmlnaHQgYSBmcmVzaGx5LWFjdGl2YXRlZCBkcmF3IG1vZGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjsgLy8gbm8gcGxvdCB5ZXQg4oaSIG5vdGhpbmcgdG8gZHJpdmVcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hcm1SZWFkYmFjaygwKTtcbiAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy53YW5kVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLndhbmRUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucygob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKTtcbiAgfVxuICBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuYXJtUmVhZGJhY2soMCk7XG4gICAgaWYgKHRoaXMud2FuZEhvc3QpIHRoaXMuYnJ1c2hUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMuYnJ1c2hUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy5zaXplICE9IG51bGwpIHRoaXMuYnJ1c2hUb29sLnNldFNpemUob3B0aW9ucy5zaXplKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuZXJhc2VySG9zdCkgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgLy8gU0FNIC8gY2VsbHBvc2Ug4oCUIHNlcnZlciByb3VuZC10cmlwcyB0aGF0IHJlYWQgdGhlIGRyYXduIHJlY3RhbmdsZXMgKyBkaXNwbGF5ZWQgcGl4ZWxzIHRocm91Z2hcbiAgLy8gdGhlIHNhbWUgd2FuZCBob3N0IChyZWN0YW5nbGVzIGZyb20gdGhlIFJlZ2lvblN0b3JlLCBpbWFnZSBmcm9tIHRoZSByZWFkYmFjaykuXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy53YW5kSG9zdCkgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpOyAvLyB0aGUgU0FNIGVtYmVkZGluZyBzYW1wbGVzIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlXG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgYXN5bmMgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMud2FuZEhvc3QgfHwgIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygwKTsgLy8gcmVmcmVzaCB0aGUgcmVhZGJhY2sgdGhlIGNsaWNrJ3MgZW1iZWRkaW5nIHdpbGwgc2FtcGxlXG4gICAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJSW50ZW5zaXR5U2FtcGxpbmc6IFBsb3RseSBvd25zIHNhbXBsaW5nOyBlbWl0IHZpZXdwb3J0IGNoYW5nZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKF9pbWFnZUluZm86IElJbWFnZUluZm8sIF96SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koXG4gICAgX3g6IG51bWJlcixcbiAgICBfeTogbnVtYmVyLFxuICAgIF93aWR0aDogbnVtYmVyLFxuICAgIF9oZWlnaHQ6IG51bWJlcixcbiAgICBfekluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge31cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciBjb21wb3NpdGUgbWVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudm9sdW1lVmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcgJiYgIXRoaXMuc3VyZmFjZUxheWVyICYmICF0aGlzLnNjYXR0ZXIzZExheWVyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3VyZmFjZURyYWdNb2RlOiAobW9kZTogc3RyaW5nKTogdm9pZCA9PiB0aGlzLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKSxcbiAgICAgIHJlc2V0U3VyZmFjZUNhbWVyYTogKCk6IHZvaWQgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSxcbiAgICAgIHNldEF4ZXNWaXNpYmxlOiAodmlzaWJsZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmF4ZXNWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgdGhpcy5heGVzTGFiZWxzPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLmF4ZXNMYXllci52aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXhlc1Zpc2libGU6ICgpOiBib29sZWFuID0+IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgICAvLyBTdXJmYWNlIHdpcmVmcmFtZSAobmFwYXJpLWpzIHN1cmZhY2Ugb25seSkg4oCUIGEgbGl2ZSBsYXllciBwcm9wZXJ0eSwgbm8gcmVidWlsZCBuZWVkZWQuXG4gICAgICBzZXRXaXJlZnJhbWU6IChvbjogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1cmZhY2VXaXJlZnJhbWUgPSBvbjtcbiAgICAgICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICAgICAgdGhpcy5zdXJmYWNlTGF5ZXIud2lyZWZyYW1lID0gb247XG4gICAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdpcmVmcmFtZTogKCk6IGJvb2xlYW4gPT4gdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH07XG4gIH1cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuIG51bGw7XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiB0aGUgYXNzZW1ibGVkIChkb3duc2FtcGxlZCkgdWludDggdm9sdW1lIGZvciB0aGVcbiAgICAvLyByZXF1ZXN0ZWQgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUgKGtleSAwKS5cbiAgICBpZiAodGhpcy52b2x1bWVDaGFubmVsRGF0YS5zaXplKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy52b2x1bWVDaGFubmVsRGF0YS5nZXQoY2hhbm5lbEluZGV4KSA/PyB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmdldCgwKTtcbiAgICAgIHJldHVybiBkYXRhID8gdGhpcy50b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKGRhdGEsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gVGlsZWQgbW9kZSBoYXMgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKGkiB1c2UgdGhlIGNvYXJzZSBwZXItY2hhbm5lbCBzYW1wbGUgKFJHQjogcmVhZGJhY2spLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuaGlzdFNhbXBsZXMuZ2V0KHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsSW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZSA/IHRoaXMudG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihzYW1wbGUsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gR3JheXNjYWxlL211bHRpY2hhbm5lbCAoc3RpdGNoKTogbmF0aXZlIHBlci1jaGFubmVsIGhpc3RvZ3JhbSBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnlcbiAgICAvLyBzY2FsYXIgbGF5ZXIgKG5vIEdQVSByZWFkYmFjaykuIFJHQjogYmluIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzJyBSL0cvQiBieXRlICg4LWJpdCBjbGllbnQgcGF0aCkuXG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmNoYW5uZWxWaWV3Py5sYXllcnNbdGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnID8gMCA6IGNoYW5uZWxJbmRleF07XG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBjb25zdCBoID0gdi5sYXllckhpc3RvZ3JhbShsYXllciwgYmlucyk7XG4gICAgICBpZiAoaCkgcmV0dXJuIHRoaXMudG9JSGlzdG9ncmFtKGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgLy8gPjgtYml0IGNoYW5uZWxzOiBmZXRjaCB0aGUgdHJ1ZSBuYXRpdmUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciAodGhlIGRpc3BsYXllZCBwaXhlbHNcbiAgICAvLyBhcmUgOC1iaXQsIHNvIHRoZSBjbGllbnQgaGlzdG9ncmFtIHdvdWxkIGJlIGNsaXBwZWQpLiA4LWJpdCBjaGFubmVscyB1c2UgdGhlIGNsaWVudCBwYXRoLlxuICAgIGNvbnN0IGJpdERlcHRoID0gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gICAgaWYgKGJpdERlcHRoID4gOCkge1xuICAgICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgICBjb25zdCBrZXkgPSBgJHt6fXwke2NoYW5uZWxJbmRleH1gO1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYXRpdmVIaXN0b2dyYW1zLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucywgeiwga2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCArIGNhY2hlIG9uZSBjaGFubmVsJ3MgbmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW0gZnJvbSBgR0VUIC9oaXN0b2dyYW1gICg+OC1iaXQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTmF0aXZlSGlzdG9ncmFtKFxuICAgIGNoYW5uZWw6IG51bWJlcixcbiAgICBiaW5zOiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWhpc3RvZ3JhbT9pbmZvPSR7aW5mb0I2NH0mY2hhbm5lbD0ke2NoYW5uZWx9Jno9JHt6fSZiaW5zPSR7Ymluc31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHJldHVybiBudWxsOyAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIHRyYW5zaWVudCDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllc1xuICAgICAgY29uc3QgaGkgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICAgICAgYml0RGVwdGg6IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNaW46IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNYXg6IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IG51bWJlcjtcbiAgICAgICAgYmluV2lkdGg6IG51bWJlcjtcbiAgICAgICAgY291bnRzOiBudW1iZXJbXTtcbiAgICAgIH07XG4gICAgICBpZiAoIWhpPy5jb3VudHMpIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgb3V0OiBJSGlzdG9ncmFtID0ge1xuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF0aXZlIGhpc3RvZ3JhbSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBvZiB0aGUgZGlzcGxheWVkIFJHQiBjb21wb3NpdGUgKFIvRy9CIGJ5dGUpLCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrLiAqL1xuICBwcml2YXRlIHJnYkhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGlmICghcHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyLCBjaGFubmVsSW5kZXgpKTtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjU2LCBNYXRoLmZsb29yKGJpbnMpIHx8IDI1NikpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBBcnJheShuKS5maWxsKDApO1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTsgLy8gc2tpcCB0cmFuc3BhcmVudCBwYWRkaW5nXG4gICAgICBjb3VudHNbTWF0aC5taW4obiAtIDEsIChkYXRhW2kgKyBiYW5kXSAqIG4pID4+IDgpXSsrO1xuICAgIH1cbiAgICBjb25zdCBiaW5zQXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4gKGkgKiAyNTYpIC8gbik7XG4gICAgcmV0dXJuIHsgYmluczogYmluc0FyciwgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHZvaWQgdi5zY3JlZW5zaG90KCkudGhlbigoYmxvYikgPT4ge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ25hcGFyaS1qcy5wbmcnO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIH0pO1xuICB9XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoICgxNi8zMi1iaXQpIG11bHRpLWJhbmQgVElGRiBleHBvcnQgdmlhIHRoZSBzZXJ2ZXIgYC9leHBvcnQvdGlmZmAgZW5kcG9pbnQg4oCUXG4gICAqICB0aGUgZGlzcGxheWVkIFBORyBpcyBhbiA4LWJpdCBmaWd1cmUsIHRoaXMgcHJlc2VydmVzIHRoZSB0cnVlIHBpeGVsIHZhbHVlcy4gVmlzaWJsZSBjaGFubmVsc1xuICAgKiAgb25seSAob21pdHRlZCB3aGVuIGFsbCBhcmUgdmlzaWJsZSDihpIgc2VydmVyIGRlZmF1bHQpLiBNaXJyb3JzIHRoZSBPU0QgYmFja2VuZC4gKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgdmlzaWJsZSA9IHN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgc3RhdGVzLmxlbmd0aCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5sb2FkZWQ/LmZpbGVuYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBzdGF0dXMgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgIHNhdmVBcyhhd2FpdCByZXNwLmJsb2IoKSwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59XG4iXX0=
2294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQWMsZUFBZSxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbkcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gscUJBQXFCLEVBQ3JCLHNCQUFzQixHQUN2QixNQUFNLFdBQVcsQ0FBQztBQWdCbkIsT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUNMLFFBQVEsRUFFUixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsZUFBZSxFQUNmLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSwyQkFBMkIsQ0FBQztBQVNuQyxPQUFPLEVBRUwsYUFBYSxFQUNiLGNBQWMsR0FDZixNQUFNLHVDQUF1QyxDQUFDO0FBSS9DLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQWtCLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFF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QUksQ0FBQyxVQUFVLENBQUM7UUFDM0IsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsU0FBUyxDQUFDLDJCQUEyQjtZQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkQsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxPQUFPLEVBQUUsSUFBSSxFQUFF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QUFFLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDOzhHQXJ2RVUsdUJBQXVCLGtCQW9JeEIsZ0JBQWdCLHdUQVVKLGNBQWMsc0VBRTFCLFVBQVU7a0hBaEpULHVCQUF1QixjQURWLE1BQU07OzJGQUNuQix1QkFBdUI7a0JBRG5DLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFxSTdCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFVdkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjOzswQkFFakMsTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHtcbiAgVmlld2VyLFxuICBoaXN0b2dyYW1TY2FsYXIsXG4gIGNvbG9ybWFwRnJvbUx1dCxcbiAgdGludENvbG9ybWFwLFxuICByZXZlcnNlQ29sb3JtYXAsXG4gIGhlaWdodEZpZWxkLFxuICBNdWx0aUNoYW5uZWxJbWFnZVZpZXcsXG4gIE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcsXG59IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF4ZXNMYXllcixcbiAgU3VyZmFjZUxheWVyLFxuICBQb2ludHNMYXllcixcbiAgUG9pbnRzM0RMYXllcixcbiAgVGlsZWRTb3VyY2UsXG4gIFRpbGVLZXksXG4gIFBpeGVsQ2h1bmssXG4gIENoYW5uZWxWaWV3LFxuICBWb2x1bWVDaGFubmVsLFxuICBDb2xvcm1hcCxcbn0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ2hhbm5lbFN0YXRlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBidWlsZENvbG9ybWFwTHV0LCBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIFBMT1RfVFlQRV9ERVNDUklQVE9SUyxcbiAgaXNOYXBhcmkzZCxcbiAgaXNOYXBhcmlJc29zdXJmYWNlLFxuICBpc05hcGFyaVN1cmZhY2UsXG4gIGlzTmFwYXJpU2NhdHRlcixcbiAgaXNOYXBhcmlTY2F0dGVyM2QsXG4gIE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIElWaXN1YWxpemVyLFxuICBQaXhlbERhdGEsXG4gIEludGVuc2l0eVByb2ZpbGUsXG4gIElJc29zdXJmYWNlQ29udHJvbHMsXG4gIElJbnRlbnNpdHlDb250cm9scyxcbiAgSVN1cmZhY2UzZENvbnRyb2xzLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQge1xuICBWaWV3ZXJDYXBhYmlsaXRpZXMsXG4gIFZpZXdlckZlYXR1cmUsXG4gIGNhcGFiaWxpdGllc09mLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IENvbG9ybWFwTm9kZSwgSVdhbmRPcHRpb25zLCBJQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgVElMRV9BQ0NFU1NfUE9SVCwgVGlsZUFjY2Vzc1BvcnQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5pbXBvcnQgeyBCYXNlU3RvcmVWaXN1YWxpemVyIH0gZnJvbSAnLi4vYmFzZS1zdG9yZS12aXN1YWxpemVyJztcbmltcG9ydCB7IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSB9IGZyb20gJy4uL3NpbXBsZS1zbGljZS1hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlTY2FsZUJhciwgZm9ybWF0VW0gfSBmcm9tICcuL25hcGFyaS1zY2FsZS1iYXInO1xuaW1wb3J0IHsgTmFwYXJpUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vbmFwYXJpLXJlZ2lvbi1vdmVybGF5JztcbmltcG9ydCB7IE5hcGFyaUF4ZXNMYWJlbHMsIEF4aXNMYWJlbFNwZWMgfSBmcm9tICcuL25hcGFyaS1heGVzLWxhYmVscyc7XG5pbXBvcnQgeyBOYXBhcmlWb2x1bWVaSGFuZGxlIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXotaGFuZGxlJztcbmltcG9ydCB7XG4gIElDb29yZGluYXRlVHJhbnNmb3JtLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29vcmRpbmF0ZS10cmFuc2Zvcm0uY29udHJhY3QnO1xuaW1wb3J0IHsgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QsIENhY2hlZEltYWdlRGF0YSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBXYW5kT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gIFZlcnRleEVyYXNlclRvb2xIb3N0LFxufSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gIFpvb21Ub0JveFRvb2xIb3N0LFxufSBmcm9tICcuLi8uLi90b29sYmFyL3pvb20tdG8tYm94L3pvb20tdG8tYm94LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtUG9pbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNlbGxTZWdtZW50ZXIsIENFTExfU0VHTUVOVEVSIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcblxuLyoqIElDb29yZGluYXRlVHJhbnNmb3JtIG92ZXIgdGhlIG5hcGFyaSBjYW1lcmE6IHBvaW50ZXIgY2xpZW50IGNvb3JkcyDihpQgaW1hZ2Uvd29ybGQgY29vcmRzLiAqL1xuY2xhc3MgTmFwYXJpQ29vcmRpbmF0ZVRyYW5zZm9ybSBpbXBsZW1lbnRzIElDb29yZGluYXRlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IHtcbiAgICAgIGNhbnZhc1RvV29ybGQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgcmVhZG9ubHkgY2FtZXJhOiB7IHpvb206IG51bWJlciB9O1xuICAgIH0sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWFkeTogKCkgPT4gYm9vbGVhbixcbiAgKSB7fVxuICBjbGllbnRUb0RhdGEoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG4gIGRhdGFMZW5ndGhUb1NjcmVlbihkYXRhTGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRhTGVuZ3RoICogdGhpcy52aWV3ZXIuY2FtZXJhLnpvb207IC8vIENTUyBweCBwZXIgd29ybGQgdW5pdFxuICB9XG4gIGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxufVxuXG4vKiogT3BhcXVlIGhhbmRsZSBmcm9tIHtAbGluayBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5sb2FkfSwgcGFzc2VkIGJhY2sgdG8gcGxvdCgpLiAqL1xuaW50ZXJmYWNlIE5hcGFyaUxvYWRlZCB7XG4gIGltYWdlSW5mbzogSUltYWdlSW5mbztcbiAgejogbnVtYmVyO1xuICAvKiogTXVzdCBtYXRjaCBgSUltYWdlSW5mby5maWxlTmFtZWAg4oCUIHRoZSByZW5kZXIgb3JjaGVzdHJhdG9yIGRyb3BzIHRoZSByZXN1bHQgaWYgdGhlXG4gICAqICBoYW5kbGUncyBgZmlsZW5hbWVgIGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCBpbWFnZSAoZ3VhcmRzIGFnYWluc3Qgc3RhbGUgY2xpY2tzKS4gKi9cbiAgZmlsZW5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgVk9MVU1FX01BWF9TTElDRSA9IDEwMjQ7IC8vIFwiRnVsbFwiIGluLXBsYW5lIGNhcDsgdGhlIGRlZmF1bHQgwrwgbG9hZCB1c2VzIDI1NlxuLyoqIFJlZmVyZW5jZSBpbi1wbGFuZSB3b3JsZCBzaXplIChsb25nIHNpZGUpIGZvciB0aGUgdm9sdW1lL2F4ZXMgYm94LCBpbiBhcmJpdHJhcnkgd29ybGQgdW5pdHMuXG4gKiAgVGhlIGJveCBpcyBhbmNob3JlZCB0byB0aGlzIHJlZmVyZW5jZSByZWdhcmRsZXNzIG9mIHRoZSBjaG9zZW4gZGVjaW1hdGUgZmFjdG9yLCBzbyBjaGFuZ2luZyB0aGVcbiAqICByZXNvbHV0aW9uIGNoYW5nZXMgREVUQUlMLCBub3QgdGhlIHZvbHVtZSdzIHByb3BvcnRpb25zIChaIG5vIGxvbmdlciBhcHBlYXJzIHRvIHNocmluayB3aGVuIHRoZVxuICogIGluLXBsYW5lIHNhbXBsaW5nIGdyb3dzKS4gU2V0IHRvIHRoZSBERUZBVUxUIGRlY2ltYXRlJ3MgaW4tcGxhbmUgY2FwIHNvIHRoZSBkZWZhdWx0IHZpZXcgaXNcbiAqICB1bmNoYW5nZWQ7IGhpZ2hlci9sb3dlciByZXNvbHV0aW9ucyBrZWVwIHRoYXQgc2FtZSBzaGFwZS4gU2VlIHtAbGluayBtb3VudFZvbHVtZX0uICovXG5jb25zdCBWT0xVTUVfV09STERfSU5QTEFORV9SRUYgPSBWT0xVTUVfTUFYX1NMSUNFIC8gTkFQQVJJX0RFRkFVTFRfREVDSU1BVEU7XG4vKiogTWF4IGNvbmN1cnJlbnQgc2xpY2UgZmV0Y2hlcyB3aGVuIGFzc2VtYmxpbmcgYSB2b2x1bWUg4oCUIGtlZXBzIHRoZSBjb25uZWN0aW9uIHBvb2wgYnVzeVxuICogIHdpdGhvdXQgZmxvb2RpbmcgaXQgKGJyb3dzZXJzIGNhcCB+Ni9ob3N0KSBvbiBhIGRlZXAgc3RhY2suICovXG5jb25zdCBWT0xVTUVfRkVUQ0hfQ09OQ1VSUkVOQ1kgPSA4O1xuXG4vKiogVm9sdW1lL2lzb3N1cmZhY2Ugc2FtcGxpbmcgZm9yIGEgZGVjaW1hdGUgZmFjdG9yIGBzY2FsZWAgKDEgPSBGdWxsIDEwMjQsIDIgPSDCvSA1MTIsIDQgPSDCvCAyNTZcbiAqICBkZWZhdWx0LCA4ID0g4oWbIDEyOCk6IHRoZSBpbi1wbGFuZSBjYXAgaGFsdmVzIGVhY2ggc3RlcDsgc2xpY2VzIHN0YXkgdW4tc3Vic2FtcGxlZCB1bnRpbCDihZssIHRoZW5cbiAqICBzdWJzYW1wbGUuICovXG5mdW5jdGlvbiB2b2x1bWVSZXNvbHV0aW9uRm9yKHNjYWxlOiBudW1iZXIpOiB7IG1heFNsaWNlOiBudW1iZXI7IHNsaWNlU3RlcDogbnVtYmVyIH0ge1xuICBjb25zdCBzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICByZXR1cm4ge1xuICAgIG1heFNsaWNlOiBNYXRoLm1heCg4LCBNYXRoLnJvdW5kKFZPTFVNRV9NQVhfU0xJQ0UgLyBzKSksXG4gICAgc2xpY2VTdGVwOiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHMgLyA0KSksXG4gIH07XG59XG4vKiogRnVsbHktbm9ybWFsaXplZCBpbnRlbnNpdHkgaGVpZ2h0IGFzIGEgZnJhY3Rpb24gb2YgdGhlIGluLXBsYW5lIGV4dGVudCDigJQgbWF0Y2hlcyB0aGUgUGxvdGx5XG4gKiAgU1VSRkFDRSB6LWFzcGVjdCAofjAuNCkgc28gdGhlIHJlbGllZiBpc24ndCBleGFnZ2VyYXRlZC4gKi9cbmNvbnN0IFNVUkZBQ0VfWl9BU1BFQ1QgPSAwLjQ7XG4vKiogXCJGdWxsXCIgbWVzaCBncmlkIGNhcDsgdGhlIGRlY2ltYXRlIGZhY3RvciBkaXZpZGVzIGl0IChkZWZhdWx0IMK8IOKGkiAyMjAsIMK9IOKGkiA0NDAsIEZ1bGwg4oaSIDg4MCkuICovXG5jb25zdCBTVVJGQUNFX01BWF9HUklEID0gODgwO1xuLyoqIENvZWZmaWNpZW50IHNjYWxpbmcgdGhlIHB5cmFtaWQgdGlsZSBidWRnZXQgd2l0aCB0aGUgdGFyZ2V0IHJlc29sdXRpb24g4oCUIGEgaGlnaGVyIHRhcmdldCBwdWxscyBhXG4gKiAgZmluZXIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCArIHZvbHVtZSBhc3NlbWJseS4gKi9cbmNvbnN0IFNUSVRDSF9CVURHRVRfQ09FRkYgPSAxNjtcbi8qKiBTdXJmYWNlIG1lc2ggdGFyZ2V0IGdyaWQgZm9yIGEgZGVjaW1hdGUgZmFjdG9yIGBzY2FsZWA6IHRoZSBncmlkIGNhcCBzaHJpbmtzIGJ5IGBzY2FsZWAgKGV2ZXJ5XG4gKiAgc2xpY2UgaXMga2VwdCDigJQgdGhlIHotc2xpZGVyIG5lZWRzIHRoZW0gYWxsKS4gVGhlIHNvdXJjZSBpcyBmZXRjaGVkIGF0IGEgbWF0Y2hpbmcgcmVzb2x1dGlvbi4gKi9cbmZ1bmN0aW9uIHN1cmZhY2VSZXNvbHV0aW9uRm9yKHNjYWxlOiBudW1iZXIpOiB7IG1heEdyaWQ6IG51bWJlciB9IHtcbiAgY29uc3QgcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgcmV0dXJuIHsgbWF4R3JpZDogTWF0aC5tYXgoMTYsIE1hdGgucm91bmQoU1VSRkFDRV9NQVhfR1JJRCAvIHMpKSB9O1xufVxuXG4vKiogM0Qgc2NhdHRlcjogaW4tcGxhbmUgY2FwIGZvciB0aGUgYXNzZW1ibGVkIHZveGVsIGdyaWQsIGFuZCB0aGUgbWF4IG51bWJlciBvZiBwb2ludHMgZW1pdHRlZFxuICogICh0aGUgZ3JpZCBpcyBmbGF0LXN0cmlkZWQgZG93biB0byB0aGlzKSDigJQga2VlcHMgdGhlIGJpbGxib2FyZCBjb3VudCBpbnRlcmFjdGl2ZS4gKi9cbmNvbnN0IFNDQVRURVIzRF9NQVhfWFkgPSA2NDtcbmNvbnN0IFNDQVRURVIzRF9NQVhfUE9JTlRTID0gMTUwMDAwO1xuXG5jb25zdCBUSUxFX1NJWkUgPSA1MTI7IC8vIHNlcnZlciB0aWxlIGVkZ2UgKG1hdGNoZXMgdGhlIE9TRCBiYWNrZW5kKVxuLyoqIE1heCB0aWxlcyBzdGl0Y2hlZCBmb3Igb25lIGRpc3BsYXllZCBzbGljZSAoNTEycHggdGlsZXMg4oaSIHVwIHRvIH42MTQ0wrIgYXQgZnVsbCByZXMpLiBCZXlvbmRcbiAqICB0aGlzIHdlIHN0ZXAgdG8gYSBjb2Fyc2VyIHB5cmFtaWQgbGV2ZWwgc28gYSBsYXJnZSBpbWFnZSBzdGF5cyB0cmFjdGFibGUuICovXG5jb25zdCBNQVhfU1RJVENIX1RJTEVTID0gMTQ0O1xuLyoqIFdlYkdQVSBkZWZhdWx0IGBtYXhUZXh0dXJlRGltZW5zaW9uMkRgIOKAlCBhIHN0aXRjaGVkIHNsaWNlJ3MgbG9uZ2VzdCBzaWRlIG11c3QgZml0IGEgdGV4dHVyZS4gKi9cbmNvbnN0IE1BWF9URVhUVVJFX0RJTSA9IDgxOTI7XG4vKiogQ29uY3VycmVudCB0aWxlIHJlcXVlc3RzIHBlciBzdGl0Y2hlZCBzbGljZS4gRmlyaW5nIGEgd2hvbGUgZ3JpZCBhdCBvbmNlIChodW5kcmVkcyBvZiByZXF1ZXN0c1xuICogIGZvciBhIGxhcmdlIGxldmVsKSBvdmVyd2hlbG1lZCB0aGUgdGlsZSBzZXJ2ZXIgKDUwNHMpOyBhIHNtYWxsIHBvb2wga2VlcHMgdGhlIHBpcGUgZnVsbCB3aXRob3V0XG4gKiAgZmxvb2RpbmcgaXQg4oCUIGFuZCBzbGljZS1sZXZlbCB3b3JrZXJzIGFscmVhZHkgcnVuIHNldmVyYWwgc3RpdGNoZXMgaW4gcGFyYWxsZWwgb24gdG9wIG9mIHRoaXMuICovXG5jb25zdCBUSUxFX0ZFVENIX0NPTkNVUlJFTkNZID0gNjtcbi8qKiBIb3cgbG9uZyB0byBwb2xsIGAvdGlsZXMvaW5mb2AgKDIwMiB3aGlsZSB0aGUgc2VydmVyIGNhY2hlcyB0aGUgc291cmNlKSBiZWZvcmUgZmFsbGluZyBiYWNrIHRvXG4gKiAgYSBzaW5nbGUgdGlsZS4gR2VuZXJvdXMgbGlrZSB0aGUgT1NEIGJhY2tlbmQg4oCUIGEgY29sZCB3aG9sZS1zbGlkZSBjYW4gdGFrZSBtaW51dGVzIHRvIGNhY2hlLiAqL1xuY29uc3QgREVTQ1JJUFRPUl9USU1FT1VUX01TID0gMTIwMDAwO1xuXG4vKiogRGVmYXVsdCBwZXItY2hhbm5lbCB0aW50cyAoRmlqaS1zdHlsZSkgd2hlbiB0aGUgc3RvcmUvZGVzY3JpcHRvciBvZmZlcnMgbm8gY29sb3VyLiAqL1xuY29uc3QgREVGQVVMVF9USU5UUyA9IFsnI2ZmMDAwMCcsICcjMDBmZjAwJywgJyMwMDAwZmYnLCAnI2ZmZmYwMCcsICcjZmYwMGZmJywgJyMwMGZmZmYnLCAnI2ZmZmZmZiddO1xuXG4vKiogRGVmYXVsdCB0aW50IGZvciBhIGNoYW5uZWwgaW5kZXgsIGN5Y2xpbmcgdGhlIEZpamkgcGFsZXR0ZS4gKi9cbmZ1bmN0aW9uIHRpbnRGb3IoY2hhbm5lbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIERFRkFVTFRfVElOVFNbY2hhbm5lbCAlIERFRkFVTFRfVElOVFMubGVuZ3RoXTtcbn1cblxuLyoqIE9uZSBweXJhbWlkIGxldmVsIGZyb20gYEdFVCAvdGlsZXMvaW5mb2AgKHJlcyAwID0gZnVsbCByZXNvbHV0aW9uKS4gKi9cbmludGVyZmFjZSBUaWxlTGV2ZWwge1xuICByZXM6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBTdWJzZXQgb2YgdGhlIGAvdGlsZXMvaW5mb2AgZGVzY3JpcHRvciB0aGlzIGJhY2tlbmQgcmVhZHMgKHRpbGUgZ3JpZCwgY2hhbm5lbHMsIHNjYWxlKS4gKi9cbmludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIG11bHRpY2hhbm5lbD86IGJvb2xlYW47XG4gIC8qKiBSZWFsIEJpby1Gb3JtYXRzIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgdGhlcmUuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgY29sb3I/OiBzdHJpbmc7XG4gICAgYml0RGVwdGg/OiBudW1iZXI7XG4gICAgbWluQWxsb3dlZD86IG51bWJlcjtcbiAgICBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIG1wcFg/OiBudW1iZXI7XG4gIG1wcFk/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBXZWJHUFUgaW1hZ2UgYmFja2VuZCBidWlsdCBvbiB0aGUgcHVibGlzaGVkIGBuYXBhcmktanNgIGxpYnJhcnkg4oCUIHRoZSBQT0MgZW5naW5lIGZvclxuICogaml0LXVpIzEwMiAoYSBicm93c2VyLWJhc2VkIG5hcGFyaSBzaGlwcGVkIGFzIGEgSlMgbGlicmFyeSwgc3dhcHBpbmcgaW1hZ2UgcGxvdHRpbmcgd2l0aFxuICogT3BlblNlYWRyYWdvbiBhbmQgM0Qgc2xpY2luZy9pc29zdXJmYWNlcyB3aXRoIFBsb3RseSkuXG4gKlxuICogUmVuZGVyIHN0cmF0ZWd5OiByYXRoZXIgdGhhbiByZS1pbXBsZW1lbnQgdGhlIHNlcnZlcidzIHRpbGUvcHlyYW1pZCBwcm90b2NvbCAod2hpY2ggT1NEXG4gKiBhbHJlYWR5IGhhbmRsZXMpLCB0aGlzIGJhY2tlbmQgcmVuZGVycyB0aGUgKipjb21wbGV0ZSBwZXItc2xpY2UgaW1hZ2UgVVJMcyB0aGUgYXBwIGFscmVhZHlcbiAqIHByb2R1Y2VzKiogKGBJSW1hZ2VJbmZvLnVybHNgKSDigJQgYHVybHNbel1gIGZvciB0aGUgMkQgaW1hZ2UsIGFuZCB0aGUgZnVsbCBgdXJsc2Agc3RhY2tcbiAqIGFzc2VtYmxlZCBpbnRvIGEgZG93bnNhbXBsZWQgdm9sdW1lIGZvciB0aGUgM0QgdHlwZXMuIFJlZ2lvbiBzdGF0ZSBhbmQgZGlzcGxheSBvcHRpb25zXG4gKiBkZWxlZ2F0ZSB0byB0aGUgc2hhcmVkIHtAbGluayBSZWdpb25TdG9yZX0gLyB7QGxpbmsgVmlzdWFsaXplclN0b3JlfSwgZXhhY3RseSBhcyBPU0QgZG9lcy5cbiAqXG4gKiBGb2xsb3ctdXBzIChqaXQtdWkjMTAyKTogbmF0aXZlLXJlc29sdXRpb24gcHlyYW1pZGFsIHRpbGluZywgb24tY2FudmFzIHRvb2xzLCByZWdpb25cbiAqIG92ZXJsYXkgcmVuZGVyaW5nLCBwZXItY2hhbm5lbCBoaXN0b2dyYW1zLCBUSUZGIGV4cG9ydC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSBleHRlbmRzIEJhc2VTdG9yZVZpc3VhbGl6ZXIgaW1wbGVtZW50cyBJVmlzdWFsaXplciB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1xuICAgIFZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5LFxuICAgIFZpZXdlckZlYXR1cmUuU3RhY2tTbGlkZXIsXG4gICAgVmlld2VyRmVhdHVyZS5QaXhlbFJlYWRiYWNrLFxuICAgIFZpZXdlckZlYXR1cmUuU3VyZmFjZTNELFxuICAgIFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZSxcbiAgXSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGk6IHN0cmluZztcblxuICBwcml2YXRlIHZpZXdlcjogVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvc3Q6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGVkOiBOYXBhcmlMb2FkZWQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UGl4ZWxzOiBQaXhlbERhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuTkFQQVJJX0lNQUdFO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyBvd25pbmcgdGhlIDNEIHZvbHVtZSBsYXllcnMgKG9uZSBhZGRpdGl2ZSB0aW50ZWQgbGF5ZXIgcGVyIGNoYW5uZWxcbiAgICogIGZvciBtdWx0aWNoYW5uZWwsIG9yIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiBOdWxsIGluIDJELiAqL1xuICBwcml2YXRlIHZvbHVtZVZpZXc6IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgdm9sdW1lIGlzIGNvbXBvc2l0ZWQgZnJvbSBwZXItY2hhbm5lbCBsYXllcnMgKHZzIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiAqL1xuICBwcml2YXRlIHZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIGhlaWdodC1maWVsZCBzdXJmYWNlIG1lc2ggKE5BUEFSSV9TVVJGQUNFIHBsb3QgdHlwZTsgbnVsbCBvdGhlcndpc2UpLiBCdWlsdCBmcm9tIGFcbiAgICogIHNpbmdsZSBncmF5c2NhbGUgc2xpY2UgYnkge0BsaW5rIGJ1aWxkU3VyZmFjZX0gdmlhIG5hcGFyaS1qcydzIGBoZWlnaHRGaWVsZGAgKyBgYWRkU3VyZmFjZWAuICovXG4gIHByaXZhdGUgc3VyZmFjZUxheWVyOiBTdXJmYWNlTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoaWNoIGJhbmQgdGhlIHN1cmZhY2Ugc2FtcGxlcyAoYSBjaGFubmVsIGluZGV4IGZvciBtdWx0aWNoYW5uZWwsIGVsc2UgdGhlIGNvbXBvc2l0ZSkuICovXG4gIHByaXZhdGUgc3VyZmFjZUNoYW5uZWw6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgLyoqIFByZS1sb2FkZWQgcGVyLXNsaWNlIGx1bWluYW5jZSBwbGFuZXMgKGFscmVhZHkgZGVjaW1hdGVkIHRvIHRoZSBzdXJmYWNlIGdyaWQpLCBrZXllZCBieSB6LFxuICAgKiAgc28gdGhlIHN0YWNrIHNsaWRlciByZWJ1aWxkcyB0aGUgc3VyZmFjZSBpbnN0YW50bHkuIEZpbGxlZCBieSB7QGxpbmsgcHJlbG9hZFN1cmZhY2VQbGFuZXN9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1cmZhY2VQbGFuZXMgPSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cbiAgPigpO1xuICAvKiogSW4tcGxhbmUgZ3JpZCBjYXAgZm9yIHRoZSBhY3RpdmUgc3VyZmFjZSBsb2FkIChmdWxsIGdyaWQgw7cgdGhlIGRlY2ltYXRlIGZhY3RvcikuICovXG4gIHByaXZhdGUgc3VyZmFjZU1heEdyaWQgPSBTVVJGQUNFX01BWF9HUklEO1xuICAvKiogQ29udHJhc3Qgd2luZG93IFttaW4sbWF4XSB0aGUgY3VycmVudCBzdXJmYWNlIG1lc2ggd2FzIGJ1aWx0IHdpdGguIEEgY2hhbmdlIHJlc2hhcGVzIHRoZVxuICAgKiAgbWVzaCAocGl4ZWwgaGVpZ2h0ID0gaW50ZW5zaXR5IHdpdGhpbiBbbWluLG1heF0pLCBzbyBpdCB0cmlnZ2VycyBhIGdlb21ldHJ5IHJlYnVpbGQuICovXG4gIHByaXZhdGUgc3VyZmFjZVdpbmRvdzogW251bWJlciwgbnVtYmVyXSB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyc2lzdGVkIHdpcmVmcmFtZSBjaG9pY2UgZm9yIHRoZSBzdXJmYWNlIChyZS1hcHBsaWVkIHdoZW4gYSBuZXcgc3VyZmFjZSBtb3VudHMpLiAqL1xuICBwcml2YXRlIHN1cmZhY2VXaXJlZnJhbWUgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaS1qcyAyRCBzY2F0dGVyIHBvaW50cyAocmVnaW9uIGNlbnRyb2lkcykgKyBpdHMgcmVnaW9uLWNoYW5nZSBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc2NhdHRlcjJkUG9pbnRzOiBQb2ludHNMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYXR0ZXJSZWdpb25TdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAvKiogbmFwYXJpLWpzIDNEIHNjYXR0ZXIgKHZveGVsIHBvaW50IGNsb3VkKS4gKi9cbiAgcHJpdmF0ZSBzY2F0dGVyM2RMYXllcjogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogTW9ub3RvbmljIGxvYWQgZ2VuZXJhdGlvbi4gQnVtcGVkIGJ5IHtAbGluayByZXNldH0gYW5kIHtAbGluayBjYW5jZWxMb2FkaW5nfTsgdGhlIGZyYW1lLWxvYWRpbmdcbiAgICogIGxvb3BzICh2b2x1bWUgYXNzZW1ibHksIHN1cmZhY2UgcHJlbG9hZCkgY2FwdHVyZSBpdCBhbmQgYmFpbCB3aGVuIGl0IGNoYW5nZXMsIHNvIGEgQ2FuY2VsIChvciBhXG4gICAqICBuZXcgcGxvdCkgYWN0dWFsbHkgc3RvcHMgZmV0Y2hpbmcgZnJhbWVzIGluc3RlYWQgb2YgcnVubmluZyB0byBjb21wbGV0aW9uIGluIHRoZSBiYWNrZ3JvdW5kLiAqL1xuICBwcml2YXRlIGxvYWRUb2tlbiA9IDA7XG4gIC8qKiBEZWNpbWF0ZSBmYWN0b3IgZm9yIHRoZSBuYXBhcmkgM0QgdHlwZXMgKDEgPSBGdWxsLCAyID0gwr0gZGVmYXVsdCwgNCA9IMK8LCA4ID0g4oWbKS4gQXBwbGllZCB3aGVuIGFcbiAgICogIHZvbHVtZS9pc29zdXJmYWNlL3N1cmZhY2UgKHJlKWxvYWRzOyBjaGFuZ2luZyBpdCBuZWVkcyBhIHJlLXBsb3QgKGl0IGNoYW5nZXMgZmV0Y2hlZCBkYXRhKS4gKi9cbiAgcHJpdmF0ZSByZXNvbHV0aW9uU2NhbGUgPSBOQVBBUklfREVGQVVMVF9ERUNJTUFURTtcbiAgLyoqIDNEIGNvb3JkaW5hdGUtYXhlcyAvIHNjYWxlIGdpem1vIGZvciB0aGUgdm9sdW1lL2lzb3N1cmZhY2UgdmlldyAobnVsbCBpbiAyRCkuICovXG4gIHByaXZhdGUgYXhlc0xheWVyOiBBeGVzTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIERPTSBYL1kvWiArIHNjYWxlIGxhYmVscyB0cmFja2luZyB0aGUgM0QgYXhlcyBnaXptbyAobnVsbCBpbiAyRCkuICovXG4gIHByaXZhdGUgYXhlc0xhYmVsczogTmFwYXJpQXhlc0xhYmVscyB8IG51bGwgPSBudWxsO1xuICAvKiogRHJhZ2dhYmxlIFotaGVpZ2h0IGdyaXAgb3ZlciB0aGUgdm9sdW1lIChudWxsIHVubGVzcyBhIHZvbHVtZS9pc29zdXJmYWNlIGlzIG1vdW50ZWQpLiAqL1xuICBwcml2YXRlIHpIYW5kbGU6IE5hcGFyaVZvbHVtZVpIYW5kbGUgfCBudWxsID0gbnVsbDtcbiAgLyoqIFVzZXIgWi1oZWlnaHQgZmFjdG9yIGZvciB0aGUgdm9sdW1lICgxID0gdGhlIHZvbHVtZSdzIG5hdHVyYWwgcHJvcG9ydGlvbnMpOyBkcml2ZW4gYnkgdGhlXG4gICAqICBpbi12aWV3IGRyYWcgaGFuZGxlLiBSZXNldCBwZXIgbW91bnQuICovXG4gIHByaXZhdGUgdm9sdW1lWlNjYWxlID0gMTtcbiAgLyoqIFZvbHVtZSB3b3JsZCBib3ggYXQgYHZvbHVtZVpTY2FsZSA9IDFgIChiYXNlKSArIHRoZSBzYW1wbGVkIHZveGVsIGRlcHRoIOKAlCBlbm91Z2ggdG8gcmVjb21wdXRlXG4gICAqICB0aGUgWi1heGlzIHZveGVsIHNjYWxlLCBheGVzIGRlcHRoLCBhbmQgb3ZlcmxheSBhbmNob3JzIGFzIHRoZSBoYW5kbGUgc3RyZXRjaGVzIFouICovXG4gIHByaXZhdGUgdm9sdW1lV29ybGRCYXNlOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2b2x1bWVTYW1wbGVkRGVwdGggPSAxO1xuICAvKiogUGVyc2lzdGVkIGF4ZXMgb24vb2ZmIGNob2ljZSwgcmUtYXBwbGllZCB3aGVuIGEgbmV3IHZvbHVtZSBtb3VudHMuIERlZmF1bHRzIG9uLiAqL1xuICBwcml2YXRlIGF4ZXNWaXNpYmxlID0gdHJ1ZTtcbiAgcHJpdmF0ZSB2b2x1bWVEaW1zOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgLyoqIEFzc2VtYmxlZCB1aW50OCB2b2x1bWUgZGF0YSBwZXIgY2hhbm5lbCAoa2V5ID0gY2hhbm5lbCBpbmRleCksIGtlcHQgZm9yIHRoZSB2b2x1bWUgaW50ZW5zaXR5XG4gICAqICBoaXN0b2dyYW0uIEtleSAwIGhvbGRzIHRoZSBncmF5c2NhbGUvY29tcG9zaXRlIHZvbHVtZSBpbiB0aGUgc2luZ2xlLWNoYW5uZWwgY2FzZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVDaGFubmVsRGF0YSA9IG5ldyBNYXA8bnVtYmVyLCBVaW50OEFycmF5PigpO1xuICBwcml2YXRlIGltYWdlVyA9IDA7XG4gIHByaXZhdGUgaW1hZ2VIID0gMDtcbiAgLyoqIE1vbm90b25pYyBzbGljZS1yZXF1ZXN0IGlkIHNvIGEgc2xvdyBvdXQtb2Ytb3JkZXIgc2xpY2UgZmV0Y2ggY2FuJ3QgY2xvYmJlciBhIG5ld2VyIG9uZS4gKi9cbiAgcHJpdmF0ZSBzbGljZVJlcSA9IDA7XG4gIC8qKiBDYWNoZWQgYC90aWxlcy9pbmZvYCBweXJhbWlkIGRlc2NyaXB0b3IgKyB0aGUgaW5mb0I2NCBpdCB3YXMgZmV0Y2hlZCBmb3IuICovXG4gIHByaXZhdGUgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXNjcmlwdG9yS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSG93IHRoZSBjdXJyZW50IDJEIGltYWdlIGlzIGNvbXBvc2l0ZWQgKGRyaXZlcyBoaXN0b2dyYW0gKyBzdGF0ZSBhcHBsaWNhdGlvbikuICovXG4gIHByaXZhdGUgaW1hZ2VNb2RlOiAnZ3JheXNjYWxlJyB8ICdtdWx0aWNoYW5uZWwnIHwgJ3JnYicgPSAncmdiJztcbiAgLyoqIG5hcGFyaS1qcyBoaWdoLWxldmVsIHZpZXcgdGhhdCBvd25zIHRoZSBwZXItY2hhbm5lbCBsYXllciBzZXQgKGJ1aWxkICsgbGl2ZSBkaXNwbGF5XG4gICAqICB1cGRhdGVzKSBmb3IgdGhlIGN1cnJlbnQge0BsaW5rIGltYWdlTW9kZX0uIFJlYnVpbHQgb24gZWFjaCAocmUpcmVuZGVyLiAqL1xuICBwcml2YXRlIGNoYW5uZWxWaWV3OiBNdWx0aUNoYW5uZWxJbWFnZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIExpdmUgc3Vic2NyaXB0aW9uIGFwcGx5aW5nIGNoYW5uZWwtc3RhdGUgLyBjb2xvcm1hcCBjaGFuZ2VzIHRvIHRoZSBsYXllcnMuICovXG4gIHByaXZhdGUgZGlzcGxheVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3QgZ3JheXNjYWxlIGNvbG9ybWFwIHNlbGVjdGlvbiBmcm9tIHRoZSBzdG9yZSAoYXBwbGllZCB0byB0aGUgc2luZ2xlIGdyYXkgbGF5ZXIpLiAqL1xuICBwcml2YXRlIGN1cnJlbnRDb2xvcm1hcDogQ29sb3JtYXBOb2RlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFJldmVyc2UgPSBmYWxzZTtcbiAgLyoqIExhdGVzdCBpbnZlcnQgdG9nZ2xlIGZyb20gdGhlIHN0b3JlIChmbGlwcyBpbnRlbnNpdHkgYmVmb3JlIHRoZSBjb2xvcm1hcCwgbGlrZSBPU0QpLiAqL1xuICBwcml2YXRlIGludmVydEVuYWJsZWQgPSBmYWxzZTtcbiAgLyoqIFBoeXNpY2FsIHNjYWxlIGJhciBvdmVybGF5IGZvciB0aGUgMkQgaW1hZ2UgKG51bGwgd2hlbiAzRCBvciB0aGUgaW1hZ2UgaGFzIG5vIMK1bS9waXhlbCkuICovXG4gIHByaXZhdGUgc2NhbGVCYXI6IE5hcGFyaVNjYWxlQmFyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTVkcgcmVnaW9uLWRyYXdpbmcgb3ZlcmxheSBmb3IgdGhlIDJEIGltYWdlIChudWxsIHVudGlsIGEgMkQgaW1hZ2UgaXMgcGxvdHRlZCkuICovXG4gIHByaXZhdGUgcmVnaW9uT3ZlcmxheTogTmFwYXJpUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICAvKiogUGl4ZWwtdG9vbCBwbHVtYmluZzogdGhlIHBsb3QgZGl2IGlkLCBjb29yZCB0cmFuc2Zvcm0sIGFuZCBib3VuZCB0b29sIGhvc3RzLiAqL1xuICBwcml2YXRlIHBsb3REaXZJZCA9ICcnO1xuICBwcml2YXRlIGNvb3JkVHJhbnNmb3JtOiBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdhbmRIb3N0OiBXYW5kVG9vbEhvc3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBlcmFzZXJIb3N0OiBWZXJ0ZXhFcmFzZXJUb29sSG9zdCB8IG51bGwgPSBudWxsO1xuICAvKiogQ2FjaGVkIENhY2hlZEltYWdlRGF0YSBidWlsdCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIChyZWJ1aWx0IHdoZW4gbGFzdFBpeGVscyBjaGFuZ2VzKS4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkSW1hZ2VTb3VyY2U6IFBpeGVsRGF0YSB8IG51bGwgPSBudWxsO1xuICAvKiogVmlzaWJsZSB3b3JsZCByZWN0IGNhcHR1cmVkIEFUIHRoZSBsYXN0IHJlYWRiYWNrIOKAlCBtdXN0IHBhaXIgd2l0aCBgbGFzdFBpeGVsc2Agc28gdGhlIHBpeGVsXG4gICAqICB0b29scycgcmF0aW9zL29yaWdpbiBtYXRjaCB0aGUgbWF0cml4J3MgY2FtZXJhICh1c2luZyB0aGUgbGl2ZSByZWN0IGFmdGVyIGEgcGFuL3pvb20gd291bGRcbiAgICogIG1pcy1zY2FsZSB0aGUgcmVnaW9uKS4gKi9cbiAgcHJpdmF0ZSBsYXN0UGl4ZWxzUmVjdDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogSW1hZ2Ugc21vb3RoaW5nIChiaWxpbmVhcikgdnMgbmVhcmVzdC1uZWlnaGJvdXIgKGNyaXNwIHBpeGVscywgdGhlIGRlZmF1bHQpLiAqL1xuICBwcml2YXRlIGltYWdlU21vb3RoaW5nID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIDJEIGltYWdlIGlzIHJlbmRlcmVkIHZpYSBweXJhbWlkYWwgVGlsZWRTb3VyY2VzIChkZXNjcmlwdG9yIGF2YWlsYWJsZSkuICovXG4gIHByaXZhdGUgdGlsZWQgPSBmYWxzZTtcbiAgLyoqIERlYm91bmNlZCByZWFkYmFjayB0aW1lciArIGNhbWVyYS1jaGFuZ2UgdW5zdWJzY3JpYmUgKGtlZXAgbGFzdFBpeGVscyBjdXJyZW50IGZvciB0b29scykuICovXG4gIHByaXZhdGUgcmVhZGJhY2tUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYW1lcmFSZWFkYmFja09mZjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDb2Fyc2UgcGVyLWNoYW5uZWwgbHVtaW5hbmNlIHNhbXBsZSAoa2V5ZWQgYnkgY2hhbm5lbCBpbmRleCkgZm9yIHRoZSBoaXN0b2dyYW0gaW4gdGlsZWQgbW9kZSxcbiAgICogIHdoZXJlIHRoZSBsYXllcnMgaGF2ZSBubyBmdWxsIGluLW1lbW9yeSBwaXhlbHMuIFJlZnJlc2hlZCBvbiBwbG90ICsgc2xpY2UgY2hhbmdlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RTYW1wbGVzID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoIGhpc3RvZ3JhbXMgZnJvbSBgL2hpc3RvZ3JhbWAsIGtleWVkIGAke3p9fCR7Y2hhbm5lbH1gICg+OC1iaXQgaW1hZ2VzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBuYXRpdmVIaXN0b2dyYW1zID0gbmV3IE1hcDxzdHJpbmcsIElIaXN0b2dyYW0+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9zY2FsZUV2ZW50JCA9IG5ldyBTdWJqZWN0PHVua25vd24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZW5zaXR5UHJvZmlsZSQgPSBuZXcgU3ViamVjdDxJbnRlbnNpdHlQcm9maWxlW10+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gbmV3IFN1YmplY3Q8e1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgfT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFRJTEVfQUNDRVNTX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgdGlsZXM6IFRpbGVBY2Nlc3NQb3J0LFxuICAgIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2FuZFRvb2w6IFdhbmRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJydXNoVG9vbDogQnJ1c2hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgem9vbVRvQm94VG9vbDogWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIHJlYWRvbmx5IGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNpbXBsZVN0YWNrOiBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UsXG4gICAgQEluamVjdChWSVpfQ09ORklHKSBjb25maWc6IFZpekNvbmZpZyxcbiAgKSB7XG4gICAgc3VwZXIocmVnaW9uU3RvcmUsIHN0b3JlKTtcbiAgICB0aGlzLmFwaSA9IGNvbmZpZy5zbGlkZUNyb3BTZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggKyBjYWNoZSB0aGUgc2VydmVyIHB5cmFtaWQgZGVzY3JpcHRvciAoYEdFVCAvdGlsZXMvaW5mb2ApOiB0aGUgUkVBTCBwZXItbGV2ZWwgdGlsZSBncmlkLFxuICAgKiB0aWxlIHNpemUsIGNoYW5uZWwgbWV0YWRhdGEgYW5kIHBoeXNpY2FsIHBpeGVsIHNpemUuIFRoZSBiYWNrZW5kIHJldHVybnMgMjAyIHdoaWxlIHRoZSBzb3VyY2VcbiAgICogaXMgc3RpbGwgY2FjaGluZywgc28gd2UgcG9sbCBicmllZmx5LiBDYWNoZWQgcGVyIGBpbmZvQjY0YDsgcmV0dXJucyBudWxsIGlmIGl0IG5ldmVyIGJlY29tZXNcbiAgICogcmVhZHkgKGNhbGxlcnMgZmFsbCBiYWNrIHRvIGEgc2luZ2xlLXRpbGUgZmV0Y2gpLiBUaGlzIGlzIHRoZSBhdXRob3JpdGF0aXZlIGdyaWQg4oCUIGd1ZXNzaW5nXG4gICAqIGxldmVsIGRpbXMgZnJvbSBgdHJ1ZUltYWdlU2l6ZWAgb3ZlcnNob290cyB0aGUgcmVhbCBncmlkIGFuZCB0aGUgc2VydmVyIDQwMHMgb3V0LW9mLXJhbmdlIHRpbGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXNjcmlwdG9yKCk6IFByb21pc2U8VGlsZURlc2NyaXB0b3IgfCBudWxsPiB7XG4gICAgLy8gU2VsZi1jb250YWluZWQgbXVsdGktc2xpY2Ugc3RhY2sgKG5vIHRpbGUgc2VydmVyIOKAlCBlLmcuIGEgbnVtYmVyZWQgaW1hZ2VcbiAgICAvLyBzZXJpZXMgYXNzZW1ibGVkIGNsaWVudC1zaWRlLCBlYWNoIHNsaWNlIGEgZGlmZmVyZW50IGZpbGUpOiB0aGVyZSBpcyBub1xuICAgIC8vIHNpbmdsZSBzZXJ2ZXItdGlsZWQgcHlyYW1pZCB0byBkZXNjcmliZS4gUmV0dXJuaW5nIG51bGwgcm91dGVzIGV2ZXJ5XG4gICAgLy8gY2FsbGVyICgyRCBpbWFnZSwgdm9sdW1lLCBzdXJmYWNlKSB0byB0aGVpciBzdGl0Y2hlZC9zaW5nbGUtZmV0Y2hcbiAgICAvLyBmYWxsYmFjaywgd2hpY2gg4oCUIHZpYSBmZXRjaFNsaWNlJ3Mgb3duIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSBicmFuY2gg4oCUXG4gICAgLy8gY29ycmVjdGx5IGZldGNoZXMgZWFjaCBzbGljZSdzIG93biBVUkwgaW5zdGVhZCBvZiBvbmUgZml4ZWQgZmlsZSdzIHRpbGVcbiAgICAvLyBweXJhbWlkLlxuICAgIGlmICh0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKHRoaXMubG9hZGVkPy5pbWFnZUluZm8pKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmRlc2NyaXB0b3IgJiYgdGhpcy5kZXNjcmlwdG9yS2V5ID09PSBpbmZvQjY0KSByZXR1cm4gdGhpcy5kZXNjcmlwdG9yO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9dGlsZXMvaW5mbz9pbmZvPSR7aW5mb0I2NH1gO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIERFU0NSSVBUT1JfVElNRU9VVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwLmpzb24oKSkgYXMgVGlsZURlc2NyaXB0b3I7XG4gICAgICAgICAgaWYgKGJvZHk/LmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBib2R5O1xuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yS2V5ID0gaW5mb0I2NDtcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIGVtcHR5IGJvZHkg4oaSIHJlLXBvbGwgdW50aWwgdGhlIGRlYWRsaW5lLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gdGlsZXMvaW5mbyBwb2xsIHJldHJ5JywgZXJyKTtcbiAgICAgIH1cbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0aWxlcy9pbmZvIG5vdCByZWFkeTsgZmFsbGluZyBiYWNrIHRvIHNpbmdsZS10aWxlIGZldGNoJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTIwMCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIENPTVBMRVRFIHJlbmRlcmVkIHNsaWNlIGFzIGFuIGBJbWFnZUJpdG1hcGAgYnkgc3RpdGNoaW5nIHRoZSBzZXJ2ZXIncyBSRUFMIHRpbGUgZ3JpZFxuICAgKiAoZnJvbSBgL3RpbGVzL2luZm9gKSDigJQgbm90IGp1c3QgdGhlIHRvcC1sZWZ0IHRpbGUsIHdoaWNoIG9ubHkgZXZlciBzaG93ZWQgYSBsYXJnZSBpbWFnZSdzXG4gICAqIGNvcm5lci4gUGlja3MgdGhlIGZpbmVzdCBweXJhbWlkIGxldmVsIHdob3NlIGdyaWQgZml0cyBgYnVkZ2V0VGlsZXNgIGFuZCB3aG9zZSBsb25nZXN0IHNpZGUgaXNcbiAgICogd2l0aGluIHRoZSBHUFUgdGV4dHVyZSBsaW1pdCwgZmV0Y2hlcyB0aGF0IGdyaWQgY29uY3VycmVudGx5LCBhbmQgc3RpdGNoZXMgaXQgaW50byBvbmUgY2FudmFzLlxuICAgKlxuICAgKiBgY2hhbm5lbGAgc2VsZWN0cyBhIHNpbmdsZSBiYW5kIGFzIGdyYXlzY2FsZSAocmVhbCBsZXZlbHMgb25seSk7IG9taXQgZm9yIHRoZSBzZXJ2ZXIgY29tcG9zaXRlLlxuICAgKiBgYnVkZ2V0VGlsZXNgIGNhcHMgdGhlIGdyaWQ6IHRoZSAyRCB2aWV3IHVzZXMgdGhlIGZ1bGwgYnVkZ2V0IGZvciBkZXRhaWw7IHRoZSAzRCB2b2x1bWUgcGFzc2VzXG4gICAqIDEgZm9yIGEgY2hlYXAgb3ZlcnZpZXcgdGlsZSBwZXIgc2xpY2UgKGl0IGRvd25zYW1wbGVzIHRvIHtAbGluayBWT0xVTUVfTUFYX1NMSUNFfSkuIEZhbGxzIGJhY2tcbiAgICogdG8gYSBzaW5nbGUgYGNvbD0wLHJvdz0wYCB0aWxlIHdoZW4gbm8gZGVzY3JpcHRvciBpcyBhdmFpbGFibGUgKHNtYWxsL3NpbXBsZSBpbWFnZXMsIHZvbHVtZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFNsaWNlKFxuICAgIHo6IG51bWJlcixcbiAgICBjaGFubmVsPzogbnVtYmVyLFxuICAgIGJ1ZGdldFRpbGVzOiBudW1iZXIgPSBNQVhfU1RJVENIX1RJTEVTLFxuICAgIC8qKiBXaGVuIGEgc3BlY2lmaWMgY2hhbm5lbCBoYXMgbm8gcHlyYW1pZCBsZXZlbCB3aXRoaW4gYGJ1ZGdldFRpbGVzYCwgZHJvcCB0byB0aGUgc2VydmVyXG4gICAgICogIENPTVBPU0lURSBvdmVydmlldyBpbnN0ZWFkIG9mIHN0aXRjaGluZyB0aGUgaHVnZSBwZXItY2hhbm5lbCBsZXZlbC4gT25seSBzYWZlIHdoZW4gdGhlIGNhbGxlclxuICAgICAqICB3YW50cyBhIHNpbmdsZSBkZWNpbWF0ZWQgcGxhbmUgKHRoZSBzdXJmYWNlIGhlaWdodCk6IGZvciBhIG11bHRpY2hhbm5lbCBWT0xVTUUgZXZlcnkgY2hhbm5lbFxuICAgICAqICB3b3VsZCB0aGVuIGZldGNoIHRoZSBzYW1lIGNvbXBvc2l0ZSBhbmQgdGhlIGNoYW5uZWxzIHdvdWxkIGNvbGxhcHNlIGludG8gb25lLCBzbyB2b2x1bWVcbiAgICAgKiAgYXNzZW1ibHkgbGVhdmVzIHRoaXMgYGZhbHNlYCB0byBrZWVwIGVhY2ggYmFuZCBkaXN0aW5jdC4gKi9cbiAgICBhbGxvd0NvbXBvc2l0ZUZhbGxiYWNrID0gZmFsc2UsXG4gICk6IFByb21pc2U8SW1hZ2VCaXRtYXA+IHtcbiAgICAvLyBTZWxmLWNvbnRhaW5lZCBtdWx0aS1zbGljZSBzdGFjayAodGlsZWQ6ZmFsc2UpOiBgemAgaW5kZXhlcyBhIGNvbXBsZXRlbHlcbiAgICAvLyBkaWZmZXJlbnQgZmlsZSdzIG93biBwcmV2aWV3IFVSTCwgbm90IGFuIGludGVybmFsIHNsaWNlIG9mIG9uZSBzZXJ2ZXItXG4gICAgLy8gdGlsZWQgZmlsZSDigJQgcmVzb2x2ZWQgYW5kIGZldGNoZWQgdmlhIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSAoc2hhcmVkXG4gICAgLy8gd2l0aCBPU0Q7IHNlZSBpdHMgZG9jcyBmb3Igd2h5IHRoaXMgY2FuJ3QgYmUgYSBiYXJlIGZldGNoKCkpIGluc3RlYWQgb2ZcbiAgICAvLyBidWlsZGluZyBhIC90aWxlP2luZm89Li4uJno9IHJlcXVlc3QgYWdhaW5zdCB3aGljaGV2ZXIgc2luZ2xlIGZpbGVcbiAgICAvLyBnZXRTZWxlY3RlZEluZm9CNjQoKSBwb2ludHMgYXQgKHdoaWNoIHdvdWxkIDQwMC9taXNtYXRjaCBmb3IgYW55IHpcbiAgICAvLyBiZXlvbmQgdGhhdCBvbmUgZmlsZSdzIG93biBleHRlbnQpLlxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIGlmICh0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGluZm8pKSB7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbCB2b2x1bWU6IGZldGNoIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCdzIE9XTiBwbGFuZVxuICAgICAgLy8gKGNoYW5uZWxVcmxzW3pdW2NoYW5uZWxdKSBzbyBlYWNoIGJhbmQgc3RheXMgZGlzdGluY3Qg4oCUIHRoZSBjbGllbnQtc2lkZVxuICAgICAgLy8gYW5hbG9nIG9mIHRoZSBzZXJ2ZXIncyBwZXItY2hhbm5lbCAvdGlsZT9jaGFubmVsPWMuIEVsc2UgdGhlIHotYW5jaG9yIFVSTC5cbiAgICAgIGNvbnN0IGNoVXJscyA9IChpbmZvIGFzIElJbWFnZUluZm8pLmNoYW5uZWxVcmxzO1xuICAgICAgY29uc3QgdXJsID0gY2hhbm5lbCAhPSBudWxsICYmIGNoVXJscz8uW3pdPy5bY2hhbm5lbF0gIT0gbnVsbFxuICAgICAgICA/IGNoVXJsc1t6XVtjaGFubmVsXVxuICAgICAgICA6IHRoaXMuc2ltcGxlU3RhY2sudXJsRm9yKGluZm8gYXMgSUltYWdlSW5mbywgeik7XG4gICAgICBpZiAoIXVybCkgdGhyb3cgbmV3IEVycm9yKGBbbmFwYXJpLWpzXSBubyBVUkwgZm9yIHNsaWNlICR7en1gKTtcbiAgICAgIHJldHVybiB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCaXRtYXAodXJsKTtcbiAgICB9XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIG5vIHNlbGVjdGVkIGltYWdlIGluZm8gKGdldFNlbGVjdGVkSW5mb0I2NCBudWxsKScpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuXG4gICAgLy8gVGhlIHJlcXVlc3RlZCBiYW5kOyBtYXkgYmUgZHJvcHBlZCB0byB0aGUgY29tcG9zaXRlICh1bmRlZmluZWQpIGJlbG93IHdoZW4gdGhlIGNoYW5uZWwgaGFzIG5vXG4gICAgLy8gcHlyYW1pZCBsZXZlbCBzbWFsbCBlbm91Z2ggdG8gc3RpdGNoIHdpdGhpbiBidWRnZXQuXG4gICAgbGV0IGVmZmVjdGl2ZUNoYW5uZWwgPSBjaGFubmVsO1xuICAgIGNvbnN0IGZldGNoVGlsZSA9IGFzeW5jIChcbiAgICAgIHJlczogbnVtYmVyLFxuICAgICAgY29sOiBudW1iZXIsXG4gICAgICByb3c6IG51bWJlcixcbiAgICAgIHQ6IG51bWJlcixcbiAgICApOiBQcm9taXNlPEltYWdlQml0bWFwPiA9PiB7XG4gICAgICBjb25zdCBjaCA9IGVmZmVjdGl2ZUNoYW5uZWwgPT0gbnVsbCA/ICcnIDogYCZjaGFubmVsPSR7ZWZmZWN0aXZlQ2hhbm5lbH1gO1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9dGlsZT9pbmZvPSR7aW5mb0I2NH0mcmVzPSR7cmVzfSZjb2w9JHtjb2x9JnJvdz0ke3Jvd30mej0ke3p9JnRpbGVTaXplPSR7dH0ke2NofWA7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbbmFwYXJpLWpzXSBzbGljZSBmZXRjaCBmYWlsZWQ6ICR7cmVzcC5zdGF0dXN9ICgke2NvbH0vJHtyb3d9IHJlcyAke3Jlc30pYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoYXdhaXQgcmVzcC5ibG9iKCkpO1xuICAgIH07XG5cbiAgICAvLyBObyBkZXNjcmlwdG9yIOKGkiBzaW5nbGUgdG9wLWxlZnQgdGlsZSAobGVnYWN5IGZhbGxiYWNrOyBjb3JyZWN0IGZvciBzbWFsbC9zaW1wbGUgaW1hZ2VzKS5cbiAgICBpZiAoIWRlc2MgfHwgIWRlc2MubGV2ZWxzPy5sZW5ndGgpIHJldHVybiBmZXRjaFRpbGUoMCwgMCwgMCwgVElMRV9TSVpFKTtcblxuICAgIGNvbnN0IHQgPSBkZXNjLnRpbGVTaXplIHx8IFRJTEVfU0laRTtcbiAgICAvLyBQZXItY2hhbm5lbCB0aWxlcyBleGlzdCBPTkxZIGF0IFJFQUwgQmlvLUZvcm1hdHMgbGV2ZWxzICh0aGUgZnJvbnQgb2YgYGxldmVsc2ApOyB0aGUgc2VydmVyXG4gICAgLy8gY29tcG9zaXRlIGV4aXN0cyBhdCBldmVyeSBsZXZlbCwgaW5jbHVkaW5nIHRoZSBzbWFsbCBvdmVydmlld3MuXG4gICAgY29uc3QgcGVyQ2hhbm5lbExldmVscyA9IGRlc2MucmVhbExldmVscyA/PyBkZXNjLmxldmVscy5sZW5ndGg7XG4gICAgY29uc3QgdXNhYmxlID1cbiAgICAgIGNoYW5uZWwgPT0gbnVsbCA/IGRlc2MubGV2ZWxzIDogZGVzYy5sZXZlbHMuc2xpY2UoMCwgTWF0aC5tYXgoMSwgcGVyQ2hhbm5lbExldmVscykpO1xuXG4gICAgLy8gRmluZXN0IGxldmVsIHdob3NlIHN0aXRjaGVkIGdyaWQgZml0cyBCT1RIIHRoZSB0aWxlIGJ1ZGdldCBhbmQgdGhlIEdQVSB0ZXh0dXJlIGxpbWl0OyBpZiBub25lXG4gICAgLy8gZml0cywgdGhlIGNvYXJzZXN0IGF2YWlsYWJsZSAoZml0cz1mYWxzZSkuXG4gICAgY29uc3QgdGlsZXNGb3IgPSAobHZsOiBUaWxlTGV2ZWwpOiBudW1iZXIgPT5cbiAgICAgIE1hdGgubWF4KDEsIE1hdGguY2VpbChsdmwud2lkdGggLyB0KSkgKiBNYXRoLm1heCgxLCBNYXRoLmNlaWwobHZsLmhlaWdodCAvIHQpKTtcbiAgICBjb25zdCBwaWNrID0gKGxldmVsczogVGlsZUxldmVsW10pOiB7IGx2bDogVGlsZUxldmVsOyBmaXRzOiBib29sZWFuIH0gPT4ge1xuICAgICAgbGV0IGMgPSBsZXZlbHNbMF07XG4gICAgICBmb3IgKGNvbnN0IGx2bCBvZiBsZXZlbHMpIHtcbiAgICAgICAgYyA9IGx2bDtcbiAgICAgICAgaWYgKHRpbGVzRm9yKGx2bCkgPD0gYnVkZ2V0VGlsZXMgJiYgTWF0aC5tYXgobHZsLndpZHRoLCBsdmwuaGVpZ2h0KSA8PSBNQVhfVEVYVFVSRV9ESU0pIHtcbiAgICAgICAgICByZXR1cm4geyBsdmwsIGZpdHM6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbHZsOiBjLCBmaXRzOiBmYWxzZSB9O1xuICAgIH07XG5cbiAgICBsZXQgc2VsID0gcGljayh1c2FibGUpO1xuICAgIC8vIEEgc3BlY2lmaWMgY2hhbm5lbCBvbmx5IGhhcyB0aWxlcyBhdCB0aGUgKGZldywgbGFyZ2UpIHJlYWwgbGV2ZWxzLiBXaGVuIG5vbmUgb2YgdGhlbSBmaXQgdGhlXG4gICAgLy8gYnVkZ2V0IOKAlCBlLmcuIHRoZSBjb2Fyc2VzdCByZWFsIGxldmVsIGlzIHN0aWxsIDE0OTgyw5cxODY3MCDihpIgfjExMDAgZnVsbC1yZXMgdGlsZXMg4oCUIHN0aXRjaGluZ1xuICAgIC8vIGl0IHBlciBzbGljZSBmbG9vZHMgdGhlIHNlcnZlciAoNTA0cykgYW5kIHN0YWxscyB0aGUgbG9hZC4gVGhlIGNvbXBvc2l0ZSBweXJhbWlkIGhhcyBzbWFsbFxuICAgIC8vIG92ZXJ2aWV3IGxldmVscywgc28gZmV0Y2ggdGhlIGNvbXBvc2l0ZSBpbnN0ZWFkIGFuZCBkZXJpdmUgbHVtaW5hbmNlIGZyb20gaXQuIEV2ZXJ5IGNhbGxlciBoZXJlXG4gICAgLy8gKHN1cmZhY2UgaGVpZ2h0LCB2b2x1bWUgYXNzZW1ibHksIHJlYWRiYWNrKSBkb3duc2NhbGVzIHRoZSBwbGFuZSBhbnl3YXksIHNvIGEgY29tcG9zaXRlLWRlcml2ZWRcbiAgICAvLyBwbGFuZSBpcyB0aGUgcmlnaHQgdHJhZGUgZm9yIG9uZSB0aGF0IGFjdHVhbGx5IGxvYWRzLiBPbmx5IGtpY2tzIGluIHdoZW4gdGhlIGNoYW5uZWwgY2FuJ3QgZml0LlxuICAgIGlmIChhbGxvd0NvbXBvc2l0ZUZhbGxiYWNrICYmICFzZWwuZml0cyAmJiBjaGFubmVsICE9IG51bGwgJiYgZGVzYy5sZXZlbHMubGVuZ3RoID4gcGVyQ2hhbm5lbExldmVscykge1xuICAgICAgY29uc3QgY29tcG9zaXRlID0gcGljayhkZXNjLmxldmVscyk7XG4gICAgICBpZiAoY29tcG9zaXRlLmZpdHMgfHwgdGlsZXNGb3IoY29tcG9zaXRlLmx2bCkgPCB0aWxlc0ZvcihzZWwubHZsKSkge1xuICAgICAgICBlZmZlY3RpdmVDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgICAgICBzZWwgPSBjb21wb3NpdGU7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW25hcGFyaS1qc10gY2hhbm5lbCAke2NoYW5uZWx9IGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiB0aGUgJHtidWRnZXRUaWxlc30tdGlsZSBgICtcbiAgICAgICAgICAgIGBidWRnZXQ7IHVzaW5nIHRoZSBjb21wb3NpdGUgb3ZlcnZpZXcgKHJlcyAke3NlbC5sdmwucmVzfSwgJHtzZWwubHZsLndpZHRofcOXYCArXG4gICAgICAgICAgICBgJHtzZWwubHZsLmhlaWdodH0pIGZvciB0aGlzIHBsYW5lLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNob3NlbiA9IHNlbC5sdmw7XG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjaG9zZW4ud2lkdGggLyB0KSk7XG4gICAgY29uc3Qgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjaG9zZW4uaGVpZ2h0IC8gdCkpO1xuICAgIGlmICghc2VsLmZpdHMgJiYgYnVkZ2V0VGlsZXMgPT09IE1BWF9TVElUQ0hfVElMRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtuYXBhcmktanNdIGZ1bGwgcmVzb2x1dGlvbiBleGNlZWRzIHRoZSAke2J1ZGdldFRpbGVzfS10aWxlLyR7TUFYX1RFWFRVUkVfRElNfXB4IGJ1ZGdldDsgYCArXG4gICAgICAgICAgYGRpc3BsYXlpbmcgb3ZlcnZpZXcgbGV2ZWwgcmVzICR7Y2hvc2VuLnJlc30gKCR7Y2hvc2VuLndpZHRofcOXJHtjaG9zZW4uaGVpZ2h0fSkuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbHMgPT09IDEgJiYgcm93cyA9PT0gMSkgcmV0dXJuIGZldGNoVGlsZShjaG9zZW4ucmVzLCAwLCAwLCB0KTtcblxuICAgIC8vIFN0aXRjaCBpbnRvIG9uZSBsZXZlbC1zaXplZCBjYW52YXMuIEZldGNoIHRoZSBncmlkIHdpdGggQk9VTkRFRCBjb25jdXJyZW5jeTogZmlyaW5nIGV2ZXJ5IHRpbGVcbiAgICAvLyBhdCBvbmNlIChhIGJpZyBncmlkID0gaHVuZHJlZHMgb2YgcmVxdWVzdHMpIG92ZXJ3aGVsbWVkIHRoZSB0aWxlIHNlcnZlciAoNTA0cykuIEVkZ2UgdGlsZXMgYXJlXG4gICAgLy8gbmFycm93ZXIvc2hvcnRlcjsgZHJhd0ltYWdlIHBsYWNlcyBlYWNoIGF0IGl0cyBncmlkIG9mZnNldCBzbyBwYXJ0aWFsIHRpbGVzIGxpbmUgdXAuXG4gICAgY29uc3QgY29vcmRzOiBBcnJheTx7IGNvbDogbnVtYmVyOyByb3c6IG51bWJlciB9PiA9IFtdO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykgY29vcmRzLnB1c2goeyBjb2wsIHJvdyB9KTtcbiAgICB9XG4gICAgY29uc3QgdGlsZXM6IEFycmF5PHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyOyBibXA6IEltYWdlQml0bWFwIH0+ID0gW107XG4gICAgY29uc3Qgc3RpdGNoV29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBqb2IgPSBjb29yZHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFqb2IpIHJldHVybjtcbiAgICAgICAgY29uc3QgYm1wID0gYXdhaXQgZmV0Y2hUaWxlKGNob3Nlbi5yZXMsIGpvYi5jb2wsIGpvYi5yb3csIHQpO1xuICAgICAgICB0aWxlcy5wdXNoKHsgY29sOiBqb2IuY29sLCByb3c6IGpvYi5yb3csIGJtcCB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5taW4oVElMRV9GRVRDSF9DT05DVVJSRU5DWSwgY29vcmRzLmxlbmd0aCkgfSwgKCkgPT4gc3RpdGNoV29ya2VyKCkpLFxuICAgICk7XG5cbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoY2hvc2VuLndpZHRoLCBjaG9zZW4uaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjYW52YXMud2lkdGggPSBjaG9zZW4ud2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gY2hvc2VuLmhlaWdodDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXNcbiAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgfCBudWxsO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIHNsaWNlIHN0aXRjaDogMkQgY29udGV4dCB1bmF2YWlsYWJsZScpO1xuICAgIGZvciAoY29uc3QgeyBjb2wsIHJvdywgYm1wIH0gb2YgdGlsZXMpIHtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCBjb2wgKiB0LCByb3cgKiB0KTtcbiAgICAgIGJtcC5jbG9zZT8uKCk7XG4gICAgfVxuXG4gICAgLy8gU2FmZXR5IG5ldDogaWYgdGhlIGNob3NlbiBsZXZlbCBzdGlsbCBleGNlZWRzIHRoZSBHUFUgdGV4dHVyZSBsaW1pdCAoZS5nLiBhIG11bHRpY2hhbm5lbFxuICAgIC8vIGltYWdlIHdob3NlIGNvYXJzZXN0IFJFQUwgbGV2ZWwgaXMgaHVnZSDigJQgb3ZlcnZpZXcgbGV2ZWxzIGFyZSBjb21wb3NpdGUtb25seSksIGRvd25zY2FsZSB0aGVcbiAgICAvLyBzdGl0Y2hlZCBjYW52YXMgdG8gZml0IHNvIHRoZSBXZWJHUFUgdGV4dHVyZSB1cGxvYWQgY2FuJ3QgZmFpbC5cbiAgICBjb25zdCBsb25nZXN0ID0gTWF0aC5tYXgoY2hvc2VuLndpZHRoLCBjaG9zZW4uaGVpZ2h0KTtcbiAgICBpZiAobG9uZ2VzdCA+IE1BWF9URVhUVVJFX0RJTSkge1xuICAgICAgY29uc3Qgc2NhbGUgPSBNQVhfVEVYVFVSRV9ESU0gLyBsb25nZXN0O1xuICAgICAgY29uc3Qgb3V0VyA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoY2hvc2VuLndpZHRoICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IG91dEggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGNob3Nlbi5oZWlnaHQgKiBzY2FsZSkpO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gc3RpdGNoZWQgbGV2ZWwgJHtjaG9zZW4ud2lkdGh9w5cke2Nob3Nlbi5oZWlnaHR9IGV4Y2VlZHMgdGhlIGAgK1xuICAgICAgICAgIGAke01BWF9URVhUVVJFX0RJTX1weCB0ZXh0dXJlIGxpbWl0OyBkb3duc2NhbGluZyB0byAke291dFd9w5cke291dEh9LmAsXG4gICAgICApO1xuICAgICAgbGV0IG91dDogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb3V0ID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhvdXRXLCBvdXRIKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBvdXQud2lkdGggPSBvdXRXO1xuICAgICAgICBvdXQuaGVpZ2h0ID0gb3V0SDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9jdHggPSBvdXQuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgICB8IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IG51bGw7XG4gICAgICBpZiAoIW9jdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gc2xpY2UgZG93bnNjYWxlOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgICBvY3R4LmRyYXdJbWFnZShjYW52YXMgYXMgdW5rbm93biBhcyBDYW52YXNJbWFnZVNvdXJjZSwgMCwgMCwgb3V0Vywgb3V0SCk7XG4gICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAob3V0IGFzIHVua25vd24gYXMgSW1hZ2VCaXRtYXBTb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoY2FudmFzIGFzIHVua25vd24gYXMgSW1hZ2VCaXRtYXBTb3VyY2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElEYXRhUmVuZGVyZXI6IGxvYWQgLyByZW5kZXIgLyB2aWV3cG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxOYXBhcmlMb2FkZWQ+IHtcbiAgICAvLyBLZWVwcyBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UncyBibG9iIGNhY2hlIGluIHN5bmMgZXZlbiB3aGVuIHRoZSB1c2VyXG4gICAgLy8gc3dpdGNoZXMgYmFja2VuZHMgKGUuZy4gT1NEIEltYWdlIOKGkiBuYXBhcmkgVm9sdW1lKSBvbiB0aGUgc2FtZSBmaWxlIOKAlFxuICAgIC8vIHdoaWNoZXZlciBiYWNrZW5kIGxvYWRzIGEgZ2VudWluZWx5IGRpZmZlcmVudCBmaWxlIGZpcnN0IGV2aWN0cyBpdC5cbiAgICB0aGlzLnNpbXBsZVN0YWNrLm5vdGVBY3RpdmVGaWxlKGltYWdlSW5mby5maWxlTmFtZSk7XG4gICAgdGhpcy5sb2FkZWQgPSB7IGltYWdlSW5mbywgejogekluZGV4LCBmaWxlbmFtZTogaW1hZ2VJbmZvLmZpbGVOYW1lIH07XG4gICAgcmV0dXJuIHRoaXMubG9hZGVkO1xuICB9XG5cbiAgYXN5bmMgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IHVua25vd24sXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIHBsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBfaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwbG90RGl2KTtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtuYXBhcmktanNdIHBsb3QgdGFyZ2V0ICMke3Bsb3REaXZ9IG5vdCBmb3VuZGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICB0aGlzLnBsb3REaXZJZCA9IHBsb3REaXY7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcblxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IHNjcmVlbkhlaWdodCA/IGAke3NjcmVlbkhlaWdodH1weGAgOiAnMTAwJSc7XG4gICAgaG9zdC5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuXG4gICAgY29uc3QgaW5mbyA9IChpbWFnZUxvYWRlZCBhcyBOYXBhcmlMb2FkZWQpPy5pbWFnZUluZm8gPz8gaW1hZ2VJbmZvO1xuICAgIGNvbnN0IHogPSAoaW1hZ2VMb2FkZWQgYXMgTmFwYXJpTG9hZGVkKT8ueiA/PyAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZpZXdlciA9IG5ldyBWaWV3ZXIoeyBjYW52YXMsIGJhY2tncm91bmQ6IHsgcjogMC4wNywgZzogMC4wNywgYjogMC4wOSwgYTogMSB9IH0pO1xuICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7XG4gICAgICBhd2FpdCB2aWV3ZXIucmVhZHk7XG5cbiAgICAgIGlmIChpc05hcGFyaVNjYXR0ZXIocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTY2F0dGVyKHZpZXdlciwgeik7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpU2NhdHRlcjNkKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U2NhdHRlcjNkKHZpZXdlciwgaW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpU3VyZmFjZShwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFN1cmZhY2Uodmlld2VyKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmkzZChwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFZvbHVtZSh2aWV3ZXIsIGluZm8sIHBsb3RUeXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2Uoeik7XG4gICAgICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZURpc3BsYXlTdGF0ZSgpO1xuICAgICAgICB0aGlzLmluc3RhbGxTY2FsZUJhcigpO1xuICAgICAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCB2aWV3ZXIsIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgICAgICB0aGlzLmJ1aWxkVG9vbEhvc3RzKCk7XG4gICAgICAgIC8vIEtlZXAgdGhlIHBpeGVsLXRvb2wgcmVhZGJhY2sgKGxhc3RQaXhlbHMpIGN1cnJlbnQgYXMgdGhlIHZpZXcgcGFucy96b29tcyBhbmQgdGlsZWRcbiAgICAgICAgLy8gbGV2ZWxzIGxvYWQsIHNvIHdhbmQvYnJ1c2gvU0FNIHNhbXBsZSB0aGUgYWN0dWFsbHktZGlzcGxheWVkIGltYWdlIChqaXQtdWkjMTAyKS5cbiAgICAgICAgdGhpcy5jYW1lcmFSZWFkYmFja09mZiA9IHZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMuYXJtUmVhZGJhY2soKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gcGxvdCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQ2hhbm5lbHM6IHBlci1jaGFubmVsIGNvbXBvc2l0ZSwgTFVULCBuYXRpdmUgaGlzdG9ncmFtcyAoaml0LXVpIzEwMikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRoZSBncmF5c2NhbGUgZGlzcGxheSBjb2xvcm1hcCBmcm9tIHRoZSBzdG9yZSBzZWxlY3Rpb24gKCtyZXZlcnNlKSwgZGVmYXVsdGluZyB0byBncmF5LlxuICAgKiAgTWFwcyB0aGUgaml0LXVpIHN0b3JlIGNvbG9ybWFwIG5vZGUgdG8gYSBuYXBhcmkgYENvbG9ybWFwYCB2aWEgdGhlIGxpYnJhcnkncyBMVVQgZmFjdG9yeTtcbiAgICogIHRoZSBtdWx0aWNoYW5uZWwgdGludCByYW1wcyBhcmUgYnVpbHQgaW5zaWRlIHtAbGluayBNdWx0aUNoYW5uZWxJbWFnZVZpZXd9IGZyb20gZWFjaFxuICAgKiAgY2hhbm5lbCdzIGhleCBjb2xvdXIuICovXG4gIHByaXZhdGUgZ3JheXNjYWxlQ29sb3JtYXAoKTogQ29sb3JtYXAgfCBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGwpPy5kYXRhPy52YWx1ZTtcbiAgICBjb25zdCBsdXQgPSB2YWx1ZSAhPSBudWxsID8gYnVpbGRDb2xvcm1hcEx1dCh2YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSkgOiBudWxsO1xuICAgIGlmIChsdXQpIHJldHVybiBjb2xvcm1hcEZyb21MdXQoJ2dyYXktY21hcCcsIGx1dCk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFJldmVyc2VcbiAgICAgID8gY29sb3JtYXBGcm9tTHV0KCdncmF5LXJldicsIFtbMjU1LCAyNTUsIDI1NV0sIFswLCAwLCAwXV0gYXMgUmdiW10pXG4gICAgICA6ICdncmF5JztcbiAgfVxuXG4gIC8qKiBGZXRjaCBhIHN0aXRjaGVkIHNsaWNlIGFuZCByZWFkIGl0IGJhY2sgYXMgYSBzaW5nbGUtY2hhbm5lbCB1aW50OCBwbGFuZS4gYGNoYW5uZWxgIHNlbGVjdHMgYVxuICAgKiAgYmFuZCAobXVsdGljaGFubmVsKTsgb21pdCBpdCBmb3IgdGhlIGdyYXlzY2FsZSBjb21wb3NpdGUgKGFsbCBvdmVydmlldyBsZXZlbHMgYXZhaWxhYmxlLCBzbyBhXG4gICAqICBsYXJnZSBpbWFnZSBwaWNrcyBhIGZpdHRpbmcgZG93bnNjYWxlZCBsZXZlbCByYXRoZXIgdGhhbiBvbmx5IHRoZSBmdWxsLXJlcyByZWFsIGxldmVsKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENoYW5uZWxEYXRhKFxuICAgIHo6IG51bWJlcixcbiAgICBjaGFubmVsPzogbnVtYmVyLFxuICAgIGJ1ZGdldFRpbGVzPzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJtcCA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCBjaGFubmVsLCBidWRnZXRUaWxlcyk7XG4gICAgcmV0dXJuIHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYm1wKTtcbiAgfVxuXG4gIC8qKiBEZWNvZGUgYW4gYEltYWdlQml0bWFwYCAoc2VydmVyIGJhbmRzIGFyZSBncmF5c2NhbGUsIFI9Rz1CKSB0byBhIHNpbmdsZS1jaGFubmVsIHVpbnQ4IHBsYW5lLlxuICAgKiAgYG1heFNpZGVgIGNhcHMgdGhlIGxvbmdlc3Qgc2lkZSAoZG93bnNjYWxpbmcgb24gdGhlIGNhbnZhcyBkcmF3KSDigJQgdXNlZCB0byBrZWVwIHByZS1sb2FkZWRcbiAgICogIHN1cmZhY2Ugc2xpY2UgcGxhbmVzIHNtYWxsLiAqL1xuICBwcml2YXRlIGJpdG1hcFRvTHVtaW5hbmNlKFxuICAgIGJtcDogSW1hZ2VCaXRtYXAsXG4gICAgbWF4U2lkZT86IG51bWJlcixcbiAgKTogeyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBzY2FsZSA9IG1heFNpZGUgPyBNYXRoLm1pbigxLCBtYXhTaWRlIC8gTWF0aC5tYXgoYm1wLndpZHRoLCBibXAuaGVpZ2h0LCAxKSkgOiAxO1xuICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJtcC53aWR0aCAqIHNjYWxlKSk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoYm1wLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgaWYgKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHcsIGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHc7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXNcbiAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgfCBudWxsO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIGNoYW5uZWwgcmVhZGJhY2s6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcbiAgICAvLyBTY2FsZSB0aGUgV0hPTEUgYml0bWFwIGludG8gdGhlIChwb3NzaWJseSBzbWFsbGVyKSB0YXJnZXQgY2FudmFzIOKAlCBkcmF3aW5nIGF0IG5hdHVyYWwgc2l6ZVxuICAgIC8vIHdvdWxkIGNyb3AgdG8gdGhlIHRvcC1sZWZ0IHfDl2ggY29ybmVyIHdoZW4gZG93bnNjYWxpbmcgYSBsYXJnZSBzbGljZSAobWF4U2lkZSA8IGJtcCBzaXplKS5cbiAgICBjdHguZHJhd0ltYWdlKGJtcCwgMCwgMCwgdywgaCk7XG4gICAgYm1wLmNsb3NlPy4oKTtcbiAgICBjb25zdCByZ2JhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhO1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3ICogaCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3ICogaDsgaSsrKSBkYXRhW2ldID0gcmdiYVtpICogNF07XG4gICAgcmV0dXJuIHsgZGF0YSwgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgMkQgaW1hZ2UgZm9yIHNsaWNlIGB6YC4gV2l0aCBhIHNlcnZlciBweXJhbWlkIGRlc2NyaXB0b3Igd2UgdXNlIGEgcHlyYW1pZGFsXG4gICAqIHtAbGluayBUaWxlZFNvdXJjZX0gcGVyIGxheWVyIHNvIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb24gb24gem9vbSAobGlrZSBPU0QpIGFuZFxuICAgKiBzaXRzIG5hdHVyYWxseSBpbiBmdWxsLXJlc29sdXRpb24gY29vcmRpbmF0ZXM7IHdpdGhvdXQgb25lIHdlIGZhbGwgYmFjayB0byB0aGUgc2luZ2xlLWxldmVsXG4gICAqIHN0aXRjaC4gVGhyZWUgZGlzcGxheSBtb2RlcyBlaXRoZXIgd2F5OiBtdWx0aWNoYW5uZWwgYWRkaXRpdmUgdGludCwgZ3JheXNjYWxlIGNvbG9ybWFwLCBSR0IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlKHo6IG51bWJlciwgdG9rZW4/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGlmIChkZXNjICYmIGRlc2MubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgIGlmICh0b2tlbiAhPSBudWxsICYmIHRva2VuICE9PSB0aGlzLnNsaWNlUmVxKSByZXR1cm47XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlVGlsZWQoeiwgZGVzYyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbmRlckltYWdlU3RpdGNoZWQoeiwgdG9rZW4pO1xuICB9XG5cbiAgLyoqIFNpbmdsZS1sZXZlbCBzdGl0Y2ggZmFsbGJhY2sgKG5vIGRlc2NyaXB0b3IpOiB0aGUgcHJlLXRpbGluZyBwYXRoLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlU3RpdGNoZWQoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2M/LmNoYW5uZWxzID8/IChzdGF0ZXMubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9ICEhZGVzYz8ubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG5cbiAgICAvLyAxKSBGZXRjaCBhbGwgcGl4ZWwgZGF0YSBCRUZPUkUgdG91Y2hpbmcgdGhlIHZpZXdlciwgc28gYSBzdXBlcnNlZGVkIHNjcnViIGNhbiBiYWlsIHdpdGhvdXRcbiAgICAvLyAgICBoYXZpbmcgdG9ybiBkb3duIHRoZSB2aXNpYmxlIGxheWVycyAoYXZvaWRzIGZsaWNrZXIgLyBvdXQtb2Ytb3JkZXIgbGF5ZXIgc3RhdGUpLlxuICAgIGxldCBtb2RlOiAnZ3JheXNjYWxlJyB8ICdtdWx0aWNoYW5uZWwnIHwgJ3JnYic7XG4gICAgbGV0IHBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCBiaXRtYXA6IEltYWdlQml0bWFwIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgbW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgcGxhbmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGNoYW5uZWxDb3VudCB9LCAoXywgYykgPT4gdGhpcy5mZXRjaENoYW5uZWxEYXRhKHosIGMpKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDEpIHtcbiAgICAgIG1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICAgIC8vIENvbXBvc2l0ZSBmZXRjaCAobm8gY2hhbm5lbCkg4oaSIGFsbCBvdmVydmlldyBsZXZlbHMgdXNhYmxlLCBzbyBhIGxhcmdlIGdyYXlzY2FsZSBpbWFnZVxuICAgICAgLy8gc2VsZWN0cyBhIGZpdHRpbmcgZG93bnNjYWxlZCBsZXZlbCBpbnN0ZWFkIG9mIHRoZSBmdWxsLXJlcyByZWFsIGxldmVsICh0ZXh0dXJlIGxpbWl0KS5cbiAgICAgIHBsYW5lcyA9IFthd2FpdCB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeildO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RlID0gJ3JnYic7XG4gICAgICBiaXRtYXAgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2Uoeik7XG4gICAgfVxuXG4gICAgLy8gMikgQ29tbWl0IOKAlCB1bmxlc3MgYSBuZXdlciBzY3J1YiBzdXBlcnNlZGVkIHVzIG9yIHRoZSB2aWV3ZXIgd2FzIHRvcm4gZG93bi5cbiAgICBpZiAoKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHx8IHRoaXMudmlld2VyICE9PSB2KSB7XG4gICAgICBiaXRtYXA/LmNsb3NlPy4oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgZGlzcGxheWVkIHRleHR1cmUgbWF5IGJlIGEgZG93bnNjYWxlZCBweXJhbWlkIGxldmVsOyBzY2FsZSB0aGUgbGF5ZXIgaW50byBGVUxMLVJFU09MVVRJT05cbiAgICAvLyB3b3JsZCBjb29yZGluYXRlcyAobGV2ZWwtMCBwaXhlbHMpIHNvIHRoZSBjYW1lcmEsIHJlYWRiYWNrIGFuZCDigJQgY3JpdGljYWxseSDigJQgcHJlLXNhdmVkXG4gICAgLy8gcmVnaW9ucyAoc3RvcmVkIGluIGZ1bGwtcmVzIGNvb3JkcywgZS5nLiBuZHBpKSBhbGwgbGluZSB1cCByZWdhcmRsZXNzIG9mIHdoaWNoIGxldmVsIGlzIHNob3duLlxuICAgIC8vIFRoaXMgbWlycm9ycyBPU0QsIHdob3NlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGFsd2F5cyBsZXZlbCAwLlxuICAgIGNvbnN0IHRleFcgPSBtb2RlID09PSAncmdiJyA/IChiaXRtYXAgYXMgSW1hZ2VCaXRtYXApLndpZHRoIDogcGxhbmVzWzBdPy53aWR0aCA/PyAwO1xuICAgIGNvbnN0IHRleEggPSBtb2RlID09PSAncmdiJyA/IChiaXRtYXAgYXMgSW1hZ2VCaXRtYXApLmhlaWdodCA6IHBsYW5lc1swXT8uaGVpZ2h0ID8/IDA7XG4gICAgY29uc3QgZnVsbFcgPSBkZXNjPy53aWR0aCB8fCB0ZXhXIHx8IDE7XG4gICAgY29uc3QgZnVsbEggPSBkZXNjPy5oZWlnaHQgfHwgdGV4SCB8fCAxO1xuICAgIGNvbnN0IHNjYWxlOiBbbnVtYmVyLCBudW1iZXJdID0gW3RleFcgPyBmdWxsVyAvIHRleFcgOiAxLCB0ZXhIID8gZnVsbEggLyB0ZXhIIDogMV07XG5cbiAgICB0aGlzLmltYWdlTW9kZSA9IG1vZGU7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSB0aGlzLmltYWdlU21vb3RoaW5nID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcodik7XG4gICAgaWYgKG1vZGUgPT09ICdtdWx0aWNoYW5uZWwnKSB7XG4gICAgICBjb25zdCB2aWV3czogQ2hhbm5lbFZpZXdbXSA9IHBsYW5lcy5tYXAoKGQsIGMpID0+IHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBkLndpZHRoLCBoZWlnaHQ6IGQuaGVpZ2h0LCBjaGFubmVsczogMSwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IGQuZGF0YSB9LFxuICAgICAgICAgIHRpbnQ6IGNvbG9yLFxuICAgICAgICAgIG5hbWU6IHN0Py5uYW1lID8/IGBjaCR7Y31gLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2dyYXlzY2FsZScpIHtcbiAgICAgIGNvbnN0IGQgPSBwbGFuZXNbMF07XG4gICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKFxuICAgICAgICAnZ3JheXNjYWxlJyxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogeyBraW5kOiAndHlwZWQnLCB3aWR0aDogZC53aWR0aCwgaGVpZ2h0OiBkLmhlaWdodCwgY2hhbm5lbHM6IDEsIGR0eXBlOiAndWludDgnLCBkYXRhOiBkLmRhdGEgfSxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgICBzY2FsZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB7IGludGVycG9sYXRpb24gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdyZ2InLCBbeyBzb3VyY2U6IGJpdG1hcCBhcyBJbWFnZUJpdG1hcCwgc2NhbGUgfV0sIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZVcgPSBmdWxsVztcbiAgICB0aGlzLmltYWdlSCA9IGZ1bGxIO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgMkQgaW1hZ2Ugd2l0aCBweXJhbWlkYWwge0BsaW5rIFRpbGVkU291cmNlfXMg4oCUIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb25cbiAgICogYXMgeW91IHpvb20gaW4gKHRoZSB2aXN1YWwgZmV0Y2hlcyB0aGUgbGV2ZWwgd2hvc2UgdGV4ZWxzIOKJiCBzY3JlZW4gcGl4ZWxzKSBhbmQgc2l0cyBpbiBmdWxsLXJlc1xuICAgKiBjb29yZGluYXRlcyBzbyByZWdpb25zIGFsaWduLiBTYW1lIHRocmVlIG1vZGVzIGFzIHRoZSBzdGl0Y2ggcGF0aC4gUGVyLWNoYW5uZWwgbGF5ZXJzIHVzZSB0aGVcbiAgICogUkVBTCBweXJhbWlkIGxldmVscyAocGVyLWNoYW5uZWwgdGlsZXMgb25seSBleGlzdCB0aGVyZSk7IHRoZSBjb21wb3NpdGUgdXNlcyBhbGwgbGV2ZWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJJbWFnZVRpbGVkKHo6IG51bWJlciwgZGVzYzogVGlsZURlc2NyaXB0b3IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2MuY2hhbm5lbHMgPz8gKHN0YXRlcy5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gISFkZXNjLm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxO1xuICAgIGNvbnN0IGludGVycG9sYXRpb246ICdsaW5lYXInIHwgJ25lYXJlc3QnID0gdGhpcy5pbWFnZVNtb290aGluZyA/ICdsaW5lYXInIDogJ25lYXJlc3QnO1xuXG4gICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcodik7XG5cbiAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgY29uc3Qgdmlld3M6IENoYW5uZWxWaWV3W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2MuY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgdmlld3MucHVzaCh7XG4gICAgICAgICAgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgYywgMSksXG4gICAgICAgICAgdGludDogY29sb3IsXG4gICAgICAgICAgbmFtZTogc3Q/Lm5hbWUgPz8gYGNoJHtjfWAsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcignbXVsdGljaGFubmVsJywgdmlld3MsIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgdGhpcy5pbWFnZU1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoXG4gICAgICAgICdncmF5c2NhbGUnLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCAxKSxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgeyBpbnRlcnBvbGF0aW9uIH0sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdyZ2InO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ3JnYicsIFt7IHNvdXJjZTogdGhpcy5idWlsZFRpbGVkU291cmNlKGRlc2MsIHVuZGVmaW5lZCwgNCkgfV0sIHtcbiAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmltYWdlVyA9IGRlc2Mud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkZXNjLmhlaWdodDtcbiAgICAvLyBBd2FpdCBvbiB0aGUgaW5pdGlhbCByZW5kZXIgc28gZ2V0SGlzdG9ncmFtL2F1dG9Db250cmFzdCBoYXZlIGRhdGEgaW1tZWRpYXRlbHk7IHNsaWNlIGNoYW5nZXNcbiAgICAvLyByZWZyZXNoIGZpcmUtYW5kLWZvcmdldCAodGhlIGhpc3RvZ3JhbSBwYW5lIHJldHJpZXMpLlxuICAgIGF3YWl0IHRoaXMucmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXMoeiwgZGVzYyk7XG4gIH1cblxuICAvKiogQnVpbGQgYSBweXJhbWlkYWwgVGlsZWRTb3VyY2UgYmFja2VkIGJ5IHRoZSBzZXJ2ZXIgYC90aWxlYCBlbmRwb2ludC4gYGNoYW5uZWxgIHNlbGVjdHMgYSBiYW5kXG4gICAqICAoZ3JheXNjYWxlIGx1bWluYW5jZSwgcmVhbCBsZXZlbHMgb25seSk7IG9taXQgaXQgZm9yIHRoZSBjb21wb3NpdGUgKFJHQkEsIGFsbCBsZXZlbHMpLiAqL1xuICBwcml2YXRlIGJ1aWxkVGlsZWRTb3VyY2UoXG4gICAgZGVzYzogVGlsZURlc2NyaXB0b3IsXG4gICAgY2hhbm5lbDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGNoYW5uZWxzOiAxIHwgNCxcbiAgKTogVGlsZWRTb3VyY2Uge1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpID8/ICcnO1xuICAgIC8vIFBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgYXQgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbHM7IHRoZSBjb21wb3NpdGUgZXhpc3RzIGF0IGFsbCBsZXZlbHMuXG4gICAgY29uc3QgdXNhYmxlID1cbiAgICAgIGNoYW5uZWwgPT0gbnVsbFxuICAgICAgICA/IGRlc2MubGV2ZWxzXG4gICAgICAgIDogZGVzYy5sZXZlbHMuc2xpY2UoMCwgTWF0aC5tYXgoMSwgZGVzYy5yZWFsTGV2ZWxzID8/IGRlc2MubGV2ZWxzLmxlbmd0aCkpO1xuICAgIGNvbnN0IGxldmVsU2NhbGVzID0gdXNhYmxlLm1hcCgobCkgPT4gZGVzYy53aWR0aCAvIE1hdGgubWF4KDEsIGwud2lkdGgpKTsgLy8gbGV2ZWwtMCBweCBwZXIgbGV2ZWwgcHhcbiAgICBjb25zdCB0aWxlU2l6ZSA9IGRlc2MudGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIGNvbnN0IGNoID0gY2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtjaGFubmVsfWA7XG4gICAgY29uc3QgYXBpID0gdGhpcy5hcGk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICd0aWxlZCcsXG4gICAgICB3aWR0aDogZGVzYy53aWR0aCxcbiAgICAgIGhlaWdodDogZGVzYy5oZWlnaHQsXG4gICAgICB0aWxlU2l6ZSxcbiAgICAgIGxldmVsczogdXNhYmxlLmxlbmd0aCxcbiAgICAgIGxldmVsU2NhbGVzLFxuICAgICAgZGVwdGg6IE1hdGgubWF4KDEsIGRlc2MueiB8fCAxKSxcbiAgICAgIGNoYW5uZWxzLFxuICAgICAgZHR5cGU6ICd1aW50OCcsXG4gICAgICBmZXRjaFRpbGU6IGFzeW5jIChrZXk6IFRpbGVLZXkpOiBQcm9taXNlPFBpeGVsQ2h1bms+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gdXNhYmxlW2tleS5sZXZlbF0/LnJlcyA/PyBrZXkubGV2ZWw7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke2FwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2tleS5jb2x9JnJvdz0ke2tleS5yb3d9Jno9JHtrZXkuen0mdGlsZVNpemU9JHt0aWxlU2l6ZX0ke2NofWA7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIHRpbGUgJHtrZXkubGV2ZWx9LyR7a2V5LmNvbH0vJHtrZXkucm93fSDihpIgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSk7XG4gICAgICAgIGlmIChjaGFubmVscyA9PT0gNCkgcmV0dXJuIHsgd2lkdGg6IGJtcC53aWR0aCwgaGVpZ2h0OiBibXAuaGVpZ2h0LCBkYXRhOiBibXAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYm1wKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiAoUmUpZmV0Y2ggYSBjb2Fyc2UgcGVyLWNoYW5uZWwgbHVtaW5hbmNlIHNhbXBsZSBmb3IgdGhlIGhpc3RvZ3JhbSAodGlsZWQgbW9kZSBoYXMgbm8gZnVsbFxuICAgKiAgaW4tbWVtb3J5IHBpeGVscykuIE9uZSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBjaGFubmVsOyBjYWNoZWQgYnkgY2hhbm5lbCBpbmRleC4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6OiBudW1iZXIsIGRlc2M6IFRpbGVEZXNjcmlwdG9yKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ3JnYicpIHJldHVybjsgLy8gUkdCIHVzZXMgdGhlIGRpc3BsYXllZC1waXhlbCByZWFkYmFjayAocmdiSGlzdG9ncmFtKVxuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJyA/IGRlc2MuY2hhbm5lbHMgPz8gMSA6IDE7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmltYWdlTW9kZSA9PT0gJ211bHRpY2hhbm5lbCcgPyBjIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgdGhpcy5mZXRjaENoYW5uZWxEYXRhKHosIGNoLCAxKTsgLy8gYnVkZ2V0IDEg4oaSIGNvYXJzZXN0IHNpbmdsZSB0aWxlXG4gICAgICAgIHRoaXMuaGlzdFNhbXBsZXMuc2V0KGMsIGQuZGF0YSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbGVhdmUgdGhpcyBjaGFubmVsJ3Mgc2FtcGxlIHVuc2V0ICovXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFN1YnNjcmliZSBjaGFubmVsIHN0YXRlcyArIGdyYXlzY2FsZSBjb2xvcm1hcCDihpIgbGl2ZS1hcHBseSB0byB0aGUgcmVuZGVyZWQgbGF5ZXJzIChub1xuICAgKiAgcmUtZmV0Y2g7IG9ubHkgeiBjaGFuZ2VzIHJlLWZldGNoKS4gUmVwbGFjZXMgYW55IHByaW9yIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjaGFubmVscywgY29sb3JtYXAsIHJldmVyc2UsIGludmVydF0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgdGhpcy5hcHBseURpc3BsYXlTdGF0ZShjaGFubmVscyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIHRoZSBzdG9yZSBjb2xvcm1hcCAoK3JldmVyc2UpLCBpbnZlcnQsIGFuZCBjaGFubmVsIHN0YXRlIOKGkiB0aGUgdm9sdW1lL2lzb3N1cmZhY2VcbiAgICogIHRyYW5zZmVyIGZ1bmN0aW9uOiBjb2xvdXIgKGNoYW5uZWwgdGludCBvciBzZWxlY3RlZCBjb2xvcm1hcCksIHRoZSBpbnRlbnNpdHkgKip3aW5kb3dcbiAgICogIChtaW4vbWF4IOKGkiBjb250cmFzdExpbWl0cykqKiBhbmQgKipnYW1tYSoqLCBtaXJyb3JpbmcgdGhlIGdyYXlzY2FsZSBpbWFnZSdzIGRpc3BsYXkgY29udHJvbHNcbiAgICogIHNvIHRoZSBoaXN0b2dyYW0gcGFuZSBkcml2ZXMgdGhlIDNEIHJlbmRlci4gUmVwbGFjZXMgYW55IHByaW9yIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVWb2x1bWVEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0LCBjaGFubmVsc10pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMudm9sdW1lVmlldztcbiAgICAgIGlmICghdmlldykgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMudm9sdW1lTXVsdGljaGFubmVsKSB7XG4gICAgICAgIC8vIEVhY2ggY2hhbm5lbCdzIGxheWVyIGlzIHRpbnRlZCBieSBpdHMgY29sb3VyIGFuZCBnZXRzIGl0cyBvd24gd2luZG93L2dhbW1hL3Zpc2liaWxpdHkuXG4gICAgICAgIHZpZXcubGF5ZXJzLmZvckVhY2goKF8sIGMpID0+IHtcbiAgICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbChjLCB7XG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicpLFxuICAgICAgICAgICAgLi4uKHN0XG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgIGdhbW1hOiBzdC5nYW1tYSxcbiAgICAgICAgICAgICAgICAgIHZpc2libGU6IHN0LnZpc2libGUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoMCwge1xuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgICAgICAuLi4oc3QgPyB7IGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdIGFzIFtudW1iZXIsIG51bWJlcl0sIGdhbW1hOiBzdC5nYW1tYSB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBBIGNoYW5uZWwncyB0aW50IGNvbG9ybWFwIChibGFja+KGkmNvbG91cikgd2l0aCByZXZlcnNlLXNjYWxlIC8gaW52ZXJ0IGFwcGxpZWQgYnkgZmxpcHBpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFRpbnRDb2xvcm1hcChjb2xvcjogc3RyaW5nKTogQ29sb3JtYXAgfCBzdHJpbmcge1xuICAgIGxldCBjbWFwOiBDb2xvcm1hcCB8IHN0cmluZyA9IHRpbnRDb2xvcm1hcChjb2xvcik7XG4gICAgaWYgKHRoaXMuY3VycmVudFJldmVyc2UpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgaWYgKHRoaXMuaW52ZXJ0RW5hYmxlZCkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICByZXR1cm4gY21hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xvdXIgbWFwIGZvciB0aGUgdm9sdW1lL2lzb3N1cmZhY2UuIEEgcmVhbCBjb2xvcm1hcCBzZWxlY3Rpb24gKHZpcmlkaXMvbWFnbWEv4oCmKSB3aW5zO1xuICAgKiBvdGhlcndpc2UgdGhlIGNoYW5uZWwncyBjb2xvdXIgdGludHMgaXQgKHNvIHRoZSBjaGFubmVsLWRpYWxvZyBjb2xvdXIgc3dhdGNoIHJlY29sb3JzIHRoZSAzRFxuICAgKiByZW5kZXIpLiBSZXZlcnNlLXNjYWxlIGFuZCBpbnZlcnQgZWFjaCBmbGlwIHRoZSByYW1wIOKAlCB0aGUgYFZvbHVtZUxheWVyYCBoYXMgbm8gcGVyLWxheWVyXG4gICAqIGludmVydCwgc28gYm90aCBhcmUgZW11bGF0ZWQgYnkgcmV2ZXJzaW5nIHRoZSBjb2xvcm1hcC5cbiAgICovXG4gIHByaXZhdGUgdm9sdW1lQ29sb3JtYXAoc3Q6IElDaGFubmVsU3RhdGUgfCB1bmRlZmluZWQpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgbGFiZWw/OiBzdHJpbmc7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIC8vIEEgY29sb3JlZCBjb2xvcm1hcCAodmlyaWRpcy9tYWdtYS/igKYpIGRyaXZlcyB0aGUgdm9sdW1lOyB0aGUgZGVmYXVsdCBncmF5c2NhbGUgZmFtaWx5XG4gICAgLy8gKGdyYXkgLyBHcmV5cyAvIEdyZXlzIEludikgeWllbGRzIHRvIHRoZSBjaGFubmVsJ3MgY29sb3VyIHNvIHRoZSBkaWFsb2cgY29sb3VyIHN3YXRjaFxuICAgIC8vIHJlY29sb3JzIHRoZSAzRCByZW5kZXIuXG4gICAgY29uc3QgbGFiZWwgPSAobm9kZT8ubGFiZWwgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZ3JheUZhbWlseSA9IGxhYmVsID09PSAnJyB8fCBsYWJlbC5pbmNsdWRlcygnZ3JleScpIHx8IGxhYmVsLmluY2x1ZGVzKCdncmF5Jyk7XG4gICAgY29uc3QgdmFsdWUgPSBub2RlPy5kYXRhPy52YWx1ZTtcbiAgICBjb25zdCBsdXQgPSAhZ3JheUZhbWlseSAmJiB2YWx1ZSAhPSBudWxsID8gYnVpbGRDb2xvcm1hcEx1dCh2YWx1ZSwgZmFsc2UpIDogbnVsbDtcbiAgICBsZXQgY21hcDogQ29sb3JtYXAgfCBzdHJpbmcgPSBsdXRcbiAgICAgID8gY29sb3JtYXBGcm9tTHV0KCd2b2wtY21hcCcsIGx1dClcbiAgICAgIDogdGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicpO1xuICAgIC8vIFJldmVyc2Utc2NhbGUgYW5kIGludmVydCBlYWNoIGZsaXAgdGhlIHJhbXAgKHRoZSBWb2x1bWVMYXllciBoYXMgbm8gcGVyLWxheWVyIGludmVydCkuXG4gICAgaWYgKHRoaXMuY3VycmVudFJldmVyc2UpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgaWYgKHRoaXMuaW52ZXJ0RW5hYmxlZCkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICByZXR1cm4gY21hcDtcbiAgfVxuXG4gIC8qKiBBcHBseSB0aGUgY3VycmVudCBjaGFubmVsIHN0YXRlcyAvIGNvbG9ybWFwIHRvIHRoZSBsaXZlIGxheWVycyAobm8gcmUtZmV0Y2gpLCBkZWxlZ2F0aW5nIHRoZVxuICAgKiAgcGVyLWNoYW5uZWwgbGF5ZXIgbXV0YXRpb25zIHRvIHRoZSB7QGxpbmsgTXVsdGlDaGFubmVsSW1hZ2VWaWV3fS4gKi9cbiAgcHJpdmF0ZSBhcHBseURpc3BsYXlTdGF0ZShjaGFubmVsczogSUNoYW5uZWxTdGF0ZVtdKTogdm9pZCB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuY2hhbm5lbFZpZXc7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdmlldykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ211bHRpY2hhbm5lbCcpIHtcbiAgICAgIHZpZXcubGF5ZXJzLmZvckVhY2goKF8sIGMpID0+IHtcbiAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgaWYgKCFzdCkgcmV0dXJuO1xuICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoYywge1xuICAgICAgICAgIHRpbnQ6IHN0LmNvbG9yLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdLFxuICAgICAgICAgIGdhbW1hOiBzdC5nYW1tYSxcbiAgICAgICAgICB2aXNpYmxlOiBzdC52aXNpYmxlLFxuICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnKSB7XG4gICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgdmlldy51cGRhdGVDaGFubmVsKDAsIHtcbiAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgIC4uLihzdCA/IHsgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSwgZ2FtbWE6IHN0LmdhbW1hIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogKFJlKWluc3RhbGwgdGhlIHBoeXNpY2FsIHNjYWxlIGJhciBvdmVyIHRoZSAyRCBpbWFnZSwgc2l6ZWQgZnJvbSB0aGUgaW1hZ2UncyDCtW0vcGl4ZWxcbiAgICogIChgL3RpbGVzL2luZm9gIG1wcFgsIGZhbGxpbmcgYmFjayB0byB0aGUgaW1hZ2UgbWV0YWRhdGEpLiBOby1vcCB3aXRob3V0IGEgcGh5c2ljYWwgc2l6ZS4gKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2NhbGVCYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmhvc3QgJiYgbXBwWCA+IDApIHtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBuZXcgTmFwYXJpU2NhbGVCYXIodGhpcy5ob3N0LCB0aGlzLnZpZXdlci5jYW1lcmEsIG1wcFgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDb252ZXJ0IGEgbmFwYXJpLWpzIGBIaXN0b2dyYW1gIChiaW4gY291bnQgKyBtaW4vbWF4KSB0byB0aGUgcGFuZSdzIGBJSGlzdG9ncmFtYCAoYmluIGVkZ2VzKS4gKi9cbiAgcHJpdmF0ZSB0b0lIaXN0b2dyYW0oaDogeyBjb3VudHM6IFVpbnQzMkFycmF5OyBiaW5zOiBudW1iZXI7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9KTogSUhpc3RvZ3JhbSB7XG4gICAgY29uc3Qgc3BhbiA9IGgubWF4IC0gaC5taW4gfHwgMTtcbiAgICBjb25zdCBiaW5zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogaC5iaW5zIH0sIChfLCBpKSA9PiBoLm1pbiArIChpICogc3BhbikgLyBoLmJpbnMpO1xuICAgIGNvbnN0IGNvdW50cyA9IEFycmF5LmZyb20oaC5jb3VudHMpO1xuICAgIHJldHVybiB7IGJpbnMsIGNvdW50cywgbWF4OiBjb3VudHMucmVkdWNlKChtLCBjKSA9PiAoYyA+IG0gPyBjIDogbSksIDApIH07XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIDNEIHZvbHVtZS9pc29zdXJmYWNlLiBBIG11bHRpY2hhbm5lbCBpbWFnZSBiZWNvbWVzIG9uZSBhZGRpdGl2ZSwgdGludGVkXG4gICAqIHtAbGluayBWb2x1bWVMYXllcn0gcGVyIGNoYW5uZWwgKHNvIGVhY2ggY2hhbm5lbCdzIGNvbG91ciBjb21wb3NpdGVzIGludG8gdGhlIHJlbmRlcik7IGFcbiAgICogZ3JheXNjYWxlL2NvbXBvc2l0ZSBpbWFnZSB1c2VzIGEgc2luZ2xlIHZvbHVtZS4gQWRkcyB0aGUgYXhlcyBnaXptbyArIGxhYmVscyBhbmQgd2lyZXMgdGhlXG4gICAqIGRpc3BsYXktc3RhdGUgc3Vic2NyaXB0aW9uLiBUaGUgY2FsbGVyIG93bnMgYHZpZXdlci5yZWFkeWAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50Vm9sdW1lKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMubG9hZFRva2VuOyAvLyBiYWlsIGJlZm9yZSByZW5kZXJpbmcgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzXG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsICh0aWxlZDpmYWxzZSArIGNoYW5uZWxVcmxzKTogbm8gdGlsZSBkZXNjcmlwdG9yLCBzb1xuICAgIC8vIGRlcml2ZSB0aGUgY2hhbm5lbCBjb3VudCBmcm9tIGltYWdlTWV0YSBhbmQgYXNzZW1ibGUgZWFjaCBiYW5kIGZyb20gaXRzIG93blxuICAgIC8vIGNoYW5uZWxVcmxzW3pdW2NdIHBsYW5lIChmZXRjaFNsaWNlIGRvZXMgdGhlIHBlci1jaGFubmVsIHJvdXRpbmcpLlxuICAgIGNvbnN0IHNpbXBsZU1jID0gdGhpcy5zaW1wbGVTdGFjay5pc1NpbXBsZShpbmZvKSAmJiAhIWluZm8/LmNoYW5uZWxVcmxzPy5sZW5ndGhcbiAgICAgICYmIChpbmZvPy5pbWFnZU1ldGE/LlswXT8uY2hhbm5lbENvdW50ID8/IDEpID4gMTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBzaW1wbGVNYyA/IGluZm8hLmltYWdlTWV0YSFbMF0uY2hhbm5lbENvdW50IDogKGRlc2M/LmNoYW5uZWxzID8/IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9IHNpbXBsZU1jIHx8ICghIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxKTtcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKTtcbiAgICBjb25zdCByZW5kZXJpbmc6ICdpc28nIHwgJ21pcCcgPSBpc05hcGFyaUlzb3N1cmZhY2UocGxvdFR5cGUpID8gJ2lzbycgOiAnbWlwJztcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBtdWx0aWNoYW5uZWw7XG4gICAgdGhpcy5pbWFnZU1vZGUgPSBtdWx0aWNoYW5uZWwgPyAnbXVsdGljaGFubmVsJyA6ICdncmF5c2NhbGUnO1xuICAgIGNvbnN0IHZpZXcgPSBuZXcgTXVsdGlDaGFubmVsVm9sdW1lVmlldyh2aWV3ZXIpO1xuICAgIHRoaXMudm9sdW1lVmlldyA9IHZpZXc7XG5cbiAgICAvLyBBc3NlbWJsZSBwZXItY2hhbm5lbCBzY2FsYXIgdm9sdW1lcyBmcm9tIHRoZSBzZXJ2ZXIgdGlsZXMgKGppdC1zcGVjaWZpYyk7IHRoZSBuYXBhcmktanMgdmlld1xuICAgIC8vIG93bnMgdGhlIGxheWVyIG9yY2hlc3RyYXRpb24gKG9uZSBhZGRpdGl2ZSB0aW50ZWQgdm9sdW1lIHBlciBjaGFubmVsLCBvciBhIHNpbmdsZSBncmF5c2NhbGVcbiAgICAvLyB2b2x1bWUpLiBUaGUgYWRhcHRlciBjb21wdXRlcyBlYWNoIGNoYW5uZWwncyBjb2xvcm1hcCAoaW5jbC4gaW52ZXJ0L3JldmVyc2UgZmxpcHMpLlxuICAgIGxldCBkaW1zOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdID0gW107XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB0cnkge1xuICAgICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7XG4gICAgICAgICAgY29uc3Qgdm9sID0gYXdhaXQgdGhpcy5hc3NlbWJsZVZvbHVtZShpbmZvLCByZXMsIGMpO1xuICAgICAgICAgIGlmICghdm9sKSBjb250aW51ZTtcbiAgICAgICAgICBkaW1zID0gdm9sO1xuICAgICAgICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KGMsIHZvbC5kYXRhKTtcbiAgICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgICBjb25zdCBjb2xvciA9IHN0Py5jb2xvciA/PyBkZXNjPy5jaGFubmVsSW5mbz8uW2NdPy5jb2xvciA/PyB0aW50Rm9yKGMpO1xuICAgICAgICAgIGNoYW5uZWxzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogdm9sLmRhdGEsXG4gICAgICAgICAgICB3aWR0aDogdm9sLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2b2wuaGVpZ2h0LFxuICAgICAgICAgICAgZGVwdGg6IHZvbC5kZXB0aCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmNoYW5uZWxUaW50Q29sb3JtYXAoY29sb3IpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IHRoaXMuYXNzZW1ibGVWb2x1bWUoaW5mbywgcmVzKTtcbiAgICAgICAgaWYgKHZvbCkge1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgICAgIGNoYW5uZWxzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogdm9sLmRhdGEsXG4gICAgICAgICAgICB3aWR0aDogdm9sLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2b2wuaGVpZ2h0LFxuICAgICAgICAgICAgZGVwdGg6IHZvbC5kZXB0aCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB9XG5cbiAgICBpZiAoIWRpbXMgfHwgIWNoYW5uZWxzLmxlbmd0aCB8fCB0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybjsgLy8gY2FuY2VsbGVkIOKGkiBkb24ndCByZW5kZXJcblxuICAgIC8vIFJlc29sdXRpb24taW52YXJpYW50IHdvcmxkIGJveC4gU2l6aW5nIHRoZSBib3ggYnkgdGhlIHNhbXBsZWQgdm94ZWwgY291bnRzIG1hZGUgaGlnaGVyXG4gICAgLy8gaW4tcGxhbmUgcmVzb2x1dGlvbiBncm93IFgvWSB3aGlsZSB0aGUgZGVwdGggc3RheWVkIHRoZSAoY29uc3RhbnQpIHNsaWNlIGNvdW50IOKAlCBzbyBaIGFwcGVhcmVkXG4gICAgLy8gdG8gc2hyaW5rIGF0IGhpZ2hlciByZXNvbHV0aW9uLiBJbnN0ZWFkIGFuY2hvciB0aGUgaW4tcGxhbmUgbG9uZyBzaWRlIHRvIGEgZml4ZWQgcmVmZXJlbmNlIGFuZFxuICAgIC8vIGxldCBaIHNwYW4gdGhlIGZ1bGwgc2xpY2UgY291bnQ7IHRoZSBib3ggc2hhcGUgaXMgdGhlbiBpZGVudGljYWwgYXQgZXZlcnkgZGVjaW1hdGUgZmFjdG9yLiBUaGVcbiAgICAvLyBwZXItYXhpcyBgdm94ZWxTaXplYCAobmFwYXJpIGBzY2FsZWApIG1hcHMgdGhlIHNhbXBsZWQgZ3JpZCBvbnRvIHRoYXQgZml4ZWQgd29ybGQgYm94LlxuICAgIGNvbnN0IGZ1bGxXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyBkaW1zLndpZHRoO1xuICAgIGNvbnN0IGZ1bGxIID0gdGhpcy5kZXNjcmlwdG9yPy5oZWlnaHQgPz8gZGltcy5oZWlnaHQ7XG4gICAgY29uc3QgZnVsbEQgPVxuICAgICAgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ueiB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLnVybHM/Lmxlbmd0aCB8fCBkaW1zLmRlcHRoO1xuICAgIGNvbnN0IGZ1bGxMb25nID0gTWF0aC5tYXgoMSwgZnVsbFcsIGZ1bGxIKTtcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgIHdpZHRoOiAoZnVsbFcgKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICBoZWlnaHQ6IChmdWxsSCAqIFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRikgLyBmdWxsTG9uZyxcbiAgICAgIGRlcHRoOiBmdWxsRCxcbiAgICB9O1xuICAgIC8vIEJhc2UgYm94IChaLXNjYWxlID0gMSkgKyB0aGUgc2FtcGxlZCBkZXB0aCBkcml2ZSB0aGUgbGl2ZSBaLWhlaWdodCBoYW5kbGUgYmVsb3c7IHRoZSBwZXJzaXN0ZWRcbiAgICAvLyBgdm9sdW1lWlNjYWxlYCAodXNlciBkcmFnKSBhcHBsaWVzIG9uIHRvcCBzbyBjaGFuZ2luZyByZXNvbHV0aW9uIGtlZXBzIHRoZSBjaG9zZW4gaGVpZ2h0LlxuICAgIHRoaXMudm9sdW1lV29ybGRCYXNlID0gd29ybGQ7XG4gICAgdGhpcy52b2x1bWVTYW1wbGVkRGVwdGggPSBNYXRoLm1heCgxLCBkaW1zLmRlcHRoKTtcbiAgICBjb25zdCB3b3JsZFogPSB3b3JsZC5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZveGVsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgd29ybGQud2lkdGggLyBkaW1zLndpZHRoLFxuICAgICAgd29ybGQuaGVpZ2h0IC8gZGltcy5oZWlnaHQsXG4gICAgICB3b3JsZFogLyB0aGlzLnZvbHVtZVNhbXBsZWREZXB0aCxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgY2ggb2YgY2hhbm5lbHMpIGNoLnZveGVsU2l6ZSA9IHZveGVsU2l6ZTtcblxuICAgIHZpZXcucmVuZGVyKG11bHRpY2hhbm5lbCA/ICdtdWx0aWNoYW5uZWwnIDogJ2dyYXlzY2FsZScsIGNoYW5uZWxzLCB7IHJlbmRlcmluZyB9KTtcbiAgICB0aGlzLmltYWdlVyA9IGRpbXMud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkaW1zLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSBkaW1zO1xuXG4gICAgLy8gM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKyBsYWJlbHMsIHNoYXJpbmcgdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBzbyB0aGUgZ2l6bW8gdHJhY2tzXG4gICAgLy8gdGhlIHJlbmRlcmVkIHByb3BvcnRpb25zLiBQaHlzaWNhbCBzY2FsZSB0ZXh0IHN0aWxsIGNvbWVzIGZyb20gdGhlIEZVTEwgaW1hZ2UgZXh0ZW50LlxuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIHRoaXMuYXhlc0xheWVyID0gdmlld2VyLmFkZEF4ZXMod29ybGQud2lkdGgsIHdvcmxkLmhlaWdodCwgd29ybGRaLCB7IHZpc2libGU6IHRoaXMuYXhlc1Zpc2libGUgfSk7XG4gICAgaWYgKHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5heGVzTGFiZWxzID0gbmV3IE5hcGFyaUF4ZXNMYWJlbHMoXG4gICAgICAgIHRoaXMuaG9zdCxcbiAgICAgICAgdmlld2VyLmNhbWVyYTNkLFxuICAgICAgICB0aGlzLmJ1aWxkQXhlc0xhYmVscyh7IHdpZHRoOiB3b3JsZC53aWR0aCwgaGVpZ2h0OiB3b3JsZC5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSwgbXBwWCksXG4gICAgICApO1xuICAgICAgdGhpcy5heGVzTGFiZWxzLnNldFZpc2libGUodGhpcy5heGVzVmlzaWJsZSk7XG4gICAgICAvLyBJbi12aWV3IGRyYWcgaGFuZGxlIGF0IHRoZSBUT1AgRU5EIE9GIFRIRSBaIEFYSVMgKHRoZSBib3gncyBtaW4tWFkgY29ybmVyLCB3aGVyZSB0aGUgYmx1ZVxuICAgICAgLy8gXCJaXCIgYXhpcyArIGxhYmVsIGxpdmUpLCBzbyBpdCByZWFkcyBhcyB0aGUgWi1oZWlnaHQgY29udHJvbC4gRmxvYXRlZCBhIGxpdHRsZSBwYXN0IHRoZSBheGlzXG4gICAgICAvLyB0aXAgKMOXMS4xMikgc28gdGhlIGdyaXAgY2xlYXJzIHRoZSBcIlogwrcg4oCmXCIgbGFiZWwuIERyYWcg4oaVIHRvIHJlc3RyZXRjaCBaIGxpdmUuXG4gICAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZSh0aGlzLmhvc3QsIHZpZXdlci5jYW1lcmEzZCwge1xuICAgICAgICB0b3BBbmNob3I6ICgpID0+IFtcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLndpZHRoIC8gMixcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLmhlaWdodCAvIDIsXG4gICAgICAgICAgKCh0aGlzLnZvbHVtZVdvcmxkQmFzZSEuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZSkgLyAyKSAqIDEuMTIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFNjYWxlOiAoKSA9PiB0aGlzLnZvbHVtZVpTY2FsZSxcbiAgICAgICAgc2V0U2NhbGU6IChzKSA9PiB0aGlzLnNldFZvbHVtZVpTY2FsZShzKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZVZvbHVtZURpc3BsYXlTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyZXRjaCB0aGUgdm9sdW1lJ3MgWiBoZWlnaHQgbGl2ZSAoZHJpdmVuIGJ5IHRoZSBpbi12aWV3IHtAbGluayBOYXBhcmlWb2x1bWVaSGFuZGxlfSkuIE9ubHlcbiAgICogdGhlIHBlci1heGlzIGB2b3hlbFNpemVgIC8gYXhlcyBkZXB0aCBjaGFuZ2Ug4oCUIHRoZSB2b3hlbCB0ZXh0dXJlcyBhcmUgdW50b3VjaGVkIOKAlCBzbyBkcmFnZ2luZyBpc1xuICAgKiBzbW9vdGguIGBmYWN0b3JgIGlzIHJlbGF0aXZlIHRvIHRoZSB2b2x1bWUncyBuYXR1cmFsIHByb3BvcnRpb25zICgxKS4gUGVyc2lzdHMgYWNyb3NzIHJlLW1vdW50c1xuICAgKiAocmVzb2x1dGlvbiBjaGFuZ2VzKSBzbyB0aGUgY2hvc2VuIGhlaWdodCBzdGlja3MuXG4gICAqL1xuICBwcml2YXRlIHNldFZvbHVtZVpTY2FsZShmYWN0b3I6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudm9sdW1lWlNjYWxlID0gTWF0aC5taW4oMTAsIE1hdGgubWF4KDAuMSwgZmFjdG9yKSk7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMudm9sdW1lV29ybGRCYXNlO1xuICAgIGlmICghYmFzZSB8fCAhdGhpcy52b2x1bWVWaWV3KSByZXR1cm47XG4gICAgY29uc3Qgd29ybGRaID0gYmFzZS5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZzWiA9IHdvcmxkWiAvIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3LmxheWVycykge1xuICAgICAgY29uc3QgW3N4LCBzeV0gPSBsYXllci52b3hlbFNpemU7XG4gICAgICBsYXllci52b3hlbFNpemUgPSBbc3gsIHN5LCB2c1pdO1xuICAgIH1cbiAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHRoaXMuYXhlc0xheWVyLmRlcHRoID0gd29ybGRaO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIHRoaXMuYXhlc0xhYmVscz8udXBkYXRlQW5jaG9ycyhcbiAgICAgIHRoaXMuYnVpbGRBeGVzTGFiZWxzKHsgd2lkdGg6IGJhc2Uud2lkdGgsIGhlaWdodDogYmFzZS5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSwgbXBwWCksXG4gICAgKTtcbiAgICB0aGlzLnpIYW5kbGU/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBYL1kvWiBheGlzLWVuZCBsYWJlbCBzcGVjcyBmb3IgdGhlIDNEIGdpem1vLiBBbmNob3JzIGFyZSBpbiB0aGUgdm9sdW1lJ3MgY2VudHJlZFxuICAgKiAgd29ybGQgYm94IChtYXRjaGluZyB0aGUgQXhlc0xheWVyIGdlb21ldHJ5KTsgdGhlIHNjYWxlIHRleHQgcmVmbGVjdHMgdGhlIEZVTEwgaW1hZ2UgZXh0ZW50IOKAlFxuICAgKiAgcGh5c2ljYWwgwrVtIHdoZW4gwrVtL3BpeGVsIGlzIGtub3duLCBlbHNlIHBpeGVsIChYL1kpIC8gc2xpY2UgKFopIGNvdW50cy4gKi9cbiAgcHJpdmF0ZSBidWlsZEF4ZXNMYWJlbHMoXG4gICAgdm9sOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0sXG4gICAgbXBwWDogbnVtYmVyLFxuICApOiBBeGlzTGFiZWxTcGVjW10ge1xuICAgIGNvbnN0IGh4ID0gdm9sLndpZHRoIC8gMjtcbiAgICBjb25zdCBoeSA9IHZvbC5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IGh6ID0gdm9sLmRlcHRoIC8gMjtcbiAgICBjb25zdCBkZXNjVyA9IHRoaXMuZGVzY3JpcHRvcj8ud2lkdGggPz8gdm9sLndpZHRoO1xuICAgIGNvbnN0IGRlc2NIID0gdGhpcy5kZXNjcmlwdG9yPy5oZWlnaHQgPz8gdm9sLmhlaWdodDtcbiAgICBjb25zdCBzbGljZXMgPVxuICAgICAgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ueiB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLnVybHM/Lmxlbmd0aCB8fCB2b2wuZGVwdGg7XG4gICAgY29uc3QgbGVuID0gKHB4OiBudW1iZXIpOiBzdHJpbmcgPT4gKG1wcFggPiAwID8gZm9ybWF0VW0ocHggKiBtcHBYKSA6IGAke3B4fSBweGApO1xuICAgIHJldHVybiBbXG4gICAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKGRlc2NXKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKGRlc2NIKX1gLCBjb2xvcjogJyM0ZGQ5NTknIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6IGBaIMK3ICR7c2xpY2VzfSBweGAsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGEgZG93bnNhbXBsZWQgdWludDggdm9sdW1lIChsdW1pbmFuY2UpIGZyb20gdGhlIHBlci1zbGljZSB0aWxlIGVuZHBvaW50LiBTbGljZXMgYXJlXG4gICAqIGZldGNoZWQgd2l0aCBib3VuZGVkIGNvbmN1cnJlbmN5IChrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGZ1bGwgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXBcbiAgICogc3RhY2spIGFuZCByZWFkIGludG8gdGhlIHZvbHVtZSBhcyBlYWNoIGFycml2ZXMsIGRyaXZpbmcge0BsaW5rIHN0YWNrTG9hZGluZ1Byb2dyZXNzJH0gc28gdGhlXG4gICAqIGhvc3Qgc2hvd3MgYSBkZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIgaW5zdGVhZCBvZiBhIGJhcmUgc3Bpbm5lci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZW1ibGVWb2x1bWUoXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiB7IG1heFNsaWNlPzogbnVtYmVyOyBzbGljZVN0ZXA/OiBudW1iZXIgfSA9IHt9LFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzIHdoaWxlIHdlIGZldGNoXG4gICAgY29uc3QgZnVsbERlcHRoID0gaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LnogfHwgaW5mbz8udXJscz8ubGVuZ3RoIHx8IDE7XG4gICAgaWYgKGZ1bGxEZXB0aCA8IDEpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbm8gc2xpY2VzIHRvIGFzc2VtYmxlIGEgdm9sdW1lJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iob3B0cy5zbGljZVN0ZXAgPz8gMSkpO1xuICAgIGNvbnN0IG1heFNsaWNlID0gb3B0cy5tYXhTbGljZSA/PyBWT0xVTUVfTUFYX1NMSUNFO1xuICAgIC8vIFNvdXJjZS1zbGljZSBpbmRpY2VzIHNhbXBsZWQgaW50byB0aGUgdm9sdW1lIChldmVyeSBgc3RlcGB0aCBwbGFuZSDihpIgbG93LXJlcyBpcyBmYXN0ZXIpLlxuICAgIGNvbnN0IHpJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IHogPSAwOyB6IDwgZnVsbERlcHRoOyB6ICs9IHN0ZXApIHpJbmRpY2VzLnB1c2goeik7XG4gICAgY29uc3QgZGVwdGggPSB6SW5kaWNlcy5sZW5ndGg7XG5cbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBlYWNoIHNsaWNlIGF0IGEgcHlyYW1pZCBsZXZlbCBtYXRjaGluZyBgbWF4U2xpY2VgIChidWRnZXQgc2NhbGVzIHdpdGggdGhlIGRlY2ltYXRlXG4gICAgICAvLyBmYWN0b3IpLCBzbyBhIGhpZ2hlciBmYWN0b3IgcHVsbHMgYSBmaW5lciBsZXZlbCDihpIgbW9yZSByZWFsIGluLXBsYW5lIGRldGFpbDsgdGhlbiBkb3duc2FtcGxlXG4gICAgICAvLyB0byBgbWF4U2xpY2VgLiBgY2hhbm5lbGAgc2VsZWN0cyBhIGJhbmQgKG11bHRpY2hhbm5lbCB2b2x1bWUpOyBvbWl0IGZvciB0aGUgZ3JheXNjYWxlXG4gICAgICAvLyBjb21wb3NpdGUuIFRoZSBjYWxsZXIgb3ducyB0aGUgc3RhY2tMb2FkaW5nIGZsYWcgKG11bHRpY2hhbm5lbCBhc3NlbWJsZXMgY2hhbm5lbHMgaW4gdHVybikuXG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4U2xpY2UpO1xuICAgICAgY29uc3QgZmlyc3QgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2UoekluZGljZXNbMF0sIGNoYW5uZWwsIGJ1ZGdldCk7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIG1heFNsaWNlIC8gTWF0aC5tYXgoZmlyc3Qud2lkdGgsIGZpcnN0LmhlaWdodCwgMSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGZpcnN0LndpZHRoICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZmlyc3QuaGVpZ2h0ICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIGRlcHRoKTtcblxuICAgICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ25hcGFyaS1qcyB2b2x1bWUgYXNzZW1ibHk6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcblxuICAgICAgLy8gUmVhZCBvbmUgZmV0Y2hlZCBzbGljZSBiaXRtYXAgaW50byB0aGUgdm9sdW1lIHBsYW5lIGB6YCAobHVtaW5hbmNlKS4gU3luY2hyb25vdXMgYmV0d2VlblxuICAgICAgLy8gYXdhaXRzLCBzbyB0aGUgc2hhcmVkIDJEIGNvbnRleHQgaXMgc2FmZSB0byByZXVzZSBhY3Jvc3MgdGhlIGNvbmN1cnJlbnQgZmV0Y2ggd29ya2Vycy5cbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHJlYWRTbGljZSA9ICh6OiBudW1iZXIsIGJtcDogSW1hZ2VCaXRtYXApOiB2b2lkID0+IHtcbiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShibXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb25zdCByZ2JhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICAgICAgICBjb25zdCBiYXNlID0geiAqIHdpZHRoICogaGVpZ2h0O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoICogaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICBkYXRhW2Jhc2UgKyBpXSA9XG4gICAgICAgICAgICAocmdiYVtpICogNF0gKiAwLjI5OSArIHJnYmFbaSAqIDQgKyAxXSAqIDAuNTg3ICsgcmdiYVtpICogNCArIDJdICogMC4xMTQpIHwgMDtcbiAgICAgICAgfVxuICAgICAgICBibXAuY2xvc2U/LigpO1xuICAgICAgICBkb25lKys7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoTWF0aC5yb3VuZCgoZG9uZSAvIGRlcHRoKSAqIDEwMCkpO1xuICAgICAgfTtcblxuICAgICAgcmVhZFNsaWNlKDAsIGZpcnN0KTtcblxuICAgICAgLy8gUmVtYWluaW5nIHBsYW5lcyB2aWEgYSBzbWFsbCBwb29sIG9mIHdvcmtlcnMgZHJhaW5pbmcgYSBzaGFyZWQgcXVldWUuIEVhY2ggcGxhbmUgYHBgXG4gICAgICAvLyBtYXBzIHRvIHNvdXJjZSBzbGljZSBgekluZGljZXNbcF1gIChzdWJzYW1wbGVkIGZvciBsb3ctcmVzKS5cbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCBwID0gMTsgcCA8IGRlcHRoOyBwKyspIHBlbmRpbmcucHVzaChwKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHAgPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybjtcbiAgICAgICAgICByZWFkU2xpY2UocCwgYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHpJbmRpY2VzW3BdLCBjaGFubmVsLCBidWRnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvb2xTaXplID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCAtIDEpKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oeyBsZW5ndGg6IHBvb2xTaXplIH0sICgpID0+IHdvcmtlcigpKSk7XG5cbiAgICAgIGlmICh0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybiBudWxsOyAvLyBjYW5jZWxsZWQg4oaSIGRvbid0IHJlbmRlciBhIHBhcnRpYWwgdm9sdW1lXG4gICAgICByZXR1cm4geyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NDQVRURVIgMkQgc2NhdHRlcjogdGhlIHNsaWNlIGltYWdlIHdpdGggYSBwb2ludHMgbGF5ZXIgYXQgZWFjaCByZWdpb24nc1xuICAgKiBjZW50cm9pZCAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyByZWdpb24tY2VudHJvaWQgc2NhdHRlcikuIFJlYnVpbGRzIHRoZSBwb2ludHMgbGl2ZSBhc1xuICAgKiByZWdpb25zIGNoYW5nZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTY2F0dGVyKHZpZXdlcjogVmlld2VyLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlKHopO1xuICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgIHRoaXMuc3Vic2NyaWJlRGlzcGxheVN0YXRlKCk7XG4gICAgdGhpcy5pbnN0YWxsU2NhbGVCYXIoKTtcbiAgICB0aGlzLnJlYnVpbGRTY2F0dGVyUG9pbnRzKCk7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViID0gdGhpcy5yZWdpb25TdG9yZVxuICAgICAgLmdldFJlZ2lvblVwZGF0ZUV2ZW50KClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWJ1aWxkU2NhdHRlclBvaW50cygpKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDJEIHNjYXR0ZXIncyBwb2ludCBsYXllciBhdCB0aGUgY3VycmVudCByZWdpb24gY2VudHJvaWRzLiAqL1xuICBwcml2YXRlIHJlYnVpbGRTY2F0dGVyUG9pbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBpZiAodGhpcy5zY2F0dGVyMmRQb2ludHMpIHtcbiAgICAgIHYubGF5ZXJzLnJlbW92ZSh0aGlzLnNjYXR0ZXIyZFBvaW50cyk7XG4gICAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRoaXMucmVnaW9uQ2VudHJvaWRzKCk7XG4gICAgaWYgKGNlbnRyb2lkcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IHYuYWRkUG9pbnRzKGNlbnRyb2lkcywge1xuICAgICAgc2l6ZTogMTIsXG4gICAgICBmYWNlQ29sb3I6IFsxLCAwLjg1LCAwLjIsIDFdLFxuICAgICAgYm9yZGVyQ29sb3I6IFswLCAwLCAwLCAxXSxcbiAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lvbiBjZW50cm9pZHMgYXMgZmxhdCBgW3gsIHksIOKApl1gIGRhdGEgY29vcmRzIChyZWN0YW5nbGUgLyBwb2x5Z29uIC8gbXVsdGlwb2x5Z29uKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25DZW50cm9pZHMoKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBvdXQ6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgcG9seUNlbnRyb2lkID0gKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBuID0geHMubGVuZ3RoO1xuICAgICAgaWYgKG4gPT09IDApIHJldHVybjtcbiAgICAgIGxldCBjeCA9IDA7XG4gICAgICBsZXQgY3kgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY3ggKz0geHNbaV07XG4gICAgICAgIGN5ICs9IHlzW2ldO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goY3ggLyBuLCBjeSAvIG4pO1xuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKSB7XG4gICAgICBjb25zdCBiID0gci5ib3VuZHMgYXNcbiAgICAgICAgfCB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9XG4gICAgICAgIHwgeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW10gfVxuICAgICAgICB8IHsgcG9seWdvbnM6IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdIH1bXSB9XG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYikgY29udGludWU7XG4gICAgICBpZiAoJ3dpZHRoJyBpbiBiICYmICd4JyBpbiBiKSB7XG4gICAgICAgIG91dC5wdXNoKGIueCArIGIud2lkdGggLyAyLCBiLnkgKyBiLmhlaWdodCAvIDIpO1xuICAgICAgfSBlbHNlIGlmICgneHBvaW50cycgaW4gYikge1xuICAgICAgICBwb2x5Q2VudHJvaWQoYi54cG9pbnRzLCBiLnlwb2ludHMpO1xuICAgICAgfSBlbHNlIGlmICgncG9seWdvbnMnIGluIGIpIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGIucG9seWdvbnMpIHBvbHlDZW50cm9pZChwLnhwb2ludHMsIHAueXBvaW50cyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KG91dCk7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIE5BUEFSSV9TQ0FUVEVSM0QgM0Qgc2NhdHRlcjogdGhlIGRvd25zYW1wbGVkIHZveGVsIGdyaWQgYXMgYSAzRCBwb2ludCBjbG91ZCBjb2xvcmVkXG4gICAqIGJ5IGludGVuc2l0eSAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyB2b3hlbCBzY2F0dGVyM2QpLiBBc3NlbWJsZXMgYSBjb2Fyc2Ugdm9sdW1lLCB0aGVuXG4gICAqIGVtaXRzIGEgZmxhdC1zdHJpZGVkIHNhbXBsZSBvZiB2b3hlbHMgKGNhcHBlZCBhdCB7QGxpbmsgU0NBVFRFUjNEX01BWF9QT0lOVFN9KSB2aWEgYGFkZFBvaW50czNEYC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTY2F0dGVyM2Qodmlld2VyOiBWaWV3ZXIsIGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmltYWdlTW9kZSA9ICdncmF5c2NhbGUnO1xuICAgIHRoaXMudm9sdW1lTXVsdGljaGFubmVsID0gZmFsc2U7XG4gICAgY29uc3QgcmVzID0gdm9sdW1lUmVzb2x1dGlvbkZvcih0aGlzLnJlc29sdXRpb25TY2FsZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICBsZXQgdm9sOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdm9sID0gYXdhaXQgdGhpcy5hc3NlbWJsZVZvbHVtZShpbmZvLCB7XG4gICAgICAgIG1heFNsaWNlOiBNYXRoLm1pbihyZXMubWF4U2xpY2UsIFNDQVRURVIzRF9NQVhfWFkpLFxuICAgICAgICBzbGljZVN0ZXA6IHJlcy5zbGljZVN0ZXAsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB9XG4gICAgaWYgKCF2b2wgfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9ID0gdm9sO1xuICAgIGNvbnN0IHpTY2FsZSA9IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpIC8gTWF0aC5tYXgoMSwgZGVwdGgpOyAvLyDiiYggY3ViaWMgYXNwZWN0XG4gICAgY29uc3QgdG90YWwgPSB3aWR0aCAqIGhlaWdodCAqIGRlcHRoO1xuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0b3RhbCAvIFNDQVRURVIzRF9NQVhfUE9JTlRTKSk7XG4gICAgY29uc3QgcG9zOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHZhbDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsOyBpICs9IHN0cmlkZSkge1xuICAgICAgY29uc3QgeCA9IGkgJSB3aWR0aDtcbiAgICAgIGNvbnN0IHkgPSBNYXRoLmZsb29yKGkgLyB3aWR0aCkgJSBoZWlnaHQ7XG4gICAgICBjb25zdCB6aSA9IE1hdGguZmxvb3IoaSAvICh3aWR0aCAqIGhlaWdodCkpO1xuICAgICAgcG9zLnB1c2goeCwgeSwgemkgKiB6U2NhbGUpO1xuICAgICAgdmFsLnB1c2goZGF0YVtpXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3QgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKClbMF07XG4gICAgdGhpcy5zY2F0dGVyM2RMYXllciA9IHZpZXdlci5hZGRQb2ludHMzRChuZXcgRmxvYXQzMkFycmF5KHBvcyksIG5ldyBGbG9hdDMyQXJyYXkodmFsKSwge1xuICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgIHNpemU6IDMsXG4gICAgfSk7XG4gICAgdGhpcy5pbWFnZVcgPSB3aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IGhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoIH07XG4gICAgLy8gRmVlZCB0aGUgaW50ZW5zaXR5IGhpc3RvZ3JhbSBmcm9tIHRoZSBhc3NlbWJsZWQgdm9sdW1lIChrZXkgMCkuXG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KDAsIGRhdGEpO1xuICAgIHRoaXMuc3Vic2NyaWJlU2NhdHRlcjNkRGlzcGxheVN0YXRlKCk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogU3RvcmUgY29sb3JtYXAgLyByZXZlcnNlIC8gaW52ZXJ0IC8gY2hhbm5lbCB3aW5kb3cg4oaSIHRoZSAzRCBzY2F0dGVyJ3MgY29sb3JtYXAgKyBjb250cmFzdC4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVTY2F0dGVyM2REaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0LCBjaGFubmVsc10pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnNjYXR0ZXIzZExheWVyO1xuICAgICAgaWYgKCFsYXllcikgcmV0dXJuO1xuICAgICAgY29uc3Qgc3QgPSBjaGFubmVsc1swXTtcbiAgICAgIGxheWVyLmNvbG9ybWFwID0gdGhpcy52b2x1bWVDb2xvcm1hcChzdCk7XG4gICAgICBpZiAoc3QpIGxheWVyLmNvbnRyYXN0TGltaXRzID0gW3N0Lm1pbiwgc3QubWF4XTtcbiAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIE5BUEFSSV9TVVJGQUNFIGhlaWdodC1maWVsZCBzdXJmYWNlLiBBIGhlaWdodCBmaWVsZCBpcyBzaW5nbGUtc2NhbGFyLCBzbyBmb3IgYVxuICAgKiBtdWx0aWNoYW5uZWwgaW1hZ2UgdGhlIHN1cmZhY2UgZm9sbG93cyBPTkUgYmFuZCDigJQgdGhlIGZpcnN0IHZpc2libGUgY2hhbm5lbCAoZmFsbGJhY2sgMCkg4oCUXG4gICAqIGNvbG91cmVkIGJ5IHRoYXQgY2hhbm5lbCdzIHdpbmRvdy9jb2xvcm1hcCAobGlrZSB0aGUgUGxvdGx5IFNVUkZBQ0UsIHdoaWNoIGlzIGdyYXlzY2FsZS1vbmx5KS5cbiAgICogUHJlLWxvYWRzIGV2ZXJ5IHNsaWNlJ3MgaGVpZ2h0IGRhdGEgd2l0aCBhIHByb2dyZXNzIGJhciAoYXMgdGhlIHZvbHVtZSBkb2VzKSBzbyB0aGUgc3RhY2tcbiAgICogc2xpZGVyIHJlLXNsaWNlcyBpbnN0YW50bHksIHRoZW4gYnVpbGRzIHRoZSBtZXNoIGZvciB0aGUgY3VycmVudCBzbGljZS4gQWxsIG1lc2ggKyBHUFUgd29ya1xuICAgKiBsaXZlcyBpbiBuYXBhcmktanMgKGBoZWlnaHRGaWVsZGAgKyBgVmlld2VyLmFkZFN1cmZhY2VgKTsgdGhpcyBiYWNrZW5kIHN1cHBsaWVzIHNjYWxhciBzbGljZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U3VyZmFjZSh2aWV3ZXI6IFZpZXdlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSAhIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiAoZGVzYz8uY2hhbm5lbHMgPz8gMSkgPiAxO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gbXVsdGljaGFubmVsID8gc3RhdGVzLmZpbmQoKHMpID0+IHMudmlzaWJsZSk/LmluZGV4ID8/IDAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdXJmYWNlTWF4R3JpZCA9IHN1cmZhY2VSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKS5tYXhHcmlkO1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICBhd2FpdCB0aGlzLnByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcik7XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkU3VyZmFjZSh2aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApO1xuICAgIHRoaXMuaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcik7XG4gICAgLy8gU3Vic2NyaWJlIGFmdGVyIHRoZSBmaXJzdCBidWlsZCBzbyBkaXNwbGF5LXN0YXRlIGVkaXRzIHRhcmdldCBhIGxpdmUgbGF5ZXIuXG4gICAgdGhpcy5zdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk7XG4gIH1cblxuICAvKiogQWRkIHRoZSAzRCBheGVzIGdpem1vICsgRE9NIGxhYmVscyBhcm91bmQgdGhlIChvcmlnaW4tY2VudGVyZWQpIHN1cmZhY2UgbWVzaCwgbWF0Y2hpbmcgdGhlXG4gICAqICB2b2x1bWUvaXNvc3VyZmFjZS4gSW5zdGFsbGVkIG9uY2UgcGVyIG1vdW50OyB0aGUgYm94IHRyYWNrcyB0aGUgbWVzaCBib3VuZHMsIFgvWSBzaG93IHRoZVxuICAgKiAgcGh5c2ljYWwgKG9yIHBpeGVsKSBleHRlbnQsIGFuZCBaIGlzIHRoZSBpbnRlbnNpdHkvaGVpZ2h0IGF4aXMuICovXG4gIHByaXZhdGUgaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN1cmZhY2VMYXllcikgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSB0aGlzLnN1cmZhY2VMYXllci5ib3VuZHMoKTtcbiAgICBjb25zdCBib3hXID0gTWF0aC5tYXgoMSwgYi5tYXhbMF0gLSBiLm1pblswXSk7XG4gICAgY29uc3QgYm94SCA9IE1hdGgubWF4KDEsIGIubWF4WzFdIC0gYi5taW5bMV0pO1xuICAgIGNvbnN0IGJveEQgPSBNYXRoLm1heCgxLCBiLm1heFsyXSAtIGIubWluWzJdKTtcbiAgICBjb25zdCBtcHBYID0gdGhpcy5kZXNjcmlwdG9yPy5tcHBYIHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF0/Lm1wcFggfHwgMDtcbiAgICBjb25zdCB2b3hlbCA9IG1wcFggPiAwID8gKG1wcFggKiAodGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVykpIC8gTWF0aC5tYXgoMSwgdGhpcy5pbWFnZVcpIDogMTtcbiAgICB0aGlzLmF4ZXNMYXllciA9IHZpZXdlci5hZGRBeGVzKGJveFcsIGJveEgsIGJveEQsIHtcbiAgICAgIHZveGVsU2l6ZTogW3ZveGVsLCB2b3hlbCwgMV0sXG4gICAgICB2aXNpYmxlOiB0aGlzLmF4ZXNWaXNpYmxlLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMuYXhlc0xhYmVscyA9IG5ldyBOYXBhcmlBeGVzTGFiZWxzKFxuICAgICAgICB0aGlzLmhvc3QsXG4gICAgICAgIHZpZXdlci5jYW1lcmEzZCxcbiAgICAgICAgdGhpcy5idWlsZFN1cmZhY2VBeGVzTGFiZWxzKGJveFcsIGJveEgsIGJveEQsIG1wcFgpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXhlc0xhYmVscy5zZXRWaXNpYmxlKHRoaXMuYXhlc1Zpc2libGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBYL1kvWiBlbmQtbGFiZWxzIGZvciB0aGUgc3VyZmFjZSBnaXptbzogWC9ZIGFyZSB0aGUgcGh5c2ljYWwgKMK1bSkgb3IgcGl4ZWwgZXh0ZW50IG9mIHRoZSBGVUxMXG4gICAqICBpbWFnZTsgWiBpcyB0aGUgaW50ZW5zaXR5L2hlaWdodCBheGlzLiBBbmNob3JzIGFyZSBpbiB0aGUgY2VudGVyZWQgYm94IChtYXRjaGluZyBBeGVzTGF5ZXIpLiAqL1xuICBwcml2YXRlIGJ1aWxkU3VyZmFjZUF4ZXNMYWJlbHMoXG4gICAgYm94VzogbnVtYmVyLFxuICAgIGJveEg6IG51bWJlcixcbiAgICBib3hEOiBudW1iZXIsXG4gICAgbXBwWDogbnVtYmVyLFxuICApOiBBeGlzTGFiZWxTcGVjW10ge1xuICAgIGNvbnN0IGh4ID0gYm94VyAvIDI7XG4gICAgY29uc3QgaHkgPSBib3hIIC8gMjtcbiAgICBjb25zdCBoeiA9IGJveEQgLyAyO1xuICAgIGNvbnN0IGRlc2NXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVztcbiAgICBjb25zdCBkZXNjSCA9IHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IHRoaXMuaW1hZ2VIO1xuICAgIGNvbnN0IGxlbiA9IChweDogbnVtYmVyKTogc3RyaW5nID0+IChtcHBYID4gMCA/IGZvcm1hdFVtKHB4ICogbXBwWCkgOiBgJHtweH0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihkZXNjVyl9YCwgY29sb3I6ICcjZWQ0NTQ1JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIGh5LCAtaHpdLCB0ZXh0OiBgWSDCtyAke2xlbihkZXNjSCl9YCwgY29sb3I6ICcjNGRkOTU5JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIC1oeSwgaHpdLCB0ZXh0OiAnWiDCtyBpbnRlbnNpdHknLCBjb2xvcjogJyM2NjhjZmYnIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtZmV0Y2ggZXZlcnkgc3RhY2sgc2xpY2UncyBsdW1pbmFuY2UgcGxhbmUgKGRlY2ltYXRlZCB0byB0aGUgc3VyZmFjZSBncmlkKSBpbnRvXG4gICAqIHtAbGluayBzdXJmYWNlUGxhbmVzfSwgZHJpdmluZyB7QGxpbmsgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkfSDigJQgdGhlIHNhbWUgbG9hZC13aXRoLXByb2dyZXNzIFVYXG4gICAqIGFzIHRoZSB2b2x1bWUsIGJ1dCBrZWVwaW5nIG9uZSAyRCBwbGFuZSBwZXIgc2xpY2UgcmF0aGVyIHRoYW4gcGFja2luZyBhIDNEIHZvbHVtZS4gQm91bmRlZFxuICAgKiBjb25jdXJyZW5jeSBrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGJ1c3kgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXAgc3RhY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcjogVmlld2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmxvYWRUb2tlbjsgLy8gYmFpbCBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXMgd2hpbGUgd2UgZmV0Y2hcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXB0aCA9IGluZm8/LmltYWdlTWV0YT8uWzBdPy56IHx8IGluZm8/LnVybHM/Lmxlbmd0aCB8fCAxO1xuICAgIGNvbnN0IHsgbWF4R3JpZCB9ID0gc3VyZmFjZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCB6ID0gMDsgeiA8IGRlcHRoOyB6KyspIHBlbmRpbmcucHVzaCh6KTtcbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHogPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHogPT09IHVuZGVmaW5lZCB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN1cmZhY2VQbGFuZXMuc2V0KHosIGF3YWl0IHRoaXMuZmV0Y2hTdXJmYWNlUGxhbmUoeiwgbWF4R3JpZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBzdXJmYWNlIHNsaWNlICR7en0gcHJlbG9hZCBmYWlsZWRgLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb25lKys7XG4gICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChkb25lIC8gZGVwdGgpICogMTAwKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBwb29sID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCkpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogcG9vbCB9LCAoKSA9PiB3b3JrZXIoKSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBzbGljZSBgemAgYXMgYSBzaW5nbGUgV0hPTEUtaW1hZ2UgbHVtaW5hbmNlIHBsYW5lIChkZWNpbWF0ZWQgdG8gYG1heEdyaWRgKS4gUHJlZmVycyB0aGVcbiAgICogYXBwJ3MgY29tcGxldGUgcGVyLXNsaWNlIGltYWdlIChgc21hbGxVcmxzYC9gdXJsc2AsIGV4YWN0bHkgbGlrZSB0aGUgUGxvdGx5IHN1cmZhY2UpIHNvIHRoZVxuICAgKiBzdXJmYWNlIGFsd2F5cyBjb3ZlcnMgdGhlIEZVTEwgc2xpY2Ug4oCUIHRoZSB0aWxlLXB5cmFtaWQgYGZldGNoU2xpY2VgIHBhdGggd291bGQgZmFsbCBiYWNrIHRvIGFcbiAgICogc2luZ2xlIHRvcC1sZWZ0IHRpbGUgKGEgY29ybmVyKSBmb3Igc2VsZi1jb250YWluZWQgLyBub24tYC90aWxlcy9pbmZvYCBpbWFnZXMuIEZhbGxzIGJhY2sgdG9cbiAgICogc3RpdGNoaW5nIHRoZSB0aWxlIGdyaWQgb25seSB3aGVuIG5vIGNvbXBsZXRlLWltYWdlIFVSTCBpcyBhdmFpbGFibGUuXG4gICAqL1xuICAvKiogVGlsZSBidWRnZXQgdG8gc3RpdGNoIGEgd2hvbGUgc2xpY2UgYXQgfmB0YXJnZXRQeGAgcmVzb2x1dGlvbiBmcm9tIHRoZSBweXJhbWlkOiBhIGhpZ2hlciB0YXJnZXRcbiAgICogIHB1bGxzIGEgRklORVIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCBhbmQgdGhlIHZvbHVtZVxuICAgKiAgYXNzZW1ibHkgc28gYm90aCBzY2FsZSB0aGVpciBpbi1wbGFuZSByZXNvbHV0aW9uIHdpdGggdGhlIGRlY2ltYXRlIGZhY3Rvci4gKi9cbiAgcHJpdmF0ZSB0aWxlQnVkZ2V0Rm9yKHRhcmdldFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5kZXNjcmlwdG9yPy50aWxlU2l6ZSB8fCBUSUxFX1NJWkU7XG4gICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgTUFYX1NUSVRDSF9USUxFUyxcbiAgICAgIE1hdGgubWF4KDEsIE1hdGgucm91bmQoKHRhcmdldFB4IC8gdGlsZVNpemUpICoqIDIgKiBTVElUQ0hfQlVER0VUX0NPRUZGKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdXJmYWNlUGxhbmUoXG4gICAgejogbnVtYmVyLFxuICAgIG1heEdyaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgbGV0IHBsYW5lOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFByZWZlcnJlZDogc3RpdGNoIHRoZSBXSE9MRSBzbGljZSBmcm9tIHRoZSBzZXJ2ZXIgcHlyYW1pZCBhdCBhIHJlc29sdXRpb24gZHJpdmVuIGJ5IHRoZVxuICAgIC8vIGRlY2ltYXRlIGZhY3RvciDigJQgYSBoaWdoZXIgdGFyZ2V0IGdyaWQgcHVsbHMgYSBGSU5FUiBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gV2l0aCBhXG4gICAgLy8gZGVzY3JpcHRvciwgZmV0Y2hTbGljZSBzdGl0Y2hlcyB0aGUgd2hvbGUgY2hvc2VuIGxldmVsIChuZXZlciBhIGNvcm5lciksIHRoZW4gd2UgZG93bnNjYWxlIHRvXG4gICAgLy8gdGhlIGdyaWQuIFRoaXMgaXMgd2hhdCBtYWtlcyBcIkZ1bGxcIiBhY3R1YWxseSBoaWdoZXItcmVzIHRoYW4gXCLCvVwiLCBub3QganVzdCBhIGZpeGVkIHByZXZpZXcuXG4gICAgaWYgKGRlc2M/LmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4R3JpZCk7XG4gICAgICAvLyBUaGUgc3VyZmFjZSBpcyBhIHNpbmdsZSBkZWNpbWF0ZWQgcGxhbmUsIHNvIHRoZSBjb21wb3NpdGUgZmFsbGJhY2sgaXMgYWNjZXB0YWJsZSB3aGVuIHRoZVxuICAgICAgLy8gY2hhbm5lbCBoYXMgbm8gc21hbGwgcHlyYW1pZCBsZXZlbCAoa2VlcHMgaXQgZmFzdCk7IGEgbXVsdGljaGFubmVsIFZPTFVNRSBtdXN0IG5vdCBkbyB0aGlzLlxuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgYnVkZ2V0LCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgKG5vIHB5cmFtaWQpOiB0aGUgYXBwJ3MgQ09NUExFVEUgcGVyLXNsaWNlIGltYWdlICh1cmxzW3pdLCBub3QgdGhlIHNtYWxsIGJsdXJyeVxuICAgIC8vIHRodW1ibmFpbCkg4oCUIHdob2xlIHNsaWNlLCBhdm9pZHMgYSBjb3JuZXIgdGlsZS4gQ2FwcGVkIGF0IHRoZSBpbWFnZSdzIG93biByZXNvbHV0aW9uLlxuICAgIGlmICghcGxhbmUpIHtcbiAgICAgIGNvbnN0IHVybCA9IGluZm8/LnVybHM/Llt6XSA/PyBpbmZvPy5zbWFsbFVybHM/Llt6XTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgICBpZiAocmVzcC5vaykge1xuICAgICAgICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKSwgbWF4R3JpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIHN1cmZhY2UgdXJsIGZldGNoIGZhaWxlZCBmb3Igej0ke3p9YCwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExhc3QgcmVzb3J0IChubyBweXJhbWlkIGFuZCBubyBjb21wbGV0ZSBpbWFnZSk6IGEgc2luZ2xlIHRpbGUuXG4gICAgaWYgKCFwbGFuZSkge1xuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgdGhpcy50aWxlQnVkZ2V0Rm9yKG1heEdyaWQpLCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwbGFuZTtcbiAgfVxuXG4gIC8qKiBUaGUgY2hhbm5lbCBzdGF0ZSBkcml2aW5nIHRoZSBzdXJmYWNlOiB0aGUgY2hvc2VuIGJhbmQgZm9yIG11bHRpY2hhbm5lbCAobWF0Y2hlZCBieSBpbmRleCksXG4gICAqICBlbHNlIHRoZSBzaW5nbGUgZ3JheXNjYWxlIGNoYW5uZWwuICovXG4gIHByaXZhdGUgc3VyZmFjZVN0YXRlKGNoYW5uZWxzOiBJQ2hhbm5lbFN0YXRlW10pOiBJQ2hhbm5lbFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5zdXJmYWNlQ2hhbm5lbCA9PSBudWxsKSByZXR1cm4gY2hhbm5lbHNbMF07XG4gICAgcmV0dXJuIGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IHRoaXMuc3VyZmFjZUNoYW5uZWwpID8/IGNoYW5uZWxzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIChSZSlidWlsZCB0aGUgc3VyZmFjZSBtZXNoIGZvciBzbGljZSBgemAgZnJvbSB0aGUgcHJlLWxvYWRlZCBwbGFuZSBjYWNoZSAoaW5zdGFudCDigJQgdGhpcyBpc1xuICAgKiB3aGF0IHRoZSBzdGFjayBzbGlkZXIgY2FsbHMpOyBhIHNsaWNlIG1pc3NpbmcgZnJvbSB0aGUgY2FjaGUgaXMgZmV0Y2hlZCBvbiBkZW1hbmQuIG5hcGFyaS1qcydzXG4gICAqIHB1cmUgYGhlaWdodEZpZWxkYCBidWlsZHMgdGhlIHRyaWFuZ2xlIGdyaWQgKHogPSBub3JtYWxpemVkIGludGVuc2l0eSksIHRoZW4gYGFkZFN1cmZhY2VgXG4gICAqIHJlbmRlcnMgaXQuIFRoZSBzbGljZSBwbGFuZSBhbHNvIGZlZWRzIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtIChrZXkgMCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkU3VyZmFjZSh2aWV3ZXI6IFZpZXdlciwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHBsYW5lID0gdGhpcy5zdXJmYWNlUGxhbmVzLmdldCh6KTtcbiAgICBpZiAoIXBsYW5lKSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBsYW5lID0gYXdhaXQgdGhpcy5mZXRjaFN1cmZhY2VQbGFuZSh6LCB0aGlzLnN1cmZhY2VNYXhHcmlkKTtcbiAgICAgICAgdGhpcy5zdXJmYWNlUGxhbmVzLnNldCh6LCBwbGFuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSBzbGljZSBmZXRjaCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwbGFuZSB8fCBwbGFuZS53aWR0aCA8IDIgfHwgcGxhbmUuaGVpZ2h0IDwgMiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCBzdCA9IHRoaXMuc3VyZmFjZVN0YXRlKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSk7XG4gICAgY29uc3Qgd2luOiBbbnVtYmVyLCBudW1iZXJdID0gW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IHdpbjtcbiAgICAvLyBIZWlnaHQgQU5EIGNvbG91ciBhcmUgbm9ybWFsaXplZCBieSB0aGUgc2FtZSBjb250cmFzdCB3aW5kb3csIHNvIGNoYW5naW5nIG1pbi9tYXggcmVzaGFwZXMgdGhlXG4gICAgLy8gc3VyZmFjZSAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSkuIENlbnRlciBpdCBmb3IgdGhlIGF4ZXMgZ2l6bW8uIFRoZVxuICAgIC8vIHBsYW5lIGlzIGFscmVhZHkgZGVjaW1hdGVkIHRvIHRoZSBncmlkIGNhcCDihpIgc3RyaWRlIDEuXG4gICAgY29uc3QgelNjYWxlID0gU1VSRkFDRV9aX0FTUEVDVCAqIE1hdGgubWF4KHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQpO1xuICAgIGNvbnN0IHsgdmVydGljZXMsIGZhY2VzLCB2YWx1ZXMgfSA9IGhlaWdodEZpZWxkKHBsYW5lLmRhdGEsIHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQsIHtcbiAgICAgIHpTY2FsZSxcbiAgICAgIHpMaW1pdHM6IHdpbixcbiAgICAgIGNlbnRlcjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFByZXNlcnZlIHRoZSBvcmJpdCBjYW1lcmEgYWNyb3NzIGEgcmUtc2xpY2UgLyB3aW5kb3cgcmVidWlsZCDigJQgb25seSB0aGUgZmlyc3QgbW91bnQgZnJhbWVzLCBzb1xuICAgIC8vIHN0ZXBwaW5nIHRoZSBzdGFjayBvciBjaGFuZ2luZyB0aGUgd2luZG93IGtlZXBzIHRoZSBjdXJyZW50IHpvb20vcGFuL29yaWVudGF0aW9uLlxuICAgIGNvbnN0IGNhbSA9IHZpZXdlci5jYW1lcmEzZDtcbiAgICBjb25zdCBwcmVzZXJ2ZUNhbWVyYSA9IHRoaXMuc3VyZmFjZUxheWVyICE9IG51bGw7XG4gICAgY29uc3Qgc2F2ZWRUYXJnZXQgPSBjYW0udGFyZ2V0O1xuICAgIGNvbnN0IHNhdmVkRGlzdGFuY2UgPSBjYW0uZGlzdGFuY2U7XG4gICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnN1cmZhY2VMYXllcik7XG4gICAgICB0aGlzLnN1cmZhY2VMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gdmlld2VyLmFkZFN1cmZhY2UodmVydGljZXMsIGZhY2VzLCB2YWx1ZXMsIHtcbiAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiB3aW4sXG4gICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICB3aXJlZnJhbWU6IHRoaXMuc3VyZmFjZVdpcmVmcmFtZSxcbiAgICB9KTtcbiAgICBpZiAocHJlc2VydmVDYW1lcmEpIHtcbiAgICAgIGNhbS50YXJnZXQgPSBzYXZlZFRhcmdldDtcbiAgICAgIGNhbS5kaXN0YW5jZSA9IHNhdmVkRGlzdGFuY2U7XG4gICAgfVxuXG4gICAgdGhpcy5pbWFnZVcgPSBwbGFuZS53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IHBsYW5lLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSB7IHdpZHRoOiBwbGFuZS53aWR0aCwgaGVpZ2h0OiBwbGFuZS5oZWlnaHQsIGRlcHRoOiBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHpTY2FsZSkpIH07XG4gICAgLy8gUmV1c2UgdGhlIHZvbHVtZSBpbnRlbnNpdHktaGlzdG9ncmFtIHBhdGg6IHRoZSBzbGljZSdzIHNjYWxhciBwbGFuZSBpcyB0aGUgaGlzdG9ncmFtIHNvdXJjZS5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgcGxhbmUuZGF0YSk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIHRoZSBzdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIHN1cmZhY2UsIHNvIGhpc3RvZ3JhbVxuICAgKiAgJiBjaGFubmVsLWRpYWxvZyBlZGl0cyB1cGRhdGUgaXQgbGl2ZSB3aXRob3V0IGEgcmUtZmV0Y2guICoqbWluL21heCByZXNoYXBlcyB0aGUgc3VyZmFjZSdzXG4gICAqICBoZWlnaHQqKiAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGEgd2luZG93IGNoYW5nZSByZWJ1aWxkcyB0aGVcbiAgICogIG1lc2ggZ2VvbWV0cnkgKGZyb20gdGhlIGNhY2hlZCBzbGljZSk7IGNvbG91ci1vbmx5IGVkaXRzIChjb2xvcm1hcC9MVVQsIGdhbW1hLCByZXZlcnNlLCBpbnZlcnQpXG4gICAqICBqdXN0IHVwZGF0ZSB0aGUgbGF5ZXIncyB1bmlmb3Jtcy4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY29sb3JtYXAsIHJldmVyc2UsIGludmVydCwgY2hhbm5lbHNdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgIHRoaXMuaW52ZXJ0RW5hYmxlZCA9IGludmVydDtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zdXJmYWNlTGF5ZXI7XG4gICAgICBpZiAoIWxheWVyIHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgICAgY29uc3Qgc3QgPSB0aGlzLnN1cmZhY2VTdGF0ZShjaGFubmVscyk7XG4gICAgICBjb25zdCB3aW46IFtudW1iZXIsIG51bWJlcl0gPSBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV07XG4gICAgICBjb25zdCB3aW5kb3dDaGFuZ2VkID1cbiAgICAgICAgIXRoaXMuc3VyZmFjZVdpbmRvdyB8fCB3aW5bMF0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1swXSB8fCB3aW5bMV0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1sxXTtcbiAgICAgIGlmICh3aW5kb3dDaGFuZ2VkKSB7XG4gICAgICAgIC8vIEhlaWdodCBmb2xsb3dzIHRoZSBjb250cmFzdCB3aW5kb3cg4oaSIHJlYnVpbGQgdGhlIG1lc2ggZm9yIHRoZSBuZXcgW21pbixtYXhdIChjYW1lcmEga2VwdCkuXG4gICAgICAgIHZvaWQgdGhpcy5idWlsZFN1cmZhY2UodGhpcy52aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApLmNhdGNoKChlcnIpID0+XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSB3aW5kb3cgcmVidWlsZCBmYWlsZWQ6JywgZXJyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQ29sb3VyLW9ubHkgY2hhbmdlOiB1cGRhdGUgdW5pZm9ybXMgaW4gcGxhY2UsIG5vIGdlb21ldHJ5IHJlYnVpbGQuXG4gICAgICBsYXllci5jb2xvcm1hcCA9IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpO1xuICAgICAgaWYgKHN0KSB7XG4gICAgICAgIGxheWVyLmNvbnRyYXN0TGltaXRzID0gd2luO1xuICAgICAgICBsYXllci5nYW1tYSA9IHN0LmdhbW1hO1xuICAgICAgfVxuICAgICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXRDYW1lcmFTb29uKCk6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmNhbnZhcyAmJiB0aGlzLmltYWdlVyA+IDAgJiYgdGhpcy5pbWFnZUggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld2VyLmNhbWVyYS5maXQoXG4gICAgICAgICAgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5pbWFnZUgsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0IHx8IHRoaXMuaW1hZ2VILFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHJlcXVlc3RBbmltYXRpb25GcmFtZShydW4pO1xuICAgIGVsc2UgcnVuKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljOyBob3N0IHJlLWRyaXZlcyBwbG90KCkgZnJvbSBpdHMgaW1hZ2Ugc3RyZWFtLiAqL1xuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIC8qIG5vLW9wICovXG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRUb2tlbisrOyAvLyBpbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgZnJhbWUgbG9hZGluZyBmcm9tIHRoZSBwcmV2aW91cyBwbG90XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheT8uZGVzdHJveSgpO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheSA9IG51bGw7XG4gICAgdGhpcy5heGVzTGFiZWxzPy5kZXN0cm95KCk7XG4gICAgdGhpcy5heGVzTGFiZWxzID0gbnVsbDtcbiAgICB0aGlzLnpIYW5kbGU/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnpIYW5kbGUgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lV29ybGRCYXNlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmxhc3RQaXhlbHNSZWN0ID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuY2xlYXIoKTtcbiAgICB0aGlzLnRpbGVkID0gZmFsc2U7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmPy4oKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gbnVsbDtcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZpZXdlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5ob3N0Py5jb250YWlucyh0aGlzLmNhbnZhcykpIHRoaXMuaG9zdC5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyMmRQb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc2NhdHRlcjNkTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMuYXhlc0xheWVyID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgfVxuXG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyBheGlzIHJlc2V0LiAqL1xuICByZXNldEF4ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF1dG9zY2FsZS4gKi9cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQkLm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3ZXIpIHRoaXMudmlld2VyLmNhbWVyYS56b29tID0gdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gKiAxLjM7XG4gIH1cblxuICB6b29tT3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlcikgdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSAvIDEuMztcbiAgfVxuXG4gIHNldERyYWdNb2RlKF9tb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQge1xuICAgIC8vIE5vLW9wOiBwYW4gYW5kIHpvb20gYXJlIGFsd2F5cyB0aGUgbmFwYXJpIGNhbWVyYSdzIGRlZmF1bHQgZ2VzdHVyZXMsIGFuZCBwYW4vem9vbSBnYXRpbmcgZm9yXG4gICAgLy8gZHJhd2luZyBpcyBvd25lZCBieSB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIChzZXRDb250cm9sc0VuYWJsZWQpLiBUb2dnbGluZyBjb250cm9scyBoZXJlXG4gICAgLy8gd291bGQgZmlnaHQgdGhhdCDigJQgdGhlIGhvc3QgY2FsbHMgc2V0RHJhZ01vZGUoZmFsc2UpIGFsb25nc2lkZSBvdmVybGF5LnNldE1vZGUoPHRvb2w+KS5cbiAgfVxuXG4gIHNldE5hdmlnYXRvclZpc2libGUoX3Zpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiBuYXBhcmktanMgaGFzIG5vIG1pbmltYXA7IG5vLW9wICovXG4gIH1cblxuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VTbW9vdGhpbmcgPSBlbmFibGVkO1xuICAgIC8vIEFwcGx5IGxpdmUgdG8gdGhlIHJlbmRlcmVkIGltYWdlIGxheWVyczsgYmFrZWQgaW50byB0aGUgbmV4dCByZW5kZXIgdG9vLlxuICAgIHRoaXMuY2hhbm5lbFZpZXc/LnNldEludGVycG9sYXRpb24oZW5hYmxlZCA/ICdsaW5lYXInIDogJ25lYXJlc3QnKTtcbiAgfVxuXG4gIHNldFNob3dTdGFjayhfc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogc3RhY2sgbmF2aWdhdGVkIHZpYSBzZXRaSW5kZXggKi9cbiAgfVxuXG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvYWRlZCkgdGhpcy5sb2FkZWQueiA9IHpJbmRleDtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgLy8gU3VyZmFjZTogb25lIHNsaWNlIOKGkiBvbmUgbWVzaCwgc28gcmUtYnVpbGQgdGhlIGhlaWdodCBmaWVsZCBmb3IgdGhlIG5ldyBzbGljZS5cbiAgICBpZiAodGhpcy5zdXJmYWNlTGF5ZXIpIHtcbiAgICAgIHZvaWQgdGhpcy5idWlsZFN1cmZhY2UodiwgekluZGV4KS5jYXRjaCgoZXJyKSA9PlxuICAgICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzZXRaSW5kZXggc3VyZmFjZSBmYWlsZWQ6JywgZXJyKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFZvbHVtZSAvIGlzb3N1cmZhY2U6IHN0ZXAgdGhlIHZvbHVtZSdzIHogcGxhbmUgaW4gcGxhY2UuXG4gICAgaWYgKHRoaXMudm9sdW1lVmlldykge1xuICAgICAgdi5kaW1zLnogPSB6SW5kZXg7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGlsZWQgMkQgaW1hZ2U6IGp1c3QgbW92ZSB0aGUgZGltcyBwbGFuZSDigJQgdGhlIHRpbGVkIHZpc3VhbCBmZXRjaGVzIHRoZSBuZXcgc2xpY2UncyB0aWxlc1xuICAgIC8vIChjYWNoZWQgcGVyIHopLCBubyBsYXllciByZWJ1aWxkLiBSZWZyZXNoIHRoZSBjb2Fyc2UgaGlzdG9ncmFtIHNhbXBsZSBmb3IgdGhlIG5ldyBzbGljZS5cbiAgICBpZiAodGhpcy50aWxlZCkge1xuICAgICAgdi5kaW1zLnogPSB6SW5kZXg7XG4gICAgICBpZiAodGhpcy5kZXNjcmlwdG9yKSB2b2lkIHRoaXMucmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXMoekluZGV4LCB0aGlzLmRlc2NyaXB0b3IpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIDJEIGltYWdlIChzdGl0Y2ggZmFsbGJhY2spOiByZS1yZW5kZXIgdGhlIHNsaWNlIChyZS1mZXRjaGVzIHBlci1jaGFubmVsIC8gY29tcG9zaXRlKS4gQnJhbmNoXG4gICAgLy8gb2YgYSB2b2x1bWUgbGF5ZXIgKG5vdCBjdXJyZW50UGxvdFR5cGUsIHdoaWNoIGNvdWxkIGJlIHN0YWxlIGFuZCBzaWxlbnRseSBuby1vcCB0aGUgc3dhcCkuXG4gICAgLy8gVGhlIHRva2VuIGxldHMgcmVuZGVySW1hZ2UgZHJvcCBhIHN1cGVyc2VkZWQgc2NydWIgc28gYSBzbG93IG9sZGVyIHNsaWNlIGNhbid0IGNsb2JiZXIgYSBuZXdlciBvbmUuXG4gICAgY29uc3QgcmVxID0gKyt0aGlzLnNsaWNlUmVxO1xuICAgIHZvaWQgdGhpcy5yZW5kZXJJbWFnZSh6SW5kZXgsIHJlcSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHJlcSA9PT0gdGhpcy5zbGljZVJlcSkgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzbGljZSBmYWlsZWQ6JywgZXJyKSk7XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgaW4tZmxpZ2h0IGZyYW1lIGxvYWRpbmc6IGJ1bXAgdGhlIGxvYWQgZ2VuZXJhdGlvbiBzbyB0aGUgdm9sdW1lLWFzc2VtYmx5IC8gc3VyZmFjZVxuICAgKiAgcHJlbG9hZCB3b3JrZXJzIHN0b3AgZmV0Y2hpbmcgbW9yZSBmcmFtZXMsIGFuZCBjbGVhciB0aGUgbG9hZGluZyBmbGFnICsgcHJvZ3Jlc3MuICovXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkVG9rZW4rKztcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgfVxuXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDAgPyB7IHdpZHRoOiB0aGlzLmltYWdlVywgaGVpZ2h0OiB0aGlzLmltYWdlSCB9IDogbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFBpeGVscztcbiAgfVxuXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgaWYgKCF2IHx8ICFzaXplKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByID0gdi52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIHIueCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIHIueSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGg6IE1hdGgubWluKHNpemUud2lkdGgsIHIueCArIHIud2lkdGgpIC0geCxcbiAgICAgIGhlaWdodDogTWF0aC5taW4oc2l6ZS5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KSAtIHksXG4gICAgfTtcbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgfVxuXG4gIC8qKiBNYXAgYSBQbG90bHktc3R5bGUgM0QgZHJhZyBtb2RlIG9udG8gbmFwYXJpLWpzJ3MgY2FtZXJhIGRyYWcgbW9kZS4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCBtID0gbW9kZSA9PT0gJ3BhbicgPyAncGFuJyA6IG1vZGUgPT09ICd6b29tJyA/ICd6b29tJyA6ICdyb3RhdGUnOyAvLyBvcmJpdC90dXJudGFibGUg4oaSIHJvdGF0ZVxuICAgIHRoaXMudmlld2VyLnNldENhbWVyYURyYWdNb2RlKG0pO1xuICB9XG5cbiAgLyoqIFJlLWZyYW1lIHRoZSAzRCBjYW1lcmEgb24gdGhlIGN1cnJlbnQgM0QgbGF5ZXIuIEEgc3VyZmFjZSBtZXNoIHNpdHMgaW4gdGhlIHBvc2l0aXZlIG9jdGFudFxuICAgKiAgKG5vdCBjZW50cmVkKSwgc28gZnJhbWUgaXQgYnkgaXRzIG93biBib3VuZHM7IGEgdm9sdW1lL2lzb3N1cmZhY2UgdXNlcyBpdHMgY2VudHJlZCBib3guICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgbWVzaExheWVyID0gdGhpcy5zdXJmYWNlTGF5ZXIgPz8gdGhpcy5zY2F0dGVyM2RMYXllcjtcbiAgICBpZiAobWVzaExheWVyKSB7XG4gICAgICBjb25zdCBiID0gbWVzaExheWVyLmJvdW5kcygpO1xuICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhM2QudGFyZ2V0ID0gYi5jZW50ZXI7XG4gICAgICB0aGlzLnZpZXdlci5jYW1lcmEzZC5kaXN0YW5jZSA9IE1hdGgubWF4KGIucmFkaXVzICogMi41LCAxZS0zKTtcbiAgICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IHRoaXMudm9sdW1lRGltcztcbiAgICBpZiAoZCkgdGhpcy52aWV3ZXIuY2FtZXJhM2QuZnJhbWUoZC53aWR0aCwgZC5oZWlnaHQsIGQuZGVwdGgpO1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gVGhlIFdlYkdQVSBuYXBhcmktanMgb3B0aW9ucywgb2ZmZXJlZCBhbG9uZ3NpZGUgKG5vdCByZXBsYWNpbmcpIHRoZSBPU0QvUGxvdGx5IHR5cGVzLlxuICAgIHJldHVybiBbXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lNQUdFXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVJdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU1VSRkFDRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0RdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfVk9MVU1FXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0VdISxcbiAgICBdO1xuICB9XG5cbiAgLyoqIFRoZSBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yICgxID0gZnVsbCDigKYgOCA9IOKFmykuIFJlYWQgYnkgdGhlIHRvb2xiYXIgdG8gaW5pdCB0aGUgY29udHJvbC4gKi9cbiAgZ2V0UmVzb2x1dGlvblNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvblNjYWxlO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZGVjaW1hdGUgZmFjdG9yIGZvciB0aGUgbmFwYXJpIDNEIHR5cGVzLiBUYWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgKHJlKWxvYWQg4oCUIHRoZSBob3N0XG4gICAqICByZS1wbG90cyBhZnRlciBjYWxsaW5nIHRoaXMsIHNpbmNlIGRlY2ltYXRpb24gY2hhbmdlcyB0aGUgZmV0Y2hlZC9hc3NlbWJsZWQgZGF0YS4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc29sdXRpb25TY2FsZSA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICByZW5kZXJJbnRlbnNpdHlJbnNldChfZGl2SWQ6IHN0cmluZywgX3Byb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICAvKiBQbG90bHkgb3ducyB0aGUgaW50ZW5zaXR5IGluc2V0ICovXG4gIH1cblxuICAvKiogUmVhZCB0aGUgZGlzcGxheWVkIGNvbXBvc2l0ZSBpbnRvIGBsYXN0UGl4ZWxzYCAodGhlIHBpeGVsLXRvb2xzJyBzb3VyY2UpICsgZW1pdCB0aGUgY2xhbXBlZFxuICAgKiAgdmlzaWJsZSByZWdpb24uIEEgZnJlc2ggUGl4ZWxEYXRhIG9iamVjdCBtZWFucyBjYWNoZWRJbWFnZURhdGEoKSByZWJ1aWxkcyBhdXRvbWF0aWNhbGx5LiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blJlYWRiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHggPSBhd2FpdCB2LnJlYWREaXNwbGF5ZWRQaXhlbHMoKTtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdikgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IHYudmlzaWJsZVdvcmxkUmVjdCgpOyAvLyBjYXB0dXJlIFdJVEggdGhlIHBpeGVscyAoc2FtZSBjYW1lcmEpXG4gICAgICB0aGlzLmxhc3RQaXhlbHMgPSBweDtcbiAgICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSByZWN0O1xuICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICAgICAgaWYgKHNpemUgJiYgcmVjdCkge1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2l6ZS53aWR0aCwgcmVjdC54KSk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLmhlaWdodCwgcmVjdC55KSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS53aWR0aCAtIHgsIHJlY3Qud2lkdGgpKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS5oZWlnaHQgLSB5LCByZWN0LmhlaWdodCkpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5uZXh0KHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHJlYWRiYWNrIHVuYXZhaWxhYmxlICovXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlYWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHZvaWQgdGhpcy5ydW5SZWFkYmFjaygpKTtcbiAgICBlbHNlIHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCksIDApO1xuICB9XG5cbiAgLyoqIERlYm91bmNlZCByZWFkYmFjayDigJQgYXJtZWQgb24gY2FtZXJhIGNoYW5nZXMgc28gYGxhc3RQaXhlbHNgIHRyYWNrcyB0aGUgY3VycmVudCB2aWV3IGFmdGVyIGFcbiAgICogIHBhbi96b29tIHNldHRsZXMgKGFuZCBhZnRlciB0aWxlZCBsZXZlbHMgZmluaXNoIGxvYWRpbmcpLCB3aGljaCB0aGUgb24tY2FudmFzIHBpeGVsIHRvb2xzXG4gICAqICAod2FuZC9icnVzaC9TQU0pIHJlYWQgc3luY2hyb25vdXNseS4gQ29hbGVzY2VzIHJhcGlkIGNoYW5nZXMuICovXG4gIHByaXZhdGUgYXJtUmVhZGJhY2soZGVsYXlNcyA9IDI1MCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgdGhpcy5yZWFkYmFja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgICAgdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCk7XG4gICAgfSwgZGVsYXlNcyk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlICsgY2xhc3NpZmljYXRpb24gY29sb3VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIC8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gdGhlIE9TRCBiYWNrZW5kKS5cblxuICAvLyDilIDilIAgUGl4ZWwgdG9vbHM6IHJldXNlIHRoZSBzaGFyZWQsIGJhY2tlbmQtYWdub3N0aWMgdG9vbCBzZXJ2aWNlcyB3aXRoIGEgbmFwYXJpIGhvc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEJ1aWxkIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSArIHRvb2wgaG9zdHMgZm9yIHRoZSBjdXJyZW50IHZpZXdlciAoY2FsbGVkIGZyb20gcGxvdCgpKS4gVGhlXG4gICAqICBwaXhlbCB0b29scyByZWFkIGRpc3BsYXllZCBwaXhlbHMgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIGFuZCBjb252ZXJ0IHBvaW50ZXJcbiAgICogIGNvb3JkcyB2aWEgdGhlIG5hcGFyaSBjYW1lcmEsIGV4YWN0bHkgbWlycm9yaW5nIHRoZSBPU0QgaG9zdC4gKi9cbiAgcHJpdmF0ZSBidWlsZFRvb2xIb3N0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG5ldyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgdGhpcy52aWV3ZXIsXG4gICAgICAoKSA9PiAhIXRoaXMudmlld2VyICYmIHRoaXMuaW1hZ2VXID4gMCxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnJlZ2lvblN0b3JlO1xuICAgIHRoaXMud2FuZEhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiByZWdpb25zLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyKSA9PiByZWdpb25zLnNldFJlZ2lvbnMociksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuY2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiB0aGlzLmxvYWRlZD8ueiA/PyAwLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5ob3N0LFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiB0aGlzLmxvYWRlZD8uZmlsZW5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiByZWdpb25zLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHJlZ2lvbnMuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvbnMuc2V0UmVnaW9ucyhyKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmhvc3QsXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZURhdGEoKT8ucmF0aW9zWzBdID8/IDEsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgem9vbUJveEhvc3QoKTogWm9vbVRvQm94VG9vbEhvc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQbG90RGl2OiAoKSA9PiB0aGlzLnBsb3REaXZJZCxcbiAgICAgIHBpeGVsVG9EYXRhOiAocHgsIHB5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoIXRoaXMudmlld2VyIHx8ICFyZWN0KSByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQocmVjdC5sZWZ0ICsgcHgsIHJlY3QudG9wICsgcHkpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgICB9LFxuICAgICAgYXBwbHlab29tVG9Cb3g6IChjb29yZHMpID0+IHRoaXMuYXBwbHlab29tVG9Cb3goY29vcmRzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFpvb20vcGFuIHRoZSBjYW1lcmEgdG8gZml0IGEgZGF0YS1zcGFjZSByZWN0YW5nbGUgYFt4TWluLCB4TWF4LCB5TWF4LCB5TWluXWAuICovXG4gIHByaXZhdGUgYXBwbHlab29tVG9Cb3goY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdiB8fCAhdGhpcy5jYW52YXMgfHwgY29vcmRpbmF0ZXMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuICAgIGNvbnN0IFt4TWluLCB4TWF4LCB5QSwgeUJdID0gY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgeDAgPSBNYXRoLm1pbih4TWluLCB4TWF4KTtcbiAgICBjb25zdCB4MSA9IE1hdGgubWF4KHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHkwID0gTWF0aC5taW4oeUEsIHlCKTtcbiAgICBjb25zdCB5MSA9IE1hdGgubWF4KHlBLCB5Qik7XG4gICAgY29uc3QgdyA9IE1hdGgubWF4KDEsIHgxIC0geDApO1xuICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCB5MSAtIHkwKTtcbiAgICBjb25zdCB2dyA9IHRoaXMuY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgdmggPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgaDtcbiAgICB2LmNhbWVyYS5jZW50ZXIgPSBbKHgwICsgeDEpIC8gMiwgKHkwICsgeTEpIC8gMl07XG4gICAgdi5jYW1lcmEuem9vbSA9IE1hdGgubWluKHZ3IC8gdywgdmggLyBoKTtcbiAgICB2LnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBDYWNoZWRJbWFnZURhdGEgZnJvbSB0aGUgbW9zdCByZWNlbnQgcmVhZGJhY2sgKFJHQkEgZGV2aWNlIHBpeGVscyDihpIgW3ldW3hdPVtyLGcsYl0pLFxuICAgKiAgd2l0aCByYXRpb3Mvb3JpZ2luIG1hcHBpbmcgaW1hZ2UgY29vcmRzIOKGlCByZWFkYmFjayBwaXhlbHMuIENhY2hlZCB1bnRpbCB0aGUgcmVhZGJhY2sgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZURhdGEoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmxhc3RQaXhlbHM7XG4gICAgaWYgKCFweCB8fCAhdGhpcy52aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNhY2hlZEltYWdlICYmIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPT09IHB4KSByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgICBjb25zdCB3ID0gcHgud2lkdGg7XG4gICAgY29uc3QgaCA9IHB4LmhlaWdodDtcbiAgICBjb25zdCBkYXRhID0gcHguZGF0YTtcbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW11bXSA9IG5ldyBBcnJheShoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xuICAgICAgY29uc3Qgcm93OiBudW1iZXJbXVtdID0gbmV3IEFycmF5KHcpO1xuICAgICAgY29uc3QgYmFzZSA9IHkgKiB3ICogNDtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdzsgeCsrKSB7XG4gICAgICAgIGNvbnN0IG8gPSBiYXNlICsgeCAqIDQ7XG4gICAgICAgIHJvd1t4XSA9IFtkYXRhW29dLCBkYXRhW28gKyAxXSwgZGF0YVtvICsgMl1dO1xuICAgICAgfVxuICAgICAgbWF0cml4W3ldID0gcm93O1xuICAgIH1cbiAgICAvLyBVc2UgdGhlIHJlY3QgY2FwdHVyZWQgV0lUSCB0aGlzIHJlYWRiYWNrIChub3QgdGhlIGxpdmUgb25lKSBzbyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZVxuICAgIC8vIG1hdHJpeCdzIGNhbWVyYSDigJQgb3RoZXJ3aXNlIGEgcGFuL3pvb20gc2luY2UgdGhlIHJlYWRiYWNrIG1pcy1zY2FsZXMgdGhlIHRyYWNlZCByZWdpb24uXG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGFzdFBpeGVsc1JlY3QgPz8gdGhpcy52aWV3ZXIudmlzaWJsZVdvcmxkUmVjdCgpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSB7XG4gICAgICBmcmFtZXM6IFttYXRyaXhdLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyZWN0LndpZHRoIC8gdywgcmVjdC5oZWlnaHQgLyBoXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIG9yaWdpblg6IHJlY3QueCxcbiAgICAgIG9yaWdpblk6IHJlY3QueSxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBweDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVG9vbENvbnRyb2xsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENvbnRyb2wgZ2F0aW5nOiBhIHRvb2wgdGhhdCBBQ1RJVkFURVMgZGlzYWJsZXMgdGhlIGNhbWVyYSBjb250cm9sczsgZGVhY3RpdmF0aW9uIGlzIGEgbm8tb3BcbiAgLy8gYmVjYXVzZSB0aGUgaG9zdCBhbHdheXMgY2FsbHMgdGhlIHJlZ2lvbiBvdmVybGF5J3Mgc2V0TW9kZSBGSVJTVCBpbiBlYWNoIHRvZ2dsZSAod2hpY2ggc2V0c1xuICAvLyB0aGUgYmFzZWxpbmUgZW5hYmxlZC9kaXNhYmxlZCksIHNvIHJlLWVuYWJsaW5nIGhlcmUgd291bGQgZmlnaHQgYSBmcmVzaGx5LWFjdGl2YXRlZCBkcmF3IG1vZGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjsgLy8gbm8gcGxvdCB5ZXQg4oaSIG5vdGhpbmcgdG8gZHJpdmVcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hcm1SZWFkYmFjaygwKTtcbiAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy53YW5kVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLndhbmRUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucygob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKTtcbiAgfVxuICBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuYXJtUmVhZGJhY2soMCk7XG4gICAgaWYgKHRoaXMud2FuZEhvc3QpIHRoaXMuYnJ1c2hUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMuYnJ1c2hUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy5zaXplICE9IG51bGwpIHRoaXMuYnJ1c2hUb29sLnNldFNpemUob3B0aW9ucy5zaXplKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuZXJhc2VySG9zdCkgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgLy8gU0FNIC8gY2VsbHBvc2Ug4oCUIHNlcnZlciByb3VuZC10cmlwcyB0aGF0IHJlYWQgdGhlIGRyYXduIHJlY3RhbmdsZXMgKyBkaXNwbGF5ZWQgcGl4ZWxzIHRocm91Z2hcbiAgLy8gdGhlIHNhbWUgd2FuZCBob3N0IChyZWN0YW5nbGVzIGZyb20gdGhlIFJlZ2lvblN0b3JlLCBpbWFnZSBmcm9tIHRoZSByZWFkYmFjaykuXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy53YW5kSG9zdCkgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpOyAvLyB0aGUgU0FNIGVtYmVkZGluZyBzYW1wbGVzIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlXG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgYXN5bmMgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMud2FuZEhvc3QgfHwgIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygwKTsgLy8gcmVmcmVzaCB0aGUgcmVhZGJhY2sgdGhlIGNsaWNrJ3MgZW1iZWRkaW5nIHdpbGwgc2FtcGxlXG4gICAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJSW50ZW5zaXR5U2FtcGxpbmc6IFBsb3RseSBvd25zIHNhbXBsaW5nOyBlbWl0IHZpZXdwb3J0IGNoYW5nZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKF9pbWFnZUluZm86IElJbWFnZUluZm8sIF96SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koXG4gICAgX3g6IG51bWJlcixcbiAgICBfeTogbnVtYmVyLFxuICAgIF93aWR0aDogbnVtYmVyLFxuICAgIF9oZWlnaHQ6IG51bWJlcixcbiAgICBfekluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge31cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciBjb21wb3NpdGUgbWVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudm9sdW1lVmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcgJiYgIXRoaXMuc3VyZmFjZUxheWVyICYmICF0aGlzLnNjYXR0ZXIzZExheWVyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3VyZmFjZURyYWdNb2RlOiAobW9kZTogc3RyaW5nKTogdm9pZCA9PiB0aGlzLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKSxcbiAgICAgIHJlc2V0U3VyZmFjZUNhbWVyYTogKCk6IHZvaWQgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSxcbiAgICAgIHNldEF4ZXNWaXNpYmxlOiAodmlzaWJsZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmF4ZXNWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgdGhpcy5heGVzTGFiZWxzPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLmF4ZXNMYXllci52aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXhlc1Zpc2libGU6ICgpOiBib29sZWFuID0+IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgICAvLyBTdXJmYWNlIHdpcmVmcmFtZSAobmFwYXJpLWpzIHN1cmZhY2Ugb25seSkg4oCUIGEgbGl2ZSBsYXllciBwcm9wZXJ0eSwgbm8gcmVidWlsZCBuZWVkZWQuXG4gICAgICBzZXRXaXJlZnJhbWU6IChvbjogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1cmZhY2VXaXJlZnJhbWUgPSBvbjtcbiAgICAgICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICAgICAgdGhpcy5zdXJmYWNlTGF5ZXIud2lyZWZyYW1lID0gb247XG4gICAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdpcmVmcmFtZTogKCk6IGJvb2xlYW4gPT4gdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH07XG4gIH1cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuIG51bGw7XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiB0aGUgYXNzZW1ibGVkIChkb3duc2FtcGxlZCkgdWludDggdm9sdW1lIGZvciB0aGVcbiAgICAvLyByZXF1ZXN0ZWQgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUgKGtleSAwKS5cbiAgICBpZiAodGhpcy52b2x1bWVDaGFubmVsRGF0YS5zaXplKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy52b2x1bWVDaGFubmVsRGF0YS5nZXQoY2hhbm5lbEluZGV4KSA/PyB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmdldCgwKTtcbiAgICAgIHJldHVybiBkYXRhID8gdGhpcy50b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKGRhdGEsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gVGlsZWQgbW9kZSBoYXMgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKGkiB1c2UgdGhlIGNvYXJzZSBwZXItY2hhbm5lbCBzYW1wbGUgKFJHQjogcmVhZGJhY2spLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuaGlzdFNhbXBsZXMuZ2V0KHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsSW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZSA/IHRoaXMudG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihzYW1wbGUsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gR3JheXNjYWxlL211bHRpY2hhbm5lbCAoc3RpdGNoKTogbmF0aXZlIHBlci1jaGFubmVsIGhpc3RvZ3JhbSBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnlcbiAgICAvLyBzY2FsYXIgbGF5ZXIgKG5vIEdQVSByZWFkYmFjaykuIFJHQjogYmluIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzJyBSL0cvQiBieXRlICg4LWJpdCBjbGllbnQgcGF0aCkuXG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmNoYW5uZWxWaWV3Py5sYXllcnNbdGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnID8gMCA6IGNoYW5uZWxJbmRleF07XG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBjb25zdCBoID0gdi5sYXllckhpc3RvZ3JhbShsYXllciwgYmlucyk7XG4gICAgICBpZiAoaCkgcmV0dXJuIHRoaXMudG9JSGlzdG9ncmFtKGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgLy8gPjgtYml0IGNoYW5uZWxzOiBmZXRjaCB0aGUgdHJ1ZSBuYXRpdmUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciAodGhlIGRpc3BsYXllZCBwaXhlbHNcbiAgICAvLyBhcmUgOC1iaXQsIHNvIHRoZSBjbGllbnQgaGlzdG9ncmFtIHdvdWxkIGJlIGNsaXBwZWQpLiA4LWJpdCBjaGFubmVscyB1c2UgdGhlIGNsaWVudCBwYXRoLlxuICAgIGNvbnN0IGJpdERlcHRoID0gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gICAgaWYgKGJpdERlcHRoID4gOCkge1xuICAgICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgICBjb25zdCBrZXkgPSBgJHt6fXwke2NoYW5uZWxJbmRleH1gO1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYXRpdmVIaXN0b2dyYW1zLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucywgeiwga2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCArIGNhY2hlIG9uZSBjaGFubmVsJ3MgbmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW0gZnJvbSBgR0VUIC9oaXN0b2dyYW1gICg+OC1iaXQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTmF0aXZlSGlzdG9ncmFtKFxuICAgIGNoYW5uZWw6IG51bWJlcixcbiAgICBiaW5zOiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWhpc3RvZ3JhbT9pbmZvPSR7aW5mb0I2NH0mY2hhbm5lbD0ke2NoYW5uZWx9Jno9JHt6fSZiaW5zPSR7Ymluc31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHJldHVybiBudWxsOyAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIHRyYW5zaWVudCDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllc1xuICAgICAgY29uc3QgaGkgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICAgICAgYml0RGVwdGg6IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNaW46IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNYXg6IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IG51bWJlcjtcbiAgICAgICAgYmluV2lkdGg6IG51bWJlcjtcbiAgICAgICAgY291bnRzOiBudW1iZXJbXTtcbiAgICAgIH07XG4gICAgICBpZiAoIWhpPy5jb3VudHMpIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgb3V0OiBJSGlzdG9ncmFtID0ge1xuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF0aXZlIGhpc3RvZ3JhbSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBvZiB0aGUgZGlzcGxheWVkIFJHQiBjb21wb3NpdGUgKFIvRy9CIGJ5dGUpLCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrLiAqL1xuICBwcml2YXRlIHJnYkhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGlmICghcHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyLCBjaGFubmVsSW5kZXgpKTtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjU2LCBNYXRoLmZsb29yKGJpbnMpIHx8IDI1NikpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBBcnJheShuKS5maWxsKDApO1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTsgLy8gc2tpcCB0cmFuc3BhcmVudCBwYWRkaW5nXG4gICAgICBjb3VudHNbTWF0aC5taW4obiAtIDEsIChkYXRhW2kgKyBiYW5kXSAqIG4pID4+IDgpXSsrO1xuICAgIH1cbiAgICBjb25zdCBiaW5zQXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4gKGkgKiAyNTYpIC8gbik7XG4gICAgcmV0dXJuIHsgYmluczogYmluc0FyciwgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHZvaWQgdi5zY3JlZW5zaG90KCkudGhlbigoYmxvYikgPT4ge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ25hcGFyaS1qcy5wbmcnO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIH0pO1xuICB9XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoICgxNi8zMi1iaXQpIG11bHRpLWJhbmQgVElGRiBleHBvcnQgdmlhIHRoZSBzZXJ2ZXIgYC9leHBvcnQvdGlmZmAgZW5kcG9pbnQg4oCUXG4gICAqICB0aGUgZGlzcGxheWVkIFBORyBpcyBhbiA4LWJpdCBmaWd1cmUsIHRoaXMgcHJlc2VydmVzIHRoZSB0cnVlIHBpeGVsIHZhbHVlcy4gVmlzaWJsZSBjaGFubmVsc1xuICAgKiAgb25seSAob21pdHRlZCB3aGVuIGFsbCBhcmUgdmlzaWJsZSDihpIgc2VydmVyIGRlZmF1bHQpLiBNaXJyb3JzIHRoZSBPU0QgYmFja2VuZC4gKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgdmlzaWJsZSA9IHN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgc3RhdGVzLmxlbmd0aCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5sb2FkZWQ/LmZpbGVuYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBzdGF0dXMgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgIHNhdmVBcyhhd2FpdCByZXNwLmJsb2IoKSwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59XG4iXX0=