@ui-tool/core
Version:
206 lines • 25.7 kB
JavaScript
import { merge as lodashMerge } from 'lodash-es';
import { AbstractControl, FormArray, FormControl, FormControlDirective, FormGroup, NgControl, NgModel } from '@angular/forms';
import { ValidationMessage } from '../../../../models/implementations/validation-summarizers/validation-message';
export class ValidationSummarizerBaseService {
//#endregion
//#region Constructor
// tslint:disable-next-line:max-line-length
constructor(id) {
this._id = id;
this._validatorNameToValidationMessage = {};
}
//#endregion
//#region Methods
getId() {
return this._id;
}
// Get a single control validation message.
loadControlValidationMessage(controlLabel, control) {
const messages = this.loadControlValidationMessages(controlLabel, control);
if (!messages) {
return null;
}
return messages[0];
}
// Get all control validation messages.
loadControlValidationMessages(controlLabel, control) {
// Invalid control.
if (!control) {
return null;
}
// List of validation messages.
const messages = [];
if (!control.errors || !control.errors) {
return [];
}
const keys = Object.keys(control.errors);
for (const key of keys) {
if (!control.hasError(key)) {
continue;
}
let boundValue = '';
if (key === 'min' || key === 'max') {
boundValue = control.errors[key][key];
}
else if (key === 'minlength' || key === 'maxlength') {
boundValue = control.errors[key].requiredLength;
}
else {
boundValue = control.errors[key];
}
const additionalValue = {};
if (key && key.length && boundValue) {
additionalValue[key] = boundValue;
}
const message = this.buildValidationMessage(controlLabel, key, additionalValue);
if (!message) {
return [{
key,
content: key,
additionalValue: additionalValue[key]
}];
}
const validationMessage = new ValidationMessage(key, message);
validationMessage.key = key;
validationMessage.content = message;
validationMessage.additionalValue[key] = boundValue;
messages.push(validationMessage);
}
return messages;
}
// Whether component has been attached with any multiple-validation-summarizers or not.
hasValidator(name, ngControl) {
if (!ngControl) {
return false;
}
let actualControl = null;
if (ngControl instanceof NgControl) {
actualControl = ngControl.control;
}
else if (ngControl instanceof NgModel) {
actualControl = ngControl.control;
}
else if (ngControl instanceof AbstractControl) {
actualControl = ngControl;
}
if (!actualControl) {
return false;
}
if (!actualControl.validator) {
return false;
}
const validator = actualControl.validator({});
if (!validator) {
return false;
}
return validator[name];
}
// Update the dictionary which is used for mapping validation property & validation message.
updateValidationMessageDictionary(validationMessageDictionary) {
if (!validationMessageDictionary) {
this._validatorNameToValidationMessage = {};
return;
}
this._validatorNameToValidationMessage = { ...validationMessageDictionary };
}
// Run validation on controls inside a form.
doFormControlsValidation(formGroup) {
// Form group is not valid.
if (!formGroup) {
return;
}
// No control is found.
const controls = formGroup.controls;
if (!controls) {
return;
}
const keys = Object.keys(controls);
for (const key of keys) {
const control = formGroup.controls[key];
this.doControlValidation(control);
}
}
// Do control validation
doControlValidation(control) {
try {
if (control instanceof FormControl) {
control.markAsTouched({ onlySelf: true });
control.markAsDirty({ onlySelf: true });
control.updateValueAndValidity({ emitEvent: false });
control.statusChanges.emit(control.status);
return;
}
if (control instanceof FormArray) {
// Get the list of control;
const children = control.controls;
for (const child of children) {
this.doControlValidation(child);
}
return;
}
if (control instanceof FormControlDirective) {
const formControlDirective = control;
formControlDirective.control.markAsTouched({ onlySelf: true });
formControlDirective.control.markAsDirty({ onlySelf: true });
formControlDirective.control.updateValueAndValidity({ emitEvent: false });
formControlDirective.statusChanges.emit(control.status);
}
if (control instanceof FormGroup) {
this.doFormControlsValidation(control);
}
}
catch (exception) {
// Suppress error.
}
}
// Get control validation errors.
loadControlValidationErrors(control) {
if (control instanceof FormControl) {
return control.errors;
}
if (control instanceof FormControlDirective) {
const formControlDirective = control;
return formControlDirective.errors;
}
const validationErrors = {};
if (control instanceof FormGroup) {
const controlValidationErrors = this.loadFormControlsValidationError(control);
lodashMerge(validationErrors, controlValidationErrors);
}
return validationErrors;
}
// Run validation on controls inside a form.
loadFormControlsValidationError(formGroup) {
// Form group is not valid.
if (!formGroup) {
return null;
}
// No control is found.
const controls = formGroup.controls;
if (!controls) {
return null;
}
const validationErrors = {};
const keys = Object.keys(controls);
for (const key of keys) {
const control = formGroup.controls[key];
const validationError = this.loadControlValidationErrors(control);
lodashMerge(validationErrors, validationError);
}
return validationErrors;
}
//#endregion
//#region Internal methods
// Build validation message from specific information.
buildValidationMessage(controlLabel, validatorName, additionalValue) {
if (!this._validatorNameToValidationMessage) {
return '';
}
const validationMessage = this._validatorNameToValidationMessage[validatorName];
if (!validationMessage) {
return '';
}
return validationMessage;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1zdW1tYXJpemVyLWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvc2VydmljZXMvaW1wbGVtZW50YXRpb25zL3ZhbGlkYXRvcnMvdmFsaWRhdGlvbi1zdW1tYXJpemVycy92YWxpZGF0aW9uLXN1bW1hcml6ZXItYmFzZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxLQUFLLElBQUksV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxlQUFlLEVBQ2YsU0FBUyxFQUNULFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsU0FBUyxFQUNULFNBQVMsRUFFVCxPQUFPLEVBRVIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4RUFBOEUsQ0FBQztBQUcvRyxNQUFNLE9BQU8sK0JBQStCO0lBYTFDLFlBQVk7SUFFWixxQkFBcUI7SUFFckIsMkNBQTJDO0lBQzNDLFlBQW1CLEVBQVU7UUFDM0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsaUNBQWlDLEdBQUcsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxZQUFZO0lBRVosaUJBQWlCO0lBRVYsS0FBSztRQUNWLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsMkNBQTJDO0lBQ3BDLDRCQUE0QixDQUFDLFlBQW9CLEVBQUUsT0FBd0I7UUFDaEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFF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QztJQUVELFlBQVk7SUFFWiwwQkFBMEI7SUFFMUIsc0RBQXNEO0lBQzVDLHNCQUFzQixDQUFDLFlBQW9CLEVBQUUsYUFBcUIsRUFBRSxlQUEyQztRQUN2SCxJQUFJLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFO1lBQzNDLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDdEIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztDQUlGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHttZXJnZSBhcyBsb2Rhc2hNZXJnZX0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUFycmF5LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xEaXJlY3RpdmUsXG4gIEZvcm1Hcm91cCxcbiAgTmdDb250cm9sLFxuICBOZ0Zvcm0sXG4gIE5nTW9kZWwsXG4gIFZhbGlkYXRpb25FcnJvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtWYWxpZGF0aW9uTWVzc2FnZX0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2ltcGxlbWVudGF0aW9ucy92YWxpZGF0aW9uLXN1bW1hcml6ZXJzL3ZhbGlkYXRpb24tbWVzc2FnZSc7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uU3VtbWFyaXplckJhc2VTZXJ2aWNlIHtcblxuICAvLyNyZWdpb24gUHJvcGVydGllc1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByb3RlY3RlZCByZWFkb25seSBfaWQ6IHN0cmluZztcblxuICAvKlxuICAqIE1hcHBpbmcgYmV0d2VlbiB2YWxpZGF0b3IgbmFtZSBhbmQgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAqICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByb3RlY3RlZCBfdmFsaWRhdG9yTmFtZVRvVmFsaWRhdGlvbk1lc3NhZ2U6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZzsgfTtcblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gQ29uc3RydWN0b3JcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSBpZDtcbiAgICB0aGlzLl92YWxpZGF0b3JOYW1lVG9WYWxpZGF0aW9uTWVzc2FnZSA9IHt9O1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIE1ldGhvZHNcblxuICBwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvLyBHZXQgYSBzaW5nbGUgY29udHJvbCB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gIHB1YmxpYyBsb2FkQ29udHJvbFZhbGlkYXRpb25NZXNzYWdlKGNvbnRyb2xMYWJlbDogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uTWVzc2FnZSB8IG51bGwge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5sb2FkQ29udHJvbFZhbGlkYXRpb25NZXNzYWdlcyhjb250cm9sTGFiZWwsIGNvbnRyb2wpO1xuICAgIGlmICghbWVzc2FnZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlc1swXTtcbiAgfVxuXG4gIC8vIEdldCBhbGwgY29udHJvbCB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICBwdWJsaWMgbG9hZENvbnRyb2xWYWxpZGF0aW9uTWVzc2FnZXMoY29udHJvbExhYmVsOiBzdHJpbmcsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IE5nQ29udHJvbCB8IG51bGwpOiBWYWxpZGF0aW9uTWVzc2FnZVtdIHwgbnVsbCB7XG5cbiAgICAvLyBJbnZhbGlkIGNvbnRyb2wuXG4gICAgaWYgKCFjb250cm9sKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBMaXN0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gICAgY29uc3QgbWVzc2FnZXM6IFZhbGlkYXRpb25NZXNzYWdlW10gPSBbXTtcbiAgICBpZiAoIWNvbnRyb2wuZXJyb3JzIHx8ICFjb250cm9sLmVycm9ycykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFjb250cm9sLmhhc0Vycm9yKGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBib3VuZFZhbHVlID0gJyc7XG4gICAgICBpZiAoa2V5ID09PSAnbWluJyB8fCBrZXkgPT09ICdtYXgnKSB7XG4gICAgICAgIGJvdW5kVmFsdWUgPSBjb250cm9sLmVycm9yc1trZXldW2tleV07XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ21pbmxlbmd0aCcgfHwga2V5ID09PSAnbWF4bGVuZ3RoJykge1xuICAgICAgICBib3VuZFZhbHVlID0gY29udHJvbC5lcnJvcnNba2V5XS5yZXF1aXJlZExlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvdW5kVmFsdWUgPSBjb250cm9sLmVycm9yc1trZXldO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGRpdGlvbmFsVmFsdWU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAgICAgaWYgKGtleSAmJiBrZXkubGVuZ3RoICYmIGJvdW5kVmFsdWUpIHtcbiAgICAgICAgYWRkaXRpb25hbFZhbHVlW2tleV0gPSBib3VuZFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5idWlsZFZhbGlkYXRpb25NZXNzYWdlKGNvbnRyb2xMYWJlbCwga2V5LCBhZGRpdGlvbmFsVmFsdWUpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBbe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBjb250ZW50OiBrZXksXG4gICAgICAgICAgYWRkaXRpb25hbFZhbHVlOiBhZGRpdGlvbmFsVmFsdWVba2V5XVxuICAgICAgICB9XTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2UgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2Uoa2V5LCBtZXNzYWdlKTtcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlLmtleSA9IGtleTtcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlLmNvbnRlbnQgPSBtZXNzYWdlO1xuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UuYWRkaXRpb25hbFZhbHVlW2tleV0gPSBib3VuZFZhbHVlO1xuICAgICAgbWVzc2FnZXMucHVzaCh2YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2VzO1xuICB9XG5cbiAgLy8gV2hldGhlciBjb21wb25lbnQgaGFzIGJlZW4gYXR0YWNoZWQgd2l0aCBhbnkgbXVsdGlwbGUtdmFsaWRhdGlvbi1zdW1tYXJpemVycyBvciBub3QuXG4gIHB1YmxpYyBoYXNWYWxpZGF0b3IobmFtZTogc3RyaW5nLCBuZ0NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IE5nQ29udHJvbCB8IE5nTW9kZWwpOiBib29sZWFuIHtcblxuICAgIGlmICghbmdDb250cm9sKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGFjdHVhbENvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgPSBudWxsO1xuICAgIGlmIChuZ0NvbnRyb2wgaW5zdGFuY2VvZiBOZ0NvbnRyb2wpIHtcbiAgICAgIGFjdHVhbENvbnRyb2wgPSBuZ0NvbnRyb2wuY29udHJvbDtcbiAgICB9IGVsc2UgaWYgKG5nQ29udHJvbCBpbnN0YW5jZW9mIE5nTW9kZWwpIHtcbiAgICAgIGFjdHVhbENvbnRyb2wgPSAobmdDb250cm9sIGFzIE5nTW9kZWwpLmNvbnRyb2w7XG4gICAgfSBlbHNlIGlmIChuZ0NvbnRyb2wgaW5zdGFuY2VvZiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICAgIGFjdHVhbENvbnRyb2wgPSBuZ0NvbnRyb2w7XG4gICAgfVxuXG4gICAgaWYgKCFhY3R1YWxDb250cm9sKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFhY3R1YWxDb250cm9sLnZhbGlkYXRvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRvciA9IGFjdHVhbENvbnRyb2wudmFsaWRhdG9yKHt9IGFzIEFic3RyYWN0Q29udHJvbCk7XG4gICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yW25hbWVdO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IHdoaWNoIGlzIHVzZWQgZm9yIG1hcHBpbmcgdmFsaWRhdGlvbiBwcm9wZXJ0eSAmIHZhbGlkYXRpb24gbWVzc2FnZS5cbiAgcHVibGljIHVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlRGljdGlvbmFyeSh2YWxpZGF0aW9uTWVzc2FnZURpY3Rpb25hcnk6IHsgW3A6IHN0cmluZ106IHN0cmluZzsgfSk6IHZvaWQge1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uTWVzc2FnZURpY3Rpb25hcnkpIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRvck5hbWVUb1ZhbGlkYXRpb25NZXNzYWdlID0ge307XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsaWRhdG9yTmFtZVRvVmFsaWRhdGlvbk1lc3NhZ2UgPSB7Li4udmFsaWRhdGlvbk1lc3NhZ2VEaWN0aW9uYXJ5fTtcbiAgfVxuXG4gIC8vIFJ1biB2YWxpZGF0aW9uIG9uIGNvbnRyb2xzIGluc2lkZSBhIGZvcm0uXG4gIHB1YmxpYyBkb0Zvcm1Db250cm9sc1ZhbGlkYXRpb24oZm9ybUdyb3VwOiBGb3JtR3JvdXAgfCBOZ0Zvcm0pOiB2b2lkIHtcblxuICAgIC8vIEZvcm0gZ3JvdXAgaXMgbm90IHZhbGlkLlxuICAgIGlmICghZm9ybUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm8gY29udHJvbCBpcyBmb3VuZC5cbiAgICBjb25zdCBjb250cm9scyA9IGZvcm1Hcm91cC5jb250cm9scztcbiAgICBpZiAoIWNvbnRyb2xzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRyb2xzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmNvbnRyb2xzW2tleV07XG4gICAgICB0aGlzLmRvQ29udHJvbFZhbGlkYXRpb24oY29udHJvbCBhcyBhbnkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERvIGNvbnRyb2wgdmFsaWRhdGlvblxuICBwdWJsaWMgZG9Db250cm9sVmFsaWRhdGlvbihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBGb3JtR3JvdXApOiB2b2lkIHtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSh7b25seVNlbGY6IHRydWV9KTtcbiAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgIChjb250cm9sLnN0YXR1c0NoYW5nZXMgYXMgRXZlbnRFbWl0dGVyPGFueT4pLmVtaXQoY29udHJvbC5zdGF0dXMpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIGNvbnRyb2w7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29udHJvbC5jb250cm9scztcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgIHRoaXMuZG9Db250cm9sVmFsaWRhdGlvbihjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sRGlyZWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sRGlyZWN0aXZlID0gY29udHJvbCBhcyBGb3JtQ29udHJvbERpcmVjdGl2ZTtcbiAgICAgICAgZm9ybUNvbnRyb2xEaXJlY3RpdmUuY29udHJvbC5tYXJrQXNUb3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgICBmb3JtQ29udHJvbERpcmVjdGl2ZS5jb250cm9sLm1hcmtBc0RpcnR5KHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgICBmb3JtQ29udHJvbERpcmVjdGl2ZS5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgKGZvcm1Db250cm9sRGlyZWN0aXZlLnN0YXR1c0NoYW5nZXMgYXMgRXZlbnRFbWl0dGVyPGFueT4pLmVtaXQoY29udHJvbC5zdGF0dXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLmRvRm9ybUNvbnRyb2xzVmFsaWRhdGlvbihjb250cm9sKTtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgLy8gU3VwcHJlc3MgZXJyb3IuXG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IGNvbnRyb2wgdmFsaWRhdGlvbiBlcnJvcnMuXG4gIHB1YmxpYyBsb2FkQ29udHJvbFZhbGlkYXRpb25FcnJvcnMoY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgRm9ybUdyb3VwKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgcmV0dXJuIGNvbnRyb2wuZXJyb3JzO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2xEaXJlY3RpdmUpIHtcbiAgICAgIGNvbnN0IGZvcm1Db250cm9sRGlyZWN0aXZlID0gY29udHJvbCBhcyBGb3JtQ29udHJvbERpcmVjdGl2ZTtcbiAgICAgIHJldHVybiBmb3JtQ29udHJvbERpcmVjdGl2ZS5lcnJvcnM7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9yczogVmFsaWRhdGlvbkVycm9ycyA9IHt9O1xuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xWYWxpZGF0aW9uRXJyb3JzID0gdGhpcy5sb2FkRm9ybUNvbnRyb2xzVmFsaWRhdGlvbkVycm9yKGNvbnRyb2wpO1xuICAgICAgbG9kYXNoTWVyZ2UodmFsaWRhdGlvbkVycm9ycywgY29udHJvbFZhbGlkYXRpb25FcnJvcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0aW9uRXJyb3JzO1xuICB9XG5cbiAgLy8gUnVuIHZhbGlkYXRpb24gb24gY29udHJvbHMgaW5zaWRlIGEgZm9ybS5cbiAgcHVibGljIGxvYWRGb3JtQ29udHJvbHNWYWxpZGF0aW9uRXJyb3IoZm9ybUdyb3VwOiBGb3JtR3JvdXApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG5cbiAgICAvLyBGb3JtIGdyb3VwIGlzIG5vdCB2YWxpZC5cbiAgICBpZiAoIWZvcm1Hcm91cCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gTm8gY29udHJvbCBpcyBmb3VuZC5cbiAgICBjb25zdCBjb250cm9scyA9IGZvcm1Hcm91cC5jb250cm9scztcbiAgICBpZiAoIWNvbnRyb2xzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzID0ge307XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRyb2xzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmNvbnRyb2xzW2tleV07XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSB0aGlzLmxvYWRDb250cm9sVmFsaWRhdGlvbkVycm9ycyhjb250cm9sKTtcbiAgICAgIGxvZGFzaE1lcmdlKHZhbGlkYXRpb25FcnJvcnMsIHZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRpb25FcnJvcnM7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW50ZXJuYWwgbWV0aG9kc1xuXG4gIC8vIEJ1aWxkIHZhbGlkYXRpb24gbWVzc2FnZSBmcm9tIHNwZWNpZmljIGluZm9ybWF0aW9uLlxuICBwcm90ZWN0ZWQgYnVpbGRWYWxpZGF0aW9uTWVzc2FnZShjb250cm9sTGFiZWw6IHN0cmluZywgdmFsaWRhdG9yTmFtZTogc3RyaW5nLCBhZGRpdGlvbmFsVmFsdWU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9KTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3ZhbGlkYXRvck5hbWVUb1ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2UgPSB0aGlzLl92YWxpZGF0b3JOYW1lVG9WYWxpZGF0aW9uTWVzc2FnZVt2YWxpZGF0b3JOYW1lXTtcbiAgICBpZiAoIXZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRpb25NZXNzYWdlO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbn1cbiJdfQ==