@alauda-fe/common
Version:
Alauda frontend team common codes.
155 lines • 24 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core';
import { Observable, merge, map, tap } from 'rxjs';
import { ObservableInput, publishRef } from '../../../core/public-api';
import { ContextChartService } from '../../chart.service';
import { Orientation } from '../../types';
import * as i0 from "@angular/core";
import * as i1 from "../../chart.service";
const _c0 = ["aclBarPath", ""];
function BarPathComponent__svg_ng_container_1__svg_rect_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelement(0, "rect", 3);
i0.ɵɵpipe(1, "pure");
i0.ɵɵpipe(2, "pure");
i0.ɵɵpipe(3, "pure");
i0.ɵɵpipe(4, "pure");
i0.ɵɵpipe(5, "pure");
} if (rf & 2) {
const item_r1 = ctx.$implicit;
const i_r2 = ctx.index;
const ctx_r2 = i0.ɵɵnextContext(2);
i0.ɵɵattribute("width", ctx_r2.innerBandWidth)("x", i0.ɵɵpipeBind2(1, 6, item_r1.x, ctx_r2.getRectX) || 0)("y", i0.ɵɵpipeBind3(2, 9, i_r2, ctx_r2.getRectY, item_r1.y) || 0)("height", item_r1.y ? i0.ɵɵpipeBind2(3, 13, 0, ctx_r2.context.y) - i0.ɵɵpipeBind2(4, 16, item_r1.y, ctx_r2.context.y) : 0)("fill", item_r1.color)("opacity", i0.ɵɵpipeBind3(5, 19, item_r1.x, ctx_r2.handleOpacity, ctx_r2.activateLegend));
} }
function BarPathComponent__svg_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, BarPathComponent__svg_ng_container_1__svg_rect_1_Template, 6, 23, "rect", 2);
i0.ɵɵpipe(2, "async");
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵadvance();
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, ctx_r2.barData$));
} }
function BarPathComponent__svg_ng_template_2__svg_rect_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelement(0, "rect", 3);
i0.ɵɵpipe(1, "pure");
i0.ɵɵpipe(2, "pure");
i0.ɵɵpipe(3, "pure");
i0.ɵɵpipe(4, "pure");
} if (rf & 2) {
const item_r4 = ctx.$implicit;
const i_r5 = ctx.index;
const ctx_r2 = i0.ɵɵnextContext(2);
i0.ɵɵattribute("height", ctx_r2.innerBandWidth)("y", i0.ɵɵpipeBind2(1, 6, item_r4.x, ctx_r2.getRectX) || 0)("x", i0.ɵɵpipeBind2(2, 9, i_r5, ctx_r2.getStackedRectY) || 0)("width", item_r4.y ? i0.ɵɵpipeBind2(3, 12, item_r4.y, ctx_r2.context.y) : 0)("fill", item_r4.color)("opacity", i0.ɵɵpipeBind3(4, 15, item_r4.x, ctx_r2.handleOpacity, ctx_r2.activateLegend));
} }
function BarPathComponent__svg_ng_template_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, BarPathComponent__svg_ng_template_2__svg_rect_0_Template, 5, 19, "rect", 2);
i0.ɵɵpipe(1, "async");
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(1, 1, ctx_r2.barData$));
} }
export class BarPathComponent {
get isStacked() {
return this.type === 'stacked';
}
get innerBandWidth() {
return ((this.adaptiveBandWidth
? this.isStacked
? this.context.x.bandwidth()
: this.context.barInnerScale(this.barPadding).bandwidth()
: this.bandWidth) || 0);
}
constructor(context, cdr) {
this.context = context;
this.cdr = cdr;
this.barPadding = 8;
this.type = 'standard';
this.orientation = Orientation;
this.preValue = 0;
this.barData = [];
this.barData$ = merge(this.data$, this.context.legendChange$$, this.context.seriesData$).pipe(map(() => {
this.preValue = 0;
return this.data
.map((item, index) => ({
...item,
color: item.color || this.context.getChartDefaultColor(index),
}))
.filter(item => !this.context.disabledLegend.has(item.x));
}), tap(res => {
this.barData = res;
}), publishRef());
this.getRectX = (x) => this.isStacked
? 0
: this.context.barInnerScale(this.barPadding)(x);
this.getRectY = (index, y) => {
if (!this.isStacked) {
return this.context.y(y);
}
const previous = this.context.y(this.barData[index - 1 > 0 ? index - 1 : 0].y);
const diffH = Math.abs(this.context.y(0) - this.context.y(y));
const res = index === 0 ? previous : this.preValue - diffH;
this.preValue = res;
return res;
};
this.getStackedRectY = (index) => {
if (!this.isStacked) {
return 0;
}
const previous = this.context.y(this.barData[index - 1 > 0 ? index - 1 : 0].y);
const diffH = Math.abs(this.context.y(0) - previous);
const res = index === 0 ? 0 : index === 1 ? previous : this.preValue + diffH;
this.preValue = res;
return res;
};
this.handleVisibility = (name) => this.context.disabledLegend.has(name) ? 'hidden' : '';
this.handleOpacity = (name, activateLegend) => activateLegend ? (activateLegend === name ? 1 : 0.2) : 1;
}
ngOnInit() {
this.context.legendActivate$$.subscribe(legend => {
this.activateLegend = legend;
this.cdr.detectChanges();
});
this.context.update$$.subscribe(() => {
this.cdr.detectChanges();
});
}
static { this.ɵfac = function BarPathComponent_Factory(t) { return new (t || BarPathComponent)(i0.ɵɵdirectiveInject(i1.ContextChartService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: BarPathComponent, selectors: [["g", "aclBarPath", ""]], inputs: { stroke: "stroke", data: "data", barPadding: "barPadding", groupName: "groupName", type: "type", bandWidth: "bandWidth", adaptiveBandWidth: "adaptiveBandWidth" }, attrs: _c0, decls: 4, vars: 2, consts: [["elseTemplate", ""], [4, "ngIf", "ngIfElse"], ["class", "rect", 4, "ngFor", "ngForOf"], [1, "rect"]], template: function BarPathComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(0, "g");
i0.ɵɵtemplate(1, BarPathComponent__svg_ng_container_1_Template, 3, 3, "ng-container", 1)(2, BarPathComponent__svg_ng_template_2_Template, 2, 3, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
i0.ɵɵelementEnd();
} if (rf & 2) {
const elseTemplate_r6 = i0.ɵɵreference(3);
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", ctx.context.barOptions.orientation === ctx.orientation.VERTICAL)("ngIfElse", elseTemplate_r6);
} }, styles: [".tooltipClass{pointer-events:none;max-width:800px!important}.tooltip-content[_ngcontent-%COMP%]{color:rgb(var(--aui-color-n-6))}.tooltip-content[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{margin-bottom:8px}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] ul[_ngcontent-%COMP%], .tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{padding:0;margin:0;list-style:none}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]:not(:last-child), .tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:not(:last-child){margin-bottom:6px}.tooltip-content[_ngcontent-%COMP%] .context-list[_ngcontent-%COMP%]{display:flex;flex-direction:column}.tooltip-content[_ngcontent-%COMP%] .context-list[_ngcontent-%COMP%] .active[_ngcontent-%COMP%]{color:rgb(var(--aui-color-n-10))}.tooltip-content[_ngcontent-%COMP%] .context-item[_ngcontent-%COMP%]{display:flex}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] .left[_ngcontent-%COMP%]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] .right[_ngcontent-%COMP%]{text-align:right;white-space:nowrap}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] .column-layout[_ngcontent-%COMP%] .right[_ngcontent-%COMP%]{flex:1 1 auto;text-align:right}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] .column-layout[_ngcontent-%COMP%] .left[_ngcontent-%COMP%]{margin-right:8px}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] .item-icon[_ngcontent-%COMP%]{margin-right:4px;width:6px;border-radius:50%;height:6px;background-color:rgb(var(--aui-color-n-10));display:inline-block;font-size:6px}"], changeDetection: 0 }); }
}
__decorate([
ObservableInput(true, []),
__metadata("design:type", Observable)
], BarPathComponent.prototype, "data$", void 0);
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BarPathComponent, [{
type: Component,
args: [{ selector: 'g[aclBarPath]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<svg:g>\n <ng-container\n *ngIf=\"\n context.barOptions.orientation === orientation.VERTICAL;\n else elseTemplate\n \"\n >\n <rect\n *ngFor=\"let item of barData$ | async; let i = index\"\n class=\"rect\"\n [attr.width]=\"innerBandWidth\"\n [attr.x]=\"(item.x | pure: getRectX) || 0\"\n [attr.y]=\"(i | pure: getRectY:item.y) || 0\"\n [attr.height]=\"\n item.y ? (0 | pure: context.y) - (item.y | pure: context.y) : 0\n \"\n [attr.fill]=\"item.color\"\n [attr.opacity]=\"item.x | pure: handleOpacity:activateLegend\"\n ></rect>\n </ng-container>\n <ng-template #elseTemplate>\n <rect\n *ngFor=\"let item of barData$ | async; let i = index\"\n class=\"rect\"\n [attr.height]=\"innerBandWidth\"\n [attr.y]=\"(item.x | pure: getRectX) || 0\"\n [attr.x]=\"(i | pure: getStackedRectY) || 0\"\n [attr.width]=\"item.y ? (item.y | pure: context.y) : 0\"\n [attr.fill]=\"item.color\"\n [attr.opacity]=\"item.x | pure: handleOpacity:activateLegend\"\n ></rect>\n </ng-template>\n</svg:g>\n", styles: ["::ng-deep .tooltipClass{pointer-events:none;max-width:800px!important}.tooltip-content{color:rgb(var(--aui-color-n-6))}.tooltip-content .title{margin-bottom:8px}.tooltip-content .context ul,.tooltip-content .context li{padding:0;margin:0;list-style:none}.tooltip-content .context ul:not(:last-child),.tooltip-content .context li:not(:last-child){margin-bottom:6px}.tooltip-content .context-list{display:flex;flex-direction:column}.tooltip-content .context-list .active{color:rgb(var(--aui-color-n-10))}.tooltip-content .context-item{display:flex}.tooltip-content .context .left{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tooltip-content .context .right{text-align:right;white-space:nowrap}.tooltip-content .context .column-layout .right{flex:1 1 auto;text-align:right}.tooltip-content .context .column-layout .left{margin-right:8px}.tooltip-content .context .item-icon{margin-right:4px;width:6px;border-radius:50%;height:6px;background-color:rgb(var(--aui-color-n-10));display:inline-block;font-size:6px}\n"] }]
}], () => [{ type: i1.ContextChartService }, { type: i0.ChangeDetectorRef }], { stroke: [{
type: Input
}], data: [{
type: Input
}], data$: [], barPadding: [{
type: Input
}], groupName: [{
type: Input
}], type: [{
type: Input
}], bandWidth: [{
type: Input
}], adaptiveBandWidth: [{
type: Input
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(BarPathComponent, { className: "BarPathComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLXBhdGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NoYXJ0L2NvbW1vbi9zZXJpZXMvYmFyLXBhdGguY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NoYXJ0L2NvbW1vbi9zZXJpZXMvYmFyLXBhdGguY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEdBRU4sTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7OztJQ050QywwQkFXUTs7Ozs7Ozs7Ozs7Ozs7SUFqQlYsNkJBS0M7SUFDQyw2RkFXQzs7Ozs7SUFWa0IsY0FBcUI7SUFBckIsK0RBQXFCOzs7O0lBYXhDLDBCQVNROzs7Ozs7Ozs7Ozs7SUFUUiw0RkFTQzs7OztJQVJrQiwrREFBcUI7O0FEQTVDLE1BQU0sT0FBTyxnQkFBZ0I7SUF5QjNCLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUM7SUFDakMsQ0FBQztJQXNCRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxDQUNMLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtZQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVM7Z0JBQ2QsQ0FBQyxDQUFxQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUUs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SUFPSixRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7WUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7aUZBN0VVLGdCQUFnQjtvRUFBaEIsZ0JBQWdCOztZQ3RCN0IseUJBQU87WUFvQkwsQUFuQkEsd0ZBS0MsMEdBYzBCO1lBWTdCLGlCQUFROzs7WUE5QkgsY0FFUTtZQUFBLEFBRlIsc0ZBRVEsNkJBRWI7OztBRHFCRTtJQURDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDOzhCQUNsQixVQUFVOytDQUVoQjtpRkFQUyxnQkFBZ0I7Y0FQNUIsU0FBUzsyQkFFRSxlQUFlLG1CQUdSLHVCQUF1QixDQUFDLE1BQU07b0ZBR3RDLE1BQU07a0JBQWQsS0FBSztZQUNHLElBQUk7a0JBQVosS0FBSztZQUdOLEtBQUssTUFJSSxVQUFVO2tCQUFsQixLQUFLO1lBRUcsU0FBUztrQkFBakIsS0FBSztZQUVHLElBQUk7a0JBQVosS0FBSztZQUVHLFNBQVM7a0JBQWpCLEtBQUs7WUFFRyxpQkFBaUI7a0JBQXpCLEtBQUs7O2tGQWpCSyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY2FsZUJhbmQgfSBmcm9tICdkMyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtZXJnZSwgbWFwLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZUlucHV0LCBwdWJsaXNoUmVmIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IENoYXJ0RGF0YUl0ZW0gfSBmcm9tICcuLi8uLi8uLi92aWV3LWNoYXJ0L3R5cGVzJztcbmltcG9ydCB7IENvbnRleHRDaGFydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7IE9yaWVudGF0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdnW2FjbEJhclBhdGhdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhci1wYXRoLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQmFyUGF0aENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHN0cm9rZTogc3RyaW5nO1xuICBASW5wdXQoKSBkYXRhOiBBcnJheTxDaGFydERhdGFJdGVtPHsgeDogc3RyaW5nOyB5OiBudW1iZXI7IGNvbG9yPzogc3RyaW5nIH0+PjtcblxuICBAT2JzZXJ2YWJsZUlucHV0KHRydWUsIFtdKVxuICBkYXRhJCE6IE9ic2VydmFibGU8XG4gICAgQXJyYXk8Q2hhcnREYXRhSXRlbTx7IHg6IHN0cmluZzsgeTogbnVtYmVyOyBjb2xvcj86IHN0cmluZyB9Pj5cbiAgPjtcblxuICBASW5wdXQoKSBiYXJQYWRkaW5nID0gODtcblxuICBASW5wdXQoKSBncm91cE5hbWU6IHN0cmluZztcblxuICBASW5wdXQoKSB0eXBlOiAnc3RhbmRhcmQnIHwgJ3N0YWNrZWQnID0gJ3N0YW5kYXJkJztcblxuICBASW5wdXQoKSBiYW5kV2lkdGg6IG51bWJlcjtcblxuICBASW5wdXQoKSBhZGFwdGl2ZUJhbmRXaWR0aDogYm9vbGVhbjtcblxuICBwYXRoOiBzdHJpbmc7XG4gIG9yaWVudGF0aW9uID0gT3JpZW50YXRpb247XG4gIHByZVZhbHVlID0gMDtcbiAgYmFyRGF0YTogQ2hhcnREYXRhSXRlbVtdID0gW107XG4gIGFjdGl2YXRlTGVnZW5kOiBzdHJpbmc7XG5cbiAgZ2V0IGlzU3RhY2tlZCgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnc3RhY2tlZCc7XG4gIH1cblxuICBiYXJEYXRhJCA9IG1lcmdlKFxuICAgIHRoaXMuZGF0YSQsXG4gICAgdGhpcy5jb250ZXh0LmxlZ2VuZENoYW5nZSQkLFxuICAgIHRoaXMuY29udGV4dC5zZXJpZXNEYXRhJCxcbiAgKS5waXBlKFxuICAgIG1hcCgoKSA9PiB7XG4gICAgICB0aGlzLnByZVZhbHVlID0gMDtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFcbiAgICAgICAgLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBjb2xvcjogaXRlbS5jb2xvciB8fCB0aGlzLmNvbnRleHQuZ2V0Q2hhcnREZWZhdWx0Q29sb3IoaW5kZXgpLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcihpdGVtID0+ICF0aGlzLmNvbnRleHQuZGlzYWJsZWRMZWdlbmQuaGFzKGl0ZW0ueCBhcyBzdHJpbmcpKTtcbiAgICB9KSxcbiAgICB0YXAocmVzID0+IHtcbiAgICAgIHRoaXMuYmFyRGF0YSA9IHJlcztcbiAgICB9KSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgZ2V0IGlubmVyQmFuZFdpZHRoKCkge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy5hZGFwdGl2ZUJhbmRXaWR0aFxuICAgICAgICA/IHRoaXMuaXNTdGFja2VkXG4gICAgICAgICAgPyAoPFNjYWxlQmFuZDxzdHJpbmc+PnRoaXMuY29udGV4dC54KS5iYW5kd2lkdGgoKVxuICAgICAgICAgIDogdGhpcy5jb250ZXh0LmJhcklubmVyU2NhbGUodGhpcy5iYXJQYWRkaW5nKS5iYW5kd2lkdGgoKVxuICAgICAgICA6IHRoaXMuYmFuZFdpZHRoKSB8fCAwXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjb250ZXh0OiBDb250ZXh0Q2hhcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIGdldFJlY3RYID0gKHg6IHN0cmluZyB8IG51bWJlciB8IERhdGUpID0+XG4gICAgdGhpcy5pc1N0YWNrZWRcbiAgICAgID8gMFxuICAgICAgOiB0aGlzLmNvbnRleHQuYmFySW5uZXJTY2FsZSh0aGlzLmJhclBhZGRpbmcpKHggYXMgc3RyaW5nKTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbnRleHQubGVnZW5kQWN0aXZhdGUkJC5zdWJzY3JpYmUobGVnZW5kID0+IHtcbiAgICAgIHRoaXMuYWN0aXZhdGVMZWdlbmQgPSBsZWdlbmQ7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jb250ZXh0LnVwZGF0ZSQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRSZWN0WSA9IChpbmRleDogbnVtYmVyLCB5OiBudW1iZXIpID0+IHtcbiAgICBpZiAoIXRoaXMuaXNTdGFja2VkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnkoeSk7XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5jb250ZXh0LnkoXG4gICAgICB0aGlzLmJhckRhdGFbaW5kZXggLSAxID4gMCA/IGluZGV4IC0gMSA6IDBdLnksXG4gICAgKTtcbiAgICBjb25zdCBkaWZmSCA9IE1hdGguYWJzKHRoaXMuY29udGV4dC55KDApIC0gdGhpcy5jb250ZXh0LnkoeSkpO1xuICAgIGNvbnN0IHJlcyA9IGluZGV4ID09PSAwID8gcHJldmlvdXMgOiB0aGlzLnByZVZhbHVlIC0gZGlmZkg7XG4gICAgdGhpcy5wcmVWYWx1ZSA9IHJlcztcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIGdldFN0YWNrZWRSZWN0WSA9IChpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzU3RhY2tlZCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5jb250ZXh0LnkoXG4gICAgICB0aGlzLmJhckRhdGFbaW5kZXggLSAxID4gMCA/IGluZGV4IC0gMSA6IDBdLnksXG4gICAgKTtcbiAgICBjb25zdCBkaWZmSCA9IE1hdGguYWJzKHRoaXMuY29udGV4dC55KDApIC0gcHJldmlvdXMpO1xuICAgIGNvbnN0IHJlcyA9XG4gICAgICBpbmRleCA9PT0gMCA/IDAgOiBpbmRleCA9PT0gMSA/IHByZXZpb3VzIDogdGhpcy5wcmVWYWx1ZSArIGRpZmZIO1xuICAgIHRoaXMucHJlVmFsdWUgPSByZXM7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBoYW5kbGVWaXNpYmlsaXR5ID0gKG5hbWU6IHN0cmluZykgPT5cbiAgICB0aGlzLmNvbnRleHQuZGlzYWJsZWRMZWdlbmQuaGFzKG5hbWUpID8gJ2hpZGRlbicgOiAnJztcblxuICBoYW5kbGVPcGFjaXR5ID0gKG5hbWU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIGFjdGl2YXRlTGVnZW5kOiBzdHJpbmcpID0+XG4gICAgYWN0aXZhdGVMZWdlbmQgPyAoYWN0aXZhdGVMZWdlbmQgPT09IG5hbWUgPyAxIDogMC4yKSA6IDE7XG59XG4iLCI8c3ZnOmc+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cIlxuICAgICAgY29udGV4dC5iYXJPcHRpb25zLm9yaWVudGF0aW9uID09PSBvcmllbnRhdGlvbi5WRVJUSUNBTDtcbiAgICAgIGVsc2UgZWxzZVRlbXBsYXRlXG4gICAgXCJcbiAgPlxuICAgIDxyZWN0XG4gICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBiYXJEYXRhJCB8IGFzeW5jOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgIGNsYXNzPVwicmVjdFwiXG4gICAgICBbYXR0ci53aWR0aF09XCJpbm5lckJhbmRXaWR0aFwiXG4gICAgICBbYXR0ci54XT1cIihpdGVtLnggfCBwdXJlOiBnZXRSZWN0WCkgfHwgMFwiXG4gICAgICBbYXR0ci55XT1cIihpIHwgcHVyZTogZ2V0UmVjdFk6aXRlbS55KSB8fCAwXCJcbiAgICAgIFthdHRyLmhlaWdodF09XCJcbiAgICAgICAgaXRlbS55ID8gKDAgfCBwdXJlOiBjb250ZXh0LnkpIC0gKGl0ZW0ueSB8IHB1cmU6IGNvbnRleHQueSkgOiAwXG4gICAgICBcIlxuICAgICAgW2F0dHIuZmlsbF09XCJpdGVtLmNvbG9yXCJcbiAgICAgIFthdHRyLm9wYWNpdHldPVwiaXRlbS54IHwgcHVyZTogaGFuZGxlT3BhY2l0eTphY3RpdmF0ZUxlZ2VuZFwiXG4gICAgPjwvcmVjdD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy10ZW1wbGF0ZSAjZWxzZVRlbXBsYXRlPlxuICAgIDxyZWN0XG4gICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBiYXJEYXRhJCB8IGFzeW5jOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgIGNsYXNzPVwicmVjdFwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwiaW5uZXJCYW5kV2lkdGhcIlxuICAgICAgW2F0dHIueV09XCIoaXRlbS54IHwgcHVyZTogZ2V0UmVjdFgpIHx8IDBcIlxuICAgICAgW2F0dHIueF09XCIoaSB8IHB1cmU6IGdldFN0YWNrZWRSZWN0WSkgfHwgMFwiXG4gICAgICBbYXR0ci53aWR0aF09XCJpdGVtLnkgPyAoaXRlbS55IHwgcHVyZTogY29udGV4dC55KSA6IDBcIlxuICAgICAgW2F0dHIuZmlsbF09XCJpdGVtLmNvbG9yXCJcbiAgICAgIFthdHRyLm9wYWNpdHldPVwiaXRlbS54IHwgcHVyZTogaGFuZGxlT3BhY2l0eTphY3RpdmF0ZUxlZ2VuZFwiXG4gICAgPjwvcmVjdD5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvc3ZnOmc+XG4iXX0=