UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

237 lines 29.8 kB
import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Output, QueryList, ViewChildren } from '@angular/core'; import { CoreBaseComponent } from '../../common/base.component'; import { LineChartComponent } from '../line-chart.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../../loading-wheel/loading-wheel.component"; import * as i3 from "../../layout/layout.component"; import * as i4 from "../../layout/layout-item.component"; import * as i5 from "../../layout/layout-definition.component"; import * as i6 from "../../pivot/pivot.component"; import * as i7 from "../../pivot/pivot-tab.component"; import * as i8 from "../line-chart.component"; function TabbedLineChartGroupComponent_sme_pivot_0_sme_pivot_tab_1_ng_template_1_Template(rf, ctx) { } function TabbedLineChartGroupComponent_sme_pivot_0_sme_pivot_tab_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "sme-pivot-tab", 10); i0.ɵɵtemplate(1, TabbedLineChartGroupComponent_sme_pivot_0_sme_pivot_tab_1_ng_template_1_Template, 0, 0, "ng-template"); i0.ɵɵelementEnd(); } if (rf & 2) { const tab_r7 = ctx.$implicit; i0.ɵɵproperty("label", tab_r7); } } function TabbedLineChartGroupComponent_sme_pivot_0_Template(rf, ctx) { if (rf & 1) { const _r10 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "sme-pivot", 8); i0.ɵɵlistener("selectionChange", function TabbedLineChartGroupComponent_sme_pivot_0_Template_sme_pivot_selectionChange_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r9 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r9.tabChanged($event)); }); i0.ɵɵtemplate(1, TabbedLineChartGroupComponent_sme_pivot_0_sme_pivot_tab_1_Template, 2, 1, "sme-pivot-tab", 9); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵproperty("headerText", ctx_r0.groupTitle)("noLeftPadding", true); i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", ctx_r0.tabList); } } function TabbedLineChartGroupComponent_sme_layout_definition_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-layout-definition", 11); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵproperty("until", ctx_r2.chartsPerRow === 1 ? ctx_r2.maxNumber : ctx_r2.minChartWidth * 2 + ctx_r2.chartPadding)("columns", 1); } } function TabbedLineChartGroupComponent_sme_layout_definition_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-layout-definition", 12); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵproperty("until", ctx_r3.chartsPerRow === 2 ? ctx_r3.maxNumber : ctx_r3.minChartWidth * 3 + ctx_r3.chartPadding)("columns", 2); } } function TabbedLineChartGroupComponent_sme_layout_definition_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-layout-definition", 13); } if (rf & 2) { i0.ɵɵproperty("columns", 3); } } function TabbedLineChartGroupComponent_sme_layout_item_7_sme_loading_wheel_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-loading-wheel", 17); } if (rf & 2) { const ctx_r13 = i0.ɵɵnextContext(2); i0.ɵɵproperty("message", ctx_r13.loadingMessage); } } function TabbedLineChartGroupComponent_sme_layout_item_7_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "sme-layout-item", 14); i0.ɵɵtemplate(1, TabbedLineChartGroupComponent_sme_layout_item_7_sme_loading_wheel_1_Template, 1, 1, "sme-loading-wheel", 15); i0.ɵɵelement(2, "sme-line-chart", 16); i0.ɵɵelementEnd(); } if (rf & 2) { const tabChartData_r11 = ctx.$implicit; const i_r12 = ctx.index; const ctx_r5 = i0.ɵɵnextContext(); i0.ɵɵproperty("maxWidth", ctx_r5.maxChartWidth); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r5.loadingWheels && ctx_r5.dataIsLoading(tabChartData_r11)); i0.ɵɵadvance(1); i0.ɵɵproperty("chartLegendData", ctx_r5.chartLegendData[i_r12])("useCustomSettings", ctx_r5.useCustomSettings)("tooltipFormatter", ctx_r5.tooltipFormatters[i_r12])("lineChartData", ctx_r5.getLineChartData(tabChartData_r11)); } } export class TabbedLineChartGroupComponent extends CoreBaseComponent { constructor(injector, changeDetectorRef) { super(injector); this.changeDetectorRef = changeDetectorRef; this.noLeftMargin = false; /** * Currently support 1, 2, and 3 charts per row * Default is 3 charts. * Chart layout will scale automatically according to width of parent element */ this.chartsPerRow = 3; /** * The minimum chart width you want to allow for scaling purposes, * If not specified, this is 420 */ this.minChartWidth = 420; /** * The max chart width you want to allow for scaling purposes. * If not specified, this is 840 */ this.maxChartWidth = 840; this.tabClicked = new EventEmitter(); this.maxNumber = Number.MAX_VALUE; this.chartPadding = 40; this.chartLegendData = []; } get logSourceName() { return 'TabbedLineChartGroupComponent'; } /** * @deprecated since 9/25/2019. Please use 'tabClicked' instead */ // eslint-disable-next-line @angular-eslint/no-output-on-prefix get onTabClick() { return this.tabClicked; } ngOnInit() { if (this.tabList) { this.selectedTab = MsftSme.first(this.tabList); // tooltip formatting functions this.tooltipFormatters = this.tooltipFormatters ? this.tooltipFormatters : []; for (let i = 0; i < this.groupData.length; i++) { if (!this.tooltipFormatters[i]) { // if no formatting funcion is supplied, then null ensures the data will not be formatted this.tooltipFormatters[i] = null; } } } else { throw new Error('tabList input is required to render tabbed line chart group'); } } /** * Set selected tab and emit this event */ tabChanged(tab) { const index = this.tabList.indexOf(tab.label); this.selectedTab = tab.label; this.tabClicked.emit(index); this.refresh(); } /** * Refresh all of the charts when new data is added to lineChartData input */ refresh() { if (!this.changeDetectorRef['destroyed']) { this.changeDetectorRef.detectChanges(); } if (this.lineChartComponents) { this.lineChartComponents.forEach(lineChart => { lineChart.refresh(); }); } if (MsftSme.isNullOrUndefined(this.tabList.first(x => x === this.selectedTab))) { this.selectedTab = MsftSme.first(this.tabList); } } /** * Get line chart data for selected tab */ getLineChartData(tabChartData) { return tabChartData.get(this.selectedTab); } /** * Returns the title of the current chart to track adn reuse the chart object * @param index the index of the item * @param item the item */ trackByTitle(index, item) { return this.selectedTab ? item.get(this.selectedTab).title : ''; } /** * Check whether the LineChartData.isLoading for that tab is set to true or false */ dataIsLoading(tabChartData) { return this.getLineChartData(tabChartData).isLoading; } ngOnDestroy() { this.changeDetectorRef.detach(); } } /** @nocollapse */ TabbedLineChartGroupComponent.ɵfac = function TabbedLineChartGroupComponent_Factory(t) { return new (t || TabbedLineChartGroupComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; /** @nocollapse */ TabbedLineChartGroupComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TabbedLineChartGroupComponent, selectors: [["sme-tabbed-line-chart-group"]], viewQuery: function TabbedLineChartGroupComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(LineChartComponent, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.lineChartComponents = _t); } }, inputs: { groupData: "groupData", tabList: "tabList", noLeftMargin: "noLeftMargin", groupTitle: "groupTitle", chartsPerRow: "chartsPerRow", loadingWheels: "loadingWheels", loadingMessage: "loadingMessage", useCustomSettings: "useCustomSettings", chartLegendData: "chartLegendData", tooltipFormatters: "tooltipFormatters", minChartWidth: "minChartWidth", maxChartWidth: "maxChartWidth" }, outputs: { onTabClick: "onTabClick", tabClicked: "tabClicked" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 11, consts: [["alignTabs", "right", 3, "headerText", "noLeftPadding", "selectionChange", 4, "ngIf"], [1, "sme-layout-relative", "sme-position-inset-none", "sme-padding-inset-none", "sme-arrange-wrapstack-h", "sme-arrange-overflow-auto-y", "sme-arrange-overflow-hide-x"], [1, "sme-position-flex-auto", "sme-arrange-overflow-auto", 3, "itemHorizontalSpace", "padLastItem", "noExtraRightPaddingOneItemPerRow"], ["layout", ""], ["name", "narrow", 3, "until", "columns", 4, "ngIf"], ["name", "medium", 3, "until", "columns", 4, "ngIf"], ["name", "wide", 3, "columns", 4, "ngIf"], ["class", "sme-focus-zone", "tabindex", "0", 3, "maxWidth", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["alignTabs", "right", 3, "headerText", "noLeftPadding", "selectionChange"], [3, "label", 4, "ngFor", "ngForOf"], [3, "label"], ["name", "narrow", 3, "until", "columns"], ["name", "medium", 3, "until", "columns"], ["name", "wide", 3, "columns"], ["tabindex", "0", 1, "sme-focus-zone", 3, "maxWidth"], [3, "message", 4, "ngIf"], [1, "sme-position-flex-none", 3, "chartLegendData", "useCustomSettings", "tooltipFormatter", "lineChartData"], [3, "message"]], template: function TabbedLineChartGroupComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, TabbedLineChartGroupComponent_sme_pivot_0_Template, 2, 3, "sme-pivot", 0); i0.ɵɵelementStart(1, "div", 1)(2, "sme-layout", 2, 3); i0.ɵɵtemplate(4, TabbedLineChartGroupComponent_sme_layout_definition_4_Template, 1, 2, "sme-layout-definition", 4); i0.ɵɵtemplate(5, TabbedLineChartGroupComponent_sme_layout_definition_5_Template, 1, 2, "sme-layout-definition", 5); i0.ɵɵtemplate(6, TabbedLineChartGroupComponent_sme_layout_definition_6_Template, 1, 1, "sme-layout-definition", 6); i0.ɵɵtemplate(7, TabbedLineChartGroupComponent_sme_layout_item_7_Template, 3, 6, "sme-layout-item", 7); i0.ɵɵelementEnd()(); } if (rf & 2) { i0.ɵɵproperty("ngIf", ctx.tabList.length > 1); i0.ɵɵadvance(1); i0.ɵɵclassProp("sme-margin-left-xxl", ctx.noLeftMargin ? 0 : null); i0.ɵɵadvance(1); i0.ɵɵproperty("itemHorizontalSpace", ctx.chartPadding)("padLastItem", true)("noExtraRightPaddingOneItemPerRow", true); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx.chartsPerRow >= 1); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.chartsPerRow >= 2); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.chartsPerRow >= 3); i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", ctx.groupData)("ngForTrackBy", ctx.trackByTitle); } }, dependencies: [i1.NgForOf, i1.NgIf, i2.LoadingWheelComponent, i3.LayoutComponent, i4.LayoutItemComponent, i5.LayoutDefinitionComponent, i6.PivotComponent, i7.PivotTabComponent, i8.LineChartComponent], encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TabbedLineChartGroupComponent, [{ type: Component, args: [{ selector: 'sme-tabbed-line-chart-group', template: "<sme-pivot *ngIf=\"tabList.length > 1\" alignTabs=\"right\" (selectionChange)=\"tabChanged($event)\" [headerText]=\"groupTitle\" [noLeftPadding]=\"true\">\r\n <sme-pivot-tab *ngFor=\"let tab of tabList\" [label]=\"tab\">\r\n <ng-template></ng-template>\r\n </sme-pivot-tab>\r\n</sme-pivot>\r\n<div class=\"sme-layout-relative sme-position-inset-none sme-padding-inset-none sme-arrange-wrapstack-h sme-arrange-overflow-auto-y sme-arrange-overflow-hide-x\"\r\n [class.sme-margin-left-xxl]=\"noLeftMargin?0:null\">\r\n <sme-layout #layout class=\"sme-position-flex-auto sme-arrange-overflow-auto\" [itemHorizontalSpace]=\"chartPadding\" [padLastItem]=\"true\" [noExtraRightPaddingOneItemPerRow]=\"true\">\r\n <sme-layout-definition *ngIf=\"chartsPerRow >= 1\" name=\"narrow\" [until]=\"chartsPerRow === 1 ? maxNumber : minChartWidth * 2 + chartPadding\"\r\n [columns]=\"1\"></sme-layout-definition>\r\n <sme-layout-definition *ngIf=\"chartsPerRow >= 2\" name=\"medium\" [until]=\"chartsPerRow === 2 ? maxNumber : minChartWidth * 3 + chartPadding\"\r\n [columns]=\"2\"></sme-layout-definition>\r\n <sme-layout-definition *ngIf=\"chartsPerRow >= 3\" name=\"wide\" [columns]=\"3\"></sme-layout-definition>\r\n <sme-layout-item *ngFor=\"let tabChartData of groupData; let i = index;trackBy: trackByTitle\" [maxWidth]=\"maxChartWidth\" class=\"sme-focus-zone\" tabindex=\"0\">\r\n <sme-loading-wheel *ngIf=\"loadingWheels && dataIsLoading(tabChartData)\" [message]=\"loadingMessage\"></sme-loading-wheel>\r\n <sme-line-chart class=\"sme-position-flex-none\" [chartLegendData]=\"chartLegendData[i]\" [useCustomSettings]=\"useCustomSettings\"\r\n [tooltipFormatter]=\"tooltipFormatters[i]\" [lineChartData]=\"getLineChartData(tabChartData)\"></sme-line-chart>\r\n </sme-layout-item>\r\n </sme-layout>\r\n</div>\r\n" }] }], function () { return [{ type: i0.Injector }, { type: i0.ChangeDetectorRef }]; }, { lineChartComponents: [{ type: ViewChildren, args: [LineChartComponent] }], groupData: [{ type: Input }], tabList: [{ type: Input }], noLeftMargin: [{ type: Input }], groupTitle: [{ type: Input }], chartsPerRow: [{ type: Input }], loadingWheels: [{ type: Input }], loadingMessage: [{ type: Input }], useCustomSettings: [{ type: Input }], chartLegendData: [{ type: Input }], tooltipFormatters: [{ type: Input }], minChartWidth: [{ type: Input }], maxChartWidth: [{ type: Input }], onTabClick: [{ type: Output }], tabClicked: [{ type: Output }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiYmVkLWxpbmUtY2hhcnQtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvbGluZS1jaGFydC90YWJiZWQtbGluZS1jaGFydC1ncm91cC90YWJiZWQtbGluZS1jaGFydC1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9saW5lLWNoYXJ0L3RhYmJlZC1saW5lLWNoYXJ0LWdyb3VwL3RhYmJlZC1saW5lLWNoYXJ0LWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBaUIsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7Ozs7O0lDZDFFLHlDQUF5RDtJQUN2RCx1SEFBMkI7SUFDN0IsaUJBQWdCOzs7SUFGMkIsOEJBQWE7Ozs7SUFEMUQsb0NBQWdKO0lBQXhGLDhNQUFtQixlQUFBLHlCQUFrQixDQUFBLElBQUM7SUFDNUYsOEdBRWdCO0lBQ2xCLGlCQUFZOzs7SUFKbUYsOENBQXlCLHVCQUFBO0lBQ3ZGLGVBQVU7SUFBVix3Q0FBVTs7O0lBT3ZDLDRDQUN3Qzs7O0lBRHVCLHFIQUEyRSxjQUFBOzs7SUFFMUksNENBQ3dDOzs7SUFEdUIscUhBQTJFLGNBQUE7OztJQUUxSSw0Q0FBbUc7O0lBQXRDLDJCQUFhOzs7SUFFeEUsd0NBQXVIOzs7SUFBL0MsZ0RBQTBCOzs7SUFEcEcsMkNBQTRKO0lBQzFKLDZIQUF1SDtJ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QjsyRkFTRSxtQkFBbUI7a0JBQTNELFlBQVk7bUJBQUMsa0JBQWtCO1lBQ2hCLFNBQVM7a0JBQXhCLEtBQUs7WUFDVSxPQUFPO2tCQUF0QixLQUFLO1lBQ1UsWUFBWTtrQkFBM0IsS0FBSztZQUNVLFVBQVU7a0JBQXpCLEtBQUs7WUFPVSxZQUFZO2tCQUEzQixLQUFLO1lBQ1UsYUFBYTtrQkFBNUIsS0FBSztZQUNVLGNBQWM7a0JBQTdCLEtBQUs7WUFDVSxpQkFBaUI7a0JBQWhDLEtBQUs7WUFDVSxlQUFlO2tCQUE5QixLQUFLO1lBS1UsaUJBQWlCO2tCQUFoQyxLQUFLO1lBTVUsYUFBYTtrQkFBNUIsS0FBSztZQU1VLGFBQWE7a0JBQTVCLEtBQUs7WUFNZSxVQUFVO2tCQUE5QixNQUFNO1lBR1UsVUFBVTtrQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBWaWV3Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMZWdlbmRFbnRyeURhdGEgfSBmcm9tICcuLi8uLi9sZWdlbmQvbGVnZW5kLWVudHJ5L2xlZ2VuZC1lbnRyeS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQaXZvdFRhYkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3Bpdm90L3Bpdm90LXRhYi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMaW5lQ2hhcnRDb21wb25lbnQsIExpbmVDaGFydERhdGEgfSBmcm9tICcuLi9saW5lLWNoYXJ0LmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLXRhYmJlZC1saW5lLWNoYXJ0LWdyb3VwJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJiZWQtbGluZS1jaGFydC1ncm91cC5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYmJlZExpbmVDaGFydEdyb3VwQ29tcG9uZW50IGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnVGFiYmVkTGluZUNoYXJ0R3JvdXBDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIEBWaWV3Q2hpbGRyZW4oTGluZUNoYXJ0Q29tcG9uZW50KSBwdWJsaWMgbGluZUNoYXJ0Q29tcG9uZW50czogUXVlcnlMaXN0PExpbmVDaGFydENvbXBvbmVudD47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZ3JvdXBEYXRhOiBNYXA8c3RyaW5nLCBMaW5lQ2hhcnREYXRhPltdO1xyXG4gICAgQElucHV0KCkgcHVibGljIHRhYkxpc3Q6IHN0cmluZ1tdO1xyXG4gICAgQElucHV0KCkgcHVibGljIG5vTGVmdE1hcmdpbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIGdyb3VwVGl0bGU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEN1cnJlbnRseSBzdXBwb3J0IDEsIDIsIGFuZCAzIGNoYXJ0cyBwZXIgcm93XHJcbiAgICAgKiBEZWZhdWx0IGlzIDMgY2hhcnRzLlxyXG4gICAgICogQ2hhcnQgbGF5b3V0IHdpbGwgc2NhbGUgYXV0b21hdGljYWxseSBhY2NvcmRpbmcgdG8gd2lkdGggb2YgcGFyZW50IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGNoYXJ0c1BlclJvdyA9IDM7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbG9hZGluZ1doZWVscz86IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbG9hZGluZ01lc3NhZ2U/OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdXNlQ3VzdG9tU2V0dGluZ3M/OiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIGNoYXJ0TGVnZW5kRGF0YTogTGVnZW5kRW50cnlEYXRhW11bXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFycmF5IG9mIGZ1bmN0aW9ucyB0byBhcHBseSB0byBlYWNoIGNoYXJ0IGluIHR1cm4uIEZ1bmN0aW9ucyB3aWxsIG1vZGlmeSB0b29sdGlwIGRhdGEgdmFsdWUgZm9yIHByZXR0eSBwcmludGluZ1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdG9vbHRpcEZvcm1hdHRlcnM/OiBGdW5jdGlvbltdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1pbmltdW0gY2hhcnQgd2lkdGggeW91IHdhbnQgdG8gYWxsb3cgZm9yIHNjYWxpbmcgcHVycG9zZXMsXHJcbiAgICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGlzIDQyMFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluQ2hhcnRXaWR0aCA9IDQyMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXggY2hhcnQgd2lkdGggeW91IHdhbnQgdG8gYWxsb3cgZm9yIHNjYWxpbmcgcHVycG9zZXMuXHJcbiAgICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGlzIDg0MFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4Q2hhcnRXaWR0aCA9IDg0MDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAndGFiQ2xpY2tlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uVGFiQ2xpY2soKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGFiQ2xpY2tlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgdGFiQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICAgIHB1YmxpYyB0YWJHcm91cFdpZHRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgc2VsZWN0ZWRUYWI6IHN0cmluZztcclxuICAgIHB1YmxpYyBtYXhOdW1iZXIgPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgcHVibGljIGNoYXJ0UGFkZGluZyA9IDQwO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5jaGFydExlZ2VuZERhdGEgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFiTGlzdCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gTXNmdFNtZS5maXJzdCh0aGlzLnRhYkxpc3QpO1xyXG5cclxuICAgICAgICAgICAgLy8gdG9vbHRpcCBmb3JtYXR0aW5nIGZ1bmN0aW9uc1xyXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXBGb3JtYXR0ZXJzID0gdGhpcy50b29sdGlwRm9ybWF0dGVycyA/IHRoaXMudG9vbHRpcEZvcm1hdHRlcnMgOiBbXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ncm91cERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy50b29sdGlwRm9ybWF0dGVyc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIGZvcm1hdHRpbmcgZnVuY2lvbiBpcyBzdXBwbGllZCwgdGhlbiBudWxsIGVuc3VyZXMgdGhlIGRhdGEgd2lsbCBub3QgYmUgZm9ybWF0dGVkXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwRm9ybWF0dGVyc1tpXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhYkxpc3QgaW5wdXQgaXMgcmVxdWlyZWQgdG8gcmVuZGVyIHRhYmJlZCBsaW5lIGNoYXJ0IGdyb3VwJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHNlbGVjdGVkIHRhYiBhbmQgZW1pdCB0aGlzIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0YWJDaGFuZ2VkKHRhYjogUGl2b3RUYWJDb21wb25lbnQpIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudGFiTGlzdC5pbmRleE9mKHRhYi5sYWJlbCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9IHRhYi5sYWJlbDtcclxuICAgICAgICB0aGlzLnRhYkNsaWNrZWQuZW1pdChpbmRleCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWZyZXNoIGFsbCBvZiB0aGUgY2hhcnRzIHdoZW4gbmV3IGRhdGEgaXMgYWRkZWQgdG8gbGluZUNoYXJ0RGF0YSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVmcmVzaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hhbmdlRGV0ZWN0b3JSZWZbJ2Rlc3Ryb3llZCddKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5saW5lQ2hhcnRDb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGluZUNoYXJ0Q29tcG9uZW50cy5mb3JFYWNoKGxpbmVDaGFydCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsaW5lQ2hhcnQucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMudGFiTGlzdC5maXJzdCh4ID0+IHggPT09IHRoaXMuc2VsZWN0ZWRUYWIpKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gTXNmdFNtZS5maXJzdCh0aGlzLnRhYkxpc3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBsaW5lIGNoYXJ0IGRhdGEgZm9yIHNlbGVjdGVkIHRhYlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TGluZUNoYXJ0RGF0YSh0YWJDaGFydERhdGE6IGFueSk6IExpbmVDaGFydERhdGEge1xyXG4gICAgICAgIHJldHVybiB0YWJDaGFydERhdGEuZ2V0KHRoaXMuc2VsZWN0ZWRUYWIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgdGl0bGUgb2YgdGhlIGN1cnJlbnQgY2hhcnQgdG8gdHJhY2sgYWRuIHJldXNlICB0aGUgY2hhcnQgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtXHJcbiAgICAgKiBAcGFyYW0gaXRlbSB0aGUgaXRlbVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhY2tCeVRpdGxlKGluZGV4LCBpdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWIgPyBpdGVtLmdldCh0aGlzLnNlbGVjdGVkVGFiKS50aXRsZSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgd2hldGhlciB0aGUgTGluZUNoYXJ0RGF0YS5pc0xvYWRpbmcgZm9yIHRoYXQgdGFiIGlzIHNldCB0byAgdHJ1ZSBvciBmYWxzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGF0YUlzTG9hZGluZyh0YWJDaGFydERhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldExpbmVDaGFydERhdGEodGFiQ2hhcnREYXRhKS5pc0xvYWRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0YWNoKCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPHNtZS1waXZvdCAqbmdJZj1cInRhYkxpc3QubGVuZ3RoID4gMVwiIGFsaWduVGFicz1cInJpZ2h0XCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJ0YWJDaGFuZ2VkKCRldmVudClcIiBbaGVhZGVyVGV4dF09XCJncm91cFRpdGxlXCIgW25vTGVmdFBhZGRpbmddPVwidHJ1ZVwiPlxyXG4gIDxzbWUtcGl2b3QtdGFiICpuZ0Zvcj1cImxldCB0YWIgb2YgdGFiTGlzdFwiIFtsYWJlbF09XCJ0YWJcIj5cclxuICAgIDxuZy10ZW1wbGF0ZT48L25nLXRlbXBsYXRlPlxyXG4gIDwvc21lLXBpdm90LXRhYj5cclxuPC9zbWUtcGl2b3Q+XHJcbjxkaXYgY2xhc3M9XCJzbWUtbGF5b3V0LXJlbGF0aXZlIHNtZS1wb3NpdGlvbi1pbnNldC1ub25lIHNtZS1wYWRkaW5nLWluc2V0LW5vbmUgc21lLWFycmFuZ2Utd3JhcHN0YWNrLWggc21lLWFycmFuZ2Utb3ZlcmZsb3ctYXV0by15IHNtZS1hcnJhbmdlLW92ZXJmbG93LWhpZGUteFwiXHJcbiAgICBbY2xhc3Muc21lLW1hcmdpbi1sZWZ0LXh4bF09XCJub0xlZnRNYXJnaW4/MDpudWxsXCI+XHJcbiAgPHNtZS1sYXlvdXQgI2xheW91dCBjbGFzcz1cInNtZS1wb3NpdGlvbi1mbGV4LWF1dG8gc21lLWFycmFuZ2Utb3ZlcmZsb3ctYXV0b1wiIFtpdGVtSG9yaXpvbnRhbFNwYWNlXT1cImNoYXJ0UGFkZGluZ1wiIFtwYWRMYXN0SXRlbV09XCJ0cnVlXCIgW25vRXh0cmFSaWdodFBhZGRpbmdPbmVJdGVtUGVyUm93XT1cInRydWVcIj5cclxuICAgIDxzbWUtbGF5b3V0LWRlZmluaXRpb24gKm5nSWY9XCJjaGFydHNQZXJSb3cgPj0gMVwiIG5hbWU9XCJuYXJyb3dcIiBbdW50aWxdPVwiY2hhcnRzUGVyUm93ID09PSAxID8gbWF4TnVtYmVyIDogbWluQ2hhcnRXaWR0aCAqIDIgKyBjaGFydFBhZGRpbmdcIlxyXG4gICAgICBbY29sdW1uc109XCIxXCI+PC9zbWUtbGF5b3V0LWRlZmluaXRpb24+XHJcbiAgICA8c21lLWxheW91dC1kZWZpbml0aW9uICpuZ0lmPVwiY2hhcnRzUGVyUm93ID49IDJcIiBuYW1lPVwibWVkaXVtXCIgW3VudGlsXT1cImNoYXJ0c1BlclJvdyA9PT0gMiA/IG1heE51bWJlciA6IG1pbkNoYXJ0V2lkdGggKiAzICsgY2hhcnRQYWRkaW5nXCJcclxuICAgICAgW2NvbHVtbnNdPVwiMlwiPjwvc21lLWxheW91dC1kZWZpbml0aW9uPlxyXG4gICAgPHNtZS1sYXlvdXQtZGVmaW5pdGlvbiAqbmdJZj1cImNoYXJ0c1BlclJvdyA+PSAzXCIgbmFtZT1cIndpZGVcIiBbY29sdW1uc109XCIzXCI+PC9zbWUtbGF5b3V0LWRlZmluaXRpb24+XHJcbiAgICA8c21lLWxheW91dC1pdGVtICpuZ0Zvcj1cImxldCB0YWJDaGFydERhdGEgb2YgZ3JvdXBEYXRhOyBsZXQgaSA9IGluZGV4O3RyYWNrQnk6IHRyYWNrQnlUaXRsZVwiIFttYXhXaWR0aF09XCJtYXhDaGFydFdpZHRoXCIgY2xhc3M9XCJzbWUtZm9jdXMtem9uZVwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICA8c21lLWxvYWRpbmctd2hlZWwgKm5nSWY9XCJsb2FkaW5nV2hlZWxzICYmIGRhdGFJc0xvYWRpbmcodGFiQ2hhcnREYXRhKVwiIFttZXNzYWdlXT1cImxvYWRpbmdNZXNzYWdlXCI+PC9zbWUtbG9hZGluZy13aGVlbD5cclxuICAgICAgICA8c21lLWxpbmUtY2hhcnQgY2xhc3M9XCJzbWUtcG9zaXRpb24tZmxleC1ub25lXCIgW2NoYXJ0TGVnZW5kRGF0YV09XCJjaGFydExlZ2VuZERhdGFbaV1cIiBbdXNlQ3VzdG9tU2V0dGluZ3NdPVwidXNlQ3VzdG9tU2V0dGluZ3NcIlxyXG4gICAgICAgICAgW3Rvb2x0aXBGb3JtYXR0ZXJdPVwidG9vbHRpcEZvcm1hdHRlcnNbaV1cIiBbbGluZUNoYXJ0RGF0YV09XCJnZXRMaW5lQ2hhcnREYXRhKHRhYkNoYXJ0RGF0YSlcIj48L3NtZS1saW5lLWNoYXJ0PlxyXG4gICAgPC9zbWUtbGF5b3V0LWl0ZW0+XHJcbiAgPC9zbWUtbGF5b3V0PlxyXG48L2Rpdj5cclxuIl19