@microsoft/windows-admin-center-sdk 2.128.0 → 2.165.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular/assets/strings/cs-CZ/strings.json +1 -1
- package/angular/assets/strings/de-DE/strings.json +1 -1
- package/angular/assets/strings/es-ES/strings.json +1 -1
- package/angular/assets/strings/fr-FR/strings.json +1 -1
- package/angular/assets/strings/hu-HU/strings.json +1 -1
- package/angular/assets/strings/it-IT/strings.json +1 -1
- package/angular/assets/strings/ja-JP/strings.json +1 -1
- package/angular/assets/strings/ko-KR/strings.json +1 -1
- package/angular/assets/strings/nl-NL/strings.json +1 -1
- package/angular/assets/strings/pl-PL/strings.json +1 -1
- package/angular/assets/strings/pt-BR/strings.json +1 -1
- package/angular/assets/strings/pt-PT/strings.json +1 -1
- package/angular/assets/strings/ru-RU/strings.json +1 -1
- package/angular/assets/strings/sv-SE/strings.json +1 -1
- package/angular/assets/strings/tr-TR/strings.json +1 -1
- package/angular/assets/strings/zh-CN/strings.json +1 -1
- package/angular/assets/strings/zh-TW/strings.json +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +706 -507
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
- package/angular/esm2015/src/controls/accordion/index.js +5 -0
- package/angular/esm2015/src/controls/data-table/data-table.component.js +135 -129
- package/angular/esm2015/src/controls/dialog/dialog.component.js +11 -5
- package/angular/esm2015/src/controls/dialog/dialog.service.js +6 -13
- package/angular/esm2015/src/controls/dropdown/dropdown.service.js +3 -2
- package/angular/esm2015/src/controls/form/form-field/array/array-form-field.component.js +29 -22
- package/angular/esm2015/src/controls/form/form-field/datetime-range/datetime-range-form-field.component.js +4 -3
- package/angular/esm2015/src/controls/form/form-field/list/list-form-field.component.js +1 -1
- package/angular/esm2015/src/controls/form/validation-alert/validation-alert.component.js +3 -2
- package/angular/esm2015/src/controls/index.js +2 -1
- package/angular/esm2015/src/controls/pivot/pivot.component.js +21 -9
- package/angular/esm2015/src/controls/settings/common-settings/common-settings.component.js +38 -34
- package/angular/esm2015/src/controls/settings/settings-content.component.js +3 -2
- package/angular/esm2015/src/controls/settings/settings.component.js +45 -13
- package/angular/esm2015/src/controls/settings/settings.module.js +5 -1
- package/angular/esm2015/src/controls/tooltip/tooltip-zone.directive.js +2 -2
- package/angular/esm2015/src/controls/wizard/models/index.js +1 -1
- package/angular/esm2015/src/controls/wizard/models/wizard-builder-interface.js +2 -0
- package/angular/esm2015/src/controls/wizard/models/wizard-navigation-interface.js +2 -0
- package/angular/esm2015/src/controls/wizard/wizard-builder.js +70 -1
- package/angular/esm2015/src/controls/wizard/wizard-navigation-information.js +56 -2
- package/angular/esm2015/src/controls/wizard/wizard.component.js +8 -2
- package/angular/esm2015/src/service/connectivity-enforcer.js +5 -2
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +656 -462
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
- package/angular/src/controls/accordion/index.d.ts +4 -0
- package/angular/src/controls/form/form-field/array/array-form-field.component.d.ts +2 -1
- package/angular/src/controls/index.d.ts +1 -0
- package/angular/src/controls/pivot/pivot.component.d.ts +2 -2
- package/angular/src/controls/settings/settings.component.d.ts +3 -0
- package/angular/src/controls/settings/settings.module.d.ts +3 -2
- package/angular/src/controls/wizard/models/index.d.ts +2 -0
- package/angular/src/controls/wizard/models/wizard-builder-interface.d.ts +8 -0
- package/angular/src/controls/wizard/models/wizard-navigation-interface.d.ts +4 -0
- package/angular/src/controls/wizard/wizard-builder.d.ts +36 -1
- package/angular/src/controls/wizard/wizard-navigation-information.d.ts +48 -5
- package/angular/src/controls/wizard/wizard.component.d.ts +2 -1
- package/core/azure/azure-constants.d.ts +8 -0
- package/core/azure/azure-constants.js +8 -0
- package/core/azure/azure-constants.js.map +1 -1
- package/core/azure/azure-manager.d.ts +1 -0
- package/core/azure/azure-manager.js +7 -1
- package/core/azure/azure-manager.js.map +1 -1
- package/core/base/environment.d.ts +3 -0
- package/core/base/environment.js.map +1 -1
- package/core/base/msft-sme.mock.js +3 -0
- package/core/base/msft-sme.mock.js.map +1 -1
- package/core/base/utilities.d.ts +0 -3
- package/core/base/utilities.js +0 -34
- package/core/base/utilities.js.map +1 -1
- package/core/data/resource-cache.d.ts +1 -1
- package/core/data/resource-cache.js +1 -1
- package/core/data/resource-cache.js.map +1 -1
- package/core/data/settings-manager.d.ts +3 -0
- package/core/data/settings-manager.js +14 -1
- package/core/data/settings-manager.js.map +1 -1
- package/core/dom/dom.d.ts +5 -0
- package/core/dom/dom.js +20 -0
- package/core/dom/dom.js.map +1 -1
- package/core/manifest/environment-modules.js +3 -0
- package/core/manifest/environment-modules.js.map +1 -1
- package/core/notification/client-notification-instance.d.ts +5 -2
- package/core/notification/client-notification-instance.js +9 -5
- package/core/notification/client-notification-instance.js.map +1 -1
- package/core/notification/client-notification.d.ts +4 -0
- package/core/notification/client-notification.js.map +1 -1
- package/core/notification/notification.d.ts +6 -1
- package/core/notification/notification.js +3 -1
- package/core/notification/notification.js.map +1 -1
- package/core/rpc/credssp/rpc-credssp-model.d.ts +4 -0
- package/core/rpc/credssp/rpc-credssp-model.js.map +1 -1
- package/core/rpc/dialog/rpc-dialog-client.js +11 -5
- package/core/rpc/dialog/rpc-dialog-client.js.map +1 -1
- package/core/rpc/rpc.d.ts +6 -6
- package/core/rpc/rpc.js +7 -7
- package/core/rpc/rpc.js.map +1 -1
- package/core/security/authorization-manager.js +1 -1
- package/core/security/authorization-manager.js.map +1 -1
- package/core/security/credssp-manager.d.ts +13 -6
- package/core/security/credssp-manager.js +37 -21
- package/core/security/credssp-manager.js.map +1 -1
- package/core/shared/cluster-inventory/cluster-inventory-cache.js +2 -1
- package/core/shared/cluster-inventory/cluster-inventory-cache.js.map +1 -1
- package/e2e/assets/strings/cs-CZ/strings.json +1 -1
- package/e2e/assets/strings/de-DE/strings.json +1 -1
- package/e2e/assets/strings/es-ES/strings.json +1 -1
- package/e2e/assets/strings/fr-FR/strings.json +1 -1
- package/e2e/assets/strings/hu-HU/strings.json +1 -1
- package/e2e/assets/strings/it-IT/strings.json +1 -1
- package/e2e/assets/strings/ja-JP/strings.json +1 -1
- package/e2e/assets/strings/ko-KR/strings.json +1 -1
- package/e2e/assets/strings/nl-NL/strings.json +1 -1
- package/e2e/assets/strings/pl-PL/strings.json +1 -1
- package/e2e/assets/strings/pt-BR/strings.json +1 -1
- package/e2e/assets/strings/pt-PT/strings.json +1 -1
- package/e2e/assets/strings/ru-RU/strings.json +1 -1
- package/e2e/assets/strings/strings.json +1 -1
- package/e2e/assets/strings/sv-SE/strings.json +1 -1
- package/e2e/assets/strings/tr-TR/strings.json +1 -1
- package/e2e/assets/strings/zh-CN/strings.json +1 -1
- package/e2e/assets/strings/zh-TW/strings.json +1 -1
- package/package.json +11 -4
- package/styles/css/main.css +1 -1
- package/tools/gulp-ps-cim/index.js +1 -1
- package/tools/gulp-ps-cim/index.js.map +1 -1
- package/angular/assets/strings/en-US/strings.json +0 -1
- package/core/assets/strings/en-US/strings.json +0 -1
- package/e2e/assets/strings/en-US/strings.json +0 -1
|
@@ -191,7 +191,8 @@ export class DropdownService {
|
|
|
191
191
|
// if the esc key is pressed, close the popup and focus on the toggle element
|
|
192
192
|
if (event.keyCode === KeyCode.Escape) {
|
|
193
193
|
if (this.activeDropdown && this.activeDropdown.toggleElement) {
|
|
194
|
-
const
|
|
194
|
+
const docElement = this.activeDropdown.toggleElement.nativeElement;
|
|
195
|
+
const nextElement = Dom.getFirstFocusableDescendent(docElement) || Dom.getNextFocusableElement(docElement);
|
|
195
196
|
if (nextElement) {
|
|
196
197
|
nextElement.focus();
|
|
197
198
|
}
|
|
@@ -569,4 +570,4 @@ __decorate([
|
|
|
569
570
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DropdownService, [{
|
|
570
571
|
type: Injectable
|
|
571
572
|
}], null, { closeNestedHelper: [] }); })();
|
|
572
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2Ryb3Bkb3duL2Ryb3Bkb3duLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUM5RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0RBQWtELENBQUM7O0FBT3ZFOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQU41QjtRQWFZLDJCQUFzQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELDZCQUF3QixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0QsMEJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0Q7O1dBRUc7UUFDSyxpQkFBWSxHQUFvQixFQUFFLENBQUM7UUFDM0MsMEVBQTBFO1FBQzFFLHVFQUF1RTtRQUMvRCw0QkFBdUIsR0FBb0M7WUFDL0QsS0FBSyxFQUFFO2dCQUNILCtDQUErQztnQkFDL0MscUNBQXFDO2dCQUNyQyxHQUFHLEVBQUUsR0FBRztnQkFDUixNQUFNLEVBQUUsQ0FBQztnQkFDVCxXQUFXLEVBQUUsSUFBSTthQUNwQjtZQUNELE1BQU0sRUFBRTtnQkFDSiw4Q0FBOEM7Z0JBQzlDLHFDQUFxQztnQkFDckMsR0FBRyxFQUFFLEdBQUc7Z0JBQ1Is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QUU7Ozs7d0RBUVA7dUZBcmlCUSxlQUFlO2NBTjNCLFVBQVU7Z0JBdWlCQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFlpZWxkIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RlY29yYXRvcnMveWllbGQuZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgS2V5Q29kZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9hY2Nlc3NpYmlsaXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb20gfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RvbS9kb20nO1xyXG5pbXBvcnQgeyBEcm9wZG93biB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgRHJvcGRvd25IZWlnaHRDYWxjdWxhdGlvblJlc3VsdCB9IGZyb20gJy4vbW9kZWxzL2Ryb3Bkb3duLWhlaWdodC1jYWxjdWxhdGlvbi1yZXN1bHQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bkhlaWdodENhbGN1bGF0aW9uU2NoZW1hIH0gZnJvbSAnLi9tb2RlbHMvZHJvcGRvd24taGVpZ2h0LXNjaGVtYSc7XHJcblxyXG5leHBvcnQgdHlwZSBFdmVudHMgPSBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCB8IEZvY3VzRXZlbnQ7XHJcbkBJbmplY3RhYmxlKClcclxuLyoqXHJcbiAqIFNlcnZpY2UgZm9yIG1haW50YWluaW5nIGRyb3Bkb3duIHN0YXRlLlxyXG4gKiBPbmx5IG9uZSBkcm9wZG93biBjYW4gYmUgb3BlbmVkIGF0IGEgdGltZS5cclxuICogVGhpcyBkb2VzIG5vdCBzdXBwb3J0IG5lc3RlZCBkcm9wZG93bnMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25TZXJ2aWNlIHtcclxuICAgIC8vIE1pbmltdW0gc3BhY2UgYWJvdmUgb3IgYmVsb3cgdGhlIGRyb3Bkb3duIHRvIGRldGVybWluZSBwb3NpdGlvbmluZy5cclxuICAgIHByaXZhdGUgc3RhdGljIG1pblNwYWNlRm9yRHJvcGRvd24gPSAzMDA7XHJcbiAgICAvLyBJZiB0aGUgb3JpZ2luYWwgaGVpZ2h0IGZvciB0aGUgd2hvbGUgZHJvcGRvd24gaXMgMiB0aW1lcyB0aGUgYXZhaWxhYmxlIHNwYWNlXHJcbiAgICAvLyBzaG91bGQgZGlzcGxheSBhcyBmdWxsIGhlaWdodFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2hvdWxkVXNlRnVsbEhlaWdodERyb3Bkb3duUmF0aW8gPSAyO1xyXG5cclxuICAgIHByaXZhdGUgb25Eb2N1bWVudENsaWNrQmluZGluZyA9IHRoaXMub25Eb2N1bWVudENsaWNrLmJpbmQodGhpcyk7XHJcbiAgICBwcml2YXRlIG9uRG9jdW1lbnRLZXlkb3duQmluZGluZyA9IHRoaXMub25Eb2N1bWVudEtleWRvd24uYmluZCh0aGlzKTtcclxuICAgIHByaXZhdGUgb25XaW5kb3dTY3JvbGxCaW5kaW5nID0gdGhpcy5vbldpbmRvd1Njcm9sbC5iaW5kKHRoaXMpO1xyXG4gICAgcHJpdmF0ZSBvbldpbmRvd0JsdXJCaW5kaW5nID0gdGhpcy5vbldpbmRvd0JsdXIuYmluZCh0aGlzKTtcclxuICAgIHByaXZhdGUgYWN0aXZlRHJvcGRvd246IERyb3Bkb3duO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIHNhdmVzIHRoZSByZWNvcmRzIGZvciB0aGUgbGFzdCBvcGVuZWQgZHJvcGRvd25zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZHJvcGRvd25MaXN0OiBBcnJheTxEcm9wZG93bj4gPSBbXTtcclxuICAgIC8vIEl0IGRlZmluZXMgdGhlIGhlaWdodCBmb3IgdGhlIGRyb3Bkb3duIHdpdGggdGhlIHNwZWNpZmljIHdpbmRvdyBoZWlnaHQuXHJcbiAgICAvLyBUaGlzIHdpbGwgYmUgZW5hYmxlZCBvbmx5IGlmIDxzbWUtZHJvcGRvd24gW2NhbGN1bGF0ZUhlaWdodF09XCJ0cnVlXCI+XHJcbiAgICBwcml2YXRlIGhlaWdodENhbGN1bGF0aW9uT2JqZWN0OiBEcm9wZG93bkhlaWdodENhbGN1bGF0aW9uU2NoZW1hID0ge1xyXG4gICAgICAgIHNtYWxsOiB7XHJcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIHdpbmRvdyBoZWlnaHQgaXMgc21hbGxlciB0aGFuIDMwMHB4XHJcbiAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCBtYXJnaW4gdG9wIGFuZCBib3R0b21cclxuICAgICAgICAgICAgbWF4OiAzMDAsXHJcbiAgICAgICAgICAgIG1hcmdpbjogNSxcclxuICAgICAgICAgICAgd2hvbGVIZWlnaHQ6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIG1lZGl1bToge1xyXG4gICAgICAgICAgICAvLyB3aGVuIHRoZW4gd2luZG93IGhlaWdodCBpcyB3aXRoaW4gWzMwMSw1MDBdXHJcbiAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCBtYXJnaW4gdG9wIGFuZCBib3R0b21cclxuICAgICAgICAgICAgbWluOiAzMDAsXHJcbiAgICAgICAgICAgIG1heDogNTAwLFxyXG4gICAgICAgICAgICBtYXJnaW46IDEwXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsYXJnZToge1xyXG4gICAgICAgICAgICAvLyB3aGVuIHRoZW4gd2luZG93IGhlaWdodCBpcyBncmVhdGVyIHRoYW4gNTAwcHhcclxuICAgICAgICAgICAgLy8gVGhlIHNtYWxsZXN0IG1hcmdpbiB0b3AgYW5kIGJvdHRvbVxyXG4gICAgICAgICAgICBtaW46IDUwMCxcclxuICAgICAgICAgICAgbWFyZ2luOiAyMFxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBvcGVucyBhIGRyb3Bkb3duIGFuZCBzZXRzIGl0IHRvIGFjdGl2ZVxyXG4gICAgICogQHBhcmFtIGRyb3Bkb3duIFRoZSBkcm9wZG93biB0byBvcGVuXHJcbiAgICAgKiBAcGFyYW0gY2FsY3VsYXRlSGVpZ2h0IFdoZXRoZXIgdG8gZG8gaGVpZ2h0IGNhbGN1bGF0aW9uXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuKGRyb3Bkb3duOiBEcm9wZG93biwgY2FsY3VsYXRlSGVpZ2h0PzogYm9vbGVhbiwgZGlzcGxheVRvU2lkZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgbGV0IGlzQ3VycmVudERyb3Bkb3duQ2hpbGRGcm9tQWN0aXZlRHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZURyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYW4gYWN0aXZlIGRyb3Bkb3duLCBhZGQgaGFuZGxlciBmb3IgYXV0byBjbG9zaW5nIHRoZSBkcm9wZG93blxyXG4gICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2tCaW5kaW5nKTtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbkRvY3VtZW50S2V5ZG93bkJpbmRpbmcpO1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25XaW5kb3dTY3JvbGxCaW5kaW5nLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5vbldpbmRvd0JsdXJCaW5kaW5nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYXNzZWQgaW4gZHJvcGRvd24gaXMgbm90IHRoZSBhY3RpdmUgZHJvcGRvd25cclxuICAgICAgICAgICAgICAgIC8vIGlmIGN1cnJlbnQgZHJvcGRvd24gaXMgdGhlIGNoaWxkIG9mIHRoZSBhY3RpdmUgZHJvcGRvd25cclxuICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBrZWVwIGJvdGggZHJvcGRvd24gb3BlbmluZ1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJvcGRvd24gIT09IGRyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJvcGRvd25Ob2RlID0gZHJvcGRvd24uY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVEcm9wZG93bkNoaWxkcmVuID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtbGF5b3V0LWRyb3Bkb3duJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZURyb3Bkb3duQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZURyb3Bkb3duQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVEcm9wZG93bkNoaWxkcmVuW2ldLmlzU2FtZU5vZGUoZHJvcGRvd25Ob2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3VycmVudERyb3Bkb3duQ2hpbGRGcm9tQWN0aXZlRHJvcGRvd24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0N1cnJlbnREcm9wZG93bkNoaWxkRnJvbUFjdGl2ZURyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJvcGRvd24uaXNPcGVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURyb3Bkb3duLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjbG9zZSB0aGUgYWN0aXZlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcm9wZG93bi5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBub3QgZnJvbSB0aGUgc2FtZSBwYXJlbnQsIGNsb3NlIHRoZSBwcmV2aW91cyBhY3RpdmUgZWxlbWVudCdzIGRpcmVjdHNcclxuICAgICAgICAgICAgLy8gdGhlbiBvcGVuIGN1cnJlbnQgYWN0aXZlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgIC8vIGlmIG5lZWQgdG8gY2xvc2UsIHRoZW4gbmVlZCB0byBjbG9zZSBmaXJzdCBhbmQgdGhlbiBvcGVuXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOZXN0ZWRPbk9wZW4oZHJvcGRvd24sIHRoaXMuYWN0aXZlRHJvcGRvd24sIGlzQ3VycmVudERyb3Bkb3duQ2hpbGRGcm9tQWN0aXZlRHJvcGRvd24pLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgZHJvcGRvd24gYXMgdGhlIG9wZW4gZHJvcGRvd25cclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJvcGRvd24gPSBkcm9wZG93bjtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJvcGRvd24uaXNPcGVuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBwdXNoIG5ldyBleHBhbmRlZCBkcm9wZG93biBjb21wb25lbnRcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZURyb3Bkb3duICYmICF0aGlzLmRyb3Bkb3duTGlzdC5pbmNsdWRlcyh0aGlzLmFjdGl2ZURyb3Bkb3duKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LnB1c2godGhpcy5hY3RpdmVEcm9wZG93bik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbihkcm9wZG93biwgY2FsY3VsYXRlSGVpZ2h0LCBkaXNwbGF5VG9TaWRlKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgYSBkcm9wZG93biBzbyB0aGF0IGl0IHJlbWFpbnMgb24gc2NyZWVuXHJcbiAgICAgKiBAcGFyYW0gZHJvcGRvd24gVGhlIGRyb3Bkb3duIHRvIHVwZGF0ZVxyXG4gICAgICogQHBhcmFtIGNhbGN1bGF0ZUhlaWdodCBEZWZpbmVzIHdoZXRoZXIgdG8gY2FsY3VsYXRlIGhlaWdodCBvZiB0aGUgZHJvcGRvd24gYmFzZWQgb24gd2luZG93IHNpemUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVQb3NpdGlvbihkcm9wZG93bjogRHJvcGRvd24sIGNhbGN1bGF0ZUhlaWdodD86IGJvb2xlYW4sIGRpc3BsYXlUb1NpZGU/OiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSAoPEhUTUxFbGVtZW50PmRyb3Bkb3duLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICAvLyByZXNldCBkcm9wZG93biBvdmVyZmxvd1xyXG4gICAgICAgIGRyb3Bkb3duLm92ZXJmbG93WCA9IGZhbHNlO1xyXG4gICAgICAgIGRyb3Bkb3duLm92ZXJmbG93WSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBSZXNldCB0aGUgY29udGVudCBoZWlnaHQgYW5kIHdpZHRoIHRoZW4gdGhlIGNvbnRlbnQuc2Nyb2xsSGVpZ2h0IGFuZCBzY3JvbGxXaWR0aCBjYW4gZ2V0IHRoZSBhY3R1YWwgY29udGVudCBkaW1lbnNpb25zXHJcbiAgICAgICAgY29udGVudEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XHJcbiAgICAgICAgY29udGVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcclxuXHJcbiAgICAgICAgY29uc3QgdG9nZ2xlUmVjdCA9ICg8SFRNTEVsZW1lbnQ+ZHJvcGRvd24udG9nZ2xlRWxlbWVudC5uYXRpdmVFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgLy8gd2UgZG9uJ3QgYWxsb3cgdGhlIGRyb3Bkb3duIHRvIGV4Y2VlZCB0aGUgaGVpZ2h0IG9yIHdpZHRoIG9mIHRoZSB3aW5kb3csIHNvIGFjY291bnQgZm9yIHRoYXQgYXMgd2VsbFxyXG4gICAgICAgIGNvbnN0IHJlY3RXaWR0aCA9IGNvbnRlbnRFbGVtZW50LnNjcm9sbFdpZHRoO1xyXG4gICAgICAgIGNvbnN0IHJlY3RIZWlnaHQgPSBjb250ZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgZHJvcGRvd25cclxuICAgICAgICB0aGlzLmRyb3Bkb3duU2V0UG9zaXRpb25MZWZ0KHRvZ2dsZVJlY3QsIGRyb3Bkb3duLCByZWN0V2lkdGgsIGRpc3BsYXlUb1NpZGUpO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkcm9wZG93blxyXG4gICAgICAgIHRoaXMuZHJvcGRvd25TZXRQb3NpdGlvblRvcCh0b2dnbGVSZWN0LCBkcm9wZG93biwgcmVjdEhlaWdodCwgY2FsY3VsYXRlSGVpZ2h0LCBkaXNwbGF5VG9TaWRlKTtcclxuXHJcbiAgICAgICAgaWYgKCFkcm9wZG93bi5kcm9wZG93bkFwcGx5Rm9ybUZpZWxkT2Zmc2V0V2lkdGgpIHtcclxuICAgICAgICAgICAgLy8gbWluLWNvbnRlbnQgd291bGQgYmUgYSBnb29kIGNob2ljZSBidXQgd29uJ3QgYmUgc3VwcG9ydGVkIGJ5IGllIG9yIGVkZ2VcclxuICAgICAgICAgICAgKDxIVE1MRWxlbWVudD5kcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KS5zdHlsZS5tYXhXaWR0aCA9ICdpbmhlcml0JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXJrcyBhIGRyb3Bkb3duIGFzIGNsb3NlZCwgaWYgdGhlIGRyb3Bkb3duIGlzIHRoZSBhY3RpdmUgZHJvcGRvd24sXHJcbiAgICAgKiB0aGUgYWN0aXZlIGRyb3Bkb3duIGlzIHJlc2V0IGFuZCBldmVudCBoYW5kbGVycyBhcmUgcmVtb3ZlZC5cclxuICAgICAqIEBwYXJhbSBkcm9wZG93biBUaGUgZHJvcGRvd24gdG8gY2xvc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsb3NlKGRyb3Bkb3duOiBEcm9wZG93biwgZXZlbnQ/OiBFdmVudHMpIHtcclxuICAgICAgICAvLyBtYXJrIHRoZSBkcm9wZG93biBhcyBjbG9zZWRcclxuICAgICAgICBkcm9wZG93bi5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAvLyByZXR1cm4gaWYgdGhlIHBhc3NlZCBpbiBkcm9wZG93biBpcyBub3QgdGhlIGFjdGl2ZSBkcm9wZG93blxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURyb3Bkb3duICE9PSBkcm9wZG93bikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZXNldCBhY3RpdmUgZHJvcGRvd24gdG8gbnVsbFxyXG4gICAgICAgIHRoaXMuYWN0aXZlRHJvcGRvd24gPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZU5lc3RlZChkcm9wZG93biwgZXZlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc3RvcCBsaXN0ZW5pbmcgdG8gZG9jdW1lbnQgZXZlbnRzIGlmIG5vIGFjdGl2ZSBkcm9wZG93blxyXG4gICAgICAgIGlmICghdGhpcy5hY3RpdmVEcm9wZG93bikge1xyXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uRG9jdW1lbnRDbGlja0JpbmRpbmcpO1xyXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25Eb2N1bWVudEtleWRvd25CaW5kaW5nKTtcclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25XaW5kb3dTY3JvbGxCaW5kaW5nLCB0cnVlKTtcclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLm9uV2luZG93Qmx1ckJpbmRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgZG9jdW1lbnQgY2xpY2tzIHdoaWxlIGEgZHJvcGRvd24gaXMgb3BlblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIC8vIHN0b3AgaWYgdGhlcmUgaXMgbm8gZHJvcGRvd25cclxuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlRHJvcGRvd24pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc3RvcCBpZiB0aGUgY2xpY2tlZCBlbGVtZW50IGlzIGFsc28gdGhlIHRvZ2dsZSBlbGVtZW50IGZvciB0aGUgYWN0aXZlIGRyb3Bkb3duXHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJvcGRvd24udG9nZ2xlRWxlbWVudCAmJiB0aGlzLmFjdGl2ZURyb3Bkb3duLnRvZ2dsZUVsZW1lbnQubmF0aXZlRWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjbGljayBvY2N1cmVkIGFuIGVsZW1lbnQgdGhhdCBpcyBpbnNpZGUgdGhlIGRyb3Bkb3duIGNvbnRlbnRcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEcm9wZG93bi5jb250ZW50RWxlbWVudCAmJlxyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURyb3Bkb3duLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG5cclxuICAgICAgICAgICAgLy8gc3RvcCBpZiB0aGUgZWxlbWVudCBpcyBhbiBlbGVtZW50IHRoYXQgaGFuZGxlcyBpbnB1dCwgcmV0dXJuXHJcbiAgICAgICAgICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KCg8YW55PmV2ZW50LnRhcmdldCkudGFnTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc3RvcCBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzIHRoZSAnc21lLWRyb3Bkb3duLWludGVyYWN0aW9uLWVuYWJsZWQnIGNsYXNzIG9uIG9uZSBvZiBpdHMgYW5jZXN0b3JzIHVwIHRvIHRoZSBjb250ZW50IGVsZW1lbnRcclxuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgICB3aGlsZSAoIXRoaXMuYWN0aXZlRHJvcGRvd24uY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5pc1NhbWVOb2RlKGVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS1kcm9wZG93bi1pbnRlcmFjdGlvbi1lbmFibGVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBvdGhlcndpc2UsIGNsb3NlIHRoZSBkcm9wZG93blxyXG4gICAgICAgIHRoaXMuY2xvc2UodGhpcy5hY3RpdmVEcm9wZG93biwgZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyBkb2N1bWVudCBrZXlkb3ducyB3aGlsZSBhIGRyb3Bkb3duIGlzIG9wZW5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkRvY3VtZW50S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIC8vIGlmIHRoZSBlc2Mga2V5IGlzIHByZXNzZWQsIGNsb3NlIHRoZSBwb3B1cCBhbmQgZm9jdXMgb24gdGhlIHRvZ2dsZSBlbGVtZW50XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuRXNjYXBlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZURyb3Bkb3duICYmIHRoaXMuYWN0aXZlRHJvcGRvd24udG9nZ2xlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBEb20uZ2V0TmV4dEZvY3VzYWJsZUVsZW1lbnQodGhpcy5hY3RpdmVEcm9wZG93bi50b2dnbGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKHRoaXMuYWN0aXZlRHJvcGRvd24pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyBkb2N1bWVudCBzY3JvbGxpbmcgd2hpbGUgYSBkcm9wZG93biBpcyBvcGVuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25XaW5kb3dTY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgLy8gc3RvcCBpZiB0aGVyZSBpcyBubyBkcm9wZG93blxyXG4gICAgICAgIGlmICghdGhpcy5hY3RpdmVEcm9wZG93bikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzY3JvbGwgb2NjdXJlZCBvbiBhbiBlbGVtZW50IHRoYXQgaXMgaW5zaWRlIHRoZSBkcm9wZG93biBjb250ZW50XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJvcGRvd24uY29udGVudEVsZW1lbnQgJiZcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVEcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBvdGhlcndpc2UsIGNsb3NlIGRyb3Bkb3duKHMpXHJcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd25MaXN0ICYmIHRoaXMuZHJvcGRvd25MaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTmVzdGVkQWxsRXhwYW5kZWREcm9wZG93bnModGhpcy5kcm9wZG93bkxpc3QpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UodGhpcy5hY3RpdmVEcm9wZG93bik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyB3aW5kb3cgYmx1cnMgd2hpbGUgYSBkcm9wZG93biBpcyBvcGVuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25XaW5kb3dCbHVyKGV2ZW50OiBGb2N1c0V2ZW50KSB7XHJcbiAgICAgICAgLy8gY2xvc2UgdGhlIGRyb3Bkb3duIGlmIHdlIGxlYXZlIHRoZSB3aW5kb3cgKHRoaXMgYWxzbyB3b3JrcyB0byBwcmV2ZW50IHRvIGNsb3NlIGRyb3Bkb3ducyBpbiBpZnJhbWVzKVxyXG4gICAgICAgIHRoaXMuY2xvc2UodGhpcy5hY3RpdmVEcm9wZG93biwgZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgICAvKipcclxuICAgICAqIEhhbmRsZXMgdGhlIHBvc2l0aW9uIGNhbGN1bGF0aW9uIGZvciB0aGUgbGVmdCBvZiB0aGUgZHJvcGRvd24gY29udGFpbmVyXHJcbiAgICAgKiBEZWNpZGVzIHdoZXRoZXIgdG8gcGxhY2UgdGhlIGRyb3Bkb3duIGxlZnQsIHJpZ2h0LCBvciBvbiB0b3Agb2YgdGhlIHRvZ2dsZSBidXR0b25cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkcm9wZG93blNldFBvc2l0aW9uTGVmdChcclxuICAgICAgICB0b2dnbGVSZWN0OiBET01SZWN0IHwgQ2xpZW50UmVjdCxcclxuICAgICAgICBkcm9wZG93bjogRHJvcGRvd24sXHJcbiAgICAgICAgcmVjdFdpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgZGlzcGxheVRvU2lkZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgLy8gbW9kaWZ5IHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSByZWN0IHRvIGFjY291bnQgZm9yIGFueSBvbGQgb2Zmc2V0XHJcbiAgICAgICAgbGV0IHJlY3RMZWZ0ID0gdG9nZ2xlUmVjdC5sZWZ0O1xyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIHZpZXdwb3J0IHdpZHRoXHJcbiAgICAgICAgY29uc3Qgd2luZG93V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuXHJcbiAgICAgICAgLy8gSWYgZGlzcGxheVRvU2lkZSBhdHRyaWJ1dGUgaXMgc2V0LCBkaXNwbGF5IGRyb3Bkb3duIHRvIHNpZGUgb2YgdG9nZ2xlUmVjdCwgZWxzZSBwbGFjZSBpdCBhYm92ZSBvciBiZWxvd1xyXG4gICAgICAgIGlmICghIWRpc3BsYXlUb1NpZGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3BhY2VMZWZ0ID0gdG9nZ2xlUmVjdC5sZWZ0O1xyXG4gICAgICAgICAgICBjb25zdCBzcGFjZVJpZ2h0ID0gd2luZG93V2lkdGggLSB0b2dnbGVSZWN0LnJpZ2h0O1xyXG5cclxuICAgICAgICAgICAgLy8gQWx3YXlzIHRyeSB0byBwdXQgZHJvcGRvd24gdG8gdGhlIGRpcmVjdGlvbiB0aGF0IGhhcyBtb3JlIHNwYWNlLiBGaXJzdCB0cnkgdG8gcHV0IG9uIHRoZSByaWdodCwgaWYgbm90IHRoZW4gcHV0IGxlZnRcclxuICAgICAgICAgICAgaWYgKHNwYWNlUmlnaHQgPj0gRHJvcGRvd25TZXJ2aWNlLm1pblNwYWNlRm9yRHJvcGRvd24gfHwgcmVjdFdpZHRoIDwgc3BhY2VSaWdodCB8fCBzcGFjZVJpZ2h0ID4gc3BhY2VMZWZ0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjdFdpZHRoID4gc3BhY2VSaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RXaWR0aCA9IHNwYWNlUmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24ub3ZlcmZsb3dYID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHNob3cgcmlnaHQgb2YgY29udHJvbFxyXG4gICAgICAgICAgICAgICAgcmVjdExlZnQgPSB0b2dnbGVSZWN0LnJpZ2h0O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlY3RXaWR0aCA8IHNwYWNlTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgLy8gc2hvdyBsZWZ0IG9mIGNvbnRyb2xcclxuICAgICAgICAgICAgICAgIHJlY3RMZWZ0ID0gdG9nZ2xlUmVjdC5sZWZ0IC0gcmVjdFdpZHRoO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgcmVjdCBpcyBiaWdnZXIgdGhhbiBzcGFjZSB0byB0aGUgbGVmdCBhbmQgdG9nZ2xlIHJlY3RhbmdsZSBjb21iaW5lZFxyXG4gICAgICAgICAgICAgICAgaWYgKHJlY3RXaWR0aCA+IHNwYWNlTGVmdCArIHRvZ2dsZVJlY3Qud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWN0V2lkdGggPSBzcGFjZUxlZnQgKyB0b2dnbGVSZWN0LndpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLm92ZXJmbG93WCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBzaG93IG9uIHRvcCBvZiBjb250cm9sXHJcbiAgICAgICAgICAgICAgICByZWN0TGVmdCA9IHRvZ2dsZVJlY3QucmlnaHQgLSByZWN0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBDYXAgd2lkdGggYW5kIGhlaWdodCB0byB0aGUgd2luZG93IGRpbWVuc2lvbnMgYW5kIHNldCBhcHByb3ByaWF0ZSBvdmVyZmxvd1xyXG4gICAgICAgICAgICBpZiAocmVjdFdpZHRoID4gd2luZG93V2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIHJlY3RXaWR0aCA9IHdpbmRvd1dpZHRoO1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd24ub3ZlcmZsb3dYID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmVjdFdpZHRoIDwgdG9nZ2xlUmVjdC53aWR0aCkge1xyXG4gICAgICAgICAgICAgICAgcmVjdFdpZHRoID0gdG9nZ2xlUmVjdC53aWR0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJlY3RMZWZ0ICsgcmVjdFdpZHRoID4gd2luZG93V2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIHJlY3RMZWZ0ID0gd2luZG93V2lkdGggLSByZWN0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlY3RMZWZ0ID0gTWF0aC5tYXgoMCwgcmVjdExlZnQpO1xyXG4gICAgICAgIGRyb3Bkb3duLmxlZnQgPSByZWN0TGVmdDtcclxuXHJcbiAgICAgICAgKDxIVE1MRWxlbWVudD5kcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KS5zdHlsZS5sZWZ0ID0gcmVjdExlZnQgKyAncHgnO1xyXG4gICAgICAgIGlmICghZHJvcGRvd24uYXV0b1dpZHRoKSB7XHJcbiAgICAgICAgICAgICg8SFRNTEVsZW1lbnQ+ZHJvcGRvd24uY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudCkuc3R5bGUud2lkdGggPSByZWN0V2lkdGggKyAncHgnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgdGhlIHBvc2l0aW9uIGNhbGN1bGF0aW9uIGZvciB0aGUgdG9wIG9mIHRoZSBkcm9wZG93biBjb250YWluZXJcclxuICAgICAqIERlY2lkZXMgd2hldGhlciB0byBwbGFjZSB0aGUgZHJvcGRvd24gYWJvdmUgb3IgYmVsb3cgdGhlIHRvZ2dsZSBidXR0b25cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkcm9wZG93blNldFBvc2l0aW9uVG9wKFxyXG4gICAgICAgIHRvZ2dsZVJlY3Q6IERPTVJlY3QgfCBDbGllbnRSZWN0LFxyXG4gICAgICAgIGRyb3Bkb3duOiBEcm9wZG93bixcclxuICAgICAgICByZWN0SGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgICAgY2FsY3VsYXRlSGVpZ2h0PzogYm9vbGVhbixcclxuICAgICAgICBkaXNwbGF5VG9TaWRlPzogYm9vbGVhbik6IHZvaWQge1xyXG5cclxuICAgICAgICAvLyBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3Igc21hbGwgaGVpZ2h0IHdpbmRvdyByZW5kZXJpbmdcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlY3RIZWlnaHQgPSByZWN0SGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBtb2RpZnkgdGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgcmVjdCB0byBhY2NvdW50IGZvciBhbnkgb2xkIG9mZnNldFxyXG4gICAgICAgIGxldCByZWN0VG9wID0gdG9nZ2xlUmVjdC5ib3R0b207XHJcblxyXG4gICAgICAgIC8vIGdldCB0aGUgdmlld3BvcnQgaGVpZ2h0XHJcbiAgICAgICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG5cclxuICAgICAgICBjb25zdCBzcGFjZUFib3ZlID0gdG9nZ2xlUmVjdC50b3A7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VCZWxvdyA9IHdpbmRvd0hlaWdodCAtIHRvZ2dsZVJlY3QuYm90dG9tO1xyXG5cclxuICAgICAgICAvLyBBbHdheXMgdHJ5IHRvIHB1dCBkcm9wZG93biB0byB0aGUgZGlyZWN0aW9uIHRoYXQgaGFzIG1vcmUgc3BhY2UuXHJcbiAgICAgICAgbGV0IHNob3VsZERpc3BsYXlpbmdBYm92ZSA9IGZhbHNlO1xyXG4gICAgICAgIC8vIEZpcnN0IHRyeSB0byBwdXQgb24gdGhlIGJvdHRvbSwgaWYgbm90IHRoZW4gcHV0IG9uIGFib3ZlXHJcbiAgICAgICAgaWYgKHNwYWNlQmVsb3cgPj0gRHJvcGRvd25TZXJ2aWNlLm1pblNwYWNlRm9yRHJvcGRvd24gfHwgcmVjdEhlaWdodCA8IHNwYWNlQmVsb3cgfHwgc3BhY2VCZWxvdyA+IHNwYWNlQWJvdmUpIHtcclxuICAgICAgICAgICAgaWYgKHJlY3RIZWlnaHQgPiBzcGFjZUJlbG93KSB7XHJcbiAgICAgICAgICAgICAgICByZWN0SGVpZ2h0ID0gc3BhY2VCZWxvdztcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duLm92ZXJmbG93WSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gc2hvdyBiZWxvdyB0aGUgY29udHJvbC5cclxuICAgICAgICAgICAgcmVjdFRvcCA9IGRpc3BsYXlUb1NpZGUgPT09IHRydWUgPyB0b2dnbGVSZWN0LnRvcCA6IHRvZ2dsZVJlY3QuYm90dG9tO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHJlY3QgaXMgYmlnZ2VyIHRoYW4gc3BhY2UgYWJvdmVcclxuICAgICAgICAgICAgaWYgKHJlY3RIZWlnaHQgPiBzcGFjZUFib3ZlKSB7XHJcbiAgICAgICAgICAgICAgICByZWN0SGVpZ2h0ID0gc3BhY2VBYm92ZTtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duLm92ZXJmbG93WSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gc2hvdyBhYm92ZSB0aGUgY29udHJvbC5cclxuICAgICAgICAgICAgcmVjdFRvcCA9IGRpc3BsYXlUb1NpZGUgPT09IHRydWUgPyB0b2dnbGVSZWN0LmJvdHRvbSAtIHJlY3RIZWlnaHQgOiB0b2dnbGVSZWN0LnRvcCAtIHJlY3RIZWlnaHQ7XHJcbiAgICAgICAgICAgIHNob3VsZERpc3BsYXlpbmdBYm92ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZWN0VG9wID0gTWF0aC5tYXgoMCwgcmVjdFRvcCk7XHJcbiAgICAgICAgZHJvcGRvd24udG9wID0gcmVjdFRvcDtcclxuXHJcbiAgICAgICAgaWYgKGNhbGN1bGF0ZUhlaWdodCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWlnaHRUb3BPYmplY3QgPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bkNhbGN1bGF0ZUhlaWdodFRvcChcclxuICAgICAgICAgICAgICAgICAgICByZWN0SGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RUb3AsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkRGlzcGxheWluZ0Fib3ZlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlQWJvdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgc3BhY2VCZWxvdyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFJlY3RIZWlnaHRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICg8SFRNTEVsZW1lbnQ+ZHJvcGRvd24uY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudCkuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0VG9wT2JqZWN0LmhlaWdodCArICdweCc7XHJcbiAgICAgICAgICAgICg8SFRNTEVsZW1lbnQ+ZHJvcGRvd24uY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudCkuc3R5bGUudG9wID0gaGVpZ2h0VG9wT2JqZWN0LnRvcCArICdweCc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgKDxIVE1MRWxlbWVudD5kcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KS5zdHlsZS5oZWlnaHQgPSByZWN0SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICAgICAgKDxIVE1MRWxlbWVudD5kcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KS5zdHlsZS50b3AgPSByZWN0VG9wICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBoZWlnaHQgY2FsY3VsYXRpb24gZm9yIHRoZSBkcm9wZG93biBjb250YWluZXJcclxuICAgICAqIEl0IGNhbGN1bGF0ZXMgYmFzZWQgb24gdGhlIGhlaWdodENhbGN1bGF0aW9uT2JqZWN0XHJcbiAgICAgKiBGaXJzdCB0cnkgdG8gcHV0IHRoZSBkcm9wZG93biBjb250YWluZXIgdG8gZGVjaWRlIHdoZXRoZXIgYSBzY3JvbGwgYmFyIGlzIG5lZWRlZFxyXG4gICAgICogVGhlbiBhcHBseSB0aGUgaGVpZ2h0IGZyb20gY2FsY3VsYXRpb25cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkcm9wZG93bkNhbGN1bGF0ZUhlaWdodFRvcChyZWN0SGVpZ2h0OiBudW1iZXIsIHJlY3RUb3A6IG51bWJlciwgc2hvdWxkRGlzcGxheWluZ0Fib3ZlOiBib29sZWFuLCB0b2dnbGVUb3A6IG51bWJlcixcclxuICAgICAgICB0b2dnbGVCb3R0b206IG51bWJlciwgb3JpZ2luYWxSZWN0SGVpZ2h0OiBudW1iZXIpOiBEcm9wZG93bkhlaWdodENhbGN1bGF0aW9uUmVzdWx0IHtcclxuICAgICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgICAgICAgbGV0IGFjdHVhbFRvcCA9IHJlY3RUb3A7XHJcbiAgICAgICAgbGV0IGFjdHVhbEhlaWdodCA9IHJlY3RIZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgdG9nZ2xlSGVpZ2h0ID0gc2hvdWxkRGlzcGxheWluZ0Fib3ZlID8gdG9nZ2xlVG9wIDogdG9nZ2xlQm90dG9tO1xyXG4gICAgICAgIGNvbnN0IHdpbmRvd0hlaWdodE1hcmdpbiA9IHRoaXMuZ2V0RHJvcGRvd25NYXJnaW4od2luZG93SGVpZ2h0KTtcclxuICAgICAgICBjb25zdCBzaG91bGRVcGRhdGVIZWlnaHQgPSB0aGlzLnNob3VsZFVwZGF0ZUhlaWdodChyZWN0SGVpZ2h0LCB0b2dnbGVIZWlnaHQsIHdpbmRvd0hlaWdodE1hcmdpbik7XHJcblxyXG4gICAgICAgIGlmIChzaG91bGRVcGRhdGVIZWlnaHQpIHtcclxuICAgICAgICAgICAgLy8gaGFuZGxlcyBzcGVjaWFsIGNhc2VzIHdoZXJlIGRyb3Bkb3duIGJvZHkgaXMgdG9vIGJpZywgdXNlIGZ1bGwgaGVpZ2h0IG1vZGVcclxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsUmVjdEhlaWdodCA+PSB0b2dnbGVIZWlnaHQgKiBEcm9wZG93blNlcnZpY2Uuc2hvdWxkVXNlRnVsbEhlaWdodERyb3Bkb3duUmF0aW8pIHtcclxuICAgICAgICAgICAgICAgIGFjdHVhbFRvcCA9IHdpbmRvd0hlaWdodE1hcmdpbjtcclxuICAgICAgICAgICAgICAgIC8vIGlmIG9yaWdpbmFsIGJvZHkgZXhjZWVkZWQgdGhlIHdob2xlIHdpbmRvdyBoZWlnaHQsIHVzZSB3aW5kb3cgaGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSBvcmlnaW5hbCBoZWlnaHRcclxuICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFJlY3RIZWlnaHQgPj0gd2luZG93SGVpZ2h0IC0gMiAqIHdpbmRvd0hlaWdodE1hcmdpbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbEhlaWdodCA9IHdpbmRvd0hlaWdodCAtIDIgKiB3aW5kb3dIZWlnaHRNYXJnaW47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbEhlaWdodCA9IG9yaWdpbmFsUmVjdEhlaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3dIZWlnaHQgPD0gdGhpcy5oZWlnaHRDYWxjdWxhdGlvbk9iamVjdC5zbWFsbC5tYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxSZWN0SGVpZ2h0ID4gd2luZG93SGVpZ2h0IC0gMiAqIHdpbmRvd0hlaWdodE1hcmdpbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZSBoZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID0gd2luZG93SGVpZ2h0IC0gMiAqIHdpbmRvd0hlaWdodE1hcmdpbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsVG9wID0gd2luZG93SGVpZ2h0TWFyZ2luO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVjdEhlaWdodCA+IHRvZ2dsZUhlaWdodCAtIHdpbmRvd0hlaWdodE1hcmdpbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IGZyb20gdG9wLCB3aWxsIGNvdmVyIHBhcnQgb2YgdGhlIGlucHV0IGJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQgPSByZWN0SGVpZ2h0IC0gd2luZG93SGVpZ2h0TWFyZ2luO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxUb3AgPSB3aW5kb3dIZWlnaHRNYXJnaW47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjYW4gYmUgb25seSBkaXNwbGF5ZWQgYXMgYmVsb3cgb3IgYWJvdmUgaW4gYmlnZ2VyIHNjcmVlblxyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbEhlaWdodCA9IHJlY3RIZWlnaHQgLSB3aW5kb3dIZWlnaHRNYXJnaW47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzaG91bGREaXNwbGF5aW5nQWJvdmUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0b2dnbGVUb3AgPiBhY3R1YWxIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3R1YWxUb3AgPSB0b2dnbGVUb3AgLSBhY3R1YWxIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRvcDogYWN0dWFsVG9wLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGFjdHVhbEhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHdoZXRoZXIgc2hvdWxkIHVwZGF0ZSB0aGUgaGVpZ2h0IHBpeGVscyBmb3IgdGhlIGRyb3Bkb3duXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2hvdWxkVXBkYXRlSGVpZ2h0KHJlY3RIZWlnaHQ6IG51bWJlciwgdG9nZ2xlSGVpZ2h0OiBudW1iZXIsIHdpbmRvd0hlaWdodE1hcmdpbjogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHJlcyA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0b2dnbGVIZWlnaHQgLSByZWN0SGVpZ2h0IDwgd2luZG93SGVpZ2h0TWFyZ2luKSB7XHJcbiAgICAgICAgICAgIHJlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgZHJvcGRvd24gbWFyZ2luIGJhc2Ugb24gdGhlIGNhbGN1bGF0aW9uIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldERyb3Bkb3duTWFyZ2luKHdpbmRvd0hlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHdpbmRvd0hlaWdodE1hcmdpbiA9IDA7XHJcbiAgICAgICAgaWYgKHdpbmRvd0hlaWdodCA8PSB0aGlzLmhlaWdodENhbGN1bGF0aW9uT2JqZWN0LnNtYWxsLm1heCkge1xyXG4gICAgICAgICAgICB3aW5kb3dIZWlnaHRNYXJnaW4gPSB0aGlzLmhlaWdodENhbGN1bGF0aW9uT2JqZWN0LnNtYWxsLm1hcmdpbjtcclxuICAgICAgICB9IGVsc2UgaWYgKHdpbmRvd0hlaWdodCA+PSB0aGlzLmhlaWdodENhbGN1bGF0aW9uT2JqZWN0Lm1lZGl1bS5taW4gJiYgd2luZG93SGVpZ2h0IDw9IHRoaXMuaGVpZ2h0Q2FsY3VsYXRpb25PYmplY3QubWVkaXVtLm1heCkge1xyXG4gICAgICAgICAgICB3aW5kb3dIZWlnaHRNYXJnaW4gPSB0aGlzLmhlaWdodENhbGN1bGF0aW9uT2JqZWN0Lm1lZGl1bS5tYXJnaW47XHJcbiAgICAgICAgfSBlbHNlIGlmICh3aW5kb3dIZWlnaHQgPj0gdGhpcy5oZWlnaHRDYWxjdWxhdGlvbk9iamVjdC5sYXJnZS5taW4pIHtcclxuICAgICAgICAgICAgd2luZG93SGVpZ2h0TWFyZ2luID0gdGhpcy5oZWlnaHRDYWxjdWxhdGlvbk9iamVjdC5sYXJnZS5tYXJnaW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB3aW5kb3dIZWlnaHRNYXJnaW47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWFsIHdpdGggbmVzdGVkIGNsb3NlIGZvciBkcm9wZG93blxyXG4gICAgICogQHBhcmFtIGRyb3Bkb3duIHRoZSBhY3RpdmUgZHJvcGRvd25cclxuICAgICAqIEBwYXJhbSBldmVudCBjb250YWlucyB0aGUgY3VycmVudCBldmVudCB0YXJnZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsb3NlTmVzdGVkKGRyb3Bkb3duOiBEcm9wZG93biwgZXZlbnQ6IEV2ZW50cykge1xyXG4gICAgICAgIGlmIChkcm9wZG93biAmJiBldmVudCkge1xyXG4gICAgICAgICAgICBsZXQgZXZlbnRUYXJnZXQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgICAvLyBhc3NpZ24gYWN0aXZlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duTGlzdCAmJiB0aGlzLmRyb3Bkb3duTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudFRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudFRhcmdldC5jbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFldmVudFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJy5zbWUtbGF5b3V0LWRyb3Bkb3duJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VGFyZ2V0ID0gRG9tLmdldEFuY2VzdG9yKGV2ZW50VGFyZ2V0LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtbGF5b3V0LWRyb3Bkb3duJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBoYW5kbGVzIHdoZW4gdGhlIGV2ZW50IHRhcmdldCBpcyBXaW5kb3cgb2JqZWN0IHRoYXQgZG9lcyd0IGNvbnRhaW5zIGV2ZW50LnRhcmdldFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFRhcmdldCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUYXJnZXQuaGFzT3duUHJvcGVydHkoJ3F1ZXJ5U2VsZWN0b3InKSAmJiBldmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCdzbWUtZHJvcGRvd24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VGFyZ2V0ID0gZXZlbnRUYXJnZXQucXVlcnlTZWxlY3Rvcignc21lLWRyb3Bkb3duJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGFjdGl2ZURyb3Bkb3duID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudFRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmRyb3Bkb3duTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZCA9IHRoaXMuZHJvcGRvd25MaXN0W2luZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudCA9PT0gZXZlbnRUYXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURyb3Bkb3duID0gZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcm9wZG93biA9IGFjdGl2ZURyb3Bkb3duO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGNsb3NlIGRyb3AtZG93bnNcclxuICAgICAgICAgICAgaWYgKGV2ZW50VGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcm9wZG93bnNJbkV2ZW50UmVnaW9uID0gZXZlbnRUYXJnZXQucXVlcnlTZWxlY3RvckFsbCgnc21lLWRyb3Bkb3duIC5zbWUtZHJvcGRvd24tdG9nZ2xlLWNvbnRhaW5lcicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duc0luRXZlbnRSZWdpb24gJiYgZHJvcGRvd25zSW5FdmVudFJlZ2lvbi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBhbGwgY2hpbGRyZW4gZHJvcGRvd25zXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIG9ubHkgcmVmZXIgdG8gVUkgbGV2ZWwgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLCBub3QgdGhlIGNvbXBvbmVudC5cclxuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bnNJbkV2ZW50UmVnaW9uLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2Nsb3NlRXZlbnQnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgYWxsIGV4cGFuZGVkIGRyb3Bkb3duc1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VOZXN0ZWRBbGxFeHBhbmRlZERyb3Bkb3ducyh0aGlzLmRyb3Bkb3duTGlzdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcm9wZG93biA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjbG9zZSBhbGwgZXhwYW5kZWQgZHJvcGRvd25zXHJcbiAgICAgICAgICAgICAgICAvLyBjbG9zZSBjaGlsZCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZU5lc3RlZEFsbEV4cGFuZGVkRHJvcGRvd25zKHRoaXMuZHJvcGRvd25MaXN0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJvcGRvd24gPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgY2xvc2luZyBhbGwgdGhlIGV4cGFuZGVkIGRyb3Bkb3duc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNsb3NlTmVzdGVkQWxsRXhwYW5kZWREcm9wZG93bnMoZHJvcGRvd25MaXN0OiBBcnJheTxEcm9wZG93bj4pIHtcclxuICAgICAgICBpZiAoZHJvcGRvd25MaXN0ICYmIGRyb3Bkb3duTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGRyb3Bkb3duTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRyb3Bkb3duTGlzdFtpXTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBlbGVtZW50LmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBjbG9zZSB0aGUgb25lcyBkaXNwbGF5aW5nXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmNsYXNzTGlzdC5jb250YWlucygnc21lLWxheW91dC1oaWRkZW4nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTmVzdGVkSGVscGVyKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAWWllbGQoKVxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIGNsb3NpbmcgdGhlIGRyb3Bkb3duIGZyb20gdGhlIGNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNsb3NlTmVzdGVkSGVscGVyKGRyb3Bkb3duOiBEcm9wZG93bikge1xyXG4gICAgICAgIGlmIChkcm9wZG93bikge1xyXG4gICAgICAgICAgICBkcm9wZG93bi5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHdoZW4gb3BlbmluZyBhIGRyb3Bkb3duIHdoZW4gb3RoZXIgZHJvcGRvd24ocykgaXMvYXJlIG9wZW5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjbG9zZU5lc3RlZE9uT3BlbihjdXJyZW50RHJvcGRvd246IERyb3Bkb3duLCBwcmV2aW91c0Ryb3Bkb3duOiBEcm9wZG93biwgaXNDdXJyZW50RHJvcGRvd25DaGlsZEZyb21BY3RpdmVEcm9wZG93bjogYm9vbGVhbik6XHJcbiAgICAgICAgUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpc0N1cnJlbnREcm9wZG93bkNoaWxkRnJvbUFjdGl2ZURyb3Bkb3duIHx8ICF0aGlzLmRyb3Bkb3duTGlzdCB8fCAhdGhpcy5kcm9wZG93bkxpc3QubGVuZ3RoIHx8ICFwcmV2aW91c0Ryb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0Zyb21TYW1lUGFyZW50ID0gdGhpcy5pc0Zyb21TYW1lUGFyZW50KGN1cnJlbnREcm9wZG93biwgcHJldmlvdXNEcm9wZG93bik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RHJvcGRvd25Ob2RlID0gY3VycmVudERyb3Bkb3duLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0Ryb3Bkb3duTm9kZSA9IHByZXZpb3VzRHJvcGRvd24uY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBEb207XHJcbiAgICAgICAgICAgICAgICAvLyBmaW5kIGlmIHRoZXJlIGFyZSBpbnRlcnNlY3Rpb24gb24gcGFyZW50IG5vZGUuIEFuZCBjbG9zZSB0aWxsIHRoYXQgbGV2ZWwuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiBubyBpbnRlcnNlY3Rpb24sIGNsb3NlIHRoZSBwcmV2aW91cyBhY3RpdmUgZHJvcGRvd24gb25lIGJ5IG9uZS5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQWN0aXZlRHJvcGRvd25zID0gdGhpcy5kcm9wZG93bkxpc3Q7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGcm9tU2FtZVBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENsb3NlRHJvcGRvd25zID0gcHJldmlvdXNBY3RpdmVEcm9wZG93bnMuZmlsdGVyKChkcm9wZG93bikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxDaGlsZHJlbiA9IGQuZ2V0QWxsRWxlbWVudHMoZHJvcGRvd24uY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS1sYXlvdXQtZHJvcGRvd24nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxDaGlsZHJlbi5pbmNsdWRlcyhwcmV2aW91c0Ryb3Bkb3duTm9kZSkgJiYgYWxsQ2hpbGRyZW4uaW5jbHVkZXMoY3VycmVudERyb3Bkb3duTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTmVzdGVkQWxsRXhwYW5kZWREcm9wZG93bnMoc2hvdWxkQ2xvc2VEcm9wZG93bnMpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTmVzdGVkQWxsRXhwYW5kZWREcm9wZG93bnModGhpcy5kcm9wZG93bkxpc3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHdoZXRoZXIgdHdvIGRyb3Bkb3ducyBhcmUgZnJvbSB0aGUgc2FtZSBwYXJlbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc0Zyb21TYW1lUGFyZW50KGN1cnJlbnREcm9wZG93bjogRHJvcGRvd24sIFByZXZpb3VzRHJvcGRvd246IERyb3Bkb3duKSB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudERyb3Bkb3duTm9kZSA9IGN1cnJlbnREcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRHJvcGRvd25Ob2RlID0gUHJldmlvdXNEcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGQgPSBEb207XHJcbiAgICAgICAgY29uc3QgY3VycmVudERyb3Bkb3duTm9kZVBhcmVudHMgPSBkLmdldEFsbEFuY2VzdG9ycyhjdXJyZW50RHJvcGRvd25Ob2RlLFxyXG4gICAgICAgICAgICBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtbGF5b3V0LWRyb3Bkb3duJykpO1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRHJvcGRvd25Ob2RlUGFyZW50cyA9IGQuZ2V0QWxsQW5jZXN0b3JzKHByZXZpb3VzRHJvcGRvd25Ob2RlLFxyXG4gICAgICAgICAgICBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtbGF5b3V0LWRyb3Bkb3duJykpO1xyXG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnREcm9wZG93bk5vZGVQYXJlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlFbGVtZW50ID0gY3VycmVudERyb3Bkb3duTm9kZVBhcmVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcHJldmlvdXNEcm9wZG93bk5vZGVQYXJlbnRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBqRWxlbWVudCA9IHByZXZpb3VzRHJvcGRvd25Ob2RlUGFyZW50c1tqXTtcclxuICAgICAgICAgICAgICAgIGlmIChpRWxlbWVudC5pc1NhbWVOb2RlKGpFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
573
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2Ryb3Bkb3duL2Ryb3Bkb3duLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUM5RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0RBQWtELENBQUM7O0FBT3ZFOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQU41QjtRQWFZLDJCQUFzQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELDZCQUF3QixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0QsMEJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0Q7O1dBRUc7UUFDSyxpQkFBWSxHQUFvQixFQUFFLENBQUM7UUFDM0MsMEVBQTBFO1FBQzFFLHVFQUF1RTtRQUMvRCw0QkFBdUIsR0FBb0M7WUFDL0QsS0FBSyxFQUFFO2dCQUNILCtDQUErQztnQkFDL0MscUNBQXFDO2dCQUNyQyxHQUFHLEVBQUUsR0FBRztnQkFDUixNQUFNLEVBQUUsQ0FBQztnQkFDVCxXQUFXLEVBQUUsSUFBSTthQUNwQjtZQUNELE1BQU0sRUFBRTtnQkFDSiw4Q0FBOEM7Z0JBQzlDLHFDQUFxQztnQkFDckMsR0FBRyxFQUFFLEdBQUc7Z0JBQ1Is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LEdBQUcsQ0FBQyxDQUFDO2lHQUwzQyxlQUFlOzBFQUFmLGVBQWUsV0FBZixlQUFlO0FBb2lCeEI7SUFKQyxLQUFLLEVBQUU7Ozs7d0RBUVA7dUZBeGlCUSxlQUFlO2NBTjNCLFVBQVU7Z0JBMGlCQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFlpZWxkIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RlY29yYXRvcnMveWllbGQuZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgS2V5Q29kZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9hY2Nlc3NpYmlsaXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb20gfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RvbS9kb20nO1xyXG5pbXBvcnQgeyBEcm9wZG93biB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgRHJvcGRvd25IZWlnaHRDYWxjdWxhdGlvblJlc3VsdCB9IGZyb20gJy4vbW9kZWxzL2Ryb3Bkb3duLWhlaWdodC1jYWxjdWxhdGlvbi1yZXN1bHQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bkhlaWdodENhbGN1bGF0aW9uU2NoZW1hIH0gZnJvbSAnLi9tb2RlbHMvZHJvcGRvd24taGVpZ2h0LXNjaGVtYSc7XHJcblxyXG5leHBvcnQgdHlwZSBFdmVudHMgPSBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCB8IEZvY3VzRXZlbnQ7XHJcbkBJbmplY3RhYmxlKClcclxuLyoqXHJcbiAqIFNlcnZpY2UgZm9yIG1haW50YWluaW5nIGRyb3Bkb3duIHN0YXRlLlxyXG4gKiBPbmx5IG9uZSBkcm9wZG93biBjYW4gYmUgb3BlbmVkIGF0IGEgdGltZS5cclxuICogVGhpcyBkb2VzIG5vdCBzdXBwb3J0IG5lc3RlZCBkcm9wZG93bnMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25TZXJ2aWNlIHtcclxuICAgIC8vIE1pbmltdW0gc3BhY2UgYWJvdmUgb3IgYmVsb3cgdGhlIGRyb3Bkb3duIHRvIGRldGVybWluZSBwb3NpdGlvbmluZy5cclxuICAgIHByaXZhdGUgc3RhdGljIG1pblNwYWNlRm9yRHJvcGRvd24gPSAzMDA7XHJcbiAgICAvLyBJZiB0aGUgb3JpZ2luYWwgaGVpZ2h0IGZvciB0aGUgd2hvbGUgZHJvcGRvd24gaXMgMiB0aW1lcyB0aGUgYXZhaWxhYmxlIHNwYWNlXHJcbiAgICAvLyBzaG91bGQgZGlzcGxheSBhcyBmdWxsIGhlaWdodFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2hvdWxkVXNlRnVsbEhlaWdodERyb3Bkb3duUmF0aW8gPSAyO1xyXG5cclxuICAgIHByaXZhdGUgb25Eb2N1bWVudENsaWNrQmluZGluZyA9IHRoaXMub25Eb2N1bWVudENsaWNrLmJpbmQodGhpcyk7XHJcbiAgICBwcml2YXRlIG9uRG9jdW1lbnRLZXlkb3duQmluZGluZyA9IHRoaXMub25Eb2N1bWVudEtleWRvd24uYmluZCh0aGlzKTtcclxuICAgIHByaXZhdGUgb25XaW5kb3dTY3JvbGxCaW5kaW5nID0gdGhpcy5vbldpbmRvd1Njcm9sbC5iaW5kKHRoaXMpO1xyXG4gICAgcHJpdmF0ZSBvbldpbmRvd0JsdXJCaW5kaW5nID0gdGhpcy5vbldpbmRvd0JsdXIuYmluZCh0aGlzKTtcclxuICAgIHByaXZhdGUgYWN0aXZlRHJvcGRvd246IERyb3Bkb3duO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIHNhdmVzIHRoZSByZWNvcmRzIGZvciB0aGUgbGFzdCBvcGVuZWQgZHJvcGRvd25zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZHJvcGRvd25MaXN0OiBBcnJheTxEcm9wZG93bj4gPSBbXTtcclxuICAgIC8vIEl0IGRlZmluZXMgdGhlIGhlaWdodCBmb3IgdGhlIGRyb3Bkb3duIHdpdGggdGhlIHNwZWNpZmljIHdpbmRvdyBoZWlnaHQuXHJcbiAgICAvLyBUaGlzIHdpbGwgYmUgZW5hYmxlZCBvbmx5IGlmIDxzbWUtZHJvcGRvd24gW2NhbGN1bGF0ZUhlaWdodF09XCJ0cnVlXCI+XHJcbiAgICBwcml2YXRlIGhlaWdodENhbGN1bGF0aW9uT2JqZWN0OiBEcm9wZG93bkhlaWdodENhbGN1bGF0aW9uU2NoZW1hID0ge1xyXG4gICAgICAgIHNtYWxsOiB7XHJcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIHdpbmRvdyBoZWlnaHQgaXMgc21hbGxlciB0aGFuIDMwMHB4XHJcbiAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCBtYXJnaW4gdG9wIGFuZCBib3R0b21cclxuICAgICAgICAgICAgbWF4OiAzMDAsXHJcbiAgICAgICAgICAgIG1hcmdpbjogNSxcclxuICAgICAgICAgICAgd2hvbGVIZWlnaHQ6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIG1lZGl1bToge1xyXG4gICAgICAgICAgICAvLyB3aGVuIHRoZW4gd2luZG93IGhlaWdodCBpcyB3aXRoaW4gWzMwMSw1MDBdXHJcbiAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCBtYXJnaW4gdG9wIGFuZCBib3R0b21cclxuICAgICAgICAgICAgbWluOiAzMDAsXHJcbiAgICAgICAgICAgIG1heDogNTAwLFxyXG4gICAgICAgICAgICBtYXJnaW46IDEwXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsYXJnZToge1xyXG4gICAgICAgICAgICAvLyB3aGVuIHRoZW4gd2luZG93IGhlaWdodCBpcyBncmVhdGVyIHRoYW4gNTAwcHhcclxuICAgICAgICAgICAgLy8gVGhlIHNtYWxsZXN0IG1hcmdpbiB0b3AgYW5kIGJvdHRvbVxyXG4gICAgICAgICAgICBtaW46IDUwMCxcclxuICAgICAgICAgICAgbWFyZ2luOiAyMFxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBvcGVucyBhIGRyb3Bkb3duIGFuZCBzZXRzIGl0IHRvIGFjdGl2ZVxyXG4gICAgICogQHBhcmFtIGRyb3Bkb3duIFRoZSBkcm9wZG93biB0byBvcGVuXHJcbiAgICAgKiBAcGFyYW0gY2FsY3VsYXRlSGVpZ2h0IFdoZXRoZXIgdG8gZG8gaGVpZ2h0IGNhbGN1bGF0aW9uXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuKGRyb3Bkb3duOiBEcm9wZG93biwgY2FsY3VsYXRlSGVpZ2h0PzogYm9vbGVhbiwgZGlzcGxheVRvU2lkZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgbGV0IGlzQ3VycmVudERyb3Bkb3duQ2hpbGRGcm9tQWN0aXZlRHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZURyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYW4gYWN0aXZlIGRyb3Bkb3duLCBhZGQgaGFuZGxlciBmb3IgYXV0byBjbG9zaW5nIHRoZSBkcm9wZG93blxyXG4gICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2tCaW5kaW5nKTtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbkRvY3VtZW50S2V5ZG93bkJpbmRpbmcpO1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25XaW5kb3dTY3JvbGxCaW5kaW5nLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5vbldpbmRvd0JsdXJCaW5kaW5nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYXNzZWQgaW4gZHJvcGRvd24gaXMgbm90IHRoZSBhY3RpdmUgZHJvcGRvd25cclxuICAgICAgICAgICAgICAgIC8vIGlmIGN1cnJlbnQgZHJvcGRvd24gaXMgdGhlIGNoaWxkIG9mIHRoZSBhY3RpdmUgZHJvcGRvd25cclxuICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBrZWVwIGJvdGggZHJvcGRvd24gb3BlbmluZ1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJvcGRvd24gIT09IGRyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJvcGRvd25Ob2RlID0gZHJvcGRvd24uY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVEcm9wZG93bkNoaWxkcmVuID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtbGF5b3V0LWRyb3Bkb3duJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZURyb3Bkb3duQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZURyb3Bkb3duQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVEcm9wZG93bkNoaWxkcmVuW2ldLmlzU2FtZU5vZGUoZHJvcGRvd25Ob2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3VycmVudERyb3Bkb3duQ2hpbGRGcm9tQWN0aXZlRHJvcGRvd24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0N1cnJlbnREcm9wZG93bkNoaWxkRnJvbUFjdGl2ZURyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJvcGRvd24uaXNPcGVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURyb3Bkb3duLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjbG9zZSB0aGUgYWN0aXZlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcm9wZG93bi5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBub3QgZnJvbSB0aGUgc2FtZSBwYXJlbnQsIGNsb3NlIHRoZSBwcmV2aW91cyBhY3RpdmUgZWxlbWVudCdzIGRpcmVjdHNcclxuICAgICAgICAgICAgLy8gdGhlbiBvcGVuIGN1cnJlbnQgYWN0aXZlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgIC8vIGlmIG5lZWQgdG8gY2xvc2UsIHRoZW4gbmVlZCB0byBjbG9zZSBmaXJzdCBhbmQgdGhlbiBvcGVuXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOZXN0ZWRPbk9wZW4oZHJvcGRvd24sIHRoaXMuYWN0aXZlRHJvcGRvd24sIGlzQ3VycmVudERyb3Bkb3duQ2hpbGRGcm9tQWN0aXZlRHJvcGRvd24pLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgZHJvcGRvd24gYXMgdGhlIG9wZW4gZHJvcGRvd25cclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJvcGRvd24gPSBkcm9wZG93bjtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJvcGRvd24uaXNPcGVuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBwdXNoIG5ldyBleHBhbmRlZCBkcm9wZG93biBjb21wb25lbnRcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZURyb3Bkb3duICYmICF0aGlzLmRyb3Bkb3duTGlzdC5pbmNsdWRlcyh0aGlzLmFjdGl2ZURyb3Bkb3duKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LnB1c2godGhpcy5hY3RpdmVEcm9wZG93bik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbihkcm9wZG93biwgY2FsY3VsYXRlSGVpZ2h0LCBkaXNwbGF5VG9TaWRlKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgYSBkcm9wZG93biBzbyB0aGF0IGl0IHJlbWFpbnMgb24gc2NyZWVuXHJcbiAgICAgKiBAcGFyYW0gZHJvcGRvd24gVGhlIGRyb3Bkb3duIHRvIHVwZGF0ZVxyXG4gICAgICogQHBhcmFtIGNhbGN1bGF0ZUhlaWdodCBEZWZpbmVzIHdoZXRoZXIgdG8gY2FsY3VsYXRlIGhlaWdodCBvZiB0aGUgZHJvcGRvd24gYmFzZWQgb24gd2luZG93IHNpemUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVQb3NpdGlvbihkcm9wZG93bjogRHJvcGRvd24sIGNhbGN1bGF0ZUhlaWdodD86IGJvb2xlYW4sIGRpc3BsYXlUb1NpZGU/OiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSAoPEhUTUxFbGVtZW50PmRyb3Bkb3duLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICAvLyByZXNldCBkcm9wZG93biBvdmVyZmxvd1xyXG4gICAgICAgIGRyb3Bkb3duLm92ZXJmbG93WCA9IGZhbHNlO1xyXG4gICAgICAgIGRyb3Bkb3duLm92ZXJmbG93WSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBSZXNldCB0aGUgY29udGVudCBoZWlnaHQgYW5kIHdpZHRoIHRoZW4gdGhlIGNvbnRlbnQuc2Nyb2xsSGVpZ2h0IGFuZCBzY3JvbGxXaWR0aCBjYW4gZ2V0IHRoZSBhY3R1YWwgY29udGVudCBkaW1lbnNpb25zXHJcbiAgICAgICAgY29udGVudEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XHJcbiAgICAgICAgY29udGVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcclxuXHJcbiAgICAgICAgY29uc3QgdG9nZ2xlUmVjdCA9ICg8SFRNTEVsZW1lbnQ+ZHJvcGRvd24udG9nZ2xlRWxlbWVudC5uYXRpdmVFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgLy8gd2UgZG9uJ3QgYWxsb3cgdGhlIGRyb3Bkb3duIHRvIGV4Y2VlZCB0aGUgaGVpZ2h0IG9yIHdpZHRoIG9mIHRoZSB3aW5kb3csIHNvIGFjY291bnQgZm9yIHRoYXQgYXMgd2VsbFxyXG4gICAgICAgIGNvbnN0IHJlY3RXaWR0aCA9IGNvbnRlbnRFbGVtZW50LnNjcm9sbFdpZHRoO1xyXG4gICAgICAgIGNvbnN0IHJlY3RIZWlnaHQgPSBjb250ZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgZHJvcGRvd25cclxuICAgICAgICB0aGlzLmRyb3Bkb3duU2V0UG9zaXRpb25MZWZ0KHRvZ2dsZVJlY3QsIGRyb3Bkb3duLCByZWN0V2lkdGgsIGRpc3BsYXlUb1NpZGUpO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkcm9wZG93blxyXG4gICAgICAgIHRoaXMuZHJvcGRvd25TZXRQb3NpdGlvblRvcCh0b2dnbGVSZWN0LCBkcm9wZG93biwgcmVjdEhlaWdodCwgY2FsY3VsYXRlSGVpZ2h0LCBkaXNwbGF5VG9TaWRlKTtcclxuXHJcbiAgICAgICAgaWYgKCFkcm9wZG93bi5kcm9wZG93bkFwcGx5Rm9ybUZpZWxkT2Zmc2V0V2lkdGgpIHtcclxuICAgICAgICAgICAgLy8gbWluLWNvbnRlbnQgd291bGQgYmUgYSBnb29kIGNob2ljZSBidXQgd29uJ3QgYmUgc3VwcG9ydGVkIGJ5IGllIG9yIGVkZ2VcclxuICAgICAgICAgICAgKDxIVE1MRWxlbWVudD5kcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KS5zdHlsZS5tYXhXaWR0aCA9ICdpbmhlcml0JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXJrcyBhIGRyb3Bkb3duIGFzIGNsb3NlZCwgaWYgdGhlIGRyb3Bkb3duIGlzIHRoZSBhY3RpdmUgZHJvcGRvd24sXHJcbiAgICAgKiB0aGUgYWN0aXZlIGRyb3Bkb3duIGlzIHJlc2V0IGFuZCBldmVudCBoYW5kbGVycyBhcmUgcmVtb3ZlZC5cclxuICAgICAqIEBwYXJhbSBkcm9wZG93biBUaGUgZHJvcGRvd24gdG8gY2xvc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsb3NlKGRyb3Bkb3duOiBEcm9wZG93biwgZXZlbnQ/OiBFdmVudHMpIHtcclxuICAgICAgICAvLyBtYXJrIHRoZSBkcm9wZG93biBhcyBjbG9zZWRcclxuICAgICAgICBkcm9wZG93bi5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAvLyByZXR1cm4gaWYgdGhlIHBhc3NlZCBpbiBkcm9wZG93biBpcyBub3QgdGhlIGFjdGl2ZSBkcm9wZG93blxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURyb3Bkb3duICE9PSBkcm9wZG93bikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZXNldCBhY3RpdmUgZHJvcGRvd24gdG8gbnVsbFxyXG4gICAgICAgIHRoaXMuYWN0aXZlRHJvcGRvd24gPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZU5lc3RlZChkcm9wZG93biwgZXZlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc3RvcCBsaXN0ZW5pbmcgdG8gZG9jdW1lbnQgZXZlbnRzIGlmIG5vIGFjdGl2ZSBkcm9wZG93blxyXG4gICAgICAgIGlmICghdGhpcy5hY3RpdmVEcm9wZG93bikge1xyXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uRG9jdW1lbnRDbGlja0JpbmRpbmcpO1xyXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25Eb2N1bWVudEtleWRvd25CaW5kaW5nKTtcclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25XaW5kb3dTY3JvbGxCaW5kaW5nLCB0cnVlKTtcclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLm9uV2luZG93Qmx1ckJpbmRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgZG9jdW1lbnQgY2xpY2tzIHdoaWxlIGEgZHJvcGRvd24gaXMgb3BlblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIC8vIHN0b3AgaWYgdGhlcmUgaXMgbm8gZHJvcGRvd25cclxuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlRHJvcGRvd24pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc3RvcCBpZiB0aGUgY2xpY2tlZCBlbGVtZW50IGlzIGFsc28gdGhlIHRvZ2dsZSBlbGVtZW50IGZvciB0aGUgYWN0aXZlIGRyb3Bkb3duXHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJvcGRvd24udG9nZ2xlRWxlbWVudCAmJiB0aGlzLmFjdGl2ZURyb3Bkb3duLnRvZ2dsZUVsZW1lbnQubmF0aXZlRWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjbGljayBvY2N1cmVkIGFuIGVsZW1lbnQgdGhhdCBpcyBpbnNpZGUgdGhlIGRyb3Bkb3duIGNvbnRlbnRcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEcm9wZG93bi5jb250ZW50RWxlbWVudCAmJlxyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURyb3Bkb3duLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG5cclxuICAgICAgICAgICAgLy8gc3RvcCBpZiB0aGUgZWxlbWVudCBpcyBhbiBlbGVtZW50IHRoYXQgaGFuZGxlcyBpbnB1dCwgcmV0dXJuXHJcbiAgICAgICAgICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KCg8YW55PmV2ZW50LnRhcmdldCkudGFnTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc3RvcCBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzIHRoZSAnc21lLWRyb3Bkb3duLWludGVyYWN0aW9uLWVuYWJsZWQnIGNsYXNzIG9uIG9uZSBvZiBpdHMgYW5jZXN0b3JzIHVwIHRvIHRoZSBjb250ZW50IGVsZW1lbnRcclxuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgICB3aGlsZSAoIXRoaXMuYWN0aXZlRHJvcGRvd24uY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5pc1NhbWVOb2RlKGVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS1kcm9wZG93bi1pbnRlcmFjdGlvbi1lbmFibGVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBvdGhlcndpc2UsIGNsb3NlIHRoZSBkcm9wZG93blxyXG4gICAgICAgIHRoaXMuY2xvc2UodGhpcy5hY3RpdmVEcm9wZG93biwgZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyBkb2N1bWVudCBrZXlkb3ducyB3aGlsZSBhIGRyb3Bkb3duIGlzIG9wZW5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkRvY3VtZW50S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIC8vIGlmIHRoZSBlc2Mga2V5IGlzIHByZXNzZWQsIGNsb3NlIHRoZSBwb3B1cCBhbmQgZm9jdXMgb24gdGhlIHRvZ2dsZSBlbGVtZW50XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuRXNjYXBlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZURyb3Bkb3duICYmIHRoaXMuYWN0aXZlRHJvcGRvd24udG9nZ2xlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZG9jRWxlbWVudCA9IHRoaXMuYWN0aXZlRHJvcGRvd24udG9nZ2xlRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBEb20uZ2V0Rmlyc3RGb2N1c2FibGVEZXNjZW5kZW50KGRvY0VsZW1lbnQpIHx8IERvbS5nZXROZXh0Rm9jdXNhYmxlRWxlbWVudChkb2NFbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKHRoaXMuYWN0aXZlRHJvcGRvd24pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyBkb2N1bWVudCBzY3JvbGxpbmcgd2hpbGUgYSBkcm9wZG93biBpcyBvcGVuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25XaW5kb3dTY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgLy8gc3RvcCBpZiB0aGVyZSBpcyBubyBkcm9wZG93blxyXG4gICAgICAgIGlmICghdGhpcy5hY3RpdmVEcm9wZG93bikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzY3JvbGwgb2NjdXJlZCBvbiBhbiBlbGVtZW50IHRoYXQgaXMgaW5zaWRlIHRoZSBkcm9wZG93biBjb250ZW50XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJvcGRvd24uY29udGVudEVsZW1lbnQgJiZcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVEcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBvdGhlcndpc2UsIGNsb3NlIGRyb3Bkb3duKHMpXHJcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd25MaXN0ICYmIHRoaXMuZHJvcGRvd25MaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTmVzdGVkQWxsRXhwYW5kZWREcm9wZG93bnModGhpcy5kcm9wZG93bkxpc3QpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UodGhpcy5hY3RpdmVEcm9wZG93bik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyB3aW5kb3cgYmx1cnMgd2hpbGUgYSBkcm9wZG93biBpcyBvcGVuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25XaW5kb3dCbHVyKGV2ZW50OiBGb2N1c0V2ZW50KSB7XHJcbiAgICAgICAgLy8gY2xvc2UgdGhlIGRyb3Bkb3duIGlmIHdlIGxlYXZlIHRoZSB3aW5kb3cgKHRoaXMgYWxzbyB3b3JrcyB0byBwcmV2ZW50IHRvIGNsb3NlIGRyb3Bkb3ducyBpbiBpZnJhbWVzKVxyXG4gICAgICAgIHRoaXMuY2xvc2UodGhpcy5hY3RpdmVEcm9wZG93biwgZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBIYW5kbGVzIHRoZSBwb3NpdGlvbiBjYWxjdWxhdGlvbiBmb3IgdGhlIGxlZnQgb2YgdGhlIGRyb3Bkb3duIGNvbnRhaW5lclxyXG4gICAgKiBEZWNpZGVzIHdoZXRoZXIgdG8gcGxhY2UgdGhlIGRyb3Bkb3duIGxlZnQsIHJpZ2h0LCBvciBvbiB0b3Agb2YgdGhlIHRvZ2dsZSBidXR0b25cclxuICAgICovXHJcbiAgICBwcml2YXRlIGRyb3Bkb3duU2V0UG9zaXRpb25MZWZ0KFxyXG4gICAgICAgIHRvZ2dsZVJlY3Q6IERPTVJlY3QgfCBDbGllbnRSZWN0LFxyXG4gICAgICAgIGRyb3Bkb3duOiBEcm9wZG93bixcclxuICAgICAgICByZWN0V2lkdGg6IG51bWJlcixcclxuICAgICAgICBkaXNwbGF5VG9TaWRlPzogYm9vbGVhbik6IHZvaWQge1xyXG5cclxuICAgICAgICAvLyBtb2RpZnkgdGhlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHJlY3QgdG8gYWNjb3VudCBmb3IgYW55IG9sZCBvZmZzZXRcclxuICAgICAgICBsZXQgcmVjdExlZnQgPSB0b2dnbGVSZWN0LmxlZnQ7XHJcblxyXG4gICAgICAgIC8vIGdldCB0aGUgdmlld3BvcnQgd2lkdGhcclxuICAgICAgICBjb25zdCB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG5cclxuICAgICAgICAvLyBJZiBkaXNwbGF5VG9TaWRlIGF0dHJpYnV0ZSBpcyBzZXQsIGRpc3BsYXkgZHJvcGRvd24gdG8gc2lkZSBvZiB0b2dnbGVSZWN0LCBlbHNlIHBsYWNlIGl0IGFib3ZlIG9yIGJlbG93XHJcbiAgICAgICAgaWYgKCEhZGlzcGxheVRvU2lkZSkge1xyXG4gICAgICAgICAgICBjb25zdCBzcGFjZUxlZnQgPSB0b2dnbGVSZWN0LmxlZnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwYWNlUmlnaHQgPSB3aW5kb3dXaWR0aCAtIHRvZ2dsZVJlY3QucmlnaHQ7XHJcblxyXG4gICAgICAgICAgICAvLyBBbHdheXMgdHJ5IHRvIHB1dCBkcm9wZG93biB0byB0aGUgZGlyZWN0aW9uIHRoYXQgaGFzIG1vcmUgc3BhY2UuIEZpcnN0IHRyeSB0byBwdXQgb24gdGhlIHJpZ2h0LCBpZiBub3QgdGhlbiBwdXQgbGVmdFxyXG4gICAgICAgICAgICBpZiAoc3BhY2VSaWdodCA+PSBEcm9wZG93blNlcnZpY2UubWluU3BhY2VGb3JEcm9wZG93biB8fCByZWN0V2lkdGggPCBzcGFjZVJpZ2h0IHx8IHNwYWNlUmlnaHQgPiBzcGFjZUxlZnQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZWN0V2lkdGggPiBzcGFjZVJpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVjdFdpZHRoID0gc3BhY2VSaWdodDtcclxuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5vdmVyZmxvd1ggPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gc2hvdyByaWdodCBvZiBjb250cm9sXHJcbiAgICAgICAgICAgICAgICByZWN0TGVmdCA9IHRvZ2dsZVJlY3QucmlnaHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVjdFdpZHRoIDwgc3BhY2VMZWZ0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzaG93IGxlZnQgb2YgY29udHJvbFxyXG4gICAgICAgICAgICAgICAgcmVjdExlZnQgPSB0b2dnbGVSZWN0LmxlZnQgLSByZWN0V2lkdGg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiByZWN0IGlzIGJpZ2dlciB0aGFuIHNwYWNlIHRvIHRoZSBsZWZ0IGFuZCB0b2dnbGUgcmVjdGFuZ2xlIGNvbWJpbmVkXHJcbiAgICAgICAgICAgICAgICBpZiAocmVjdFdpZHRoID4gc3BhY2VMZWZ0ICsgdG9nZ2xlUmVjdC53aWR0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RXaWR0aCA9IHNwYWNlTGVmdCArIHRvZ2dsZVJlY3Qud2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24ub3ZlcmZsb3dYID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHNob3cgb24gdG9wIG9mIGNvbnRyb2xcclxuICAgICAgICAgICAgICAgIHJlY3RMZWZ0ID0gdG9nZ2xlUmVjdC5yaWdodCAtIHJlY3RXaWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIENhcCB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZSB3aW5kb3cgZGltZW5zaW9ucyBhbmQgc2V0IGFwcHJvcHJpYXRlIG92ZXJmbG93XHJcbiAgICAgICAgICAgIGlmIChyZWN0V2lkdGggPiB3aW5kb3dXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgcmVjdFdpZHRoID0gd2luZG93V2lkdGg7XHJcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5vdmVyZmxvd1ggPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyZWN0V2lkdGggPCB0b2dnbGVSZWN0LndpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICByZWN0V2lkdGggPSB0b2dnbGVSZWN0LndpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVjdExlZnQgKyByZWN0V2lkdGggPiB3aW5kb3dXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgcmVjdExlZnQgPSB3aW5kb3dXaWR0aCAtIHJlY3RXaWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVjdExlZnQgPSBNYXRoLm1heCgwLCByZWN0TGVmdCk7XHJcbiAgICAgICAgZHJvcGRvd24ubGVmdCA9IHJlY3RMZWZ0O1xyXG5cclxuICAgICAgICAoPEhUTUxFbGVtZW50PmRyb3Bkb3duLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLnN0eWxlLmxlZnQgPSByZWN0TGVmdCArICdweCc7XHJcbiAgICAgICAgaWYgKCFkcm9wZG93bi5hdXRvV2lkdGgpIHtcclxuICAgICAgICAgICAgKDxIVE1MRWxlbWVudD5kcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KS5zdHlsZS53aWR0aCA9IHJlY3RXaWR0aCArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyB0aGUgcG9zaXRpb24gY2FsY3VsYXRpb24gZm9yIHRoZSB0b3Agb2YgdGhlIGRyb3Bkb3duIGNvbnRhaW5lclxyXG4gICAgICogRGVjaWRlcyB3aGV0aGVyIHRvIHBsYWNlIHRoZSBkcm9wZG93biBhYm92ZSBvciBiZWxvdyB0aGUgdG9nZ2xlIGJ1dHRvblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGRyb3Bkb3duU2V0UG9zaXRpb25Ub3AoXHJcbiAgICAgICAgdG9nZ2xlUmVjdDogRE9NUmVjdCB8IENsaWVudFJlY3QsXHJcbiAgICAgICAgZHJvcGRvd246IERyb3Bkb3duLFxyXG4gICAgICAgIHJlY3RIZWlnaHQ6IG51bWJlcixcclxuICAgICAgICBjYWxjdWxhdGVIZWlnaHQ/OiBib29sZWFuLFxyXG4gICAgICAgIGRpc3BsYXlUb1NpZGU/OiBib29sZWFuKTogdm9pZCB7XHJcblxyXG4gICAgICAgIC8vIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBzbWFsbCBoZWlnaHQgd2luZG93IHJlbmRlcmluZ1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVjdEhlaWdodCA9IHJlY3RIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIG1vZGlmeSB0aGUgdG9wIHBvc2l0aW9uIG9mIHRoZSByZWN0IHRvIGFjY291bnQgZm9yIGFueSBvbGQgb2Zmc2V0XHJcbiAgICAgICAgbGV0IHJlY3RUb3AgPSB0b2dnbGVSZWN0LmJvdHRvbTtcclxuXHJcbiAgICAgICAgLy8gZ2V0IHRoZSB2aWV3cG9ydCBoZWlnaHRcclxuICAgICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHNwYWNlQWJvdmUgPSB0b2dnbGVSZWN0LnRvcDtcclxuICAgICAgICBjb25zdCBzcGFjZUJlbG93ID0gd2luZG93SGVpZ2h0IC0gdG9nZ2xlUmVjdC5ib3R0b207XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyB0cnkgdG8gcHV0IGRyb3Bkb3duIHRvIHRoZSBkaXJlY3Rpb24gdGhhdCBoYXMgbW9yZSBzcGFjZS5cclxuICAgICAgICBsZXQgc2hvdWxkRGlzcGxheWluZ0Fib3ZlID0gZmFsc2U7XHJcbiAgICAgICAgLy8gRmlyc3QgdHJ5IHRvIHB1dCBvbiB0aGUgYm90dG9tLCBpZiBub3QgdGhlbiBwdXQgb24gYWJvdmVcclxuICAgICAgICBpZiAoc3BhY2VCZWxvdyA+PSBEcm9wZG93blNlcnZpY2UubWluU3BhY2VGb3JEcm9wZG93biB8fCByZWN0SGVpZ2h0IDwgc3BhY2VCZWxvdyB8fCBzcGFjZUJlbG93ID4gc3BhY2VBYm92ZSkge1xyXG4gICAgICAgICAgICBpZiAocmVjdEhlaWdodCA+IHNwYWNlQmVsb3cpIHtcclxuICAgICAgICAgICAgICAgIHJlY3RIZWlnaHQgPSBzcGFjZUJlbG93O1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd24ub3ZlcmZsb3dZID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzaG93IGJlbG93IHRoZSBjb250cm9sLlxyXG4gICAgICAgICAgICByZWN0VG9wID0gZGlzcGxheVRvU2lkZSA9PT0gdHJ1ZSA/IHRvZ2dsZVJlY3QudG9wIDogdG9nZ2xlUmVjdC5ib3R0b207XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gaWYgcmVjdCBpcyBiaWdnZXIgdGhhbiBzcGFjZSBhYm92ZVxyXG4gICAgICAgICAgICBpZiAocmVjdEhlaWdodCA+IHNwYWNlQWJvdmUpIHtcclxuICAgICAgICAgICAgICAgIHJlY3RIZWlnaHQgPSBzcGFjZUFib3ZlO1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd24ub3ZlcmZsb3dZID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzaG93IGFib3ZlIHRoZSBjb250cm9sLlxyXG4gICAgICAgICAgICByZWN0VG9wID0gZGlzcGxheVRvU2lkZSA9PT0gdHJ1ZSA/IHRvZ2dsZVJlY3QuYm90dG9tIC0gcmVjdEhlaWdodCA6IHRvZ2dsZVJlY3QudG9wIC0gcmVjdEhlaWdodDtcclxuICAgICAgICAgICAgc2hvdWxkRGlzcGxheWluZ0Fib3ZlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlY3RUb3AgPSBNYXRoLm1heCgwLCByZWN0VG9wKTtcclxuICAgICAgICBkcm9wZG93bi50b3AgPSByZWN0VG9wO1xyXG5cclxuICAgICAgICBpZiAoY2FsY3VsYXRlSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodFRvcE9iamVjdCA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ2FsY3VsYXRlSGVpZ2h0VG9wKFxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVjdFRvcCxcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGREaXNwbGF5aW5nQWJvdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgc3BhY2VBYm92ZSxcclxuICAgICAgICAgICAgICAgICAgICBzcGFjZUJlbG93LFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUmVjdEhlaWdodFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgKDxIVE1MRWxlbWVudD5kcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KS5zdHlsZS5oZWlnaHQgPSBoZWlnaHRUb3BPYmplY3QuaGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICAgICAgKDxIVE1MRWxlbWVudD5kcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KS5zdHlsZS50b3AgPSBoZWlnaHRUb3BPYmplY3QudG9wICsgJ3B4JztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAoPEhUTUxFbGVtZW50PmRyb3Bkb3duLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLnN0eWxlLmhlaWdodCA9IHJlY3RIZWlnaHQgKyAncHgnO1xyXG4gICAgICAgICAgICAoPEhUTUxFbGVtZW50PmRyb3Bkb3duLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLnN0eWxlLnRvcCA9IHJlY3RUb3AgKyAncHgnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGhlaWdodCBjYWxjdWxhdGlvbiBmb3IgdGhlIGRyb3Bkb3duIGNvbnRhaW5lclxyXG4gICAgICogSXQgY2FsY3VsYXRlcyBiYXNlZCBvbiB0aGUgaGVpZ2h0Q2FsY3VsYXRpb25PYmplY3RcclxuICAgICAqIEZpcnN0IHRyeSB0byBwdXQgdGhlIGRyb3Bkb3duIGNvbnRhaW5lciB0byBkZWNpZGUgd2hldGhlciBhIHNjcm9sbCBiYXIgaXMgbmVlZGVkXHJcbiAgICAgKiBUaGVuIGFwcGx5IHRoZSBoZWlnaHQgZnJvbSBjYWxjdWxhdGlvblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGRyb3Bkb3duQ2FsY3VsYXRlSGVpZ2h0VG9wKHJlY3RIZWlnaHQ6IG51bWJlciwgcmVjdFRvcDogbnVtYmVyLCBzaG91bGREaXNwbGF5aW5nQWJvdmU6IGJvb2xlYW4sIHRvZ2dsZVRvcDogbnVtYmVyLFxyXG4gICAgICAgIHRvZ2dsZUJvdHRvbTogbnVtYmVyLCBvcmlnaW5hbFJlY3RIZWlnaHQ6IG51bWJlcik6IERyb3Bkb3duSGVpZ2h0Q2FsY3VsYXRpb25SZXN1bHQge1xyXG4gICAgICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuICAgICAgICBsZXQgYWN0dWFsVG9wID0gcmVjdFRvcDtcclxuICAgICAgICBsZXQgYWN0dWFsSGVpZ2h0ID0gcmVjdEhlaWdodDtcclxuICAgICAgICBjb25zdCB0b2dnbGVIZWlnaHQgPSBzaG91bGREaXNwbGF5aW5nQWJvdmUgPyB0b2dnbGVUb3AgOiB0b2dnbGVCb3R0b207XHJcbiAgICAgICAgY29uc3Qgd2luZG93SGVpZ2h0TWFyZ2luID0gdGhpcy5nZXREcm9wZG93bk1hcmdpbih3aW5kb3dIZWlnaHQpO1xyXG4gICAgICAgIGNvbnN0IHNob3VsZFVwZGF0ZUhlaWdodCA9IHRoaXMuc2hvdWxkVXBkYXRlSGVpZ2h0KHJlY3RIZWlnaHQsIHRvZ2dsZUhlaWdodCwgd2luZG93SGVpZ2h0TWFyZ2luKTtcclxuXHJcbiAgICAgICAgaWYgKHNob3VsZFVwZGF0ZUhlaWdodCkge1xyXG4gICAgICAgICAgICAvLyBoYW5kbGVzIHNwZWNpYWwgY2FzZXMgd2hlcmUgZHJvcGRvd24gYm9keSBpcyB0b28gYmlnLCB1c2UgZnVsbCBoZWlnaHQgbW9kZVxyXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxSZWN0SGVpZ2h0ID49IHRvZ2dsZUhlaWdodCAqIERyb3Bkb3duU2VydmljZS5zaG91bGRVc2VGdWxsSGVpZ2h0RHJvcGRvd25SYXRpbykge1xyXG4gICAgICAgICAgICAgICAgYWN0dWFsVG9wID0gd2luZG93SGVpZ2h0TWFyZ2luO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgb3JpZ2luYWwgYm9keSBleGNlZWRlZCB0aGUgd2hvbGUgd2luZG93IGhlaWdodCwgdXNlIHdpbmRvdyBoZWlnaHRcclxuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIG9yaWdpbmFsIGhlaWdodFxyXG4gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsUmVjdEhlaWdodCA+PSB3aW5kb3dIZWlnaHQgLSAyICogd2luZG93SGVpZ2h0TWFyZ2luKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID0gd2luZG93SGVpZ2h0IC0gMiAqIHdpbmRvd0hlaWdodE1hcmdpbjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID0gb3JpZ2luYWxSZWN0SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvd0hlaWdodCA8PSB0aGlzLmhlaWdodENhbGN1bGF0aW9uT2JqZWN0LnNtYWxsLm1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFJlY3RIZWlnaHQgPiB3aW5kb3dIZWlnaHQgLSAyICogd2luZG93SGVpZ2h0TWFyZ2luKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdob2xlIGhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQgPSB3aW5kb3dIZWlnaHQgLSAyICogd2luZG93SGVpZ2h0TWFyZ2luO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxUb3AgPSB3aW5kb3dIZWlnaHRNYXJnaW47XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWN0SGVpZ2h0ID4gdG9nZ2xlSGVpZ2h0IC0gd2luZG93SGVpZ2h0TWFyZ2luKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgZnJvbSB0b3AsIHdpbGwgY292ZXIgcGFydCBvZiB0aGUgaW5wdXQgYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbEhlaWdodCA9IHJlY3RIZWlnaHQgLSB3aW5kb3dIZWlnaHRNYXJnaW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFRvcCA9IHdpbmRvd0hlaWdodE1hcmdpbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBiZSBvbmx5IGRpc3BsYXllZCBhcyBiZWxvdyBvciBhYm92ZSBpbiBiaWdnZXIgc2NyZWVuXHJcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID0gcmVjdEhlaWdodCAtIHdpbmRvd0hlaWdodE1hcmdpbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNob3VsZERpc3BsYXlpbmdBYm92ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRvZ2dsZVRvcCA+IGFjdHVhbEhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFRvcCA9IHRvZ2dsZVRvcCAtIGFjdHVhbEhlaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdG9wOiBhY3R1YWxUb3AsXHJcbiAgICAgICAgICAgIGhlaWdodDogYWN0dWFsSGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgd2hldGhlciBzaG91bGQgdXBkYXRlIHRoZSBoZWlnaHQgcGl4ZWxzIGZvciB0aGUgZHJvcGRvd25cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzaG91bGRVcGRhdGVIZWlnaHQocmVjdEhlaWdodDogbnVtYmVyLCB0b2dnbGVIZWlnaHQ6IG51bWJlciwgd2luZG93SGVpZ2h0TWFyZ2luOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRvZ2dsZUhlaWdodCAtIHJlY3RIZWlnaHQgPCB3aW5kb3dIZWlnaHRNYXJnaW4pIHtcclxuICAgICAgICAgICAgcmVzID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBkcm9wZG93biBtYXJnaW4gYmFzZSBvbiB0aGUgY2FsY3VsYXRpb24gb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0RHJvcGRvd25NYXJnaW4od2luZG93SGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgd2luZG93SGVpZ2h0TWFyZ2luID0gMDtcclxuICAgICAgICBpZiAod2luZG93SGVpZ2h0IDw9IHRoaXMuaGVpZ2h0Q2FsY3VsYXRpb25PYmplY3Quc21hbGwubWF4KSB7XHJcbiAgICAgICAgICAgIHdpbmRvd0hlaWdodE1hcmdpbiA9IHRoaXMuaGVpZ2h0Q2FsY3VsYXRpb25PYmplY3Quc21hbGwubWFyZ2luO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93SGVpZ2h0ID49IHRoaXMuaGVpZ2h0Q2FsY3VsYXRpb25PYmplY3QubWVkaXVtLm1pbiAmJiB3aW5kb3dIZWlnaHQgPD0gdGhpcy5oZWlnaHRDYWxjdWxhdGlvbk9iamVjdC5tZWRpdW0ubWF4KSB7XHJcbiAgICAgICAgICAgIHdpbmRvd0hlaWdodE1hcmdpbiA9IHRoaXMuaGVpZ2h0Q2FsY3VsYXRpb25PYmplY3QubWVkaXVtLm1hcmdpbjtcclxuICAgICAgICB9IGVsc2UgaWYgKHdpbmRvd0hlaWdodCA+PSB0aGlzLmhlaWdodENhbGN1bGF0aW9uT2JqZWN0LmxhcmdlLm1pbikge1xyXG4gICAgICAgICAgICB3aW5kb3dIZWlnaHRNYXJnaW4gPSB0aGlzLmhlaWdodENhbGN1bGF0aW9uT2JqZWN0LmxhcmdlLm1hcmdpbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvd0hlaWdodE1hcmdpbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlYWwgd2l0aCBuZXN0ZWQgY2xvc2UgZm9yIGRyb3Bkb3duXHJcbiAgICAgKiBAcGFyYW0gZHJvcGRvd24gdGhlIGFjdGl2ZSBkcm9wZG93blxyXG4gICAgICogQHBhcmFtIGV2ZW50IGNvbnRhaW5zIHRoZSBjdXJyZW50IGV2ZW50IHRhcmdldFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xvc2VOZXN0ZWQoZHJvcGRvd246IERyb3Bkb3duLCBldmVudDogRXZlbnRzKSB7XHJcbiAgICAgICAgaWYgKGRyb3Bkb3duICYmIGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGxldCBldmVudFRhcmdldCA9IDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgIC8vIGFzc2lnbiBhY3RpdmUgZHJvcGRvd25cclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJvcGRvd25MaXN0ICYmIHRoaXMuZHJvcGRvd25MaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50VGFyZ2V0LmNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50VGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnLnNtZS1sYXlvdXQtZHJvcGRvd24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUYXJnZXQgPSBEb20uZ2V0QW5jZXN0b3IoZXZlbnRUYXJnZXQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS1sYXlvdXQtZHJvcGRvd24nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGhhbmRsZXMgd2hlbiB0aGUgZXZlbnQgdGFyZ2V0IGlzIFdpbmRvdyBvYmplY3QgdGhhdCBkb2VzJ3QgY29udGFpbnMgZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFRhcmdldC5oYXNPd25Qcm9wZXJ0eSgncXVlcnlTZWxlY3RvcicpICYmIGV2ZW50VGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ3NtZS1kcm9wZG93bicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCdzbWUtZHJvcGRvd24nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlRHJvcGRvd24gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuZHJvcGRvd25MaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkID0gdGhpcy5kcm9wZG93bkxpc3RbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50ID09PSBldmVudFRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRHJvcGRvd24gPSBkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURyb3Bkb3duID0gYWN0aXZlRHJvcGRvd247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gY2xvc2UgZHJvcC1kb3duc1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUYXJnZXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duc0luRXZlbnRSZWdpb24gPSBldmVudFRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCdzbWUtZHJvcGRvd24gLnNtZS1kcm9wZG93bi10b2dnbGUtY29udGFpbmVyJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZHJvcGRvd25zSW5FdmVudFJlZ2lvbiAmJiBkcm9wZG93bnNJbkV2ZW50UmVnaW9uLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIGFsbCBjaGlsZHJlbiBkcm9wZG93bnNcclxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gb25seSByZWZlciB0byBVSSBsZXZlbCBmcm9tIHF1ZXJ5U2VsZWN0b3JBbGwsIG5vdCB0aGUgY29tcG9uZW50LlxyXG4gICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duc0luRXZlbnRSZWdpb24uZm9yRWFjaCgoZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2xvc2VFdmVudCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBhbGwgZXhwYW5kZWQgZHJvcGRvd25zXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZU5lc3RlZEFsbEV4cGFuZGVkRHJvcGRvd25zKHRoaXMuZHJvcGRvd25MaXN0KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURyb3Bkb3duID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGNsb3NlIGFsbCBleHBhbmRlZCBkcm9wZG93bnNcclxuICAgICAgICAgICAgICAgIC8vIGNsb3NlIGNoaWxkIGZpcnN0XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTmVzdGVkQWxsRXhwYW5kZWREcm9wZG93bnModGhpcy5kcm9wZG93bkxpc3QpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcm9wZG93biA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyBjbG9zaW5nIGFsbCB0aGUgZXhwYW5kZWQgZHJvcGRvd25zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2xvc2VOZXN0ZWRBbGxFeHBhbmRlZERyb3Bkb3ducyhkcm9wZG93bkxpc3Q6IEFycmF5PERyb3Bkb3duPikge1xyXG4gICAgICAgIGlmIChkcm9wZG93bkxpc3QgJiYgZHJvcGRvd25MaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZHJvcGRvd25MaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZHJvcGRvd25MaXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGVsZW1lbnQuY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGNsb3NlIHRoZSBvbmVzIGRpc3BsYXlpbmdcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtbGF5b3V0LWhpZGRlbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VOZXN0ZWRIZWxwZXIoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBZaWVsZCgpXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgY2xvc2luZyB0aGUgZHJvcGRvd24gZnJvbSB0aGUgY29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2xvc2VOZXN0ZWRIZWxwZXIoZHJvcGRvd246IERyb3Bkb3duKSB7XHJcbiAgICAgICAgaWYgKGRyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgd2hlbiBvcGVuaW5nIGEgZHJvcGRvd24gd2hlbiBvdGhlciBkcm9wZG93bihzKSBpcy9hcmUgb3BlblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNsb3NlTmVzdGVkT25PcGVuKGN1cnJlbnREcm9wZG93bjogRHJvcGRvd24sIHByZXZpb3VzRHJvcGRvd246IERyb3Bkb3duLCBpc0N1cnJlbnREcm9wZG93bkNoaWxkRnJvbUFjdGl2ZURyb3Bkb3duOiBib29sZWFuKTpcclxuICAgICAgICBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzQ3VycmVudERyb3Bkb3duQ2hpbGRGcm9tQWN0aXZlRHJvcGRvd24gfHwgIXRoaXMuZHJvcGRvd25MaXN0IHx8ICF0aGlzLmRyb3Bkb3duTGlzdC5sZW5ndGggfHwgIXByZXZpb3VzRHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzRnJvbVNhbWVQYXJlbnQgPSB0aGlzLmlzRnJvbVNhbWVQYXJlbnQoY3VycmVudERyb3Bkb3duLCBwcmV2aW91c0Ryb3Bkb3duKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREcm9wZG93bk5vZGUgPSBjdXJyZW50RHJvcGRvd24uY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzRHJvcGRvd25Ob2RlID0gcHJldmlvdXNEcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IERvbTtcclxuICAgICAgICAgICAgICAgIC8vIGZpbmQgaWYgdGhlcmUgYXJlIGludGVyc2VjdGlvbiBvbiBwYXJlbnQgbm9kZS4gQW5kIGNsb3NlIHRpbGwgdGhhdCBsZXZlbC5cclxuICAgICAgICAgICAgICAgIC8vIGlmIG5vIGludGVyc2VjdGlvbiwgY2xvc2UgdGhlIHByZXZpb3VzIGFjdGl2ZSBkcm9wZG93biBvbmUgYnkgb25lLlxyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNBY3RpdmVEcm9wZG93bnMgPSB0aGlzLmRyb3Bkb3duTGlzdDtcclxuICAgICAgICAgICAgICAgIGlmIChpc0Zyb21TYW1lUGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkQ2xvc2VEcm9wZG93bnMgPSBwcmV2aW91c0FjdGl2ZURyb3Bkb3ducy5maWx0ZXIoKGRyb3Bkb3duKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbENoaWxkcmVuID0gZC5nZXRBbGxFbGVtZW50cyhkcm9wZG93bi5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLWxheW91dC1kcm9wZG93bicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbENoaWxkcmVuLmluY2x1ZGVzKHByZXZpb3VzRHJvcGRvd25Ob2RlKSAmJiBhbGxDaGlsZHJlbi5pbmNsdWRlcyhjdXJyZW50RHJvcGRvd25Ob2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VOZXN0ZWRBbGxFeHBhbmRlZERyb3Bkb3ducyhzaG91bGRDbG9zZURyb3Bkb3ducyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VOZXN0ZWRBbGxFeHBhbmRlZERyb3Bkb3ducyh0aGlzLmRyb3Bkb3duTGlzdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgd2hldGhlciB0d28gZHJvcGRvd25zIGFyZSBmcm9tIHRoZSBzYW1lIHBhcmVudFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzRnJvbVNhbWVQYXJlbnQoY3VycmVudERyb3Bkb3duOiBEcm9wZG93biwgUHJldmlvdXNEcm9wZG93bjogRHJvcGRvd24pIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50RHJvcGRvd25Ob2RlID0gY3VycmVudERyb3Bkb3duLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNEcm9wZG93bk5vZGUgPSBQcmV2aW91c0Ryb3Bkb3duLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgZCA9IERvbTtcclxuICAgICAgICBjb25zdCBjdXJyZW50RHJvcGRvd25Ob2RlUGFyZW50cyA9IGQuZ2V0QWxsQW5jZXN0b3JzKGN1cnJlbnREcm9wZG93bk5vZGUsXHJcbiAgICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS1sYXlvdXQtZHJvcGRvd24nKSk7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNEcm9wZG93bk5vZGVQYXJlbnRzID0gZC5nZXRBbGxBbmNlc3RvcnMocHJldmlvdXNEcm9wZG93bk5vZGUsXHJcbiAgICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS1sYXlvdXQtZHJvcGRvd24nKSk7XHJcbiAgICAgICAgbGV0IHJlcyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudERyb3Bkb3duTm9kZVBhcmVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaUVsZW1lbnQgPSBjdXJyZW50RHJvcGRvd25Ob2RlUGFyZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwcmV2aW91c0Ryb3Bkb3duTm9kZVBhcmVudHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpFbGVtZW50ID0gcHJldmlvdXNEcm9wZG93bk5vZGVQYXJlbnRzW2pdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlFbGVtZW50LmlzU2FtZU5vZGUoakVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|