@alauda-fe/common
Version:
Alauda frontend team common codes.
171 lines • 22.7 kB
JavaScript
import { BaseTooltip, coerceAttrBoolean, TooltipTrigger, TooltipType, } from '@alauda/ui';
import { Overlay } from '@angular/cdk/overlay';
import { ChangeDetectorRef, Directive, ElementRef, Input, NgZone, Renderer2, ViewContainerRef, forwardRef, } from '@angular/core';
import { NG_VALIDATORS, } from '@angular/forms';
import { converge, mergeAll } from 'ramda';
import { STRONG_PASSWORD_SPECIAL_CHARS } from '../utils';
import { StrongPasswordTooltipComponent } from './strong-password-tooltip/component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
export class StrongPasswordDirective extends BaseTooltip {
set aclStrongPassword(enabled) {
this._enabled = coerceAttrBoolean(enabled);
}
get aclStrongPassword() {
return this._enabled && !this.disabled;
}
set required(required) {
this._required = coerceAttrBoolean(required);
}
get required() {
return this._required;
}
registerOnValidatorChange(fn) {
this.onValidatorChange = fn;
}
ngOnChanges() {
this.onValidatorChange?.();
}
constructor(overlay, viewContainerRef, elRef, renderer, cdr, ngZone) {
super(overlay, viewContainerRef, elRef, renderer, cdr, ngZone);
this.specialChars = STRONG_PASSWORD_SPECIAL_CHARS;
this.minlength = 8;
this.maxlength = 32;
this.notStartsWith = '';
this.componentClass = StrongPasswordTooltipComponent;
this.validate = (control) => {
const v = control.value ?? '';
const isFocusing = this.elRef.nativeElement === document.activeElement;
if (this.aclStrongPassword && v) {
if (isFocusing) {
this.show();
}
}
else if (!isFocusing || !this.required) {
this.hide();
}
// 必填校验由 required validator 控制
const errors = this.aclStrongPassword && (this.required || v)
? converge((...list) => mergeAll(list), [
this.validateLength,
this.validatePattern,
])(v)
: null;
this.resetContext(errors, v);
return errors;
};
this.validatePattern = (v) => {
if (!v) {
return null;
}
const errors = converge((...list) => mergeAll(list), [
this.validateEnglishChar,
this.validateSpecialChar,
this.validateNumber,
this.validateNotStartsWith,
])(v);
return Object.keys(errors).length ? { pattern: errors } : null;
};
this.validateLength = (v) => {
if (!v || (v.length >= this.minlength && v.length <= this.maxlength)) {
return null;
}
const errors = {};
if (v.length < this.minlength) {
errors.minlength = {
requiredLength: this.minlength,
actualLength: v.length,
};
}
if (v.length > this.maxlength) {
errors.maxlength = {
requiredLength: this.maxlength,
actualLength: v.length,
};
}
return errors;
};
this.validateEnglishChar = (v) => /[A-Za-z]/.test(v) ? null : { needEnglishChar: true };
this.validateNumber = (v) => /\d/.test(v) ? null : { needNumber: true };
this.validateSpecialChar = (v) => {
if (!this.specialChars) {
return null;
}
const chars = this.specialChars.split('').join('\\');
const unexpectedChars = (v.match(new RegExp(`(?![a-zA-Z0-9${chars}]).`, 'g')) ?? []).join('');
return new RegExp(`[${chars}]`, 'g').test(v) && !unexpectedChars
? null
: {
needSpecialChar: {
requiredChars: this.specialChars,
actualChars: unexpectedChars,
},
};
};
this.validateNotStartsWith = (v) => this.notStartsWith && v.startsWith(this.notStartsWith)
? { notStartsWith: this.notStartsWith }
: null;
this.type = TooltipType.Info;
this.position = 'top start';
this.trigger = TooltipTrigger.Focus;
}
onFocus() {
if (!this.aclStrongPassword) {
return;
}
super.onFocus();
}
resetContext(errors, value) {
const length = !!value && !errors?.maxlength && !errors?.minlength;
const englishChar = !!value && !errors?.pattern?.needEnglishChar;
const needNumber = !!value && !errors?.pattern?.needNumber;
const specialChar = !!value && !errors?.pattern?.needSpecialChar;
this.context = {
state: {
length,
englishChar,
specialChar,
number: needNumber,
},
conditions: {
specialChar: this.specialChars,
minLength: this.minlength,
maxLength: this.maxlength,
},
};
}
static { this.ɵfac = function StrongPasswordDirective_Factory(t) { return new (t || StrongPasswordDirective)(i0.ɵɵdirectiveInject(i1.Overlay), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone)); }; }
static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: StrongPasswordDirective, selectors: [["input", "aclStrongPassword", "", "ngModel", ""], ["input", "aclStrongPassword", "", "formControl", ""], ["input", "aclStrongPassword", "", "formControlName", ""]], inputs: { aclStrongPassword: "aclStrongPassword", required: "required", specialChars: "specialChars", minlength: "minlength", maxlength: "maxlength", notStartsWith: "notStartsWith" }, features: [i0.ɵɵProvidersFeature([
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => StrongPasswordDirective),
multi: true,
},
]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature] }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(StrongPasswordDirective, [{
type: Directive,
args: [{
selector: 'input[aclStrongPassword][ngModel],input[aclStrongPassword][formControl],input[aclStrongPassword][formControlName]',
providers: [
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => StrongPasswordDirective),
multi: true,
},
],
}]
}], () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }], { aclStrongPassword: [{
type: Input
}], required: [{
type: Input
}], specialChars: [{
type: Input
}], minlength: [{
type: Input
}], maxlength: [{
type: Input
}], notStartsWith: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Ryb25nLXBhc3N3b3JkLXZhbGlkYXRvci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvZm9ybS92YWxpZGF0b3JzL3N0cm9uZy1wYXNzd29yZC9zdHJvbmctcGFzc3dvcmQtdmFsaWRhdG9yLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsV0FBVyxHQUNaLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLFVBQVUsR0FFWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsYUFBYSxHQUdkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFM0MsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7QUFhckYsTUFBTSxPQUFPLHVCQUNYLFNBQVEsV0FBVztJQUtuQixJQUNJLGlCQUFpQixDQUFDLE9BQXFCO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekMsQ0FBQztJQUlELElBQ0ksUUFBUSxDQUFDLFFBQXNCO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcs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O2lCQUNGO2FBQ0Y7NktBUUssaUJBQWlCO2tCQURwQixLQUFLO1lBWUYsUUFBUTtrQkFEWCxLQUFLO1lBVU4sWUFBWTtrQkFEWCxLQUFLO1lBSU4sU0FBUztrQkFEUixLQUFLO1lBSU4sU0FBUztrQkFEUixLQUFLO1lBSU4sYUFBYTtrQkFEWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmFzZVRvb2x0aXAsXG4gIGNvZXJjZUF0dHJCb29sZWFuLFxuICBUb29sdGlwVHJpZ2dlcixcbiAgVG9vbHRpcFR5cGUsXG59IGZyb20gJ0BhbGF1ZGEvdWknO1xuaW1wb3J0IHsgT3ZlcmxheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgZm9yd2FyZFJlZixcbiAgT25DaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjb252ZXJnZSwgbWVyZ2VBbGwgfSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7IFNUUk9OR19QQVNTV09SRF9TUEVDSUFMX0NIQVJTIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQgeyBTdHJvbmdQYXNzd29yZFRvb2x0aXBDb21wb25lbnQgfSBmcm9tICcuL3N0cm9uZy1wYXNzd29yZC10b29sdGlwL2NvbXBvbmVudCc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAnaW5wdXRbYWNsU3Ryb25nUGFzc3dvcmRdW25nTW9kZWxdLGlucHV0W2FjbFN0cm9uZ1Bhc3N3b3JkXVtmb3JtQ29udHJvbF0saW5wdXRbYWNsU3Ryb25nUGFzc3dvcmRdW2Zvcm1Db250cm9sTmFtZV0nLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU3Ryb25nUGFzc3dvcmREaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU3Ryb25nUGFzc3dvcmREaXJlY3RpdmVcbiAgZXh0ZW5kcyBCYXNlVG9vbHRpcFxuICBpbXBsZW1lbnRzIFZhbGlkYXRvciwgT25DaGFuZ2VzXG57XG4gIHByaXZhdGUgX2VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgc2V0IGFjbFN0cm9uZ1Bhc3N3b3JkKGVuYWJsZWQ6IGJvb2xlYW4gfCAnJykge1xuICAgIHRoaXMuX2VuYWJsZWQgPSBjb2VyY2VBdHRyQm9vbGVhbihlbmFibGVkKTtcbiAgfVxuXG4gIGdldCBhY2xTdHJvbmdQYXNzd29yZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZCAmJiAhdGhpcy5kaXNhYmxlZDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIHNldCByZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbiB8ICcnKSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VBdHRyQm9vbGVhbihyZXF1aXJlZCk7XG4gIH1cblxuICBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgc3BlY2lhbENoYXJzID0gU1RST05HX1BBU1NXT1JEX1NQRUNJQUxfQ0hBUlM7XG5cbiAgQElucHV0KClcbiAgbWlubGVuZ3RoID0gODtcblxuICBASW5wdXQoKVxuICBtYXhsZW5ndGggPSAzMjtcblxuICBASW5wdXQoKVxuICBub3RTdGFydHNXaXRoID0gJyc7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNvbXBvbmVudENsYXNzID0gU3Ryb25nUGFzc3dvcmRUb29sdGlwQ29tcG9uZW50O1xuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlPy4oKTtcbiAgfVxuXG4gIG9uVmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBlbFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PixcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgbmdab25lOiBOZ1pvbmUsXG4gICkge1xuICAgIHN1cGVyKG92ZXJsYXksIHZpZXdDb250YWluZXJSZWYsIGVsUmVmLCByZW5kZXJlciwgY2RyLCBuZ1pvbmUpO1xuICAgIHRoaXMudHlwZSA9IFRvb2x0aXBUeXBlLkluZm87XG4gICAgdGhpcy5wb3NpdGlvbiA9ICd0b3Agc3RhcnQnO1xuICAgIHRoaXMudHJpZ2dlciA9IFRvb2x0aXBUcmlnZ2VyLkZvY3VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFjbFN0cm9uZ1Bhc3N3b3JkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIub25Gb2N1cygpO1xuICB9XG5cbiAgdmFsaWRhdGUgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyA9PiB7XG4gICAgY29uc3Qgdjogc3RyaW5nID0gY29udHJvbC52YWx1ZSA/PyAnJztcblxuICAgIGNvbnN0IGlzRm9jdXNpbmcgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAodGhpcy5hY2xTdHJvbmdQYXNzd29yZCAmJiB2KSB7XG4gICAgICBpZiAoaXNGb2N1c2luZykge1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc0ZvY3VzaW5nIHx8ICF0aGlzLnJlcXVpcmVkKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG5cbiAgICAvLyDlv4XloavmoKHpqoznlLEgcmVxdWlyZWQgdmFsaWRhdG9yIOaOp+WItlxuICAgIGNvbnN0IGVycm9ycyA9XG4gICAgICB0aGlzLmFjbFN0cm9uZ1Bhc3N3b3JkICYmICh0aGlzLnJlcXVpcmVkIHx8IHYpXG4gICAgICAgID8gY29udmVyZ2UoKC4uLmxpc3QpID0+IG1lcmdlQWxsKGxpc3QpLCBbXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlTGVuZ3RoLFxuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhdHRlcm4sXG4gICAgICAgICAgXSBhcyBjb25zdCkodilcbiAgICAgICAgOiBudWxsO1xuXG4gICAgdGhpcy5yZXNldENvbnRleHQoZXJyb3JzLCB2KTtcblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldENvbnRleHQoZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gISF2YWx1ZSAmJiAhZXJyb3JzPy5tYXhsZW5ndGggJiYgIWVycm9ycz8ubWlubGVuZ3RoO1xuICAgIGNvbnN0IGVuZ2xpc2hDaGFyID0gISF2YWx1ZSAmJiAhZXJyb3JzPy5wYXR0ZXJuPy5uZWVkRW5nbGlzaENoYXI7XG4gICAgY29uc3QgbmVlZE51bWJlciA9ICEhdmFsdWUgJiYgIWVycm9ycz8ucGF0dGVybj8ubmVlZE51bWJlcjtcbiAgICBjb25zdCBzcGVjaWFsQ2hhciA9ICEhdmFsdWUgJiYgIWVycm9ycz8ucGF0dGVybj8ubmVlZFNwZWNpYWxDaGFyO1xuXG4gICAgdGhpcy5jb250ZXh0ID0ge1xuICAgICAgc3RhdGU6IHtcbiAgICAgICAgbGVuZ3RoLFxuICAgICAgICBlbmdsaXNoQ2hhcixcbiAgICAgICAgc3BlY2lhbENoYXIsXG4gICAgICAgIG51bWJlcjogbmVlZE51bWJlcixcbiAgICAgIH0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIHNwZWNpYWxDaGFyOiB0aGlzLnNwZWNpYWxDaGFycyxcbiAgICAgICAgbWluTGVuZ3RoOiB0aGlzLm1pbmxlbmd0aCxcbiAgICAgICAgbWF4TGVuZ3RoOiB0aGlzLm1heGxlbmd0aCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdGVQYXR0ZXJuID0gKHY6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgPT4ge1xuICAgIGlmICghdikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gY29udmVyZ2UoKC4uLmxpc3QpID0+IG1lcmdlQWxsKGxpc3QpLCBbXG4gICAgICB0aGlzLnZhbGlkYXRlRW5nbGlzaENoYXIsXG4gICAgICB0aGlzLnZhbGlkYXRlU3BlY2lhbENoYXIsXG4gICAgICB0aGlzLnZhbGlkYXRlTnVtYmVyLFxuICAgICAgdGhpcy52YWxpZGF0ZU5vdFN0YXJ0c1dpdGgsXG4gICAgXSBhcyBjb25zdCkodik7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPyB7IHBhdHRlcm46IGVycm9ycyB9IDogbnVsbDtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRlTGVuZ3RoID0gKHY6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgPT4ge1xuICAgIGlmICghdiB8fCAodi5sZW5ndGggPj0gdGhpcy5taW5sZW5ndGggJiYgdi5sZW5ndGggPD0gdGhpcy5tYXhsZW5ndGgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgPSB7fTtcbiAgICBpZiAodi5sZW5ndGggPCB0aGlzLm1pbmxlbmd0aCkge1xuICAgICAgZXJyb3JzLm1pbmxlbmd0aCA9IHtcbiAgICAgICAgcmVxdWlyZWRMZW5ndGg6IHRoaXMubWlubGVuZ3RoLFxuICAgICAgICBhY3R1YWxMZW5ndGg6IHYubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHYubGVuZ3RoID4gdGhpcy5tYXhsZW5ndGgpIHtcbiAgICAgIGVycm9ycy5tYXhsZW5ndGggPSB7XG4gICAgICAgIHJlcXVpcmVkTGVuZ3RoOiB0aGlzLm1heGxlbmd0aCxcbiAgICAgICAgYWN0dWFsTGVuZ3RoOiB2Lmxlbmd0aCxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0ZUVuZ2xpc2hDaGFyID0gKHY6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgPT5cbiAgICAvW0EtWmEtel0vLnRlc3QodikgPyBudWxsIDogeyBuZWVkRW5nbGlzaENoYXI6IHRydWUgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRlTnVtYmVyID0gKHY6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgPT5cbiAgICAvXFxkLy50ZXN0KHYpID8gbnVsbCA6IHsgbmVlZE51bWJlcjogdHJ1ZSB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdGVTcGVjaWFsQ2hhciA9ICh2OiBzdHJpbmcpOiBWYWxpZGF0aW9uRXJyb3JzID0+IHtcbiAgICBpZiAoIXRoaXMuc3BlY2lhbENoYXJzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY2hhcnMgPSB0aGlzLnNwZWNpYWxDaGFycy5zcGxpdCgnJykuam9pbignXFxcXCcpO1xuICAgIGNvbnN0IHVuZXhwZWN0ZWRDaGFycyA9IChcbiAgICAgIHYubWF0Y2gobmV3IFJlZ0V4cChgKD8hW2EtekEtWjAtOSR7Y2hhcnN9XSkuYCwgJ2cnKSkgPz8gW11cbiAgICApLmpvaW4oJycpO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBbJHtjaGFyc31dYCwgJ2cnKS50ZXN0KHYpICYmICF1bmV4cGVjdGVkQ2hhcnNcbiAgICAgID8gbnVsbFxuICAgICAgOiB7XG4gICAgICAgICAgbmVlZFNwZWNpYWxDaGFyOiB7XG4gICAgICAgICAgICByZXF1aXJlZENoYXJzOiB0aGlzLnNwZWNpYWxDaGFycyxcbiAgICAgICAgICAgIGFjdHVhbENoYXJzOiB1bmV4cGVjdGVkQ2hhcnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRlTm90U3RhcnRzV2l0aCA9ICh2OiBzdHJpbmcpOiBWYWxpZGF0aW9uRXJyb3JzID0+XG4gICAgdGhpcy5ub3RTdGFydHNXaXRoICYmIHYuc3RhcnRzV2l0aCh0aGlzLm5vdFN0YXJ0c1dpdGgpXG4gICAgICA/IHsgbm90U3RhcnRzV2l0aDogdGhpcy5ub3RTdGFydHNXaXRoIH1cbiAgICAgIDogbnVsbDtcbn1cbiJdfQ==