@alauda-fe/common
Version:
Alauda frontend team common codes.
212 lines • 27 kB
JavaScript
import { FORM_MODULE, SelectModule, TooltipDirective, } from '@alauda/ui';
import { AsyncPipe, NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter, forwardRef, TemplateRef, ChangeDetectorRef, } from '@angular/core';
import { FormsModule, NG_VALUE_ACCESSOR, } from '@angular/forms';
import { BehaviorSubject } from 'rxjs';
import { PurePipe, noop } from '../../core/public-api';
import { EffectDirectiveModule } from '../../effect-directive/module';
import { TranslateModule } from '../../translate/public-api';
import { SelectPrefixLabelDirective } from '../../widget/select-prefix-label/directive';
import { DEFAULT_LIMIT_COUNT, ALL_VALUE, checkValueExit } from './util';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../../translate/translate.pipe";
import * as i3 from "@alauda/ui";
import * as i4 from "../../effect-directive/e2e-attribute-binding.directive";
import * as i5 from "../../effect-directive/validators.directive";
const _c0 = a0 => ({ count: a0 });
const _c1 = a0 => ({ $implicit: a0 });
const _c2 = a0 => ({ resource: a0 });
const _c3 = a0 => ({ resource: a0, inOption: true });
function ResourceMultiSelectComponent_aui_option_group_3_ng_container_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function ResourceMultiSelectComponent_aui_option_group_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-option-group")(1, "aui-option", 3);
i0.ɵɵtemplate(2, ResourceMultiSelectComponent_aui_option_group_3_ng_container_2_Template, 1, 0, "ng-container", 4);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance();
i0.ɵɵproperty("value", ctx_r0.ALL_VALUE)("label", ctx_r0.allOptionTemplate);
i0.ɵɵadvance();
i0.ɵɵproperty("ngTemplateOutlet", ctx_r0.allOptionTemplate)("ngTemplateOutletContext", i0.ɵɵpureFunction1(4, _c1, ctx_r0.allOptionTemplateContext));
} }
function ResourceMultiSelectComponent_aui_option_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-option", 5);
i0.ɵɵpipe(1, "async");
i0.ɵɵpipe(2, "pure");
i0.ɵɵpipe(3, "translate");
i0.ɵɵelementContainer(4, 6);
i0.ɵɵelementEnd();
} if (rf & 2) {
const option_r2 = ctx.$implicit;
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵproperty("value", option_r2)("label", ctx_r0.optionTemplate)("disabled", i0.ɵɵpipeBind3(2, 10, option_r2, ctx_r0.disableOption, i0.ɵɵpipeBind1(1, 8, ctx_r0.values$$)))("auiTooltip", i0.ɵɵpipeBind2(3, 14, "multi_select_limit", i0.ɵɵpureFunction1(17, _c0, ctx_r0.limit)))("auiTooltipDisabled", !ctx_r0.countLimited ? true : !ctx_r0.isPartial)("labelContext", i0.ɵɵpureFunction1(19, _c2, option_r2));
i0.ɵɵadvance(4);
i0.ɵɵproperty("ngTemplateOutlet", ctx_r0.optionTemplate)("ngTemplateOutletContext", i0.ɵɵpureFunction1(21, _c3, option_r2));
} }
export class ResourceMultiSelectComponent {
constructor(cdr) {
this.cdr = cdr;
this.limit = DEFAULT_LIMIT_COUNT;
this.disabled = false;
this.required = false;
this.readonly = false;
this.placeholder = '';
this.countLimited = true;
this.filter = (filter, option) => option.value?.includes(filter);
this.trackBy = (val) => val;
this.allowEmpty = false;
this.valueChange = new EventEmitter();
this.values$$ = new BehaviorSubject([]);
this.values = [];
this.isSelectAllOption = false;
this.isPartial = false;
this.ALL_VALUE = ALL_VALUE;
this.onChange = noop;
this.onTouched = noop;
this.disableOption = (checkedValue, values) => {
this.isPartial = false;
if (!checkedValue) {
return false;
}
if (this.isSelectAllOption) {
return true;
}
// 如果不限制个数直接返回 false
if (!this.countLimited) {
return false;
}
if (values?.length === this.limit && values?.length < this.list?.length) {
this.isPartial = true;
return !checkValueExit(checkedValue, values);
}
return false;
};
this.filterFn = (filter, option) => {
const value = option.value;
if (value === ALL_VALUE) {
return true;
}
return this.filter?.(filter, option);
};
this.trackByFn = (value) => {
if (value === ALL_VALUE) {
return ALL_VALUE;
}
return this.trackBy?.(value);
};
}
writeValue(values) {
this.values$$.next(values);
this.isSelectAllOption = checkValueExit(ALL_VALUE, values);
this.cdr.markForCheck();
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
onValueChange(values) {
this.isSelectAllOption = checkValueExit(ALL_VALUE, values);
const currentValue = this.isSelectAllOption
? [ALL_VALUE]
: values;
this.values$$.next(currentValue);
this.valueChange.emit(currentValue);
this.onChange(currentValue);
this.onTouched();
}
static { this.ɵfac = function ResourceMultiSelectComponent_Factory(t) { return new (t || ResourceMultiSelectComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ResourceMultiSelectComponent, selectors: [["acl-resource-multi-select"]], inputs: { list: "list", limit: "limit", prefixLabel: "prefixLabel", disabled: "disabled", required: "required", readonly: "readonly", allOptionTemplate: "allOptionTemplate", allOptionTemplateContext: "allOptionTemplateContext", optionTemplate: "optionTemplate", placeholder: "placeholder", countLimited: "countLimited", filter: "filter", trackBy: "trackBy", allowEmpty: "allowEmpty" }, outputs: { valueChange: "valueChange" }, standalone: true, features: [i0.ɵɵProvidersFeature([
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => ResourceMultiSelectComponent),
multi: true,
},
]), i0.ɵɵStandaloneFeature], decls: 9, vars: 23, consts: [["auiFormItemControl", "", 3, "ngModelChange", "ngModel", "filterFn", "trackFn", "aclPrefixLabel", "placeholder", "maxRowCount", "disabled", "required", "readonly", "filterable", "clearable"], [4, "ngIf"], [3, "value", "label", "disabled", "auiTooltip", "auiTooltipDisabled", "labelContext", 4, "ngFor", "ngForOf"], [3, "value", "label"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [3, "value", "label", "disabled", "auiTooltip", "auiTooltipDisabled", "labelContext"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function ResourceMultiSelectComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-multi-select", 0);
i0.ɵɵpipe(1, "async");
i0.ɵɵpipe(2, "translate");
i0.ɵɵlistener("ngModelChange", function ResourceMultiSelectComponent_Template_aui_multi_select_ngModelChange_0_listener($event) { return ctx.onValueChange($event); });
i0.ɵɵtemplate(3, ResourceMultiSelectComponent_aui_option_group_3_Template, 3, 6, "aui-option-group", 1);
i0.ɵɵelementStart(4, "aui-option-group");
i0.ɵɵtemplate(5, ResourceMultiSelectComponent_aui_option_5_Template, 5, 23, "aui-option", 2);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(6, "aui-option-placeholder");
i0.ɵɵtext(7);
i0.ɵɵpipe(8, "translate");
i0.ɵɵelementEnd()();
} if (rf & 2) {
i0.ɵɵproperty("ngModel", i0.ɵɵpipeBind1(1, 14, ctx.values$$))("filterFn", ctx.filterFn)("trackFn", ctx.trackByFn)("aclPrefixLabel", ctx.prefixLabel)("placeholder", ctx.placeholder || ctx.countLimited ? i0.ɵɵpipeBind2(2, 16, "multi_select_limit", i0.ɵɵpureFunction1(21, _c0, ctx.limit)) : "")("maxRowCount", 6)("disabled", ctx.disabled)("required", ctx.required)("readonly", ctx.readonly)("filterable", true)("clearable", true);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngIf", ctx.allOptionTemplate && (ctx.list == null ? null : ctx.list.length) || ctx.allowEmpty);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", ctx.list);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 19, "no_data"), " ");
} }, dependencies: [FormsModule, i1.NgControlStatus, i1.RequiredValidator, i1.NgModel, AsyncPipe,
NgIf,
TranslateModule, i2.TranslatePipe, SelectModule, i3.OptionComponent, i3.OptionGroupComponent, i3.OptionPlaceholderComponent, i3.MultiSelectComponent, NgForOf,
NgTemplateOutlet,
PurePipe,
TooltipDirective, i3.FormItemControlDirective, SelectPrefixLabelDirective,
EffectDirectiveModule, i4.E2eAttributeBindingDirective, i5.ValidatorsDirective], encapsulation: 2, changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResourceMultiSelectComponent, [{
type: Component,
args: [{ selector: 'acl-resource-multi-select', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => ResourceMultiSelectComponent),
multi: true,
},
], standalone: true, imports: [
FormsModule,
AsyncPipe,
NgIf,
TranslateModule,
SelectModule,
NgForOf,
NgTemplateOutlet,
PurePipe,
TooltipDirective,
...FORM_MODULE,
SelectPrefixLabelDirective,
EffectDirectiveModule,
], template: "<aui-multi-select\n [ngModel]=\"values$$ | async\"\n auiFormItemControl\n [filterFn]=\"filterFn\"\n [trackFn]=\"trackByFn\"\n (ngModelChange)=\"onValueChange($event)\"\n [aclPrefixLabel]=\"prefixLabel\"\n [placeholder]=\"\n placeholder || countLimited\n ? ('multi_select_limit' | translate: { count: limit })\n : ''\n \"\n [maxRowCount]=\"6\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [filterable]=\"true\"\n [clearable]=\"true\"\n>\n <aui-option-group *ngIf=\"(allOptionTemplate && list?.length) || allowEmpty\">\n <aui-option\n [value]=\"ALL_VALUE\"\n [label]=\"allOptionTemplate\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n allOptionTemplate;\n context: { $implicit: allOptionTemplateContext }\n \"\n ></ng-container>\n </aui-option>\n </aui-option-group>\n\n <aui-option-group>\n <aui-option\n *ngFor=\"let option of list\"\n [value]=\"option\"\n [label]=\"optionTemplate\"\n [disabled]=\"option | pure: disableOption:(values$$ | async)\"\n [auiTooltip]=\"'multi_select_limit' | translate: { count: limit }\"\n [auiTooltipDisabled]=\"!countLimited ? true : !isPartial\"\n [labelContext]=\"{ resource: option }\"\n >\n <ng-container\n [ngTemplateOutlet]=\"optionTemplate\"\n [ngTemplateOutletContext]=\"{ resource: option, inOption: true }\"\n ></ng-container>\n </aui-option>\n </aui-option-group>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n</aui-multi-select>\n" }]
}], () => [{ type: i0.ChangeDetectorRef }], { list: [{
type: Input
}], limit: [{
type: Input
}], prefixLabel: [{
type: Input
}], disabled: [{
type: Input
}], required: [{
type: Input
}], readonly: [{
type: Input
}], allOptionTemplate: [{
type: Input
}], allOptionTemplateContext: [{
type: Input
}], optionTemplate: [{
type: Input
}], placeholder: [{
type: Input
}], countLimited: [{
type: Input
}], filter: [{
type: Input
}], trackBy: [{
type: Input
}], allowEmpty: [{
type: Input
}], valueChange: [{
type: Output
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ResourceMultiSelectComponent, { className: "ResourceMultiSelectComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3dpZGdldC9yZXNvdXJjZS1tdWx0aS1zZWxlY3QvY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3dpZGdldC9yZXNvdXJjZS1tdWx0aS1zZWxlY3QvdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUdYLFlBQVksRUFDWixnQkFBZ0IsR0FFakIsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0UsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFdBQVcsRUFDWCxpQkFBaUIsR0FDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxRQUFRLEVBQWEsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXhGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7SUNQbEUsd0JBS2dCOzs7SUFUbEIsQUFERix3Q0FBNEUsb0JBSXpFO0lBQ0Ms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UTtrQkFEUCxLQUFLO1lBSU4sUUFBUTtrQkFEUCxLQUFLO1lBSU4saUJBQWlCO2tCQURoQixLQUFLO1lBSU4sd0JBQXdCO2tCQUR2QixLQUFLO1lBSU4sY0FBYztrQkFEYixLQUFLO1lBSU4sV0FBVztrQkFEVixLQUFLO1lBSU4sWUFBWTtrQkFEWCxLQUFLO1lBSU4sTUFBTTtrQkFETCxLQUFLO1lBT04sT0FBTztrQkFETixLQUFLO1lBSU4sVUFBVTtrQkFEVCxLQUFLO1lBSU4sV0FBVztrQkFEVixNQUFNOztrRkE5Q0ksNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRk9STV9NT0RVTEUsXG4gIE9wdGlvbkZpbHRlckZuLFxuICBTZWxlY3RGaWx0ZXJPcHRpb24sXG4gIFNlbGVjdE1vZHVsZSxcbiAgVG9vbHRpcERpcmVjdGl2ZSxcbiAgVHJhY2tGbixcbn0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1zTW9kdWxlLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFB1cmVQaXBlLCBTdHJpbmdNYXAsIG5vb3AgfSBmcm9tICcuLi8uLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgRWZmZWN0RGlyZWN0aXZlTW9kdWxlIH0gZnJvbSAnLi4vLi4vZWZmZWN0LWRpcmVjdGl2ZS9tb2R1bGUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnLi4vLi4vdHJhbnNsYXRlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgU2VsZWN0UHJlZml4TGFiZWxEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi93aWRnZXQvc2VsZWN0LXByZWZpeC1sYWJlbC9kaXJlY3RpdmUnO1xuXG5pbXBvcnQgeyBERUZBVUxUX0xJTUlUX0NPVU5ULCBBTExfVkFMVUUsIGNoZWNrVmFsdWVFeGl0IH0gZnJvbSAnLi91dGlsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLXJlc291cmNlLW11bHRpLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmVzb3VyY2VNdWx0aVNlbGVjdENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgQXN5bmNQaXBlLFxuICAgIE5nSWYsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIFNlbGVjdE1vZHVsZSxcbiAgICBOZ0Zvck9mLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgUHVyZVBpcGUsXG4gICAgVG9vbHRpcERpcmVjdGl2ZSxcbiAgICAuLi5GT1JNX01PRFVMRSxcbiAgICBTZWxlY3RQcmVmaXhMYWJlbERpcmVjdGl2ZSxcbiAgICBFZmZlY3REaXJlY3RpdmVNb2R1bGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFJlc291cmNlTXVsdGlTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpXG4gIGxpc3Q6IHN0cmluZ1tdO1xuXG4gIEBJbnB1dCgpXG4gIGxpbWl0OiBudW1iZXIgPSBERUZBVUxUX0xJTUlUX0NPVU5UO1xuXG4gIEBJbnB1dCgpXG4gIHByZWZpeExhYmVsOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICByZXF1aXJlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgYWxsT3B0aW9uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KClcbiAgYWxsT3B0aW9uVGVtcGxhdGVDb250ZXh0OiBTdHJpbmdNYXA7XG5cbiAgQElucHV0KClcbiAgb3B0aW9uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KClcbiAgcGxhY2Vob2xkZXIgPSAnJztcblxuICBASW5wdXQoKVxuICBjb3VudExpbWl0ZWQgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGZpbHRlcjogT3B0aW9uRmlsdGVyRm48c3RyaW5nPiA9IChcbiAgICBmaWx0ZXI6IHN0cmluZyxcbiAgICBvcHRpb246IFNlbGVjdEZpbHRlck9wdGlvbjxzdHJpbmc+LFxuICApID0+IG9wdGlvbi52YWx1ZT8uaW5jbHVkZXMoZmlsdGVyKTtcblxuICBASW5wdXQoKVxuICB0cmFja0J5OiBUcmFja0ZuPHN0cmluZz4gPSAodmFsOiBzdHJpbmcpID0+IHZhbDtcblxuICBASW5wdXQoKVxuICBhbGxvd0VtcHR5ID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpXG4gIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcblxuICB2YWx1ZXMkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcbiAgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBpc1NlbGVjdEFsbE9wdGlvbiA9IGZhbHNlO1xuICBpc1BhcnRpYWwgPSBmYWxzZTtcbiAgQUxMX1ZBTFVFID0gQUxMX1ZBTFVFO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICB3cml0ZVZhbHVlKHZhbHVlczogc3RyaW5nW10pIHtcbiAgICB0aGlzLnZhbHVlcyQkLm5leHQodmFsdWVzKTtcbiAgICB0aGlzLmlzU2VsZWN0QWxsT3B0aW9uID0gY2hlY2tWYWx1ZUV4aXQoQUxMX1ZBTFVFIGFzIHN0cmluZywgdmFsdWVzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ2hhbmdlID0gbm9vcDtcblxuICBvblRvdWNoZWQgPSBub29wO1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBkaXNhYmxlT3B0aW9uID0gKGNoZWNrZWRWYWx1ZTogc3RyaW5nLCB2YWx1ZXM6IHN0cmluZ1tdKSA9PiB7XG4gICAgdGhpcy5pc1BhcnRpYWwgPSBmYWxzZTtcbiAgICBpZiAoIWNoZWNrZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU2VsZWN0QWxsT3B0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8g5aaC5p6c5LiN6ZmQ5Yi25Liq5pWw55u05o6l6L+U5ZueIGZhbHNlXG4gICAgaWYgKCF0aGlzLmNvdW50TGltaXRlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodmFsdWVzPy5sZW5ndGggPT09IHRoaXMubGltaXQgJiYgdmFsdWVzPy5sZW5ndGggPCB0aGlzLmxpc3Q/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5pc1BhcnRpYWwgPSB0cnVlO1xuICAgICAgcmV0dXJuICFjaGVja1ZhbHVlRXhpdChjaGVja2VkVmFsdWUsIHZhbHVlcyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBvblZhbHVlQ2hhbmdlKHZhbHVlczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmlzU2VsZWN0QWxsT3B0aW9uID0gY2hlY2tWYWx1ZUV4aXQoQUxMX1ZBTFVFIGFzIHN0cmluZywgdmFsdWVzKTtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmlzU2VsZWN0QWxsT3B0aW9uXG4gICAgICA/IFtBTExfVkFMVUUgYXMgc3RyaW5nXVxuICAgICAgOiB2YWx1ZXM7XG4gICAgdGhpcy52YWx1ZXMkJC5uZXh0KGN1cnJlbnRWYWx1ZSk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGN1cnJlbnRWYWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZShjdXJyZW50VmFsdWUpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBmaWx0ZXJGbiA9IChmaWx0ZXI6IHN0cmluZywgb3B0aW9uOiBTZWxlY3RGaWx0ZXJPcHRpb248c3RyaW5nPikgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uLnZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gQUxMX1ZBTFVFKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyPy4oZmlsdGVyLCBvcHRpb24pO1xuICB9O1xuXG4gIHRyYWNrQnlGbiA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBBTExfVkFMVUUpIHtcbiAgICAgIHJldHVybiBBTExfVkFMVUU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYWNrQnk/Lih2YWx1ZSk7XG4gIH07XG59XG4iLCI8YXVpLW11bHRpLXNlbGVjdFxuICBbbmdNb2RlbF09XCJ2YWx1ZXMkJCB8IGFzeW5jXCJcbiAgYXVpRm9ybUl0ZW1Db250cm9sXG4gIFtmaWx0ZXJGbl09XCJmaWx0ZXJGblwiXG4gIFt0cmFja0ZuXT1cInRyYWNrQnlGblwiXG4gIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gIFthY2xQcmVmaXhMYWJlbF09XCJwcmVmaXhMYWJlbFwiXG4gIFtwbGFjZWhvbGRlcl09XCJcbiAgICBwbGFjZWhvbGRlciB8fCBjb3VudExpbWl0ZWRcbiAgICAgID8gKCdtdWx0aV9zZWxlY3RfbGltaXQnIHwgdHJhbnNsYXRlOiB7IGNvdW50OiBsaW1pdCB9KVxuICAgICAgOiAnJ1xuICBcIlxuICBbbWF4Um93Q291bnRdPVwiNlwiXG4gIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gIFtmaWx0ZXJhYmxlXT1cInRydWVcIlxuICBbY2xlYXJhYmxlXT1cInRydWVcIlxuPlxuICA8YXVpLW9wdGlvbi1ncm91cCAqbmdJZj1cIihhbGxPcHRpb25UZW1wbGF0ZSAmJiBsaXN0Py5sZW5ndGgpIHx8IGFsbG93RW1wdHlcIj5cbiAgICA8YXVpLW9wdGlvblxuICAgICAgW3ZhbHVlXT1cIkFMTF9WQUxVRVwiXG4gICAgICBbbGFiZWxdPVwiYWxsT3B0aW9uVGVtcGxhdGVcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICBhbGxPcHRpb25UZW1wbGF0ZTtcbiAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogYWxsT3B0aW9uVGVtcGxhdGVDb250ZXh0IH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2F1aS1vcHRpb24+XG4gIDwvYXVpLW9wdGlvbi1ncm91cD5cblxuICA8YXVpLW9wdGlvbi1ncm91cD5cbiAgICA8YXVpLW9wdGlvblxuICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBsaXN0XCJcbiAgICAgIFt2YWx1ZV09XCJvcHRpb25cIlxuICAgICAgW2xhYmVsXT1cIm9wdGlvblRlbXBsYXRlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24gfCBwdXJlOiBkaXNhYmxlT3B0aW9uOih2YWx1ZXMkJCB8IGFzeW5jKVwiXG4gICAgICBbYXVpVG9vbHRpcF09XCInbXVsdGlfc2VsZWN0X2xpbWl0JyB8IHRyYW5zbGF0ZTogeyBjb3VudDogbGltaXQgfVwiXG4gICAgICBbYXVpVG9vbHRpcERpc2FibGVkXT1cIiFjb3VudExpbWl0ZWQgPyB0cnVlIDogIWlzUGFydGlhbFwiXG4gICAgICBbbGFiZWxDb250ZXh0XT1cInsgcmVzb3VyY2U6IG9wdGlvbiB9XCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvblRlbXBsYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcmVzb3VyY2U6IG9wdGlvbiwgaW5PcHRpb246IHRydWUgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9hdWktb3B0aW9uPlxuICA8L2F1aS1vcHRpb24tZ3JvdXA+XG4gIDxhdWktb3B0aW9uLXBsYWNlaG9sZGVyPlxuICAgIHt7ICdub19kYXRhJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2F1aS1vcHRpb24tcGxhY2Vob2xkZXI+XG48L2F1aS1tdWx0aS1zZWxlY3Q+XG4iXX0=