UNPKG

ngx-config-form

Version:
260 lines 24.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, EventEmitter, forwardRef, Input, Output } from '@angular/core'; import { FormBuilder, FormGroup, NG_VALUE_ACCESSOR } from '@angular/forms'; import { BehaviorSubject } from 'rxjs'; /** @type {?} */ const USER_PROFILE_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => FormComponent)), multi: true }; export class FormComponent { /** * @param {?} fb */ constructor(fb) { this.fb = fb; this.isReady = false; this.errorPropName = '_errMsg_'; this.autocomplete = 'off'; this.cfFormSetting = {}; this.formClass = ''; this.isDebug = false; this.cfFormReady = new EventEmitter(); this.data$ = new BehaviorSubject(this.data); } /** * @return {?} */ ngOnInit() { this.initFormGroupSetting(); } /** * @param {?} originObj * @return {?} */ writeValue(originObj) { if (!originObj) { return; } this.data = originObj; this.setFormGroupValue(); this.setReady(); } /** * @private * @return {?} */ setReady() { this.isReady = true; this.cfFormReady.emit(); } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { } /** * @param {?} key * @param {?} value * @return {?} */ notifyValueChange(key, value) { if (!this.onChange) { return; } /** @type {?} */ let v = value; /** @type {?} */ const setting = this.cfFormSetting[key]; if (setting.converter) { v = setting.converter.from(value); } this.data[key] = v; this.data$.next(this.data); this.onChange(this.data); } /** * @param {?} key * @param {?} isValid * @param {?=} info * @return {?} */ notifyValidatedInfo(key, isValid, info) { if (!this.onChange) { return; } if (isValid) { /** @type {?} */ const obj = this.data[this.errorPropName] || {}; delete obj[key]; this.data[this.errorPropName] = obj; } else { /** @type {?} */ const obj = this.data[this.errorPropName] || {}; /** @type {?} */ const oErrorObj = obj[key] || {}; obj[key] = info; this.data[this.errorPropName] = obj; } this.onChange(this.data); } /** * @return {?} */ onReady() { return this.cfFormReady; } /** * @private * @return {?} */ initFormGroupSetting() { for (const propName of Object.keys(this.cfFormSetting)) { /** @type {?} */ const setting = this.cfFormSetting[propName]; /** @type {?} */ const g = {}; for (const item of setting.items) { /** @type {?} */ const itemValidatorInfo = this.getValidators(item.validators); g[item.name] = ['', itemValidatorInfo.validatorFns, itemValidatorInfo.asyncValidatorFns]; } /** @type {?} */ const fbG = this.fb.group(g); /** @type {?} */ const groupValidatorInfo = this.getValidators(setting.validators); fbG.setValidators(groupValidatorInfo.validatorFns); fbG.setAsyncValidators(groupValidatorInfo.asyncValidatorFns); this.cfFormGroup.setControl(propName, fbG); } } /** * @private * @return {?} */ setFormGroupValue() { for (const propName of Object.keys(this.cfFormSetting)) { /** @type {?} */ const setting = this.cfFormSetting[propName]; for (const item of setting.items) { /** @type {?} */ let value = this.data[item.name] || item.value || ''; if (setting.converter) { value = setting.converter.to(value); } /** @type {?} */ const c = this.cfFormGroup.get([propName, item.name]); c.setValue(value); } } } /** * @private * @param {?} validators * @return {?} */ getValidators(validators) { /** @type {?} */ const validatorFns = []; /** @type {?} */ const asyncValidatorFns = []; for (const key of Object.keys(validators)) { /** @type {?} */ const v = validators[key]; if (v.isPromiseOrObservable) { asyncValidatorFns.push((/** @type {?} */ (v.validator))); } else { validatorFns.push((/** @type {?} */ (v.validator))); } } return { validatorFns, asyncValidatorFns }; } } FormComponent.decorators = [ { type: Component, args: [{ selector: 'cf-form', template: " <form *ngIf=\"isReady\"\n [class]=\"formClass\" \n [formGroup]=\"cfFormGroup\"\n [autocomplete]=\"autocomplete\"\n novalidate>\n\n <ng-content></ng-content>\n\n <!-- <div class=\"form-row\">\n <div class=\"form-group col-sm-10\">\n <a href=\"#\" class=\"btn btn-primary\" (click)=\"submit($event)\" [ngClass]=\"{'disabled': !(cfFormGroup.dirty && cfFormGroup.valid)}\">Submit</a>\n <a href=\"#\" class=\"btn btn-danger\" (click)=\"delete($event)\" [ngClass]=\"{'d-none': id===0}\">Delete</a>\n <a href=\"#\" class=\"btn btn-secondary\" (click)=\"goBack($event)\">Back</a>\n </div>\n </div> -->\n\n <div *ngIf=\"isDebug\">\n \n <hr /> \n cfFormGroup.value => {{cfFormGroup.value | json}} <br />\n cfFormGroup.valid => {{cfFormGroup.valid | json}} <br />\n cfFormGroup.touched => {{cfFormGroup.touched | json}} <br />\n cfFormGroup.dirty => {{cfFormGroup.dirty | json}}\n <hr />\n\n </div>\n\n </form>\n\n\n\n\n\n <!-- <form>\n <div class=\"form-group row\">\n <label for=\"inputEmail3\" class=\"col-sm-2 col-form-label\">Email</label>\n <div class=\"col-sm-10\">\n <input type=\"email\" class=\"form-control is-invalid\" id=\"inputEmail3\" placeholder=\"Email\">\n <small id=\"emailHelp\" class=\"form-text text-muted\">We'll never share your email with anyone else.</small>\n <small id=\"emailHelp\" class=\"form-text text-danger\">We'll never share your email with anyone else.</small>\n </div>\n </div>\n <div class=\"form-group row\">\n <label for=\"inputPassword3\" class=\"col-sm-2 col-form-label\">Password</label>\n <div class=\"col-sm-10\">\n <input type=\"password\" class=\"form-control\" id=\"inputPassword3\" placeholder=\"Password\">\n </div>\n </div>\n \n <fieldset class=\"form-group\">\n <div class=\"row\">\n <legend class=\"col-form-legend col-sm-2\">Radios</legend>\n <div class=\"col-sm-10\">\n <div class=\"form-check\">\n <label class=\"form-check-label\">\n <input class=\"form-check-input\" type=\"radio\" name=\"gridRadios\" id=\"gridRadios1\" value=\"option1\" checked> Option one is this and that&mdash;be sure to include why it's great\n </label>\n </div>\n <div class=\"form-check\">\n <label class=\"form-check-label\">\n <input class=\"form-check-input\" type=\"radio\" name=\"gridRadios\" id=\"gridRadios2\" value=\"option2\"> Option two can be something else and selecting it will deselect option one\n </label>\n </div>\n <div class=\"form-check disabled\">\n <label class=\"form-check-label\">\n <input class=\"form-check-input\" type=\"radio\" name=\"gridRadios\" id=\"gridRadios3\" value=\"option3\" disabled> Option three is disabled\n </label>\n </div>\n <small id=\"emailHelp\" class=\"form-text text-muted\">We'll never share your email with anyone else.</small>\n <small id=\"emailHelp\" class=\"form-text text-danger\">We'll never share your email with anyone else.</small>\n </div>\n\n </div>\n </fieldset>\n\n <div class=\"form-group row\">\n <div class=\"col-sm-2\">Checkbox</div>\n <div class=\"col-sm-10\">\n <div class=\"form-check\">\n <label class=\"form-check-label\">\n <input class=\"form-check-input\" type=\"checkbox\"> Check me out\n </label>\n </div>\n <div class=\"form-check\">\n <label class=\"form-check-label\">\n <input class=\"form-check-input\" type=\"checkbox\"> Check me out\n </label>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <div class=\"col-sm-2\">Example select</div>\n <div class=\"col-sm-10\">\n <select class=\"form-control is-invalid\" id=\"exampleFormControlSelect1\">\n <option>1</option>\n <option>2</option>\n <option>3</option>\n <option>4</option>\n <option>5</option>\n </select>\n <small id=\"emailHelp\" class=\"form-text text-muted\">We'll never share your email with anyone else.</small>\n <small id=\"emailHelp\" class=\"form-text text-danger\">We'll never share your email with anyone else.</small>\n </div>\n </div>\n <div class=\"form-group row\">\n <div class=\"col-sm-2\">Example multiple select</div>\n <div class=\"col-sm-10\">\n <select multiple class=\"form-control\" id=\"exampleFormControlSelect2\">\n <option>1</option>\n <option>2</option>\n <option>3</option>\n <option>4</option>\n <option>5</option>\n </select>\n <small id=\"emailHelp\" class=\"form-text text-muted\">We'll never share your email with anyone else.</small>\n <small id=\"emailHelp\" class=\"form-text text-danger\">We'll never share your email with anyone else.</small>\n </div>\n </div>\n <div class=\"form-group row\">\n <div class=\"col-sm-2\">Example textarea</div>\n <div class=\"col-sm-10\">\n <textarea class=\"form-control\" id=\"exampleFormControlTextarea1\" rows=\"5\"></textarea>\n <small id=\"emailHelp\" class=\"form-text text-muted\">We'll never share your email with anyone else.</small>\n <small id=\"emailHelp\" class=\"form-text text-danger\">We'll never share your email with anyone else.</small>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <div class=\"col-sm-10\">\n <a href=\"#\" class=\"btn btn-primary\">Submit</a>\n <a href=\"#\" class=\"btn btn-secondary\">Reset</a>\n <a href=\"#\" class=\"btn btn-secondary\" (click)=\"goBack($event)\">Back</a>\n </div>\n </div>\n\n\n </form> -->\n", providers: [USER_PROFILE_VALUE_ACCESSOR], styles: [""] }] } ]; /** @nocollapse */ FormComponent.ctorParameters = () => [ { type: FormBuilder } ]; FormComponent.propDecorators = { autocomplete: [{ type: Input }], cfFormSetting: [{ type: Input }], cfFormGroup: [{ type: Input }], formClass: [{ type: Input }], isDebug: [{ type: Input }], cfFormReady: [{ type: Output }] }; if (false) { /** @type {?} */ FormComponent.prototype.isReady; /** * @type {?} * @private */ FormComponent.prototype.errorPropName; /** @type {?} */ FormComponent.prototype.autocomplete; /** @type {?} */ FormComponent.prototype.cfFormSetting; /** @type {?} */ FormComponent.prototype.cfFormGroup; /** @type {?} */ FormComponent.prototype.formClass; /** @type {?} */ FormComponent.prototype.isDebug; /** @type {?} */ FormComponent.prototype.cfFormReady; /** * @type {?} * @private */ FormComponent.prototype.onChange; /** * @type {?} * @private */ FormComponent.prototype.onTouched; /** * @type {?} * @private */ FormComponent.prototype.data; /** @type {?} */ FormComponent.prototype.data$; /** * @type {?} * @private */ FormComponent.prototype.fb; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtY29uZmlnLWZvcm0vIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9mb3JtL2Zvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQTBDLFdBQVcsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoSSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOztNQU1qQywyQkFBMkIsR0FBUTtJQUN2QyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVOzs7SUFBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUM7SUFDNUMsS0FBSyxFQUFFLElBQUk7Q0FDWjtBQVFELE1BQU0sT0FBTyxhQUFhOzs7O0lBbUJ4QixZQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQWpCbkMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNSLGtCQUFhLEdBQUcsVUFBVSxDQUFDO1FBRTFCLGlCQUFZLEdBQWlCLEtBQUssQ0FBQztRQUNuQyxrQkFBYSxHQUFpQixFQUFFLENBQUM7UUFFakMsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFZixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFNakQsVUFBSyxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUd2QyxDQUFDOzs7O0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7Ozs7O0lBRUQsVUFBVSxDQUFDLFNBQWlCO1FBQzFCLElBQUksQ0FBQyxTQUFTLEVBQUU7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Y0FDaEQsWUFBWSxHQUFrQixFQUFFOztjQUNoQyxpQkFBaUIsR0FBdUIsRUFBRTtRQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7O2tCQUNuQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUN6QixJQUFJLENBQUMsQ0FBQyxxQkFBcUIsRUFBRTtnQkFDM0IsaUJBQWlCLENBQUMsSUFBSSxDQUFDLG1CQUFBLENBQUMsQ0FBQyxTQUFTLEVBQW9CLENBQUMsQ0FBQzthQUN6RDtpQkFBTTtnQkFDTCxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFBLENBQUMsQ0FBQyxTQUFTLEVBQWUsQ0FBQyxDQUFDO2FBQy9DO1NBQ0Y7UUFDRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLENBQUM7SUFDN0MsQ0FBQzs7O1lBdklGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsU0FBUztnQkFDbkIsMHdMQUFvQztnQkFFcEMsU0FBUyxFQUFFLENBQUMsMkJBQTJCLENBQUM7O2FBQ3pDOzs7O1lBbEJnRCxXQUFXOzs7MkJBd0J6RCxLQUFLOzRCQUNMLEtBQUs7MEJBQ0wsS0FBSzt3QkFDTCxLQUFLO3NCQUNMLEtBQUs7MEJBRUwsTUFBTTs7OztJQVRQLGdDQUFnQjs7Ozs7SUFDaEIsc0NBQW1DOztJQUVuQyxxQ0FBNEM7O0lBQzVDLHNDQUEwQzs7SUFDMUMsb0NBQWdDOztJQUNoQyxrQ0FBd0I7O0lBQ3hCLGdDQUF5Qjs7SUFFekIsb0NBQWlEOzs7OztJQUVqRCxpQ0FBZ0M7Ozs7O0lBQ2hDLGtDQUFpQzs7Ozs7SUFFakMsNkJBQXFCOztJQUNyQiw4QkFBdUM7Ozs7O0lBRTNCLDJCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzeW5jVmFsaWRhdG9yRm4sIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElFcnJvckluZm8gfSBmcm9tICcuLi8uLi9jb21tb24vSUVycm9ySW5mbyc7XG5pbXBvcnQgeyBJRm9ybSB9IGZyb20gJy4uLy4uL2NvbW1vbi9JRm9ybSc7XG5pbXBvcnQgeyBJRm9ybVNldHRpbmcgfSBmcm9tICcuLi8uLi9jb21tb24vSUZvcm1TZXR0aW5nJztcbmltcG9ydCB7IElJbnB1dFZhbGlkYXRvclNldHRpbmcgfSBmcm9tICcuLi8uLi9jb21tb24vSUlucHV0VmFsaWRhdG9yU2V0dGluZyc7XG5cbmNvbnN0IFVTRVJfUFJPRklMRV9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9ybUNvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjZi1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1VTRVJfUFJPRklMRV9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIElGb3JtIHtcblxuICBpc1JlYWR5ID0gZmFsc2U7XG4gIHByaXZhdGUgZXJyb3JQcm9wTmFtZSA9ICdfZXJyTXNnXyc7XG5cbiAgQElucHV0KCkgYXV0b2NvbXBsZXRlOiAnb24nIHwgJ29mZicgPSAnb2ZmJztcbiAgQElucHV0KCkgY2ZGb3JtU2V0dGluZzogSUZvcm1TZXR0aW5nID0ge307XG4gIEBJbnB1dCgpIGNmRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGZvcm1DbGFzcyA9ICcnO1xuICBASW5wdXQoKSBpc0RlYnVnID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGNmRm9ybVJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZSkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAodmFsdWUpID0+IHt9O1xuXG4gIHByaXZhdGUgZGF0YTogb2JqZWN0O1xuICBkYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodGhpcy5kYXRhKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0Rm9ybUdyb3VwU2V0dGluZygpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZShvcmlnaW5PYmo6IG9iamVjdCk6IHZvaWQge1xuICAgIGlmICghb3JpZ2luT2JqKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGF0YSA9IG9yaWdpbk9iajtcbiAgICB0aGlzLnNldEZvcm1Hcm91cFZhbHVlKCk7XG4gICAgdGhpcy5zZXRSZWFkeSgpO1xuICB9XG4gIHByaXZhdGUgc2V0UmVhZHkoKTogYW55IHtcbiAgICB0aGlzLmlzUmVhZHkgPSB0cnVlO1xuICAgIHRoaXMuY2ZGb3JtUmVhZHkuZW1pdCgpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgfVxuXG4gIG5vdGlmeVZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHYgPSB2YWx1ZTtcbiAgICBjb25zdCBzZXR0aW5nID0gdGhpcy5jZkZvcm1TZXR0aW5nW2tleV07XG4gICAgaWYgKHNldHRpbmcuY29udmVydGVyKSB7XG4gICAgICB2ID0gc2V0dGluZy5jb252ZXJ0ZXIuZnJvbSh2YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuZGF0YVtrZXldID0gdjtcblxuICAgIHRoaXMuZGF0YSQubmV4dCh0aGlzLmRhdGEpO1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy5kYXRhKTtcbiAgfVxuXG4gIG5vdGlmeVZhbGlkYXRlZEluZm8oa2V5OiBzdHJpbmcsIGlzVmFsaWQ6IGJvb2xlYW4sIGluZm8/OiBJRXJyb3JJbmZvKSB7XG4gICAgaWYgKCF0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuZGF0YVt0aGlzLmVycm9yUHJvcE5hbWVdIHx8IHt9O1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgICAgdGhpcy5kYXRhW3RoaXMuZXJyb3JQcm9wTmFtZV0gPSBvYmo7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuZGF0YVt0aGlzLmVycm9yUHJvcE5hbWVdIHx8IHt9O1xuICAgICAgY29uc3Qgb0Vycm9yT2JqID0gb2JqW2tleV0gfHwge307XG4gICAgICBvYmpba2V5XSA9IGluZm87XG4gICAgICB0aGlzLmRhdGFbdGhpcy5lcnJvclByb3BOYW1lXSA9IG9iajtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0YSk7XG4gIH1cblxuICBvblJlYWR5KCk6IEV2ZW50RW1pdHRlcjx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2ZGb3JtUmVhZHk7XG4gIH1cblxuICBwcml2YXRlIGluaXRGb3JtR3JvdXBTZXR0aW5nKCkge1xuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXModGhpcy5jZkZvcm1TZXR0aW5nKSkge1xuICAgICAgY29uc3Qgc2V0dGluZyA9IHRoaXMuY2ZGb3JtU2V0dGluZ1twcm9wTmFtZV07XG4gICAgICBjb25zdCBnID0ge307XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc2V0dGluZy5pdGVtcykge1xuICAgICAgICBjb25zdCBpdGVtVmFsaWRhdG9ySW5mbyA9IHRoaXMuZ2V0VmFsaWRhdG9ycyhpdGVtLnZhbGlkYXRvcnMpO1xuICAgICAgICBnW2l0ZW0ubmFtZV0gPSBbJycsIGl0ZW1WYWxpZGF0b3JJbmZvLnZhbGlkYXRvckZucywgaXRlbVZhbGlkYXRvckluZm8uYXN5bmNWYWxpZGF0b3JGbnNdO1xuICAgICAgfVxuICAgICAgY29uc3QgZmJHID0gdGhpcy5mYi5ncm91cChnKTtcbiAgICAgIGNvbnN0IGdyb3VwVmFsaWRhdG9ySW5mbyA9IHRoaXMuZ2V0VmFsaWRhdG9ycyhzZXR0aW5nLnZhbGlkYXRvcnMpO1xuICAgICAgZmJHLnNldFZhbGlkYXRvcnMoZ3JvdXBWYWxpZGF0b3JJbmZvLnZhbGlkYXRvckZucyk7XG4gICAgICBmYkcuc2V0QXN5bmNWYWxpZGF0b3JzKGdyb3VwVmFsaWRhdG9ySW5mby5hc3luY1ZhbGlkYXRvckZucyk7XG4gICAgICB0aGlzLmNmRm9ybUdyb3VwLnNldENvbnRyb2wocHJvcE5hbWUsIGZiRyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb3JtR3JvdXBWYWx1ZSgpIHtcbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuY2ZGb3JtU2V0dGluZykpIHtcbiAgICAgIGNvbnN0IHNldHRpbmcgPSB0aGlzLmNmRm9ybVNldHRpbmdbcHJvcE5hbWVdO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHNldHRpbmcuaXRlbXMpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5kYXRhW2l0ZW0ubmFtZV0gfHwgaXRlbS52YWx1ZSB8fCAnJztcbiAgICAgICAgaWYgKHNldHRpbmcuY29udmVydGVyKSB7XG4gICAgICAgICAgdmFsdWUgPSBzZXR0aW5nLmNvbnZlcnRlci50byh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY2ZGb3JtR3JvdXAuZ2V0KFtwcm9wTmFtZSwgaXRlbS5uYW1lXSk7XG4gICAgICAgIGMuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzOiBJSW5wdXRWYWxpZGF0b3JTZXR0aW5nKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yRm5zOiBWYWxpZGF0b3JGbltdID0gW107XG4gICAgY29uc3QgYXN5bmNWYWxpZGF0b3JGbnM6IEFzeW5jVmFsaWRhdG9yRm5bXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbGlkYXRvcnMpKSB7XG4gICAgICBjb25zdCB2ID0gdmFsaWRhdG9yc1trZXldO1xuICAgICAgaWYgKHYuaXNQcm9taXNlT3JPYnNlcnZhYmxlKSB7XG4gICAgICAgIGFzeW5jVmFsaWRhdG9yRm5zLnB1c2godi52YWxpZGF0b3IgYXMgQXN5bmNWYWxpZGF0b3JGbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0b3JGbnMucHVzaCh2LnZhbGlkYXRvciBhcyBWYWxpZGF0b3JGbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHZhbGlkYXRvckZucywgYXN5bmNWYWxpZGF0b3JGbnMgfTtcbiAgfVxuXG59XG4iXX0=