UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

318 lines 45.7 kB
import { DateNavRange, TooltipDirective, InputGroupComponent, InputComponent, IconComponent, TagComponent, DateRangePickerPanelComponent, InputSuffixDirective, } from '@alauda/ui'; import { AsyncPipe, NgForOf, NgIf } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild, forwardRef, } from '@angular/core'; import { FormsModule, NG_VALUE_ACCESSOR, } from '@angular/forms'; import dayjs from 'dayjs'; import { range } from 'lodash-es'; import { PurePipe } from '../../core/public-api'; import { EFFECT_DIRECTIVE_MODULE } from '../../effect-directive/module'; import { TranslateModule, TranslateService } from '../../translate/public-api'; import { CUSTOM, CUSTOM_RANGE, DEFAULT_OPTIONS } from './util'; import * as i0 from "@angular/core"; import * as i1 from "../../translate/public-api"; import * as i2 from "../../translate/translate.pipe"; import * as i3 from "@angular/forms"; import * as i4 from "../../effect-directive/e2e-attribute-binding.directive"; const _c0 = ["tip"]; const _c1 = (a0, a1) => ({ "tw-text-center": a0, "!tw-text-s": a1, "date-range-picker": true }); function DateRangePickerComponent_aui_input_group_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "aui-input-group", 4, 1); i0.ɵɵelement(2, "input", 5); i0.ɵɵpipe(3, "async"); i0.ɵɵpipe(4, "pure"); i0.ɵɵpipe(5, "async"); i0.ɵɵpipe(6, "pure"); i0.ɵɵelement(7, "aui-icon", 6); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); const tooltip_r2 = i0.ɵɵreference(3); i0.ɵɵstyleProp("width", ctx_r0.inputWidth); i0.ɵɵproperty("auiTooltip", tooltip_r2); i0.ɵɵadvance(2); i0.ɵɵclassMap(i0.ɵɵpureFunction2(20, _c1, ctx_r0.mode === "dropdown", ctx_r0.mode === "dropdown")); i0.ɵɵproperty("title", i0.ɵɵpipeBind3(4, 10, ctx_r0.value, ctx_r0.formatValue, i0.ɵɵpipeBind1(3, 8, ctx_r0.translate.locale$)))("value", i0.ɵɵpipeBind3(6, 16, ctx_r0.value, ctx_r0.formatValue, i0.ɵɵpipeBind1(5, 14, ctx_r0.translate.locale$))); i0.ɵɵadvance(5); i0.ɵɵproperty("icon", ctx_r0.mode === "dropdown" ? "calendar" : "caret_down_s"); } } function DateRangePickerComponent_aui_tag_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "aui-tag", 7, 1); i0.ɵɵelement(2, "aui-icon", 8); i0.ɵɵtext(3); i0.ɵɵpipe(4, "translate"); i0.ɵɵpipe(5, "async"); i0.ɵɵpipe(6, "pure"); i0.ɵɵelement(7, "aui-icon", 9); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); const tooltip_r2 = i0.ɵɵreference(3); i0.ɵɵproperty("type", ctx_r0.tagActive ? "primary" : "info")("solid", ctx_r0.tagActive)("auiTooltip", tooltip_r2); i0.ɵɵadvance(3); i0.ɵɵtextInterpolate1(" ", !ctx_r0.value ? i0.ɵɵpipeBind1(4, 4, "more") : i0.ɵɵpipeBind3(6, 8, ctx_r0.value, ctx_r0.formatValue, i0.ɵɵpipeBind1(5, 6, ctx_r0.translate.locale$)), " "); } } function DateRangePickerComponent_ng_template_2_span_2_Template(rf, ctx) { if (rf & 1) { const _r3 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "span", 14); i0.ɵɵlistener("click", function DateRangePickerComponent_ng_template_2_span_2_Template_span_click_0_listener() { const range_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.selectRange(range_r4)); }); i0.ɵɵtext(1); i0.ɵɵpipe(2, "translate"); i0.ɵɵpipe(3, "translate"); i0.ɵɵelementEnd(); } if (rf & 2) { const range_r4 = ctx.$implicit; const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵclassProp("active", range_r4.label === (ctx_r0.selectedRange == null ? null : ctx_r0.selectedRange.label)); i0.ɵɵadvance(); i0.ɵɵtextInterpolate1(" ", range_r4.display ? i0.ɵɵpipeBind2(2, 3, range_r4.display, range_r4.displayCtx) : i0.ɵɵpipeBind1(3, 6, range_r4.label), " "); } } function DateRangePickerComponent_ng_template_2_div_3_Template(rf, ctx) { if (rf & 1) { const _r5 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 15)(1, "aui-date-range-picker-panel", 16); i0.ɵɵpipe(2, "pure"); i0.ɵɵtwoWayListener("ngModelChange", function DateRangePickerComponent_ng_template_2_div_3_Template_aui_date_range_picker_panel_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r0.rangeValue, $event) || (ctx_r0.rangeValue = $event); return i0.ɵɵresetView($event); }); i0.ɵɵlistener("confirm", function DateRangePickerComponent_ng_template_2_div_3_Template_aui_date_range_picker_panel_confirm_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.submitRange(ctx_r0.CUSTOM_RANGE, ctx_r0.rangeValue)); })("clear", function DateRangePickerComponent_ng_template_2_div_3_Template_aui_date_range_picker_panel_clear_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.rangeValue = []); })("click", function DateRangePickerComponent_ng_template_2_div_3_Template_aui_date_range_picker_panel_click_1_listener($event) { i0.ɵɵrestoreView(_r5); return i0.ɵɵresetView($event.stopImmediatePropagation()); }); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵproperty("disabledDate", i0.ɵɵpipeBind2(2, 4, ctx_r0.options, ctx_r0.getDisabledDate)); i0.ɵɵtwoWayProperty("ngModel", ctx_r0.rangeValue); i0.ɵɵproperty("showTime", ctx_r0.finalOptions.timePicker)("disabledTime", ctx_r0.enableDisableTime && ctx_r0.disabledTime()); } } function DateRangePickerComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 10)(1, "div", 11); i0.ɵɵtemplate(2, DateRangePickerComponent_ng_template_2_span_2_Template, 4, 8, "span", 12); i0.ɵɵelementEnd(); i0.ɵɵtemplate(3, DateRangePickerComponent_ng_template_2_div_3_Template, 3, 7, "div", 13); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(2); i0.ɵɵproperty("ngForOf", ctx_r0.ranges); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx_r0.isCustom); } } export class DateRangePickerComponent { get isCustom() { return this.selectedRange?.label === 'custom'; } get ranges() { return [...(this.options.timeRange || []), CUSTOM_RANGE]; } constructor(translate, cdr) { this.translate = translate; this.cdr = cdr; this.options = {}; this.format = 'YYYY-MM-DD HH:mm:ss'; this.mode = 'input'; this.customInputWidth = '315px'; this.rangeValue = null; this.finalOptions = this.options; this.CUSTOM = CUSTOM; this.CUSTOM_RANGE = CUSTOM_RANGE; this.inputWidth = ''; this.getDisabledDate = (options) => (date, navType, startDate) => { let result = false; const { minValue, maxValue } = this.getMinMaxDate(startDate); if (navType === DateNavRange.Month) { if (options.minDate) { result = result || date.isBefore(minValue, 'date'); } if (options.maxDate) { result = result || date.isAfter(maxValue, 'date'); } } return result; }; this.getMinMaxDate = (startDate) => { const { minDate, maxDate } = this.options; const minValue = typeof minDate === 'function' ? minDate(startDate)?.valueOf() : minDate?.valueOf(); const maxValue = typeof maxDate === 'function' ? maxDate(startDate)?.valueOf() : maxDate?.valueOf(); return { minValue: minValue || 0, maxValue: maxValue || 0, }; }; /** * 禁用时间存在 bug 具体查看 https://jira.alauda.cn/browse/AIT-52471 描述 * 可通过 enableDisableTime 开启 默认关闭,如果选择的 end 比 start 会对调 */ this.disabledTime = () => ({ left: (value) => { const { minValue } = this.getMinMaxDate(); const minDate = dayjs(minValue); const sameDay = minDate?.day() === value?.day(); return (minValue && sameDay && { hours: () => range(0, minDate.hour() - 1), minutes: () => range(0, minDate.minute()), seconds: () => range(0, minDate.second()), }); }, right: (value) => { const { maxValue } = this.getMinMaxDate(); const minDate = this.rangeValue?.[0]; const sameHour = minDate?.isSame(value, 'hour'); const sameDay = this.rangeValue?.[0]?.isSame(value, 'day'); return (maxValue && sameDay && { hours: () => range(minDate.hour()), minutes: sameHour ? () => range(minDate.minute()) : () => [], seconds: sameHour ? () => range(minDate.second()) : () => [], }); }, }); this.submitRange = this.submitRange.bind(this); this.formatValue = this.formatValue.bind(this); this.formatCustomValue = this.formatCustomValue.bind(this); } writeValue(obj) { if (obj) { this.value = obj; this.selectedRange = obj; this.setInputWidth(obj.label); this.cdr.markForCheck(); } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onBlur = fn; } ngOnInit() { const { timePicker, ...reset } = this.options; this.finalOptions = { ...DEFAULT_OPTIONS, timePicker: timePicker !== false, ...reset, }; } cancel() { this.tip.hide(); this.selectedRange = this.value; } submitRange(range, rangeValue) { if (!rangeValue?.length && range.label === CUSTOM) { this.tip.hide(); return; } range = range.label === CUSTOM ? { label: range.label, start: () => rangeValue[0] || this.value.start(), end: () => rangeValue[1] || dayjs(), } : range; this.value = range; this.selectedRange = range; this.setInputWidth(range.label); this.onChange?.(range); this.tip.hide(); } setInputWidth(label) { if (this.options?.widthAdaptive) { this.inputWidth = label === CUSTOM ? this.customInputWidth : ''; } } selectRange(range) { this.selectedRange = range; if (range.label === CUSTOM) { requestAnimationFrame(() => this.tip.updatePosition()); } else { this.submitRange(range); } } formatValue(value, _locale) { if (!value) { return ''; } if (value.label !== CUSTOM) { return value.display ? this.translate.get(value.display, value.displayCtx) : this.translate.get(value.label); } return this.formatCustomValue([value.start(), value.end()]); } formatCustomValue(value) { return value?.map(i => i?.format(this.format)).join(' - '); } static { this.ɵfac = function DateRangePickerComponent_Factory(t) { return new (t || DateRangePickerComponent)(i0.ɵɵdirectiveInject(i1.TranslateService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DateRangePickerComponent, selectors: [["acl-date-range-picker"]], viewQuery: function DateRangePickerComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.tip = _t.first); } }, inputs: { options: "options", format: "format", mode: "mode", tagActive: "tagActive", customInputWidth: "customInputWidth", enableDisableTime: "enableDisableTime" }, standalone: true, features: [i0.ɵɵProvidersFeature([ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateRangePickerComponent), multi: true, }, ]), i0.ɵɵStandaloneFeature], decls: 4, vars: 2, consts: [["tooltip", ""], ["tip", "auiTooltip"], ["auiTooltipClass", "acl-date-range-picker__panel", "auiTooltipTrigger", "click", "auiTooltipType", "info", "auiTooltipPosition", "bottom start", "auiTooltipAnimType", "none", 3, "auiTooltip", "width", 4, "ngIf"], ["size", "mini", "class", "tag", "auiTooltipClass", "acl-date-range-picker__panel", "auiTooltipTrigger", "click", "auiTooltipType", "info", "auiTooltipPosition", "bottom start", 3, "type", "solid", "auiTooltip", 4, "ngIf"], ["auiTooltipClass", "acl-date-range-picker__panel", "auiTooltipTrigger", "click", "auiTooltipType", "info", "auiTooltipPosition", "bottom start", "auiTooltipAnimType", "none", 3, "auiTooltip"], ["aui-input", "", "readonly", "", 3, "title", "value"], ["auiInputSuffix", "", 1, "tw-text-n-2", 3, "icon"], ["size", "mini", "auiTooltipClass", "acl-date-range-picker__panel", "auiTooltipTrigger", "click", "auiTooltipType", "info", "auiTooltipPosition", "bottom start", 1, "tag", 3, "type", "solid", "auiTooltip"], ["icon", "clock"], ["icon", "angle_down", "margin", "left", 1, "tw-ml-[-4px]"], [1, "range-picker-panel"], [1, "control"], ["class", "control-row", 3, "active", "click", 4, "ngFor", "ngForOf"], ["class", "range-picker-wrapper", 4, "ngIf"], [1, "control-row", 3, "click"], [1, "range-picker-wrapper"], [3, "ngModelChange", "confirm", "clear", "click", "disabledDate", "ngModel", "showTime", "disabledTime"]], template: function DateRangePickerComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, DateRangePickerComponent_aui_input_group_0_Template, 8, 23, "aui-input-group", 2)(1, DateRangePickerComponent_aui_tag_1_Template, 8, 12, "aui-tag", 3)(2, DateRangePickerComponent_ng_template_2_Template, 4, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor); } if (rf & 2) { i0.ɵɵproperty("ngIf", ctx.mode === "input" || ctx.mode === "dropdown"); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx.mode === "tag"); } }, dependencies: [InputGroupComponent, NgIf, TooltipDirective, InputSuffixDirective, InputComponent, IconComponent, TagComponent, NgForOf, TranslateModule, i2.TranslatePipe, DateRangePickerPanelComponent, FormsModule, i3.NgControlStatus, i3.NgModel, PurePipe, AsyncPipe, i4.E2eAttributeBindingDirective], styles: [".range-picker-panel[_ngcontent-%COMP%]{display:inline-flex}.range-picker-footer[_ngcontent-%COMP%]{padding:9px;display:flex;justify-content:flex-end;box-sizing:content-box;border-top:1px solid rgb(var(--aui-color-divider))}.range-picker-footer[_ngcontent-%COMP%] .range-date-tip[_ngcontent-%COMP%]{display:flex;font-size:14px;align-items:center;margin-right:6px;color:rgb(var(--aui-color-main-text))}.date-range-picker[readonly][_ngcontent-%COMP%]{background-color:rgb(var(--aui-color-n-9));border-color:rgb(var(--aui-color-n-7))}aui-input-group[_ngcontent-%COMP%]{width:100%;display:inline-block}[_nghost-%COMP%] {display:flex}[_nghost-%COMP%] .aui-input{cursor:pointer!important} .acl-date-range-picker__panel{max-width:unset!important;padding:0!important;overflow:hidden} .acl-date-range-picker__panel .control{display:flex;min-width:120px;flex-direction:column;max-height:337px;overflow:auto} .acl-date-range-picker__panel .range-picker-wrapper{padding:8px;display:flex;flex-direction:column;border-left:1px solid rgb(var(--aui-color-divider))} .acl-date-range-picker__panel .control-row{padding:8px 12px;font-size:12px;color:rgb(var(--aui-color-main-text))} .acl-date-range-picker__panel .control-row:hover{background-color:rgb(var(--aui-color-p-6));color:rgb(var(--aui-color-primary));cursor:pointer} .acl-date-range-picker__panel .control-row.active{background-color:rgb(var(--aui-color-p-6));color:rgb(var(--aui-color-primary))}.tag[_ngcontent-%COMP%]{position:relative}.tag[_ngcontent-%COMP%] .aui-tag__content{overflow:inherit}.tag[_ngcontent-%COMP%] .aui-tag{max-width:unset!important}"], changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DateRangePickerComponent, [{ type: Component, args: [{ selector: 'acl-date-range-picker', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateRangePickerComponent), multi: true, }, ], imports: [ InputGroupComponent, NgIf, TooltipDirective, InputSuffixDirective, InputComponent, IconComponent, TagComponent, NgForOf, TranslateModule, DateRangePickerPanelComponent, FormsModule, PurePipe, AsyncPipe, ...EFFECT_DIRECTIVE_MODULE, ], standalone: true, template: "<aui-input-group\n *ngIf=\"mode === 'input' || mode === 'dropdown'\"\n [auiTooltip]=\"tooltip\"\n auiTooltipClass=\"acl-date-range-picker__panel\"\n auiTooltipTrigger=\"click\"\n auiTooltipType=\"info\"\n auiTooltipPosition=\"bottom start\"\n auiTooltipAnimType=\"none\"\n [style.width]=\"inputWidth\"\n #tip=\"auiTooltip\"\n>\n <input\n aui-input\n [class]=\"{\n 'tw-text-center': mode === 'dropdown',\n '!tw-text-s': mode === 'dropdown',\n 'date-range-picker': true,\n }\"\n [title]=\"value | pure: formatValue : (translate.locale$ | async)\"\n [value]=\"value | pure: formatValue : (translate.locale$ | async)\"\n readonly\n />\n <aui-icon\n auiInputSuffix\n class=\"tw-text-n-2\"\n [icon]=\"mode === 'dropdown' ? 'calendar' : 'caret_down_s'\"\n ></aui-icon>\n</aui-input-group>\n\n<aui-tag\n *ngIf=\"mode === 'tag'\"\n size=\"mini\"\n class=\"tag\"\n [type]=\"tagActive ? 'primary' : 'info'\"\n [solid]=\"tagActive\"\n [auiTooltip]=\"tooltip\"\n auiTooltipClass=\"acl-date-range-picker__panel\"\n auiTooltipTrigger=\"click\"\n auiTooltipType=\"info\"\n #tip=\"auiTooltip\"\n auiTooltipPosition=\"bottom start\"\n>\n <aui-icon icon=\"clock\"></aui-icon>\n {{\n !value\n ? ('more' | translate)\n : (value | pure: formatValue : (translate.locale$ | async))\n }}\n <aui-icon\n class=\"tw-ml-[-4px]\"\n icon=\"angle_down\"\n margin=\"left\"\n ></aui-icon>\n</aui-tag>\n\n<ng-template #tooltip>\n <div class=\"range-picker-panel\">\n <div class=\"control\">\n <span\n *ngFor=\"let range of ranges\"\n class=\"control-row\"\n [class.active]=\"range.label === selectedRange?.label\"\n (click)=\"selectRange(range)\"\n >\n {{\n range.display\n ? (range.display | translate: range.displayCtx)\n : (range.label | translate)\n }}\n </span>\n </div>\n <div\n class=\"range-picker-wrapper\"\n *ngIf=\"isCustom\"\n >\n <aui-date-range-picker-panel\n [disabledDate]=\"options | pure: getDisabledDate\"\n [(ngModel)]=\"rangeValue\"\n (confirm)=\"submitRange(CUSTOM_RANGE, rangeValue)\"\n (clear)=\"rangeValue = []\"\n (click)=\"$event.stopImmediatePropagation()\"\n [showTime]=\"finalOptions.timePicker\"\n [disabledTime]=\"enableDisableTime && disabledTime()\"\n ></aui-date-range-picker-panel>\n </div>\n </div>\n</ng-template>\n", styles: [".range-picker-panel{display:inline-flex}.range-picker-footer{padding:9px;display:flex;justify-content:flex-end;box-sizing:content-box;border-top:1px solid rgb(var(--aui-color-divider))}.range-picker-footer .range-date-tip{display:flex;font-size:14px;align-items:center;margin-right:6px;color:rgb(var(--aui-color-main-text))}.date-range-picker[readonly]{background-color:rgb(var(--aui-color-n-9));border-color:rgb(var(--aui-color-n-7))}aui-input-group{width:100%;display:inline-block}:host::ng-deep{display:flex}:host::ng-deep .aui-input{cursor:pointer!important}::ng-deep .acl-date-range-picker__panel{max-width:unset!important;padding:0!important;overflow:hidden}::ng-deep .acl-date-range-picker__panel .control{display:flex;min-width:120px;flex-direction:column;max-height:337px;overflow:auto}::ng-deep .acl-date-range-picker__panel .range-picker-wrapper{padding:8px;display:flex;flex-direction:column;border-left:1px solid rgb(var(--aui-color-divider))}::ng-deep .acl-date-range-picker__panel .control-row{padding:8px 12px;font-size:12px;color:rgb(var(--aui-color-main-text))}::ng-deep .acl-date-range-picker__panel .control-row:hover{background-color:rgb(var(--aui-color-p-6));color:rgb(var(--aui-color-primary));cursor:pointer}::ng-deep .acl-date-range-picker__panel .control-row.active{background-color:rgb(var(--aui-color-p-6));color:rgb(var(--aui-color-primary))}.tag{position:relative}.tag ::ng-deep .aui-tag__content{overflow:inherit}.tag ::ng-deep .aui-tag{max-width:unset!important}\n"] }] }], () => [{ type: i1.TranslateService }, { type: i0.ChangeDetectorRef }], { options: [{ type: Input }], format: [{ type: Input }], mode: [{ type: Input }], tagActive: [{ type: Input }], customInputWidth: [{ type: Input }], enableDisableTime: [{ type: Input }], tip: [{ type: ViewChild, args: ['tip', { static: false }] }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DateRangePickerComponent, { className: "DateRangePickerComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3dpZGdldC9kYXRlLXJhbmdlLXBpY2tlci9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvd2lkZ2V0L2RhdGUtcmFuZ2UtcGlja2VyL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixnQkFBZ0IsRUFFaEIsbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCxhQUFhLEVBQ2IsWUFBWSxFQUNaLDZCQUE2QixFQUM3QixvQkFBb0IsR0FDckIsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxXQUFXLEVBQ1gsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxLQUFnQixNQUFNLE9BQU8sQ0FBQztBQUNyQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHL0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7SUNsQy9ELDZDQVVDO0lBQ0MsMkJBVUU7Ozs7O0lBQ0YsOEJBSVk7SUFD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O1lBQ0osZ0JBQWdCO1lBQ2hCLG9CQUFvQjtZQUNwQixjQUFjO1lBQ2QsYUFBYTtZQUNiLFlBQVk7WUFDWixPQUFPO1lBQ1AsZUFBZSxvQkFDZiw2QkFBNkI7WUFDN0IsV0FBVyxrQ0FDWCxRQUFRO1lBQ1IsU0FBUzs7aUZBS0Esd0JBQXdCO2NBOUJwQyxTQUFTOzJCQUNFLHVCQUF1QixtQkFHaEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQztvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzt3QkFDdkQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0YsV0FDUTtvQkFDUCxtQkFBbUI7b0JBQ25CLElBQUk7b0JBQ0osZ0JBQWdCO29CQUNoQixvQkFBb0I7b0JBQ3BCLGNBQWM7b0JBQ2QsYUFBYTtvQkFDYixZQUFZO29CQUNaLE9BQU87b0JBQ1AsZUFBZTtvQkFDZiw2QkFBNkI7b0JBQzdCLFdBQVc7b0JBQ1gsUUFBUTtvQkFDUixTQUFTO29CQUNULEdBQUcsdUJBQXVCO2lCQUMzQixjQUNXLElBQUk7aUZBR1AsT0FBTztrQkFBZixLQUFLO1lBR04sTUFBTTtrQkFETCxLQUFLO1lBR0csSUFBSTtrQkFBWixLQUFLO1lBR04sU0FBUztrQkFEUixLQUFLO1lBSU4sZ0JBQWdCO2tCQURmLEtBQUs7WUFHRyxpQkFBaUI7a0JBQXpCLEtBQUs7WUFHTixHQUFHO2tCQURGLFNBQVM7bUJBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7a0ZBaEJ4Qix3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEYXRlTmF2UmFuZ2UsXG4gIFRvb2x0aXBEaXJlY3RpdmUsXG4gIERpc2FibGVkVGltZUZuLFxuICBJbnB1dEdyb3VwQ29tcG9uZW50LFxuICBJbnB1dENvbXBvbmVudCxcbiAgSWNvbkNvbXBvbmVudCxcbiAgVGFnQ29tcG9uZW50LFxuICBEYXRlUmFuZ2VQaWNrZXJQYW5lbENvbXBvbmVudCxcbiAgSW5wdXRTdWZmaXhEaXJlY3RpdmUsXG59IGZyb20gJ0BhbGF1ZGEvdWknO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0Zvck9mLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1zTW9kdWxlLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IGRheWpzLCB7IERheWpzIH0gZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBQdXJlUGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBFRkZFQ1RfRElSRUNUSVZFX01PRFVMRSB9IGZyb20gJy4uLy4uL2VmZmVjdC1kaXJlY3RpdmUvbW9kdWxlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3RyYW5zbGF0ZS9wdWJsaWMtYXBpJztcblxuaW1wb3J0IHsgT3B0aW9ucywgUGlja2VyVGltZVJhbmdlIH0gZnJvbSAnLi90eXBlJztcbmltcG9ydCB7IENVU1RPTSwgQ1VTVE9NX1JBTkdFLCBERUZBVUxUX09QVElPTlMgfSBmcm9tICcuL3V0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhY2wtZGF0ZS1yYW5nZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0eWxlLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBJbnB1dEdyb3VwQ29tcG9uZW50LFxuICAgIE5nSWYsXG4gICAgVG9vbHRpcERpcmVjdGl2ZSxcbiAgICBJbnB1dFN1ZmZpeERpcmVjdGl2ZSxcbiAgICBJbnB1dENvbXBvbmVudCxcbiAgICBJY29uQ29tcG9uZW50LFxuICAgIFRhZ0NvbXBvbmVudCxcbiAgICBOZ0Zvck9mLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBEYXRlUmFuZ2VQaWNrZXJQYW5lbENvbXBvbmVudCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBQdXJlUGlwZSxcbiAgICBBc3luY1BpcGUsXG4gICAgLi4uRUZGRUNUX0RJUkVDVElWRV9NT0RVTEUsXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBvcHRpb25zOiBPcHRpb25zID0ge307XG5cbiAgQElucHV0KClcbiAgZm9ybWF0ID0gJ1lZWVktTU0tREQgSEg6bW06c3MnO1xuXG4gIEBJbnB1dCgpIG1vZGUgPSAnaW5wdXQnO1xuXG4gIEBJbnB1dCgpXG4gIHRhZ0FjdGl2ZTogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBjdXN0b21JbnB1dFdpZHRoID0gJzMxNXB4JztcblxuICBASW5wdXQoKSBlbmFibGVEaXNhYmxlVGltZTogYm9vbGVhbjtcblxuICBAVmlld0NoaWxkKCd0aXAnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGlwOiBUb29sdGlwRGlyZWN0aXZlO1xuXG4gIHJhbmdlVmFsdWU6IERheWpzW10gPSBudWxsO1xuXG4gIGdldCBpc0N1c3RvbSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJhbmdlPy5sYWJlbCA9PT0gJ2N1c3RvbSc7XG4gIH1cblxuICBnZXQgcmFuZ2VzKCkge1xuICAgIHJldHVybiBbLi4uKHRoaXMub3B0aW9ucy50aW1lUmFuZ2UgfHwgW10pLCBDVVNUT01fUkFOR0VdO1xuICB9XG5cbiAgZmluYWxPcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICBDVVNUT00gPSBDVVNUT007XG5cbiAgc2VsZWN0ZWRSYW5nZTogUGlja2VyVGltZVJhbmdlO1xuICBDVVNUT01fUkFOR0UgPSBDVVNUT01fUkFOR0U7XG4gIHZhbHVlOiBQaWNrZXJUaW1lUmFuZ2U7XG5cbiAgaW5wdXRXaWR0aCA9ICcnO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogUGlja2VyVGltZVJhbmdlKSA9PiB2b2lkO1xuICBvbkJsdXI6ICh2YWx1ZTogUGlja2VyVGltZVJhbmdlKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHtcbiAgICB0aGlzLnN1Ym1pdFJhbmdlID0gdGhpcy5zdWJtaXRSYW5nZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZm9ybWF0VmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5mb3JtYXRDdXN0b21WYWx1ZSA9IHRoaXMuZm9ybWF0Q3VzdG9tVmFsdWUuYmluZCh0aGlzKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUob2JqOiBQaWNrZXJUaW1lUmFuZ2UpIHtcbiAgICBpZiAob2JqKSB7XG4gICAgICB0aGlzLnZhbHVlID0gb2JqO1xuICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlID0gb2JqO1xuICAgICAgdGhpcy5zZXRJbnB1dFdpZHRoKG9iai5sYWJlbCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQmx1ciA9IGZuO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgeyB0aW1lUGlja2VyLCAuLi5yZXNldCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMuZmluYWxPcHRpb25zID0ge1xuICAgICAgLi4uREVGQVVMVF9PUFRJT05TLFxuICAgICAgdGltZVBpY2tlcjogdGltZVBpY2tlciAhPT0gZmFsc2UsXG4gICAgICAuLi5yZXNldCxcbiAgICB9O1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMudGlwLmhpZGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkUmFuZ2UgPSB0aGlzLnZhbHVlO1xuICB9XG5cbiAgc3VibWl0UmFuZ2UocmFuZ2U6IFBpY2tlclRpbWVSYW5nZSwgcmFuZ2VWYWx1ZT86IERheWpzW10pIHtcbiAgICBpZiAoIXJhbmdlVmFsdWU/Lmxlbmd0aCAmJiByYW5nZS5sYWJlbCA9PT0gQ1VTVE9NKSB7XG4gICAgICB0aGlzLnRpcC5oaWRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJhbmdlID1cbiAgICAgIHJhbmdlLmxhYmVsID09PSBDVVNUT01cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBsYWJlbDogcmFuZ2UubGFiZWwsXG4gICAgICAgICAgICBzdGFydDogKCkgPT4gcmFuZ2VWYWx1ZVswXSB8fCB0aGlzLnZhbHVlLnN0YXJ0KCksXG4gICAgICAgICAgICBlbmQ6ICgpID0+IHJhbmdlVmFsdWVbMV0gfHwgZGF5anMoKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogcmFuZ2U7XG4gICAgdGhpcy52YWx1ZSA9IHJhbmdlO1xuICAgIHRoaXMuc2VsZWN0ZWRSYW5nZSA9IHJhbmdlO1xuICAgIHRoaXMuc2V0SW5wdXRXaWR0aChyYW5nZS5sYWJlbCk7XG4gICAgdGhpcy5vbkNoYW5nZT8uKHJhbmdlKTtcbiAgICB0aGlzLnRpcC5oaWRlKCk7XG4gIH1cblxuICBzZXRJbnB1dFdpZHRoKGxhYmVsOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zPy53aWR0aEFkYXB0aXZlKSB7XG4gICAgICB0aGlzLmlucHV0V2lkdGggPSBsYWJlbCA9PT0gQ1VTVE9NID8gdGhpcy5jdXN0b21JbnB1dFdpZHRoIDogJyc7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0UmFuZ2UocmFuZ2U6IFBpY2tlclRpbWVSYW5nZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRSYW5nZSA9IHJhbmdlO1xuICAgIGlmIChyYW5nZS5sYWJlbCA9PT0gQ1VTVE9NKSB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy50aXAudXBkYXRlUG9zaXRpb24oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3VibWl0UmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFZhbHVlKHZhbHVlOiBQaWNrZXJUaW1lUmFuZ2UsIF9sb2NhbGU6IHN0cmluZykge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKHZhbHVlLmxhYmVsICE9PSBDVVNUT00pIHtcbiAgICAgIHJldHVybiB2YWx1ZS5kaXNwbGF5XG4gICAgICAgID8gdGhpcy50cmFuc2xhdGUuZ2V0KHZhbHVlLmRpc3BsYXksIHZhbHVlLmRpc3BsYXlDdHgpXG4gICAgICAgIDogdGhpcy50cmFuc2xhdGUuZ2V0KHZhbHVlLmxhYmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0Q3VzdG9tVmFsdWUoW3ZhbHVlLnN0YXJ0KCksIHZhbHVlLmVuZCgpXSk7XG4gIH1cblxuICBmb3JtYXRDdXN0b21WYWx1ZSh2YWx1ZTogRGF5anNbXSkge1xuICAgIHJldHVybiB2YWx1ZT8ubWFwKGkgPT4gaT8uZm9ybWF0KHRoaXMuZm9ybWF0KSkuam9pbignIC0gJyk7XG4gIH1cblxuICBnZXREaXNhYmxlZERhdGUgPVxuICAgIChvcHRpb25zOiBPcHRpb25zKSA9PlxuICAgIChkYXRlOiBEYXlqcywgbmF2VHlwZTogRGF0ZU5hdlJhbmdlLCBzdGFydERhdGU6IERheWpzKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBjb25zdCB7IG1pblZhbHVlLCBtYXhWYWx1ZSB9ID0gdGhpcy5nZXRNaW5NYXhEYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICBpZiAobmF2VHlwZSA9PT0gRGF0ZU5hdlJhbmdlLk1vbnRoKSB7XG4gICAgICAgIGlmIChvcHRpb25zLm1pbkRhdGUpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwgZGF0ZS5pc0JlZm9yZShtaW5WYWx1ZSwgJ2RhdGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5tYXhEYXRlKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IGRhdGUuaXNBZnRlcihtYXhWYWx1ZSwgJ2RhdGUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gIGdldE1pbk1heERhdGUgPSAoc3RhcnREYXRlPzogRGF5anMpID0+IHtcbiAgICBjb25zdCB7IG1pbkRhdGUsIG1heERhdGUgfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBtaW5WYWx1ZSA9XG4gICAgICB0eXBlb2YgbWluRGF0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IG1pbkRhdGUoc3RhcnREYXRlKT8udmFsdWVPZigpXG4gICAgICAgIDogbWluRGF0ZT8udmFsdWVPZigpO1xuICAgIGNvbnN0IG1heFZhbHVlID1cbiAgICAgIHR5cGVvZiBtYXhEYXRlID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbWF4RGF0ZShzdGFydERhdGUpPy52YWx1ZU9mKClcbiAgICAgICAgOiBtYXhEYXRlPy52YWx1ZU9mKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1pblZhbHVlOiBtaW5WYWx1ZSB8fCAwLFxuICAgICAgbWF4VmFsdWU6IG1heFZhbHVlIHx8IDAsXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICog56aB55So5pe26Ze05a2Y5ZyoIGJ1ZyDlhbfkvZPmn6XnnIsgIGh0dHBzOi8vamlyYS5hbGF1ZGEuY24vYnJvd3NlL0FJVC01MjQ3MSDmj4/ov7BcbiAgICog5Y+v6YCa6L+HIGVuYWJsZURpc2FibGVUaW1lIOW8gOWQryDpu5jorqTlhbPpl63vvIzlpoLmnpzpgInmi6nnmoQgZW5kIOavlCBzdGFydCDkvJrlr7nosINcbiAgICovXG4gIGRpc2FibGVkVGltZSA9ICgpOiB7IGxlZnQ6IERpc2FibGVkVGltZUZuOyByaWdodDogRGlzYWJsZWRUaW1lRm4gfSA9PiAoe1xuICAgIGxlZnQ6ICh2YWx1ZTogRGF5anMpID0+IHtcbiAgICAgIGNvbnN0IHsgbWluVmFsdWUgfSA9IHRoaXMuZ2V0TWluTWF4RGF0ZSgpO1xuICAgICAgY29uc3QgbWluRGF0ZSA9IGRheWpzKG1pblZhbHVlKTtcbiAgICAgIGNvbnN0IHNhbWVEYXkgPSBtaW5EYXRlPy5kYXkoKSA9PT0gdmFsdWU/LmRheSgpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgbWluVmFsdWUgJiZcbiAgICAgICAgc2FtZURheSAmJiB7XG4gICAgICAgICAgaG91cnM6ICgpID0+IHJhbmdlKDAsIG1pbkRhdGUuaG91cigpIC0gMSksXG4gICAgICAgICAgbWludXRlczogKCkgPT4gcmFuZ2UoMCwgbWluRGF0ZS5taW51dGUoKSksXG4gICAgICAgICAgc2Vjb25kczogKCkgPT4gcmFuZ2UoMCwgbWluRGF0ZS5zZWNvbmQoKSksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICByaWdodDogKHZhbHVlOiBEYXlqcykgPT4ge1xuICAgICAgY29uc3QgeyBtYXhWYWx1ZSB9ID0gdGhpcy5nZXRNaW5NYXhEYXRlKCk7XG4gICAgICBjb25zdCBtaW5EYXRlID0gdGhpcy5yYW5nZVZhbHVlPy5bMF07XG4gICAgICBjb25zdCBzYW1lSG91ciA9IG1pbkRhdGU/LmlzU2FtZSh2YWx1ZSwgJ2hvdXInKTtcbiAgICAgIGNvbnN0IHNhbWVEYXkgPSB0aGlzLnJhbmdlVmFsdWU/LlswXT8uaXNTYW1lKHZhbHVlLCAnZGF5Jyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBtYXhWYWx1ZSAmJlxuICAgICAgICBzYW1lRGF5ICYmIHtcbiAgICAgICAgICBob3VyczogKCkgPT4gcmFuZ2UobWluRGF0ZS5ob3VyKCkpLFxuICAgICAgICAgIG1pbnV0ZXM6IHNhbWVIb3VyID8gKCkgPT4gcmFuZ2UobWluRGF0ZS5taW51dGUoKSkgOiAoKSA9PiBbXSxcbiAgICAgICAgICBzZWNvbmRzOiBzYW1lSG91ciA/ICgpID0+IHJhbmdlKG1pbkRhdGUuc2Vjb25kKCkpIDogKCkgPT4gW10sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG59XG4iLCI8YXVpLWlucHV0LWdyb3VwXG4gICpuZ0lmPVwibW9kZSA9PT0gJ2lucHV0JyB8fCBtb2RlID09PSAnZHJvcGRvd24nXCJcbiAgW2F1aVRvb2x0aXBdPVwidG9vbHRpcFwiXG4gIGF1aVRvb2x0aXBDbGFzcz1cImFjbC1kYXRlLXJhbmdlLXBpY2tlcl9fcGFuZWxcIlxuICBhdWlUb29sdGlwVHJpZ2dlcj1cImNsaWNrXCJcbiAgYXVpVG9vbHRpcFR5cGU9XCJpbmZvXCJcbiAgYXVpVG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tIHN0YXJ0XCJcbiAgYXVpVG9vbHRpcEFuaW1UeXBlPVwibm9uZVwiXG4gIFtzdHlsZS53aWR0aF09XCJpbnB1dFdpZHRoXCJcbiAgI3RpcD1cImF1aVRvb2x0aXBcIlxuPlxuICA8aW5wdXRcbiAgICBhdWktaW5wdXRcbiAgICBbY2xhc3NdPVwie1xuICAgICAgJ3R3LXRleHQtY2VudGVyJzogbW9kZSA9PT0gJ2Ryb3Bkb3duJyxcbiAgICAgICchdHctdGV4dC1zJzogbW9kZSA9PT0gJ2Ryb3Bkb3duJyxcbiAgICAgICdkYXRlLXJhbmdlLXBpY2tlcic6IHRydWUsXG4gICAgfVwiXG4gICAgW3RpdGxlXT1cInZhbHVlIHwgcHVyZTogZm9ybWF0VmFsdWUgOiAodHJhbnNsYXRlLmxvY2FsZSQgfCBhc3luYylcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZSB8IHB1cmU6IGZvcm1hdFZhbHVlIDogKHRyYW5zbGF0ZS5sb2NhbGUkIHwgYXN5bmMpXCJcbiAgICByZWFkb25seVxuICAvPlxuICA8YXVpLWljb25cbiAgICBhdWlJbnB1dFN1ZmZpeFxuICAgIGNsYXNzPVwidHctdGV4dC1uLTJcIlxuICAgIFtpY29uXT1cIm1vZGUgPT09ICdkcm9wZG93bicgPyAnY2FsZW5kYXInIDogJ2NhcmV0X2Rvd25fcydcIlxuICA+PC9hdWktaWNvbj5cbjwvYXVpLWlucHV0LWdyb3VwPlxuXG48YXVpLXRhZ1xuICAqbmdJZj1cIm1vZGUgPT09ICd0YWcnXCJcbiAgc2l6ZT1cIm1pbmlcIlxuICBjbGFzcz1cInRhZ1wiXG4gIFt0eXBlXT1cInRhZ0FjdGl2ZSA/ICdwcmltYXJ5JyA6ICdpbmZvJ1wiXG4gIFtzb2xpZF09XCJ0YWdBY3RpdmVcIlxuICBbYXVpVG9vbHRpcF09XCJ0b29sdGlwXCJcbiAgYXVpVG9vbHRpcENsYXNzPVwiYWNsLWRhdGUtcmFuZ2UtcGlja2VyX19wYW5lbFwiXG4gIGF1aVRvb2x0aXBUcmlnZ2VyPVwiY2xpY2tcIlxuICBhdWlUb29sdGlwVHlwZT1cImluZm9cIlxuICAjdGlwPVwiYXVpVG9vbHRpcFwiXG4gIGF1aVRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbSBzdGFydFwiXG4+XG4gIDxhdWktaWNvbiBpY29uPVwiY2xvY2tcIj48L2F1aS1pY29uPlxuICB7e1xuICAgICF2YWx1ZVxuICAgICAgPyAoJ21vcmUnIHwgdHJhbnNsYXRlKVxuICAgICAgOiAodmFsdWUgfCBwdXJlOiBmb3JtYXRWYWx1ZSA6ICh0cmFuc2xhdGUubG9jYWxlJCB8IGFzeW5jKSlcbiAgfX1cbiAgPGF1aS1pY29uXG4gICAgY2xhc3M9XCJ0dy1tbC1bLTRweF1cIlxuICAgIGljb249XCJhbmdsZV9kb3duXCJcbiAgICBtYXJnaW49XCJsZWZ0XCJcbiAgPjwvYXVpLWljb24+XG48L2F1aS10YWc+XG5cbjxuZy10ZW1wbGF0ZSAjdG9vbHRpcD5cbiAgPGRpdiBjbGFzcz1cInJhbmdlLXBpY2tlci1wYW5lbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICA8c3BhblxuICAgICAgICAqbmdGb3I9XCJsZXQgcmFuZ2Ugb2YgcmFuZ2VzXCJcbiAgICAgICAgY2xhc3M9XCJjb250cm9sLXJvd1wiXG4gICAgICAgIFtjbGFzcy5hY3RpdmVdPVwicmFuZ2UubGFiZWwgPT09IHNlbGVjdGVkUmFuZ2U/LmxhYmVsXCJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdFJhbmdlKHJhbmdlKVwiXG4gICAgICA+XG4gICAgICAgIHt7XG4gICAgICAgICAgcmFuZ2UuZGlzcGxheVxuICAgICAgICAgICAgPyAocmFuZ2UuZGlzcGxheSB8IHRyYW5zbGF0ZTogcmFuZ2UuZGlzcGxheUN0eClcbiAgICAgICAgICAgIDogKHJhbmdlLmxhYmVsIHwgdHJhbnNsYXRlKVxuICAgICAgICB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicmFuZ2UtcGlja2VyLXdyYXBwZXJcIlxuICAgICAgKm5nSWY9XCJpc0N1c3RvbVwiXG4gICAgPlxuICAgICAgPGF1aS1kYXRlLXJhbmdlLXBpY2tlci1wYW5lbFxuICAgICAgICBbZGlzYWJsZWREYXRlXT1cIm9wdGlvbnMgfCBwdXJlOiBnZXREaXNhYmxlZERhdGVcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInJhbmdlVmFsdWVcIlxuICAgICAgICAoY29uZmlybSk9XCJzdWJtaXRSYW5nZShDVVNUT01fUkFOR0UsIHJhbmdlVmFsdWUpXCJcbiAgICAgICAgKGNsZWFyKT1cInJhbmdlVmFsdWUgPSBbXVwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcIlxuICAgICAgICBbc2hvd1RpbWVdPVwiZmluYWxPcHRpb25zLnRpbWVQaWNrZXJcIlxuICAgICAgICBbZGlzYWJsZWRUaW1lXT1cImVuYWJsZURpc2FibGVUaW1lICYmIGRpc2FibGVkVGltZSgpXCJcbiAgICAgID48L2F1aS1kYXRlLXJhbmdlLXBpY2tlci1wYW5lbD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19