ngx-schema-forms
Version:
New features: - Ajv schema validator. - Angular forms compatible: Property tree is created using FormGroup, FormArray and FormControl classes. - Array now properly loads initial data from model. - WidgetTyep: WidgetRegistry now supports WidgetType, now wo
165 lines (164 loc) • 15.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Directive, Input, ViewContainerRef } from '@angular/core';
import { ActionRegistry } from '../model/actionregistry';
import { Unsubscriber } from '../unsubscriber';
import { WidgetFactory } from '../widgetfactory';
import { ButtonWidget } from '../widgets/base';
import { WidgetType } from '../widgetregistry';
import { TemplateElementType, TemplateSchemaElementRegistry } from '../template-schema/template-schema-element-registry';
export class FormButtonWidgetChooserDirective {
/**
* @param {?} viewContainerRef
* @param {?} widgetFactory
* @param {?} actionRegistry
* @param {?} templateRegistry
*/
constructor(viewContainerRef, widgetFactory, actionRegistry, templateRegistry) {
this.viewContainerRef = viewContainerRef;
this.widgetFactory = widgetFactory;
this.actionRegistry = actionRegistry;
this.templateRegistry = templateRegistry;
}
/**
* @return {?}
*/
getWidget() {
/** @type {?} */
const id = 'button';
if (!this.button.widget) {
return { id };
}
if (!this.button.widget.id) {
this.button.widget.id = id;
}
return this.button.widget;
}
/**
* @param {?} widgetInstance
* @return {?}
*/
getButtonAction(widgetInstance) {
return (event, params) => {
/** @type {?} */
const options = this.button.options;
if (this.formProperty.invalid && options.onInvalidFormProperty.preventClick) {
return;
}
/** @type {?} */
const action = this.actionRegistry.get(this.button.id);
if (!action) {
return;
}
action({ event, formProperty: this.formProperty }, params);
if (event.hasOwnProperty('preventDefault')) {
event.preventDefault();
}
};
}
/**
* @return {?}
*/
bindTemplateChanges() {
/** @type {?} */
const element = this.templateRegistry.getElement(this.button.id, TemplateElementType.Button);
if (!element) {
return;
}
// templateSchema button changes
this.subs = element.changes.subscribe((button) => {
/** @type {?} */
const instance = this.componentRef.instance;
// TODO make sure widget id is not changed
// TODO widget id change should trigger a form rebuild
instance.label = button.label;
if (typeof button.widget !== 'string') {
Object.assign(instance.widget, button.widget);
}
Object.assign(instance.options, button.options);
// TODO dont rebuild if there is no changes
// rebuild action in case onInvalidProperty changed
instance.action = this.getButtonAction(instance);
this.componentRef.changeDetectorRef.detectChanges();
});
}
/**
* @return {?}
*/
ngOnInit() {
/** @type {?} */
const widget = this.getWidget();
this.componentRef = this.widgetFactory.createWidget(this.viewContainerRef, widget.id, {
type: WidgetType.Button
});
/** @type {?} */
const instance = this.componentRef.instance;
instance.label = this.button.label;
instance.formProperty = this.formProperty;
if (instance.widget) {
Object.assign(instance.widget, widget);
}
else {
instance.widget = widget;
}
// update instance options, with schema options
Object.assign(instance.options, this.button.options);
// after widget has been merged with defaults
instance.action = this.getButtonAction(instance);
// react to templateSchema button changes
this.bindTemplateChanges();
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.componentRef) {
this.componentRef.destroy();
}
if (this.viewContainerRef) {
this.viewContainerRef.clear();
}
}
}
FormButtonWidgetChooserDirective.decorators = [
{ type: Directive, args: [{
selector: '[sfFormButtonWidgetChooser]'
},] }
];
/** @nocollapse */
FormButtonWidgetChooserDirective.ctorParameters = () => [
{ type: ViewContainerRef },
{ type: WidgetFactory },
{ type: ActionRegistry },
{ type: TemplateSchemaElementRegistry }
];
FormButtonWidgetChooserDirective.propDecorators = {
button: [{ type: Input }],
formProperty: [{ type: Input }]
};
tslib_1.__decorate([
Unsubscriber(),
tslib_1.__metadata("design:type", Object)
], FormButtonWidgetChooserDirective.prototype, "subs", void 0);
if (false) {
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.button;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.formProperty;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.componentRef;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.subs;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.viewContainerRef;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.widgetFactory;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.actionRegistry;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.templateRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idXR0b24td2lkZ2V0LWNob29zZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9mb3JtL2Zvcm0tYnV0dG9uLXdpZGdldC1jaG9vc2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLGdCQUFnQixFQUdqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsNkJBQTZCLEVBQzlCLE1BQU0scURBQXFELENBQUM7QUFTN0QsTUFBTTs7Ozs7OztJQWFKLFlBQ1Usa0JBQ0EsZUFDQSxnQkFDQTtRQUhBLHFCQUFnQixHQUFoQixnQkFBZ0I7UUFDaEIsa0JBQWEsR0FBYixhQUFhO1FBQ2IsbUJBQWMsR0FBZCxjQUFjO1FBQ2QscUJBQWdCLEdBQWhCLGdCQUFnQjtLQUNyQjs7OztJQUdMLFNBQVM7O1FBQ1AsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1NBQ2Y7UUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztTQUM1QjtRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztLQUMzQjs7Ozs7SUFFRCxlQUFlLENBQUMsY0FBNEI7UUFFMUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU8sRUFBUSxFQUFFOztZQUU5QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNwQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxDQUFDO2FBQ1I7O1lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RCxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ1osTUFBTSxDQUFDO2FBQ1I7WUFFRCxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUUzRCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDeEI7U0FDRixDQUFDO0tBRUg7Ozs7SUFFRCxtQkFBbUI7O1FBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUNkLG1CQUFtQixDQUFDLE1BQU0sQ0FDM0IsQ0FBQztRQUVGLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNiLE1BQU0sQ0FBQztTQUNSOztRQUdELElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTs7WUFFL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7OztZQUc1QyxRQUFRLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDOUIsRUFBRSxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDL0M7WUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7WUFHaEQsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRWpELElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDckQsQ0FBQyxDQUFDO0tBQ0o7Ozs7SUFFRCxRQUFROztRQUNOLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUNqRCxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLE1BQU0sQ0FBQyxFQUFFLEVBQ1Q7WUFDRSxJQUFJLEVBQUUsVUFBVSxDQUFDLE1BQU07U0FDeEIsQ0FDRixDQUFDOztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQzVDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbkMsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRTFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN4QztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDMUI7O1FBR0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7O1FBR3JELFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7UUFHakQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7S0FDNUI7Ozs7SUFFRCxXQUFXO1FBQ1QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM3QjtRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1NBQy9CO0tBQ0Y7OztZQS9IRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDZCQUE2QjthQUN4Qzs7OztZQXpCQyxnQkFBZ0I7WUFVVCxhQUFhO1lBSmIsY0FBYztZQVVyQiw2QkFBNkI7OztxQkFZNUIsS0FBSzsyQkFHTCxLQUFLOzs7SUFLTCxZQUFZLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIENvbXBvbmVudFJlZixcbiAgSW5wdXQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmlsdGVyLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQWN0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi9tb2RlbC9hY3Rpb25yZWdpc3RyeSc7XG5pbXBvcnQgeyBBY3Rpb24sIEFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vbW9kZWwvYWN0aW9uJztcbmltcG9ydCB7IEZvcm1Qcm9wZXJ0eSB9IGZyb20gJy4uL21vZGVsL2Zvcm0tcHJvcGVydHknO1xuaW1wb3J0IHsgVW5zdWJzY3JpYmVyIH0gZnJvbSAnLi4vdW5zdWJzY3JpYmVyJztcbmltcG9ydCB7IFdpZGdldEZhY3RvcnkgfSBmcm9tICcuLi93aWRnZXRmYWN0b3J5JztcbmltcG9ydCB7IEJ1dHRvbldpZGdldCB9IGZyb20gJy4uL3dpZGdldHMvYmFzZSc7XG5pbXBvcnQgeyBXaWRnZXRUeXBlIH0gZnJvbSAnLi4vd2lkZ2V0cmVnaXN0cnknO1xuaW1wb3J0IHsgV2lkZ2V0IH0gZnJvbSAnLi4vd2lkZ2V0cy9iYXNlL3dpZGdldCc7XG5pbXBvcnQge1xuICBUZW1wbGF0ZUVsZW1lbnRUeXBlLFxuICBUZW1wbGF0ZVNjaGVtYUVsZW1lbnRSZWdpc3RyeVxufSBmcm9tICcuLi90ZW1wbGF0ZS1zY2hlbWEvdGVtcGxhdGUtc2NoZW1hLWVsZW1lbnQtcmVnaXN0cnknO1xuaW1wb3J0IHtcbiAgQnV0dG9uQ29tcG9uZW50XG59IGZyb20gJy4uL3RlbXBsYXRlLXNjaGVtYS9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NmRm9ybUJ1dHRvbldpZGdldENob29zZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBGb3JtQnV0dG9uV2lkZ2V0Q2hvb3NlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKVxuICBidXR0b246IEJ1dHRvbldpZGdldDsgLy8gZnJvbSBzY2hlbWFcblxuICBASW5wdXQoKVxuICBmb3JtUHJvcGVydHk6IEZvcm1Qcm9wZXJ0eTtcblxuICBwcml2YXRlIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPEJ1dHRvbldpZGdldD47XG5cbiAgQFVuc3Vic2NyaWJlcigpXG4gIHByaXZhdGUgc3VicztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSB3aWRnZXRGYWN0b3J5OiBXaWRnZXRGYWN0b3J5LFxuICAgIHByaXZhdGUgYWN0aW9uUmVnaXN0cnk6IEFjdGlvblJlZ2lzdHJ5LFxuICAgIHByaXZhdGUgdGVtcGxhdGVSZWdpc3RyeTogVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbiAgKSB7IH1cblxuXG4gIGdldFdpZGdldCgpOiBXaWRnZXQgIHtcbiAgICBjb25zdCBpZCA9ICdidXR0b24nO1xuICAgIGlmICghdGhpcy5idXR0b24ud2lkZ2V0KSB7XG4gICAgICByZXR1cm4geyBpZCB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5idXR0b24ud2lkZ2V0LmlkKSB7XG4gICAgICB0aGlzLmJ1dHRvbi53aWRnZXQuaWQgPSBpZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5idXR0b24ud2lkZ2V0O1xuICB9XG5cbiAgZ2V0QnV0dG9uQWN0aW9uKHdpZGdldEluc3RhbmNlOiBCdXR0b25XaWRnZXQpOiAoZXZlbnQsIHBhcmFtcz8pID0+IHZvaWQge1xuXG4gICAgcmV0dXJuIChldmVudCwgcGFyYW1zPyk6IHZvaWQgPT4ge1xuXG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5idXR0b24ub3B0aW9ucztcbiAgICAgIGlmICh0aGlzLmZvcm1Qcm9wZXJ0eS5pbnZhbGlkICYmIG9wdGlvbnMub25JbnZhbGlkRm9ybVByb3BlcnR5LnByZXZlbnRDbGljaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uUmVnaXN0cnkuZ2V0KHRoaXMuYnV0dG9uLmlkKTtcbiAgICAgIGlmICghYWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYWN0aW9uKHsgZXZlbnQsIGZvcm1Qcm9wZXJ0eTogdGhpcy5mb3JtUHJvcGVydHkgfSwgcGFyYW1zKTtcblxuICAgICAgaWYgKGV2ZW50Lmhhc093blByb3BlcnR5KCdwcmV2ZW50RGVmYXVsdCcpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICB9XG5cbiAgYmluZFRlbXBsYXRlQ2hhbmdlcygpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy50ZW1wbGF0ZVJlZ2lzdHJ5LmdldEVsZW1lbnQ8QnV0dG9uQ29tcG9uZW50PihcbiAgICAgIHRoaXMuYnV0dG9uLmlkLFxuICAgICAgVGVtcGxhdGVFbGVtZW50VHlwZS5CdXR0b25cbiAgICApO1xuXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdGVtcGxhdGVTY2hlbWEgYnV0dG9uIGNoYW5nZXNcbiAgICB0aGlzLnN1YnMgPSBlbGVtZW50LmNoYW5nZXMuc3Vic2NyaWJlKChidXR0b24pID0+IHtcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICAgIC8vIFRPRE8gbWFrZSBzdXJlIHdpZGdldCBpZCBpcyBub3QgY2hhbmdlZFxuICAgICAgLy8gVE9ETyB3aWRnZXQgaWQgY2hhbmdlIHNob3VsZCB0cmlnZ2VyIGEgZm9ybSByZWJ1aWxkXG4gICAgICBpbnN0YW5jZS5sYWJlbCA9IGJ1dHRvbi5sYWJlbDtcbiAgICAgIGlmICh0eXBlb2YgYnV0dG9uLndpZGdldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS53aWRnZXQsIGJ1dHRvbi53aWRnZXQpO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLm9wdGlvbnMsIGJ1dHRvbi5vcHRpb25zKTtcbiAgICAgIC8vIFRPRE8gZG9udCByZWJ1aWxkIGlmIHRoZXJlIGlzIG5vIGNoYW5nZXNcbiAgICAgIC8vIHJlYnVpbGQgYWN0aW9uIGluIGNhc2Ugb25JbnZhbGlkUHJvcGVydHkgY2hhbmdlZFxuICAgICAgaW5zdGFuY2UuYWN0aW9uID0gdGhpcy5nZXRCdXR0b25BY3Rpb24oaW5zdGFuY2UpO1xuXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCB3aWRnZXQgPSB0aGlzLmdldFdpZGdldCgpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVdpZGdldDxCdXR0b25XaWRnZXQ+KFxuICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgd2lkZ2V0LmlkLFxuICAgICAge1xuICAgICAgICB0eXBlOiBXaWRnZXRUeXBlLkJ1dHRvblxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlO1xuICAgIGluc3RhbmNlLmxhYmVsID0gdGhpcy5idXR0b24ubGFiZWw7XG4gICAgaW5zdGFuY2UuZm9ybVByb3BlcnR5ID0gdGhpcy5mb3JtUHJvcGVydHk7XG5cbiAgICBpZiAoaW5zdGFuY2Uud2lkZ2V0KSB7XG4gICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLndpZGdldCwgd2lkZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2Uud2lkZ2V0ID0gd2lkZ2V0O1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBpbnN0YW5jZSBvcHRpb25zLCB3aXRoIHNjaGVtYSBvcHRpb25zXG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS5vcHRpb25zLCB0aGlzLmJ1dHRvbi5vcHRpb25zKTtcblxuICAgIC8vIGFmdGVyIHdpZGdldCBoYXMgYmVlbiBtZXJnZWQgd2l0aCBkZWZhdWx0c1xuICAgIGluc3RhbmNlLmFjdGlvbiA9IHRoaXMuZ2V0QnV0dG9uQWN0aW9uKGluc3RhbmNlKTtcblxuICAgIC8vIHJlYWN0IHRvIHRlbXBsYXRlU2NoZW1hIGJ1dHRvbiBjaGFuZ2VzXG4gICAgdGhpcy5iaW5kVGVtcGxhdGVDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld0NvbnRhaW5lclJlZikge1xuICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgfVxuICB9XG59XG4iXX0=