UNPKG

@webdev-tools/ng-nested-reactive-forms

Version:
153 lines 24.9 kB
import { Directive, Input, Optional, Output, TemplateRef, ViewContainerRef } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import { ReplaySubject } from 'rxjs/internal/ReplaySubject'; import { takeWhile } from 'rxjs/operators'; import { NrfFormDirective } from '../form/form.directive'; import { NrfFormService } from '../form/form.service'; import { NrfNestedControlContext } from './nested-control-context.class'; import { NrfFormHierarchyService } from './services/form-hierarchy.service'; import { NrfModelSetterService } from './services/model-setter.service'; var NrfNestedControlDirective = (function () { function NrfNestedControlDirective(modelSetter, templateRef, viewContainerRef, nrfForm, nrfFormService, formHierarchy) { this.modelSetter = modelSetter; this.templateRef = templateRef; this.viewContainerRef = viewContainerRef; this.formHierarchy = formHierarchy; this.isDestroyed = false; this.ready$ = new ReplaySubject(1); this.formOrService = nrfFormService || nrfForm; } NrfNestedControlDirective.prototype.ngOnInit = function () { this.modelPath = this.getModelPathWithoutFirstPart(); this.modelPieces = this.modelPath && this.modelPath.split('.'); this.controlName = this.getControlName(); this.formControl = this.getFormControl(); this.registerToFormGroup(); this.subscribeToUpdateEntityValue(); this.showViewContent(); this.emitReadyState(); }; NrfNestedControlDirective.prototype.ngOnDestroy = function () { this.isDestroyed = true; this.ready$.complete(); if (this.parentFormGroup) { this.removeFromParentFormGroup(); } }; NrfNestedControlDirective.prototype.removeFromParentFormGroup = function () { var _this = this; if (this.parentFormGroup instanceof FormGroup) { this.parentFormGroup.removeControl(this.nrfModelName); } else { var index = this.parentFormGroup.controls.findIndex(function (control) { return _this.formControl === control; }); this.parentFormGroup.removeAt(index); } }; NrfNestedControlDirective.prototype.getModelPathWithoutFirstPart = function () { var modelName = this.nrfModelName; return modelName && modelName.substr(modelName.indexOf('.') + 1); }; NrfNestedControlDirective.prototype.getControlName = function () { var modelPieces = this.modelPieces; return modelPieces && modelPieces[modelPieces.length - 1]; }; NrfNestedControlDirective.prototype.getNewFormControl = function () { var disabled = this.controlOptions && this.controlOptions.disabled; var value = this.getInitialValue(); return new FormControl({ value: value, disabled: disabled }, this.controlOptions); }; NrfNestedControlDirective.prototype.getInitialValue = function () { if (this.formOrService && this.modelPath) { return this.modelSetter.getValue(this.modelPath, this.formOrService.formData); } return null; }; NrfNestedControlDirective.prototype.showViewContent = function () { var context = new NrfNestedControlContext(this.formControl, this.formOrService && this.formOrService.formGroup, this); this.viewContainerRef.createEmbeddedView(this.templateRef, context); }; NrfNestedControlDirective.prototype.registerToFormGroup = function () { if (this.parentFormGroup) { return; } this.parentFormGroup = this.getParentFormGroup(); if (this.parentFormGroup) { if (this.parentFormGroup instanceof FormGroup) { this.parentFormGroup.addControl(this.modelPath, this.formControl); } else { var index = this.controlName; this.parentFormGroup.insert(parseInt(index, 10), this.formControl); } } }; NrfNestedControlDirective.prototype.getParentFormGroup = function () { var rootFormGroup = this.formOrService && this.formOrService.formGroup; if (!rootFormGroup || !this.modelPath) { return null; } var formGroupPath = Array.from(this.modelPieces); return this.formHierarchy.getNestedControl(rootFormGroup, formGroupPath); }; NrfNestedControlDirective.prototype.getFormControl = function () { var formGroup = this.getParentFormGroup(); var formControl = formGroup && this.nrfModelName && ((formGroup.get(this.nrfModelName))); if (!formControl) { formControl = this.getNewFormControl(); } return formControl; }; NrfNestedControlDirective.prototype.subscribeToUpdateEntityValue = function () { var _this = this; this.formControl.valueChanges .pipe(takeWhile(function () { return !_this.isDestroyed; })) .subscribe(function (newValue) { return _this.setModelValue(newValue); }); }; NrfNestedControlDirective.prototype.setModelValue = function (newValue) { if (this.formOrService && this.modelPath) { return this.modelSetter.setValue(this.modelPath, newValue || '', this.formOrService.formData); } }; NrfNestedControlDirective.prototype.emitReadyState = function () { this.ready$.next(this); }; NrfNestedControlDirective.decorators = [ { type: Directive, args: [{ selector: '[nrfNestedControl]', exportAs: 'nrfNestedControl', },] } ]; NrfNestedControlDirective.ctorParameters = function () { return [ { type: NrfModelSetterService }, { type: TemplateRef }, { type: ViewContainerRef }, { type: NrfFormDirective, decorators: [{ type: Optional }] }, { type: NrfFormService, decorators: [{ type: Optional }] }, { type: NrfFormHierarchyService } ]; }; NrfNestedControlDirective.propDecorators = { nrfModelName: [{ type: Input, args: ['nrfNestedControl',] }], controlOptions: [{ type: Input, args: ['nrfNestedControlControlOptions',] }], ready$: [{ type: Output }] }; return NrfNestedControlDirective; }()); export { NrfNestedControlDirective }; if (false) { NrfNestedControlDirective.prototype.isDestroyed; NrfNestedControlDirective.prototype.parentFormGroup; NrfNestedControlDirective.prototype.formControl; NrfNestedControlDirective.prototype.modelPath; NrfNestedControlDirective.prototype.modelPieces; NrfNestedControlDirective.prototype.controlName; NrfNestedControlDirective.prototype.formOrService; NrfNestedControlDirective.prototype.nrfModelName; NrfNestedControlDirective.prototype.controlOptions; NrfNestedControlDirective.prototype.ready$; NrfNestedControlDirective.prototype.modelSetter; NrfNestedControlDirective.prototype.templateRef; NrfNestedControlDirective.prototype.viewContainerRef; NrfNestedControlDirective.prototype.formHierarchy; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLWNvbnRyb2wuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHdlYmRldi10b29scy9uZy1uZXN0ZWQtcmVhY3RpdmUtZm9ybXMvIiwic291cmNlcyI6WyJsaWIvbmVzdGVkLWNvbnRyb2wvbmVzdGVkLWNvbnRyb2wuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQWEsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBOEJ4RTtJQWdDRSxtQ0FDbUIsV0FBa0MsRUFDbEMsV0FBNkIsRUFDN0IsZ0JBQWtDLEVBQ3ZDLE9BQXlCLEVBQ3pCLGNBQThCLEVBQ3pCLGFBQXNDO1FBTHRDLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtRQUNsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFDN0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUdsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBeUI7UUFqQ3pELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBdURELFdBQU0sR0FBRyxJQUFJ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S0FBSyxTQUFDLGdDQUFnQzt5QkFLdEMsTUFBTTs7SUE4SlQsZ0NBQUM7Q0FBQSxBQTFORCxJQTBOQztTQXROWSx5QkFBeUI7O0lBQ3BDLGdEQUFvQjtJQUNwQixvREFBdUM7SUFDdkMsZ0RBQXlCO0lBS3pCLDhDQUFrQjtJQUtsQixnREFBOEI7SUFNOUIsZ0RBQW9CO0lBT3BCLGtEQUFrRTtJQWlCbEUsaURBQWdEO0lBUWhELG1EQUEyRTtJQUszRSwyQ0FBaUQ7SUEzQi9DLGdEQUFtRDtJQUNuRCxnREFBOEM7SUFDOUMscURBQW1EO0lBR25ELGtEQUF1RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcy9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0JztcbmltcG9ydCB7IHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnJmRm9ybURpcmVjdGl2ZSB9IGZyb20gJy4uL2Zvcm0vZm9ybS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTnJmRm9ybVNlcnZpY2UgfSBmcm9tICcuLi9mb3JtL2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBOcmZDb250cm9sT3B0aW9ucyB9IGZyb20gJy4vY29udHJvbC1vcHRpb25zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOcmZOZXN0ZWRDb250cm9sQ29udGV4dCB9IGZyb20gJy4vbmVzdGVkLWNvbnRyb2wtY29udGV4dC5jbGFzcyc7XG5pbXBvcnQgeyBOcmZGb3JtSGllcmFyY2h5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZm9ybS1oaWVyYXJjaHkuc2VydmljZSc7XG5pbXBvcnQgeyBOcmZNb2RlbFNldHRlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL21vZGVsLXNldHRlci5zZXJ2aWNlJztcblxuLyogdHNsaW50OmRpc2FibGUgdGVyLXBhZGRlZC1ibG9ja3MgKi9cblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBjb250cm9sIG5lc3RlZCBpbnB1dHMgYW5kIHNldHMgdmFsdWVzIG9uIHRoZSBPcmlnaW5hbCBNb2RlbCBzZXQgYXQge0BsaW5rIE5yZkZvcm1EaXJlY3RpdmUjbnJmRW50aXR5fVxuICpcbiAqICMjIyMgR2l2ZW4gYW4gbnJmRW50aXR5IG9uIHRoZSBjb250cm9sbGVyOlxuICogYGBgdHlwZXNjcmlwdFxuICogdGhpcy51c2VyTW9kZWwgPSB7XG4gKiAgICBmaXJzdE5hbWU6ICdKb2huJyxcbiAqICAgIGFkZHJlc3M6IHtcbiAqICAgICAgICBzdHJlZXQ6ICdDYXJuYWJ5IFN0cmVldCdcbiAqICAgIH1cbiAqIH07XG4gKiBgYGBcbiAqXG4gKiAjIyMjIFVzZSBpdCBvbiB0aGUgZm9ybVxuICogYGBgaHRtbFxuICogPGZvcm0gW25yZkVudGl0eV09XCJ1c2VyTW9kZWxcIj5cbiAqICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAqICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIj5OYW1lOjwvbGFiZWw+XG4gKlxuICogICAgICA8ZGl2ICpucmZOZXN0ZWRDb250cm9sPVwiJ3VzZXJNb2RlbC5maXJzdE5hbWUnOyBsZXQgY29udHJvbD1mb3JtQ29udHJvbFwiPlxuICogICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiIC8+XG4gKiAgICAgIDwvZGl2PlxuICogICA8L2Rpdj5cbiAqIDwvZm9ybT5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbnJmTmVzdGVkQ29udHJvbF0nLFxuICBleHBvcnRBczogJ25yZk5lc3RlZENvbnRyb2wnLFxufSlcbmV4cG9ydCBjbGFzcyBOcmZOZXN0ZWRDb250cm9sRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICBwYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cCB8IEZvcm1BcnJheTtcbiAgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCBhbmQgZ2V0IHZhbHVlIG9uIHRoZSBlbnRpdHkgbW9kZWxcbiAgICovXG4gIG1vZGVsUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcnJheSBmcm9tIG1vZGVsIHBhdGggc3BsaXQgYnkgJy4nXG4gICAqL1xuICBwcml2YXRlIG1vZGVsUGllY2VzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGxhc3QgcGFydCBvZiB0aGUgZG90LW5vdGF0aW9uIHBhdGggcHJvdmlkZWQgb24gW25yZk1vZGVsTmFtZV17QGxpbmsgbnJmTW9kZWxOYW1lfSBwcm9wZXJ0eS5cbiAgICogQ2FuIGJlIHVzZWQgd2l0aCBmb3JtQ29udHJvbE5hbWUgcHJvcGVydHlcbiAgICovXG4gIGNvbnRyb2xOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvbGRzIGFuIGluc3RhbmNlIG9mIGEgTnJmRm9ybSBvciBhIE5yZlNlcnZpY2UuXG4gICAqIElmIHRoZSBmb3JtIGlzIHdyYXBwZWQgaW5zaWRlIGEgZGlyZWN0aXZlIHdpdGggbmctY29udGVudCwgdGhlIE5yZkZvcm1TZXJ2aWNlIE1VU1QgYmUgcHJvdmlkZWQuXG4gICAqIE90aGVyd2lzZSB0aGUgbnJmRm9ybSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1PclNlcnZpY2U6IE5yZkZvcm1EaXJlY3RpdmUgfCBOcmZGb3JtU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsU2V0dGVyOiBOcmZNb2RlbFNldHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgQE9wdGlvbmFsKCkgbnJmRm9ybTogTnJmRm9ybURpcmVjdGl2ZSxcbiAgICBAT3B0aW9uYWwoKSBucmZGb3JtU2VydmljZTogTnJmRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtSGllcmFyY2h5OiBOcmZGb3JtSGllcmFyY2h5U2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JtT3JTZXJ2aWNlID0gbnJmRm9ybVNlcnZpY2UgfHwgbnJmRm9ybTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlIG5vLWlucHV0LXJlbmFtZVxuICAvKipcbiAgICogVGhlIGRvdCBub3RhdGlvbiBmdWxsIG5hbWUgb2YgdGhlIG5yZkVudGl0eVxuICAgKi9cbiAgQElucHV0KCducmZOZXN0ZWRDb250cm9sJykgbnJmTW9kZWxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFtBYnN0cmFjdENvbnRyb2xPcHRpb25zXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Fic3RyYWN0Q29udHJvbE9wdGlvbnN9XG4gICAqIGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRvcnMgbGlzdCBhbmQgdGhlIHVwZGF0ZS1vbiBzdHJhdGVneVxuICAgKlxuICAgKiBJdCB3aWxsIGJlIHNldCBvbiB0aGUgZm9ybUNvbnRyb2wgd2hpbGUgaW5pdGlhdGluZyBhIG5ldyBvbmUuXG4gICAqL1xuICBASW5wdXQoJ25yZk5lc3RlZENvbnRyb2xDb250cm9sT3B0aW9ucycpIGNvbnRyb2xPcHRpb25zOiBOcmZDb250cm9sT3B0aW9ucztcblxuICAvKipcbiAgICogRW1pdCByaWdodCBhZnRlciB0aGUgdmlldyB3ZXJlIHJlbmRlcmVkIGFuZCB0aGUgY29tcG9uZW50IGFuZCBpdHMgdmFyaWFibGVzIGFyYSBhdmFpbGFibGUuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcmVhZHkkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoaXMgaW5wdXQgY29tcG9uZW50IHRvIGl0cyBwYXJlbnQgZm9ybSBbRm9ybUdyb3VwXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Zvcm1Hcm91cH1cbiAgICpcbiAgICogQW5kIHN0YXJ0cyB0byBlbWl0IHRoZSBpbnB1dCdzIHZhbHVlIHdoZW4gaXQgY2hhbmdlcy5cbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubW9kZWxQYXRoID0gdGhpcy5nZXRNb2RlbFBhdGhXaXRob3V0Rmlyc3RQYXJ0KCk7XG4gICAgdGhpcy5tb2RlbFBpZWNlcyA9IHRoaXMubW9kZWxQYXRoICYmIHRoaXMubW9kZWxQYXRoLnNwbGl0KCcuJyk7XG4gICAgdGhpcy5jb250cm9sTmFtZSA9IHRoaXMuZ2V0Q29udHJvbE5hbWUoKTtcbiAgICB0aGlzLmZvcm1Db250cm9sID0gdGhpcy5nZXRGb3JtQ29udHJvbCgpO1xuICAgIHRoaXMucmVnaXN0ZXJUb0Zvcm1Hcm91cCgpO1xuICAgIHRoaXMuc3Vic2NyaWJlVG9VcGRhdGVFbnRpdHlWYWx1ZSgpO1xuICAgIHRoaXMuc2hvd1ZpZXdDb250ZW50KCk7XG4gICAgdGhpcy5lbWl0UmVhZHlTdGF0ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5yZWFkeSQuY29tcGxldGUoKTtcblxuICAgIGlmICh0aGlzLnBhcmVudEZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5yZW1vdmVGcm9tUGFyZW50Rm9ybUdyb3VwKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVGcm9tUGFyZW50Rm9ybUdyb3VwKCkge1xuICAgIGlmICh0aGlzLnBhcmVudEZvcm1Hcm91cCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5wYXJlbnRGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCh0aGlzLm5yZk1vZGVsTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wYXJlbnRGb3JtR3JvdXAuY29udHJvbHMuZmluZEluZGV4KChjb250cm9sOiBhbnkpID0+IHRoaXMuZm9ybUNvbnRyb2wgPT09IGNvbnRyb2wpO1xuICAgICAgdGhpcy5wYXJlbnRGb3JtR3JvdXAucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRvdCBub3RhdGlvbiBwYXRoIG9mIHRoZSBFbnRpdHksIHdpdGhvdXQgdGhlIGZpcnN0IHBhcnQsXG4gICAqIGJlY2F1c2UgaXQgaXMgdGhlIEVudGl0eSBpdHNlbGYuXG4gICAqL1xuICBwcml2YXRlIGdldE1vZGVsUGF0aFdpdGhvdXRGaXJzdFBhcnQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSB0aGlzLm5yZk1vZGVsTmFtZTtcbiAgICByZXR1cm4gbW9kZWxOYW1lICYmIG1vZGVsTmFtZS5zdWJzdHIobW9kZWxOYW1lLmluZGV4T2YoJy4nKSArIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhc3QgcGFydCBvZiB0aGUgZG90LW5vdGF0aW9uIHBhdGgsIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250cm9sIG5hbWUgaXRzZWxmLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb250cm9sTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1vZGVsUGllY2VzID0gdGhpcy5tb2RlbFBpZWNlcztcbiAgICByZXR1cm4gbW9kZWxQaWVjZXMgJiYgbW9kZWxQaWVjZXNbbW9kZWxQaWVjZXMubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFudGlhdGUgYSBuZXcgW0Zvcm1Db250cm9sXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Zvcm1Db250cm9sfSBhbmQgcmV0dXJuIGl0XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0TmV3Rm9ybUNvbnRyb2woKTogRm9ybUNvbnRyb2wge1xuICAgIGNvbnN0IGRpc2FibGVkID0gdGhpcy5jb250cm9sT3B0aW9ucyAmJiB0aGlzLmNvbnRyb2xPcHRpb25zLmRpc2FibGVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRJbml0aWFsVmFsdWUoKTtcblxuICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZSwgZGlzYWJsZWQgfSwgdGhpcy5jb250cm9sT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBbbnJmRW50aXR5XXtAbGluayBOcmZGb3JtRGlyZWN0aXZlI25yZkVudGl0eX1cbiAgICovXG4gIHByb3RlY3RlZCBnZXRJbml0aWFsVmFsdWUoKTogYW55IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZm9ybU9yU2VydmljZSAmJiB0aGlzLm1vZGVsUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMubW9kZWxTZXR0ZXIuZ2V0VmFsdWUodGhpcy5tb2RlbFBhdGgsIHRoaXMuZm9ybU9yU2VydmljZS5mb3JtRGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHNob3dWaWV3Q29udGVudCgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gbmV3IE5yZk5lc3RlZENvbnRyb2xDb250ZXh0KFxuICAgICAgdGhpcy5mb3JtQ29udHJvbCxcbiAgICAgIHRoaXMuZm9ybU9yU2VydmljZSAmJiB0aGlzLmZvcm1PclNlcnZpY2UuZm9ybUdyb3VwLFxuICAgICAgdGhpcyxcbiAgICApO1xuXG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlUmVmLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGlzIGlucHV0IHRvIGl0cyBwYXJlbnQgW0Zvcm1Hcm91cF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtR3JvdXB9XG4gICAqIHRvIGVuYWJsZSB2YWxpZGF0aW9ucyBhbmQgZGF0YSBtYW5pcHVsYXRpb25cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJUb0Zvcm1Hcm91cCgpIHtcbiAgICBpZiAodGhpcy5wYXJlbnRGb3JtR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudEZvcm1Hcm91cCA9IHRoaXMuZ2V0UGFyZW50Rm9ybUdyb3VwKCk7XG5cbiAgICBpZiAodGhpcy5wYXJlbnRGb3JtR3JvdXApIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudEZvcm1Hcm91cCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLnBhcmVudEZvcm1Hcm91cC5hZGRDb250cm9sKHRoaXMubW9kZWxQYXRoLCB0aGlzLmZvcm1Db250cm9sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb250cm9sTmFtZTtcbiAgICAgICAgdGhpcy5wYXJlbnRGb3JtR3JvdXAuaW5zZXJ0KHBhcnNlSW50KGluZGV4LCAxMCksIHRoaXMuZm9ybUNvbnRyb2wpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgaWYgdGhpcyBpbnB1dCBpcyBpbnNpZGUgYSBbTnJmRm9ybURpcmVjdGl2ZV17QGxpbmsgTnJmRm9ybURpcmVjdGl2ZX1cbiAgICogYW5kIHJldHVybiBpdHMgW0Zvcm1Hcm91cF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtR3JvdXB9XG4gICAqXG4gICAqIE90aGVyd2lzZSBhIG5ldyBlbXB0eSBbRm9ybUdyb3VwXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Zvcm1Hcm91cH1cbiAgICovXG4gIHByaXZhdGUgZ2V0UGFyZW50Rm9ybUdyb3VwKCk6IEZvcm1Hcm91cCB8IEZvcm1BcnJheSB7XG4gICAgY29uc3Qgcm9vdEZvcm1Hcm91cCA9IHRoaXMuZm9ybU9yU2VydmljZSAmJiB0aGlzLmZvcm1PclNlcnZpY2UuZm9ybUdyb3VwO1xuXG4gICAgaWYgKCFyb290Rm9ybUdyb3VwIHx8ICF0aGlzLm1vZGVsUGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybUdyb3VwUGF0aCA9IEFycmF5LmZyb20odGhpcy5tb2RlbFBpZWNlcyk7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUhpZXJhcmNoeS5nZXROZXN0ZWRDb250cm9sKHJvb3RGb3JtR3JvdXAsIGZvcm1Hcm91cFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBpZiB0aGUgW0Zvcm1Hcm91cF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtR3JvdXB9IGhhcyBhbiBjb250cm9sIHdpdGggdGhlIGN1cnJlbnQgbmFtZSBhbmQgcmV0dXJuIGl0LlxuICAgKiBPdGhlcndpc2UgcmV0dXJuIGEgbmV3IFtGb3JtQ29udHJvbF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtQ29udHJvbH1cbiAgICovXG4gIHByb3RlY3RlZCBnZXRGb3JtQ29udHJvbCgpOiBGb3JtQ29udHJvbCB7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRQYXJlbnRGb3JtR3JvdXAoKTtcbiAgICBsZXQgZm9ybUNvbnRyb2wgPSBmb3JtR3JvdXAgJiYgdGhpcy5ucmZNb2RlbE5hbWUgJiYgPEZvcm1Db250cm9sPmZvcm1Hcm91cC5nZXQodGhpcy5ucmZNb2RlbE5hbWUpO1xuXG4gICAgaWYgKCFmb3JtQ29udHJvbCkge1xuICAgICAgZm9ybUNvbnRyb2wgPSB0aGlzLmdldE5ld0Zvcm1Db250cm9sKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1Db250cm9sO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBbdmFsdWVDaGFuZ2VzXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Fic3RyYWN0Q29udHJvbCN2YWx1ZUNoYW5nZXN9IGFuZCB1cGRhdGUgdGhlIEVudGl0eSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1VwZGF0ZUVudGl0eVZhbHVlKCkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gIXRoaXMuaXNEZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHRoaXMuc2V0TW9kZWxWYWx1ZShuZXdWYWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIFtmb3JtRGF0YV17QGxpbmsgTnJmRm9ybURpcmVjdGl2ZSNmb3JtRGF0YX1cbiAgICovXG4gIHNldE1vZGVsVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1PclNlcnZpY2UgJiYgdGhpcy5tb2RlbFBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsU2V0dGVyLnNldFZhbHVlKHRoaXMubW9kZWxQYXRoLCBuZXdWYWx1ZSB8fCAnJywgdGhpcy5mb3JtT3JTZXJ2aWNlLmZvcm1EYXRhKTtcbiAgICB9XG4gIH1cblxuICBlbWl0UmVhZHlTdGF0ZSgpIHtcbiAgICB0aGlzLnJlYWR5JC5uZXh0KHRoaXMpO1xuICB9XG59XG4iXX0=