UNPKG

@noaestudio/forms

Version:

Dynamic forms extension for Covalent

290 lines (288 loc) 25.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Component, Input, Output, EventEmitter } from '@angular/core'; import { TREE_ACTIONS } from 'angular-tree-component'; import { MatDialog } from '@angular/material'; import { TdLoadingService } from '@covalent/core/loading'; import { OrganizationDialogComponent } from '../../dialogs/organization-dialog/organization-dialog.component'; export class OrganizationComponent { /** * @param {?} dialog * @param {?} loadingService */ constructor(dialog, loadingService) { this.dialog = dialog; this.loadingService = loadingService; this.hasFilter = false; this.hasButtons = false; this.editable = false; this.multiple = false; this.saveable = true; this.expandible = true; this.collapsable = true; this.nodes = []; this.extraFields = []; this.updater = new EventEmitter(); this.nextId = 1; this.actionMapping = { mouse: { dblClick: (tree, node, event) => { if (this.editable) { this.editNode(tree, node); } }, click: (tree, node, event) => { if (this.multiple) { event.ctrlKey ? TREE_ACTIONS.TOGGLE_ACTIVE_MULTI(tree, node, event) : TREE_ACTIONS.TOGGLE_ACTIVE(tree, node, event); } else { TREE_ACTIONS.TOGGLE_ACTIVE(tree, node, event); } } } }; this.customTemplateStringOptions = { isExpandedField: 'expanded', idField: 'id', actionMapping: this.actionMapping, nodeHeight: 40, allowDrag: (node) => { return !node.data.editing; }, allowDrop: (node) => { return !node.data.editing; }, useVirtualScroll: true }; this.editProfesion = (value) => { let /** @type {?} */ dialogRef = this.dialog.open(OrganizationDialogComponent, { panelClass: 'organization-modal', data: { value: value, extraFields: this.extraFields }, }); return dialogRef.afterClosed().toPromise(); }; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes["nodes"] && !changes["nodes"].isFirstChange()) { this.nextId = this.getNextId(); } } /** * @return {?} */ ngOnInit() { this.nextId = this.getNextId(); } /** * @return {?} */ getNextId() { let /** @type {?} */ maxId = 0; let /** @type {?} */ openNodes = []; for (let /** @type {?} */ node of this.nodes) { openNodes.push(node); } while (openNodes.length > 0) { let /** @type {?} */ currentNode = openNodes.pop(); maxId = Math.max(maxId, currentNode.id); for (let /** @type {?} */ child of currentNode.children) { openNodes.push(child); } } return maxId + 1; } /** * @param {?} node * @return {?} */ finishName(node) { node.data.editing = false; } /** * @param {?} tree * @return {?} */ addNode(tree) { let /** @type {?} */ focused = tree.treeModel.getFocusedNode(); let /** @type {?} */ child = false; if (this.nodes.length > 0) { child = this.nodes[0]; } if (focused) { child = focused.data; } let /** @type {?} */ newNode = { id: this.nextId, name: 'Nuevo nodo', children: [], expanded: false, residente: false }; this.nextId++; if (child) { child.children.push(newNode); } else { this.nodes.push(newNode); } if (this.updater) { this.updater.emit(this.nodes); } tree.treeModel.update(); } /** * @param {?} text * @param {?} tree * @return {?} */ filterNodes(text, tree) { tree.treeModel.filterNodes(text); } /** * @param {?} treeModel * @param {?} node * @return {?} */ editNode(treeModel, node) { this.editProfesion(node.data).then(res => { for (let /** @type {?} */ field in res) { node.data[field] = res[field]; } treeModel.update(); }).catch(err => { }); } /** * @param {?} tree * @param {?} node * @return {?} */ deleteNode(tree, node) { event.stopPropagation(); let /** @type {?} */ siblings = node.parent.data.children; node.parent.data.children = siblings.filter(x => x.id != node.data.id); if (this.updater) { this.updater.emit(this.nodes); } tree.treeModel.update(); } /** * @return {?} */ save() { if (this.updater) { this.updater.emit(this.nodes); } } } OrganizationComponent.decorators = [ { type: Component, args: [{ selector: 'covalent-organization', template: `<form *ngIf="hasFilter"> <mat-form-field fxFlex> <input matInput #filter autocomplete="off" (keyup)="filterNodes(filter.value, tree)" placeholder="{{'app.organization.filter' | translate}}"> </mat-form-field> </form> <div class="wrap"> <tree-root #tree [nodes]="nodes" [options]="customTemplateStringOptions" focused="true"> <ng-template #treeNodeTemplate let-node> <span *ngIf="!node.data.editing" [class.root-node]="node.isRoot" title="{{node.data.name}}">{{ node.data.name }}</span> <mat-icon *ngIf="!node.data.editing && !node.isRoot && editable" class="tree-icon" (click)="editNode(tree.treeModel,node)">edit</mat-icon> <mat-icon *ngIf="!node.data.editing && !node.isRoot && editable" class="tree-icon" (click)="deleteNode(tree,node)">delete</mat-icon> <mat-form-field *ngIf="node.data.editing" fxFlex> <input autocomplete="off" matInput [(ngModel)]="node.data.name" (change)="finishName(node)" > </mat-form-field> </ng-template> <ng-template #loadingTemplate>{{'app.organization.loading' | translate}}</ng-template> </tree-root> </div> <div *ngIf="hasButtons"> <br> <button *ngIf="editable" mat-raised-button color="primary" (click)="addNode(tree)"> {{'app.organization.add' | translate}} </button> <button *ngIf="expandible" mat-raised-button color="primary" (click)="tree.treeModel.expandAll()"> {{'app.organization.expand' | translate}} </button> <button *ngIf="collapsable" mat-raised-button color="primary" (click)="tree.treeModel.collapseAll()"> {{'app.organization.collapse' | translate}} </button> <button *ngIf="editable && saveable" mat-raised-button color="accent" (click)="save()"> {{'app.organization.save' | translate}} </button> </div> `, styles: [`:host .wrap{height:400px;max-width:300px;min-width:250px;position:relative}:host button[mat-raised-button]{margin-right:5px;margin-bottom:10px}.node-content-wrapper{line-height:37px}.tree-icon{margin-left:10px;vertical-align:middle}.root-node{font-weight:700}`], },] }, ]; /** @nocollapse */ OrganizationComponent.ctorParameters = () => [ { type: MatDialog, }, { type: TdLoadingService, }, ]; OrganizationComponent.propDecorators = { "hasFilter": [{ type: Input },], "hasButtons": [{ type: Input },], "editable": [{ type: Input },], "multiple": [{ type: Input },], "saveable": [{ type: Input },], "expandible": [{ type: Input },], "collapsable": [{ type: Input },], "nodes": [{ type: Input },], "extraFields": [{ type: Input },], "updater": [{ type: Output },], }; function OrganizationComponent_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ OrganizationComponent.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ OrganizationComponent.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ OrganizationComponent.propDecorators; /** @type {?} */ OrganizationComponent.prototype.hasFilter; /** @type {?} */ OrganizationComponent.prototype.hasButtons; /** @type {?} */ OrganizationComponent.prototype.editable; /** @type {?} */ OrganizationComponent.prototype.multiple; /** @type {?} */ OrganizationComponent.prototype.saveable; /** @type {?} */ OrganizationComponent.prototype.expandible; /** @type {?} */ OrganizationComponent.prototype.collapsable; /** @type {?} */ OrganizationComponent.prototype.nodes; /** @type {?} */ OrganizationComponent.prototype.extraFields; /** @type {?} */ OrganizationComponent.prototype.updater; /** @type {?} */ OrganizationComponent.prototype.nextId; /** @type {?} */ OrganizationComponent.prototype.actionMapping; /** @type {?} */ OrganizationComponent.prototype.customTemplateStringOptions; /** @type {?} */ OrganizationComponent.prototype.editProfesion; /** @type {?} */ OrganizationComponent.prototype.dialog; /** @type {?} */ OrganizationComponent.prototype.loadingService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb3ZhbGVudC9keW5hbWljLWZvcm1zLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9vcmdhbml6YXRpb24vb3JnYW5pemF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBdUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTJCLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBVyxZQUFZLEVBQXVCLE1BQU0sd0JBQXdCLENBQUM7QUFDcEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlFQUFpRSxDQUFDO0FBMEM5RyxNQUFNOzs7OztJQW9ETCxZQUFvQixNQUFpQixFQUFVLGNBQWlDO1FBQTVELFdBQU0sR0FBTixNQUFNLENBQVc7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7eUJBbERsRCxLQUFLOzBCQUNKLEtBQUs7d0JBQ1AsS0FBSzt3QkFDTCxLQUFLO3dCQUVMLElBQUk7MEJBQ0YsSUFBSTsyQkFDSCxJQUFJO3FCQUVaLEVBQUU7MkJBRU8sRUFBRTt1QkFFTSxJQUFJLFlBQVksRUFBUztzQkFFakQsQ0FBQzs2QkFFYztZQUMvQixLQUFLLEVBQUU7Z0JBQ04sUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7d0JBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3FCQUMxQjtpQkFDRDtnQkFDRCxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFF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QjtnQkFDakMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW1DVjtnQkFDQSxNQUFNLEVBQUUsQ0FBQyxxUUFBcVEsQ0FBQzthQUMvUTs7OztZQTVDTyxTQUFTO1lBRVIsZ0JBQWdCOzs7MEJBNkN2QixLQUFLOzJCQUNMLEtBQUs7eUJBQ0wsS0FBSzt5QkFDTCxLQUFLO3lCQUVMLEtBQUs7MkJBQ0wsS0FBSzs0QkFDTCxLQUFLO3NCQUVMLEtBQUs7NEJBRUwsS0FBSzt3QkFFTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtUcmVlTm9kZSwgVFJFRV9BQ1RJT05TLCBLRVlTLCBJQWN0aW9uTWFwcGluZ30gZnJvbSAnYW5ndWxhci10cmVlLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcblxyXG5pbXBvcnQgeyBUZExvYWRpbmdTZXJ2aWNlIH0gZnJvbSAnQGNvdmFsZW50L2NvcmUvbG9hZGluZyc7XHJcbmltcG9ydCB7IE9yZ2FuaXphdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2RpYWxvZ3Mvb3JnYW5pemF0aW9uLWRpYWxvZy9vcmdhbml6YXRpb24tZGlhbG9nLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2NvdmFsZW50LW9yZ2FuaXphdGlvbicsXHJcblx0dGVtcGxhdGU6IGA8Zm9ybSAqbmdJZj1cImhhc0ZpbHRlclwiPlxyXG5cdDxtYXQtZm9ybS1maWVsZCBmeEZsZXg+XHJcblx0XHQ8aW5wdXQgbWF0SW5wdXQgI2ZpbHRlciBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG5cdFx0XHQoa2V5dXApPVwiZmlsdGVyTm9kZXMoZmlsdGVyLnZhbHVlLCB0cmVlKVwiIHBsYWNlaG9sZGVyPVwie3snYXBwLm9yZ2FuaXphdGlvbi5maWx0ZXInIHwgdHJhbnNsYXRlfX1cIj5cclxuXHQ8L21hdC1mb3JtLWZpZWxkPlxyXG48L2Zvcm0+XHJcbjxkaXYgY2xhc3M9XCJ3cmFwXCI+XHJcblx0PHRyZWUtcm9vdCAjdHJlZSBbbm9kZXNdPVwibm9kZXNcIiBbb3B0aW9uc109XCJjdXN0b21UZW1wbGF0ZVN0cmluZ09wdGlvbnNcIiBmb2N1c2VkPVwidHJ1ZVwiPlxyXG5cdFx0PG5nLXRlbXBsYXRlICN0cmVlTm9kZVRlbXBsYXRlIGxldC1ub2RlPlxyXG5cdFx0XHQ8c3BhbiAqbmdJZj1cIiFub2RlLmRhdGEuZWRpdGluZ1wiIFtjbGFzcy5yb290LW5vZGVdPVwibm9kZS5pc1Jvb3RcIiB0aXRsZT1cInt7bm9kZS5kYXRhLm5hbWV9fVwiPnt7IG5vZGUuZGF0YS5uYW1lIH19PC9zcGFuPlxyXG5cdFx0XHQ8bWF0LWljb24gKm5nSWY9XCIhbm9kZS5kYXRhLmVkaXRpbmcgJiYgIW5vZGUuaXNSb290ICYmIGVkaXRhYmxlXCIgY2xhc3M9XCJ0cmVlLWljb25cIiAoY2xpY2spPVwiZWRpdE5vZGUodHJlZS50cmVlTW9kZWwsbm9kZSlcIj5lZGl0PC9tYXQtaWNvbj5cclxuXHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiIW5vZGUuZGF0YS5lZGl0aW5nICYmICFub2RlLmlzUm9vdCAmJiBlZGl0YWJsZVwiIGNsYXNzPVwidHJlZS1pY29uXCIgKGNsaWNrKT1cImRlbGV0ZU5vZGUodHJlZSxub2RlKVwiPmRlbGV0ZTwvbWF0LWljb24+XHJcblx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIm5vZGUuZGF0YS5lZGl0aW5nXCIgZnhGbGV4PlxyXG5cdFx0XHRcdDxpbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cIm5vZGUuZGF0YS5uYW1lXCIgKGNoYW5nZSk9XCJmaW5pc2hOYW1lKG5vZGUpXCIgPlxyXG5cdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdDxuZy10ZW1wbGF0ZSAjbG9hZGluZ1RlbXBsYXRlPnt7J2FwcC5vcmdhbml6YXRpb24ubG9hZGluZycgfCB0cmFuc2xhdGV9fTwvbmctdGVtcGxhdGU+XHJcblx0PC90cmVlLXJvb3Q+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cImhhc0J1dHRvbnNcIj5cclxuXHQ8YnI+XHJcblx0PGJ1dHRvbiAqbmdJZj1cImVkaXRhYmxlXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImFkZE5vZGUodHJlZSlcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uYWRkJyB8IHRyYW5zbGF0ZX19XHJcblx0PC9idXR0b24+XHJcblx0PGJ1dHRvbiAqbmdJZj1cImV4cGFuZGlibGVcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwidHJlZS50cmVlTW9kZWwuZXhwYW5kQWxsKClcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uZXhwYW5kJyB8IHRyYW5zbGF0ZX19XHJcblx0PC9idXR0b24+XHJcblx0PGJ1dHRvbiAqbmdJZj1cImNvbGxhcHNhYmxlXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInRyZWUudHJlZU1vZGVsLmNvbGxhcHNlQWxsKClcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uY29sbGFwc2UnIHwgdHJhbnNsYXRlfX1cclxuXHQ8L2J1dHRvbj5cclxuXHQ8YnV0dG9uICpuZ0lmPVwiZWRpdGFibGUgJiYgc2F2ZWFibGVcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cImFjY2VudFwiIChjbGljayk9XCJzYXZlKClcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uc2F2ZScgfCB0cmFuc2xhdGV9fVxyXG5cdDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuYCxcclxuXHRzdHlsZXM6IFtgOmhvc3QgLndyYXB7aGVpZ2h0OjQwMHB4O21heC13aWR0aDozMDBweDttaW4td2lkdGg6MjUwcHg7cG9zaXRpb246cmVsYXRpdmV9Omhvc3QgYnV0dG9uW21hdC1yYWlzZWQtYnV0dG9uXXttYXJnaW4tcmlnaHQ6NXB4O21hcmdpbi1ib3R0b206MTBweH0ubm9kZS1jb250ZW50LXdyYXBwZXJ7bGluZS1oZWlnaHQ6MzdweH0udHJlZS1pY29ue21hcmdpbi1sZWZ0OjEwcHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5yb290LW5vZGV7Zm9udC13ZWlnaHQ6NzAwfWBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuXHRASW5wdXQoKSBoYXNGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRASW5wdXQoKSBoYXNCdXR0b25zOiBib29sZWFuID0gZmFsc2U7XHJcblx0QElucHV0KCkgZWRpdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRASW5wdXQoKSBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRASW5wdXQoKSBzYXZlYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgZXhwYW5kaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgY29sbGFwc2FibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHRASW5wdXQoKSBub2RlczogYW55W10gPSBbXTtcclxuXHJcblx0QElucHV0KCkgZXh0cmFGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdEBPdXRwdXQoKSB1cGRhdGVyOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuXHJcblx0bmV4dElkOiBudW1iZXIgPSAxO1xyXG5cclxuXHRhY3Rpb25NYXBwaW5nOiBJQWN0aW9uTWFwcGluZyA9IHtcclxuXHRcdG1vdXNlOiB7XHJcblx0XHRcdGRibENsaWNrOiAodHJlZSwgbm9kZSwgZXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5lZGl0YWJsZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5lZGl0Tm9kZSh0cmVlLCBub2RlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdGNsaWNrOiAodHJlZSwgbm9kZSwgZXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5tdWx0aXBsZSkge1xyXG5cdFx0XHRcdFx0ZXZlbnQuY3RybEtleSA/IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFX01VTFRJKHRyZWUsIG5vZGUsIGV2ZW50KSA6IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFKHRyZWUsIG5vZGUsIGV2ZW50KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRUUkVFX0FDVElPTlMuVE9HR0xFX0FDVElWRSh0cmVlLCBub2RlLCBldmVudCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdGN1c3RvbVRlbXBsYXRlU3RyaW5nT3B0aW9ucyA9IHtcclxuXHRcdGlzRXhwYW5kZWRGaWVsZDogJ2V4cGFuZGVkJyxcclxuXHRcdGlkRmllbGQ6ICdpZCcsXHJcblx0XHRhY3Rpb25NYXBwaW5nOiB0aGlzLmFjdGlvbk1hcHBpbmcsXHJcblx0XHRub2RlSGVpZ2h0OiA0MCxcclxuXHRcdGFsbG93RHJhZzogKG5vZGUpID0+IHtcclxuICAgICAgXHRcdHJldHVybiAhbm9kZS5kYXRhLmVkaXRpbmc7XHJcbiAgICBcdH0sXHJcbiAgICBcdGFsbG93RHJvcDogKG5vZGUpID0+IHtcclxuICAgICAgXHRcdHJldHVybiAhbm9kZS5kYXRhLmVkaXRpbmc7XHJcbiAgICBcdH0sXHJcblx0XHR1c2VWaXJ0dWFsU2Nyb2xsOiB0cnVlXHJcblx0fTtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBsb2FkaW5nU2VydmljZSA6IFRkTG9hZGluZ1NlcnZpY2UpIHtcclxuXHJcblx0fVxyXG5cclxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMubm9kZXMgJiYgIWNoYW5nZXMubm9kZXMuaXNGaXJzdENoYW5nZSgpKSB7XHJcblx0XHRcdHRoaXMubmV4dElkID0gdGhpcy5nZXROZXh0SWQoKTtcclxuXHRcdH1cclxuXHJcbiAgICB9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5uZXh0SWQgPSB0aGlzLmdldE5leHRJZCgpO1xyXG5cdH1cclxuXHJcblx0Z2V0TmV4dElkKCkgOiBudW1iZXIge1xyXG5cclxuXHRcdGxldCBtYXhJZCA9IDA7XHJcblxyXG5cdFx0bGV0IG9wZW5Ob2RlcyA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgbm9kZSBvZiB0aGlzLm5vZGVzKSB7XHJcblx0XHRcdG9wZW5Ob2Rlcy5wdXNoKG5vZGUpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHdoaWxlIChvcGVuTm9kZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRsZXQgY3VycmVudE5vZGUgPSBvcGVuTm9kZXMucG9wKCk7XHJcblxyXG5cdFx0XHRtYXhJZCA9IE1hdGgubWF4KG1heElkLGN1cnJlbnROb2RlLmlkKTtcclxuXHRcdFx0Zm9yIChsZXQgY2hpbGQgb2YgY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuXHRcdFx0XHRvcGVuTm9kZXMucHVzaChjaGlsZCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWF4SWQgKyAxO1xyXG5cdH1cclxuXHJcblx0ZmluaXNoTmFtZShub2RlKSB7XHJcblx0XHRub2RlLmRhdGEuZWRpdGluZyA9IGZhbHNlO1xyXG5cdH1cclxuXHJcblx0YWRkTm9kZSh0cmVlKSB7XHJcblx0XHRsZXQgZm9jdXNlZCA9IHRyZWUudHJlZU1vZGVsLmdldEZvY3VzZWROb2RlKCk7XHJcblx0XHRsZXQgY2hpbGQ6IGFueSA9IGZhbHNlO1xyXG5cdFx0aWYgKHRoaXMubm9kZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRjaGlsZCA9IHRoaXMubm9kZXNbMF07XHJcblx0XHR9XHJcblx0XHRpZiAoZm9jdXNlZCkge1xyXG5cdFx0XHRjaGlsZCA9IGZvY3VzZWQuZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgbmV3Tm9kZSA9IHtcclxuXHRcdFx0aWQ6IHRoaXMubmV4dElkLFxyXG5cdFx0XHRuYW1lOiAnTnVldm8gbm9kbycsXHJcblx0XHRcdGNoaWxkcmVuOiBbXSxcclxuXHRcdFx0ZXhwYW5kZWQ6IGZhbHNlLFxyXG5cdFx0XHRyZXNpZGVudGU6IGZhbHNlXHJcblx0XHR9O1xyXG5cdFx0dGhpcy5uZXh0SWQrKztcclxuXHJcblx0XHRpZiAoY2hpbGQpIHtcclxuXHRcdFx0Y2hpbGQuY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHR0aGlzLm5vZGVzLnB1c2gobmV3Tm9kZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMudXBkYXRlcikge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZXIuZW1pdCh0aGlzLm5vZGVzKTtcclxuXHRcdH1cclxuXHJcblx0XHR0cmVlLnRyZWVNb2RlbC51cGRhdGUoKTtcclxuXHR9XHJcblxyXG5cdGZpbHRlck5vZGVzKHRleHQsIHRyZWUpIHtcclxuXHRcdHRyZWUudHJlZU1vZGVsLmZpbHRlck5vZGVzKHRleHQpO1xyXG5cdH1cclxuXHJcblx0ZWRpdE5vZGUodHJlZU1vZGVsLCBub2RlKSB7XHJcblx0XHR0aGlzLmVkaXRQcm9mZXNpb24obm9kZS5kYXRhKS50aGVuKCByZXMgPT4ge1xyXG5cdFx0XHRmb3IgKGxldCBmaWVsZCBpbiByZXMpIHtcclxuXHRcdFx0XHRub2RlLmRhdGFbZmllbGRdID0gcmVzW2ZpZWxkXTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0cmVlTW9kZWwudXBkYXRlKCk7XHJcblx0XHR9KS5jYXRjaCggZXJyID0+IHtcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHRlZGl0UHJvZmVzaW9uID0gKHZhbHVlOiBhbnkpID0+IHtcclxuXHRcdGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE9yZ2FuaXphdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xyXG5cdFx0XHRwYW5lbENsYXNzOiAnb3JnYW5pemF0aW9uLW1vZGFsJyxcclxuXHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZSxcclxuXHRcdFx0XHRleHRyYUZpZWxkczogdGhpcy5leHRyYUZpZWxkc1xyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcblx0fTtcclxuXHJcblx0ZGVsZXRlTm9kZSh0cmVlLCBub2RlKSB7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdGxldCBzaWJsaW5ncyA6IGFueVtdID0gbm9kZS5wYXJlbnQuZGF0YS5jaGlsZHJlbjtcclxuXHRcdG5vZGUucGFyZW50LmRhdGEuY2hpbGRyZW4gPSBzaWJsaW5ncy5maWx0ZXIgKCB4ID0+IHguaWQgIT0gbm9kZS5kYXRhLmlkKTtcclxuXHJcblx0XHRpZiAodGhpcy51cGRhdGVyKSB7XHJcblx0XHRcdHRoaXMudXBkYXRlci5lbWl0KHRoaXMubm9kZXMpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyZWUudHJlZU1vZGVsLnVwZGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c2F2ZSgpIHtcclxuXHRcdGlmICh0aGlzLnVwZGF0ZXIpIHtcclxuXHRcdFx0dGhpcy51cGRhdGVyLmVtaXQodGhpcy5ub2Rlcyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxufVxyXG4iXX0=