UNPKG

ngx-config-form

Version:
363 lines 28.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, EventEmitter, forwardRef, Input, Output } from '@angular/core'; import { FormBuilder, FormGroup, NG_VALUE_ACCESSOR } from '@angular/forms'; import { BehaviorSubject } from 'rxjs'; /** @type {?} */ var USER_PROFILE_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return FormComponent; })), multi: true }; var FormComponent = /** @class */ (function () { function FormComponent(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 {?} */ FormComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.initFormGroupSetting(); }; /** * @param {?} originObj * @return {?} */ FormComponent.prototype.writeValue = /** * @param {?} originObj * @return {?} */ function (originObj) { if (!originObj) { return; } this.data = originObj; this.setFormGroupValue(); this.setReady(); }; /** * @private * @return {?} */ FormComponent.prototype.setReady = /** * @private * @return {?} */ function () { this.isReady = true; this.cfFormReady.emit(); }; /** * @param {?} fn * @return {?} */ FormComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * @param {?} fn * @return {?} */ FormComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** * @param {?} isDisabled * @return {?} */ FormComponent.prototype.setDisabledState = /** * @param {?} isDisabled * @return {?} */ function (isDisabled) { }; /** * @param {?} key * @param {?} value * @return {?} */ FormComponent.prototype.notifyValueChange = /** * @param {?} key * @param {?} value * @return {?} */ function (key, value) { if (!this.onChange) { return; } /** @type {?} */ var v = value; /** @type {?} */ var 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 {?} */ FormComponent.prototype.notifyValidatedInfo = /** * @param {?} key * @param {?} isValid * @param {?=} info * @return {?} */ function (key, isValid, info) { if (!this.onChange) { return; } if (isValid) { /** @type {?} */ var obj = this.data[this.errorPropName] || {}; delete obj[key]; this.data[this.errorPropName] = obj; } else { /** @type {?} */ var obj = this.data[this.errorPropName] || {}; /** @type {?} */ var oErrorObj = obj[key] || {}; obj[key] = info; this.data[this.errorPropName] = obj; } this.onChange(this.data); }; /** * @return {?} */ FormComponent.prototype.onReady = /** * @return {?} */ function () { return this.cfFormReady; }; /** * @private * @return {?} */ FormComponent.prototype.initFormGroupSetting = /** * @private * @return {?} */ function () { var e_1, _a, e_2, _b; try { for (var _c = tslib_1.__values(Object.keys(this.cfFormSetting)), _d = _c.next(); !_d.done; _d = _c.next()) { var propName = _d.value; /** @type {?} */ var setting = this.cfFormSetting[propName]; /** @type {?} */ var g = {}; try { for (var _e = tslib_1.__values(setting.items), _f = _e.next(); !_f.done; _f = _e.next()) { var item = _f.value; /** @type {?} */ var itemValidatorInfo = this.getValidators(item.validators); g[item.name] = ['', itemValidatorInfo.validatorFns, itemValidatorInfo.asyncValidatorFns]; } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_f && !_f.done && (_b = _e.return)) _b.call(_e); } finally { if (e_2) throw e_2.error; } } /** @type {?} */ var fbG = this.fb.group(g); /** @type {?} */ var groupValidatorInfo = this.getValidators(setting.validators); fbG.setValidators(groupValidatorInfo.validatorFns); fbG.setAsyncValidators(groupValidatorInfo.asyncValidatorFns); this.cfFormGroup.setControl(propName, fbG); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_1) throw e_1.error; } } }; /** * @private * @return {?} */ FormComponent.prototype.setFormGroupValue = /** * @private * @return {?} */ function () { var e_3, _a, e_4, _b; try { for (var _c = tslib_1.__values(Object.keys(this.cfFormSetting)), _d = _c.next(); !_d.done; _d = _c.next()) { var propName = _d.value; /** @type {?} */ var setting = this.cfFormSetting[propName]; try { for (var _e = tslib_1.__values(setting.items), _f = _e.next(); !_f.done; _f = _e.next()) { var item = _f.value; /** @type {?} */ var value = this.data[item.name] || item.value || ''; if (setting.converter) { value = setting.converter.to(value); } /** @type {?} */ var c = this.cfFormGroup.get([propName, item.name]); c.setValue(value); } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (_f && !_f.done && (_b = _e.return)) _b.call(_e); } finally { if (e_4) throw e_4.error; } } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_3) throw e_3.error; } } }; /** * @private * @param {?} validators * @return {?} */ FormComponent.prototype.getValidators = /** * @private * @param {?} validators * @return {?} */ function (validators) { var e_5, _a; /** @type {?} */ var validatorFns = []; /** @type {?} */ var asyncValidatorFns = []; try { for (var _b = tslib_1.__values(Object.keys(validators)), _c = _b.next(); !_c.done; _c = _b.next()) { var key = _c.value; /** @type {?} */ var v = validators[key]; if (v.isPromiseOrObservable) { asyncValidatorFns.push((/** @type {?} */ (v.validator))); } else { validatorFns.push((/** @type {?} */ (v.validator))); } } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_5) throw e_5.error; } } return { validatorFns: validatorFns, asyncValidatorFns: 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 = function () { return [ { type: FormBuilder } ]; }; FormComponent.propDecorators = { autocomplete: [{ type: Input }], cfFormSetting: [{ type: Input }], cfFormGroup: [{ type: Input }], formClass: [{ type: Input }], isDebug: [{ type: Input }], cfFormReady: [{ type: Output }] }; return FormComponent; }()); export { FormComponent }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtY29uZmlnLWZvcm0vIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9mb3JtL2Zvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUEwQyxXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEksT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7SUFNakMsMkJBQTJCLEdBQVE7SUFDdkMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVTs7O0lBQUMsY0FBTSxPQUFBLGFBQWEsRUFBYixDQUFhLEVBQUM7SUFDNUMsS0FBSyxFQUFFLElBQUk7Q0FDWjtBQUVEO0lBeUJFLHVCQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQWpCbkMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNSLGtCQUFhLEdBQUcsVUFBVSxDQUFDO1FBRTFCLGlCQUFZLEdBQWlCLEtBQUssQ0FBQztRQUNuQyxrQkFBYSxHQUFpQixFQUFFLENBQUM7UUFFakMsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFZixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFNakQsVUFBSyxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUd2QyxDQUFDOzs7O0lBRUQsZ0NBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQzs7Ozs7SUFFRCxrQ0FBVTs7OztJQUFWLFVBQVcsU0FBaUI7UUFDMUIsSUFBSSxDQUFDLFNBQVMs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Szs4QkFFTCxNQUFNOztJQXdIVCxvQkFBQztDQUFBLEFBeklELElBeUlDO1NBbklZLGFBQWE7OztJQUV4QixnQ0FBZ0I7Ozs7O0lBQ2hCLHNDQUFtQzs7SUFFbkMscUNBQTRDOztJQUM1QyxzQ0FBMEM7O0lBQzFDLG9DQUFnQzs7SUFDaEMsa0NBQXdCOztJQUN4QixnQ0FBeUI7O0lBRXpCLG9DQUFpRDs7Ozs7SUFFakQsaUNBQWdDOzs7OztJQUNoQyxrQ0FBaUM7Ozs7O0lBRWpDLDZCQUFxQjs7SUFDckIsOEJBQXVDOzs7OztJQUUzQiwyQkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBc3luY1ZhbGlkYXRvckZuLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJRXJyb3JJbmZvIH0gZnJvbSAnLi4vLi4vY29tbW9uL0lFcnJvckluZm8nO1xuaW1wb3J0IHsgSUZvcm0gfSBmcm9tICcuLi8uLi9jb21tb24vSUZvcm0nO1xuaW1wb3J0IHsgSUZvcm1TZXR0aW5nIH0gZnJvbSAnLi4vLi4vY29tbW9uL0lGb3JtU2V0dGluZyc7XG5pbXBvcnQgeyBJSW5wdXRWYWxpZGF0b3JTZXR0aW5nIH0gZnJvbSAnLi4vLi4vY29tbW9uL0lJbnB1dFZhbGlkYXRvclNldHRpbmcnO1xuXG5jb25zdCBVU0VSX1BST0ZJTEVfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZvcm1Db21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2YtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtVU0VSX1BST0ZJTEVfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBJRm9ybSB7XG5cbiAgaXNSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIGVycm9yUHJvcE5hbWUgPSAnX2Vyck1zZ18nO1xuXG4gIEBJbnB1dCgpIGF1dG9jb21wbGV0ZTogJ29uJyB8ICdvZmYnID0gJ29mZic7XG4gIEBJbnB1dCgpIGNmRm9ybVNldHRpbmc6IElGb3JtU2V0dGluZyA9IHt9O1xuICBASW5wdXQoKSBjZkZvcm1Hcm91cDogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBmb3JtQ2xhc3MgPSAnJztcbiAgQElucHV0KCkgaXNEZWJ1ZyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBjZkZvcm1SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWUpID0+IHt9O1xuICBwcml2YXRlIG9uVG91Y2hlZDogKHZhbHVlKSA9PiB7fTtcblxuICBwcml2YXRlIGRhdGE6IG9iamVjdDtcbiAgZGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuZGF0YSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdEZvcm1Hcm91cFNldHRpbmcoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUob3JpZ2luT2JqOiBvYmplY3QpOiB2b2lkIHtcbiAgICBpZiAoIW9yaWdpbk9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRhdGEgPSBvcmlnaW5PYmo7XG4gICAgdGhpcy5zZXRGb3JtR3JvdXBWYWx1ZSgpO1xuICAgIHRoaXMuc2V0UmVhZHkoKTtcbiAgfVxuICBwcml2YXRlIHNldFJlYWR5KCk6IGFueSB7XG4gICAgdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLmNmRm9ybVJlYWR5LmVtaXQoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gIH1cblxuICBub3RpZnlWYWx1ZUNoYW5nZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5vbkNoYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB2ID0gdmFsdWU7XG4gICAgY29uc3Qgc2V0dGluZyA9IHRoaXMuY2ZGb3JtU2V0dGluZ1trZXldO1xuICAgIGlmIChzZXR0aW5nLmNvbnZlcnRlcikge1xuICAgICAgdiA9IHNldHRpbmcuY29udmVydGVyLmZyb20odmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmRhdGFba2V5XSA9IHY7XG5cbiAgICB0aGlzLmRhdGEkLm5leHQodGhpcy5kYXRhKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0YSk7XG4gIH1cblxuICBub3RpZnlWYWxpZGF0ZWRJbmZvKGtleTogc3RyaW5nLCBpc1ZhbGlkOiBib29sZWFuLCBpbmZvPzogSUVycm9ySW5mbykge1xuICAgIGlmICghdGhpcy5vbkNoYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICBjb25zdCBvYmogPSB0aGlzLmRhdGFbdGhpcy5lcnJvclByb3BOYW1lXSB8fCB7fTtcbiAgICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAgIHRoaXMuZGF0YVt0aGlzLmVycm9yUHJvcE5hbWVdID0gb2JqO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvYmogPSB0aGlzLmRhdGFbdGhpcy5lcnJvclByb3BOYW1lXSB8fCB7fTtcbiAgICAgIGNvbnN0IG9FcnJvck9iaiA9IG9ialtrZXldIHx8IHt9O1xuICAgICAgb2JqW2tleV0gPSBpbmZvO1xuICAgICAgdGhpcy5kYXRhW3RoaXMuZXJyb3JQcm9wTmFtZV0gPSBvYmo7XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGEpO1xuICB9XG5cbiAgb25SZWFkeSgpOiBFdmVudEVtaXR0ZXI8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNmRm9ybVJlYWR5O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Rm9ybUdyb3VwU2V0dGluZygpIHtcbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuY2ZGb3JtU2V0dGluZykpIHtcbiAgICAgIGNvbnN0IHNldHRpbmcgPSB0aGlzLmNmRm9ybVNldHRpbmdbcHJvcE5hbWVdO1xuICAgICAgY29uc3QgZyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHNldHRpbmcuaXRlbXMpIHtcbiAgICAgICAgY29uc3QgaXRlbVZhbGlkYXRvckluZm8gPSB0aGlzLmdldFZhbGlkYXRvcnMoaXRlbS52YWxpZGF0b3JzKTtcbiAgICAgICAgZ1tpdGVtLm5hbWVdID0gWycnLCBpdGVtVmFsaWRhdG9ySW5mby52YWxpZGF0b3JGbnMsIGl0ZW1WYWxpZGF0b3JJbmZvLmFzeW5jVmFsaWRhdG9yRm5zXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZiRyA9IHRoaXMuZmIuZ3JvdXAoZyk7XG4gICAgICBjb25zdCBncm91cFZhbGlkYXRvckluZm8gPSB0aGlzLmdldFZhbGlkYXRvcnMoc2V0dGluZy52YWxpZGF0b3JzKTtcbiAgICAgIGZiRy5zZXRWYWxpZGF0b3JzKGdyb3VwVmFsaWRhdG9ySW5mby52YWxpZGF0b3JGbnMpO1xuICAgICAgZmJHLnNldEFzeW5jVmFsaWRhdG9ycyhncm91cFZhbGlkYXRvckluZm8uYXN5bmNWYWxpZGF0b3JGbnMpO1xuICAgICAgdGhpcy5jZkZvcm1Hcm91cC5zZXRDb250cm9sKHByb3BOYW1lLCBmYkcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Rm9ybUdyb3VwVmFsdWUoKSB7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLmNmRm9ybVNldHRpbmcpKSB7XG4gICAgICBjb25zdCBzZXR0aW5nID0gdGhpcy5jZkZvcm1TZXR0aW5nW3Byb3BOYW1lXTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBzZXR0aW5nLml0ZW1zKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZGF0YVtpdGVtLm5hbWVdIHx8IGl0ZW0udmFsdWUgfHwgJyc7XG4gICAgICAgIGlmIChzZXR0aW5nLmNvbnZlcnRlcikge1xuICAgICAgICAgIHZhbHVlID0gc2V0dGluZy5jb252ZXJ0ZXIudG8odmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmNmRm9ybUdyb3VwLmdldChbcHJvcE5hbWUsIGl0ZW0ubmFtZV0pO1xuICAgICAgICBjLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFZhbGlkYXRvcnModmFsaWRhdG9yczogSUlucHV0VmFsaWRhdG9yU2V0dGluZykge1xuICAgIGNvbnN0IHZhbGlkYXRvckZuczogVmFsaWRhdG9yRm5bXSA9IFtdO1xuICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yRm5zOiBBc3luY1ZhbGlkYXRvckZuW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWxpZGF0b3JzKSkge1xuICAgICAgY29uc3QgdiA9IHZhbGlkYXRvcnNba2V5XTtcbiAgICAgIGlmICh2LmlzUHJvbWlzZU9yT2JzZXJ2YWJsZSkge1xuICAgICAgICBhc3luY1ZhbGlkYXRvckZucy5wdXNoKHYudmFsaWRhdG9yIGFzIEFzeW5jVmFsaWRhdG9yRm4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdG9yRm5zLnB1c2godi52YWxpZGF0b3IgYXMgVmFsaWRhdG9yRm4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB2YWxpZGF0b3JGbnMsIGFzeW5jVmFsaWRhdG9yRm5zIH07XG4gIH1cblxufVxuIl19