ngx-diagrams
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.
491 lines • 29.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/models/diagram.model.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { BehaviorSubject } from 'rxjs';
import { NodeModel } from './node.model';
import { LinkModel } from './link.model';
import { BaseEntity } from '../base.entity';
import { uniq, flatMap } from 'lodash';
import { PortModel } from './port.model';
import { PointModel } from './point.model';
var DiagramModel = /** @class */ (function (_super) {
tslib_1.__extends(DiagramModel, _super);
function DiagramModel(diagramEngine, id) {
var _this = _super.call(this, id) || this;
_this.diagramEngine = diagramEngine;
_this.nodes$ = new BehaviorSubject({});
_this.links$ = new BehaviorSubject({});
_this.zoom$ = new BehaviorSubject(100);
_this.offsetX$ = new BehaviorSubject(0);
_this.offsetY$ = new BehaviorSubject(0);
_this.gridSize$ = new BehaviorSubject(0);
return _this;
}
// TODO: support the following events for links and nodes
// removed, updated<positionChanged/dataChanged>, added
// TODO: support the following events for links and nodes
// removed, updated<positionChanged/dataChanged>, added
/**
* @return {?}
*/
DiagramModel.prototype.getNodes =
// TODO: support the following events for links and nodes
// removed, updated<positionChanged/dataChanged>, added
/**
* @return {?}
*/
function () {
return this.nodes$.getValue();
};
/**
* @param {?} id
* @return {?}
*/
DiagramModel.prototype.getNode = /**
* @param {?} id
* @return {?}
*/
function (id) {
return this.nodes$.getValue()[id];
};
/**
* @param {?} id
* @return {?}
*/
DiagramModel.prototype.getLink = /**
* @param {?} id
* @return {?}
*/
function (id) {
return this.links$.getValue()[id];
};
/**
* @return {?}
*/
DiagramModel.prototype.getLinks = /**
* @return {?}
*/
function () {
return this.links$.getValue();
};
/**
* Add a node to the diagram
* @returns Inserted Node
*/
/**
* Add a node to the diagram
* @param {?} node
* @return {?} Inserted Node
*/
DiagramModel.prototype.addNode = /**
* Add a node to the diagram
* @param {?} node
* @return {?} Inserted Node
*/
function (node) {
var _a;
this.nodes$.next(tslib_1.__assign({}, this.nodes$.value, (_a = {}, _a[node.id] = node, _a)));
return node;
};
/**
* Delete a node from the diagram
*/
/**
* Delete a node from the diagram
* @param {?} nodeOrId
* @return {?}
*/
DiagramModel.prototype.deleteNode = /**
* Delete a node from the diagram
* @param {?} nodeOrId
* @return {?}
*/
function (nodeOrId) {
/** @type {?} */
var nodeID = typeof nodeOrId === 'string' ? nodeOrId : nodeOrId.id;
// TODO: delete all related links
/** @type {?} */
var updNodes = tslib_1.__assign({}, this.nodes$.value);
delete updNodes[nodeID];
this.nodes$.next(updNodes);
};
/**
* Get nodes behaviour subject, use `.getValue()` for snapshot
*/
/**
* Get nodes behaviour subject, use `.getValue()` for snapshot
* @return {?}
*/
DiagramModel.prototype.selectNodes = /**
* Get nodes behaviour subject, use `.getValue()` for snapshot
* @return {?}
*/
function () {
return this.nodes$.asObservable();
};
/**
* Add link
* @returns Newly created link
*/
/**
* Add link
* @param {?} link
* @return {?} Newly created link
*/
DiagramModel.prototype.addLink = /**
* Add link
* @param {?} link
* @return {?} Newly created link
*/
function (link) {
var _a;
this.links$.next(tslib_1.__assign({}, this.links$.value, (_a = {}, _a[link.id] = link, _a)));
return link;
};
/**
* Delete link
*/
/**
* Delete link
* @param {?} linkOrId
* @return {?}
*/
DiagramModel.prototype.deleteLink = /**
* Delete link
* @param {?} linkOrId
* @return {?}
*/
function (linkOrId) {
/** @type {?} */
var linkID = typeof linkOrId === 'string' ? linkOrId : linkOrId.id;
/** @type {?} */
var updLinks = tslib_1.__assign({}, this.links$.value);
delete updLinks[linkID];
this.links$.next(updLinks);
};
/**
* Get links behaviour subject, use `.getValue()` for snapshot
*/
/**
* Get links behaviour subject, use `.getValue()` for snapshot
* @return {?}
*/
DiagramModel.prototype.selectLinks = /**
* Get links behaviour subject, use `.getValue()` for snapshot
* @return {?}
*/
function () {
return this.links$.asObservable();
};
/**
* Serialize the diagram model
* @returns diagram model as a string
*/
// serialize(): string {
// return JSON.stringify(this.model);
// }
/**
* Load into the diagram model a serialized diagram
*/
// deserialize(serializedModel: string) {
// this.model = JSON.parse(serializedModel);
// }
/**
* Serialize the diagram model
* @returns diagram model as a string
*/
// serialize(): string {
// return JSON.stringify(this.model);
// }
/**
* Load into the diagram model a serialized diagram
* @param {?} x
* @param {?} y
* @return {?}
*/
// deserialize(serializedModel: string) {
// this.model = JSON.parse(serializedModel);
// }
DiagramModel.prototype.setOffset = /**
* Serialize the diagram model
* @returns diagram model as a string
*/
// serialize(): string {
// return JSON.stringify(this.model);
// }
/**
* Load into the diagram model a serialized diagram
* @param {?} x
* @param {?} y
* @return {?}
*/
// deserialize(serializedModel: string) {
// this.model = JSON.parse(serializedModel);
// }
function (x, y) {
this.offsetX$.next(x);
this.offsetY$.next(y);
};
/**
* @param {?} x
* @return {?}
*/
DiagramModel.prototype.setOffsetX = /**
* @param {?} x
* @return {?}
*/
function (x) {
this.offsetX$.next(x);
};
/**
* @return {?}
*/
DiagramModel.prototype.getOffsetX = /**
* @return {?}
*/
function () {
return this.offsetX$.getValue();
};
/**
* @return {?}
*/
DiagramModel.prototype.selectOffsetX = /**
* @return {?}
*/
function () {
return this.offsetX$.asObservable();
};
/**
* @param {?} y
* @return {?}
*/
DiagramModel.prototype.setOffsetY = /**
* @param {?} y
* @return {?}
*/
function (y) {
this.offsetY$.next(y);
};
/**
* @return {?}
*/
DiagramModel.prototype.getOffsetY = /**
* @return {?}
*/
function () {
return this.offsetY$.getValue();
};
/**
* @return {?}
*/
DiagramModel.prototype.selectOffsetY = /**
* @return {?}
*/
function () {
return this.offsetY$.asObservable();
};
/**
* @param {?} z
* @return {?}
*/
DiagramModel.prototype.setZoomLevel = /**
* @param {?} z
* @return {?}
*/
function (z) {
this.zoom$.next(z);
};
/**
* @return {?}
*/
DiagramModel.prototype.getZoomLevel = /**
* @return {?}
*/
function () {
return this.zoom$.getValue();
};
/**
* @return {?}
*/
DiagramModel.prototype.selectZoomLevel = /**
* @return {?}
*/
function () {
return this.zoom$.asObservable();
};
/**
* @return {?}
*/
DiagramModel.prototype.getDiagramEngine = /**
* @return {?}
*/
function () {
return this.diagramEngine;
};
/**
* @param {?=} ignore
* @return {?}
*/
DiagramModel.prototype.clearSelection = /**
* @param {?=} ignore
* @return {?}
*/
function (ignore) {
if (ignore === void 0) { ignore = null; }
this.getSelectedItems().forEach((/**
* @param {?} element
* @return {?}
*/
function (element) {
if (ignore && ignore.id === element.id) {
return;
}
element.setSelected(false);
}));
};
/**
* @param {?} __0
* @return {?}
*/
DiagramModel.prototype.getGridPosition = /**
* @param {?} __0
* @return {?}
*/
function (_a) {
var x = _a.x, y = _a.y;
/** @type {?} */
var gridSize = this.gridSize$.getValue();
if (gridSize === 0) {
return { x: x, y: y };
}
return {
x: gridSize * Math.floor((x + gridSize / 2) / gridSize),
y: gridSize * Math.floor((y + gridSize / 2) / gridSize)
};
};
/**
* @param {...?} filters
* @return {?}
*/
DiagramModel.prototype.getSelectedItems = /**
* @param {...?} filters
* @return {?}
*/
function () {
var filters = [];
for (var _i = 0; _i < arguments.length; _i++) {
filters[_i] = arguments[_i];
}
if (!Array.isArray(filters)) {
filters = [filters];
}
/** @type {?} */
var items = [];
// run through nodes
items = items.concat(flatMap(this.nodes$.getValue(), (/**
* @param {?} node
* @return {?}
*/
function (node) {
return node.getSelectedEntities();
})));
// find all the links
items = items.concat(flatMap(this.links$.getValue(), (/**
* @param {?} link
* @return {?}
*/
function (link) {
return link.getSelectedEntities();
})));
// find all points
items = items.concat(flatMap(this.links$.getValue(), (/**
* @param {?} link
* @return {?}
*/
function (link) {
return flatMap(link.getPoints(), (/**
* @param {?} point
* @return {?}
*/
function (point) {
return point.getSelectedEntities();
}));
})));
items = uniq(items);
if (filters.length > 0) {
items = uniq(items).filter((/**
* @param {?} item
* @return {?}
*/
function (item) {
if (filters.includes('node') && item instanceof NodeModel) {
return true;
}
if (filters.includes('link') && item instanceof LinkModel) {
return true;
}
if (filters.includes('port') && item instanceof PortModel) {
return true;
}
if (filters.includes('point') && item instanceof PointModel) {
return true;
}
return false;
}));
}
return items;
};
/**
* @param {...?} models
* @return {?}
*/
DiagramModel.prototype.addAll = /**
* @param {...?} models
* @return {?}
*/
function () {
var _this = this;
var models = [];
for (var _i = 0; _i < arguments.length; _i++) {
models[_i] = arguments[_i];
}
models.forEach((/**
* @param {?} model
* @return {?}
*/
function (model) {
if (model instanceof LinkModel) {
_this.addLink(model);
}
else if (model instanceof NodeModel) {
_this.addNode(model);
}
}));
return models;
};
return DiagramModel;
}(BaseEntity));
export { DiagramModel };
if (false) {
/** @type {?} */
DiagramModel.prototype.links$;
/** @type {?} */
DiagramModel.prototype.nodes$;
/** @type {?} */
DiagramModel.prototype.zoom$;
/** @type {?} */
DiagramModel.prototype.offsetX$;
/** @type {?} */
DiagramModel.prototype.offsetY$;
/** @type {?} */
DiagramModel.prototype.gridSize$;
/**
* @type {?}
* @private
*/
DiagramModel.prototype.diagramEngine;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ3JhbS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1kaWFncmFtcy8iLCJzb3VyY2VzIjpbImxpYi9tb2RlbHMvZGlhZ3JhbS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFrQixNQUFNLGdCQUFnQixDQUFDO0FBRzVELE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQztJQUFrQyx3Q0FBVTtJQVEzQyxzQkFBb0IsYUFBNEIsRUFBRSxFQUFXO1FBQTdELFlBQ0Msa0JBQU0sRUFBRSxDQUFDLFNBT1Q7UUFSbUIsbUJBQWEsR0FBYixhQUFhLENBQWU7UUFFL0MsS0FBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBNkIsRUFBRSxDQUFDLENBQUM7UUFDbEUsS0FBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBNkIsRUFBRSxDQUFDLENBQUM7UUFDbEUsS0FBSSxDQUFDLEtBQUssR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxLQUFJLENBQUMsUUFBUSxHQUFHLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsS0FBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFDekMsQ0FBQztJ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QUFRLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxZQUFZLFVBQVUsRUFBRTtvQkFDNUQsT0FBTyxJQUFJLENBQUM7aUJBQ1o7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7WUFDZCxDQUFDLEVBQUMsQ0FBQztTQUNIO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDOzs7OztJQUVELDZCQUFNOzs7O0lBQU47UUFBQSxpQkFTQztRQVRNLGdCQUFzQjthQUF0QixVQUFzQixFQUF0QixxQkFBc0IsRUFBdEIsSUFBc0I7WUFBdEIsMkJBQXNCOztRQUM1QixNQUFNLENBQUMsT0FBTzs7OztRQUFDLFVBQUEsS0FBSztZQUNuQixJQUFJLEtBQUssWUFBWSxTQUFTLEVBQUU7Z0JBQy9CLEtBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDcEI7aUJBQU0sSUFBSSxLQUFLLFlBQVksU0FBUyxFQUFFO2dCQUN0QyxLQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BCO1FBQ0YsQ0FBQyxFQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFDRixtQkFBQztBQUFELENBQUMsQUEzT0QsQ0FBa0MsVUFBVSxHQTJPM0M7Ozs7SUExT0EsOEJBQW9EOztJQUNwRCw4QkFBb0Q7O0lBQ3BELDZCQUErQjs7SUFDL0IsZ0NBQWtDOztJQUNsQyxnQ0FBa0M7O0lBQ2xDLGlDQUFtQzs7Ozs7SUFFdkIscUNBQW9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuL25vZGUubW9kZWwnO1xuaW1wb3J0IHsgTGlua01vZGVsIH0gZnJvbSAnLi9saW5rLm1vZGVsJztcbmltcG9ydCB7IEJhc2VFbnRpdHksIEJhc2VFbnRpdHlUeXBlIH0gZnJvbSAnLi4vYmFzZS5lbnRpdHknO1xuaW1wb3J0IHsgRGlhZ3JhbUVuZ2luZSB9IGZyb20gJy4uL3NlcnZpY2VzL2VuZ2luZS5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gJy4vYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyB1bmlxLCBmbGF0TWFwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFBvcnRNb2RlbCB9IGZyb20gJy4vcG9ydC5tb2RlbCc7XG5pbXBvcnQgeyBQb2ludE1vZGVsIH0gZnJvbSAnLi9wb2ludC5tb2RlbCc7XG5pbXBvcnQgeyBDb29yZHMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nvb3Jkcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUQgfSBmcm9tICcuLi91dGlscy90b29sLWtpdC51dGlsJztcblxuZXhwb3J0IGNsYXNzIERpYWdyYW1Nb2RlbCBleHRlbmRzIEJhc2VFbnRpdHkge1xuXHRsaW5rcyQ6IEJlaGF2aW9yU3ViamVjdDx7IFtzOiBzdHJpbmddOiBMaW5rTW9kZWwgfT47XG5cdG5vZGVzJDogQmVoYXZpb3JTdWJqZWN0PHsgW3M6IHN0cmluZ106IE5vZGVNb2RlbCB9Pjtcblx0em9vbSQ6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+O1xuXHRvZmZzZXRYJDogQmVoYXZpb3JTdWJqZWN0PG51bWJlcj47XG5cdG9mZnNldFkkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPjtcblx0Z3JpZFNpemUkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPjtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGRpYWdyYW1FbmdpbmU6IERpYWdyYW1FbmdpbmUsIGlkPzogc3RyaW5nKSB7XG5cdFx0c3VwZXIoaWQpO1xuXHRcdHRoaXMubm9kZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtzOiBzdHJpbmddOiBOb2RlTW9kZWwgfT4oe30pO1xuXHRcdHRoaXMubGlua3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtzOiBzdHJpbmddOiBMaW5rTW9kZWwgfT4oe30pO1xuXHRcdHRoaXMuem9vbSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDEwMCk7XG5cdFx0dGhpcy5vZmZzZXRYJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoMCk7XG5cdFx0dGhpcy5vZmZzZXRZJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoMCk7XG5cdFx0dGhpcy5ncmlkU2l6ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDApO1xuXHR9XG5cblx0Ly8gVE9ETzogc3VwcG9ydCB0aGUgZm9sbG93aW5nIGV2ZW50cyBmb3IgbGlua3MgYW5kIG5vZGVzXG5cdC8vIHJlbW92ZWQsIHVwZGF0ZWQ8cG9zaXRpb25DaGFuZ2VkL2RhdGFDaGFuZ2VkPiwgYWRkZWRcblxuXHRnZXROb2RlcygpOiB7IFtzOiBzdHJpbmddOiBOb2RlTW9kZWwgfSB7XG5cdFx0cmV0dXJuIHRoaXMubm9kZXMkLmdldFZhbHVlKCk7XG5cdH1cblxuXHRnZXROb2RlKGlkOiBJRCk6IE5vZGVNb2RlbCB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLm5vZGVzJC5nZXRWYWx1ZSgpW2lkXTtcblx0fVxuXG5cdGdldExpbmsoaWQ6IElEKTogTGlua01vZGVsIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMubGlua3MkLmdldFZhbHVlKClbaWRdO1xuXHR9XG5cblx0Z2V0TGlua3MoKTogeyBbczogc3RyaW5nXTogTGlua01vZGVsIH0ge1xuXHRcdHJldHVybiB0aGlzLmxpbmtzJC5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5vZGUgdG8gdGhlIGRpYWdyYW1cblx0ICogQHJldHVybnMgSW5zZXJ0ZWQgTm9kZVxuXHQgKi9cblx0YWRkTm9kZShub2RlOiBOb2RlTW9kZWwpOiBOb2RlTW9kZWwge1xuXHRcdHRoaXMubm9kZXMkLm5leHQoeyAuLi50aGlzLm5vZGVzJC52YWx1ZSwgW25vZGUuaWRdOiBub2RlIH0pO1xuXHRcdHJldHVybiBub2RlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZSBhIG5vZGUgZnJvbSB0aGUgZGlhZ3JhbVxuXHQgKi9cblx0ZGVsZXRlTm9kZShub2RlT3JJZDogTm9kZU1vZGVsIHwgc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qgbm9kZUlEOiBJRCA9IHR5cGVvZiBub2RlT3JJZCA9PT0gJ3N0cmluZycgPyBub2RlT3JJZCA6IG5vZGVPcklkLmlkO1xuXG5cdFx0Ly8gVE9ETzogZGVsZXRlIGFsbCByZWxhdGVkIGxpbmtzXG5cdFx0Y29uc3QgdXBkTm9kZXMgPSB7IC4uLnRoaXMubm9kZXMkLnZhbHVlIH07XG5cdFx0ZGVsZXRlIHVwZE5vZGVzW25vZGVJRF07XG5cdFx0dGhpcy5ub2RlcyQubmV4dCh1cGROb2Rlcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IG5vZGVzIGJlaGF2aW91ciBzdWJqZWN0LCB1c2UgYC5nZXRWYWx1ZSgpYCBmb3Igc25hcHNob3Rcblx0ICovXG5cdHNlbGVjdE5vZGVzKCk6IE9ic2VydmFibGU8eyBbczogc3RyaW5nXTogTm9kZU1vZGVsIH0+IHtcblx0XHRyZXR1cm4gdGhpcy5ub2RlcyQuYXNPYnNlcnZhYmxlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGxpbmtcblx0ICogQHJldHVybnMgTmV3bHkgY3JlYXRlZCBsaW5rXG5cdCAqL1xuXHRhZGRMaW5rKGxpbms6IExpbmtNb2RlbCk6IExpbmtNb2RlbCB7XG5cdFx0dGhpcy5saW5rcyQubmV4dCh7IC4uLnRoaXMubGlua3MkLnZhbHVlLCBbbGluay5pZF06IGxpbmsgfSk7XG5cdFx0cmV0dXJuIGxpbms7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlIGxpbmtcblx0ICovXG5cdGRlbGV0ZUxpbmsobGlua09ySWQ6IExpbmtNb2RlbCB8IHN0cmluZykge1xuXHRcdGNvbnN0IGxpbmtJRDogSUQgPSB0eXBlb2YgbGlua09ySWQgPT09ICdzdHJpbmcnID8gbGlua09ySWQgOiBsaW5rT3JJZC5pZDtcblxuXHRcdGNvbnN0IHVwZExpbmtzID0geyAuLi50aGlzLmxpbmtzJC52YWx1ZSB9O1xuXHRcdGRlbGV0ZSB1cGRMaW5rc1tsaW5rSURdO1xuXG5cdFx0dGhpcy5saW5rcyQubmV4dCh1cGRMaW5rcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGxpbmtzIGJlaGF2aW91ciBzdWJqZWN0LCB1c2UgYC5nZXRWYWx1ZSgpYCBmb3Igc25hcHNob3Rcblx0ICovXG5cdHNlbGVjdExpbmtzKCk6IE9ic2VydmFibGU8eyBbczogc3RyaW5nXTogTGlua01vZGVsIH0+IHtcblx0XHRyZXR1cm4gdGhpcy5saW5rcyQuYXNPYnNlcnZhYmxlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2VyaWFsaXplIHRoZSBkaWFncmFtIG1vZGVsXG5cdCAqIEByZXR1cm5zIGRpYWdyYW0gbW9kZWwgYXMgYSBzdHJpbmdcblx0ICovXG5cdC8vIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuXHQvLyBcdHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLm1vZGVsKTtcblx0Ly8gfVxuXG5cdC8qKlxuXHQgKiBMb2FkIGludG8gdGhlIGRpYWdyYW0gbW9kZWwgYSBzZXJpYWxpemVkIGRpYWdyYW1cblx0ICovXG5cdC8vIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWRNb2RlbDogc3RyaW5nKSB7XG5cdC8vIFx0dGhpcy5tb2RlbCA9IEpTT04ucGFyc2Uoc2VyaWFsaXplZE1vZGVsKTtcblx0Ly8gfVxuXG5cdHNldE9mZnNldCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuXHRcdHRoaXMub2Zmc2V0WCQubmV4dCh4KTtcblx0XHR0aGlzLm9mZnNldFkkLm5leHQoeSk7XG5cdH1cblxuXHRzZXRPZmZzZXRYKHg6IG51bWJlcikge1xuXHRcdHRoaXMub2Zmc2V0WCQubmV4dCh4KTtcblx0fVxuXG5cdGdldE9mZnNldFgoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5vZmZzZXRYJC5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0c2VsZWN0T2Zmc2V0WCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuXHRcdHJldHVybiB0aGlzLm9mZnNldFgkLmFzT2JzZXJ2YWJsZSgpO1xuXHR9XG5cblx0c2V0T2Zmc2V0WSh5OiBudW1iZXIpIHtcblx0XHR0aGlzLm9mZnNldFkkLm5leHQoeSk7XG5cdH1cblxuXHRnZXRPZmZzZXRZKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMub2Zmc2V0WSQuZ2V0VmFsdWUoKTtcblx0fVxuXG5cdHNlbGVjdE9mZnNldFkoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcblx0XHRyZXR1cm4gdGhpcy5vZmZzZXRZJC5hc09ic2VydmFibGUoKTtcblx0fVxuXG5cdHNldFpvb21MZXZlbCh6OiBudW1iZXIpIHtcblx0XHR0aGlzLnpvb20kLm5leHQoeik7XG5cdH1cblxuXHRnZXRab29tTGV2ZWwoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy56b29tJC5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0c2VsZWN0Wm9vbUxldmVsKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG5cdFx0cmV0dXJuIHRoaXMuem9vbSQuYXNPYnNlcnZhYmxlKCk7XG5cdH1cblxuXHRnZXREaWFncmFtRW5naW5lKCk6IERpYWdyYW1FbmdpbmUge1xuXHRcdHJldHVybiB0aGlzLmRpYWdyYW1FbmdpbmU7XG5cdH1cblxuXHRjbGVhclNlbGVjdGlvbihpZ25vcmU6IEJhc2VNb2RlbCB8IG51bGwgPSBudWxsKSB7XG5cdFx0dGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCkuZm9yRWFjaChlbGVtZW50ID0+IHtcblx0XHRcdGlmIChpZ25vcmUgJiYgaWdub3JlLmlkID09PSBlbGVtZW50LmlkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGVsZW1lbnQuc2V0U2VsZWN0ZWQoZmFsc2UpO1xuXHRcdH0pO1xuXHR9XG5cblx0Z2V0R3JpZFBvc2l0aW9uKHsgeCwgeSB9OiBDb29yZHMpOiBDb29yZHMge1xuXHRcdGNvbnN0IGdyaWRTaXplID0gdGhpcy5ncmlkU2l6ZSQuZ2V0VmFsdWUoKTtcblx0XHRpZiAoZ3JpZFNpemUgPT09IDApIHtcblx0XHRcdHJldHVybiB7IHgsIHkgfTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IGdyaWRTaXplICogTWF0aC5mbG9vcigoeCArIGdyaWRTaXplIC8gMikgLyBncmlkU2l6ZSksXG5cdFx0XHR5OiBncmlkU2l6ZSAqIE1hdGguZmxvb3IoKHkgKyBncmlkU2l6ZSAvIDIpIC8gZ3JpZFNpemUpXG5cdFx0fTtcblx0fVxuXG5cdGdldFNlbGVjdGVkSXRlbXMoLi4uZmlsdGVyczogQmFzZUVudGl0eVR5cGVbXSk6IEJhc2VNb2RlbFtdIHtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIHtcblx0XHRcdGZpbHRlcnMgPSBbZmlsdGVyc107XG5cdFx0fVxuXHRcdGxldCBpdGVtcyA9IFtdO1xuXG5cdFx0Ly8gcnVuIHRocm91Z2ggbm9kZXNcblx0XHRpdGVtcyA9IGl0ZW1zLmNvbmNhdChcblx0XHRcdGZsYXRNYXAodGhpcy5ub2RlcyQuZ2V0VmFsdWUoKSwgbm9kZSA9PiB7XG5cdFx0XHRcdHJldHVybiBub2RlLmdldFNlbGVjdGVkRW50aXRpZXMoKTtcblx0XHRcdH0pXG5cdFx0KTtcblxuXHRcdC8vIGZpbmQgYWxsIHRoZSBsaW5rc1xuXHRcdGl0ZW1zID0gaXRlbXMuY29uY2F0KFxuXHRcdFx0ZmxhdE1hcCh0aGlzLmxpbmtzJC5nZXRWYWx1ZSgpLCBsaW5rID0+IHtcblx0XHRcdFx0cmV0dXJuIGxpbmsuZ2V0U2VsZWN0ZWRFbnRpdGllcygpO1xuXHRcdFx0fSlcblx0XHQpO1xuXG5cdFx0Ly8gZmluZCBhbGwgcG9pbnRzXG5cdFx0aXRlbXMgPSBpdGVtcy5jb25jYXQoXG5cdFx0XHRmbGF0TWFwKHRoaXMubGlua3MkLmdldFZhbHVlKCksIGxpbmsgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZmxhdE1hcChsaW5rLmdldFBvaW50cygpLCBwb2ludCA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHBvaW50LmdldFNlbGVjdGVkRW50aXRpZXMoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cblx0XHRpdGVtcyA9IHVuaXEoaXRlbXMpO1xuXG5cdFx0aWYgKGZpbHRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0aXRlbXMgPSB1bmlxKGl0ZW1zKS5maWx0ZXIoKGl0ZW06IEJhc2VNb2RlbCkgPT4ge1xuXHRcdFx0XHRpZiAoZmlsdGVycy5pbmNsdWRlcygnbm9kZScpICYmIGl0ZW0gaW5zdGFuY2VvZiBOb2RlTW9kZWwpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZmlsdGVycy5pbmNsdWRlcygnbGluaycpICYmIGl0ZW0gaW5zdGFuY2VvZiBMaW5rTW9kZWwpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZmlsdGVycy5pbmNsdWRlcygncG9ydCcpICYmIGl0ZW0gaW5zdGFuY2VvZiBQb3J0TW9kZWwpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZmlsdGVycy5pbmNsdWRlcygncG9pbnQnKSAmJiBpdGVtIGluc3RhbmNlb2YgUG9pbnRNb2RlbCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBpdGVtcztcblx0fVxuXG5cdGFkZEFsbCguLi5tb2RlbHM6IEJhc2VNb2RlbFtdKSB7XG5cdFx0bW9kZWxzLmZvckVhY2gobW9kZWwgPT4ge1xuXHRcdFx0aWYgKG1vZGVsIGluc3RhbmNlb2YgTGlua01vZGVsKSB7XG5cdFx0XHRcdHRoaXMuYWRkTGluayhtb2RlbCk7XG5cdFx0XHR9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTm9kZU1vZGVsKSB7XG5cdFx0XHRcdHRoaXMuYWRkTm9kZShtb2RlbCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG1vZGVscztcblx0fVxufVxuIl19