@taiga-ui/kit
Version:
Taiga UI Angular main components kit
160 lines • 20.2 kB
JavaScript
import { __decorate, __param } from "tslib";
import { ChangeDetectorRef, Component, Inject, Input, OnDestroy, OnInit, Optional, Self, } from '@angular/core';
import { AbstractControl, FormArrayName, FormGroupDirective, FormGroupName, NgControl, } from '@angular/forms';
import { tuiAssert, tuiRequiredSetter, TuiValidationError } from '@taiga-ui/cdk';
import { tuiFadeIn, tuiHeightCollapse } from '@taiga-ui/core';
import { TUI_VALIDATION_ERRORS } from '@taiga-ui/kit/tokens';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
// TODO: Refactor
// @dynamic
let TuiFieldErrorComponent = class TuiFieldErrorComponent {
constructor(ngControl, formArrayName, formGroupName, formGroup, changeDetectorRef, validationErrors) {
this.ngControl = ngControl;
this.formArrayName = formArrayName;
this.formGroupName = formGroupName;
this.formGroup = formGroup;
this.changeDetectorRef = changeDetectorRef;
this.validationErrors = validationErrors;
this.firstError = null;
this.errorsOrder = [];
this.destroy$ = new Subject();
tuiAssert.assert(!!this.ngControl, `NgControl not injected in ${this.constructor.name}!` +
' Use [(ngModel)] or [formControl] or formControlName for correct work.');
if (this.ngControl) {
this.ngControl.valueAccessor = this;
}
}
set order(value) {
this.errorsOrder = value;
this.updateErrorText();
}
ngOnInit() {
const control = this.control;
if (!control) {
return;
}
// Temporary workaround until issue with async validators will be resolved.
// https://github.com/angular/angular/issues/13200
if (control.asyncValidator) {
control.updateValueAndValidity();
}
this.updateErrorText();
control.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {
this.updateErrorText();
});
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
get computedError() {
return this.invalid && this.touched && this.firstError ? this.firstError : null;
}
get invalid() {
const control = this.control;
return control && control.invalid !== null ? control.invalid : false;
}
get touched() {
const control = this.control;
return control && control.touched !== null ? control.touched : false;
}
get control() {
if (this.ngControl) {
return this.ngControl.control;
}
if (this.formArrayName) {
return this.formArrayName.control;
}
if (this.formGroupName) {
return this.formGroupName.control;
}
if (this.formGroup) {
return this.formGroup.control;
}
return null;
}
registerOnChange() {
this.markForCheck();
}
registerOnTouched() {
this.markForCheck();
}
setDisabledState() {
this.markForCheck();
}
writeValue() {
this.markForCheck();
}
get firstErrorIdByOrder() {
const firstErrorId = this.errorsOrder &&
this.errorsOrder.find(errorId => !!this.controlErrors[errorId]);
return firstErrorId || null;
}
get firstErrorId() {
const errorIds = Object.keys(this.controlErrors);
return errorIds[0];
}
get controlErrors() {
const control = this.control;
return (control && control.errors) || {};
}
updateErrorText() {
this.firstError = this.getErrorText();
}
getErrorText() {
const firstErrorId = this.firstErrorIdByOrder || this.firstErrorId;
const firstError = firstErrorId && this.controlErrors[firstErrorId];
// @bad TODO: Remove firstError.message check after everybody migrates to TuiValidationError
if (firstError &&
(firstError instanceof TuiValidationError ||
typeof firstError.message === 'string')) {
return firstError;
}
return firstErrorId
? new TuiValidationError(this.validationErrors[firstErrorId], firstError)
: null;
}
markForCheck() {
this.changeDetectorRef.markForCheck();
}
};
TuiFieldErrorComponent.ctorParameters = () => [
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgControl,] }] },
{ type: FormArrayName, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [FormArrayName,] }] },
{ type: FormGroupName, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [FormGroupName,] }] },
{ type: FormGroupDirective, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [FormGroupDirective,] }] },
{ type: ChangeDetectorRef, decorators: [{ type: Inject, args: [ChangeDetectorRef,] }] },
{ type: undefined, decorators: [{ type: Inject, args: [TUI_VALIDATION_ERRORS,] }] }
];
__decorate([
Input(),
tuiRequiredSetter()
], TuiFieldErrorComponent.prototype, "order", null);
TuiFieldErrorComponent = __decorate([
Component({
selector: 'tui-field-error',
// @bad TODO: find a way to get 'touched' state change
// https://github.com/angular/angular/issues/10887
// changeDetection: ChangeDetectionStrategy.OnPush,
template: "<tui-error [error]=\"computedError\"></tui-error>\n",
animations: [tuiHeightCollapse, tuiFadeIn],
styles: [":host{display:block}"]
}),
__param(0, Optional()),
__param(0, Self()),
__param(0, Inject(NgControl)),
__param(1, Optional()),
__param(1, Self()),
__param(1, Inject(FormArrayName)),
__param(2, Optional()),
__param(2, Self()),
__param(2, Inject(FormGroupName)),
__param(3, Optional()),
__param(3, Self()),
__param(3, Inject(FormGroupDirective)),
__param(4, Inject(ChangeDetectorRef)),
__param(5, Inject(TUI_VALIDATION_ERRORS))
], TuiFieldErrorComponent);
export { TuiFieldErrorComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtZXJyb3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL2ZpZWxkLWVycm9yLyIsInNvdXJjZXMiOlsiZmllbGQtZXJyb3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sUUFBUSxFQUNSLElBQUksR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsZUFBZSxFQUNmLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLFNBQVMsR0FDWixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTNELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXpDLGlCQUFpQjtBQUNqQixXQUFXO0FBVVgsSUFBYSxzQkFBc0IsR0FBbkMsTUFBYSxzQkFBc0I7SUFZL0IsWUFJWSxTQUEyQixFQUkzQixhQUFtQyxFQUluQyxhQUFtQyxFQUluQyxTQUFvQyxFQUNULGlCQUFvQyxFQUV0RCxnQkFBcUQ7UUFmOUQsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFJM0Isa0JBQWEsR0FBYixhQUFhLENBQXNCO1FBSW5DLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUluQyxjQUFTLEdBQVQsU0FBUyxDQUEyQjtRQUNULHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFFdEQs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QUMsQ0FBQTtJQUVyQixXQUFBLFFBQVEsRUFBRSxDQUFBO0lBQ1YsV0FBQSxJQUFJLEVBQUUsQ0FBQTtJQUNOLFdBQUEsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRXJCLFdBQUEsUUFBUSxFQUFFLENBQUE7SUFDVixXQUFBLElBQUksRUFBRSxDQUFBO0lBQ04sV0FBQSxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUUxQixXQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQ3pCLFdBQUEsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUE7R0E5QnpCLHNCQUFzQixDQXNLbEM7U0F0S1ksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgU2VsZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q29udHJvbCxcbiAgICBGb3JtQXJyYXlOYW1lLFxuICAgIEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBGb3JtR3JvdXBOYW1lLFxuICAgIE5nQ29udHJvbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHt0dWlBc3NlcnQsIHR1aVJlcXVpcmVkU2V0dGVyLCBUdWlWYWxpZGF0aW9uRXJyb3J9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHt0dWlGYWRlSW4sIHR1aUhlaWdodENvbGxhcHNlfSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQge1RVSV9WQUxJREFUSU9OX0VSUk9SU30gZnJvbSAnQHRhaWdhLXVpL2tpdC90b2tlbnMnO1xuaW1wb3J0IHtQb2x5bW9ycGhldXNDb250ZW50fSBmcm9tICdAdGlua29mZi9uZy1wb2x5bW9ycGhldXMnO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7dGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8vIFRPRE86IFJlZmFjdG9yXG4vLyBAZHluYW1pY1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0dWktZmllbGQtZXJyb3InLFxuICAgIC8vIEBiYWQgVE9ETzogZmluZCBhIHdheSB0byBnZXQgJ3RvdWNoZWQnIHN0YXRlIGNoYW5nZVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEwODg3XG4gICAgLy8gY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpZWxkLWVycm9yLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2ZpZWxkLWVycm9yLnN0eWxlLmxlc3MnXSxcbiAgICBhbmltYXRpb25zOiBbdHVpSGVpZ2h0Q29sbGFwc2UsIHR1aUZhZGVJbl0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aUZpZWxkRXJyb3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KClcbiAgICBAdHVpUmVxdWlyZWRTZXR0ZXIoKVxuICAgIHNldCBvcmRlcih2YWx1ZTogcmVhZG9ubHkgc3RyaW5nW10pIHtcbiAgICAgICAgdGhpcy5lcnJvcnNPcmRlciA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZUVycm9yVGV4dCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlyc3RFcnJvcjogVHVpVmFsaWRhdGlvbkVycm9yIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBlcnJvcnNPcmRlcjogcmVhZG9ubHkgc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBAU2VsZigpXG4gICAgICAgIEBJbmplY3QoTmdDb250cm9sKVxuICAgICAgICBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbCxcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQFNlbGYoKVxuICAgICAgICBASW5qZWN0KEZvcm1BcnJheU5hbWUpXG4gICAgICAgIHByaXZhdGUgZm9ybUFycmF5TmFtZTogRm9ybUFycmF5TmFtZSB8IG51bGwsXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBTZWxmKClcbiAgICAgICAgQEluamVjdChGb3JtR3JvdXBOYW1lKVxuICAgICAgICBwcml2YXRlIGZvcm1Hcm91cE5hbWU6IEZvcm1Hcm91cE5hbWUgfCBudWxsLFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBAU2VsZigpXG4gICAgICAgIEBJbmplY3QoRm9ybUdyb3VwRGlyZWN0aXZlKVxuICAgICAgICBwcml2YXRlIGZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlIHwgbnVsbCxcbiAgICAgICAgQEluamVjdChDaGFuZ2VEZXRlY3RvclJlZikgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBJbmplY3QoVFVJX1ZBTElEQVRJT05fRVJST1JTKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRpb25FcnJvcnM6IFJlY29yZDxzdHJpbmcsIFBvbHltb3JwaGV1c0NvbnRlbnQ+LFxuICAgICkge1xuICAgICAgICB0dWlBc3NlcnQuYXNzZXJ0KFxuICAgICAgICAgICAgISF0aGlzLm5nQ29udHJvbCxcbiAgICAgICAgICAgIGBOZ0NvbnRyb2wgbm90IGluamVjdGVkIGluICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSFgICtcbiAgICAgICAgICAgICAgICAnIFVzZSBbKG5nTW9kZWwpXSBvciBbZm9ybUNvbnRyb2xdIG9yIGZvcm1Db250cm9sTmFtZSBmb3IgY29ycmVjdCB3b3JrLicsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9sO1xuXG4gICAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGVtcG9yYXJ5IHdvcmthcm91bmQgdW50aWwgaXNzdWUgd2l0aCBhc3luYyB2YWxpZGF0b3JzIHdpbGwgYmUgcmVzb2x2ZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzMjAwXG4gICAgICAgIGlmIChjb250cm9sLmFzeW5jVmFsaWRhdG9yKSB7XG4gICAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlRXJyb3JUZXh0KCk7XG5cbiAgICAgICAgY29udHJvbC5zdGF0dXNDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFcnJvclRleHQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbXB1dGVkRXJyb3IoKTogVHVpVmFsaWRhdGlvbkVycm9yIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmludmFsaWQgJiYgdGhpcy50b3VjaGVkICYmIHRoaXMuZmlyc3RFcnJvciA/IHRoaXMuZmlyc3RFcnJvciA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2w7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICE9PSBudWxsID8gY29udHJvbC5pbnZhbGlkIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2w7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRyb2wgJiYgY29udHJvbC50b3VjaGVkICE9PSBudWxsID8gY29udHJvbC50b3VjaGVkIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmdDb250cm9sLmNvbnRyb2w7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtQXJyYXlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtQXJyYXlOYW1lLmNvbnRyb2w7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXBOYW1lLmNvbnRyb2w7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5jb250cm9sO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZCgpIHtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBzZXREaXNhYmxlZFN0YXRlKCkge1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUoKSB7XG4gICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZmlyc3RFcnJvcklkQnlPcmRlcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZmlyc3RFcnJvcklkID1cbiAgICAgICAgICAgIHRoaXMuZXJyb3JzT3JkZXIgJiZcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzT3JkZXIuZmluZChlcnJvcklkID0+ICEhdGhpcy5jb250cm9sRXJyb3JzW2Vycm9ySWRdKTtcblxuICAgICAgICByZXR1cm4gZmlyc3RFcnJvcklkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZmlyc3RFcnJvcklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBlcnJvcklkcyA9IE9iamVjdC5rZXlzKHRoaXMuY29udHJvbEVycm9ycyk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9ySWRzWzBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGNvbnRyb2xFcnJvcnMoKToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9sO1xuXG4gICAgICAgIHJldHVybiAoY29udHJvbCAmJiBjb250cm9sLmVycm9ycykgfHwge307XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVFcnJvclRleHQoKSB7XG4gICAgICAgIHRoaXMuZmlyc3RFcnJvciA9IHRoaXMuZ2V0RXJyb3JUZXh0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFcnJvclRleHQoKTogVHVpVmFsaWRhdGlvbkVycm9yIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZpcnN0RXJyb3JJZCA9IHRoaXMuZmlyc3RFcnJvcklkQnlPcmRlciB8fCB0aGlzLmZpcnN0RXJyb3JJZDtcbiAgICAgICAgY29uc3QgZmlyc3RFcnJvciA9IGZpcnN0RXJyb3JJZCAmJiB0aGlzLmNvbnRyb2xFcnJvcnNbZmlyc3RFcnJvcklkXTtcblxuICAgICAgICAvLyBAYmFkIFRPRE86IFJlbW92ZSBmaXJzdEVycm9yLm1lc3NhZ2UgY2hlY2sgYWZ0ZXIgZXZlcnlib2R5IG1pZ3JhdGVzIHRvIFR1aVZhbGlkYXRpb25FcnJvclxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaXJzdEVycm9yICYmXG4gICAgICAgICAgICAoZmlyc3RFcnJvciBpbnN0YW5jZW9mIFR1aVZhbGlkYXRpb25FcnJvciB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBmaXJzdEVycm9yLm1lc3NhZ2UgPT09ICdzdHJpbmcnKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdEVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpcnN0RXJyb3JJZFxuICAgICAgICAgICAgPyBuZXcgVHVpVmFsaWRhdGlvbkVycm9yKHRoaXMudmFsaWRhdGlvbkVycm9yc1tmaXJzdEVycm9ySWRdLCBmaXJzdEVycm9yKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFya0ZvckNoZWNrKCkge1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbn1cbiJdfQ==