UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

262 lines 39.3 kB
import { __decorate, __metadata } from "tslib"; import { ElementRef } from '@angular/core'; import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators'; import { SmeResponsiveWindowBreakpoints, SmeResponsiveWindowManagerComponent } from '../../common/sme-responsive-window-manager.component'; /** * The class for the settings window responsive manager * The usage is bound to the sme-settings-page as all the settings page needs it. */ export class SettingsResponsiveWindowManager extends SmeResponsiveWindowManagerComponent { constructor() { super(...arguments); this.name = 'sme-settings'; this.smeLayoutClassList = { phoneUp: ['sme-arrange-wrapstack-h', 'sme-position-flex-auto', 'sme-arrange-overflow-auto'], phoneDown: ['sme-layout-phone-down'], reflow: ['sme-layout-phone-down'] }; this.smeSettingsPageContentClassList = { phoneUp: ['sme-position-stretch'], phoneDown: ['sme-position-flex-none', 'sme-position-stretch-h'], reflow: ['sme-position-flex-none', 'sme-position-stretch-h'] }; this.smeSettingsPageClassList = { phoneUp: [], phoneDown: ['sme-layout-relative'], reflow: ['sme-layout-relative'] }; this.smeCommonSettingContentClassList = { phoneUp: ['sme-position-stretch'], phoneDown: ['sme-position-stretch-h', 'sme-layout-responsive-zone-xs'], reflow: ['sme-position-stretch-h', 'sme-layout-responsive-zone-xs'] }; this.smeLayoutItemContentClassList = { phoneUp: ['sme-position-stretch'], phoneDown: ['sme-position-relative', 'sme-arrange-stack-v'], reflow: ['sme-position-relative', 'sme-arrange-stack-v'] }; this.iframeHeightMappings = { 'msft-sme-file-explorer-smbServerSettings': '900' }; } /** * Waits for the iframe to load and set iframe's height to avoid unexpected scroll bars. * This will be triggered on layout changed or on selected settings changed. */ setIframeHeight(connectionSettings, hostElement) { if (!connectionSettings) { return; } if (!hostElement) { return; } const mappings = this.iframeHeightMappings; const commonSettingsContent = hostElement.nativeElement.querySelector('sme-settings-content'); if (!commonSettingsContent) { return; } const size = this.prevSize; // on phone up, do not override min-height if (size.size === SmeResponsiveWindowBreakpoints.PhoneUp) { commonSettingsContent.style.minHeight = ''; return; } // defined from the custom.scss if (commonSettingsContent.clientHeight >= 500) { const iframe = commonSettingsContent.querySelector('iframe[id]:not(.sme-layout-none)'); if (!iframe) { return; } const id = iframe.id; if (!mappings.hasOwnProperty(id)) { // By default from the custom.scss, the definition is 500px height. // For contents that would be greater than 500, please manually update the iframeHeightMappings object. // reset override commonSettingsContent.style.minHeight = ''; return; } commonSettingsContent.style.minHeight = mappings[id] + 'px'; } } /** * The on window sized changed event handler for the common settings with iframe as content. * @param connectionSettings whether it is connection settings page. * @param smeCommonSettings the host element for the sme common settings. * @returns void */ onWindowSizeChangedCommonSettings(connectionSettings, smeCommonSettings) { if (!this.cssV2) { return; } if (!connectionSettings) { return; } if (!smeCommonSettings || !smeCommonSettings.nativeElement) { return; } this.setIframeHeight(connectionSettings, smeCommonSettings); } /** * The on window sized changed event handler for the common settings in general. * @param smeSettingsPage the sme settings page element. * @returns void */ onWindowSizeChanged(smeSettingsPage) { if (!this.cssV2) { return; } if (!smeSettingsPage || !smeSettingsPage.nativeElement) { return; } if (smeSettingsPage?.nativeElement?.childElementCount === 0) { // Waits until components initialized. setTimeout(() => { this.onWindowSizeChanged(smeSettingsPage); }, 250); return; } // Special case for ng-templates wrapped with account.component.html after logged in. if (smeSettingsPage.nativeElement.parentElement && smeSettingsPage.nativeElement.parentElement.tagName) { const parentTagName = smeSettingsPage.nativeElement.parentElement.tagName.toLowerCase(); if (parentTagName === 'ng-component' && !smeSettingsPage.nativeElement.parentElement.parentElement) { // eslint-disable-next-line no-console console.log('ignoring account.component.html'); return; } } const layoutItemContent = this.getLayoutItemAncestor(smeSettingsPage); let smeLayout; let commonSettingHeader, commonSettingContent, commonSettingFooter; let layoutItemStretchH; // If settings page not in an iframe, layoutItemContent will always be there. // If settings page inside of an iframe, layoutItemContent cannot be found due to not in the same context. if (layoutItemContent) { layoutItemStretchH = this.layoutItemStretchWidth(layoutItemContent); commonSettingHeader = this.getSettingsContent(layoutItemContent, 'sme-settings-header'); commonSettingContent = this.getSettingsContent(layoutItemContent, 'sme-settings-content'); commonSettingFooter = this.getSettingsContent(layoutItemContent, 'sme-settings-footer'); } let commonSettingsFound = true; // If not existed, return. if (!commonSettingContent && !commonSettingFooter && !commonSettingHeader) { commonSettingsFound = false; // eslint-disable-next-line no-console console.log('common settings not found'); } const settingsPageHeader = this.getSettingsContent(smeSettingsPage.nativeElement, 'sme-settings-header'); const settingsPageContent = this.getSettingsContent(smeSettingsPage.nativeElement, 'sme-settings-content'); const settingsPageFooter = this.getSettingsContent(smeSettingsPage.nativeElement, 'sme-settings-footer'); if (!settingsPageHeader && !settingsPageContent && !settingsPageFooter) { return; } const size = this.getSmeResponsiveWindowData(); if (commonSettingsFound && layoutItemContent) { smeLayout = this.getParentElementByTag(smeSettingsPage.nativeElement, ['sme-layout']); } // layoutItemStretchH: if the settings content from the settings page is rendering in 100%. // meaning the content has been moved to the bottom of the settings nav due to small window. // otherwise we just clean up the height and return. if (size.phoneDown) { if (smeSettingsPage?.nativeElement) { this.updateClassArrayOnWindowSize(this.smeSettingsPageClassList, 'phoneDown', smeSettingsPage.nativeElement); } if (settingsPageContent) { this.updateClassArrayOnWindowSize(this.smeSettingsPageContentClassList, 'phoneDown', settingsPageContent); } if (commonSettingsFound) { if (commonSettingHeader) { } if (commonSettingContent) { this.updateClassArrayOnWindowSize(this.smeCommonSettingContentClassList, 'phoneDown', commonSettingContent); } if (commonSettingFooter) { } if (layoutItemContent) { this.updateClassArrayOnWindowSize(this.smeLayoutItemContentClassList, 'phoneDown', layoutItemContent); if (smeLayout) { this.updateClassArrayOnWindowSize(this.smeLayoutClassList, 'phoneDown', smeLayout); } } } } else if (size.reflowMode) { if (smeSettingsPage?.nativeElement) { this.updateClassArrayOnWindowSize(this.smeSettingsPageClassList, 'reflow', smeSettingsPage.nativeElement); } if (smeLayout) { this.updateClassArrayOnWindowSize(this.smeLayoutClassList, 'reflow', smeLayout); } if (settingsPageContent) { this.updateClassArrayOnWindowSize(this.smeSettingsPageContentClassList, 'reflow', settingsPageContent); } if (commonSettingContent) { this.updateClassArrayOnWindowSize(this.smeCommonSettingContentClassList, 'reflow', commonSettingContent); } if (layoutItemContent) { this.updateClassArrayOnWindowSize(this.smeLayoutItemContentClassList, 'reflow', layoutItemContent); } } else if (size.phoneUp) { if (smeSettingsPage?.nativeElement) { this.updateClassArrayOnWindowSize(this.smeSettingsPageClassList, 'phoneUp', smeSettingsPage.nativeElement); } if (smeLayout) { this.updateClassArrayOnWindowSize(this.smeLayoutClassList, 'phoneUp', smeLayout); } if (settingsPageContent) { this.updateClassArrayOnWindowSize(this.smeSettingsPageContentClassList, 'phoneUp', settingsPageContent); } if (commonSettingContent) { this.updateClassArrayOnWindowSize(this.smeCommonSettingContentClassList, 'phoneUp', commonSettingContent); } if (layoutItemContent) { this.updateClassArrayOnWindowSize(this.smeLayoutItemContentClassList, 'phoneUp', layoutItemContent); } } } getLayoutItemAncestor(smeSettingsPage) { let level = 10; const smeSettingsPageNativeElement = smeSettingsPage.nativeElement; let found = false; let parent = smeSettingsPageNativeElement; while (level > 0 && !found) { if (parent) { parent = parent.parentElement; } if (parent && parent.tagName && parent.tagName.toLocaleLowerCase() === 'sme-layout-item') { found = true; break; } level -= 1; } return parent; } layoutItemStretchWidth(layoutItemContent) { if (!layoutItemContent) { return false; } const width = layoutItemContent?.style?.width; if (width === '100%') { return true; } return false; } getSettingsContent(layoutItemContent, target) { if (!layoutItemContent.childElementCount) { return; } for (let i = 0; i < layoutItemContent.childElementCount; i++) { if (layoutItemContent.children[i].tagName.toLocaleLowerCase() === target) { return layoutItemContent.children[i]; } } return undefined; } } __decorate([ Debounce(), __metadata("design:type", Function), __metadata("design:paramtypes", [Boolean, ElementRef]), __metadata("design:returntype", void 0) ], SettingsResponsiveWindowManager.prototype, "setIframeHeight", null); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MtcmVzcG9uc2l2ZS13aW5kb3ctbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3NldHRpbmdzL2NvbW1vbi1zZXR0aW5ncy9zZXR0aW5ncy1yZXNwb25zaXZlLXdpbmRvdy1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUUzSTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sK0JBQWdDLFNBQVEsbUNBQW1DO0lBQXhGOztRQUNvQixTQUFJLEdBQUcsY0FBYyxDQUFDO1FBQzlCLHVCQUFrQixHQUFHO1lBQ3pCLE9BQU8sRUFBRSxDQUFDLHlCQUF5QixFQUFFLHdCQUF3QixFQUFFLDJCQUEyQixDQUFDO1lBQzNGLFNBQVMsRUFBRSxDQUFDLHVCQUF1QixDQUFDO1lBQ3BDLE1BQU0sRUFBRSxDQUFDLHVCQUF1QixDQUFDO1NBQ3BDLENBQUM7UUFFTSxvQ0FBK0IsR0FBRztZQUN0QyxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztZQUNqQyxTQUFTLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSx3QkFBd0IsQ0FBQztZQUMvRCxNQUFNLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSx3QkFBd0IsQ0FBQztTQUMvRCxDQUFDO1FBRU0sNkJBQXdCLEdBQUc7WUFDL0IsT0FBTyxFQUFFLEVBQUU7WUFDWCxTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztZQUNsQyxNQUFNLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztTQUNsQyxDQUFDO1FBRU0scUNBQWdDLEdBQUc7WUFDdkMsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7WUFDakMsU0FBUyxFQUFFLENBQUMsd0JBQXdCLEVBQUUsK0JBQStCLENBQUM7WUFDdEUsTUFBTSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsK0JBQStCLENBQUM7U0FDdEUsQ0FBQztRQUVNLGtDQUE2QixHQUFHO1lBQ3BDLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO1lBQ2pDLFNBQVMsRUFBRSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDO1lBQzNELE1BQU0sRUFBRSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDO1NBQzNELENBQUM7UUFFZSx5QkFBb0IsR0FBRztZQUNwQywwQ0FBMEMsRUFBRSxLQUFLO1NBQ3BELENBQUM7SUEyUk4sQ0FBQztJQXpSRzs7O01BR0U7SUFFSSxlQUFlLENBQUMsa0JBQTJCLEVBQUUsV0FBdUI7UUFDdkUsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3JCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDZCxPQUFPO1NBQ1Y7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFFM0MsTUFBTSxxQkFBcUIsR0FBSSxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUN4QixPQUFPO1NBQ1Y7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRTNCLDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssOEJBQThCLENBQUMsT0FBTyxFQUFFO1lBQ3JELHFCQUFxQixDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQzNDLE9BQU87U0FDWDtRQUVELCtCQUErQjtRQUMvQixJQUFJLHFCQUFxQixDQUFDLFlBQVksSUFBSSxHQUFHLEVBQUU7WUFDM0MsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsYUFBYSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDVCxPQUFPO2FBQ1Y7WUFFRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBRXJCLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUM5QixtRUFBbUU7Z0JBQ25FLHVHQUF1RztnQkFDdkcsaUJBQWlCO2dCQUNqQixxQkFBcUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztnQkFDM0MsT0FBTzthQUNWO1lBRUQscUJBQXFCLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQy9EO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssaUNBQWlDLENBQUMsa0JBQTJCLEVBQUUsaUJBQTZCO1FBQy9GLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2IsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3JCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRTtZQUN4RCxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxtQkFBbUIsQ0FBQyxlQUEyQjtRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNiLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFO1lBQ3BELE9BQU87U0FDVjtRQUVELElBQUksZUFBZSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsS0FBSyxDQUFDLEVBQUU7WUFDekQsc0NBQXNDO1lBQ3RDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzlDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVSLE9BQU87U0FDVjtRQUVELHFGQUFxRjtRQUNyRixJQUFJLGVBQWUsQ0FBQyxhQUFhLENBQUMsYUFBYSxJQUFJLGVBQWUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRTtZQUNwRyxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEYsSUFBSSxhQUFhLEtBQUssY0FBYyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFO2dCQUNoRyxzQ0FBc0M7Z0JBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztnQkFDL0MsT0FBTzthQUNWO1NBQ0o7UUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV0RSxJQUFJLFNBQVMsQ0FBQztRQUVkLElBQUksbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLENBQUM7UUFFbkUsSUFBSSxrQkFBa0IsQ0FBQztRQUN2Qiw2RUFBNkU7UUFDN0UsMEdBQTBHO1FBQzFHLElBQUksaUJBQWlCLEVBQUU7WUFDbkIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFFcEUsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLHFCQUFxQixDQUFDLENBQUM7WUFDeEYsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDMUYsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLHFCQUFxQixDQUFDLENBQUM7U0FDM0Y7UUFFRCxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUUvQiwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUN2RSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDNUIsc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUM1QztRQUVELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUN6RyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDM0csTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRXpHLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDcEUsT0FBTztTQUNWO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFFL0MsSUFBSSxtQkFBbUIsSUFBSSxpQkFBaUIsRUFBRTtZQUMxQyxTQUFTLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQ2hFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUN2QjtRQUVELDJGQUEyRjtRQUMzRiw0RkFBNEY7UUFDNUYsb0RBQW9EO1FBQ3BELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLGVBQWUsRUFBRSxhQUFhLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyw0QkFBNEIsQ0FDN0IsSUFBSSxDQUFDLHdCQUF3QixFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbEY7WUFFRCxJQUFJLG1CQUFtQixFQUFFO2dCQUNyQixJQUFJLENBQUMsNEJBQTRCLENBQzdCLElBQUksQ0FBQywrQkFBK0IsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLENBQUMsQ0FBQzthQUMvRTtZQUVELElBQUksbUJBQW1CLEVBQUU7Z0JBQ3JCLElBQUksbUJBQW1CLEVBQUU7aUJBQ3hCO2dCQUVELElBQUksb0JBQW9CLEVBQUU7b0JBQ3RCLElBQUksQ0FBQyw0QkFBNEIsQ0FDN0IsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO2lCQUNqRjtnQkFFRCxJQUFJLG1CQUFtQixFQUFFO2lCQUN4QjtnQkFFRCxJQUFJLGlCQUFpQixFQUFFO29CQUNuQixJQUFJLENBQUMsNEJBQTRCLENBQzdCLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztvQkFFeEUsSUFBSSxTQUFTLEVBQUU7d0JBQ1gsSUFBSSxDQUFDLDRCQUE0QixDQUM3QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO3FCQUN4RDtpQkFDSjthQUNKO1NBQ0o7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDeEIsSUFBSSxlQUFlLEVBQUUsYUFBYSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsNEJBQTRCLENBQzdCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQy9FO1lBRUQsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLDRCQUE0QixDQUM3QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ3JEO1lBRUQsSUFBSSxtQkFBbUIsRUFBRTtnQkFDckIsSUFBSSxDQUFDLDRCQUE0QixDQUM3QixJQUFJLENBQUMsK0JBQStCLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUM7YUFDNUU7WUFFRCxJQUFJLG9CQUFvQixFQUFFO2dCQUN0QixJQUFJLENBQUMsNEJBQTRCLENBQzdCLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQzthQUM5RTtZQUVELElBQUksaUJBQWlCLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyw0QkFBNEIsQ0FDN0IsSUFBSSxDQUFDLDZCQUE2QixFQUFFLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3hFO1NBQ0o7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDckIsSUFBSSxlQUFlLEVBQUUsYUFBYSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsNEJBQTRCLENBQzdCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ2hGO1lBRUQsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLDRCQUE0QixDQUM3QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ3REO1lBRUQsSUFBSSxtQkFBbUIsRUFBRTtnQkFDckIsSUFBSSxDQUFDLDRCQUE0QixDQUM3QixJQUFJLENBQUMsK0JBQStCLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUM7YUFDN0U7WUFFRCxJQUFJLG9CQUFvQixFQUFFO2dCQUN0QixJQUFJLENBQUMsNEJBQTRCLENBQzdCLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQzthQUMvRTtZQUVELElBQUksaUJBQWlCLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyw0QkFBNEIsQ0FDN0IsSUFBSSxDQUFDLDZCQUE2QixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3pFO1NBQ0o7SUFDTCxDQUFDO0lBRU8scUJBQXFCLENBQUMsZUFBMkI7UUFDckQsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsTUFBTSw0QkFBNEIsR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDO1FBQ25FLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLE1BQU0sR0FBRyw0QkFBNEIsQ0FBQztRQUMxQyxPQUFPLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDeEIsSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7YUFDakM7WUFFRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxpQkFBaUIsRUFBRTtnQkFDdEYsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFDYixNQUFNO2FBQ1Q7WUFDRCxLQUFLLElBQUksQ0FBQyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU8sc0JBQXNCLENBQUMsaUJBQThCO1FBQ3pELElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNwQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE1BQU0sS0FBSyxHQUFHLGlCQUFpQixFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDOUMsSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sa0JBQWtCLENBQUMsaUJBQThCLEVBQUUsTUFBYztRQUNyRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUU7WUFDdEMsT0FBTztTQUNWO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFELElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLE1BQU0sRUFBRTtnQkFDdEUsT0FBb0IsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JEO1NBQ0o7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0NBQ0o7QUFyUkU7SUFBQyxRQUFRLEVBQUU7OzhDQUNzRCxVQUFVOztzRUEyQzFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBTbWVSZXNwb25zaXZlV2luZG93QnJlYWtwb2ludHMsIFNtZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uL3NtZS1yZXNwb25zaXZlLXdpbmRvdy1tYW5hZ2VyLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogVGhlIGNsYXNzIGZvciB0aGUgc2V0dGluZ3Mgd2luZG93IHJlc3BvbnNpdmUgbWFuYWdlclxyXG4gKiBUaGUgdXNhZ2UgaXMgYm91bmQgdG8gdGhlIHNtZS1zZXR0aW5ncy1wYWdlIGFzIGFsbCB0aGUgc2V0dGluZ3MgcGFnZSBuZWVkcyBpdC5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1Jlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyIGV4dGVuZHMgU21lUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXJDb21wb25lbnQge1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWUgPSAnc21lLXNldHRpbmdzJztcclxuICAgIHByaXZhdGUgc21lTGF5b3V0Q2xhc3NMaXN0ID0ge1xyXG4gICAgICAgIHBob25lVXA6IFsnc21lLWFycmFuZ2Utd3JhcHN0YWNrLWgnLCAnc21lLXBvc2l0aW9uLWZsZXgtYXV0bycsICdzbWUtYXJyYW5nZS1vdmVyZmxvdy1hdXRvJ10sXHJcbiAgICAgICAgcGhvbmVEb3duOiBbJ3NtZS1sYXlvdXQtcGhvbmUtZG93biddLFxyXG4gICAgICAgIHJlZmxvdzogWydzbWUtbGF5b3V0LXBob25lLWRvd24nXVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHNtZVNldHRpbmdzUGFnZUNvbnRlbnRDbGFzc0xpc3QgPSB7XHJcbiAgICAgICAgcGhvbmVVcDogWydzbWUtcG9zaXRpb24tc3RyZXRjaCddLFxyXG4gICAgICAgIHBob25lRG93bjogWydzbWUtcG9zaXRpb24tZmxleC1ub25lJywgJ3NtZS1wb3NpdGlvbi1zdHJldGNoLWgnXSxcclxuICAgICAgICByZWZsb3c6IFsnc21lLXBvc2l0aW9uLWZsZXgtbm9uZScsICdzbWUtcG9zaXRpb24tc3RyZXRjaC1oJ11cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBzbWVTZXR0aW5nc1BhZ2VDbGFzc0xpc3QgPSB7XHJcbiAgICAgICAgcGhvbmVVcDogW10sXHJcbiAgICAgICAgcGhvbmVEb3duOiBbJ3NtZS1sYXlvdXQtcmVsYXRpdmUnXSxcclxuICAgICAgICByZWZsb3c6IFsnc21lLWxheW91dC1yZWxhdGl2ZSddXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgc21lQ29tbW9uU2V0dGluZ0NvbnRlbnRDbGFzc0xpc3QgPSB7XHJcbiAgICAgICAgcGhvbmVVcDogWydzbWUtcG9zaXRpb24tc3RyZXRjaCddLFxyXG4gICAgICAgIHBob25lRG93bjogWydzbWUtcG9zaXRpb24tc3RyZXRjaC1oJywgJ3NtZS1sYXlvdXQtcmVzcG9uc2l2ZS16b25lLXhzJ10sXHJcbiAgICAgICAgcmVmbG93OiBbJ3NtZS1wb3NpdGlvbi1zdHJldGNoLWgnLCAnc21lLWxheW91dC1yZXNwb25zaXZlLXpvbmUteHMnXVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHNtZUxheW91dEl0ZW1Db250ZW50Q2xhc3NMaXN0ID0ge1xyXG4gICAgICAgIHBob25lVXA6IFsnc21lLXBvc2l0aW9uLXN0cmV0Y2gnXSxcclxuICAgICAgICBwaG9uZURvd246IFsnc21lLXBvc2l0aW9uLXJlbGF0aXZlJywgJ3NtZS1hcnJhbmdlLXN0YWNrLXYnXSxcclxuICAgICAgICByZWZsb3c6IFsnc21lLXBvc2l0aW9uLXJlbGF0aXZlJywgJ3NtZS1hcnJhbmdlLXN0YWNrLXYnXVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGlmcmFtZUhlaWdodE1hcHBpbmdzID0ge1xyXG4gICAgICAgICdtc2Z0LXNtZS1maWxlLWV4cGxvcmVyLXNtYlNlcnZlclNldHRpbmdzJzogJzkwMCdcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFdhaXRzIGZvciB0aGUgaWZyYW1lIHRvIGxvYWQgYW5kIHNldCBpZnJhbWUncyBoZWlnaHQgdG8gYXZvaWQgdW5leHBlY3RlZCBzY3JvbGwgYmFycy5cclxuICAgICogVGhpcyB3aWxsIGJlIHRyaWdnZXJlZCBvbiBsYXlvdXQgY2hhbmdlZCBvciBvbiBzZWxlY3RlZCBzZXR0aW5ncyBjaGFuZ2VkLlxyXG4gICAgKi9cclxuICAgQERlYm91bmNlKClcclxuICAgcHVibGljIHNldElmcmFtZUhlaWdodChjb25uZWN0aW9uU2V0dGluZ3M6IGJvb2xlYW4sIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmKSB7XHJcbiAgICAgICBpZiAoIWNvbm5lY3Rpb25TZXR0aW5ncykge1xyXG4gICAgICAgICAgIHJldHVybjtcclxuICAgICAgIH1cclxuXHJcbiAgICAgICBpZiAoIWhvc3RFbGVtZW50KSB7XHJcbiAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgfVxyXG5cclxuICAgICAgIGNvbnN0IG1hcHBpbmdzID0gdGhpcy5pZnJhbWVIZWlnaHRNYXBwaW5ncztcclxuXHJcbiAgICAgICBjb25zdCBjb21tb25TZXR0aW5nc0NvbnRlbnQgPSAgaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzbWUtc2V0dGluZ3MtY29udGVudCcpO1xyXG4gICAgICAgaWYgKCFjb21tb25TZXR0aW5nc0NvbnRlbnQpIHtcclxuICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICB9XHJcblxyXG4gICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJldlNpemU7XHJcblxyXG4gICAgICAgLy8gb24gcGhvbmUgdXAsIGRvIG5vdCBvdmVycmlkZSBtaW4taGVpZ2h0XHJcbiAgICAgICBpZiAoc2l6ZS5zaXplID09PSBTbWVSZXNwb25zaXZlV2luZG93QnJlYWtwb2ludHMuUGhvbmVVcCkge1xyXG4gICAgICAgICAgICBjb21tb25TZXR0aW5nc0NvbnRlbnQuc3R5bGUubWluSGVpZ2h0ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgIH1cclxuXHJcbiAgICAgICAvLyBkZWZpbmVkIGZyb20gdGhlIGN1c3RvbS5zY3NzXHJcbiAgICAgICBpZiAoY29tbW9uU2V0dGluZ3NDb250ZW50LmNsaWVudEhlaWdodCA+PSA1MDApIHtcclxuICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBjb21tb25TZXR0aW5nc0NvbnRlbnQucXVlcnlTZWxlY3RvcignaWZyYW1lW2lkXTpub3QoLnNtZS1sYXlvdXQtbm9uZSknKTtcclxuICAgICAgICAgICBpZiAoIWlmcmFtZSkge1xyXG4gICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICBjb25zdCBpZCA9IGlmcmFtZS5pZDtcclxuXHJcbiAgICAgICAgICAgaWYgKCFtYXBwaW5ncy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCBmcm9tIHRoZSBjdXN0b20uc2NzcywgdGhlIGRlZmluaXRpb24gaXMgNTAwcHggaGVpZ2h0LlxyXG4gICAgICAgICAgICAgICAvLyBGb3IgY29udGVudHMgdGhhdCB3b3VsZCBiZSBncmVhdGVyIHRoYW4gNTAwLCBwbGVhc2UgbWFudWFsbHkgdXBkYXRlIHRoZSBpZnJhbWVIZWlnaHRNYXBwaW5ncyBvYmplY3QuXHJcbiAgICAgICAgICAgICAgIC8vIHJlc2V0IG92ZXJyaWRlXHJcbiAgICAgICAgICAgICAgIGNvbW1vblNldHRpbmdzQ29udGVudC5zdHlsZS5taW5IZWlnaHQgPSAnJztcclxuICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgY29tbW9uU2V0dGluZ3NDb250ZW50LnN0eWxlLm1pbkhlaWdodCA9IG1hcHBpbmdzW2lkXSArICdweCc7XHJcbiAgICAgICB9XHJcbiAgIH1cclxuXHJcbiAgIC8qKlxyXG4gICAgKiBUaGUgb24gd2luZG93IHNpemVkIGNoYW5nZWQgZXZlbnQgaGFuZGxlciBmb3IgdGhlIGNvbW1vbiBzZXR0aW5ncyB3aXRoIGlmcmFtZSBhcyBjb250ZW50LlxyXG4gICAgKiBAcGFyYW0gY29ubmVjdGlvblNldHRpbmdzIHdoZXRoZXIgaXQgaXMgY29ubmVjdGlvbiBzZXR0aW5ncyBwYWdlLlxyXG4gICAgKiBAcGFyYW0gc21lQ29tbW9uU2V0dGluZ3MgdGhlIGhvc3QgZWxlbWVudCBmb3IgdGhlIHNtZSBjb21tb24gc2V0dGluZ3MuXHJcbiAgICAqIEByZXR1cm5zIHZvaWRcclxuICAgICovXHJcbiAgICBwdWJsaWMgb25XaW5kb3dTaXplQ2hhbmdlZENvbW1vblNldHRpbmdzKGNvbm5lY3Rpb25TZXR0aW5nczogYm9vbGVhbiwgc21lQ29tbW9uU2V0dGluZ3M6IEVsZW1lbnRSZWYpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3NzVjIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uU2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzbWVDb21tb25TZXR0aW5ncyB8fCAhc21lQ29tbW9uU2V0dGluZ3MubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldElmcmFtZUhlaWdodChjb25uZWN0aW9uU2V0dGluZ3MsIHNtZUNvbW1vblNldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvbiB3aW5kb3cgc2l6ZWQgY2hhbmdlZCBldmVudCBoYW5kbGVyIGZvciB0aGUgY29tbW9uIHNldHRpbmdzIGluIGdlbmVyYWwuXHJcbiAgICAgKiBAcGFyYW0gc21lU2V0dGluZ3NQYWdlIHRoZSBzbWUgc2V0dGluZ3MgcGFnZSBlbGVtZW50LlxyXG4gICAgICogQHJldHVybnMgdm9pZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25XaW5kb3dTaXplQ2hhbmdlZChzbWVTZXR0aW5nc1BhZ2U6IEVsZW1lbnRSZWYpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3NzVjIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzbWVTZXR0aW5nc1BhZ2UgfHwgIXNtZVNldHRpbmdzUGFnZS5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzbWVTZXR0aW5nc1BhZ2U/Lm5hdGl2ZUVsZW1lbnQ/LmNoaWxkRWxlbWVudENvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIFdhaXRzIHVudGlsIGNvbXBvbmVudHMgaW5pdGlhbGl6ZWQuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbldpbmRvd1NpemVDaGFuZ2VkKHNtZVNldHRpbmdzUGFnZSk7XHJcbiAgICAgICAgICAgIH0sIDI1MCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIG5nLXRlbXBsYXRlcyB3cmFwcGVkIHdpdGggYWNjb3VudC5jb21wb25lbnQuaHRtbCBhZnRlciBsb2dnZWQgaW4uXHJcbiAgICAgICAgaWYgKHNtZVNldHRpbmdzUGFnZS5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgc21lU2V0dGluZ3NQYWdlLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC50YWdOYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFRhZ05hbWUgPSBzbWVTZXR0aW5nc1BhZ2UubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudFRhZ05hbWUgPT09ICduZy1jb21wb25lbnQnICYmICFzbWVTZXR0aW5nc1BhZ2UubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaWdub3JpbmcgYWNjb3VudC5jb21wb25lbnQuaHRtbCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBsYXlvdXRJdGVtQ29udGVudCA9IHRoaXMuZ2V0TGF5b3V0SXRlbUFuY2VzdG9yKHNtZVNldHRpbmdzUGFnZSk7XHJcblxyXG4gICAgICAgIGxldCBzbWVMYXlvdXQ7XHJcblxyXG4gICAgICAgIGxldCBjb21tb25TZXR0aW5nSGVhZGVyLCBjb21tb25TZXR0aW5nQ29udGVudCwgY29tbW9uU2V0dGluZ0Zvb3RlcjtcclxuXHJcbiAgICAgICAgbGV0IGxheW91dEl0ZW1TdHJldGNoSDtcclxuICAgICAgICAvLyBJZiBzZXR0aW5ncyBwYWdlIG5vdCBpbiBhbiBpZnJhbWUsIGxheW91dEl0ZW1Db250ZW50IHdpbGwgYWx3YXlzIGJlIHRoZXJlLlxyXG4gICAgICAgIC8vIElmIHNldHRpbmdzIHBhZ2UgaW5zaWRlIG9mIGFuIGlmcmFtZSwgbGF5b3V0SXRlbUNvbnRlbnQgY2Fubm90IGJlIGZvdW5kIGR1ZSB0byBub3QgaW4gdGhlIHNhbWUgY29udGV4dC5cclxuICAgICAgICBpZiAobGF5b3V0SXRlbUNvbnRlbnQpIHtcclxuICAgICAgICAgICAgbGF5b3V0SXRlbVN0cmV0Y2hIID0gdGhpcy5sYXlvdXRJdGVtU3RyZXRjaFdpZHRoKGxheW91dEl0ZW1Db250ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGNvbW1vblNldHRpbmdIZWFkZXIgPSB0aGlzLmdldFNldHRpbmdzQ29udGVudChsYXlvdXRJdGVtQ29udGVudCwgJ3NtZS1zZXR0aW5ncy1oZWFkZXInKTtcclxuICAgICAgICAgICAgY29tbW9uU2V0dGluZ0NvbnRlbnQgPSB0aGlzLmdldFNldHRpbmdzQ29udGVudChsYXlvdXRJdGVtQ29udGVudCwgJ3NtZS1zZXR0aW5ncy1jb250ZW50Jyk7XHJcbiAgICAgICAgICAgIGNvbW1vblNldHRpbmdGb290ZXIgPSB0aGlzLmdldFNldHRpbmdzQ29udGVudChsYXlvdXRJdGVtQ29udGVudCwgJ3NtZS1zZXR0aW5ncy1mb290ZXInKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjb21tb25TZXR0aW5nc0ZvdW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gSWYgbm90IGV4aXN0ZWQsIHJldHVybi5cclxuICAgICAgICBpZiAoIWNvbW1vblNldHRpbmdDb250ZW50ICYmICFjb21tb25TZXR0aW5nRm9vdGVyICYmICFjb21tb25TZXR0aW5nSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGNvbW1vblNldHRpbmdzRm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvbW1vbiBzZXR0aW5ncyBub3QgZm91bmQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzUGFnZUhlYWRlciA9IHRoaXMuZ2V0U2V0dGluZ3NDb250ZW50KHNtZVNldHRpbmdzUGFnZS5uYXRpdmVFbGVtZW50LCAnc21lLXNldHRpbmdzLWhlYWRlcicpO1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzUGFnZUNvbnRlbnQgPSB0aGlzLmdldFNldHRpbmdzQ29udGVudChzbWVTZXR0aW5nc1BhZ2UubmF0aXZlRWxlbWVudCwgJ3NtZS1zZXR0aW5ncy1jb250ZW50Jyk7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3NQYWdlRm9vdGVyID0gdGhpcy5nZXRTZXR0aW5nc0NvbnRlbnQoc21lU2V0dGluZ3NQYWdlLm5hdGl2ZUVsZW1lbnQsICdzbWUtc2V0dGluZ3MtZm9vdGVyJyk7XHJcblxyXG4gICAgICAgIGlmICghc2V0dGluZ3NQYWdlSGVhZGVyICYmICFzZXR0aW5nc1BhZ2VDb250ZW50ICYmICFzZXR0aW5nc1BhZ2VGb290ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0U21lUmVzcG9uc2l2ZVdpbmRvd0RhdGEoKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbW1vblNldHRpbmdzRm91bmQgJiYgbGF5b3V0SXRlbUNvbnRlbnQpIHtcclxuICAgICAgICAgICAgc21lTGF5b3V0ID0gdGhpcy5nZXRQYXJlbnRFbGVtZW50QnlUYWcoc21lU2V0dGluZ3NQYWdlLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICBbJ3NtZS1sYXlvdXQnXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBsYXlvdXRJdGVtU3RyZXRjaEg6IGlmIHRoZSBzZXR0aW5ncyBjb250ZW50IGZyb20gdGhlIHNldHRpbmdzIHBhZ2UgaXMgcmVuZGVyaW5nIGluIDEwMCUuXHJcbiAgICAgICAgLy8gbWVhbmluZyB0aGUgY29udGVudCBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgYm90dG9tIG9mIHRoZSBzZXR0aW5ncyBuYXYgZHVlIHRvIHNtYWxsIHdpbmRvdy5cclxuICAgICAgICAvLyBvdGhlcndpc2Ugd2UganVzdCBjbGVhbiB1cCB0aGUgaGVpZ2h0IGFuZCByZXR1cm4uXHJcbiAgICAgICAgaWYgKHNpemUucGhvbmVEb3duKSB7XHJcbiAgICAgICAgICAgIGlmIChzbWVTZXR0aW5nc1BhZ2U/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NBcnJheU9uV2luZG93U2l6ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZVNldHRpbmdzUGFnZUNsYXNzTGlzdCwgJ3Bob25lRG93bicsIHNtZVNldHRpbmdzUGFnZS5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNldHRpbmdzUGFnZUNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NBcnJheU9uV2luZG93U2l6ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZVNldHRpbmdzUGFnZUNvbnRlbnRDbGFzc0xpc3QsICdwaG9uZURvd24nLCBzZXR0aW5nc1BhZ2VDb250ZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbW1vblNldHRpbmdzRm91bmQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb21tb25TZXR0aW5nSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1vblNldHRpbmdDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZUNvbW1vblNldHRpbmdDb250ZW50Q2xhc3NMaXN0LCAncGhvbmVEb3duJywgY29tbW9uU2V0dGluZ0NvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb21tb25TZXR0aW5nRm9vdGVyKSB7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGxheW91dEl0ZW1Db250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZUxheW91dEl0ZW1Db250ZW50Q2xhc3NMaXN0LCAncGhvbmVEb3duJywgbGF5b3V0SXRlbUNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc21lTGF5b3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NBcnJheU9uV2luZG93U2l6ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc21lTGF5b3V0Q2xhc3NMaXN0LCAncGhvbmVEb3duJywgc21lTGF5b3V0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHNpemUucmVmbG93TW9kZSkge1xyXG4gICAgICAgICAgICBpZiAoc21lU2V0dGluZ3NQYWdlPy5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzQXJyYXlPbldpbmRvd1NpemUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWVTZXR0aW5nc1BhZ2VDbGFzc0xpc3QsICdyZWZsb3cnLCBzbWVTZXR0aW5nc1BhZ2UubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzbWVMYXlvdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NBcnJheU9uV2luZG93U2l6ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZUxheW91dENsYXNzTGlzdCwgJ3JlZmxvdycsIHNtZUxheW91dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nc1BhZ2VDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzQXJyYXlPbldpbmRvd1NpemUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWVTZXR0aW5nc1BhZ2VDb250ZW50Q2xhc3NMaXN0LCAncmVmbG93Jywgc2V0dGluZ3NQYWdlQ29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb21tb25TZXR0aW5nQ29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lQ29tbW9uU2V0dGluZ0NvbnRlbnRDbGFzc0xpc3QsICdyZWZsb3cnLCBjb21tb25TZXR0aW5nQ29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChsYXlvdXRJdGVtQ29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lTGF5b3V0SXRlbUNvbnRlbnRDbGFzc0xpc3QsICdyZWZsb3cnLCBsYXlvdXRJdGVtQ29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHNpemUucGhvbmVVcCkge1xyXG4gICAgICAgICAgICBpZiAoc21lU2V0dGluZ3NQYWdlPy5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzQXJyYXlPbldpbmRvd1NpemUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWVTZXR0aW5nc1BhZ2VDbGFzc0xpc3QsICdwaG9uZVVwJywgc21lU2V0dGluZ3NQYWdlLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc21lTGF5b3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzQXJyYXlPbldpbmRvd1NpemUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWVMYXlvdXRDbGFzc0xpc3QsICdwaG9uZVVwJywgc21lTGF5b3V0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNldHRpbmdzUGFnZUNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NBcnJheU9uV2luZG93U2l6ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZVNldHRpbmdzUGFnZUNvbnRlbnRDbGFzc0xpc3QsICdwaG9uZVVwJywgc2V0dGluZ3NQYWdlQ29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb21tb25TZXR0aW5nQ29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lQ29tbW9uU2V0dGluZ0NvbnRlbnRDbGFzc0xpc3QsICdwaG9uZVVwJywgY29tbW9uU2V0dGluZ0NvbnRlbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobGF5b3V0SXRlbUNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NBcnJheU9uV2luZG93U2l6ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZUxheW91dEl0ZW1Db250ZW50Q2xhc3NMaXN0LCAncGhvbmVVcCcsIGxheW91dEl0ZW1Db250ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldExheW91dEl0ZW1BbmNlc3RvcihzbWVTZXR0aW5nc1BhZ2U6IEVsZW1lbnRSZWYpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgbGV0IGxldmVsID0gMTA7XHJcbiAgICAgICAgY29uc3Qgc21lU2V0dGluZ3NQYWdlTmF0aXZlRWxlbWVudCA9IHNtZVNldHRpbmdzUGFnZS5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwYXJlbnQgPSBzbWVTZXR0aW5nc1BhZ2VOYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHdoaWxlIChsZXZlbCA+IDAgJiYgIWZvdW5kKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC50YWdOYW1lICYmIHBhcmVudC50YWdOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09ICdzbWUtbGF5b3V0LWl0ZW0nKSB7XHJcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXZlbCAtPSAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxheW91dEl0ZW1TdHJldGNoV2lkdGgobGF5b3V0SXRlbUNvbnRlbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFsYXlvdXRJdGVtQ29udGVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB3aWR0aCA9IGxheW91dEl0ZW1Db250ZW50Py5zdHlsZT8ud2lkdGg7XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSAnMTAwJScpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTZXR0aW5nc0NvbnRlbnQobGF5b3V0SXRlbUNvbnRlbnQ6IEhUTUxFbGVtZW50LCB0YXJnZXQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBpZiAoIWxheW91dEl0ZW1Db250ZW50LmNoaWxkRWxlbWVudENvdW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0SXRlbUNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGF5b3V0SXRlbUNvbnRlbnQuY2hpbGRyZW5baV0udGFnTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSB0YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiA8SFRNTEVsZW1lbnQ+bGF5b3V0SXRlbUNvbnRlbnQuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbn1cclxuIl19