@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
227 lines • 32.1 kB
JavaScript
import { Component, Injector, Input } from '@angular/core';
import { CapacityBase } from '../common/capacity-base.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../legend/legend.component";
import * as i3 from "./stacked-bar.component";
function StackedHorizontalBarChartComponent_div_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 7)(1, "div", 8);
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r0.chartTitle);
} }
function StackedHorizontalBarChartComponent_ng_container_4_sme_stacked_bar_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-stacked-bar", 10);
} if (rf & 2) {
const ctx_r7 = i0.ɵɵnextContext();
const bar_r4 = ctx_r7.$implicit;
const i_r5 = ctx_r7.index;
const ctx_r6 = i0.ɵɵnextContext();
i0.ɵɵstyleProp("height", ctx_r6.heightStyle);
i0.ɵɵproperty("normalColorScheme", ctx_r6.normalColorScheme)("warningColorScheme", ctx_r6.warningColorScheme)("criticalColorScheme", ctx_r6.criticalColorScheme)("criticalThreshold", ctx_r6.criticalThreshold)("warningThreshold", ctx_r6.warningThreshold)("bar", bar_r4)("index", i_r5)("bars", ctx_r6.bars)("total", ctx_r6.total);
} }
function StackedHorizontalBarChartComponent_ng_container_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, StackedHorizontalBarChartComponent_ng_container_4_sme_stacked_bar_1_Template, 1, 11, "sme-stacked-bar", 9);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const bar_r4 = ctx.$implicit;
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !bar_r4.right);
} }
function StackedHorizontalBarChartComponent_ng_container_6_sme_stacked_bar_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-stacked-bar", 10);
} if (rf & 2) {
const ctx_r11 = i0.ɵɵnextContext();
const bar_r8 = ctx_r11.$implicit;
const i_r9 = ctx_r11.index;
const ctx_r10 = i0.ɵɵnextContext();
i0.ɵɵstyleProp("height", ctx_r10.heightStyle);
i0.ɵɵproperty("normalColorScheme", ctx_r10.normalColorScheme)("warningColorScheme", ctx_r10.warningColorScheme)("criticalColorScheme", ctx_r10.criticalColorScheme)("criticalThreshold", ctx_r10.criticalThreshold)("warningThreshold", ctx_r10.warningThreshold)("bar", bar_r8)("index", i_r9)("bars", ctx_r10.bars)("total", ctx_r10.total);
} }
function StackedHorizontalBarChartComponent_ng_container_6_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, StackedHorizontalBarChartComponent_ng_container_6_sme_stacked_bar_1_Template, 1, 11, "sme-stacked-bar", 9);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const bar_r8 = ctx.$implicit;
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", bar_r8.right);
} }
function StackedHorizontalBarChartComponent_div_7_div_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div");
i0.ɵɵelement(1, "sme-legend", 13);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r12 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵproperty("normalColorScheme", ctx_r12.normalColorScheme)("warningColorScheme", ctx_r12.warningColorScheme)("criticalColorScheme", ctx_r12.criticalColorScheme)("criticalThreshold", ctx_r12.criticalThreshold)("warningThreshold", ctx_r12.warningThreshold)("legendData", ctx_r12.legendTotalData)("hideInHighContrast", true)("svgLegendColorIndicator", false);
} }
function StackedHorizontalBarChartComponent_div_7_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div")(1, "div", 11);
i0.ɵɵelement(2, "sme-legend", 12);
i0.ɵɵtemplate(3, StackedHorizontalBarChartComponent_div_7_div_3_Template, 2, 8, "div", 6);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r3 = i0.ɵɵnextContext();
i0.ɵɵadvance(2);
i0.ɵɵproperty("normalColorScheme", ctx_r3.normalColorScheme)("warningColorScheme", ctx_r3.warningColorScheme)("criticalColorScheme", ctx_r3.criticalColorScheme)("criticalThreshold", ctx_r3.criticalThreshold)("warningThreshold", ctx_r3.warningThreshold)("legendData", ctx_r3.legendData)("total", ctx_r3.total)("hideInHighContrast", true)("svgLegendColorIndicator", false);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r3.legendTotalData);
} }
/**
*
* @smeDoc {@label Stacked Horizontal Bar Chart @id sme-stacked-horizontal-bar-chart-dev-guide}
*
* @overview
* @file {@filepath ./examples/overview.md}
*
* @example {@label Stacked horizontal bar chart @id horizontal-bar-chart}
* @file {@filename component.html @filepath ./examples/horizontal-bar-chart.component.html}
* @file {@filename component.ts @filepath ./examples/horizontal-bar-chart.component.ts}
*
* @example {@label Stacked horizontal bar chart with custom color @id horizontal-bar-chart-custom-color}
* @file {@filename component.html @filepath ./examples/horizontal-bar-chart-custom-color.component.html}
* @file {@filename component.ts @filepath ./examples/horizontal-bar-chart-custom-color.component.ts}
*
*/
export class StackedHorizontalBarChartComponent extends CapacityBase {
constructor(injector) {
super(injector);
/**
* Input binding for capacity bars data
*/
this.bars = [];
/**
* Whether or not to use a generated legend
* If legendData is specified a legend will be shown regardless of showLegend value
*/
this.showLegend = true;
/**
* the legend data to put into the legend
*/
this.legendData = [];
/**
* True to display the chart title
*/
this.showTitle = true;
this.strings = MsftSme.getStrings();
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'StackedHorizontalBarChartComponent';
}
/**
* Angular lifecycle hook, called after the component is initialized
*/
ngOnInit() {
super.ngOnInit();
this.height = this.height ? this.height : 36; // set default height
this.heightStyle = '{0}px'.format(this.height);
this.updateLegendTotal();
this.setAriaLabel();
}
/**
* Implementation of angular OnChanges interface
* @param changes - the changes that occurred
*/
ngOnChanges(changes) {
super.ngOnChanges(changes);
if (changes.legendTotalValue) {
this.legendTotalData = null;
this.updateLegendTotal();
}
else if (changes.chartTitle || changes.description) {
this.setAriaLabel();
}
}
/**
* Update the total legend entry
*/
updateLegendTotal() {
if (MsftSme.isNullOrUndefined(this.legendTotalData) && !MsftSme.isNullOrUndefined(this.legendTotalValue)) {
const legendTotalEntry = {
displayValue: this.legendTotalValue,
label: this.strings.MsftSmeShell.Angular.StackedHorizontalBarChart.totalLabel,
rightAlign: true,
noColor: true
};
if (this.legendTotalLabel) {
legendTotalEntry.label = this.legendTotalLabel;
}
this.legendTotalData = [legendTotalEntry];
}
}
setAriaLabel() {
let ariaLabel = '';
if (this.hostElement.nativeElement.childNodes.length > 0) {
const rootElement = this.hostElement.nativeElement.childNodes[0];
rootElement.setAttribute('aria-label', ariaLabel);
if (this.chartTitle) {
ariaLabel = this.chartTitle;
if (this.description) {
ariaLabel += ' ' + this.description;
}
}
else if (this.description) {
ariaLabel = this.description;
}
ariaLabel += ' ' + this.strings.MsftSmeShell.Angular.StackedHorizontalBarChart.Aria.roleDescription;
rootElement.setAttribute('aria-label', ariaLabel);
}
}
}
/** @nocollapse */ StackedHorizontalBarChartComponent.ɵfac = function StackedHorizontalBarChartComponent_Factory(t) { return new (t || StackedHorizontalBarChartComponent)(i0.ɵɵdirectiveInject(i0.Injector)); };
/** @nocollapse */ StackedHorizontalBarChartComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: StackedHorizontalBarChartComponent, selectors: [["sme-stacked-horizontal-bar-chart"]], inputs: { height: "height", bars: "bars", showLegend: "showLegend", legendData: "legendData", legendTotalValue: "legendTotalValue", legendTotalLabel: "legendTotalLabel", chartTitle: "chartTitle", showTitle: "showTitle", legendTotalData: "legendTotalData", description: "description" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 8, vars: 6, consts: [["tabindex", "0", 1, "sme-focus-zone"], ["class", "sme-height-lg", "aria-hidden", "true", 4, "ngIf"], [1, "sme-arrange-stack-h", "sme-background-color-base-80", "sme-high-contrast-layout-none", "sme-margin-top-xs"], [1, "sme-position-flex-none", "sme-position-stretch-h", "sme-arrange-stack-h"], [4, "ngFor", "ngForOf"], [1, "sme-position-flex-none", "sme-position-stretch-h", "sme-arrange-stack-h-reversed", 2, "margin-left", "-100%"], [4, "ngIf"], ["aria-hidden", "true", 1, "sme-height-lg"], [1, "sme-font-family-bold", "sme-position-center-h-inline", "sme-layout-float-left"], [3, "normalColorScheme", "warningColorScheme", "criticalColorScheme", "criticalThreshold", "warningThreshold", "bar", "index", "bars", "total", "height", 4, "ngIf"], [3, "normalColorScheme", "warningColorScheme", "criticalColorScheme", "criticalThreshold", "warningThreshold", "bar", "index", "bars", "total"], [1, "sme-position-flex-auto", "sme-arrange-stack-h"], [1, "sme-position-flex-auto", 3, "normalColorScheme", "warningColorScheme", "criticalColorScheme", "criticalThreshold", "warningThreshold", "legendData", "total", "hideInHighContrast", "svgLegendColorIndicator"], [3, "normalColorScheme", "warningColorScheme", "criticalColorScheme", "criticalThreshold", "warningThreshold", "legendData", "hideInHighContrast", "svgLegendColorIndicator"]], template: function StackedHorizontalBarChartComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "figure", 0);
i0.ɵɵtemplate(1, StackedHorizontalBarChartComponent_div_1_Template, 3, 1, "div", 1);
i0.ɵɵelementStart(2, "div", 2)(3, "div", 3);
i0.ɵɵtemplate(4, StackedHorizontalBarChartComponent_ng_container_4_Template, 2, 1, "ng-container", 4);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "div", 5);
i0.ɵɵtemplate(6, StackedHorizontalBarChartComponent_ng_container_6_Template, 2, 1, "ng-container", 4);
i0.ɵɵelementEnd()();
i0.ɵɵtemplate(7, StackedHorizontalBarChartComponent_div_7_Template, 4, 10, "div", 6);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.chartTitle && ctx.showTitle);
i0.ɵɵadvance(1);
i0.ɵɵstyleProp("height", ctx.heightStyle);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", ctx.bars);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", ctx.bars);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.legendData.length > 0 && ctx.showLegend);
} }, dependencies: [i1.NgForOf, i1.NgIf, i2.LegendComponent, i3.StackedBarComponent], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(StackedHorizontalBarChartComponent, [{
type: Component,
args: [{ selector: 'sme-stacked-horizontal-bar-chart', template: "<figure class=\"sme-focus-zone\" tabindex=\"0\">\r\n\r\n <div *ngIf=\"chartTitle && showTitle\" class=\"sme-height-lg\" aria-hidden=\"true\">\r\n <div class=\"sme-font-family-bold sme-position-center-h-inline sme-layout-float-left\">{{chartTitle}}</div>\r\n </div>\r\n\r\n <div class=\"sme-arrange-stack-h sme-background-color-base-80 sme-high-contrast-layout-none sme-margin-top-xs\"\r\n [style.height]=\"heightStyle\">\r\n <div class=\"sme-position-flex-none sme-position-stretch-h sme-arrange-stack-h\">\r\n <ng-container *ngFor=\"let bar of bars; let i = index;\">\r\n <sme-stacked-bar *ngIf=\"!bar.right\" [normalColorScheme]=\"normalColorScheme\"\r\n [warningColorScheme]=\"warningColorScheme\" [criticalColorScheme]=\"criticalColorScheme\"\r\n [criticalThreshold]=\"criticalThreshold\" [warningThreshold]=\"warningThreshold\" [bar]=\"bar\" [index]=\"i\"\r\n [bars]=\"bars\" [total]=\"total\" [style.height]=\"heightStyle\"></sme-stacked-bar>\r\n </ng-container>\r\n </div>\r\n <!-- Explanation: margin-left:-100% To have the stripped bars overlap the solid bars, we place this\r\n stack of bars to be directly over the last set and have them arranged to be starting on the right-->\r\n <div class=\"sme-position-flex-none sme-position-stretch-h sme-arrange-stack-h-reversed\" style=\"margin-left:-100%\">\r\n <ng-container *ngFor=\"let bar of bars; let i = index;\">\r\n <sme-stacked-bar *ngIf=\"bar.right\" [normalColorScheme]=\"normalColorScheme\"\r\n [warningColorScheme]=\"warningColorScheme\" [criticalColorScheme]=\"criticalColorScheme\"\r\n [criticalThreshold]=\"criticalThreshold\" [warningThreshold]=\"warningThreshold\" [bar]=\"bar\" [index]=\"i\"\r\n [bars]=\"bars\" [total]=\"total\" [style.height]=\"heightStyle\"></sme-stacked-bar>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"legendData.length > 0 && showLegend\">\r\n <div class=\"sme-position-flex-auto sme-arrange-stack-h\">\r\n <sme-legend class=\"sme-position-flex-auto\" [normalColorScheme]=\"normalColorScheme\"\r\n [warningColorScheme]=\"warningColorScheme\" [criticalColorScheme]=\"criticalColorScheme\"\r\n [criticalThreshold]=\"criticalThreshold\" [warningThreshold]=\"warningThreshold\" [legendData]=\"legendData\"\r\n [total]=\"total\" [hideInHighContrast]=\"true\" [svgLegendColorIndicator]=\"false\"></sme-legend>\r\n\r\n <div *ngIf=\"legendTotalData\">\r\n <sme-legend [normalColorScheme]=\"normalColorScheme\" [warningColorScheme]=\"warningColorScheme\"\r\n [criticalColorScheme]=\"criticalColorScheme\" [criticalThreshold]=\"criticalThreshold\"\r\n [warningThreshold]=\"warningThreshold\" [legendData]=\"legendTotalData\" [hideInHighContrast]=\"true\"\r\n [svgLegendColorIndicator]=\"false\"></sme-legend>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</figure>" }]
}], function () { return [{ type: i0.Injector }]; }, { height: [{
type: Input
}], bars: [{
type: Input
}], showLegend: [{
type: Input
}], legendData: [{
type: Input
}], legendTotalValue: [{
type: Input
}], legendTotalLabel: [{
type: Input
}], chartTitle: [{
type: Input
}], showTitle: [{
type: Input
}], legendTotalData: [{
type: Input
}], description: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1ob3Jpem9udGFsLWJhci1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9ob3Jpem9udGFsLWJhci1jaGFydC9zdGFja2VkLWhvcml6b250YWwtYmFyLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2hvcml6b250YWwtYmFyLWNoYXJ0L3N0YWNrZWQtaG9yaXpvbnRhbC1iYXItY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUU3RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7OztJQ0EvRCw4QkFBOEUsYUFBQTtJQUNTLFlBQWM7SUFBQSxpQkFBTSxFQUFBOzs7SUFBcEIsZUFBYztJQUFkLHVDQUFjOzs7SUFPL0Ysc0NBRytFOzs7Ozs7SUFBL0MsNENBQTRCO0lBSHZCLDREQUF1QyxpREFBQSxtREFBQSwrQ0FBQSw2Q0FBQSxlQUFBLGVBQUEscUJBQUEsdUJBQUE7OztJQUQ5RSw2QkFBdUQ7SUFDckQsMkhBRytFO0lBQ2pGLDBCQUFlOzs7SUFKSyxlQUFnQjtJQUFoQixvQ0FBZ0I7OztJQVVsQyxzQ0FHK0U7Ozs7OztJQUEvQyw2Q0FBNEI7SUFIeEIsNkRBQXVDLGtEQUFBLG9EQUFBLGdEQUFBLDhDQUFBLGVBQUEsZUFBQSxzQkFBQSx3QkFBQTs7O0lBRDdFLDZCQUF1RDtJQUNyRCwySEFHK0U7SUFDakYsMEJBQWU7OztJQUpLLGVBQWU7SUFBZixtQ0FBZTs7O0lBZW5DLDJCQUE2QjtJQUMzQixpQ0FHaUQ7SUFDbkQsaUJBQU07OztJQUpRLGVBQXVDO0lBQXZDLDZEQUF1QyxrREFBQSxv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Z0JBQWdCO2tCQUEvQixLQUFLO1lBS1UsVUFBVTtrQkFBekIsS0FBSztZQUtVLFNBQVM7a0JBQXhCLEtBQUs7WUFNVSxlQUFlO2tCQUE5QixLQUFLO1lBS1UsV0FBVztrQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0b3IsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdHJpbmdzIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdGVkL1N0cmluZ3MnO1xyXG5pbXBvcnQgeyBDYXBhY2l0eUJhc2UgfSBmcm9tICcuLi9jb21tb24vY2FwYWNpdHktYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMZWdlbmRFbnRyeURhdGEgfSBmcm9tICcuLi9sZWdlbmQvbGVnZW5kLWVudHJ5L2xlZ2VuZC1lbnRyeS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBIb3Jpem9udGFsQmFyIH0gZnJvbSAnLi9jdXN0b20taG9yaXpvbnRhbC1iYXItY2hhcnQtZGF0YS5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBzbWVEb2Mge0BsYWJlbCBTdGFja2VkIEhvcml6b250YWwgQmFyIENoYXJ0IEBpZCBzbWUtc3RhY2tlZC1ob3Jpem9udGFsLWJhci1jaGFydC1kZXYtZ3VpZGV9XHJcbiAqXHJcbiAqIEBvdmVydmlld1xyXG4gKiBAZmlsZSB7QGZpbGVwYXRoIC4vZXhhbXBsZXMvb3ZlcnZpZXcubWR9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgU3RhY2tlZCBob3Jpem9udGFsIGJhciBjaGFydCBAaWQgaG9yaXpvbnRhbC1iYXItY2hhcnR9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvaG9yaXpvbnRhbC1iYXItY2hhcnQuY29tcG9uZW50Lmh0bWx9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50LnRzIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2hvcml6b250YWwtYmFyLWNoYXJ0LmNvbXBvbmVudC50c31cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBTdGFja2VkIGhvcml6b250YWwgYmFyIGNoYXJ0IHdpdGggY3VzdG9tIGNvbG9yIEBpZCBob3Jpem9udGFsLWJhci1jaGFydC1jdXN0b20tY29sb3J9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvaG9yaXpvbnRhbC1iYXItY2hhcnQtY3VzdG9tLWNvbG9yLmNvbXBvbmVudC5odG1sfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC50cyBAZmlsZXBhdGggLi9leGFtcGxlcy9ob3Jpem9udGFsLWJhci1jaGFydC1jdXN0b20tY29sb3IuY29tcG9uZW50LnRzfVxyXG4gKlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1zdGFja2VkLWhvcml6b250YWwtYmFyLWNoYXJ0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9zdGFja2VkLWhvcml6b250YWwtYmFyLWNoYXJ0LmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RhY2tlZEhvcml6b250YWxCYXJDaGFydENvbXBvbmVudCBleHRlbmRzIENhcGFjaXR5QmFzZVxyXG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ1N0YWNrZWRIb3Jpem9udGFsQmFyQ2hhcnRDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIElucHV0IGJpbmRpbmcgZm9yIGhlaWdodCBvZiBiYXIgY2hhcnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgSW5wdXQgYmluZGluZyBmb3IgY2FwYWNpdHkgYmFycyBkYXRhXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBiYXJzOiBIb3Jpem9udGFsQmFyW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIHVzZSBhIGdlbmVyYXRlZCBsZWdlbmRcclxuICAgICAqIElmIGxlZ2VuZERhdGEgaXMgc3BlY2lmaWVkIGEgbGVnZW5kIHdpbGwgYmUgc2hvd24gcmVnYXJkbGVzcyBvZiBzaG93TGVnZW5kIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93TGVnZW5kID8gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogdGhlIGxlZ2VuZCBkYXRhIHRvIHB1dCBpbnRvIHRoZSBsZWdlbmRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGxlZ2VuZERhdGE/OiBMZWdlbmRFbnRyeURhdGFbXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogdGhlIHRvdGFsIGxlZ2VuZCB2YWx1ZVxyXG4gICAgICogVGhlIGNvbG9yIGFuZCByaWdodCBhbGlnbm1lbnQgYXJlIGhhbmRsZWQgaW4gdGhlIGJhciBjaGFydCBpdHNlbGYuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsZWdlbmRUb3RhbFZhbHVlPzogYW55O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogdGhlIHRvdGFsIGxlZ2VuZCBsYWJlbFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbGVnZW5kVG90YWxMYWJlbD86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRpdGxlIHNob3duIGZvciB0aGUgY2hhcnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGNoYXJ0VGl0bGU/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIHRvIGRpc3BsYXkgdGhlIGNoYXJ0IHRpdGxlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93VGl0bGUgPyA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMZWdlbmQgZGF0YSBmb3IgdGhlIHRvdGFsIG9mIHRoZSBjaGFydC5cclxuICAgICAqIFRoaXMgZGF0YSB3aWxsIHRha2UgcHJpb3JpdHkgb3ZlciBsZWdlbmRUb3RhbFZhbHVlICYgbGVnZW5kVG90YWxMYWJlbC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGxlZ2VuZFRvdGFsRGF0YT86IExlZ2VuZEVudHJ5RGF0YVtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJpYSBkZXNjcmlwdGlvbiBmb3IgdGhlIGJhciBjaGFydFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIGhlaWdodFN0eWxlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgc3RyaW5nczogU3RyaW5ncyA9IE1zZnRTbWUuZ2V0U3RyaW5nczxTdHJpbmdzPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuZ3VsYXIgbGlmZWN5Y2xlIGhvb2ssIGNhbGxlZCBhZnRlciB0aGUgY29tcG9uZW50IGlzIGluaXRpYWxpemVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodCA6IDM2OyAvLyBzZXQgZGVmYXVsdCBoZWlnaHRcclxuICAgICAgICB0aGlzLmhlaWdodFN0eWxlID0gJ3swfXB4Jy5mb3JtYXQodGhpcy5oZWlnaHQpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kVG90YWwoKTtcclxuICAgICAgICB0aGlzLnNldEFyaWFMYWJlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5ndWxhciBPbkNoYW5nZXMgaW50ZXJmYWNlXHJcbiAgICAgKiBAcGFyYW0gY2hhbmdlcyAtIHRoZSBjaGFuZ2VzIHRoYXQgb2NjdXJyZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcclxuICAgICAgICBpZiAoY2hhbmdlcy5sZWdlbmRUb3RhbFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGVnZW5kVG90YWxEYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRUb3RhbCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5jaGFydFRpdGxlIHx8IGNoYW5nZXMuZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBcmlhTGFiZWwoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIHRvdGFsIGxlZ2VuZCBlbnRyeVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlTGVnZW5kVG90YWwoKSB7XHJcbiAgICAgICAgaWYgKE1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5sZWdlbmRUb3RhbERhdGEpICYmICFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMubGVnZW5kVG90YWxWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlZ2VuZFRvdGFsRW50cnkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLmxlZ2VuZFRvdGFsVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5TdGFja2VkSG9yaXpvbnRhbEJhckNoYXJ0LnRvdGFsTGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRBbGlnbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBub0NvbG9yOiB0cnVlXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGVnZW5kVG90YWxMYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2VuZFRvdGFsRW50cnkubGFiZWwgPSB0aGlzLmxlZ2VuZFRvdGFsTGFiZWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZ2VuZFRvdGFsRGF0YSA9IFtsZWdlbmRUb3RhbEVudHJ5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRBcmlhTGFiZWwoKSB7XHJcbiAgICAgICAgbGV0IGFyaWFMYWJlbCA9ICcnO1xyXG4gICAgICAgIGlmICh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXNbMF07XHJcbiAgICAgICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGFyaWFMYWJlbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jaGFydFRpdGxlKSB7XHJcbiAgICAgICAgICAgICAgICBhcmlhTGFiZWwgPSB0aGlzLmNoYXJ0VGl0bGU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbCArPSAnICcgKyB0aGlzLmRlc2NyaXB0aW9uO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIGFyaWFMYWJlbCA9IHRoaXMuZGVzY3JpcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXJpYUxhYmVsICs9ICcgJyArIHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5TdGFja2VkSG9yaXpvbnRhbEJhckNoYXJ0LkFyaWEucm9sZURlc2NyaXB0aW9uO1xyXG4gICAgICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBhcmlhTGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCI8ZmlndXJlIGNsYXNzPVwic21lLWZvY3VzLXpvbmVcIiB0YWJpbmRleD1cIjBcIj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImNoYXJ0VGl0bGUgJiYgc2hvd1RpdGxlXCIgY2xhc3M9XCJzbWUtaGVpZ2h0LWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLWZvbnQtZmFtaWx5LWJvbGQgc21lLXBvc2l0aW9uLWNlbnRlci1oLWlubGluZSBzbWUtbGF5b3V0LWZsb2F0LWxlZnRcIj57e2NoYXJ0VGl0bGV9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2staCBzbWUtYmFja2dyb3VuZC1jb2xvci1iYXNlLTgwIHNtZS1oaWdoLWNvbnRyYXN0LWxheW91dC1ub25lIHNtZS1tYXJnaW4tdG9wLXhzXCJcclxuICAgIFtzdHlsZS5oZWlnaHRdPVwiaGVpZ2h0U3R5bGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtcG9zaXRpb24tZmxleC1ub25lIHNtZS1wb3NpdGlvbi1zdHJldGNoLWggc21lLWFycmFuZ2Utc3RhY2staFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiYXIgb2YgYmFyczsgbGV0IGkgPSBpbmRleDtcIj5cclxuICAgICAgICA8c21lLXN0YWNrZWQtYmFyICpuZ0lmPVwiIWJhci5yaWdodFwiICBbbm9ybWFsQ29sb3JTY2hlbWVdPVwibm9ybWFsQ29sb3JTY2hlbWVcIlxyXG4gICAgICAgICAgW3dhcm5pbmdDb2xvclNjaGVtZV09XCJ3YXJuaW5nQ29sb3JTY2hlbWVcIiBbY3JpdGljYWxDb2xvclNjaGVtZV09XCJjcml0aWNhbENvbG9yU2NoZW1lXCJcclxuICAgICAgICAgIFtjcml0aWNhbFRocmVzaG9sZF09XCJjcml0aWNhbFRocmVzaG9sZFwiIFt3YXJuaW5nVGhyZXNob2xkXT1cIndhcm5pbmdUaHJlc2hvbGRcIiBbYmFyXT1cImJhclwiIFtpbmRleF09XCJpXCJcclxuICAgICAgICAgIFtiYXJzXT1cImJhcnNcIiBbdG90YWxdPVwidG90YWxcIiBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFN0eWxlXCI+PC9zbWUtc3RhY2tlZC1iYXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIEV4cGxhbmF0aW9uOiBtYXJnaW4tbGVmdDotMTAwJSBUbyBoYXZlIHRoZSBzdHJpcHBlZCBiYXJzIG92ZXJsYXAgdGhlIHNvbGlkIGJhcnMsIHdlIHBsYWNlIHRoaXNcclxuICAgICAgICAgc3RhY2sgb2YgYmFycyB0byBiZSBkaXJlY3RseSBvdmVyIHRoZSBsYXN0IHNldCBhbmQgaGF2ZSB0aGVtIGFycmFuZ2VkIHRvIGJlIHN0YXJ0aW5nIG9uIHRoZSByaWdodC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS1wb3NpdGlvbi1mbGV4LW5vbmUgc21lLXBvc2l0aW9uLXN0cmV0Y2gtaCBzbWUtYXJyYW5nZS1zdGFjay1oLXJldmVyc2VkXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDotMTAwJVwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiYXIgb2YgYmFyczsgbGV0IGkgPSBpbmRleDtcIj5cclxuICAgICAgICA8c21lLXN0YWNrZWQtYmFyICpuZ0lmPVwiYmFyLnJpZ2h0XCIgIFtub3JtYWxDb2xvclNjaGVtZV09XCJub3JtYWxDb2xvclNjaGVtZVwiXHJcbiAgICAgICAgICBbd2FybmluZ0NvbG9yU2NoZW1lXT1cIndhcm5pbmdDb2xvclNjaGVtZVwiIFtjcml0aWNhbENvbG9yU2NoZW1lXT1cImNyaXRpY2FsQ29sb3JTY2hlbWVcIlxyXG4gICAgICAgICAgW2NyaXRpY2FsVGhyZXNob2xkXT1cImNyaXRpY2FsVGhyZXNob2xkXCIgW3dhcm5pbmdUaHJlc2hvbGRdPVwid2FybmluZ1RocmVzaG9sZFwiIFtiYXJdPVwiYmFyXCIgW2luZGV4XT1cImlcIlxyXG4gICAgICAgICAgW2JhcnNdPVwiYmFyc1wiIFt0b3RhbF09XCJ0b3RhbFwiIFtzdHlsZS5oZWlnaHRdPVwiaGVpZ2h0U3R5bGVcIj48L3NtZS1zdGFja2VkLWJhcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImxlZ2VuZERhdGEubGVuZ3RoID4gMCAmJiBzaG93TGVnZW5kXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLXBvc2l0aW9uLWZsZXgtYXV0byBzbWUtYXJyYW5nZS1zdGFjay1oXCI+XHJcbiAgICAgIDxzbWUtbGVnZW5kIGNsYXNzPVwic21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiIFtub3JtYWxDb2xvclNjaGVtZV09XCJub3JtYWxDb2xvclNjaGVtZVwiXHJcbiAgICAgICAgW3dhcm5pbmdDb2xvclNjaGVtZV09XCJ3YXJuaW5nQ29sb3JTY2hlbWVcIiBbY3JpdGljYWxDb2xvclNjaGVtZV09XCJjcml0aWNhbENvbG9yU2NoZW1lXCJcclxuICAgICAgICBbY3JpdGljYWxUaHJlc2hvbGRdPVwiY3JpdGljYWxUaHJlc2hvbGRcIiBbd2FybmluZ1RocmVzaG9sZF09XCJ3YXJuaW5nVGhyZXNob2xkXCIgW2xlZ2VuZERhdGFdPVwibGVnZW5kRGF0YVwiXHJcbiAgICAgICAgW3RvdGFsXT1cInRvdGFsXCIgW2hpZGVJbkhpZ2hDb250cmFzdF09XCJ0cnVlXCIgW3N2Z0xlZ2VuZENvbG9ySW5kaWNhdG9yXT1cImZhbHNlXCI+PC9zbWUtbGVnZW5kPlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImxlZ2VuZFRvdGFsRGF0YVwiPlxyXG4gICAgICAgIDxzbWUtbGVnZW5kIFtub3JtYWxDb2xvclNjaGVtZV09XCJub3JtYWxDb2xvclNjaGVtZVwiIFt3YXJuaW5nQ29sb3JTY2hlbWVdPVwid2FybmluZ0NvbG9yU2NoZW1lXCJcclxuICAgICAgICAgIFtjcml0aWNhbENvbG9yU2NoZW1lXT1cImNyaXRpY2FsQ29sb3JTY2hlbWVcIiBbY3JpdGljYWxUaHJlc2hvbGRdPVwiY3JpdGljYWxUaHJlc2hvbGRcIlxyXG4gICAgICAgICAgW3dhcm5pbmdUaHJlc2hvbGRdPVwid2FybmluZ1RocmVzaG9sZFwiIFtsZWdlbmREYXRhXT1cImxlZ2VuZFRvdGFsRGF0YVwiIFtoaWRlSW5IaWdoQ29udHJhc3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICBbc3ZnTGVnZW5kQ29sb3JJbmRpY2F0b3JdPVwiZmFsc2VcIj48L3NtZS1sZWdlbmQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L2ZpZ3VyZT4iXX0=