UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

212 lines (211 loc) 18.2 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core'; import dayjs from 'dayjs'; import { map } from 'rxjs'; import { ContextChartService } from '../../chart.service'; import { Orientation } from '../../types'; import { ScaleType, reduceTicks } from '../../utils'; import * as i0 from "@angular/core"; import * as i1 from "../../chart.service"; const _c0 = ["aclXAxisTicks", ""]; function XAxisTicksComponent_ng_container_0__svg_g_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(0, "g")(1, "text", 4); i0.ɵɵtext(2); i0.ɵɵpipe(3, "translate"); i0.ɵɵelementEnd(); i0.ɵɵelement(4, "line", 5); i0.ɵɵelementEnd(); } if (rf & 2) { const tick_r1 = ctx.$implicit; const i_r2 = ctx.index; const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵattribute("x", i_r2 === ctx_r2.ticks.length - 1 && tick_r1.x >= (ctx_r2.context.chartView == null ? null : ctx_r2.context.chartView.height) ? tick_r1.x - 5 : tick_r1.x)("y", tick_r1.y + 16)("text-anchor", ctx_r2.textAnchor); i0.ɵɵadvance(); i0.ɵɵtextInterpolate1(" ", ctx_r2.translation ? i0.ɵɵpipeBind1(3, 8, tick_r1.value) : tick_r1.value, " "); i0.ɵɵadvance(2); i0.ɵɵattribute("x1", tick_r1.x)("x2", tick_r1.x)("y1", tick_r1.y)("y2", tick_r1.y + 6); } } function XAxisTicksComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, XAxisTicksComponent_ng_container_0__svg_g_1_Template, 5, 10, "g", 2); i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(2, "g"); i0.ɵɵelement(3, "path", 3); i0.ɵɵelementEnd(); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵproperty("ngForOf", ctx_r2.ticks); i0.ɵɵadvance(2); i0.ɵɵattribute("d", ctx_r2.xAxisLine); } } function XAxisTicksComponent_ng_template_1__svg_g_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(0, "g")(1, "text", 6); i0.ɵɵtext(2); i0.ɵɵpipe(3, "translate"); i0.ɵɵpipe(4, "translate"); i0.ɵɵelementEnd()(); } if (rf & 2) { const tick_r4 = ctx.$implicit; const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵattribute("y", tick_r4.x); i0.ɵɵadvance(); i0.ɵɵtextInterpolate1(" ", ctx_r2.translation ? i0.ɵɵpipeBind1(4, 4, i0.ɵɵpipeBind1(3, 2, tick_r4.value)) : tick_r4.value, " "); } } function XAxisTicksComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, XAxisTicksComponent_ng_template_1__svg_g_0_Template, 5, 6, "g", 2); i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(1, "g"); i0.ɵɵelement(2, "path", 3); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵproperty("ngForOf", ctx_r2.ticks); i0.ɵɵadvance(2); i0.ɵɵattribute("d", ctx_r2.yAxisLine); } } export class XAxisTicksComponent { get context() { return this.contextService; } get yAxisLine() { return `M${0} ${0}L${0} ${this.context.chartView.height}Z`; } get xAxisLine() { const { width } = this.contextService.chartView; return `M0 0L${width} 0Z`; } getTicks() { let ticks; if (this.context.scaleType === ScaleType.ORDINAL) { const maxTicks = this.getMaxTicks(20); ticks = reduceTicks(this.context.x.domain(), maxTicks).map(this.handleTicksData); } else { ticks = this.context.x .ticks(this.getMaxTicks(100)) .map(this.handleTicksData); } return ticks; } getMaxTicks(tickWidth) { const width = this.context.horizontal ? this.context.chartView.height : this.context.chartView.width; return Math.floor(width / tickWidth); } constructor(contextService, cdr) { this.contextService = contextService; this.cdr = cdr; this.textAnchor = 'middle'; this.orientation = Orientation; this.handleTicksData = (value) => { const bandwidth = this.context.barOptions.isBand ? this.context.x.bandwidth() * 0.5 : 0; return { value: this.format(value), x: this.context.x(value) + bandwidth, y: 0, }; }; } ngOnInit() { this.contextService.seriesData$ .pipe(map(() => this.getTicks())) .subscribe(res => { this.ticks = res; this.cdr.detectChanges(); }); } format(value) { return this.contextService.scaleType === ScaleType.TIME ? dayjs(value).format(this.dateFormat) : value; } static { this.ɵfac = function XAxisTicksComponent_Factory(t) { return new (t || XAxisTicksComponent)(i0.ɵɵdirectiveInject(i1.ContextChartService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: XAxisTicksComponent, selectors: [["g", "aclXAxisTicks", ""]], inputs: { dateFormat: "dateFormat", translation: "translation" }, attrs: _c0, decls: 3, vars: 2, consts: [["elseTemplate", ""], [4, "ngIf", "ngIfElse"], [4, "ngFor", "ngForOf"], ["stroke", "#ccd6eb", "fill", "none"], ["fill", "#666", "font-size", "11"], ["stroke-width", "1", "stroke", "#ccd6eb"], ["x", "-8", "fill", "#666", "text-anchor", "end", "font-size", "11", "alignment-baseline", "middle"]], template: function XAxisTicksComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, XAxisTicksComponent_ng_container_0_Template, 4, 2, "ng-container", 1)(1, XAxisTicksComponent_ng_template_1_Template, 3, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor); } if (rf & 2) { const elseTemplate_r5 = i0.ɵɵreference(2); i0.ɵɵproperty("ngIf", ctx.context.barOptions.orientation === ctx.orientation.VERTICAL)("ngIfElse", elseTemplate_r5); } }, encapsulation: 2, changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(XAxisTicksComponent, [{ type: Component, args: [{ // eslint-disable-next-line @angular-eslint/component-selector selector: 'g[aclXAxisTicks]', template: ` <ng-container *ngIf=" context.barOptions.orientation === orientation.VERTICAL; else elseTemplate " > <svg:g *ngFor="let tick of ticks; let i = index"> <text [attr.x]=" i === ticks.length - 1 && tick.x >= context.chartView?.height ? tick.x - 5 : tick.x " [attr.y]="tick.y + 16" fill="#666" [attr.text-anchor]="textAnchor" font-size="11" > {{ translation ? (tick.value | translate) : tick.value }} </text> <line [attr.x1]="tick.x" [attr.x2]="tick.x" [attr.y1]="tick.y" [attr.y2]="tick.y + 6" stroke-width="1" stroke="#ccd6eb" ></line> </svg:g> <svg:g> <path [attr.d]="xAxisLine" stroke="#ccd6eb" fill="none" /> </svg:g> </ng-container> <ng-template #elseTemplate> <svg:g *ngFor="let tick of ticks; let i = index"> <text x="-8" [attr.y]="tick.x" fill="#666" text-anchor="end" font-size="11" alignment-baseline="middle" > {{ translation ? (tick.value | translate | translate) : tick.value }} </text> </svg:g> <svg:g> <path [attr.d]="yAxisLine" stroke="#ccd6eb" fill="none" /> </svg:g> </ng-template> `, changeDetection: ChangeDetectionStrategy.OnPush, }] }], () => [{ type: i1.ContextChartService }, { type: i0.ChangeDetectorRef }], { dateFormat: [{ type: Input }], translation: [{ type: Input }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(XAxisTicksComponent, { className: "XAxisTicksComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieC1heGlzLXRpY2tzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jaGFydC9jb21tb24vYXhpcy94LWF4aXMtdGlja3MuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEdBRU4sTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBbUIsTUFBTSxhQUFhLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7OztJQWE3QyxBQURGLHlCQUFpRCxjQVc5QztJQUNDLFlBQ0Y7O0lBQUEsaUJBQU87SUFDUCwwQkFPUTtJQUNWLGlCQUFROzs7OztJQXBCSixjQUlDOztJQU1ELGNBQ0Y7SUFERSx5R0FDRjtJQUVFLGVBQWtCOzs7O0lBckJ4Qiw2QkFLQztJQUNDLHFGQUFpRDs7SUF1QmpELHlCQUFPO0lBQ0wsMEJBSUU7SUFDSixpQkFBUTs7OztJQTdCZ0IsY0FBVTtJQUFWLHNDQUFVO0lBeUI5QixlQUFvQjs7Ozs7SUFTdEIsQUFERix5QkFBaUQsY0FROUM7SUFDQyxZQUNGOzs7SUFDRixBQURFLGlCQUFPLEVBQ0Q7Ozs7SUFSSixjQUFpQjs7SUFNakIsY0FDRjtJQURFLCtIQUNGOzs7SUFWRixtRkFBaUQ7O0lBWWpELHlCQUFPO0lBQ0wsMEJBSUU7SUFDSixpQkFBUTs7O0lBbEJnQixzQ0FBVTtJQWM5QixlQUFvQjs7O0FBUzlCLE1BQU0sT0FBTyxtQkFBbUI7SUFPOUIsSUFB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QyxTQUFTLEtBQUssU0FBUyxDQUFDLElBQUk7WUFDckQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN0QyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1osQ0FBQztvRkF4RVUsbUJBQW1CO29FQUFuQixtQkFBbUI7WUF4QjVCLEFBdENBLHNGQUtDLHdHQWlDMEI7OztZQW5DZCxBQUZWLHNGQUVVLDZCQUVqQjs7O2lGQXlEYSxtQkFBbUI7Y0FsRS9CLFNBQVM7ZUFBQztnQkFDVCw4REFBOEQ7Z0JBQzlELFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNERUO2dCQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEO29GQUVVLFVBQVU7a0JBQWxCLEtBQUs7WUFFRyxXQUFXO2tCQUFuQixLQUFLOztrRkFISyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY2FsZVBvaW50LCBTY2FsZVRpbWUgfSBmcm9tICdkMyc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENvbnRleHRDaGFydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7IE9yaWVudGF0aW9uLCBUaWNrLCBUaWNrVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBTY2FsZVR5cGUsIHJlZHVjZVRpY2tzIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdnW2FjbFhBeGlzVGlja3NdJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBjb250ZXh0LmJhck9wdGlvbnMub3JpZW50YXRpb24gPT09IG9yaWVudGF0aW9uLlZFUlRJQ0FMO1xuICAgICAgICBlbHNlIGVsc2VUZW1wbGF0ZVxuICAgICAgXCJcbiAgICA+XG4gICAgICA8c3ZnOmcgKm5nRm9yPVwibGV0IHRpY2sgb2YgdGlja3M7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgPHRleHRcbiAgICAgICAgICBbYXR0ci54XT1cIlxuICAgICAgICAgICAgaSA9PT0gdGlja3MubGVuZ3RoIC0gMSAmJiB0aWNrLnggPj0gY29udGV4dC5jaGFydFZpZXc/LmhlaWdodFxuICAgICAgICAgICAgICA/IHRpY2sueCAtIDVcbiAgICAgICAgICAgICAgOiB0aWNrLnhcbiAgICAgICAgICBcIlxuICAgICAgICAgIFthdHRyLnldPVwidGljay55ICsgMTZcIlxuICAgICAgICAgIGZpbGw9XCIjNjY2XCJcbiAgICAgICAgICBbYXR0ci50ZXh0LWFuY2hvcl09XCJ0ZXh0QW5jaG9yXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0cmFuc2xhdGlvbiA/ICh0aWNrLnZhbHVlIHwgdHJhbnNsYXRlKSA6IHRpY2sudmFsdWUgfX1cbiAgICAgICAgPC90ZXh0PlxuICAgICAgICA8bGluZVxuICAgICAgICAgIFthdHRyLngxXT1cInRpY2sueFwiXG4gICAgICAgICAgW2F0dHIueDJdPVwidGljay54XCJcbiAgICAgICAgICBbYXR0ci55MV09XCJ0aWNrLnlcIlxuICAgICAgICAgIFthdHRyLnkyXT1cInRpY2sueSArIDZcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgIHN0cm9rZT1cIiNjY2Q2ZWJcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9zdmc6Zz5cbiAgICAgIDxzdmc6Zz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBbYXR0ci5kXT1cInhBeGlzTGluZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI2NjZDZlYlwiXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAvPlxuICAgICAgPC9zdmc6Zz5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjZWxzZVRlbXBsYXRlPlxuICAgICAgPHN2ZzpnICpuZ0Zvcj1cImxldCB0aWNrIG9mIHRpY2tzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgeD1cIi04XCJcbiAgICAgICAgICBbYXR0ci55XT1cInRpY2sueFwiXG4gICAgICAgICAgZmlsbD1cIiM2NjZcIlxuICAgICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMVwiXG4gICAgICAgICAgYWxpZ25tZW50LWJhc2VsaW5lPVwibWlkZGxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHRyYW5zbGF0aW9uID8gKHRpY2sudmFsdWUgfCB0cmFuc2xhdGUgfCB0cmFuc2xhdGUpIDogdGljay52YWx1ZSB9fVxuICAgICAgICA8L3RleHQ+XG4gICAgICA8L3N2ZzpnPlxuICAgICAgPHN2ZzpnPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIFthdHRyLmRdPVwieUF4aXNMaW5lXCJcbiAgICAgICAgICBzdHJva2U9XCIjY2NkNmViXCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgIC8+XG4gICAgICA8L3N2ZzpnPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBYQXhpc1RpY2tzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZGF0ZUZvcm1hdDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uOiBib29sZWFuO1xuXG4gIHRleHRBbmNob3IgPSAnbWlkZGxlJztcbiAgb3JpZW50YXRpb24gPSBPcmllbnRhdGlvbjtcbiAgZ2V0IGNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFNlcnZpY2U7XG4gIH1cblxuICB0aWNrczogVGlja1tdO1xuICBnZXQgeUF4aXNMaW5lKCkge1xuICAgIHJldHVybiBgTSR7MH0gJHswfUwkezB9ICR7dGhpcy5jb250ZXh0LmNoYXJ0Vmlldy5oZWlnaHR9WmA7XG4gIH1cblxuICBnZXQgeEF4aXNMaW5lKCkge1xuICAgIGNvbnN0IHsgd2lkdGggfSA9IHRoaXMuY29udGV4dFNlcnZpY2UuY2hhcnRWaWV3O1xuICAgIHJldHVybiBgTTAgMEwke3dpZHRofSAwWmA7XG4gIH1cblxuICBnZXRUaWNrcygpIHtcbiAgICBsZXQgdGlja3M6IFRpY2tbXTtcbiAgICBpZiAodGhpcy5jb250ZXh0LnNjYWxlVHlwZSA9PT0gU2NhbGVUeXBlLk9SRElOQUwpIHtcbiAgICAgIGNvbnN0IG1heFRpY2tzID0gdGhpcy5nZXRNYXhUaWNrcygyMCk7XG4gICAgICB0aWNrcyA9IHJlZHVjZVRpY2tzKHRoaXMuY29udGV4dC54LmRvbWFpbigpLCBtYXhUaWNrcykubWFwKFxuICAgICAgICB0aGlzLmhhbmRsZVRpY2tzRGF0YSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpY2tzID0gKHRoaXMuY29udGV4dC54IGFzIFNjYWxlVGltZTxudW1iZXIsIG51bWJlcj4pXG4gICAgICAgIC50aWNrcyh0aGlzLmdldE1heFRpY2tzKDEwMCkpXG4gICAgICAgIC5tYXAodGhpcy5oYW5kbGVUaWNrc0RhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdGlja3M7XG4gIH1cblxuICBoYW5kbGVUaWNrc0RhdGEgPSAodmFsdWU6IFRpY2tWYWx1ZSk6IFRpY2sgPT4ge1xuICAgIGNvbnN0IGJhbmR3aWR0aCA9IHRoaXMuY29udGV4dC5iYXJPcHRpb25zLmlzQmFuZFxuICAgICAgPyAodGhpcy5jb250ZXh0LnggYXMgU2NhbGVQb2ludDxzdHJpbmc+KS5iYW5kd2lkdGgoKSAqIDAuNVxuICAgICAgOiAwO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdGhpcy5mb3JtYXQodmFsdWUpLFxuICAgICAgeDogdGhpcy5jb250ZXh0LngodmFsdWUpICsgYmFuZHdpZHRoLFxuICAgICAgeTogMCxcbiAgICB9IGFzIFRpY2s7XG4gIH07XG5cbiAgZ2V0TWF4VGlja3ModGlja1dpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jb250ZXh0Lmhvcml6b250YWxcbiAgICAgID8gdGhpcy5jb250ZXh0LmNoYXJ0Vmlldy5oZWlnaHRcbiAgICAgIDogdGhpcy5jb250ZXh0LmNoYXJ0Vmlldy53aWR0aDtcbiAgICByZXR1cm4gTWF0aC5mbG9vcih3aWR0aCAvIHRpY2tXaWR0aCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRTZXJ2aWNlOiBDb250ZXh0Q2hhcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29udGV4dFNlcnZpY2Uuc2VyaWVzRGF0YSRcbiAgICAgIC5waXBlKG1hcCgoKSA9PiB0aGlzLmdldFRpY2tzKCkpKVxuICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGlzLnRpY2tzID0gcmVzO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGZvcm1hdCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRTZXJ2aWNlLnNjYWxlVHlwZSA9PT0gU2NhbGVUeXBlLlRJTUVcbiAgICAgID8gZGF5anModmFsdWUpLmZvcm1hdCh0aGlzLmRhdGVGb3JtYXQpXG4gICAgICA6IHZhbHVlO1xuICB9XG59XG4iXX0=