@noaestudio/forms
Version:
Dynamic forms extension for Covalent
312 lines (311 loc) • 27.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
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';
var OrganizationComponent = /** @class */ (function () {
function OrganizationComponent(dialog, loadingService) {
var _this = this;
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: function (tree, node, event) {
if (_this.editable) {
_this.editNode(tree, node);
}
},
click: function (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: function (node) {
return !node.data.editing;
},
allowDrop: function (node) {
return !node.data.editing;
},
useVirtualScroll: true
};
this.editProfesion = function (value) {
var /** @type {?} */ dialogRef = _this.dialog.open(OrganizationDialogComponent, {
panelClass: 'organization-modal',
data: {
value: value,
extraFields: _this.extraFields
},
});
return dialogRef.afterClosed().toPromise();
};
}
/**
* @param {?} changes
* @return {?}
*/
OrganizationComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes["nodes"] && !changes["nodes"].isFirstChange()) {
this.nextId = this.getNextId();
}
};
/**
* @return {?}
*/
OrganizationComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.nextId = this.getNextId();
};
/**
* @return {?}
*/
OrganizationComponent.prototype.getNextId = /**
* @return {?}
*/
function () {
var /** @type {?} */ maxId = 0;
var /** @type {?} */ openNodes = [];
try {
for (var _a = tslib_1.__values(this.nodes), _b = _a.next(); !_b.done; _b = _a.next()) {
var node = _b.value;
openNodes.push(node);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
}
while (openNodes.length > 0) {
var /** @type {?} */ currentNode = openNodes.pop();
maxId = Math.max(maxId, currentNode.id);
try {
for (var _d = tslib_1.__values(currentNode.children), _e = _d.next(); !_e.done; _e = _d.next()) {
var child = _e.value;
openNodes.push(child);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_e && !_e.done && (_f = _d.return)) _f.call(_d);
}
finally { if (e_2) throw e_2.error; }
}
}
return maxId + 1;
var e_1, _c, e_2, _f;
};
/**
* @param {?} node
* @return {?}
*/
OrganizationComponent.prototype.finishName = /**
* @param {?} node
* @return {?}
*/
function (node) {
node.data.editing = false;
};
/**
* @param {?} tree
* @return {?}
*/
OrganizationComponent.prototype.addNode = /**
* @param {?} tree
* @return {?}
*/
function (tree) {
var /** @type {?} */ focused = tree.treeModel.getFocusedNode();
var /** @type {?} */ child = false;
if (this.nodes.length > 0) {
child = this.nodes[0];
}
if (focused) {
child = focused.data;
}
var /** @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 {?}
*/
OrganizationComponent.prototype.filterNodes = /**
* @param {?} text
* @param {?} tree
* @return {?}
*/
function (text, tree) {
tree.treeModel.filterNodes(text);
};
/**
* @param {?} treeModel
* @param {?} node
* @return {?}
*/
OrganizationComponent.prototype.editNode = /**
* @param {?} treeModel
* @param {?} node
* @return {?}
*/
function (treeModel, node) {
this.editProfesion(node.data).then(function (res) {
for (var /** @type {?} */ field in res) {
node.data[field] = res[field];
}
treeModel.update();
}).catch(function (err) {
});
};
/**
* @param {?} tree
* @param {?} node
* @return {?}
*/
OrganizationComponent.prototype.deleteNode = /**
* @param {?} tree
* @param {?} node
* @return {?}
*/
function (tree, node) {
event.stopPropagation();
var /** @type {?} */ siblings = node.parent.data.children;
node.parent.data.children = siblings.filter(function (x) { return x.id != node.data.id; });
if (this.updater) {
this.updater.emit(this.nodes);
}
tree.treeModel.update();
};
/**
* @return {?}
*/
OrganizationComponent.prototype.save = /**
* @return {?}
*/
function () {
if (this.updater) {
this.updater.emit(this.nodes);
}
};
OrganizationComponent.decorators = [
{ type: Component, args: [{
selector: 'covalent-organization',
template: "<form *ngIf=\"hasFilter\">\n\t<mat-form-field fxFlex>\n\t\t<input matInput #filter autocomplete=\"off\"\n\t\t\t(keyup)=\"filterNodes(filter.value, tree)\" placeholder=\"{{'app.organization.filter' | translate}}\">\n\t</mat-form-field>\n</form>\n<div class=\"wrap\">\n\t<tree-root #tree [nodes]=\"nodes\" [options]=\"customTemplateStringOptions\" focused=\"true\">\n\t\t<ng-template #treeNodeTemplate let-node>\n\t\t\t<span *ngIf=\"!node.data.editing\" [class.root-node]=\"node.isRoot\" title=\"{{node.data.name}}\">{{ node.data.name }}</span>\n\t\t\t<mat-icon *ngIf=\"!node.data.editing && !node.isRoot && editable\" class=\"tree-icon\" (click)=\"editNode(tree.treeModel,node)\">edit</mat-icon>\n\t\t\t<mat-icon *ngIf=\"!node.data.editing && !node.isRoot && editable\" class=\"tree-icon\" (click)=\"deleteNode(tree,node)\">delete</mat-icon>\n\t\t\t<mat-form-field *ngIf=\"node.data.editing\" fxFlex>\n\t\t\t\t<input autocomplete=\"off\" matInput [(ngModel)]=\"node.data.name\" (change)=\"finishName(node)\" >\n\t\t\t</mat-form-field>\n\t\t</ng-template>\n\t\t<ng-template #loadingTemplate>{{'app.organization.loading' | translate}}</ng-template>\n\t</tree-root>\n</div>\n\n<div *ngIf=\"hasButtons\">\n\t<br>\n\t<button *ngIf=\"editable\" mat-raised-button color=\"primary\" (click)=\"addNode(tree)\">\n\t\t{{'app.organization.add' | translate}}\n\t</button>\n\t<button *ngIf=\"expandible\" mat-raised-button color=\"primary\" (click)=\"tree.treeModel.expandAll()\">\n\t\t{{'app.organization.expand' | translate}}\n\t</button>\n\t<button *ngIf=\"collapsable\" mat-raised-button color=\"primary\" (click)=\"tree.treeModel.collapseAll()\">\n\t\t{{'app.organization.collapse' | translate}}\n\t</button>\n\t<button *ngIf=\"editable && saveable\" mat-raised-button color=\"accent\" (click)=\"save()\">\n\t\t{{'app.organization.save' | translate}}\n\t</button>\n</div>\n",
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 = function () { return [
{ 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 },],
};
return OrganizationComponent;
}());
export { OrganizationComponent };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb3ZhbGVudC9keW5hbWljLWZvcm1zLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9vcmdhbml6YXRpb24vb3JnYW5pemF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQXVCLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQVcsWUFBWSxFQUF1QixNQUFNLHdCQUF3QixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUU1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQzs7SUE4RjdHLCtCQUFvQixNQUFpQixFQUFVLGNBQWlDO1FBQWhGLGlCQUVDO1FBRm1CLFdBQU0sR0FBTixNQUFNLENBQVc7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7eUJBbERsRCxLQUFLOzBCQUNKLEtBQUs7d0JBQ1AsS0FBSzt3QkFDTCxLQUFLO3dCQUVMLElBQUk7MEJBQ0YsSUFBSTsyQkFDSCxJQUFJO3FCQUVaLEVBQUU7MkJBRU8sRUFBRTt1QkFFTSxJQUFJLFlBQVksRUFBUztzQkFFakQsQ0FBQzs2QkFFYztZQUMvQixLQUFLLEVBQUU7Z0JBQ04sUUFBUSxFQUFFLFVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLO29CQUMzQixFQUFFLENBQUMsQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzt3QkFDbkIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQzFCO2lCQUNEO2dCQUNELEtBQUssRUFBRSxVQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSztvQkFD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QUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5QjtLQUNEOztnQkFoTkQsU0FBUyxTQUFDO29CQUNWLFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLFFBQVEsRUFBRSx5MERBbUNWO29CQUNBLE1BQU0sRUFBRSxDQUFDLHFRQUFxUSxDQUFDO2lCQUMvUTs7OztnQkE1Q08sU0FBUztnQkFFUixnQkFBZ0I7Ozs4QkE2Q3ZCLEtBQUs7K0JBQ0wsS0FBSzs2QkFDTCxLQUFLOzZCQUNMLEtBQUs7NkJBRUwsS0FBSzsrQkFDTCxLQUFLO2dDQUNMLEtBQUs7MEJBRUwsS0FBSztnQ0FFTCxLQUFLOzRCQUVMLE1BQU07O2dDQTlEUjs7U0ErQ2EscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtUcmVlTm9kZSwgVFJFRV9BQ1RJT05TLCBLRVlTLCBJQWN0aW9uTWFwcGluZ30gZnJvbSAnYW5ndWxhci10cmVlLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcblxyXG5pbXBvcnQgeyBUZExvYWRpbmdTZXJ2aWNlIH0gZnJvbSAnQGNvdmFsZW50L2NvcmUvbG9hZGluZyc7XHJcbmltcG9ydCB7IE9yZ2FuaXphdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2RpYWxvZ3Mvb3JnYW5pemF0aW9uLWRpYWxvZy9vcmdhbml6YXRpb24tZGlhbG9nLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2NvdmFsZW50LW9yZ2FuaXphdGlvbicsXHJcblx0dGVtcGxhdGU6IGA8Zm9ybSAqbmdJZj1cImhhc0ZpbHRlclwiPlxyXG5cdDxtYXQtZm9ybS1maWVsZCBmeEZsZXg+XHJcblx0XHQ8aW5wdXQgbWF0SW5wdXQgI2ZpbHRlciBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG5cdFx0XHQoa2V5dXApPVwiZmlsdGVyTm9kZXMoZmlsdGVyLnZhbHVlLCB0cmVlKVwiIHBsYWNlaG9sZGVyPVwie3snYXBwLm9yZ2FuaXphdGlvbi5maWx0ZXInIHwgdHJhbnNsYXRlfX1cIj5cclxuXHQ8L21hdC1mb3JtLWZpZWxkPlxyXG48L2Zvcm0+XHJcbjxkaXYgY2xhc3M9XCJ3cmFwXCI+XHJcblx0PHRyZWUtcm9vdCAjdHJlZSBbbm9kZXNdPVwibm9kZXNcIiBbb3B0aW9uc109XCJjdXN0b21UZW1wbGF0ZVN0cmluZ09wdGlvbnNcIiBmb2N1c2VkPVwidHJ1ZVwiPlxyXG5cdFx0PG5nLXRlbXBsYXRlICN0cmVlTm9kZVRlbXBsYXRlIGxldC1ub2RlPlxyXG5cdFx0XHQ8c3BhbiAqbmdJZj1cIiFub2RlLmRhdGEuZWRpdGluZ1wiIFtjbGFzcy5yb290LW5vZGVdPVwibm9kZS5pc1Jvb3RcIiB0aXRsZT1cInt7bm9kZS5kYXRhLm5hbWV9fVwiPnt7IG5vZGUuZGF0YS5uYW1lIH19PC9zcGFuPlxyXG5cdFx0XHQ8bWF0LWljb24gKm5nSWY9XCIhbm9kZS5kYXRhLmVkaXRpbmcgJiYgIW5vZGUuaXNSb290ICYmIGVkaXRhYmxlXCIgY2xhc3M9XCJ0cmVlLWljb25cIiAoY2xpY2spPVwiZWRpdE5vZGUodHJlZS50cmVlTW9kZWwsbm9kZSlcIj5lZGl0PC9tYXQtaWNvbj5cclxuXHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiIW5vZGUuZGF0YS5lZGl0aW5nICYmICFub2RlLmlzUm9vdCAmJiBlZGl0YWJsZVwiIGNsYXNzPVwidHJlZS1pY29uXCIgKGNsaWNrKT1cImRlbGV0ZU5vZGUodHJlZSxub2RlKVwiPmRlbGV0ZTwvbWF0LWljb24+XHJcblx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIm5vZGUuZGF0YS5lZGl0aW5nXCIgZnhGbGV4PlxyXG5cdFx0XHRcdDxpbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cIm5vZGUuZGF0YS5uYW1lXCIgKGNoYW5nZSk9XCJmaW5pc2hOYW1lKG5vZGUpXCIgPlxyXG5cdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdDxuZy10ZW1wbGF0ZSAjbG9hZGluZ1RlbXBsYXRlPnt7J2FwcC5vcmdhbml6YXRpb24ubG9hZGluZycgfCB0cmFuc2xhdGV9fTwvbmctdGVtcGxhdGU+XHJcblx0PC90cmVlLXJvb3Q+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cImhhc0J1dHRvbnNcIj5cclxuXHQ8YnI+XHJcblx0PGJ1dHRvbiAqbmdJZj1cImVkaXRhYmxlXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImFkZE5vZGUodHJlZSlcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uYWRkJyB8IHRyYW5zbGF0ZX19XHJcblx0PC9idXR0b24+XHJcblx0PGJ1dHRvbiAqbmdJZj1cImV4cGFuZGlibGVcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwidHJlZS50cmVlTW9kZWwuZXhwYW5kQWxsKClcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uZXhwYW5kJyB8IHRyYW5zbGF0ZX19XHJcblx0PC9idXR0b24+XHJcblx0PGJ1dHRvbiAqbmdJZj1cImNvbGxhcHNhYmxlXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInRyZWUudHJlZU1vZGVsLmNvbGxhcHNlQWxsKClcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uY29sbGFwc2UnIHwgdHJhbnNsYXRlfX1cclxuXHQ8L2J1dHRvbj5cclxuXHQ8YnV0dG9uICpuZ0lmPVwiZWRpdGFibGUgJiYgc2F2ZWFibGVcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cImFjY2VudFwiIChjbGljayk9XCJzYXZlKClcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uc2F2ZScgfCB0cmFuc2xhdGV9fVxyXG5cdDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuYCxcclxuXHRzdHlsZXM6IFtgOmhvc3QgLndyYXB7aGVpZ2h0OjQwMHB4O21heC13aWR0aDozMDBweDttaW4td2lkdGg6MjUwcHg7cG9zaXRpb246cmVsYXRpdmV9Omhvc3QgYnV0dG9uW21hdC1yYWlzZWQtYnV0dG9uXXttYXJnaW4tcmlnaHQ6NXB4O21hcmdpbi1ib3R0b206MTBweH0ubm9kZS1jb250ZW50LXdyYXBwZXJ7bGluZS1oZWlnaHQ6MzdweH0udHJlZS1pY29ue21hcmdpbi1sZWZ0OjEwcHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5yb290LW5vZGV7Zm9udC13ZWlnaHQ6NzAwfWBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuXHRASW5wdXQoKSBoYXNGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRASW5wdXQoKSBoYXNCdXR0b25zOiBib29sZWFuID0gZmFsc2U7XHJcblx0QElucHV0KCkgZWRpdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRASW5wdXQoKSBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRASW5wdXQoKSBzYXZlYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgZXhwYW5kaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgY29sbGFwc2FibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHRASW5wdXQoKSBub2RlczogYW55W10gPSBbXTtcclxuXHJcblx0QElucHV0KCkgZXh0cmFGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdEBPdXRwdXQoKSB1cGRhdGVyOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuXHJcblx0bmV4dElkOiBudW1iZXIgPSAxO1xyXG5cclxuXHRhY3Rpb25NYXBwaW5nOiBJQWN0aW9uTWFwcGluZyA9IHtcclxuXHRcdG1vdXNlOiB7XHJcblx0XHRcdGRibENsaWNrOiAodHJlZSwgbm9kZSwgZXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5lZGl0YWJsZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5lZGl0Tm9kZSh0cmVlLCBub2RlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdGNsaWNrOiAodHJlZSwgbm9kZSwgZXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5tdWx0aXBsZSkge1xyXG5cdFx0XHRcdFx0ZXZlbnQuY3RybEtleSA/IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFX01VTFRJKHRyZWUsIG5vZGUsIGV2ZW50KSA6IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFKHRyZWUsIG5vZGUsIGV2ZW50KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRUUkVFX0FDVElPTlMuVE9HR0xFX0FDVElWRSh0cmVlLCBub2RlLCBldmVudCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdGN1c3RvbVRlbXBsYXRlU3RyaW5nT3B0aW9ucyA9IHtcclxuXHRcdGlzRXhwYW5kZWRGaWVsZDogJ2V4cGFuZGVkJyxcclxuXHRcdGlkRmllbGQ6ICdpZCcsXHJcblx0XHRhY3Rpb25NYXBwaW5nOiB0aGlzLmFjdGlvbk1hcHBpbmcsXHJcblx0XHRub2RlSGVpZ2h0OiA0MCxcclxuXHRcdGFsbG93RHJhZzogKG5vZGUpID0+IHtcclxuICAgICAgXHRcdHJldHVybiAhbm9kZS5kYXRhLmVkaXRpbmc7XHJcbiAgICBcdH0sXHJcbiAgICBcdGFsbG93RHJvcDogKG5vZGUpID0+IHtcclxuICAgICAgXHRcdHJldHVybiAhbm9kZS5kYXRhLmVkaXRpbmc7XHJcbiAgICBcdH0sXHJcblx0XHR1c2VWaXJ0dWFsU2Nyb2xsOiB0cnVlXHJcblx0fTtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBsb2FkaW5nU2VydmljZSA6IFRkTG9hZGluZ1NlcnZpY2UpIHtcclxuXHJcblx0fVxyXG5cclxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMubm9kZXMgJiYgIWNoYW5nZXMubm9kZXMuaXNGaXJzdENoYW5nZSgpKSB7XHJcblx0XHRcdHRoaXMubmV4dElkID0gdGhpcy5nZXROZXh0SWQoKTtcclxuXHRcdH1cclxuXHJcbiAgICB9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5uZXh0SWQgPSB0aGlzLmdldE5leHRJZCgpO1xyXG5cdH1cclxuXHJcblx0Z2V0TmV4dElkKCkgOiBudW1iZXIge1xyXG5cclxuXHRcdGxldCBtYXhJZCA9IDA7XHJcblxyXG5cdFx0bGV0IG9wZW5Ob2RlcyA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgbm9kZSBvZiB0aGlzLm5vZGVzKSB7XHJcblx0XHRcdG9wZW5Ob2Rlcy5wdXNoKG5vZGUpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHdoaWxlIChvcGVuTm9kZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRsZXQgY3VycmVudE5vZGUgPSBvcGVuTm9kZXMucG9wKCk7XHJcblxyXG5cdFx0XHRtYXhJZCA9IE1hdGgubWF4KG1heElkLGN1cnJlbnROb2RlLmlkKTtcclxuXHRcdFx0Zm9yIChsZXQgY2hpbGQgb2YgY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuXHRcdFx0XHRvcGVuTm9kZXMucHVzaChjaGlsZCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWF4SWQgKyAxO1xyXG5cdH1cclxuXHJcblx0ZmluaXNoTmFtZShub2RlKSB7XHJcblx0XHRub2RlLmRhdGEuZWRpdGluZyA9IGZhbHNlO1xyXG5cdH1cclxuXHJcblx0YWRkTm9kZSh0cmVlKSB7XHJcblx0XHRsZXQgZm9jdXNlZCA9IHRyZWUudHJlZU1vZGVsLmdldEZvY3VzZWROb2RlKCk7XHJcblx0XHRsZXQgY2hpbGQ6IGFueSA9IGZhbHNlO1xyXG5cdFx0aWYgKHRoaXMubm9kZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRjaGlsZCA9IHRoaXMubm9kZXNbMF07XHJcblx0XHR9XHJcblx0XHRpZiAoZm9jdXNlZCkge1xyXG5cdFx0XHRjaGlsZCA9IGZvY3VzZWQuZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgbmV3Tm9kZSA9IHtcclxuXHRcdFx0aWQ6IHRoaXMubmV4dElkLFxyXG5cdFx0XHRuYW1lOiAnTnVldm8gbm9kbycsXHJcblx0XHRcdGNoaWxkcmVuOiBbXSxcclxuXHRcdFx0ZXhwYW5kZWQ6IGZhbHNlLFxyXG5cdFx0XHRyZXNpZGVudGU6IGZhbHNlXHJcblx0XHR9O1xyXG5cdFx0dGhpcy5uZXh0SWQrKztcclxuXHJcblx0XHRpZiAoY2hpbGQpIHtcclxuXHRcdFx0Y2hpbGQuY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHR0aGlzLm5vZGVzLnB1c2gobmV3Tm9kZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMudXBkYXRlcikge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZXIuZW1pdCh0aGlzLm5vZGVzKTtcclxuXHRcdH1cclxuXHJcblx0XHR0cmVlLnRyZWVNb2RlbC51cGRhdGUoKTtcclxuXHR9XHJcblxyXG5cdGZpbHRlck5vZGVzKHRleHQsIHRyZWUpIHtcclxuXHRcdHRyZWUudHJlZU1vZGVsLmZpbHRlck5vZGVzKHRleHQpO1xyXG5cdH1cclxuXHJcblx0ZWRpdE5vZGUodHJlZU1vZGVsLCBub2RlKSB7XHJcblx0XHR0aGlzLmVkaXRQcm9mZXNpb24obm9kZS5kYXRhKS50aGVuKCByZXMgPT4ge1xyXG5cdFx0XHRmb3IgKGxldCBmaWVsZCBpbiByZXMpIHtcclxuXHRcdFx0XHRub2RlLmRhdGFbZmllbGRdID0gcmVzW2ZpZWxkXTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0cmVlTW9kZWwudXBkYXRlKCk7XHJcblx0XHR9KS5jYXRjaCggZXJyID0+IHtcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHRlZGl0UHJvZmVzaW9uID0gKHZhbHVlOiBhbnkpID0+IHtcclxuXHRcdGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE9yZ2FuaXphdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xyXG5cdFx0XHRwYW5lbENsYXNzOiAnb3JnYW5pemF0aW9uLW1vZGFsJyxcclxuXHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZSxcclxuXHRcdFx0XHRleHRyYUZpZWxkczogdGhpcy5leHRyYUZpZWxkc1xyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcblx0fTtcclxuXHJcblx0ZGVsZXRlTm9kZSh0cmVlLCBub2RlKSB7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdGxldCBzaWJsaW5ncyA6IGFueVtdID0gbm9kZS5wYXJlbnQuZGF0YS5jaGlsZHJlbjtcclxuXHRcdG5vZGUucGFyZW50LmRhdGEuY2hpbGRyZW4gPSBzaWJsaW5ncy5maWx0ZXIgKCB4ID0+IHguaWQgIT0gbm9kZS5kYXRhLmlkKTtcclxuXHJcblx0XHRpZiAodGhpcy51cGRhdGVyKSB7XHJcblx0XHRcdHRoaXMudXBkYXRlci5lbWl0KHRoaXMubm9kZXMpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyZWUudHJlZU1vZGVsLnVwZGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c2F2ZSgpIHtcclxuXHRcdGlmICh0aGlzLnVwZGF0ZXIpIHtcclxuXHRcdFx0dGhpcy51cGRhdGVyLmVtaXQodGhpcy5ub2Rlcyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxufVxyXG4iXX0=