UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

192 lines 29.6 kB
import { Component, EventEmitter, Injector, Input, Output } from '@angular/core'; import { CoreBaseComponent } from '../common/base.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; function CapacityBarChartComponent_div_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 5); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r0.chartTitle); } } function CapacityBarChartComponent_div_1_span_2_Template(rf, ctx) { if (rf & 1) { const _r6 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "span", 8); i0.ɵɵlistener("mouseover", function CapacityBarChartComponent_div_1_span_2_Template_span_mouseover_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r5 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r5.toggleLabelTooltip()); })("mouseleave", function CapacityBarChartComponent_div_1_span_2_Template_span_mouseleave_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r7 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r7.toggleLabelTooltip()); }); i0.ɵɵelementEnd(); } } function CapacityBarChartComponent_div_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 6); i0.ɵɵtext(1); i0.ɵɵtemplate(2, CapacityBarChartComponent_div_1_span_2_Template, 1, 0, "span", 7); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx_r1.totalMessage, " "); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r1.labelTooltip); } } function CapacityBarChartComponent_div_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 9); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r2.usedMessage); } } function CapacityBarChartComponent_div_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 6); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r3.freeMessage); } } /** * This component will create a horizontal bar chart two segments. * The first segment represents the amount of total currently used, and the other repressing the free amount left out of the total. * They will completely fill the width of the chart. */ export class CapacityBarChartComponent extends CoreBaseComponent { constructor(injector) { super(injector); this.tooltipToggled = new EventEmitter(); this.strings = MsftSme.getStrings(); } /** * The source name to use for logging */ get logSourceName() { return 'CapacityBarChartComponent'; } /** * @deprecated since 9/25/2019. Please use 'tooltipToggled' instead */ // eslint-disable-next-line @angular-eslint/no-output-on-prefix get onTooltipToggle() { return this.tooltipToggled; } getColor(yellowThreshold = 0.8, redThreshold = 0.9) { const redColor = '#f64747'; const yellowColor = '#fbbc05'; const greenColor = '#02a28c'; if (yellowThreshold === 'disabled' || redThreshold === 'disabled') { return greenColor; } // determine the color for the bar chart based on capacity used if (this.percentCapacity >= parseFloat(redThreshold.toString())) { return redColor; } if (this.percentCapacity >= parseFloat(yellowThreshold.toString())) { return yellowColor; } return greenColor; } updateChart() { this.freeCapacity = this.totalCapacity - this.capacityUsed; this.percentCapacity = this.totalCapacity > 0 ? this.capacityUsed / this.totalCapacity : 0; this.displayPercentCapacity = '{0}%'.format(Math.round(this.percentCapacity * 100)); // update the chart used and free labels if it has them already this.usedLabel = this.usedLabel ? this.usedLabel : ''; this.freeLabel = this.freeLabel ? this.freeLabel : ''; this.totalLabel = this.totalLabel ? this.totalLabel : ''; this.totalMessage = this.strings.MsftSmeShell.Angular.CapacityBarChart.totalFormat.format(this.totalLabel); this.usedMessage = this.strings.MsftSmeShell.Angular.CapacityBarChart.usedFormat.format(this.usedLabel, this.displayPercentCapacity); this.freeMessage = this.strings.MsftSmeShell.Angular.CapacityBarChart.freeFormat.format(this.freeLabel); this.usedBarColor = this.getColor(this.warningAt, this.criticalAt); } ngOnChanges() { this.updateChart(); } toggleLabelTooltip() { this.tooltipToggled.emit(); } ngOnInit() { this.height = this.height ? this.height : 36; // set default height this.animationTime = this.animationTime ? this.animationTime : 0; // set no animation as default this.widthTransitionStyle = 'width {0}ms'.format(this.animationTime); this.heightStyle = '{0}px'.format(this.height); } /** * @deprecated since 03/14/18. CapacityBarChart now uses ngOnChanges to automatically update. * Calling CapacityBarChart.update() is no longer required. */ update(pData) { this.prepareInputDataForUX(pData); } /** * @deprecated since 03/14/18. CapacityBarChart now uses ngOnChanges to automatically update. * Calling CapacityBarChart.update() is no longer required. */ prepareInputDataForUX(pData) { this.freeCapacity = pData.totalCapacity - pData.capacityUsed; this.percentCapacity = pData.totalCapacity > 0 ? pData.capacityUsed / pData.totalCapacity : 0; this.displayPercentCapacity = '{0}%'.format(Math.round(this.percentCapacity * 100)); // update the chart used and free labels if it has them already this.usedLabel = this.usedLabel ? pData.usedLabel : ''; this.freeLabel = this.freeLabel ? pData.freeLabel : ''; this.totalLabel = this.totalLabel ? pData.totalLabel : ''; this.totalMessage = this.strings.MsftSmeShell.Angular.CapacityBarChart.totalFormat.format(this.totalLabel); this.usedMessage = this.strings.MsftSmeShell.Angular.CapacityBarChart.usedFormat.format(this.usedLabel, this.displayPercentCapacity); this.freeMessage = this.strings.MsftSmeShell.Angular.CapacityBarChart.freeFormat.format(this.freeLabel); this.usedBarColor = this.getColor(this.warningAt, this.criticalAt); } } /** @nocollapse */ CapacityBarChartComponent.ɵfac = function CapacityBarChartComponent_Factory(t) { return new (t || CapacityBarChartComponent)(i0.ɵɵdirectiveInject(i0.Injector)); }; /** @nocollapse */ CapacityBarChartComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: CapacityBarChartComponent, selectors: [["sme-capacity-bar-chart"]], inputs: { animationTime: "animationTime", height: "height", capacityUsed: "capacityUsed", totalCapacity: "totalCapacity", warningAt: "warningAt", criticalAt: "criticalAt", chartTitle: "chartTitle", totalLabel: "totalLabel", usedLabel: "usedLabel", freeLabel: "freeLabel", labelTooltip: "labelTooltip" }, outputs: { onTooltipToggle: "onTooltipToggle", tooltipToggled: "tooltipToggled" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 6, vars: 12, consts: [["class", "sme-layout-float-left stat-title", 4, "ngIf"], ["class", "sme-layout-float-right", 4, "ngIf"], [1, "divchart", "sme-background-color-base-80"], [1, "divchart-bar"], ["class", "sme-layout-float-left", 4, "ngIf"], [1, "sme-layout-float-left", "stat-title"], [1, "sme-layout-float-right"], ["class", "sme-icon sme-icon-unknown button-icon", 3, "mouseover", "mouseleave", 4, "ngIf"], [1, "sme-icon", "sme-icon-unknown", "button-icon", 3, "mouseover", "mouseleave"], [1, "sme-layout-float-left"]], template: function CapacityBarChartComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, CapacityBarChartComponent_div_0_Template, 2, 1, "div", 0); i0.ɵɵtemplate(1, CapacityBarChartComponent_div_1_Template, 3, 2, "div", 1); i0.ɵɵelementStart(2, "div", 2); i0.ɵɵelement(3, "div", 3); i0.ɵɵelementEnd(); i0.ɵɵtemplate(4, CapacityBarChartComponent_div_4_Template, 2, 1, "div", 4); i0.ɵɵtemplate(5, CapacityBarChartComponent_div_5_Template, 2, 1, "div", 1); } if (rf & 2) { i0.ɵɵproperty("ngIf", ctx.chartTitle); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.totalLabel); i0.ɵɵadvance(1); i0.ɵɵstyleProp("height", ctx.heightStyle); i0.ɵɵadvance(1); i0.ɵɵstyleProp("transition", ctx.widthTransitionStyle)("width", ctx.displayPercentCapacity)("background-color", ctx.usedBarColor); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.usedLabel); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.freeLabel); } }, dependencies: [i1.NgIf], styles: [".bar-chart[_ngcontent-%COMP%]{display:block;clear:both}.stat-title[_ngcontent-%COMP%]{font-weight:700}.divchart[_ngcontent-%COMP%]{clear:both;width:100%;position:relative;z-index:1}.divchart-bar[_ngcontent-%COMP%]{position:absolute;left:0;top:0;height:inherit;z-index:2}"] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CapacityBarChartComponent, [{ type: Component, args: [{ selector: 'sme-capacity-bar-chart', template: "<div *ngIf=\"chartTitle\" class=\"sme-layout-float-left stat-title\">{{ chartTitle }}</div>\r\n<div *ngIf=\"totalLabel\" class=\"sme-layout-float-right\">\r\n {{ totalMessage }}\r\n <span *ngIf=\"labelTooltip\" class=\"sme-icon sme-icon-unknown button-icon\" (mouseover)=\"toggleLabelTooltip()\" (mouseleave)=\"toggleLabelTooltip()\"></span>\r\n</div>\r\n\r\n<div class=\"divchart sme-background-color-base-80\" [style.height]=\"heightStyle\">\r\n <div class=\"divchart-bar\" [style.transition]=\"widthTransitionStyle\" [style.width]=\"displayPercentCapacity\" [style.background-color]=\"usedBarColor\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"usedLabel\" class=\"sme-layout-float-left\">{{ usedMessage }}</div>\r\n<div *ngIf=\"freeLabel\" class=\"sme-layout-float-right\">{{ freeMessage }}</div>\r\n", styles: [".bar-chart{display:block;clear:both}.stat-title{font-weight:700}.divchart{clear:both;width:100%;position:relative;z-index:1}.divchart-bar{position:absolute;left:0;top:0;height:inherit;z-index:2}\n"] }] }], function () { return [{ type: i0.Injector }]; }, { animationTime: [{ type: Input }], height: [{ type: Input }], capacityUsed: [{ type: Input }], totalCapacity: [{ type: Input }], warningAt: [{ type: Input }], criticalAt: [{ type: Input }], chartTitle: [{ type: Input }], totalLabel: [{ type: Input }], usedLabel: [{ type: Input }], freeLabel: [{ type: Input }], labelTooltip: [{ type: Input }], onTooltipToggle: [{ type: Output }], tooltipToggled: [{ type: Output }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWNpdHktYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2hvcml6b250YWwtYmFyLWNoYXJ0L2NhcGFjaXR5LWJhci1jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9ob3Jpem9udGFsLWJhci1jaGFydC9jYXBhY2l0eS1iYXItY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7O0lDRjdELDhCQUFpRTtJQUFBLFlBQWdCO0lBQUEsaUJBQU07OztJQUF0QixlQUFnQjtJQUFoQix1Q0FBZ0I7Ozs7SUFHL0UsK0JBQWdKO0lBQXZFLG9MQUFhLGVBQUEsMkJBQW9CLENBQUEsSUFBQyx5S0FBZSxlQUFBLDJCQUFvQixDQUFBLElBQW5DO0lBQXFDLGlCQUFPOzs7SUFGekosOEJBQXVEO0lBQ3JELFlBQ0E7SUFBQSxrRkFBdUo7SUFDekosaUJBQU07OztJQUZKLGVBQ0E7SUFEQSxvREFDQTtJQUFPLGVBQWtCO0lBQWxCLDBDQUFrQjs7O0lBTzNCLDhCQUFxRDtJQUFBLFlBQWlCO0lBQUEsaUJBQU07OztJQUF2QixlQUFpQjtJQUFqQix3Q0FBaUI7OztJQUN0RSw4QkFBc0Q7SUFBQSxZQUFpQjtJQUFBLGlCQUFNOzs7SUFBdkIsZUFBaUI7SUFBakIsd0NBQWlCOztBRE52RTs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLHlCQUEwQixTQUFRLGlCQUFpQjtJQW9GNUQsWUFBWSxRQUFrQjtRQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFoQkgsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBYXBELFlBQU8sR0FBWSxPQUFPLENBQUMsVUFBVSxFQUFXLENBQUM7SUFJeEQsQ0FBQztJQXBGRDs7T0FFRztJQUNILElBQWMsYUFBYTtRQUN2QixPQUFPLDJCQUEyQixDQUFDO0lBQ3ZDLENBQUM7SUF1REQ7O09BRUc7SUFDSCwrREFBK0Q7SUFDL0QsSUFBcUIsZUFBZTtRQUNoQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQW9CTSxRQUFRLENBQUMsa0JBQW1DLEdBQUcsRUFBRSxlQUFnQyxHQUFHO1FBQ3ZGLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUMzQixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFDOUIsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksZUFBZSxLQUFLLFVBQVUsSUFBSSxZQUFZLEtBQUssVUFBVSxFQUFFO1lBQy9ELE9BQU8sVUFBVSxDQUFDO1NBQ3JCO1FBQ0QsK0RBQStEO1FBQy9ELElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7WUFDN0QsT0FBTyxRQUFRLENBQUM7U0FDbkI7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO1lBQ2hFLE9BQU8sV0FBVyxDQUFDO1NBQ3RCO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVPLFdBQVc7UUFDZixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVwRiwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFekQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0csSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDbkYsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsc0JBQXNCLENBQzlCLENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVNLGtCQUFrQjtRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7UUFDbkUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRSw4QkFBOEI7UUFDakcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxLQUFpQztRQUMzQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHFCQUFxQixDQUFDLEtBQWlDO1FBQzNELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQzdELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXBGLCtEQUErRDtRQUMvRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUUxRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUNuRixJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxzQkFBc0IsQ0FDOUIsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2RSxDQUFDOztxSEE1S1EseUJBQXlCOzJHQUF6Qix5QkFBeUI7UUNmdEMsMEVBQXVGO1FBQ3ZGLDBFQUdNO1FBRU4sOEJBQWdGO1FBQzlFLHlCQUF5SjtRQUMzSixpQkFBTTtRQUVOLDBFQUE0RTtRQUM1RSwwRUFBNkU7O1FBWHZFLHFDQUFnQjtRQUNoQixlQUFnQjtRQUFoQixxQ0FBZ0I7UUFLNkIsZUFBNEI7UUFBNUIseUNBQTRCO1FBQ25ELGVBQXlDO1FBQXpDLHNEQUF5QyxxQ0FBQSxzQ0FBQTtRQUcvRCxlQUFlO1FBQWYsb0NBQWU7UUFDZixlQUFlO1FBQWYsb0NBQWU7O3VGRElSLHlCQUF5QjtjQUxyQyxTQUFTOzJCQUNJLHdCQUF3QjsyREFlbEIsYUFBYTtrQkFBNUIsS0FBSztZQUtVLE1BQU07a0JBQXJCLEtBQUs7WUFLVSxZQUFZO2tCQUEzQixLQUFLO1lBS1UsYUFBYTtrQkFBNUIsS0FBSztZQUtVLFNBQVM7a0JBQXhCLEtBQUs7WUFNVSxVQUFVO2tCQUF6QixLQUFLO1lBTVUsVUFBVTtrQkFBekIsS0FBSztZQUtVLFVBQVU7a0JBQXpCLEtBQUs7WUFLVSxTQUFTO2tCQUF4QixLQUFLO1lBS1UsU0FBUztrQkFBeEIsS0FBSztZQUVVLFlBQVk7a0JBQTNCLEtBQUs7WUFNZSxlQUFlO2tCQUFuQyxNQUFNO1lBR1UsY0FBYztrQkFBOUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3RyaW5ncyB9IGZyb20gJy4uLy4uL2dlbmVyYXRlZC9TdHJpbmdzJztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDYXBhY2l0eUJhckNoYXJ0VXBkYXRlRGF0YSwgQ3VzdG9tSG9yaXpvbnRhbEJhckNoYXJ0RGF0YSB9IGZyb20gJy4vY3VzdG9tLWhvcml6b250YWwtYmFyLWNoYXJ0LWRhdGEuaW50ZXJmYWNlJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNvbXBvbmVudCB3aWxsIGNyZWF0ZSBhIGhvcml6b250YWwgYmFyIGNoYXJ0IHR3byBzZWdtZW50cy5cclxuICogIFRoZSBmaXJzdCBzZWdtZW50IHJlcHJlc2VudHMgdGhlIGFtb3VudCBvZiB0b3RhbCBjdXJyZW50bHkgdXNlZCwgYW5kIHRoZSBvdGhlciByZXByZXNzaW5nIHRoZSBmcmVlIGFtb3VudCBsZWZ0IG91dCBvZiAgdGhlIHRvdGFsLlxyXG4gKiAgVGhleSB3aWxsIGNvbXBsZXRlbHkgZmlsbCB0aGUgd2lkdGggb2YgdGhlIGNoYXJ0LlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1jYXBhY2l0eS1iYXItY2hhcnQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhcGFjaXR5LWJhci1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9ob3Jpem9udGFsLWJhci1jaGFydC5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENhcGFjaXR5QmFyQ2hhcnRDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnQ2FwYWNpdHlCYXJDaGFydENvbXBvbmVudCc7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqICBJbnB1dCBiaW5kaW5nIGZvciBDU1Mgd2lkdGggYW5pbWF0aW9uIHRpbWUgaW4gbXMuIERlZmF1bHQgaWYgb21pdHRlZCBpcyBubyBhbmltYXRpb24uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBhbmltYXRpb25UaW1lPzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogIElucHV0IGJpbmRpbmcgZm9yIGhlaWdodCBvZiBiYXIgY2hhcnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgSW5wdXQgYmluZGluZyBmb3IgbnVtYmVyIHJlcHJlc2VudGluZyBjdXJyZW50IGFtb3VudCAob2YgdG90YWwpXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjYXBhY2l0eVVzZWQ6IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqICBJbnB1dCBiaW5kaW5nIGZvciBudW1iZXIgcmVwcmVzZW50aW5nIHRvdGFsIGFtb3VudCBwb3NzaWJsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdG90YWxDYXBhY2l0eTogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogIElucHV0IGJpbmRpbmcgZm9yIG9wdGlvbmFsIHBlcmNlbnQgKGFzIGEgZGVjaW1hbCkgZnVsbCBhdCB3aGljaCB0aGUgY29sb3IgdHVybnMgZnJvbSB5ZWxsb3cgdG8gcmVkIChkZWZhdWx0IGlzIDAuOSlcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHdhcm5pbmdBdD86IG51bWJlciB8IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqICBJbnB1dCBiaW5kaW5nIGZvciBvcHRpb25hbCBwZXJjZW50IChhcyBhIGRlY2ltYWwpIGZ1bGwgYXQgd2hpY2ggdGhlIGNvbG9yIHR1cm5zIGZyb20gYmx1ZSB0byB5ZWxsb3cgKGRlZmF1bHQgaXMgMC44KS5cclxuICAgICAqICBVc2UgJ2Rpc2FibGVkJyB0byBkaXNhYmxlIHdhcm5pbmcgYW5kIGNyaXRpY2FsIGNvbG9ycy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGNyaXRpY2FsQXQ/OiBudW1iZXIgfCBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgSW5wdXQgYmluZGluZyBmb3Igb3B0aW9uYWwgdGl0bGUgb2YgY2hhcnQuXHJcbiAgICAgKiAgVXNlICdkaXNhYmxlZCcgdG8gZGlzYWJsZSB3YXJuaW5nIGFuZCBjcml0aWNhbCBjb2xvcnMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjaGFydFRpdGxlPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogIElucHV0IGJpbmRpbmcgZm9yIG9wdGlvbiB0byBkaXNwbGF5IHRvdGFsIGFtb3VudCBsYWJlbC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHRvdGFsTGFiZWw/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgSW5wdXQgYmluZGluZyBmb3Igb3B0aW9uIHRvIGRpc3BsYXkgdXNlZCBhbW91bnQgYW5kIHBlcmNlbnQgdXNlZCBsYWJlbC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHVzZWRMYWJlbD86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqICBJbnB1dCBiaW5kaW5nIGZvciBvcHRpb24gdG8gZGlzcGxheSBmcmVlIGFtb3VudCBsYWJlbC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGZyZWVMYWJlbD86IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbGFiZWxUb29sdGlwPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAndG9vbHRpcFRvZ2dsZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvblRvb2x0aXBUb2dnbGUoKTogRXZlbnRFbWl0dGVyPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b29sdGlwVG9nZ2xlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgdG9vbHRpcFRvZ2dsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgcHVibGljIGRpc3BsYXlQZXJjZW50Q2FwYWNpdHk6IHN0cmluZztcclxuICAgIHB1YmxpYyBmcmVlQ2FwYWNpdHk6IG51bWJlcjtcclxuICAgIHB1YmxpYyB1c2VkQmFyQ29sb3I6IHN0cmluZztcclxuICAgIHB1YmxpYyBkYXRhOiBDdXN0b21Ib3Jpem9udGFsQmFyQ2hhcnREYXRhO1xyXG4gICAgcHVibGljIHBlcmNlbnRDYXBhY2l0eTogbnVtYmVyO1xyXG4gICAgcHVibGljIHRvdGFsTWVzc2FnZTogc3RyaW5nO1xyXG4gICAgcHVibGljIGZyZWVNZXNzYWdlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgdXNlZE1lc3NhZ2U6IHN0cmluZztcclxuICAgIHB1YmxpYyB3aWR0aFRyYW5zaXRpb25TdHlsZTogc3RyaW5nO1xyXG4gICAgcHVibGljIGhlaWdodFN0eWxlOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHN0cmluZ3M6IFN0cmluZ3MgPSBNc2Z0U21lLmdldFN0cmluZ3M8U3RyaW5ncz4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbG9yKHllbGxvd1RocmVzaG9sZDogc3RyaW5nIHwgbnVtYmVyID0gMC44LCByZWRUaHJlc2hvbGQ6IHN0cmluZyB8IG51bWJlciA9IDAuOSkge1xyXG4gICAgICAgIGNvbnN0IHJlZENvbG9yID0gJyNmNjQ3NDcnO1xyXG4gICAgICAgIGNvbnN0IHllbGxvd0NvbG9yID0gJyNmYmJjMDUnO1xyXG4gICAgICAgIGNvbnN0IGdyZWVuQ29sb3IgPSAnIzAyYTI4Yyc7XHJcbiAgICAgICAgaWYgKHllbGxvd1RocmVzaG9sZCA9PT0gJ2Rpc2FibGVkJyB8fCByZWRUaHJlc2hvbGQgPT09ICdkaXNhYmxlZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdyZWVuQ29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRldGVybWluZSB0aGUgY29sb3IgZm9yIHRoZSBiYXIgY2hhcnQgYmFzZWQgb24gY2FwYWNpdHkgdXNlZFxyXG4gICAgICAgIGlmICh0aGlzLnBlcmNlbnRDYXBhY2l0eSA+PSBwYXJzZUZsb2F0KHJlZFRocmVzaG9sZC50b1N0cmluZygpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVkQ29sb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5wZXJjZW50Q2FwYWNpdHkgPj0gcGFyc2VGbG9hdCh5ZWxsb3dUaHJlc2hvbGQudG9TdHJpbmcoKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHllbGxvd0NvbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGdyZWVuQ29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDaGFydCgpIHtcclxuICAgICAgICB0aGlzLmZyZWVDYXBhY2l0eSA9IHRoaXMudG90YWxDYXBhY2l0eSAtIHRoaXMuY2FwYWNpdHlVc2VkO1xyXG4gICAgICAgIHRoaXMucGVyY2VudENhcGFjaXR5ID0gdGhpcy50b3RhbENhcGFjaXR5ID4gMCA/IHRoaXMuY2FwYWNpdHlVc2VkIC8gdGhpcy50b3RhbENhcGFjaXR5IDogMDtcclxuICAgICAgICB0aGlzLmRpc3BsYXlQZXJjZW50Q2FwYWNpdHkgPSAnezB9JScuZm9ybWF0KE1hdGgucm91bmQodGhpcy5wZXJjZW50Q2FwYWNpdHkgKiAxMDApKTtcclxuXHJcbiAgICAgICAgLy8gdXBkYXRlIHRoZSBjaGFydCB1c2VkIGFuZCBmcmVlIGxhYmVscyBpZiBpdCBoYXMgdGhlbSBhbHJlYWR5XHJcbiAgICAgICAgdGhpcy51c2VkTGFiZWwgPSB0aGlzLnVzZWRMYWJlbCA/IHRoaXMudXNlZExhYmVsIDogJyc7XHJcbiAgICAgICAgdGhpcy5mcmVlTGFiZWwgPSB0aGlzLmZyZWVMYWJlbCA/IHRoaXMuZnJlZUxhYmVsIDogJyc7XHJcbiAgICAgICAgdGhpcy50b3RhbExhYmVsID0gdGhpcy50b3RhbExhYmVsID8gdGhpcy50b3RhbExhYmVsIDogJyc7XHJcblxyXG4gICAgICAgIHRoaXMudG90YWxNZXNzYWdlID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNhcGFjaXR5QmFyQ2hhcnQudG90YWxGb3JtYXQuZm9ybWF0KHRoaXMudG90YWxMYWJlbCk7XHJcbiAgICAgICAgdGhpcy51c2VkTWVzc2FnZSA9IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5DYXBhY2l0eUJhckNoYXJ0LnVzZWRGb3JtYXQuZm9ybWF0KFxyXG4gICAgICAgICAgICB0aGlzLnVzZWRMYWJlbCxcclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5UGVyY2VudENhcGFjaXR5XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5mcmVlTWVzc2FnZSA9IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5DYXBhY2l0eUJhckNoYXJ0LmZyZWVGb3JtYXQuZm9ybWF0KHRoaXMuZnJlZUxhYmVsKTtcclxuICAgICAgICB0aGlzLnVzZWRCYXJDb2xvciA9IHRoaXMuZ2V0Q29sb3IodGhpcy53YXJuaW5nQXQsIHRoaXMuY3JpdGljYWxBdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdG9nZ2xlTGFiZWxUb29sdGlwKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFRvZ2dsZWQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQgOiAzNjsgLy8gc2V0IGRlZmF1bHQgaGVpZ2h0XHJcbiAgICAgICAgdGhpcy5hbmltYXRpb25UaW1lID0gdGhpcy5hbmltYXRpb25UaW1lID8gdGhpcy5hbmltYXRpb25UaW1lIDogMDsgIC8vIHNldCBubyBhbmltYXRpb24gYXMgZGVmYXVsdFxyXG4gICAgICAgIHRoaXMud2lkdGhUcmFuc2l0aW9uU3R5bGUgPSAnd2lkdGggezB9bXMnLmZvcm1hdCh0aGlzLmFuaW1hdGlvblRpbWUpO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0U3R5bGUgPSAnezB9cHgnLmZvcm1hdCh0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAwMy8xNC8xOC4gQ2FwYWNpdHlCYXJDaGFydCBub3cgdXNlcyBuZ09uQ2hhbmdlcyB0byBhdXRvbWF0aWNhbGx5IHVwZGF0ZS5cclxuICAgICAqIENhbGxpbmcgQ2FwYWNpdHlCYXJDaGFydC51cGRhdGUoKSBpcyBubyBsb25nZXIgcmVxdWlyZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGUocERhdGE6IENhcGFjaXR5QmFyQ2hhcnRVcGRhdGVEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5wcmVwYXJlSW5wdXREYXRhRm9yVVgocERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMDMvMTQvMTguIENhcGFjaXR5QmFyQ2hhcnQgbm93IHVzZXMgbmdPbkNoYW5nZXMgdG8gYXV0b21hdGljYWxseSB1cGRhdGUuXHJcbiAgICAgKiBDYWxsaW5nIENhcGFjaXR5QmFyQ2hhcnQudXBkYXRlKCkgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByZXBhcmVJbnB1dERhdGFGb3JVWChwRGF0YTogQ2FwYWNpdHlCYXJDaGFydFVwZGF0ZURhdGEpIHtcclxuICAgICAgICB0aGlzLmZyZWVDYXBhY2l0eSA9IHBEYXRhLnRvdGFsQ2FwYWNpdHkgLSBwRGF0YS5jYXBhY2l0eVVzZWQ7XHJcbiAgICAgICAgdGhpcy5wZXJjZW50Q2FwYWNpdHkgPSBwRGF0YS50b3RhbENhcGFjaXR5ID4gMCA/IHBEYXRhLmNhcGFjaXR5VXNlZCAvIHBEYXRhLnRvdGFsQ2FwYWNpdHkgOiAwO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheVBlcmNlbnRDYXBhY2l0eSA9ICd7MH0lJy5mb3JtYXQoTWF0aC5yb3VuZCh0aGlzLnBlcmNlbnRDYXBhY2l0eSAqIDEwMCkpO1xyXG5cclxuICAgICAgICAvLyB1cGRhdGUgdGhlIGNoYXJ0IHVzZWQgYW5kIGZyZWUgbGFiZWxzIGlmIGl0IGhhcyB0aGVtIGFscmVhZHlcclxuICAgICAgICB0aGlzLnVzZWRMYWJlbCA9IHRoaXMudXNlZExhYmVsID8gcERhdGEudXNlZExhYmVsIDogJyc7XHJcbiAgICAgICAgdGhpcy5mcmVlTGFiZWwgPSB0aGlzLmZyZWVMYWJlbCA/IHBEYXRhLmZyZWVMYWJlbCA6ICcnO1xyXG4gICAgICAgIHRoaXMudG90YWxMYWJlbCA9IHRoaXMudG90YWxMYWJlbCA/IHBEYXRhLnRvdGFsTGFiZWwgOiAnJztcclxuXHJcbiAgICAgICAgdGhpcy50b3RhbE1lc3NhZ2UgPSB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQ2FwYWNpdHlCYXJDaGFydC50b3RhbEZvcm1hdC5mb3JtYXQodGhpcy50b3RhbExhYmVsKTtcclxuICAgICAgICB0aGlzLnVzZWRNZXNzYWdlID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNhcGFjaXR5QmFyQ2hhcnQudXNlZEZvcm1hdC5mb3JtYXQoXHJcbiAgICAgICAgICAgIHRoaXMudXNlZExhYmVsLFxyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlQZXJjZW50Q2FwYWNpdHlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLmZyZWVNZXNzYWdlID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNhcGFjaXR5QmFyQ2hhcnQuZnJlZUZvcm1hdC5mb3JtYXQodGhpcy5mcmVlTGFiZWwpO1xyXG4gICAgICAgIHRoaXMudXNlZEJhckNvbG9yID0gdGhpcy5nZXRDb2xvcih0aGlzLndhcm5pbmdBdCwgdGhpcy5jcml0aWNhbEF0KTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwiY2hhcnRUaXRsZVwiIGNsYXNzPVwic21lLWxheW91dC1mbG9hdC1sZWZ0IHN0YXQtdGl0bGVcIj57eyBjaGFydFRpdGxlIH19PC9kaXY+XHJcbjxkaXYgKm5nSWY9XCJ0b3RhbExhYmVsXCIgY2xhc3M9XCJzbWUtbGF5b3V0LWZsb2F0LXJpZ2h0XCI+XHJcbiAge3sgdG90YWxNZXNzYWdlIH19XHJcbiAgPHNwYW4gKm5nSWY9XCJsYWJlbFRvb2x0aXBcIiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXVua25vd24gYnV0dG9uLWljb25cIiAobW91c2VvdmVyKT1cInRvZ2dsZUxhYmVsVG9vbHRpcCgpXCIgKG1vdXNlbGVhdmUpPVwidG9nZ2xlTGFiZWxUb29sdGlwKClcIj48L3NwYW4+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImRpdmNoYXJ0IHNtZS1iYWNrZ3JvdW5kLWNvbG9yLWJhc2UtODBcIiBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFN0eWxlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImRpdmNoYXJ0LWJhclwiIFtzdHlsZS50cmFuc2l0aW9uXT1cIndpZHRoVHJhbnNpdGlvblN0eWxlXCIgW3N0eWxlLndpZHRoXT1cImRpc3BsYXlQZXJjZW50Q2FwYWNpdHlcIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJ1c2VkQmFyQ29sb3JcIj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwidXNlZExhYmVsXCIgY2xhc3M9XCJzbWUtbGF5b3V0LWZsb2F0LWxlZnRcIj57eyB1c2VkTWVzc2FnZSB9fTwvZGl2PlxyXG48ZGl2ICpuZ0lmPVwiZnJlZUxhYmVsXCIgY2xhc3M9XCJzbWUtbGF5b3V0LWZsb2F0LXJpZ2h0XCI+e3sgZnJlZU1lc3NhZ2UgfX08L2Rpdj5cclxuIl19