UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

212 lines 31.1 kB
import { Component, Injector, Input } from '@angular/core'; import { map } from 'rxjs/operators'; import { CoreBaseComponent } from '../common/base.component'; import { DialogService } from '../dialog/dialog.service'; import { LayoutConfigGenerator } from '../layout/layout-config'; import { SettingsFormService } from './settings-form.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../layout/layout.component"; import * as i3 from "../layout/layout-item.component"; import * as i4 from "../layout/layout-definition.component"; import * as i5 from "../tooltip/tooltip.directive"; function SettingsComponent_div_1_span_3_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 12); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r2.headerSeparator); } } function SettingsComponent_div_1_span_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 13); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(2); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r3.selectedSettingsTitle); } } function SettingsComponent_div_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 8)(1, "h2", 9); i0.ɵɵtext(2); i0.ɵɵtemplate(3, SettingsComponent_div_1_span_3_Template, 2, 1, "span", 10); i0.ɵɵtemplate(4, SettingsComponent_div_1_span_4_Template, 2, 1, "span", 11); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵproperty("title", ctx_r0.fullSettingsTitle); i0.ɵɵattribute("aria-label", ctx_r0.fullSettingsTitle); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx_r0.settingsTitle, " "); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.selectedSettingsTitle); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.selectedSettingsTitle); } } const _c0 = [[["sme-settings-navigation"]], [["sme-settings-header"]], [["sme-settings-content"]], [["sme-settings-footer"]]]; const _c1 = ["sme-settings-navigation", "sme-settings-header", "sme-settings-content", "sme-settings-footer"]; /** * * @smeDoc {@label Settings @id sme-settings} * * @overview * @file {@filepath ./examples/settings-overview.md} * * @example {@label Basic Multi-Form Usage @id basic-multi} * @file {@filename component.html @filepath ./examples/multi-form-example/component.html} * @file {@filename component.ts @filepath ./examples/multi-form-example/component.ts} * @file {@filename panel1.ts @filepath ./examples/multi-form-example/panel1.ts} * @file {@filename panel1.html @filepath ./examples/multi-form-example/panel1.html} * @file {@filename panel2.ts @filepath ./examples/multi-form-example/panel2.ts} * @file {@filename panel2.html @filepath ./examples/multi-form-example/panel2.html} * @file {@filename component-routing.module @filepath ./examples/multi-form-example/routing.module.ts} * * @example {@label Basic Single-Form Usage @id basic-single} * @file {@filename component.html @filepath ./examples/single-form-example/component.html} * @file {@filename component.ts @filepath ./examples/single-form-example/component.ts} * @file {@filename panel.ts @filepath ./examples/single-form-example/panel.ts} * @file {@filename panel.html @filepath ./examples/single-form-example/panel.html} * @file {@filename component-routing.module @filepath ./examples/single-form-example/routing.module.ts} * */ /** * Defines base settings component, implements core functionality + settings form. */ export class SettingsComponent extends CoreBaseComponent { constructor(injector) { super(injector); this.allForms = []; /** * Separator used in sticky header on top of Settings page */ this.headerSeparator = '|'; /** * The generator for layout config. */ this.layoutConfigGenerator = new LayoutConfigGenerator(); this.autoFocus = true; this.settingsForms = injector.get(SettingsFormService); this.dialogService = injector.get(DialogService); } /** * The source name to use for logging */ get logSourceName() { return 'SettingsComponent'; } ngOnInit() { super.ngOnInit(); this.settingsForms.stopProcessingEvents(); this.settingsForms.allForms.forEach((form) => this.allForms.push(form)); this.subscriptions.push(this.settingsForms.formAdded().subscribe((formAddedData) => { // to avoid duplicates we first remove the form if it exists MsftSme.remove(this.allForms, formAddedData.formGroup); this.allForms.push(formAddedData.formGroup); // If we have a new form, it means the user navigated so we reset the autofocus this.autoFocus = true; }), this.settingsForms.formRemoved().subscribe((form) => { MsftSme.remove(this.allForms, form); })); this.fullSettingsTitle = this.settingsTitle; this.currentLayoutConfig = this.layoutConfigGenerator.initialize([300, '100']); } ngOnDestroy() { super.ngOnDestroy(); this.settingsForms.startProcessingEvents(); } canDeactivate(component, route, state) { let continueNavigation = true; this.allForms.first((form) => { if (form.dirty) { continueNavigation = this.dialogService .showConfirmation(component.confirmContinueEditingDialogOptions(form, this.allForms)) .pipe(map((result) => { // The default is to continue editing const discardChanges = !result.confirmed; if (discardChanges) { this.settingsForms.allForms = []; } return discardChanges; })); // with one dirty form is enough to show the dialog, no need to iterate over all the other dialogs return true; } return false; }); return continueNavigation; } /** * Angular Life Cycle hook for After View Checked. * When the visibility changes, we are going to focus on the first element that has the autofocus attribute */ ngAfterViewChecked() { super.ngAfterViewChecked(); if (this.autoFocus) { const autofocusElement = this.hostElement.nativeElement.querySelector('[autofocus]'); if (autofocusElement) { this.autoFocus = false; autofocusElement.focus(); } } } /** * Gets the initial host classes to be applied to this element */ getInitialHostClasses() { return super.getInitialHostClasses().concat([ 'sme-settings' ]); } /** * Update this.settingsTitle (header of the setting page) to newly selected setting item */ updateSelectedSettingTitle(newSelectedSettingTitle) { this.selectedSettingsTitle = newSelectedSettingTitle; const fullSettingsTitlePostFix = this.selectedSettingsTitle ? this.headerSeparator + ' ' + this.selectedSettingsTitle : ''; this.fullSettingsTitle = this.settingsTitle + ' ' + fullSettingsTitlePostFix; } } /** @nocollapse */ SettingsComponent.ɵfac = function SettingsComponent_Factory(t) { return new (t || SettingsComponent)(i0.ɵɵdirectiveInject(i0.Injector)); }; /** @nocollapse */ SettingsComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: SettingsComponent, selectors: [["sme-settings"]], inputs: { addPadding: "addPadding", backRoute: "backRoute", settingsTitle: "settingsTitle", selectedSettingsTitle: "selectedSettingsTitle" }, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 12, vars: 10, consts: [[1, "sme-arrange-stack-v", "sme-layout-relative", "sme-arrange-overflow-auto-y-phone-up", "sme-position-stretch"], ["class", "sme-layout-tool-header sme-position-flex-none sme-arrange-ellipsis sme-padding-bottom-none sme-padding-left-md", 4, "ngIf"], [1, "sme-position-flex-auto", "sme-arrange-overflow-auto", 3, "padLastItem", "layoutConfig", "itemHorizontalSpace"], ["layout", ""], ["name", "narrow", 3, "until", "columns"], ["name", "wide", 3, "columns"], [3, "columnSpan", "ngClass"], [1, "sme-position-stretch", "sme-padding-left-xl", "sme-padding-top-xs", 3, "columnSpan"], [1, "sme-layout-tool-header", "sme-position-flex-none", "sme-arrange-ellipsis", "sme-padding-bottom-none", "sme-padding-left-md"], [1, "sme-font-h3", "sme-arrange-ellipsis", "sme-position-stretch-h", 3, "title"], ["class", "sme-padding-horizontal-sm sme-font-family-normal", 4, "ngIf"], ["class", "sme-font-family-normal", 4, "ngIf"], [1, "sme-padding-horizontal-sm", "sme-font-family-normal"], [1, "sme-font-family-normal"]], template: function SettingsComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵprojectionDef(_c0); i0.ɵɵelementStart(0, "div", 0); i0.ɵɵtemplate(1, SettingsComponent_div_1_Template, 5, 5, "div", 1); i0.ɵɵelementStart(2, "sme-layout", 2, 3); i0.ɵɵelement(4, "sme-layout-definition", 4)(5, "sme-layout-definition", 5); i0.ɵɵelementStart(6, "sme-layout-item", 6); i0.ɵɵprojection(7); i0.ɵɵelementEnd(); i0.ɵɵelementStart(8, "sme-layout-item", 7); i0.ɵɵprojection(9, 1); i0.ɵɵprojection(10, 2); i0.ɵɵprojection(11, 3); i0.ɵɵelementEnd()()(); } if (rf & 2) { const _r1 = i0.ɵɵreference(3); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.settingsTitle); i0.ɵɵadvance(1); i0.ɵɵproperty("padLastItem", false)("layoutConfig", ctx.currentLayoutConfig)("itemHorizontalSpace", 36); i0.ɵɵadvance(2); i0.ɵɵproperty("until", 768)("columns", 1); i0.ɵɵadvance(1); i0.ɵɵproperty("columns", 5); i0.ɵɵadvance(1); i0.ɵɵproperty("columnSpan", 1)("ngClass", _r1.currentLayoutDefinitionName === "narrow" ? "" : "sme-position-stretch-v"); i0.ɵɵadvance(2); i0.ɵɵproperty("columnSpan", 4); } }, dependencies: [i1.NgClass, i1.NgIf, i2.LayoutComponent, i3.LayoutItemComponent, i4.LayoutDefinitionComponent, i5.TooltipDirective], encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SettingsComponent, [{ type: Component, args: [{ selector: 'sme-settings', template: "<div class=\"sme-arrange-stack-v sme-layout-relative sme-arrange-overflow-auto-y-phone-up sme-position-stretch\">\r\n <div class=\"sme-layout-tool-header sme-position-flex-none sme-arrange-ellipsis sme-padding-bottom-none sme-padding-left-md\" *ngIf=\"settingsTitle\">\r\n <h2 [title]=\"fullSettingsTitle\" [attr.aria-label]=\"fullSettingsTitle\" class=\"sme-font-h3 sme-arrange-ellipsis sme-position-stretch-h\">\r\n {{ settingsTitle }}\r\n <span *ngIf=\"selectedSettingsTitle\" class=\"sme-padding-horizontal-sm sme-font-family-normal\">{{ headerSeparator }}</span>\r\n <span *ngIf=\"selectedSettingsTitle\" class=\"sme-font-family-normal\">{{ selectedSettingsTitle }}</span>\r\n </h2>\r\n </div>\r\n <sme-layout #layout class=\"sme-position-flex-auto sme-arrange-overflow-auto\" [padLastItem]=\"false\" [layoutConfig]=\"currentLayoutConfig\" [itemHorizontalSpace]=\"36\">\r\n <sme-layout-definition name=\"narrow\" [until]=\"768\" [columns]=\"1\"></sme-layout-definition>\r\n <sme-layout-definition name=\"wide\" [columns]=\"5\"></sme-layout-definition>\r\n <sme-layout-item [columnSpan]=\"1\" [ngClass]=\"layout.currentLayoutDefinitionName==='narrow' ? '' : 'sme-position-stretch-v'\">\r\n <ng-content select=\"sme-settings-navigation\"></ng-content>\r\n </sme-layout-item>\r\n <sme-layout-item [columnSpan]=\"4\" class=\"sme-position-stretch sme-padding-left-xl sme-padding-top-xs\">\r\n <ng-content select=\"sme-settings-header\"></ng-content>\r\n <ng-content select=\"sme-settings-content\"></ng-content>\r\n <ng-content select=\"sme-settings-footer\"></ng-content>\r\n </sme-layout-item>\r\n </sme-layout>\r\n</div>\r\n" }] }], function () { return [{ type: i0.Injector }]; }, { addPadding: [{ type: Input }], backRoute: [{ type: Input }], settingsTitle: [{ type: Input }], selectedSettingsTitle: [{ type: Input }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc2V0dGluZ3Mvc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc2V0dGluZ3Mvc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFJaEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7O0lDTHhELGdDQUE2RjtJQUFBLFlBQXFCO0lBQUEsaUJBQU87OztJQUE1QixlQUFxQjtJQUFyQiw0Q0FBcUI7OztJQUNsSCxnQ0FBbUU7SUFBQSxZQUEyQjtJQUFBLGlCQUFPOzs7SUFBbEMsZUFBMkI7SUFBM0Isa0RBQTJCOzs7SUFKbEcsOEJBQWtKLFlBQUE7SUFFOUksWUFDQTtJQUFBLDJFQUF5SDtJQUN6SCwyRUFBcUc7SUFDdkcsaUJBQUssRUFBQTs7O0lBSkQsZUFBMkI7SUFBM0IsZ0RBQTJCO0lBQUMsc0RBQXFDO0lBQ25FLGVBQ0E7SUFEQSxxREFDQTtJQUFPLGVBQTJCO0lBQTNCLG1EQUEyQjtJQUMzQixlQUEyQjtJQUEzQixtREFBMkI7Ozs7QURNeEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUY7O0dBRUc7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QUFtSztRQUNqSywyQ0FBeUYsK0JBQUE7UUFFekYsMENBQTRIO1FBQzFILGtCQUEwRDtRQUM1RCxpQkFBa0I7UUFDbEIsMENBQXNHO1FBQ3BHLHFCQUFzRDtRQUN0RCxzQkFBdUQ7UUFDdkQsc0JBQXNEO1FBQ3hELGlCQUFrQixFQUFBLEVBQUE7OztRQWpCeUcsZUFBbUI7UUFBbkIsd0NBQW1CO1FBT25FLGVBQXFCO1FBQXJCLG1DQUFxQix5Q0FBQSwyQkFBQTtRQUMzRCxlQUFhO1FBQWIsMkJBQWEsY0FBQTtRQUNmLGVBQWE7UUFBYiwyQkFBYTtRQUMvQixlQUFnQjtRQUFoQiw4QkFBZ0IseUZBQUE7UUFHaEIsZUFBZ0I7UUFBaEIsOEJBQWdCOzt1RkQ2QnhCLGlCQUFpQjtjQUo3QixTQUFTOzJCQUNJLGNBQWM7MkRBa0JqQixVQUFVO2tCQURoQixLQUFLO1lBWUMsU0FBUztrQkFEZixLQUFLO1lBSUMsYUFBYTtrQkFEbkIsS0FBSztZQU9DLHFCQUFxQjtrQkFEM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIENvbXBvbmVudCwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIE5hdmlnYXRpb25FeHRyYXMsIFJvdXRlclN0YXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vZGlhbG9nL2RpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5b3V0Q29uZmlnLCBMYXlvdXRDb25maWdHZW5lcmF0b3IgfSBmcm9tICcuLi9sYXlvdXQvbGF5b3V0LWNvbmZpZyc7XHJcbmltcG9ydCB7IENhbkNvbXBvbmVudERlYWN0aXZhdGUgfSBmcm9tICcuL3NldHRpbmdzLWNhbi1kZWFjdGl2YXRlLWd1YXJkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZXR0aW5nc0Zvcm1TZXJ2aWNlIH0gZnJvbSAnLi9zZXR0aW5ncy1mb3JtLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBzbWVEb2Mge0BsYWJlbCBTZXR0aW5ncyBAaWQgc21lLXNldHRpbmdzfVxyXG4gKlxyXG4gKiBAb3ZlcnZpZXdcclxuICogQGZpbGUge0BmaWxlcGF0aCAuL2V4YW1wbGVzL3NldHRpbmdzLW92ZXJ2aWV3Lm1kfVxyXG4gKlxyXG4gKiBAZXhhbXBsZSB7QGxhYmVsIEJhc2ljIE11bHRpLUZvcm0gVXNhZ2UgQGlkIGJhc2ljLW11bHRpfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL211bHRpLWZvcm0tZXhhbXBsZS9jb21wb25lbnQuaHRtbH1cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQudHMgQGZpbGVwYXRoIC4vZXhhbXBsZXMvbXVsdGktZm9ybS1leGFtcGxlL2NvbXBvbmVudC50c31cclxuICogQGZpbGUge0BmaWxlbmFtZSBwYW5lbDEudHMgQGZpbGVwYXRoIC4vZXhhbXBsZXMvbXVsdGktZm9ybS1leGFtcGxlL3BhbmVsMS50c31cclxuICogQGZpbGUge0BmaWxlbmFtZSBwYW5lbDEuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9tdWx0aS1mb3JtLWV4YW1wbGUvcGFuZWwxLmh0bWx9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgcGFuZWwyLnRzIEBmaWxlcGF0aCAuL2V4YW1wbGVzL211bHRpLWZvcm0tZXhhbXBsZS9wYW5lbDIudHN9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgcGFuZWwyLmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvbXVsdGktZm9ybS1leGFtcGxlL3BhbmVsMi5odG1sfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC1yb3V0aW5nLm1vZHVsZSBAZmlsZXBhdGggLi9leGFtcGxlcy9tdWx0aS1mb3JtLWV4YW1wbGUvcm91dGluZy5tb2R1bGUudHN9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgQmFzaWMgU2luZ2xlLUZvcm0gVXNhZ2UgQGlkIGJhc2ljLXNpbmdsZX1cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9zaW5nbGUtZm9ybS1leGFtcGxlL2NvbXBvbmVudC5odG1sfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC50cyBAZmlsZXBhdGggLi9leGFtcGxlcy9zaW5nbGUtZm9ybS1leGFtcGxlL2NvbXBvbmVudC50c31cclxuICogQGZpbGUge0BmaWxlbmFtZSBwYW5lbC50cyBAZmlsZXBhdGggLi9leGFtcGxlcy9zaW5nbGUtZm9ybS1leGFtcGxlL3BhbmVsLnRzfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIHBhbmVsLmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvc2luZ2xlLWZvcm0tZXhhbXBsZS9wYW5lbC5odG1sfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC1yb3V0aW5nLm1vZHVsZSBAZmlsZXBhdGggLi9leGFtcGxlcy9zaW5nbGUtZm9ybS1leGFtcGxlL3JvdXRpbmcubW9kdWxlLnRzfVxyXG4gKlxyXG4gKi9cclxuXHJcbiAvKipcclxuICAqIERlZmluZXMgYmFzZSBzZXR0aW5ncyBjb21wb25lbnQsIGltcGxlbWVudHMgY29yZSBmdW5jdGlvbmFsaXR5ICsgc2V0dGluZ3MgZm9ybS5cclxuICAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLXNldHRpbmdzJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZXR0aW5ncy5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNldHRpbmdzQ29tcG9uZW50IGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ1NldHRpbmdzQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWxsRm9ybXM6IEZvcm1Hcm91cFtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAwNS8yMy8yMi4gUGxlYXNlIHJlbW92ZSB0aGlzIHBhcmFtZXRlciBmcm9tIHBhc3NpbmcgaW4gdG8gdGhpcyBjb250cm9sLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGFkZFBhZGRpbmc6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXBhcmF0b3IgdXNlZCBpbiBzdGlja3kgaGVhZGVyIG9uIHRvcCBvZiBTZXR0aW5ncyBwYWdlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSBoZWFkZXJTZXBhcmF0b3IgPSAnfCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBBZGQgeW91ciBvd24gY3VzdG9tIGJhY2sgYnV0dG9uIGluIHRoZSBmb3JtXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYmFja1JvdXRlOiB7IGNvbW1hbmRzOiBhbnlbXSwgZXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcyB9O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V0dGluZ3NUaXRsZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzZXR0aW5ncyB0aXRsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdGVkU2V0dGluZ3NUaXRsZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcmUgdGhlIGNvbmNhdGVuYXRpb24gb2Ygc2V0dGluZ3NUaXRsZSwgaGVhZGVyU2VwYXJhdG9yICYgc2VsZWN0ZWRTZXR0aW5nc1RpdGxlXHJcbiAgICAgKiBVc2VkIGZvciB0b29sIHRpcCB3aGVuIGhvdmVyIG92ZXIgaGVhZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmdWxsU2V0dGluZ3NUaXRsZTogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBzZXR0aW5nc0Zvcm1zOiBTZXR0aW5nc0Zvcm1TZXJ2aWNlO1xyXG5cclxuICAgIHB1YmxpYyBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGN1cnJlbnQgbGF5b3V0IGNvbmZpZyBmb3IgY3VzdG9tIGNvbmZpZyAxLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3VycmVudExheW91dENvbmZpZzogTGF5b3V0Q29uZmlnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGdlbmVyYXRvciBmb3IgbGF5b3V0IGNvbmZpZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxheW91dENvbmZpZ0dlbmVyYXRvcjogTGF5b3V0Q29uZmlnR2VuZXJhdG9yID0gbmV3IExheW91dENvbmZpZ0dlbmVyYXRvcigpO1xyXG5cclxuICAgIHByaXZhdGUgYXV0b0ZvY3VzID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dGluZ3NGb3JtcyA9IGluamVjdG9yLmdldChTZXR0aW5nc0Zvcm1TZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UgPSBpbmplY3Rvci5nZXQoRGlhbG9nU2VydmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dGluZ3NGb3Jtcy5zdG9wUHJvY2Vzc2luZ0V2ZW50cygpO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3NGb3Jtcy5hbGxGb3Jtcy5mb3JFYWNoKChmb3JtKSA9PiB0aGlzLmFsbEZvcm1zLnB1c2goZm9ybSkpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzRm9ybXMuZm9ybUFkZGVkKCkuc3Vic2NyaWJlKChmb3JtQWRkZWREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBkdXBsaWNhdGVzIHdlIGZpcnN0IHJlbW92ZSB0aGUgZm9ybSBpZiBpdCBleGlzdHNcclxuICAgICAgICAgICAgICAgIE1zZnRTbWUucmVtb3ZlKHRoaXMuYWxsRm9ybXMsIGZvcm1BZGRlZERhdGEuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWxsRm9ybXMucHVzaChmb3JtQWRkZWREYXRhLmZvcm1Hcm91cCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIG5ldyBmb3JtLCBpdCBtZWFucyB0aGUgdXNlciBuYXZpZ2F0ZWQgc28gd2UgcmVzZXQgdGhlIGF1dG9mb2N1c1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvRm9jdXMgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3NGb3Jtcy5mb3JtUmVtb3ZlZCgpLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgIChmb3JtKSA9PiB7IE1zZnRTbWUucmVtb3ZlKHRoaXMuYWxsRm9ybXMsIGZvcm0pOyB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZnVsbFNldHRpbmdzVGl0bGUgPSB0aGlzLnNldHRpbmdzVGl0bGU7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TGF5b3V0Q29uZmlnID0gdGhpcy5sYXlvdXRDb25maWdHZW5lcmF0b3IuaW5pdGlhbGl6ZShbMzAwLCAnMTAwJ10pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3NGb3Jtcy5zdGFydFByb2Nlc3NpbmdFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FuRGVhY3RpdmF0ZShcclxuICAgICAgICBjb21wb25lbnQ6IENhbkNvbXBvbmVudERlYWN0aXZhdGUsXHJcbiAgICAgICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXHJcbiAgICAgICAgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3RcclxuICAgICk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGNvbnRpbnVlTmF2aWdhdGlvbjogT2JzZXJ2YWJsZTxib29sZWFuPiB8IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmFsbEZvcm1zLmZpcnN0KChmb3JtKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmb3JtLmRpcnR5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZU5hdmlnYXRpb24gPSB0aGlzLmRpYWxvZ1NlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAuc2hvd0NvbmZpcm1hdGlvbihjb21wb25lbnQuY29uZmlybUNvbnRpbnVlRWRpdGluZ0RpYWxvZ09wdGlvbnMoZm9ybSwgdGhpcy5hbGxGb3JtcykpXHJcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBpcyB0byBjb250aW51ZSBlZGl0aW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNjYXJkQ2hhbmdlcyA9ICFyZXN1bHQuY29uZmlybWVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2NhcmRDaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nc0Zvcm1zLmFsbEZvcm1zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc2NhcmRDaGFuZ2VzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gd2l0aCBvbmUgZGlydHkgZm9ybSBpcyBlbm91Z2ggdG8gc2hvdyB0aGUgZGlhbG9nLCBubyBuZWVkIHRvIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIG90aGVyIGRpYWxvZ3NcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb250aW51ZU5hdmlnYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIExpZmUgQ3ljbGUgaG9vayBmb3IgQWZ0ZXIgVmlldyBDaGVja2VkLlxyXG4gICAgICogV2hlbiB0aGUgdmlzaWJpbGl0eSBjaGFuZ2VzLCB3ZSBhcmUgZ29pbmcgdG8gZm9jdXMgb24gdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBoYXMgdGhlIGF1dG9mb2N1cyBhdHRyaWJ1dGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcclxuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0NoZWNrZWQoKTtcclxuICAgICAgICBpZiAodGhpcy5hdXRvRm9jdXMpIHtcclxuICAgICAgICAgICAgY29uc3QgYXV0b2ZvY3VzRWxlbWVudCA9IHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbYXV0b2ZvY3VzXScpO1xyXG4gICAgICAgICAgICBpZiAoYXV0b2ZvY3VzRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvRm9jdXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGF1dG9mb2N1c0VsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGluaXRpYWwgaG9zdCBjbGFzc2VzIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtc2V0dGluZ3MnXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhpcy5zZXR0aW5nc1RpdGxlIChoZWFkZXIgb2YgdGhlIHNldHRpbmcgcGFnZSkgdG8gbmV3bHkgc2VsZWN0ZWQgc2V0dGluZyBpdGVtXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVTZWxlY3RlZFNldHRpbmdUaXRsZShuZXdTZWxlY3RlZFNldHRpbmdUaXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNldHRpbmdzVGl0bGUgPSBuZXdTZWxlY3RlZFNldHRpbmdUaXRsZTtcclxuICAgICAgICBjb25zdCBmdWxsU2V0dGluZ3NUaXRsZVBvc3RGaXggPSB0aGlzLnNlbGVjdGVkU2V0dGluZ3NUaXRsZSA/IHRoaXMuaGVhZGVyU2VwYXJhdG9yICsgJyAnICsgdGhpcy5zZWxlY3RlZFNldHRpbmdzVGl0bGUgOiAnJztcclxuICAgICAgICB0aGlzLmZ1bGxTZXR0aW5nc1RpdGxlID0gdGhpcy5zZXR0aW5nc1RpdGxlICsgJyAnICsgZnVsbFNldHRpbmdzVGl0bGVQb3N0Rml4O1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay12IHNtZS1sYXlvdXQtcmVsYXRpdmUgc21lLWFycmFuZ2Utb3ZlcmZsb3ctYXV0by15LXBob25lLXVwIHNtZS1wb3NpdGlvbi1zdHJldGNoXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS1sYXlvdXQtdG9vbC1oZWFkZXIgc21lLXBvc2l0aW9uLWZsZXgtbm9uZSBzbWUtYXJyYW5nZS1lbGxpcHNpcyBzbWUtcGFkZGluZy1ib3R0b20tbm9uZSBzbWUtcGFkZGluZy1sZWZ0LW1kXCIgKm5nSWY9XCJzZXR0aW5nc1RpdGxlXCI+XHJcbiAgICA8aDIgW3RpdGxlXT1cImZ1bGxTZXR0aW5nc1RpdGxlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJmdWxsU2V0dGluZ3NUaXRsZVwiIGNsYXNzPVwic21lLWZvbnQtaDMgc21lLWFycmFuZ2UtZWxsaXBzaXMgc21lLXBvc2l0aW9uLXN0cmV0Y2gtaFwiPlxyXG4gICAgICB7eyBzZXR0aW5nc1RpdGxlIH19XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRTZXR0aW5nc1RpdGxlXCIgY2xhc3M9XCJzbWUtcGFkZGluZy1ob3Jpem9udGFsLXNtIHNtZS1mb250LWZhbWlseS1ub3JtYWxcIj57eyBoZWFkZXJTZXBhcmF0b3IgfX08L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRTZXR0aW5nc1RpdGxlXCIgY2xhc3M9XCJzbWUtZm9udC1mYW1pbHktbm9ybWFsXCI+e3sgc2VsZWN0ZWRTZXR0aW5nc1RpdGxlIH19PC9zcGFuPlxyXG4gICAgPC9oMj5cclxuICA8L2Rpdj5cclxuICA8c21lLWxheW91dCAjbGF5b3V0IGNsYXNzPVwic21lLXBvc2l0aW9uLWZsZXgtYXV0byBzbWUtYXJyYW5nZS1vdmVyZmxvdy1hdXRvXCIgW3BhZExhc3RJdGVtXT1cImZhbHNlXCIgW2xheW91dENvbmZpZ109XCJjdXJyZW50TGF5b3V0Q29uZmlnXCIgW2l0ZW1Ib3Jpem9udGFsU3BhY2VdPVwiMzZcIj5cclxuICAgIDxzbWUtbGF5b3V0LWRlZmluaXRpb24gbmFtZT1cIm5hcnJvd1wiIFt1bnRpbF09XCI3NjhcIiBbY29sdW1uc109XCIxXCI+PC9zbWUtbGF5b3V0LWRlZmluaXRpb24+XHJcbiAgICA8c21lLWxheW91dC1kZWZpbml0aW9uIG5hbWU9XCJ3aWRlXCIgW2NvbHVtbnNdPVwiNVwiPjwvc21lLWxheW91dC1kZWZpbml0aW9uPlxyXG4gICAgPHNtZS1sYXlvdXQtaXRlbSBbY29sdW1uU3Bhbl09XCIxXCIgW25nQ2xhc3NdPVwibGF5b3V0LmN1cnJlbnRMYXlvdXREZWZpbml0aW9uTmFtZT09PSduYXJyb3cnID8gJycgOiAnc21lLXBvc2l0aW9uLXN0cmV0Y2gtdidcIj5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic21lLXNldHRpbmdzLW5hdmlnYXRpb25cIj48L25nLWNvbnRlbnQ+XHJcbiAgICA8L3NtZS1sYXlvdXQtaXRlbT5cclxuICAgIDxzbWUtbGF5b3V0LWl0ZW0gW2NvbHVtblNwYW5dPVwiNFwiIGNsYXNzPVwic21lLXBvc2l0aW9uLXN0cmV0Y2ggc21lLXBhZGRpbmctbGVmdC14bCBzbWUtcGFkZGluZy10b3AteHNcIj5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic21lLXNldHRpbmdzLWhlYWRlclwiPjwvbmctY29udGVudD5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic21lLXNldHRpbmdzLWNvbnRlbnRcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cInNtZS1zZXR0aW5ncy1mb290ZXJcIj48L25nLWNvbnRlbnQ+XHJcbiAgICA8L3NtZS1sYXlvdXQtaXRlbT5cclxuICA8L3NtZS1sYXlvdXQ+XHJcbjwvZGl2PlxyXG4iXX0=