ng-fveh
Version:
NG-FVEH - Some helpers to help you with form validation :)
267 lines (256 loc) • 20.9 kB
JavaScript
import { InjectionToken, Injectable, Inject, Component, Input, defineInjectable, inject, NgModule } from '@angular/core';
import '@angular/forms';
import { CommonModule } from '@angular/common';
import { __read } from 'tslib';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ ERROR_MESSAGES_CONFIGURATION = new InjectionToken('MessagesConfiguration');
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NgFvehLibService = /** @class */ (function () {
function NgFvehLibService(messagesObject) {
this.messagesObject = messagesObject;
}
/**
* @param {?} errorType
* @param {?} errorPayload
* @return {?}
*/
NgFvehLibService.prototype.getMessage = /**
* @param {?} errorType
* @param {?} errorPayload
* @return {?}
*/
function (errorType, errorPayload) {
var /** @type {?} */ message = this.messagesObject[errorType](errorPayload);
return message;
};
NgFvehLibService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root',
},] },
];
/** @nocollapse */
NgFvehLibService.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [ERROR_MESSAGES_CONFIGURATION,] }] }
]; };
/** @nocollapse */ NgFvehLibService.ngInjectableDef = defineInjectable({ factory: function NgFvehLibService_Factory() { return new NgFvehLibService(inject(ERROR_MESSAGES_CONFIGURATION)); }, token: NgFvehLibService, providedIn: "root" });
return NgFvehLibService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ErrorsPresenterComponent = /** @class */ (function () {
function ErrorsPresenterComponent(service) {
this.service = service;
}
/**
* @return {?}
*/
ErrorsPresenterComponent.prototype.getFieldErrors = /**
* @return {?}
*/
function () {
return Object.keys(this.field.errors);
};
/**
* @param {?} errorPropertyName
* @return {?}
*/
ErrorsPresenterComponent.prototype.getErrorMessage = /**
* @param {?} errorPropertyName
* @return {?}
*/
function (errorPropertyName) {
var /** @type {?} */ errorPayload = this.field.errors[errorPropertyName];
return this.service.getMessage(errorPropertyName, errorPayload);
};
/**
* @return {?}
*/
ErrorsPresenterComponent.prototype.hasErrors = /**
* @return {?}
*/
function () {
return this.field.touched && this.field.invalid && !!this.field.errors;
};
ErrorsPresenterComponent.decorators = [
{ type: Component, args: [{
selector: 'fveh-errors-presenter',
template: "<div *ngIf=\"hasErrors()\">\n <div *ngFor=\"let error of getFieldErrors()\">{{ getErrorMessage(error) }}</div>\n</div>",
styles: [""],
},] },
];
/** @nocollapse */
ErrorsPresenterComponent.ctorParameters = function () { return [
{ type: NgFvehLibService }
]; };
ErrorsPresenterComponent.propDecorators = {
field: [{ type: Input }]
};
return ErrorsPresenterComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NgFvehLibModule = /** @class */ (function () {
function NgFvehLibModule() {
}
NgFvehLibModule.decorators = [
{ type: NgModule, args: [{
imports: [CommonModule],
exports: [ErrorsPresenterComponent],
declarations: [ErrorsPresenterComponent],
},] },
];
/** @nocollapse */
NgFvehLibModule.ctorParameters = function () { return []; };
return NgFvehLibModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @param {?} controls
* @return {?}
*/
function markControlsAsTouched(controls) {
Object.keys(controls).forEach(function (field) {
var /** @type {?} */ formGroup = /** @type {?} */ (controls[field]);
if (formGroup.controls) {
var /** @type {?} */ groupControls = formGroup.controls;
markControlsAsTouched(groupControls);
}
else {
formGroup.markAsTouched({ onlySelf: true });
}
});
}
/**
* @param {?} formName
* @return {?}
*/
function FvehFormIsValid(formName) {
return function (target, decoratedPropOrFunctionName, descriptor) {
var /** @type {?} */ originalMethod = descriptor.value;
descriptor.value = function () {
var /** @type {?} */ form = this[formName];
if (form.valid) {
originalMethod.apply(this, arguments);
}
else {
markControlsAsTouched(form.controls);
}
};
return descriptor;
};
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @param {?} errors
* @param {?} control
* @return {?}
*/
function setErrors(errors, control) {
if (Object.keys(errors).length) {
control.setErrors(errors);
}
else {
control.setErrors(null);
}
}
/**
* @param {?} error
* @param {?} controls
* @return {?}
*/
function setErrorOnFields(error, controls) {
Object.keys(controls).forEach(function (controlName) {
var /** @type {?} */ errors = Object.assign({}, controls[controlName].errors, error);
setErrors(errors, controls[controlName]);
});
}
/**
* @param {?} fieldErrorName
* @param {?} controls
* @return {?}
*/
function clearErrorOnFields(fieldErrorName, controls) {
Object.keys(controls).forEach(function (controlName) {
var /** @type {?} */ errors = controls[controlName].errors;
if (errors) {
delete errors[fieldErrorName];
setErrors(errors, controls[controlName]);
}
});
}
/**
* @param {?} friendlyFieldNames
* @return {?}
*/
function createGroupMatchError(friendlyFieldNames) {
return {
fvehGroupMatch: {
fields: friendlyFieldNames,
},
};
}
/**
* @param {?} controlValues
* @return {?}
*/
function validateIfValuesMatch(controlValues) {
var _a = __read(Object.keys(controlValues)), firstField = _a[0], otherFields = _a.slice(1);
var /** @type {?} */ isValid = otherFields.every(function (currentValue) { return controlValues[firstField] === controlValues[currentValue]; });
return isValid;
}
/**
* @param {?} friendlyFieldNames
* @return {?}
*/
function groupMatch(friendlyFieldNames) {
return function (_a) {
var value = _a.value, touched = _a.touched, pristine = _a.pristine, controls = _a.controls;
var /** @type {?} */ error = createGroupMatchError(friendlyFieldNames);
var /** @type {?} */ isGroupMatching = validateIfValuesMatch(value);
if (pristine) {
return null;
}
if (touched && isGroupMatching) {
clearErrorOnFields('fvehGroupMatch', controls);
return null;
}
setErrorOnFields(error, controls);
return error;
};
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var FvehValidators = /** @class */ (function () {
function FvehValidators() {
}
FvehValidators.groupMatch = groupMatch;
return FvehValidators;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { NgFvehLibService, ERROR_MESSAGES_CONFIGURATION, NgFvehLibModule, FvehFormIsValid, FvehValidators, ErrorsPresenterComponent as ɵb };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZnZlaC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmctZnZlaC9saWIvSW5qZWN0b3JzLnRzIiwibmc6Ly9uZy1mdmVoL2xpYi9uZy1mdmVoLWxpYi5zZXJ2aWNlLnRzIiwibmc6Ly9uZy1mdmVoL2xpYi9jb21wb25lbnRzL2Vycm9ycy1wcmVzZW50ZXIvZXJyb3JzLXByZXNlbnRlci5jb21wb25lbnQudHMiLCJuZzovL25nLWZ2ZWgvbGliL25nLWZ2ZWgtbGliLm1vZHVsZS50cyIsIm5nOi8vbmctZnZlaC9saWIvZGVjb3JhdG9ycy9mb3JtLWlzLXZhbGlkLmRlY29yYXRvci50cyIsIm5nOi8vbmctZnZlaC9saWIvdmFsaWRhdG9ycy9ncm91cC1tYXRjaC52YWxpZGF0b3IudHMiLCJuZzovL25nLWZ2ZWgvbGliL3ZhbGlkYXRvcnMvZnZlaC52YWxpZGF0b3JzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VzIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuXHJcbmV4cG9ydCBjb25zdCBFUlJPUl9NRVNTQUdFU19DT05GSUdVUkFUSU9OID0gbmV3IEluamVjdGlvblRva2VuPE1lc3NhZ2VzPihcclxuICAnTWVzc2FnZXNDb25maWd1cmF0aW9uJyxcclxuKTtcclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VzIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRVJST1JfTUVTU0FHRVNfQ09ORklHVVJBVElPTiB9IGZyb20gJy4vSW5qZWN0b3JzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ0Z2ZWhMaWJTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoRVJST1JfTUVTU0FHRVNfQ09ORklHVVJBVElPTikgcHVibGljIG1lc3NhZ2VzT2JqZWN0OiBNZXNzYWdlcyxcclxuICApIHt9XHJcblxyXG4gIGdldE1lc3NhZ2UoZXJyb3JUeXBlOiBzdHJpbmcsIGVycm9yUGF5bG9hZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc09iamVjdFtlcnJvclR5cGVdKGVycm9yUGF5bG9hZCk7XHJcbiAgICByZXR1cm4gbWVzc2FnZTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdGdmVoTGliU2VydmljZSB9IGZyb20gJy4uLy4uL25nLWZ2ZWgtbGliLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmdmVoLWVycm9ycy1wcmVzZW50ZXInLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiAqbmdJZj1cImhhc0Vycm9ycygpXCI+XHJcbiAgPGRpdiAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgZ2V0RmllbGRFcnJvcnMoKVwiPnt7IGdldEVycm9yTWVzc2FnZShlcnJvcikgfX08L2Rpdj5cclxuPC9kaXY+YCxcclxuICBzdHlsZXM6IFtgYF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFcnJvcnNQcmVzZW50ZXJDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGZpZWxkOiBGb3JtQ29udHJvbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHNlcnZpY2U6IE5nRnZlaExpYlNlcnZpY2UpIHt9XHJcblxyXG4gIGdldEZpZWxkRXJyb3JzKCkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmllbGQuZXJyb3JzKTtcclxuICB9XHJcblxyXG4gIGdldEVycm9yTWVzc2FnZShlcnJvclByb3BlcnR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBlcnJvclBheWxvYWQgPSB0aGlzLmZpZWxkLmVycm9yc1tlcnJvclByb3BlcnR5TmFtZV07XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmdldE1lc3NhZ2UoZXJyb3JQcm9wZXJ0eU5hbWUsIGVycm9yUGF5bG9hZCk7XHJcbiAgfVxyXG5cclxuICBoYXNFcnJvcnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZC50b3VjaGVkICYmIHRoaXMuZmllbGQuaW52YWxpZCAmJiAhIXRoaXMuZmllbGQuZXJyb3JzO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycywgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRXJyb3JzUHJlc2VudGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Vycm9ycy1wcmVzZW50ZXIvZXJyb3JzLXByZXNlbnRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFUlJPUl9NRVNTQUdFU19DT05GSUdVUkFUSU9OIH0gZnJvbSAnLi9JbmplY3RvcnMnO1xyXG4vLyBpbXBvcnQgeyBOZ0Z2ZWhMaWJTZXJ2aWNlIH0gZnJvbSAnLi9uZy1mdmVoLWxpYi5zZXJ2aWNlJztcclxuLy8gaW1wb3J0IHsgTWVzc2FnZXMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICBleHBvcnRzOiBbRXJyb3JzUHJlc2VudGVyQ29tcG9uZW50XSxcclxuICBkZWNsYXJhdGlvbnM6IFtFcnJvcnNQcmVzZW50ZXJDb21wb25lbnRdLFxyXG59KVxyXG5jbGFzcyBOZ0Z2ZWhMaWJNb2R1bGUge1xyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjM2MDlcclxuICAvLyBwdWJsaWMgc3RhdGljIGZvclJvb3QoXHJcbiAgLy8gICBtZXNzYWdlc0RpY3Rpb25hcnk6IE1lc3NhZ2VzID0ge30sXHJcbiAgLy8gKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XHJcbiAgLy8gICByZXR1cm4ge1xyXG4gIC8vICAgICBuZ01vZHVsZTogTmdGdmVoTGliTW9kdWxlLFxyXG4gIC8vICAgICBwcm92aWRlcnM6IFtcclxuICAvLyAgICAgICB7IHByb3ZpZGU6ICdNRVNTQUdFU19DT05GSUdVUkFUSU9OJywgdXNlVmFsdWU6IG1lc3NhZ2VzRGljdGlvbmFyeSB9LCAvLyBBT1QgQlVHXHJcbiAgLy8gICAgICAgTmdGdmVoTGliU2VydmljZSxcclxuICAvLyAgICAgXSxcclxuICAvLyAgIH07XHJcbiAgLy8gfVxyXG59XHJcblxyXG5leHBvcnQgeyBFUlJPUl9NRVNTQUdFU19DT05GSUdVUkFUSU9OLCBOZ0Z2ZWhMaWJNb2R1bGUgfTtcclxuIiwiaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5mdW5jdGlvbiBtYXJrQ29udHJvbHNBc1RvdWNoZWQoY29udHJvbHM6IHsgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sIH0pIHtcclxuICBPYmplY3Qua2V5cyhjb250cm9scykuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sc1tmaWVsZF0gYXMgRm9ybUdyb3VwO1xyXG5cclxuICAgIGlmIChmb3JtR3JvdXAuY29udHJvbHMpIHtcclxuICAgICAgY29uc3QgZ3JvdXBDb250cm9scyA9IGZvcm1Hcm91cC5jb250cm9scztcclxuICAgICAgbWFya0NvbnRyb2xzQXNUb3VjaGVkKGdyb3VwQ29udHJvbHMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9ybUdyb3VwLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEZ2ZWhGb3JtSXNWYWxpZChmb3JtTmFtZTogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uKFxyXG4gICAgdGFyZ2V0OiBhbnksXHJcbiAgICBkZWNvcmF0ZWRQcm9wT3JGdW5jdGlvbk5hbWU6IHN0cmluZyxcclxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcixcclxuICApIHtcclxuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcclxuXHJcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzW2Zvcm1OYW1lXTtcclxuICAgICAgaWYgKGZvcm0udmFsaWQpIHtcclxuICAgICAgICBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hcmtDb250cm9sc0FzVG91Y2hlZChmb3JtLmNvbnRyb2xzKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcclxuICB9O1xyXG59XHJcbiIsImltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW50ZXJmYWNlIEZvcm1Db250cm9scyB7XHJcbiAgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2w7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldEVycm9ycyhlcnJvcnM6IGFueSwgY29udHJvbDogRm9ybUNvbnRyb2wpIHtcclxuICBpZiAoT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGgpIHtcclxuICAgIGNvbnRyb2wuc2V0RXJyb3JzKGVycm9ycyk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0RXJyb3JPbkZpZWxkcyhlcnJvcjoge30gfCBudWxsLCBjb250cm9sczogRm9ybUNvbnRyb2xzKSB7XHJcbiAgT2JqZWN0LmtleXMoY29udHJvbHMpLmZvckVhY2goY29udHJvbE5hbWUgPT4ge1xyXG4gICAgY29uc3QgZXJyb3JzID0gT2JqZWN0LmFzc2lnbih7fSwgY29udHJvbHNbY29udHJvbE5hbWVdLmVycm9ycywgZXJyb3IpO1xyXG4gICAgc2V0RXJyb3JzKGVycm9ycywgY29udHJvbHNbY29udHJvbE5hbWVdKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2xlYXJFcnJvck9uRmllbGRzKGZpZWxkRXJyb3JOYW1lOiBzdHJpbmcsIGNvbnRyb2xzOiBGb3JtQ29udHJvbHMpIHtcclxuICBPYmplY3Qua2V5cyhjb250cm9scykuZm9yRWFjaChjb250cm9sTmFtZSA9PiB7XHJcbiAgICBjb25zdCBlcnJvcnMgPSBjb250cm9sc1tjb250cm9sTmFtZV0uZXJyb3JzO1xyXG4gICAgaWYgKGVycm9ycykge1xyXG4gICAgICBkZWxldGUgZXJyb3JzW2ZpZWxkRXJyb3JOYW1lXTtcclxuICAgICAgc2V0RXJyb3JzKGVycm9ycywgY29udHJvbHNbY29udHJvbE5hbWVdKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlR3JvdXBNYXRjaEVycm9yKGZyaWVuZGx5RmllbGROYW1lczogc3RyaW5nW10pIHtcclxuICByZXR1cm4ge1xyXG4gICAgZnZlaEdyb3VwTWF0Y2g6IHtcclxuICAgICAgZmllbGRzOiBmcmllbmRseUZpZWxkTmFtZXMsXHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlSWZWYWx1ZXNNYXRjaChjb250cm9sVmFsdWVzOiBhbnkpIHtcclxuICBjb25zdCBbZmlyc3RGaWVsZCwgLi4ub3RoZXJGaWVsZHNdID0gT2JqZWN0LmtleXMoY29udHJvbFZhbHVlcyk7XHJcbiAgY29uc3QgaXNWYWxpZCA9IG90aGVyRmllbGRzLmV2ZXJ5KFxyXG4gICAgY3VycmVudFZhbHVlID0+IGNvbnRyb2xWYWx1ZXNbZmlyc3RGaWVsZF0gPT09IGNvbnRyb2xWYWx1ZXNbY3VycmVudFZhbHVlXSxcclxuICApO1xyXG5cclxuICByZXR1cm4gaXNWYWxpZDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwTWF0Y2goZnJpZW5kbHlGaWVsZE5hbWVzOiBzdHJpbmdbXSkge1xyXG4gIHJldHVybiAoeyB2YWx1ZSwgdG91Y2hlZCwgcHJpc3RpbmUsIGNvbnRyb2xzIH0pID0+IHtcclxuICAgIGNvbnN0IGVycm9yID0gY3JlYXRlR3JvdXBNYXRjaEVycm9yKGZyaWVuZGx5RmllbGROYW1lcyk7XHJcbiAgICBjb25zdCBpc0dyb3VwTWF0Y2hpbmcgPSB2YWxpZGF0ZUlmVmFsdWVzTWF0Y2godmFsdWUpO1xyXG5cclxuICAgIGlmIChwcmlzdGluZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodG91Y2hlZCAmJiBpc0dyb3VwTWF0Y2hpbmcpIHtcclxuICAgICAgY2xlYXJFcnJvck9uRmllbGRzKCdmdmVoR3JvdXBNYXRjaCcsIGNvbnRyb2xzKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RXJyb3JPbkZpZWxkcyhlcnJvciwgY29udHJvbHMpO1xyXG4gICAgcmV0dXJuIGVycm9yO1xyXG4gIH07XHJcbn1cclxuIiwiaW1wb3J0IHsgZ3JvdXBNYXRjaCB9IGZyb20gJy4vZ3JvdXAtbWF0Y2gudmFsaWRhdG9yJztcclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBGdmVoVmFsaWRhdG9ycyB7XHJcbiAgc3RhdGljIGdyb3VwTWF0Y2ggPSBncm91cE1hdGNoO1xyXG59XHJcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxxQkFH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