UNPKG

@zodiac-ui/formula

Version:

Formula is a powerful form generator built for Angular. Inspired by Angular Router, Formula provides a declarative interface for building reactive forms.

201 lines 17.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, EventEmitter, Inject, Injector, Input, Optional, Output, SkipSelf, ViewContainerRef, } from "@angular/core"; import { createRenderer } from "./renderer/renderers"; import { createModel } from "./node/utils"; import { FORMULA_OUTLET } from "./constants"; import { takeUntil } from "rxjs/operators"; import { createFormulaNode } from "./node/nodes"; /** * Creates a {link FormulaNode} tree that is used to render a form. `FormulaDirective` provides a declarative * approach for dynamic forms creation * * `FormulaDirective` requires a {link Formula}, if a falsy value is set the view will clear and the * form will get destroyed. * * ### Usage * * The simplest case is a formula with a single field. * * ```ts * \@Component({ * selector: "z-example", * template: ` * <z-formula [formula]="formula" [value]="value"></z-formula> * `, * }) * export class ExampleComponent { * value = { * exampleText: null * } * formula: Formula = { * type: FormulaType.CONTROL, * name: "exampleText", * component: TextFieldComponent, * data: { * label: "Example Text", * placeholder: "Type text here" * }, * } * } * ``` * * In this example we are declaring a `formula` that contains a single form control called * `exampleText`. It is rendered with a component, which is up to the user to implement. The * concept is similar to that of Angular route components. For example, the `TextFieldComponent` * may be as simple as this: * * ```ts * \@Component({ * selector: "z-text-field", * template: ` * <label [innerHTML]="ctx.data.label"></label> * <input [formControl]="ctx.model" /> * `, * }) * export class TextFieldComponent { * constructor(public ctx: FormulaContext) {} * } * ``` * * Every Formula component receives a {link FormulaContext} containing the model, data and resolve * data defined for that node in the `FormulaNode` tree * */ export class FormulaDirective { /** * @param {?} injector * @param {?} vcr * @param {?} parent */ constructor(injector, vcr, parent) { this.valueChanges = new EventEmitter(); this.statusChanges = new EventEmitter(); this.submit = new EventEmitter(); this.injector = Injector.create({ parent: injector, providers: [ { provide: ViewContainerRef, useValue: vcr, }, ], }); this.parent = parent; this.root = parent ? parent.root : this; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.formula) { if (!changes.formula.isFirstChange()) { this.renderer.destroy(); } if (this.formula) { this.renderer = createRenderer(this.formula, this.injector); this.render(); } } if (changes.value) { this.setValue(this.value); } } /** * @return {?} */ ngOnDestroy() { if (this.renderer) { this.renderer.destroy(); } } /** * @param {?} value * @return {?} */ setValue(value) { if (this.node) { this.node.setValue(value); } } /** * @param {?} form * @return {?} */ setForm(form) { if (this.form) { throw new Error("Only one top level NgForm is allowed"); } this.form = form; form.ngSubmit.subscribe(this.submit); } /** * @private * @return {?} */ render() { this.model = createModel(this.formula, this.parent ? this.parent.node.model : null); this.node = createFormulaNode(this.formula, this.model, this.parent ? this.parent.node : null); this.renderer.render(this.node); this.model.valueChanges .pipe(takeUntil(this.renderer.destroyed$)) .subscribe(this.valueChanges); this.model.statusChanges .pipe(takeUntil(this.renderer.destroyed$)) .subscribe(this.statusChanges); } } FormulaDirective.decorators = [ { type: Directive, args: [{ selector: "z-formula, [zFormula]", providers: [ { provide: FORMULA_OUTLET, useExisting: FormulaDirective, }, ], },] } ]; /** @nocollapse */ FormulaDirective.ctorParameters = () => [ { type: Injector }, { type: ViewContainerRef }, { type: undefined, decorators: [{ type: SkipSelf }, { type: Optional }, { type: Inject, args: [FORMULA_OUTLET,] }] } ]; FormulaDirective.propDecorators = { formula: [{ type: Input }], value: [{ type: Input }], valueChanges: [{ type: Output }], statusChanges: [{ type: Output }], submit: [{ type: Output }] }; if (false) { /** @type {?} */ FormulaDirective.prototype.node; /** @type {?} */ FormulaDirective.prototype.model; /** @type {?} */ FormulaDirective.prototype.renderer; /** @type {?} */ FormulaDirective.prototype.injector; /** @type {?} */ FormulaDirective.prototype.parent; /** @type {?} */ FormulaDirective.prototype.root; /** @type {?} */ FormulaDirective.prototype.form; /** @type {?} */ FormulaDirective.prototype.formula; /** @type {?} */ FormulaDirective.prototype.value; /** @type {?} */ FormulaDirective.prototype.valueChanges; /** @type {?} */ FormulaDirective.prototype.statusChanges; /** @type {?} */ FormulaDirective.prototype.submit; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aem9kaWFjLXVpL2Zvcm11bGEvIiwic291cmNlcyI6WyJsaWIvZm9ybXVsYS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLGdCQUFnQixHQUNuQixNQUFNLGVBQWUsQ0FBQTtBQUd0QixPQUFPLEVBQUUsY0FBYyxFQUFtQixNQUFNLHNCQUFzQixDQUFBO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFlLE1BQU0sY0FBYyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvRTdELE1BQU0sT0FBTyxnQkFBZ0I7Ozs7OztJQXdCekIsWUFDSSxRQUFrQixFQUNsQixHQUFxQixFQUMyQixNQUFxQjtRQVh6RCxpQkFBWSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFBO1FBR3BELGtCQUFhLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUE7UUFHckQsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFBO1FBTzFELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUM1QixNQUFNLEVBQUUsUUFBUTtZQUNoQixTQUFTLEVBQUU7Z0JBQ1A7b0JBQ0ksT0FBTyxFQUFFLGdCQUFnQjtvQkFDekIsUUFBUSxFQUFFLEdBQUc7aUJBQ2hCO2FBQ0o7U0FDSixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQzNDLENBQUM7Ozs7O0lBRU0sV0FBVyxDQUFDLE9BQU87UUFDdEIsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO2FBQzFCO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNkLElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUUzRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7YUFDaEI7U0FDSjtRQUNELElBQUksT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQzVCO0lBQ0wsQ0FBQzs7OztJQUVNLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO1NBQzFCO0lBQ0wsQ0FBQzs7Ozs7SUFFTSxRQUFRLENBQUMsS0FBSztRQUNqQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtTQUM1QjtJQUNMLENBQUM7Ozs7O0lBRU0sT0FBTyxDQUFDLElBQVk7UUFDdkIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1NBQzFEO1FBRUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFFaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3hDLENBQUM7Ozs7O0lBRU8sTUFBTTtRQUNWLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuRixJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUN6QixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDeEMsQ0FBQTtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUUvQixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVk7YUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO2FBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN6QyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7OztZQXpHSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLHVCQUF1QjtnQkFDakMsU0FBUyxFQUFFO29CQUNQO3dCQUNJLE9BQU8sRUFBRSxjQUFjO3dCQUN2QixXQUFXLEVBQUUsZ0JBQWdCO3FCQUNoQztpQkFDSjthQUNKOzs7O1lBbEZHLFFBQVE7WUFPUixnQkFBZ0I7NENBdUdYLFFBQVEsWUFBSSxRQUFRLFlBQUksTUFBTSxTQUFDLGNBQWM7OztzQkFsQmpELEtBQUs7b0JBR0wsS0FBSzsyQkFHTCxNQUFNOzRCQUdOLE1BQU07cUJBR04sTUFBTTs7OztJQXBCUCxnQ0FBd0I7O0lBQ3hCLGlDQUE2Qjs7SUFDN0Isb0NBQWdDOztJQUNoQyxvQ0FBeUI7O0lBQ3pCLGtDQUE0Qjs7SUFDNUIsZ0NBQXdCOztJQUN4QixnQ0FBbUI7O0lBRW5CLG1DQUN1Qjs7SUFFdkIsaUNBQ2lCOztJQUVqQix3Q0FDb0U7O0lBRXBFLHlDQUNxRTs7SUFFckUsa0NBQzhEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIERpcmVjdGl2ZSxcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdCxcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPcHRpb25hbCxcclxuICAgIE91dHB1dCxcclxuICAgIFNraXBTZWxmLFxyXG4gICAgVmlld0NvbnRhaW5lclJlZixcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXHJcbmltcG9ydCB7IEZvcm11bGEsIEZvcm11bGFPdXRsZXQsIEZvcm11bGFSb290IH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiXHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTmdGb3JtIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCJcclxuaW1wb3J0IHsgY3JlYXRlUmVuZGVyZXIsIEZvcm11bGFSZW5kZXJlciB9IGZyb20gXCIuL3JlbmRlcmVyL3JlbmRlcmVyc1wiXHJcbmltcG9ydCB7IGNyZWF0ZU1vZGVsIH0gZnJvbSBcIi4vbm9kZS91dGlsc1wiXHJcbmltcG9ydCB7IEZPUk1VTEFfT1VUTEVUIH0gZnJvbSBcIi4vY29uc3RhbnRzXCJcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCJcclxuaW1wb3J0IHsgY3JlYXRlRm9ybXVsYU5vZGUsIEZvcm11bGFOb2RlIH0gZnJvbSBcIi4vbm9kZS9ub2Rlc1wiXHJcblxyXG4vKipcbiAqIENyZWF0ZXMgYSB7bGluayBGb3JtdWxhTm9kZX0gdHJlZSB0aGF0IGlzIHVzZWQgdG8gcmVuZGVyIGEgZm9ybS4gYEZvcm11bGFEaXJlY3RpdmVgIHByb3ZpZGVzIGEgZGVjbGFyYXRpdmVcbiAqIGFwcHJvYWNoIGZvciBkeW5hbWljIGZvcm1zIGNyZWF0aW9uXG4gKlxuICogYEZvcm11bGFEaXJlY3RpdmVgIHJlcXVpcmVzIGEge2xpbmsgRm9ybXVsYX0sIGlmIGEgZmFsc3kgdmFsdWUgaXMgc2V0IHRoZSB2aWV3IHdpbGwgY2xlYXIgYW5kIHRoZVxuICogZm9ybSB3aWxsIGdldCBkZXN0cm95ZWQuXG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogVGhlIHNpbXBsZXN0IGNhc2UgaXMgYSBmb3JtdWxhIHdpdGggYSBzaW5nbGUgZmllbGQuXG4gKlxuICogYGBgdHNcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcInotZXhhbXBsZVwiLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDx6LWZvcm11bGEgW2Zvcm11bGFdPVwiZm9ybXVsYVwiIFt2YWx1ZV09XCJ2YWx1ZVwiPjwvei1mb3JtdWxhPlxuICAgIGAsXG59KVxuZXhwb3J0IGNsYXNzIEV4YW1wbGVDb21wb25lbnQge1xuICAgIHZhbHVlID0ge1xuICAgICAgICBleGFtcGxlVGV4dDogbnVsbFxuICAgIH1cblxuICAgIGZvcm11bGE6IEZvcm11bGEgPSB7XG4gICAgICAgIHR5cGU6IEZvcm11bGFUeXBlLkNPTlRST0wsXG4gICAgICAgIG5hbWU6IFwiZXhhbXBsZVRleHRcIixcbiAgICAgICAgY29tcG9uZW50OiBUZXh0RmllbGRDb21wb25lbnQsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGxhYmVsOiBcIkV4YW1wbGUgVGV4dFwiLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiVHlwZSB0ZXh0IGhlcmVcIlxuICAgICAgICB9LFxuICAgIH1cbn1cbiAqIGBgYFxuICpcbiAqIEluIHRoaXMgZXhhbXBsZSB3ZSBhcmUgZGVjbGFyaW5nIGEgYGZvcm11bGFgIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgZm9ybSBjb250cm9sIGNhbGxlZFxuICogYGV4YW1wbGVUZXh0YC4gSXQgaXMgcmVuZGVyZWQgd2l0aCBhIGNvbXBvbmVudCwgd2hpY2ggaXMgdXAgdG8gdGhlIHVzZXIgdG8gaW1wbGVtZW50LiBUaGVcbiAqIGNvbmNlcHQgaXMgc2ltaWxhciB0byB0aGF0IG9mIEFuZ3VsYXIgcm91dGUgY29tcG9uZW50cy4gRm9yIGV4YW1wbGUsIHRoZSBgVGV4dEZpZWxkQ29tcG9uZW50YFxuICogbWF5IGJlIGFzIHNpbXBsZSBhcyB0aGlzOlxuICpcbiAqIGBgYHRzXG4gQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwiei10ZXh0LWZpZWxkXCIsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGxhYmVsIFtpbm5lckhUTUxdPVwiY3R4LmRhdGEubGFiZWxcIj48L2xhYmVsPlxuICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sXT1cImN0eC5tb2RlbFwiIC8+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgVGV4dEZpZWxkQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3R4OiBGb3JtdWxhQ29udGV4dCkge31cbn1cbiAqIGBgYFxuICpcbiAqIEV2ZXJ5IEZvcm11bGEgY29tcG9uZW50IHJlY2VpdmVzIGEge2xpbmsgRm9ybXVsYUNvbnRleHR9IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBkYXRhIGFuZCByZXNvbHZlXG4gKiBkYXRhIGRlZmluZWQgZm9yIHRoYXQgbm9kZSBpbiB0aGUgYEZvcm11bGFOb2RlYCB0cmVlXG4gKlxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6IFwiei1mb3JtdWxhLCBbekZvcm11bGFdXCIsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IEZPUk1VTEFfT1VUTEVULFxyXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRm9ybXVsYURpcmVjdGl2ZSxcclxuICAgICAgICB9LFxyXG4gICAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm11bGFEaXJlY3RpdmUgaW1wbGVtZW50cyBGb3JtdWxhT3V0bGV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgICBwdWJsaWMgbm9kZTogRm9ybXVsYU5vZGVcclxuICAgIHB1YmxpYyBtb2RlbDogQWJzdHJhY3RDb250cm9sXHJcbiAgICBwdWJsaWMgcmVuZGVyZXI6IEZvcm11bGFSZW5kZXJlclxyXG4gICAgcHVibGljIGluamVjdG9yOiBJbmplY3RvclxyXG4gICAgcHVibGljIHBhcmVudDogRm9ybXVsYU91dGxldFxyXG4gICAgcHVibGljIHJvb3Q6IEZvcm11bGFSb290XHJcbiAgICBwdWJsaWMgZm9ybTogTmdGb3JtXHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmb3JtdWxhOiBGb3JtdWxhXHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB2YWx1ZTogYW55XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVDaGFuZ2VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NoYW5nZXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpXHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3VibWl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgQFNraXBTZWxmKCkgQE9wdGlvbmFsKCkgQEluamVjdChGT1JNVUxBX09VVExFVCkgcGFyZW50OiBGb3JtdWxhT3V0bGV0LFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5pbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICAgICAgICAgIHBhcmVudDogaW5qZWN0b3IsXHJcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IHZjcixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudFxyXG4gICAgICAgIHRoaXMucm9vdCA9IHBhcmVudCA/IHBhcmVudC5yb290IDogdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMuZm9ybXVsYSkge1xyXG4gICAgICAgICAgICBpZiAoIWNoYW5nZXMuZm9ybXVsYS5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuZGVzdHJveSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybXVsYSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlciA9IGNyZWF0ZVJlbmRlcmVyKHRoaXMuZm9ybXVsYSwgdGhpcy5pbmplY3RvcilcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNoYW5nZXMudmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5kZXN0cm95KClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFZhbHVlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubm9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUuc2V0VmFsdWUodmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGb3JtKGZvcm06IE5nRm9ybSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT25seSBvbmUgdG9wIGxldmVsIE5nRm9ybSBpcyBhbGxvd2VkXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZvcm0gPSBmb3JtXHJcblxyXG4gICAgICAgIGZvcm0ubmdTdWJtaXQuc3Vic2NyaWJlKHRoaXMuc3VibWl0KVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVuZGVyKCkge1xyXG4gICAgICAgIHRoaXMubW9kZWwgPSBjcmVhdGVNb2RlbCh0aGlzLmZvcm11bGEsIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQubm9kZS5tb2RlbCA6IG51bGwpXHJcbiAgICAgICAgdGhpcy5ub2RlID0gY3JlYXRlRm9ybXVsYU5vZGUoXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybXVsYSxcclxuICAgICAgICAgICAgdGhpcy5tb2RlbCxcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5ub2RlIDogbnVsbCxcclxuICAgICAgICApXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5ub2RlKVxyXG5cclxuICAgICAgICB0aGlzLm1vZGVsLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5yZW5kZXJlci5kZXN0cm95ZWQkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLnZhbHVlQ2hhbmdlcylcclxuXHJcbiAgICAgICAgdGhpcy5tb2RlbC5zdGF0dXNDaGFuZ2VzXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnJlbmRlcmVyLmRlc3Ryb3llZCQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMuc3RhdHVzQ2hhbmdlcylcclxuICAgIH1cclxufVxyXG4iXX0=