@alauda-fe/common
Version:
Alauda frontend team common codes.
318 lines • 45.7 kB
JavaScript
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