@yyasinaslan/easyform
Version:
Angular Easy Form
221 lines • 27.7 kB
JavaScript
import { DestroyRef, Directive, EventEmitter, inject, Injector, Input, Output, ViewContainerRef } from '@angular/core';
import { EasyFormComponent } from "../easy-form/easy-form.component";
import { isComponent } from "../helpers/component-helper";
import { filter } from "rxjs";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import * as i0 from "@angular/core";
export class FormFieldDirective {
constructor() {
this.destroyRef = inject(DestroyRef);
this.viewContainerRef = inject(ViewContainerRef);
this.easyFormComponent = inject(EasyFormComponent);
this.disabled = false;
// It emits control value changes
this.change = new EventEmitter();
// Emit all events
this.fieldEvent = new EventEmitter();
// Filter events
this.focus = this.fieldEvent.pipe(filter(e => e.type == 'focus' || e.type == 'focusin'));
this.blur = this.fieldEvent.pipe(filter(e => e.type == 'blur' || e.type == 'focusout'));
// Event emitters derived from fieldEvent
this.input = this.fieldEvent.pipe(filter(e => e.type == 'input'));
this.keyup = this.fieldEvent.pipe(filter(e => e.type == 'keyup'));
this.keydown = this.fieldEvent.pipe(filter(e => e.type == 'keydown'));
}
get value() {
return this.control?.value;
}
get form() {
return this.easyFormComponent.form;
}
ngOnChanges(changes) {
if (changes['path']) {
this.pathChanged();
}
if (changes['disabled']) {
const control = this.control;
if (control) {
if (this.disabled) {
control.disable();
}
else {
control.enable();
}
}
}
if (changes['props'] && this.componentRef) {
this.componentRef.instance.props.set(changes['props'].currentValue);
this.componentRef.changeDetectorRef.detectChanges();
}
}
pathChanged() {
const control = this.setControl();
if (control) {
if (this.valueChangeSubscription) {
this.valueChangeSubscription.unsubscribe();
}
this.control = control;
this.valueChangeSubscription = control.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(value => {
this.change.emit(value);
});
this.render();
}
}
setControl() {
const path = this.path;
if (!path || path.length === 0) {
return;
}
if (!this.easyFormComponent.form) {
return undefined;
}
const control = this.easyFormComponent.form.getControl(path);
if (!control) {
return undefined;
}
return control;
}
async render() {
await this._render();
const control = this.control;
if (control) {
setTimeout(() => {
if (this.disabled) {
control.disable();
}
else {
control.enable();
}
});
}
}
async _render() {
const path = this.path;
if (!path) {
return;
}
const schema = this.form.getSchema(path);
if (!schema) {
throw new Error(`Path not found for ${path}`);
}
let componentDefinition = typeof schema.controlType === 'string' ? this.form.getComponentType(schema.controlType) : schema.controlType;
let component;
if (!componentDefinition) {
// Get component from formConfig
componentDefinition = this.easyFormComponent.getComponentType(schema.controlType);
}
if (!componentDefinition) {
throw new Error(`Component configuration not found for ${schema.controlType}`);
}
if (!isComponent(componentDefinition)) {
// Assume this is lazy loading component
if (typeof componentDefinition !== 'function') {
throw new Error(`${schema.controlType} is not a valid Angular component`);
}
const lazyLoadingComponent = componentDefinition;
const loaded = await lazyLoadingComponent();
if (loaded.default) {
component = loaded.default;
}
else if (typeof loaded === 'function' && isComponent(loaded)) {
component = loaded;
}
else {
throw new Error(`${schema.controlType} has no default export or is not a valid Angular component`);
}
}
else {
component = componentDefinition;
}
// Double check if component is a valid Angular component
if (!isComponent(component)) {
throw new Error(`${schema.controlType} is not a valid Angular component. Please provide a valid Angular component for ${schema.controlType} on provider EasyFormConfig`);
}
// Forwards this instance to the child component
const injector = Injector.create({
parent: this.viewContainerRef.injector,
providers: [
{
provide: FormFieldDirective,
useValue: this
}
]
});
this.viewContainerRef.clear();
if (this.componentRef) {
this.componentRef.destroy();
}
const componentRef = this.viewContainerRef.createComponent(component, {
injector: injector
});
this.componentRef = componentRef;
this.instance = componentRef.instance;
// This usage is removed in favor of directives props input
// if (schema.props) {
// // Initialize props
// this.instance.props.set(schema.props);
// }
// Set component specific properties
if (this.props) {
this.componentRef.instance.props.set(this.props);
}
componentRef.instance.easyFormControl.set({
id: path.join('_') + '_' + Math.random().toString(36).substring(2),
control: this.control,
schema: schema
});
componentRef.changeDetectorRef.detectChanges();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormFieldDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.12", type: FormFieldDirective, isStandalone: true, selector: "ng-container[easyFormField]", inputs: { disabled: "disabled", props: "props", path: ["path", "path", (val) => {
const path = val;
if (typeof path === 'string') {
return path.split('.');
}
return path;
}] }, outputs: { change: "change", fieldEvent: "fieldEvent", focus: "focus", blur: "blur", input: "input", keyup: "keyup", keydown: "keydown" }, exportAs: ["easyFormField"], usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormFieldDirective, decorators: [{
type: Directive,
args: [{
selector: 'ng-container[easyFormField]',
standalone: true,
exportAs: 'easyFormField',
}]
}], propDecorators: { disabled: [{
type: Input
}], props: [{
type: Input
}], change: [{
type: Output
}], fieldEvent: [{
type: Output
}], focus: [{
type: Output,
args: ["focus"]
}], blur: [{
type: Output,
args: ["blur"]
}], input: [{
type: Output,
args: ["input"]
}], keyup: [{
type: Output,
args: ["keyup"]
}], keydown: [{
type: Output,
args: ["keydown"]
}], path: [{
type: Input,
args: [{
required: true,
transform: (val) => {
const path = val;
if (typeof path === 'string') {
return path.split('.');
}
return path;
}
}]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lYXN5LWZvcm0vc3JjL2xpYi9kaXJlY3RpdmVzL2Zvcm0tZmllbGQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxVQUFVLEVBQ1YsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFFTCxNQUFNLEVBRU4sZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBRW5FLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUV4RCxPQUFPLEVBQUMsTUFBTSxFQUEyQixNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7QUFROUQsTUFBTSxPQUFPLGtCQUFrQjtJQUwvQjtRQU1FLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDL0IscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDM0Msc0JBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFFcEMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQixpQ0FBaUM7UUFDdkIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDM0Msa0JBQWtCO1FBQ1IsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDakQsZ0JBQWdCO1FBQ0MsVUFBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLENBQTJC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QUMsT0FBTztnQkFDSSxPQUFPO3NCQUF6QixNQUFNO3VCQUFDLFNBQVM7Z0JBYWQsSUFBSTtzQkFUTixLQUFLO3VCQUFDO3dCQUNMLFFBQVEsRUFBRSxJQUFJO3dCQUNkLFNBQVMsRUFBRSxDQUFDLEdBQW9DLEVBQTBCLEVBQUU7NEJBQzFFLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQzs0QkFDakIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQ0FDN0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN6QixDQUFDOzRCQUNELE9BQU8sSUFBSSxDQUFDO3dCQUNkLENBQUM7cUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudFJlZixcclxuICBEZXN0cm95UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgaW5qZWN0LFxyXG4gIEluamVjdG9yLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q29udGFpbmVyUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge0Vhc3lGb3JtQ29tcG9uZW50fSBmcm9tIFwiLi4vZWFzeS1mb3JtL2Vhc3ktZm9ybS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtFYXN5Rm9ybUNvbnRyb2x9IGZyb20gXCIuLi9lYXN5LWZvcm0tY29udHJvbFwiO1xyXG5pbXBvcnQge2lzQ29tcG9uZW50fSBmcm9tIFwiLi4vaGVscGVycy9jb21wb25lbnQtaGVscGVyXCI7XHJcbmltcG9ydCB7RWFzeUZvcm1Db250cm9sQ29tcG9uZW50LCBMYXp5TG9hZGluZ0NvbXBvbmVudH0gZnJvbSBcIi4uL3Rva2Vucy9lYXN5LWZvcm0tY29uZmlnXCI7XHJcbmltcG9ydCB7ZmlsdGVyLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIjtcclxuaW1wb3J0IHtFYXN5Rm9ybUZpZWxkfSBmcm9tIFwiLi4vZWFzeS1mb3JtLWZpZWxkXCI7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ25nLWNvbnRhaW5lcltlYXN5Rm9ybUZpZWxkXScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBleHBvcnRBczogJ2Vhc3lGb3JtRmllbGQnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUZpZWxkRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpXHJcbiAgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKVxyXG4gIGVhc3lGb3JtQ29tcG9uZW50ID0gaW5qZWN0KEVhc3lGb3JtQ29tcG9uZW50KVxyXG5cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuICAvLyBJdCBlbWl0cyBjb250cm9sIHZhbHVlIGNoYW5nZXNcclxuICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgLy8gRW1pdCBhbGwgZXZlbnRzXHJcbiAgQE91dHB1dCgpIGZpZWxkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xyXG4gIC8vIEZpbHRlciBldmVudHNcclxuICBAT3V0cHV0KFwiZm9jdXNcIikgZm9jdXMgPSB0aGlzLmZpZWxkRXZlbnQucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT0gJ2ZvY3VzJyB8fCBlLnR5cGUgPT0gJ2ZvY3VzaW4nKSkgYXMgT2JzZXJ2YWJsZTxGb2N1c0V2ZW50PjtcclxuICBAT3V0cHV0KFwiYmx1clwiKSBibHVyID0gdGhpcy5maWVsZEV2ZW50LnBpcGUoZmlsdGVyKGUgPT4gZS50eXBlID09ICdibHVyJyB8fCBlLnR5cGUgPT0gJ2ZvY3Vzb3V0JykpIGFzIE9ic2VydmFibGU8Rm9jdXNFdmVudD47XHJcbiAgLy8gRXZlbnQgZW1pdHRlcnMgZGVyaXZlZCBmcm9tIGZpZWxkRXZlbnRcclxuICBAT3V0cHV0KFwiaW5wdXRcIikgaW5wdXQgPSB0aGlzLmZpZWxkRXZlbnQucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT0gJ2lucHV0JykpIGFzIE9ic2VydmFibGU8SW5wdXRFdmVudD47XHJcbiAgQE91dHB1dChcImtleXVwXCIpIGtleXVwID0gdGhpcy5maWVsZEV2ZW50LnBpcGUoZmlsdGVyKGUgPT4gZS50eXBlID09ICdrZXl1cCcpKSBhcyBPYnNlcnZhYmxlPEtleWJvYXJkRXZlbnQ+O1xyXG4gIEBPdXRwdXQoXCJrZXlkb3duXCIpIGtleWRvd24gPSB0aGlzLmZpZWxkRXZlbnQucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT0gJ2tleWRvd24nKSkgYXMgT2JzZXJ2YWJsZTxLZXlib2FyZEV2ZW50PjtcclxuXHJcbiAgcHVibGljIGluc3RhbmNlPzogRWFzeUZvcm1Db250cm9sO1xyXG5cclxuICBASW5wdXQoe1xyXG4gICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICB0cmFuc2Zvcm06ICh2YWw6IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IG51bWJlcj4pOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0+IHtcclxuICAgICAgY29uc3QgcGF0aCA9IHZhbDtcclxuICAgICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICB9XHJcbiAgfSkgcGF0aCE6IEFycmF5PHN0cmluZyB8IG51bWJlcj47XHJcblxyXG4gIGNvbnRyb2w/OiBGb3JtQ29udHJvbDtcclxuXHJcbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8RWFzeUZvcm1Db250cm9sPjtcclxuICBwcml2YXRlIHZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sPy52YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZvcm0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYXN5Rm9ybUNvbXBvbmVudC5mb3JtO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3BhdGgnXSkge1xyXG4gICAgICB0aGlzLnBhdGhDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcclxuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY29udHJvbDtcclxuICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgY29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ3Byb3BzJ10gJiYgdGhpcy5jb21wb25lbnRSZWYpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UucHJvcHMuc2V0KGNoYW5nZXNbJ3Byb3BzJ10uY3VycmVudFZhbHVlKTtcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXRoQ2hhbmdlZCgpIHtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnNldENvbnRyb2woKTtcclxuICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7XHJcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24gPSBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQodmFsdWUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldENvbnRyb2woKSB7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5wYXRoO1xyXG4gICAgaWYgKCFwYXRoIHx8IHBhdGgubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWFzeUZvcm1Db21wb25lbnQuZm9ybSkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmVhc3lGb3JtQ29tcG9uZW50LmZvcm0uZ2V0Q29udHJvbChwYXRoKTtcclxuXHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250cm9sIGFzIEZvcm1Db250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZW5kZXIoKSB7XHJcbiAgICBhd2FpdCB0aGlzLl9yZW5kZXIoKTtcclxuXHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9sO1xyXG4gICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb250cm9sLmVuYWJsZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlcigpIHtcclxuICAgIGNvbnN0IHBhdGggPSB0aGlzLnBhdGg7XHJcbiAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5mb3JtLmdldFNjaGVtYShwYXRoKTtcclxuICAgIGlmICghc2NoZW1hKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBub3QgZm91bmQgZm9yICR7cGF0aH1gKTtcclxuICAgIH1cclxuICAgIGxldCBjb21wb25lbnREZWZpbml0aW9uID0gdHlwZW9mIHNjaGVtYS5jb250cm9sVHlwZSA9PT0gJ3N0cmluZycgPyB0aGlzLmZvcm0uZ2V0Q29tcG9uZW50VHlwZShzY2hlbWEuY29udHJvbFR5cGUpIDogc2NoZW1hLmNvbnRyb2xUeXBlO1xyXG4gICAgbGV0IGNvbXBvbmVudDogRWFzeUZvcm1Db250cm9sQ29tcG9uZW50O1xyXG4gICAgaWYgKCFjb21wb25lbnREZWZpbml0aW9uKSB7XHJcbiAgICAgIC8vIEdldCBjb21wb25lbnQgZnJvbSBmb3JtQ29uZmlnXHJcbiAgICAgIGNvbXBvbmVudERlZmluaXRpb24gPSB0aGlzLmVhc3lGb3JtQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoc2NoZW1hLmNvbnRyb2xUeXBlIGFzIHN0cmluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjb21wb25lbnREZWZpbml0aW9uKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50IGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kIGZvciAke3NjaGVtYS5jb250cm9sVHlwZX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWlzQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24pKSB7XHJcbiAgICAgIC8vIEFzc3VtZSB0aGlzIGlzIGxhenkgbG9hZGluZyBjb21wb25lbnRcclxuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnREZWZpbml0aW9uICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3NjaGVtYS5jb250cm9sVHlwZX0gaXMgbm90IGEgdmFsaWQgQW5ndWxhciBjb21wb25lbnRgKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBsYXp5TG9hZGluZ0NvbXBvbmVudCA9IGNvbXBvbmVudERlZmluaXRpb24gYXMgTGF6eUxvYWRpbmdDb21wb25lbnQ7XHJcbiAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxhenlMb2FkaW5nQ29tcG9uZW50KCkgYXMgYW55O1xyXG4gICAgICBpZiAobG9hZGVkLmRlZmF1bHQpIHtcclxuICAgICAgICBjb21wb25lbnQgPSBsb2FkZWQuZGVmYXVsdDtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbG9hZGVkID09PSAnZnVuY3Rpb24nICYmIGlzQ29tcG9uZW50KGxvYWRlZCkpIHtcclxuICAgICAgICBjb21wb25lbnQgPSBsb2FkZWQgYXMgRWFzeUZvcm1Db250cm9sQ29tcG9uZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY2hlbWEuY29udHJvbFR5cGV9IGhhcyBubyBkZWZhdWx0IGV4cG9ydCBvciBpcyBub3QgYSB2YWxpZCBBbmd1bGFyIGNvbXBvbmVudGApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb21wb25lbnQgPSBjb21wb25lbnREZWZpbml0aW9uIGFzIEVhc3lGb3JtQ29udHJvbENvbXBvbmVudDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEb3VibGUgY2hlY2sgaWYgY29tcG9uZW50IGlzIGEgdmFsaWQgQW5ndWxhciBjb21wb25lbnRcclxuICAgIGlmICghaXNDb21wb25lbnQoY29tcG9uZW50KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NoZW1hLmNvbnRyb2xUeXBlfSBpcyBub3QgYSB2YWxpZCBBbmd1bGFyIGNvbXBvbmVudC4gUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCBBbmd1bGFyIGNvbXBvbmVudCBmb3IgJHtzY2hlbWEuY29udHJvbFR5cGV9IG9uIHByb3ZpZGVyIEVhc3lGb3JtQ29uZmlnYCk7XHJcbiAgICB9XHJcbiAgICAvLyBGb3J3YXJkcyB0aGlzIGluc3RhbmNlIHRvIHRoZSBjaGlsZCBjb21wb25lbnRcclxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcclxuICAgICAgcGFyZW50OiB0aGlzLnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3IsXHJcbiAgICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IEZvcm1GaWVsZERpcmVjdGl2ZSxcclxuICAgICAgICAgIHVzZVZhbHVlOiB0aGlzXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9KVxyXG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcbiAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuZGVzdHJveSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudDxFYXN5Rm9ybUNvbnRyb2w+KGNvbXBvbmVudCBhcyBFYXN5Rm9ybUNvbnRyb2xDb21wb25lbnQsIHtcclxuICAgICAgaW5qZWN0b3I6IGluamVjdG9yXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xyXG4gICAgdGhpcy5pbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuXHJcbiAgICAvLyBUaGlzIHVzYWdlIGlzIHJlbW92ZWQgaW4gZmF2b3Igb2YgZGlyZWN0aXZlcyBwcm9wcyBpbnB1dFxyXG4gICAgLy8gaWYgKHNjaGVtYS5wcm9wcykge1xyXG4gICAgLy8gICAvLyBJbml0aWFsaXplIHByb3BzXHJcbiAgICAvLyAgIHRoaXMuaW5zdGFuY2UucHJvcHMuc2V0KHNjaGVtYS5wcm9wcyk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gU2V0IGNvbXBvbmVudCBzcGVjaWZpYyBwcm9wZXJ0aWVzXHJcbiAgICBpZiAodGhpcy5wcm9wcykge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5wcm9wcy5zZXQodGhpcy5wcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmVhc3lGb3JtQ29udHJvbC5zZXQoe1xyXG4gICAgICBpZDogcGF0aC5qb2luKCdfJykgKyAnXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiksXHJcbiAgICAgIGNvbnRyb2w6IHRoaXMuY29udHJvbCEsXHJcbiAgICAgIHNjaGVtYTogc2NoZW1hIGFzIEVhc3lGb3JtRmllbGRcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=