UNPKG

ngx-antd-form-builder

Version:

Simple Drag&Drop form builder using ng-zorro-antd

239 lines 27.4 kB
import { HttpClientModule } from '@angular/common/http'; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { NzCollapseModule } from 'ng-zorro-antd/collapse'; import { NzTabsModule } from 'ng-zorro-antd/tabs'; import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; import { DialogModule } from '@angular/cdk/dialog'; import { CollapseItemListComponent } from './components/collapse-item-list/collapse-item-list.component'; import { DesignFormChangeOptionComponent } from './components/design-form-change-option/design-form-change-option.component'; import { DesignFormComponentPanelComponent } from './components/design-form-component-panel/design-form-component-panel.component'; import { DesignFormItemPropertiesComponent } from './components/design-form-item-properties/design-form-item-properties.component'; import { DesignFormNodeComponent } from './components/design-form-node/design-form-node.component'; import { DesignFormPropertiesComponent } from './components/design-form-properties/design-form-properties.component'; import { LayoutItemComponent } from './components/layout-item/layout-item.component'; import { ComponentList, DefaultFields, LayoutList } from './utils/form-item.config'; import { CommonModule } from '@angular/common'; import { NzIconModule } from 'ng-zorro-antd/icon'; import { cloneDeep } from './utils/func'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd/collapse"; import * as i2 from "ng-zorro-antd/tabs"; export class NgxAntdFormBuilderComponent { constructor() { this.fields = DefaultFields; this.saveSchema = new EventEmitter(); //@ViewChild('appDesignFormItemProperties') public appDesignFormItemProperties: DesignFormItemPropertiesComponent; //@Input() initData: any this.basicArray = ComponentList.filter(item => this.fields.includes(item.type)); this.layoutArray = LayoutList.filter(item => this.fields.includes(item.type)); this.data = { list: [], config: { "layout": "horizontal", "labelCol": { "xs": 4, "sm": 4, "md": 4, "lg": 4, "xl": 4, "xxl": 4 }, "labelWidth": 100, "labelLayout": "flex", "wrapperCol": { "xs": 18, "sm": 18, "md": 18, "lg": 18, "xl": 18, "xxl": 18 }, } }; this.selectItem = { key: "" }; this.activeKey = 0; } ngOnInit() { } ngOnChanges(changes) { if (changes['fields']) { this.basicArray = ComponentList.filter(item => this.fields.includes(item.type)); this.layoutArray = LayoutList.filter(item => this.fields.includes(item.type)); } if (changes['json'] && changes['json'].currentValue) { if (typeof changes['json'].currentValue === 'string') { try { this.init(JSON.parse(changes['json'].currentValue)); } catch (e) { console.error(e); } } else { this.init(this.json); } } } init(data) { this.data = cloneDeep(data); } recursiveGetComponentList() { const list = []; const recursivePush = (item) => { if ('card' == item.type) { item.list.forEach(recursivePush); } else if (item.type == 'tabs' || item.type == 'grid' || item.type == 'collapse') { item.columns.forEach(col => { col.list.forEach(recursivePush); }); } else { list.push(item); } }; this.data.list.forEach(recursivePush); return list; } getData() { return cloneDeep(this.data); } getJsonSchema() { return JSON.stringify(this.data, null, "\t"); } save() { this.saveSchema.emit(this.getData()); } generateKey(list, index) { const key = list[index].type + "_" + new Date().getTime(); list[index].key = key; } handleSetSelectItem(record) { this.selectItem = record; if (record.key) { this.changeTab(2); } else { this.changeTab(1); } } changeTab(e) { this.activeKey = e; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: NgxAntdFormBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.10", type: NgxAntdFormBuilderComponent, isStandalone: true, selector: "ngx-antd-form-builder", inputs: { fields: "fields", json: "json" }, outputs: { saveSchema: "saveSchema" }, usesOnChanges: true, ngImport: i0, template: ` <div class="content"> <aside class="left"> <nz-collapse> <nz-collapse-panel [nzHeader]="'Basic Components'" [nzActive]="true" > <app-collapse-item-list [fields]="basicArray" (generateKey)="generateKey($event.list, $event.index)" ></app-collapse-item-list> </nz-collapse-panel> <nz-collapse-panel [nzHeader]="'Layout Components'" [nzActive]="true"> <app-collapse-item-list [fields]="layoutArray" (generateKey)="generateKey($event.list, $event.index)" ></app-collapse-item-list> </nz-collapse-panel> </nz-collapse> </aside> <section class="center"> <app-design-form-component-panel [data]="data" [selectItem]="selectItem" (handleSetSelectItem)="handleSetSelectItem($event)" (saveSchema)="save()" ></app-design-form-component-panel> </section> <aside class="right"> <nz-tabset [(nzSelectedIndex)]="activeKey"> <nz-tab nzTitle="Layout Properties"> <app-design-form-properties [config]="data.config" ></app-design-form-properties> </nz-tab> <nz-tab nzTitle="Component Properties"> <app-design-form-item-properties [selectItem]="selectItem" [config]="data.config" ></app-design-form-item-properties> </nz-tab> </nz-tabset> </aside> </div> `, isInline: true, styles: [".content{height:100%;display:flex}.left,.right{width:300px}.center{flex:1;margin:0 8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CollapseItemListComponent, selector: "app-collapse-item-list", inputs: ["fields"], outputs: ["handleStart", "generateKey"] }, { kind: "component", type: DesignFormComponentPanelComponent, selector: "app-design-form-component-panel", inputs: ["data", "selectItem"], outputs: ["handleSetSelectItem", "saveSchema"] }, { kind: "component", type: DesignFormPropertiesComponent, selector: "app-design-form-properties", inputs: ["previewOptions", "config"] }, { kind: "component", type: DesignFormItemPropertiesComponent, selector: "app-design-form-item-properties", inputs: ["selectItem", "hideModel", "config"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: HttpClientModule }, { kind: "ngmodule", type: DialogModule }, { kind: "ngmodule", type: NzCollapseModule }, { kind: "component", type: i1.NzCollapsePanelComponent, selector: "nz-collapse-panel", inputs: ["nzActive", "nzDisabled", "nzShowArrow", "nzExtra", "nzHeader", "nzExpandedIcon"], outputs: ["nzActiveChange"], exportAs: ["nzCollapsePanel"] }, { kind: "component", type: i1.NzCollapseComponent, selector: "nz-collapse", inputs: ["nzAccordion", "nzBordered", "nzGhost", "nzExpandIconPosition"], exportAs: ["nzCollapse"] }, { kind: "ngmodule", type: NzTabsModule }, { kind: "component", type: i2.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzSelectedIndex", "nzTabPosition", "nzTabBarExtraContent", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { kind: "component", type: i2.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "ngmodule", type: NzToolTipModule }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: NgxAntdFormBuilderComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-antd-form-builder', standalone: true, imports: [ CommonModule, DesignFormNodeComponent, CollapseItemListComponent, DesignFormComponentPanelComponent, LayoutItemComponent, DesignFormPropertiesComponent, DesignFormItemPropertiesComponent, DesignFormChangeOptionComponent, FormsModule, HttpClientModule, DialogModule, NzCollapseModule, NzTabsModule, NzIconModule, NzToolTipModule, ], template: ` <div class="content"> <aside class="left"> <nz-collapse> <nz-collapse-panel [nzHeader]="'Basic Components'" [nzActive]="true" > <app-collapse-item-list [fields]="basicArray" (generateKey)="generateKey($event.list, $event.index)" ></app-collapse-item-list> </nz-collapse-panel> <nz-collapse-panel [nzHeader]="'Layout Components'" [nzActive]="true"> <app-collapse-item-list [fields]="layoutArray" (generateKey)="generateKey($event.list, $event.index)" ></app-collapse-item-list> </nz-collapse-panel> </nz-collapse> </aside> <section class="center"> <app-design-form-component-panel [data]="data" [selectItem]="selectItem" (handleSetSelectItem)="handleSetSelectItem($event)" (saveSchema)="save()" ></app-design-form-component-panel> </section> <aside class="right"> <nz-tabset [(nzSelectedIndex)]="activeKey"> <nz-tab nzTitle="Layout Properties"> <app-design-form-properties [config]="data.config" ></app-design-form-properties> </nz-tab> <nz-tab nzTitle="Component Properties"> <app-design-form-item-properties [selectItem]="selectItem" [config]="data.config" ></app-design-form-item-properties> </nz-tab> </nz-tabset> </aside> </div> `, styles: [".content{height:100%;display:flex}.left,.right{width:300px}.center{flex:1;margin:0 8px}\n"] }] }], ctorParameters: () => [], propDecorators: { fields: [{ type: Input }], json: [{ type: Input }], saveSchema: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFudGQtZm9ybS1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1hbnRkLWZvcm0tYnVpbGRlci9zcmMvbGliL25neC1hbnRkLWZvcm0tYnVpbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ2hELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3pHLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDRFQUE0RSxDQUFDO0FBQzdILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGdGQUFnRixDQUFDO0FBQ25JLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGdGQUFnRixDQUFDO0FBQ25JLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ25HLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEw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Qy9GLFdBQVc7d0JBQ1gsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLGdCQUFnQixFQUFDLFlBQVksRUFBQyxZQUFZO3dCQUMxQyxlQUFlO3FCQUNoQixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q1Q7d0RBbUJRLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ2EsVUFBVTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOekNvbGxhcHNlTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb2xsYXBzZSc7XHJcbmltcG9ydCB7IE56VGFic01vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvdGFicyc7XHJcbmltcG9ydCB7IE56VG9vbFRpcE1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvdG9vbHRpcCc7XHJcbmltcG9ydCB7RGlhbG9nTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jZGsvZGlhbG9nJ1xyXG5pbXBvcnQgeyBDb2xsYXBzZUl0ZW1MaXN0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbGxhcHNlLWl0ZW0tbGlzdC9jb2xsYXBzZS1pdGVtLWxpc3QuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGVzaWduRm9ybUNoYW5nZU9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9kZXNpZ24tZm9ybS1jaGFuZ2Utb3B0aW9uL2Rlc2lnbi1mb3JtLWNoYW5nZS1vcHRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGVzaWduRm9ybUNvbXBvbmVudFBhbmVsQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLWNvbXBvbmVudC1wYW5lbC9kZXNpZ24tZm9ybS1jb21wb25lbnQtcGFuZWwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGVzaWduRm9ybUl0ZW1Qcm9wZXJ0aWVzQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLWl0ZW0tcHJvcGVydGllcy9kZXNpZ24tZm9ybS1pdGVtLXByb3BlcnRpZXMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGVzaWduRm9ybU5vZGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZGVzaWduLWZvcm0tbm9kZS9kZXNpZ24tZm9ybS1ub2RlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERlc2lnbkZvcm1Qcm9wZXJ0aWVzQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLXByb3BlcnRpZXMvZGVzaWduLWZvcm0tcHJvcGVydGllcy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYXlvdXRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2xheW91dC1pdGVtL2xheW91dC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbXBvbmVudExpc3QsIERlZmF1bHRGaWVsZHMsIExheW91dExpc3QgfSBmcm9tICcuL3V0aWxzL2Zvcm0taXRlbS5jb25maWcnO1xyXG5pbXBvcnQgeyBOZ3hBbnRkRm9ybUJ1aWxkZXIgfSBmcm9tICcuL25neC1hbnRkLWZvcm0tYnVpbGRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBOekljb25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2ljb24nO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICcuL3V0aWxzL2Z1bmMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtYW50ZC1mb3JtLWJ1aWxkZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRGVzaWduRm9ybU5vZGVDb21wb25lbnQsXHJcbiAgICBDb2xsYXBzZUl0ZW1MaXN0Q29tcG9uZW50LERlc2lnbkZvcm1Db21wb25lbnRQYW5lbENvbXBvbmVudCxMYXlvdXRJdGVtQ29tcG9uZW50LFxyXG4gICAgRGVzaWduRm9ybVByb3BlcnRpZXNDb21wb25lbnQsRGVzaWduRm9ybUl0ZW1Qcm9wZXJ0aWVzQ29tcG9uZW50LERlc2lnbkZvcm1DaGFuZ2VPcHRpb25Db21wb25lbnQsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIEh0dHBDbGllbnRNb2R1bGUsXHJcbiAgICBEaWFsb2dNb2R1bGUsXHJcbiAgICBOekNvbGxhcHNlTW9kdWxlLE56VGFic01vZHVsZSxOekljb25Nb2R1bGUsXHJcbiAgICBOelRvb2xUaXBNb2R1bGUsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XHJcbiAgPGFzaWRlIGNsYXNzPVwibGVmdFwiPlxyXG4gICAgPG56LWNvbGxhcHNlPlxyXG4gICAgICA8bnotY29sbGFwc2UtcGFuZWxcclxuICAgICAgICBbbnpIZWFkZXJdPVwiJ0Jhc2ljIENvbXBvbmVudHMnXCJcclxuICAgICAgICBbbnpBY3RpdmVdPVwidHJ1ZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8YXBwLWNvbGxhcHNlLWl0ZW0tbGlzdFxyXG4gICAgICAgICAgW2ZpZWxkc109XCJiYXNpY0FycmF5XCJcclxuICAgICAgICAgIChnZW5lcmF0ZUtleSk9XCJnZW5lcmF0ZUtleSgkZXZlbnQubGlzdCwgJGV2ZW50LmluZGV4KVwiXHJcbiAgICAgICAgPjwvYXBwLWNvbGxhcHNlLWl0ZW0tbGlzdD5cclxuICAgICAgPC9uei1jb2xsYXBzZS1wYW5lbD5cclxuICAgICAgPG56LWNvbGxhcHNlLXBhbmVsIFtuekhlYWRlcl09XCInTGF5b3V0IENvbXBvbmVudHMnXCIgW256QWN0aXZlXT1cInRydWVcIj5cclxuICAgICAgICA8YXBwLWNvbGxhcHNlLWl0ZW0tbGlzdFxyXG4gICAgICAgICAgW2ZpZWxkc109XCJsYXlvdXRBcnJheVwiXHJcbiAgICAgICAgICAoZ2VuZXJhdGVLZXkpPVwiZ2VuZXJhdGVLZXkoJGV2ZW50Lmxpc3QsICRldmVudC5pbmRleClcIlxyXG4gICAgICAgID48L2FwcC1jb2xsYXBzZS1pdGVtLWxpc3Q+XHJcbiAgICAgIDwvbnotY29sbGFwc2UtcGFuZWw+XHJcbiAgICA8L256LWNvbGxhcHNlPlxyXG4gIDwvYXNpZGU+XHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJjZW50ZXJcIj5cclxuICAgIDxhcHAtZGVzaWduLWZvcm0tY29tcG9uZW50LXBhbmVsXHJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxyXG4gICAgICBbc2VsZWN0SXRlbV09XCJzZWxlY3RJdGVtXCJcclxuICAgICAgKGhhbmRsZVNldFNlbGVjdEl0ZW0pPVwiaGFuZGxlU2V0U2VsZWN0SXRlbSgkZXZlbnQpXCJcclxuICAgICAgKHNhdmVTY2hlbWEpPVwic2F2ZSgpXCJcclxuICAgID48L2FwcC1kZXNpZ24tZm9ybS1jb21wb25lbnQtcGFuZWw+XHJcbiAgPC9zZWN0aW9uPlxyXG4gIDxhc2lkZSBjbGFzcz1cInJpZ2h0XCI+XHJcbiAgICA8bnotdGFic2V0IFsobnpTZWxlY3RlZEluZGV4KV09XCJhY3RpdmVLZXlcIj5cclxuICAgICAgPG56LXRhYiBuelRpdGxlPVwiTGF5b3V0IFByb3BlcnRpZXNcIj5cclxuICAgICAgICA8YXBwLWRlc2lnbi1mb3JtLXByb3BlcnRpZXNcclxuICAgICAgICAgIFtjb25maWddPVwiZGF0YS5jb25maWdcIlxyXG4gICAgICAgID48L2FwcC1kZXNpZ24tZm9ybS1wcm9wZXJ0aWVzPlxyXG4gICAgICA8L256LXRhYj5cclxuICAgICAgPG56LXRhYiBuelRpdGxlPVwiQ29tcG9uZW50IFByb3BlcnRpZXNcIj5cclxuICAgICAgICA8YXBwLWRlc2lnbi1mb3JtLWl0ZW0tcHJvcGVydGllc1xyXG4gICAgICAgICAgW3NlbGVjdEl0ZW1dPVwic2VsZWN0SXRlbVwiXHJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGEuY29uZmlnXCJcclxuICAgICAgICA+PC9hcHAtZGVzaWduLWZvcm0taXRlbS1wcm9wZXJ0aWVzPlxyXG4gICAgICA8L256LXRhYj5cclxuICAgIDwvbnotdGFic2V0PlxyXG4gIDwvYXNpZGU+XHJcbjwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBgXHJcbiAgICAuY29udGVudCB7XHJcbiAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgIH1cclxuICAgIC5sZWZ0LCAucmlnaHQge1xyXG4gICAgICB3aWR0aDogMzAwcHg7XHJcbiAgICB9XHJcbiAgICAuY2VudGVyIHtcclxuICAgICAgZmxleDogMTtcclxuICAgICAgbWFyZ2luOiAwIDhweCAwO1xyXG4gICAgfVxyXG4gICAgLnJpZ2h0IHtcclxuXHJcbiAgICB9XHJcbiAgYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4QW50ZEZvcm1CdWlsZGVyQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBmaWVsZHM6IEFycmF5PHN0cmluZz4gPSBEZWZhdWx0RmllbGRzXHJcbiAgQElucHV0KCkganNvbjogc3RyaW5nIHwgTmd4QW50ZEZvcm1CdWlsZGVyLkNvbmZpZyB8IHVuZGVmaW5lZCB8IG51bGxcclxuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2F2ZVNjaGVtYTogRXZlbnRFbWl0dGVyPE5neEFudGRGb3JtQnVpbGRlci5Db25maWc+ID0gbmV3IEV2ZW50RW1pdHRlcigpXHJcbiAgLy9AVmlld0NoaWxkKCdhcHBEZXNpZ25Gb3JtSXRlbVByb3BlcnRpZXMnKSBwdWJsaWMgYXBwRGVzaWduRm9ybUl0ZW1Qcm9wZXJ0aWVzOiBEZXNpZ25Gb3JtSXRlbVByb3BlcnRpZXNDb21wb25lbnQ7XHJcbiAgLy9ASW5wdXQoKSBpbml0RGF0YTogYW55XHJcbiAgYmFzaWNBcnJheTogQXJyYXk8Tmd4QW50ZEZvcm1CdWlsZGVyLkFsbENvbXBvbmVudFR5cGU+ID0gQ29tcG9uZW50TGlzdC5maWx0ZXIoaXRlbSA9PiB0aGlzLmZpZWxkcy5pbmNsdWRlcyhpdGVtLnR5cGUpKTtcclxuICBsYXlvdXRBcnJheTogIEFycmF5PE5neEFudGRGb3JtQnVpbGRlci5BbGxMYXlvdXQ+ID0gTGF5b3V0TGlzdC5maWx0ZXIoaXRlbSA9PiB0aGlzLmZpZWxkcy5pbmNsdWRlcyhpdGVtLnR5cGUpKTtcclxuXHJcbiAgZGF0YTogTmd4QW50ZEZvcm1CdWlsZGVyLkNvbmZpZyA9IHtcclxuICAgIGxpc3Q6IFtdLFxyXG4gICAgY29uZmlnOiB7XHJcbiAgICAgIFwibGF5b3V0XCI6IFwiaG9yaXpvbnRhbFwiLFxyXG4gICAgICBcImxhYmVsQ29sXCI6IHtcclxuICAgICAgICBcInhzXCI6IDQsXHJcbiAgICAgICAgXCJzbVwiOiA0LFxyXG4gICAgICAgIFwibWRcIjogNCxcclxuICAgICAgICBcImxnXCI6IDQsXHJcbiAgICAgICAgXCJ4bFwiOiA0LFxyXG4gICAgICAgIFwieHhsXCI6IDRcclxuICAgICAgfSxcclxuICAgICAgXCJsYWJlbFdpZHRoXCI6IDEwMCxcclxuICAgICAgXCJsYWJlbExheW91dFwiOiBcImZsZXhcIixcclxuICAgICAgXCJ3cmFwcGVyQ29sXCI6IHtcclxuICAgICAgICBcInhzXCI6IDE4LFxyXG4gICAgICAgIFwic21cIjogMTgsXHJcbiAgICAgICAgXCJtZFwiOiAxOCxcclxuICAgICAgICBcImxnXCI6IDE4LFxyXG4gICAgICAgIFwieGxcIjogMTgsXHJcbiAgICAgICAgXCJ4eGxcIjogMThcclxuICAgICAgfSxcclxuICAgIH1cclxuICB9XHJcbiAgc2VsZWN0SXRlbTogYW55ID0ge1xyXG4gICAga2V5OiBcIlwiXHJcbiAgfVxyXG4gIGFjdGl2ZUtleTogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydmaWVsZHMnXSkge1xyXG4gICAgICB0aGlzLmJhc2ljQXJyYXkgPSBDb21wb25lbnRMaXN0LmZpbHRlcihpdGVtID0+IHRoaXMuZmllbGRzLmluY2x1ZGVzKGl0ZW0udHlwZSkpXHJcbiAgICAgIHRoaXMubGF5b3V0QXJyYXkgPSBMYXlvdXRMaXN0LmZpbHRlcihpdGVtID0+IHRoaXMuZmllbGRzLmluY2x1ZGVzKGl0ZW0udHlwZSkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2pzb24nXSAmJiBjaGFuZ2VzWydqc29uJ10uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgY2hhbmdlc1snanNvbiddLmN1cnJlbnRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5pbml0KEpTT04ucGFyc2UoY2hhbmdlc1snanNvbiddLmN1cnJlbnRWYWx1ZSkpXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pbml0KHRoaXMuanNvbilcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoZGF0YSkge1xyXG4gICAgdGhpcy5kYXRhID0gY2xvbmVEZWVwKGRhdGEpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVjdXJzaXZlR2V0Q29tcG9uZW50TGlzdCgpIHtcclxuICAgIGNvbnN0IGxpc3Q6IEFycmF5PE5neEFudGRGb3JtQnVpbGRlci5BbGxUeXBlPiA9IFtdXHJcbiAgICBjb25zdCByZWN1cnNpdmVQdXNoID0gKGl0ZW06IE5neEFudGRGb3JtQnVpbGRlci5BbGxUeXBlKSA9PiB7XHJcbiAgICAgIGlmICggJ2NhcmQnID09IGl0ZW0udHlwZSkge1xyXG4gICAgICAgIGl0ZW0ubGlzdC5mb3JFYWNoKHJlY3Vyc2l2ZVB1c2gpXHJcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICd0YWJzJyB8fCBpdGVtLnR5cGUgPT0gJ2dyaWQnIHx8IGl0ZW0udHlwZSA9PSAnY29sbGFwc2UnKSB7XHJcbiAgICAgICAgaXRlbS5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgIGNvbC5saXN0LmZvckVhY2gocmVjdXJzaXZlUHVzaClcclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxpc3QucHVzaChpdGVtKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGEubGlzdC5mb3JFYWNoKHJlY3Vyc2l2ZVB1c2gpXHJcbiAgICByZXR1cm4gbGlzdFxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGEoKSB7XHJcbiAgICByZXR1cm4gY2xvbmVEZWVwKHRoaXMuZGF0YSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRKc29uU2NoZW1hKCkge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgXCJcXHRcIilcclxuICB9XHJcblxyXG4gIHNhdmUoKSB7XHJcbiAgICB0aGlzLnNhdmVTY2hlbWEuZW1pdCh0aGlzLmdldERhdGEoKSlcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlS2V5KGxpc3QsIGluZGV4KSB7XHJcbiAgICBjb25zdCBrZXkgPSBsaXN0W2luZGV4XS50eXBlICsgXCJfXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgIGxpc3RbaW5kZXhdLmtleSAgPSBrZXlcclxuICB9XHJcblxyXG4gIGhhbmRsZVNldFNlbGVjdEl0ZW0ocmVjb3JkKSB7XHJcbiAgICB0aGlzLnNlbGVjdEl0ZW0gPSByZWNvcmQ7XHJcbiAgICBpZiAocmVjb3JkLmtleSkge1xyXG4gICAgICB0aGlzLmNoYW5nZVRhYigyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2hhbmdlVGFiKDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGFiKGUpIHtcclxuICAgIHRoaXMuYWN0aXZlS2V5ID0gZTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==