@nova-ui/dashboards
Version:
Nova Dashboards is a framework designed to provide feature developers with a common solution for presenting data coming from various sources within a single view, as well as a set of predefined widget visualizations that are 100% configuration-driven and
83 lines • 19.8 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, TemplateRef, ViewEncapsulation, } from "@angular/core";
import { FormBuilder } from "@angular/forms";
import { LoggerService } from "@nova-ui/bits";
import { BaseLayout } from "../../../components/layouts/base-layout";
import { PizzagnaService } from "../../../pizzagna/services/pizzagna.service";
import * as i0 from "@angular/core";
import * as i1 from "../../../pizzagna/services/pizzagna.service";
import * as i2 from "@nova-ui/bits";
import * as i3 from "@angular/forms";
import * as i4 from "@angular/common";
import * as i5 from "@angular/cdk/portal";
import * as i6 from "../../../pizzagna/directives/component-portal/component-portal.directive";
export class WidgetConfiguratorSectionComponent extends BaseLayout {
static { this.lateLoadKey = "WidgetConfiguratorSectionComponent"; }
constructor(changeDetector, pizzagnaService, logger, formBuilder) {
super(changeDetector, pizzagnaService, logger);
this.formBuilder = formBuilder;
this.nodes = [];
this.headerText = "";
this.formReady = new EventEmitter();
this.formDestroy = new EventEmitter();
}
getNodes() {
return this.nodes;
}
ngOnInit() {
this.form = this.formBuilder.group({});
}
onEvent(componentId, event) {
if (event.id === "formReady") {
this.addFormGroup(componentId, event.payload);
}
if (Object.keys(this.form.controls).length === this.getNodes().length) {
this.formReady.emit(this.form);
}
}
addFormGroup(name, formGroup) {
this.form.addControl(name, formGroup);
}
ngOnDestroy() {
this.formDestroy.emit(this.form);
// Invoke super.ngOnDestroy to ensure that any base class observables are unsubscribed.
super.ngOnDestroy();
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetConfiguratorSectionComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.PizzagnaService }, { token: i2.LoggerService }, { token: i3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: WidgetConfiguratorSectionComponent, selector: "nui-widget-configurator-section", inputs: { headerTextTemplate: "headerTextTemplate", headerButtonsTemplate: "headerButtonsTemplate", nodes: "nodes", headerText: "headerText" }, outputs: { formReady: "formReady", formDestroy: "formDestroy" }, host: { classAttribute: "nui-widget-configurator-section" }, usesInheritance: true, ngImport: i0, template: "<div class=\"widget-configurator-section\">\n <div\n class=\"widget-configurator-section__header d-flex justify-content-between align-items-center\"\n >\n <ng-container *ngTemplateOutlet=\"headerTextTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"headerButtonsTemplate\"></ng-container>\n\n <!-- TODO: REMOVE THOSE AFTER ALL WIDGETS ARE USING nui-items-dynamic -->\n <div\n headerText\n *ngIf=\"headerText\"\n class=\"widget-configurator-section__header-text\"\n [title]=\"headerText\"\n >\n {{ headerText }}\n </div>\n <ng-content select=\"[headerText]\"></ng-content>\n <ng-content select=\"[headerButtons]\"></ng-content>\n </div>\n <ng-container *ngFor=\"let node of nodeConfigs; trackBy: trackByFn\">\n <ng-container\n nuiComponentPortal\n #componentPortal=\"nuiComponentPortal\"\n [componentId]=\"node.id\"\n [componentType]=\"node.componentType\"\n [providers]=\"node.providers\"\n [properties]=\"node.properties\"\n [outputs]=\"['formReady']\"\n (output)=\"onEvent(node.id, $event)\"\n >\n <ng-template\n [cdkPortalOutlet]=\"componentPortal.portal\"\n (attached)=\"componentPortal.attached($event)\"\n ></ng-template>\n </ng-container>\n </ng-container>\n <ng-content></ng-content>\n</div>\n", styles: [".widget-configurator-section{margin:15px;border-radius:3px;border:1px solid;border-color:var(--nui-color-line-default,#d9d9d9)}.widget-configurator-section__header{padding:15px 5px 15px 15px;height:40px;font-size:16px;font-weight:600;background-color:var(--nui-color-bg-table_header,#f0f0f0);color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6))}.widget-configurator-section__header-text{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "directive", type: i6.ComponentPortalDirective, selector: "[nuiComponentPortal]", inputs: ["componentId", "componentType", "properties", "providers", "outputs"], outputs: ["output"], exportAs: ["nuiComponentPortal"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetConfiguratorSectionComponent, decorators: [{
type: Component,
args: [{ selector: "nui-widget-configurator-section", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: "nui-widget-configurator-section" }, template: "<div class=\"widget-configurator-section\">\n <div\n class=\"widget-configurator-section__header d-flex justify-content-between align-items-center\"\n >\n <ng-container *ngTemplateOutlet=\"headerTextTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"headerButtonsTemplate\"></ng-container>\n\n <!-- TODO: REMOVE THOSE AFTER ALL WIDGETS ARE USING nui-items-dynamic -->\n <div\n headerText\n *ngIf=\"headerText\"\n class=\"widget-configurator-section__header-text\"\n [title]=\"headerText\"\n >\n {{ headerText }}\n </div>\n <ng-content select=\"[headerText]\"></ng-content>\n <ng-content select=\"[headerButtons]\"></ng-content>\n </div>\n <ng-container *ngFor=\"let node of nodeConfigs; trackBy: trackByFn\">\n <ng-container\n nuiComponentPortal\n #componentPortal=\"nuiComponentPortal\"\n [componentId]=\"node.id\"\n [componentType]=\"node.componentType\"\n [providers]=\"node.providers\"\n [properties]=\"node.properties\"\n [outputs]=\"['formReady']\"\n (output)=\"onEvent(node.id, $event)\"\n >\n <ng-template\n [cdkPortalOutlet]=\"componentPortal.portal\"\n (attached)=\"componentPortal.attached($event)\"\n ></ng-template>\n </ng-container>\n </ng-container>\n <ng-content></ng-content>\n</div>\n", styles: [".widget-configurator-section{margin:15px;border-radius:3px;border:1px solid;border-color:var(--nui-color-line-default,#d9d9d9)}.widget-configurator-section__header{padding:15px 5px 15px 15px;height:40px;font-size:16px;font-weight:600;background-color:var(--nui-color-bg-table_header,#f0f0f0);color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6))}.widget-configurator-section__header-text{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}\n"] }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.PizzagnaService }, { type: i2.LoggerService }, { type: i3.FormBuilder }], propDecorators: { headerTextTemplate: [{
type: Input
}], headerButtonsTemplate: [{
type: Input
}], nodes: [{
type: Input
}], headerText: [{
type: Input
}], formReady: [{
type: Output
}], formDestroy: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWNvbmZpZ3VyYXRvci1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29uZmlndXJhdG9yL2NvbXBvbmVudHMvd2lkZ2V0LWNvbmZpZ3VyYXRvci1zZWN0aW9uL3dpZGdldC1jb25maWd1cmF0b3Itc2VjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbmZpZ3VyYXRvci9jb21wb25lbnRzL3dpZGdldC1jb25maWd1cmF0b3Itc2VjdGlvbi93aWRnZXQtY29uZmlndXJhdG9yLXNlY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixXQUFXLEVBQ1gsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RCxPQUFPLEVBQVUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7Ozs7Ozs7O0FBVzlFLE1BQU0sT0FBTyxrQ0FDVCxTQUFRLFVBQVU7YUFHSixnQkFBVyxHQUFHLG9DQUFvQyxBQUF2QyxDQUF3QztJQWFqRSxZQUNJLGNBQWlDLEVBQ2pDLGVBQWdDLEVBQ2hDLE1BQXFCLEVBQ2IsV0FBd0I7UUFFaEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFGdkMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFaM0IsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBRXZCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBQzFDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQVd0RCxDQUFDO0lBRU0sUUFBUTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLE9BQU8sQ0FBQyxXQUFtQixFQUFFLEtBQWE7UUFDN0MsSUFBSSxLQUFLLENBQUMsRUFBRSxLQUFLLFdBQVcsRUFBRTtZQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDakQ7UUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUNuRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRU0sWUFBWSxDQUFDLElBQVksRUFBRSxTQUFvQjtRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakMsdUZBQXVGO1FBQ3ZGLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QixDQUFDO2tJQXBEUSxrQ0FBa0M7c0hBQWxDLGtDQUFrQyw0V0NoRC9DLHkrQ0FzQ0E7OzRGRFVhLGtDQUFrQztrQkFSOUMsU0FBUzsrQkFDSSxpQ0FBaUMsbUJBRzFCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksUUFDL0IsRUFBRSxLQUFLLEVBQUUsaUNBQWlDLEVBQUU7MEtBUXpDLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcblxuaW1wb3J0IHsgSUV2ZW50LCBMb2dnZXJTZXJ2aWNlIH0gZnJvbSBcIkBub3ZhLXVpL2JpdHNcIjtcblxuaW1wb3J0IHsgQmFzZUxheW91dCB9IGZyb20gXCIuLi8uLi8uLi9jb21wb25lbnRzL2xheW91dHMvYmFzZS1sYXlvdXRcIjtcbmltcG9ydCB7IFBpenphZ25hU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9waXp6YWduYS9zZXJ2aWNlcy9waXp6YWduYS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBJSGFzRm9ybSB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJudWktd2lkZ2V0LWNvbmZpZ3VyYXRvci1zZWN0aW9uXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi93aWRnZXQtY29uZmlndXJhdG9yLXNlY3Rpb24uY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcIi4vd2lkZ2V0LWNvbmZpZ3VyYXRvci1zZWN0aW9uLmNvbXBvbmVudC5sZXNzXCJdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaG9zdDogeyBjbGFzczogXCJudWktd2lkZ2V0LWNvbmZpZ3VyYXRvci1zZWN0aW9uXCIgfSxcbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0Q29uZmlndXJhdG9yU2VjdGlvbkNvbXBvbmVudFxuICAgIGV4dGVuZHMgQmFzZUxheW91dFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIElIYXNGb3JtXG57XG4gICAgcHVibGljIHN0YXRpYyBsYXRlTG9hZEtleSA9IFwiV2lkZ2V0Q29uZmlndXJhdG9yU2VjdGlvbkNvbXBvbmVudFwiO1xuXG4gICAgQElucHV0KCkgaGVhZGVyVGV4dFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBJbnB1dCgpIGhlYWRlckJ1dHRvbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBJbnB1dCgpIG5vZGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIEBJbnB1dCgpIGhlYWRlclRleHQ6IHN0cmluZyA9IFwiXCI7XG5cbiAgICBAT3V0cHV0KCkgZm9ybVJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XG4gICAgQE91dHB1dCgpIGZvcm1EZXN0cm95ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XG5cbiAgICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcGl6emFnbmFTZXJ2aWNlOiBQaXp6YWduYVNlcnZpY2UsXG4gICAgICAgIGxvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXJcbiAgICApIHtcbiAgICAgICAgc3VwZXIoY2hhbmdlRGV0ZWN0b3IsIHBpenphZ25hU2VydmljZSwgbG9nZ2VyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Tm9kZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe30pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkV2ZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGV2ZW50OiBJRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmlkID09PSBcImZvcm1SZWFkeVwiKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEZvcm1Hcm91cChjb21wb25lbnRJZCwgZXZlbnQucGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykubGVuZ3RoID09PSB0aGlzLmdldE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1SZWFkeS5lbWl0KHRoaXMuZm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRm9ybUdyb3VwKG5hbWU6IHN0cmluZywgZm9ybUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2wobmFtZSwgZm9ybUdyb3VwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybURlc3Ryb3kuZW1pdCh0aGlzLmZvcm0pO1xuXG4gICAgICAgIC8vIEludm9rZSBzdXBlci5uZ09uRGVzdHJveSB0byBlbnN1cmUgdGhhdCBhbnkgYmFzZSBjbGFzcyBvYnNlcnZhYmxlcyBhcmUgdW5zdWJzY3JpYmVkLlxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3aWRnZXQtY29uZmlndXJhdG9yLXNlY3Rpb25cIj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwid2lkZ2V0LWNvbmZpZ3VyYXRvci1zZWN0aW9uX19oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVGV4dFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJCdXR0b25zVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFRPRE86IFJFTU9WRSBUSE9TRSBBRlRFUiBBTEwgV0lER0VUUyBBUkUgVVNJTkcgbnVpLWl0ZW1zLWR5bmFtaWMgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGhlYWRlclRleHRcbiAgICAgICAgICAgICpuZ0lmPVwiaGVhZGVyVGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cIndpZGdldC1jb25maWd1cmF0b3Itc2VjdGlvbl9faGVhZGVyLXRleHRcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImhlYWRlclRleHRcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyBoZWFkZXJUZXh0IH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbaGVhZGVyVGV4dF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltoZWFkZXJCdXR0b25zXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBub2RlIG9mIG5vZGVDb25maWdzOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgbnVpQ29tcG9uZW50UG9ydGFsXG4gICAgICAgICAgICAjY29tcG9uZW50UG9ydGFsPVwibnVpQ29tcG9uZW50UG9ydGFsXCJcbiAgICAgICAgICAgIFtjb21wb25lbnRJZF09XCJub2RlLmlkXCJcbiAgICAgICAgICAgIFtjb21wb25lbnRUeXBlXT1cIm5vZGUuY29tcG9uZW50VHlwZVwiXG4gICAgICAgICAgICBbcHJvdmlkZXJzXT1cIm5vZGUucHJvdmlkZXJzXCJcbiAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cIm5vZGUucHJvcGVydGllc1wiXG4gICAgICAgICAgICBbb3V0cHV0c109XCJbJ2Zvcm1SZWFkeSddXCJcbiAgICAgICAgICAgIChvdXRwdXQpPVwib25FdmVudChub2RlLmlkLCAkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgW2Nka1BvcnRhbE91dGxldF09XCJjb21wb25lbnRQb3J0YWwucG9ydGFsXCJcbiAgICAgICAgICAgICAgICAoYXR0YWNoZWQpPVwiY29tcG9uZW50UG9ydGFsLmF0dGFjaGVkKCRldmVudClcIlxuICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuIl19