ngx-diagrams
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.
328 lines • 25.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/models/node.model.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { BehaviorSubject } from 'rxjs';
import { BaseModel } from './base.model';
import { distinctUntilChanged, map, takeUntil } from 'rxjs/operators';
import { mapToArray } from '../utils/tool-kit.util';
/**
* @template P
*/
export class NodeModel extends BaseModel {
/**
* @param {?=} nodeType
* @param {?=} id
* @param {?=} extras
* @param {?=} x
* @param {?=} y
* @param {?=} width
* @param {?=} height
* @param {?=} logPrefix
*/
constructor(nodeType = 'default', id, extras = {}, x = 0, y = 0, width = 0, height = 0, logPrefix = '[Node]') {
super(nodeType, id, logPrefix);
this._extras = new BehaviorSubject(extras);
this._ports = new BehaviorSubject({});
this._dimensions = new BehaviorSubject({ width, height });
this._coords = new BehaviorSubject({ x, y });
this.extras$ = this._extras.asObservable();
this.ports$ = this._ports.asObservable();
this.coords$ = this._coords.asObservable();
this.dimensions$ = this._dimensions.asObservable();
}
/**
* @return {?}
*/
getCoords() {
return this._coords.getValue();
}
/**
* @param {?} __0
* @return {?}
*/
setCoords({ x, y }) {
const { x: oldX, y: oldY } = this.getCoords();
Object.values(this._ports.getValue()).forEach((/**
* @param {?} port
* @return {?}
*/
port => {
Object.values(port.getLinks()).forEach((/**
* @param {?} link
* @return {?}
*/
link => {
/** @type {?} */
const point = link.getPointForPort(port);
const { x: pointX, y: pointY } = point.getCoords();
point.setCoords({ x: pointX + x - oldX, y: pointY + y - oldY });
}));
}));
this._coords.next({ x, y });
}
// TODO: implement better transition on auto arrange!
/**
* @param {?} __0
* @return {?}
*/
transitionToCoords({ x, y }) {
// const transitionCompleted = new ReplaySubject(1);
// let { x: oldX, y: oldY } = this.getCoords();
// console.log(x, y, oldX, oldY);
// interval(0)
// .pipe(takeUntil(transitionCompleted))
// .subscribe(
// () => {
// if (oldX < x) {
// oldX++;
// } else if (oldX > x) {
// oldX--;
// }
// if (y > oldY) {
// oldY++;
// } else if (y < oldY) {
// oldY--;
// }
// Object.values(this._ports.getValue()).forEach(port => {
// Object.values(port.getLinks()).forEach(link => {
// const point = link.getPointForPort(port);
// const { x: pointX, y: pointY } = point.getCoords();
// point.setCoords({ x: pointX + x - oldX, y: pointY + y - oldY });
// });
// });
// this._coords.next({ x: oldX, y: oldY });
// if (x === oldX && y === oldY) {
// transitionCompleted.next(true);
// transitionCompleted.complete();
// }
// },
// err => {
// console.error(err);
// },
// () => {
// console.log('finished transition');
// }
// );
}
// TODO: override selectionChanges and replace this with it (convert to rx)
/**
* @return {?}
*/
getSelectedEntities() {
/** @type {?} */
let entities = super.getSelectedEntities();
// add the points of each link that are selected here
if (this.getSelected()) {
Object.values(this._ports.getValue()).forEach((/**
* @param {?} port
* @return {?}
*/
port => {
/** @type {?} */
const links = Object.values(port.getLinks());
entities = entities.concat(links.map((/**
* @param {?} link
* @return {?}
*/
link => {
return link.getPointForPort(port);
})));
}));
}
this.log('selectedEntities', entities);
return entities;
}
// TODO: map to BaseEvent
/**
* @return {?}
*/
coordsChanges() {
return this.coords$.pipe(takeUntil(this.onEntityDestroy()));
}
/**
* @return {?}
*/
selectCoords() {
return this.coords$.pipe(takeUntil(this.onEntityDestroy()), distinctUntilChanged());
}
/**
* @return {?}
*/
selectX() {
return this.selectCoords().pipe(map((/**
* @param {?} c
* @return {?}
*/
c => c.x)), this.withLog('selectX'), distinctUntilChanged());
}
/**
* @return {?}
*/
selectY() {
return this.selectCoords().pipe(map((/**
* @param {?} c
* @return {?}
*/
c => c.y)), this.withLog('selectY'), distinctUntilChanged());
}
/**
* Assign a port to the node and set the node as its getParent
* @param {?} port
* @return {?} the inserted port
*/
addPort(port) {
port.setParent(this);
this._ports.next(Object.assign({}, this._ports.value, { [port.id]: port }));
return port;
}
/**
* @param {?} id
* @return {?}
*/
getPort(id) {
return this._ports.value[id];
}
/**
* @param {?=} selector
* @return {?}
*/
selectPorts(selector) {
// TODO: implement selector
// TODO: create coerce func
return this.ports$.pipe(takeUntil(this.onEntityDestroy()), distinctUntilChanged(), map((/**
* @param {?} ports
* @return {?}
*/
ports => mapToArray(ports))), this.withLog('selectPorts'));
}
/**
* @param {?=} ids
* @return {?}
*/
getPorts(ids) {
return this._ports.getValue();
}
/**
* @param {?} __0
* @return {?}
*/
setDimensions({ width, height }) {
this._dimensions.next({ width, height });
}
/**
* @return {?}
*/
getDimensions() {
return this._dimensions.getValue();
}
// TODO: return BaseEvent extension
/**
* @return {?}
*/
dimensionChanges() {
return this.dimensions$.pipe(takeUntil(this.onEntityDestroy()), distinctUntilChanged(), this.withLog('DimensionChanges'));
}
/**
* @return {?}
*/
getHeight() {
return this._dimensions.getValue().height;
}
/**
* @return {?}
*/
getWidth() {
return this._dimensions.getValue().width;
}
/**
* @return {?}
*/
selectWidth() {
return this.dimensions$.pipe(takeUntil(this.onEntityDestroy()), map((/**
* @param {?} d
* @return {?}
*/
d => d.width)), distinctUntilChanged(), this.withLog('selectWidth'));
}
/**
* @return {?}
*/
selectHeight() {
return this.dimensions$.pipe(takeUntil(this.onEntityDestroy()), map((/**
* @param {?} d
* @return {?}
*/
d => d.width)), distinctUntilChanged(), this.withLog('selectHeight'));
}
/**
* @param {?} extras
* @return {?}
*/
setExtras(extras) {
this._extras.next(extras);
}
/**
* @return {?}
*/
getExtras() {
return this._extras.getValue();
}
/**
* @template E
* @param {?=} selector
* @return {?}
*/
selectExtras(selector) {
// TODO: impl selector
return this.extras$.pipe(takeUntil(this.onEntityDestroy()), distinctUntilChanged());
}
}
if (false) {
/** @type {?} */
NodeModel.prototype.id;
/** @type {?} */
NodeModel.prototype.diagramEngine;
/**
* @type {?}
* @private
*/
NodeModel.prototype._extras;
/**
* @type {?}
* @private
*/
NodeModel.prototype._ports;
/**
* @type {?}
* @private
*/
NodeModel.prototype._coords;
/**
* @type {?}
* @private
*/
NodeModel.prototype._dimensions;
/**
* @type {?}
* @private
*/
NodeModel.prototype.extras$;
/**
* @type {?}
* @private
*/
NodeModel.prototype.ports$;
/**
* @type {?}
* @private
*/
NodeModel.prototype.coords$;
/**
* @type {?}
* @private
*/
NodeModel.prototype.dimensions$;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1kaWFncmFtcy8iLCJzb3VyY2VzIjpbImxpYi9tb2RlbHMvbm9kZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUl6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRFLE9BQU8sRUFBTSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQUV4RCxNQUFNLE9BQU8sU0FBMkMsU0FBUSxTQUF1Qjs7Ozs7Ozs7Ozs7SUFhdEYsWUFDQyxXQUFtQixTQUFTLEVBQzVCLEVBQVcsRUFDWCxTQUErQixFQUFFLEVBQ2pDLElBQVksQ0FBQyxFQUNiLElBQVksQ0FBQyxFQUNiLFFBQWdCLENBQUMsRUFDakIsU0FBaUIsQ0FBQyxFQUNsQixTQUFTLEdBQUcsUUFBUTtRQUVwQixLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBYSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1B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Ozs7O0lBQ2hFLDJCQUE2RDs7Ozs7SUFDN0QsNEJBQWtEOzs7OztJQUNsRCxnQ0FBMEQ7Ozs7O0lBQzFELDRCQUEyRDs7Ozs7SUFDM0QsMkJBQXdEOzs7OztJQUN4RCw0QkFBNkM7Ozs7O0lBQzdDLGdDQUFxRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUG9ydE1vZGVsIH0gZnJvbSAnLi9wb3J0Lm1vZGVsJztcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gJy4vYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBEaWFncmFtTW9kZWwgfSBmcm9tICcuL2RpYWdyYW0ubW9kZWwnO1xuaW1wb3J0IHsgQ29vcmRzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb29yZHMuaW50ZXJmYWNlLmpzJztcbmltcG9ydCB7IERpYWdyYW1FbmdpbmUgfSBmcm9tICcuLi9zZXJ2aWNlcy9lbmdpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEaW1lbnNpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9kaW1lbnNpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRCwgbWFwVG9BcnJheSB9IGZyb20gJy4uL3V0aWxzL3Rvb2wta2l0LnV0aWwnO1xuXG5leHBvcnQgY2xhc3MgTm9kZU1vZGVsPFAgZXh0ZW5kcyBQb3J0TW9kZWwgPSBQb3J0TW9kZWw+IGV4dGVuZHMgQmFzZU1vZGVsPERpYWdyYW1Nb2RlbD4ge1xuXHRpZDogSUQ7XG5cdGRpYWdyYW1FbmdpbmU6IERpYWdyYW1FbmdpbmU7XG5cblx0cHJpdmF0ZSByZWFkb25seSBfZXh0cmFzOiBCZWhhdmlvclN1YmplY3Q8eyBbczogc3RyaW5nXTogYW55IH0+O1xuXHRwcml2YXRlIHJlYWRvbmx5IF9wb3J0czogQmVoYXZpb3JTdWJqZWN0PHsgW3M6IHN0cmluZ106IFAgfT47XG5cdHByaXZhdGUgcmVhZG9ubHkgX2Nvb3JkczogQmVoYXZpb3JTdWJqZWN0PENvb3Jkcz47XG5cdHByaXZhdGUgcmVhZG9ubHkgX2RpbWVuc2lvbnM6IEJlaGF2aW9yU3ViamVjdDxEaW1lbnNpb25zPjtcblx0cHJpdmF0ZSByZWFkb25seSBleHRyYXMkOiBPYnNlcnZhYmxlPHsgW3M6IHN0cmluZ106IGFueSB9Pjtcblx0cHJpdmF0ZSByZWFkb25seSBwb3J0cyQ6IE9ic2VydmFibGU8eyBbczogc3RyaW5nXTogUCB9Pjtcblx0cHJpdmF0ZSByZWFkb25seSBjb29yZHMkOiBPYnNlcnZhYmxlPENvb3Jkcz47XG5cdHByaXZhdGUgcmVhZG9ubHkgZGltZW5zaW9ucyQ6IE9ic2VydmFibGU8RGltZW5zaW9ucz47XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0bm9kZVR5cGU6IHN0cmluZyA9ICdkZWZhdWx0Jyxcblx0XHRpZD86IHN0cmluZyxcblx0XHRleHRyYXM6IHsgW3M6IHN0cmluZ106IGFueSB9ID0ge30sXG5cdFx0eDogbnVtYmVyID0gMCxcblx0XHR5OiBudW1iZXIgPSAwLFxuXHRcdHdpZHRoOiBudW1iZXIgPSAwLFxuXHRcdGhlaWdodDogbnVtYmVyID0gMCxcblx0XHRsb2dQcmVmaXggPSAnW05vZGVdJ1xuXHQpIHtcblx0XHRzdXBlcihub2RlVHlwZSwgaWQsIGxvZ1ByZWZpeCk7XG5cdFx0dGhpcy5fZXh0cmFzID0gbmV3IEJlaGF2aW9yU3ViamVjdChleHRyYXMpO1xuXHRcdHRoaXMuX3BvcnRzID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7fSk7XG5cdFx0dGhpcy5fZGltZW5zaW9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGltZW5zaW9ucz4oeyB3aWR0aCwgaGVpZ2h0IH0pO1xuXHRcdHRoaXMuX2Nvb3JkcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29vcmRzPih7IHgsIHkgfSk7XG5cdFx0dGhpcy5leHRyYXMkID0gdGhpcy5fZXh0cmFzLmFzT2JzZXJ2YWJsZSgpO1xuXHRcdHRoaXMucG9ydHMkID0gdGhpcy5fcG9ydHMuYXNPYnNlcnZhYmxlKCk7XG5cdFx0dGhpcy5jb29yZHMkID0gdGhpcy5fY29vcmRzLmFzT2JzZXJ2YWJsZSgpO1xuXHRcdHRoaXMuZGltZW5zaW9ucyQgPSB0aGlzLl9kaW1lbnNpb25zLmFzT2JzZXJ2YWJsZSgpO1xuXHR9XG5cblx0Z2V0Q29vcmRzKCk6IENvb3JkcyB7XG5cdFx0cmV0dXJuIHRoaXMuX2Nvb3Jkcy5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0c2V0Q29vcmRzKHsgeCwgeSB9OiBDb29yZHMpIHtcblx0XHRjb25zdCB7IHg6IG9sZFgsIHk6IG9sZFkgfSA9IHRoaXMuZ2V0Q29vcmRzKCk7XG5cblx0XHRPYmplY3QudmFsdWVzKHRoaXMuX3BvcnRzLmdldFZhbHVlKCkpLmZvckVhY2gocG9ydCA9PiB7XG5cdFx0XHRPYmplY3QudmFsdWVzKHBvcnQuZ2V0TGlua3MoKSkuZm9yRWFjaChsaW5rID0+IHtcblx0XHRcdFx0Y29uc3QgcG9pbnQgPSBsaW5rLmdldFBvaW50Rm9yUG9ydChwb3J0KTtcblx0XHRcdFx0Y29uc3QgeyB4OiBwb2ludFgsIHk6IHBvaW50WSB9ID0gcG9pbnQuZ2V0Q29vcmRzKCk7XG5cdFx0XHRcdHBvaW50LnNldENvb3Jkcyh7IHg6IHBvaW50WCArIHggLSBvbGRYLCB5OiBwb2ludFkgKyB5IC0gb2xkWSB9KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5fY29vcmRzLm5leHQoeyB4LCB5IH0pO1xuXHR9XG5cblx0Ly8gVE9ETzogaW1wbGVtZW50IGJldHRlciB0cmFuc2l0aW9uIG9uIGF1dG8gYXJyYW5nZSFcblx0dHJhbnNpdGlvblRvQ29vcmRzKHsgeCwgeSB9OiBDb29yZHMpIHtcblx0XHQvLyBjb25zdCB0cmFuc2l0aW9uQ29tcGxldGVkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cdFx0Ly8gbGV0IHsgeDogb2xkWCwgeTogb2xkWSB9ID0gdGhpcy5nZXRDb29yZHMoKTtcblx0XHQvLyBjb25zb2xlLmxvZyh4LCB5LCBvbGRYLCBvbGRZKTtcblx0XHQvLyBpbnRlcnZhbCgwKVxuXHRcdC8vIFx0LnBpcGUodGFrZVVudGlsKHRyYW5zaXRpb25Db21wbGV0ZWQpKVxuXHRcdC8vIFx0LnN1YnNjcmliZShcblx0XHQvLyBcdFx0KCkgPT4ge1xuXHRcdC8vIFx0XHRcdGlmIChvbGRYIDwgeCkge1xuXHRcdC8vIFx0XHRcdFx0b2xkWCsrO1xuXHRcdC8vIFx0XHRcdH0gZWxzZSBpZiAob2xkWCA+IHgpIHtcblx0XHQvLyBcdFx0XHRcdG9sZFgtLTtcblx0XHQvLyBcdFx0XHR9XG5cdFx0Ly8gXHRcdFx0aWYgKHkgPiBvbGRZKSB7XG5cdFx0Ly8gXHRcdFx0XHRvbGRZKys7XG5cdFx0Ly8gXHRcdFx0fSBlbHNlIGlmICh5IDwgb2xkWSkge1xuXHRcdC8vIFx0XHRcdFx0b2xkWS0tO1xuXHRcdC8vIFx0XHRcdH1cblx0XHQvLyBcdFx0XHRPYmplY3QudmFsdWVzKHRoaXMuX3BvcnRzLmdldFZhbHVlKCkpLmZvckVhY2gocG9ydCA9PiB7XG5cdFx0Ly8gXHRcdFx0XHRPYmplY3QudmFsdWVzKHBvcnQuZ2V0TGlua3MoKSkuZm9yRWFjaChsaW5rID0+IHtcblx0XHQvLyBcdFx0XHRcdFx0Y29uc3QgcG9pbnQgPSBsaW5rLmdldFBvaW50Rm9yUG9ydChwb3J0KTtcblx0XHQvLyBcdFx0XHRcdFx0Y29uc3QgeyB4OiBwb2ludFgsIHk6IHBvaW50WSB9ID0gcG9pbnQuZ2V0Q29vcmRzKCk7XG5cdFx0Ly8gXHRcdFx0XHRcdHBvaW50LnNldENvb3Jkcyh7IHg6IHBvaW50WCArIHggLSBvbGRYLCB5OiBwb2ludFkgKyB5IC0gb2xkWSB9KTtcblx0XHQvLyBcdFx0XHRcdH0pO1xuXHRcdC8vIFx0XHRcdH0pO1xuXHRcdC8vIFx0XHRcdHRoaXMuX2Nvb3Jkcy5uZXh0KHsgeDogb2xkWCwgeTogb2xkWSB9KTtcblx0XHQvLyBcdFx0XHRpZiAoeCA9PT0gb2xkWCAmJiB5ID09PSBvbGRZKSB7XG5cdFx0Ly8gXHRcdFx0XHR0cmFuc2l0aW9uQ29tcGxldGVkLm5leHQodHJ1ZSk7XG5cdFx0Ly8gXHRcdFx0XHR0cmFuc2l0aW9uQ29tcGxldGVkLmNvbXBsZXRlKCk7XG5cdFx0Ly8gXHRcdFx0fVxuXHRcdC8vIFx0XHR9LFxuXHRcdC8vIFx0XHRlcnIgPT4ge1xuXHRcdC8vIFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyKTtcblx0XHQvLyBcdFx0fSxcblx0XHQvLyBcdFx0KCkgPT4ge1xuXHRcdC8vIFx0XHRcdGNvbnNvbGUubG9nKCdmaW5pc2hlZCB0cmFuc2l0aW9uJyk7XG5cdFx0Ly8gXHRcdH1cblx0XHQvLyBcdCk7XG5cdH1cblxuXHQvLyBUT0RPOiBvdmVycmlkZSBzZWxlY3Rpb25DaGFuZ2VzIGFuZCByZXBsYWNlIHRoaXMgd2l0aCBpdCAoY29udmVydCB0byByeClcblx0Z2V0U2VsZWN0ZWRFbnRpdGllcygpIHtcblx0XHRsZXQgZW50aXRpZXMgPSBzdXBlci5nZXRTZWxlY3RlZEVudGl0aWVzKCk7XG5cblx0XHQvLyBhZGQgdGhlIHBvaW50cyBvZiBlYWNoIGxpbmsgdGhhdCBhcmUgc2VsZWN0ZWQgaGVyZVxuXHRcdGlmICh0aGlzLmdldFNlbGVjdGVkKCkpIHtcblx0XHRcdE9iamVjdC52YWx1ZXModGhpcy5fcG9ydHMuZ2V0VmFsdWUoKSkuZm9yRWFjaChwb3J0ID0+IHtcblx0XHRcdFx0Y29uc3QgbGlua3MgPSBPYmplY3QudmFsdWVzKHBvcnQuZ2V0TGlua3MoKSk7XG5cdFx0XHRcdGVudGl0aWVzID0gZW50aXRpZXMuY29uY2F0KFxuXHRcdFx0XHRcdGxpbmtzLm1hcChsaW5rID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBsaW5rLmdldFBvaW50Rm9yUG9ydChwb3J0KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2coJ3NlbGVjdGVkRW50aXRpZXMnLCBlbnRpdGllcyk7XG5cdFx0cmV0dXJuIGVudGl0aWVzO1xuXHR9XG5cblx0Ly8gVE9ETzogbWFwIHRvIEJhc2VFdmVudFxuXHRjb29yZHNDaGFuZ2VzKCk6IE9ic2VydmFibGU8Q29vcmRzPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29vcmRzJC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRW50aXR5RGVzdHJveSgpKSk7XG5cdH1cblxuXHRzZWxlY3RDb29yZHMoKTogT2JzZXJ2YWJsZTxDb29yZHM+IHtcblx0XHRyZXR1cm4gdGhpcy5jb29yZHMkLnBpcGUoXG5cdFx0XHR0YWtlVW50aWwodGhpcy5vbkVudGl0eURlc3Ryb3koKSksXG5cdFx0XHRkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG5cdFx0KTtcblx0fVxuXG5cdHNlbGVjdFgoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcblx0XHRyZXR1cm4gdGhpcy5zZWxlY3RDb29yZHMoKS5waXBlKFxuXHRcdFx0bWFwKGMgPT4gYy54KSxcblx0XHRcdHRoaXMud2l0aExvZygnc2VsZWN0WCcpLFxuXHRcdFx0ZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuXHRcdCk7XG5cdH1cblxuXHRzZWxlY3RZKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2VsZWN0Q29vcmRzKCkucGlwZShcblx0XHRcdG1hcChjID0+IGMueSksXG5cdFx0XHR0aGlzLndpdGhMb2coJ3NlbGVjdFknKSxcblx0XHRcdGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFzc2lnbiBhIHBvcnQgdG8gdGhlIG5vZGUgYW5kIHNldCB0aGUgbm9kZSBhcyBpdHMgZ2V0UGFyZW50XG5cdCAqIEByZXR1cm5zIHRoZSBpbnNlcnRlZCBwb3J0XG5cdCAqL1xuXHRhZGRQb3J0KHBvcnQ6IFApOiBQIHtcblx0XHRwb3J0LnNldFBhcmVudCh0aGlzKTtcblx0XHR0aGlzLl9wb3J0cy5uZXh0KHsgLi4udGhpcy5fcG9ydHMudmFsdWUsIFtwb3J0LmlkXTogcG9ydCB9KTtcblx0XHRyZXR1cm4gcG9ydDtcblx0fVxuXG5cdGdldFBvcnQoaWQ6IElEKTogUCB7XG5cdFx0cmV0dXJuIHRoaXMuX3BvcnRzLnZhbHVlW2lkXTtcblx0fVxuXG5cdHNlbGVjdFBvcnRzKHNlbGVjdG9yPzogKCkgPT4gYm9vbGVhbiB8IElEIHwgSURbXSk6IE9ic2VydmFibGU8UFtdPiB7XG5cdFx0Ly8gVE9ETzogaW1wbGVtZW50IHNlbGVjdG9yXG5cdFx0Ly8gVE9ETzogY3JlYXRlIGNvZXJjZSBmdW5jXG5cdFx0cmV0dXJuIHRoaXMucG9ydHMkLnBpcGUoXG5cdFx0XHR0YWtlVW50aWwodGhpcy5vbkVudGl0eURlc3Ryb3koKSksXG5cdFx0XHRkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuXHRcdFx0bWFwKHBvcnRzID0+IG1hcFRvQXJyYXkocG9ydHMpKSxcblx0XHRcdHRoaXMud2l0aExvZygnc2VsZWN0UG9ydHMnKVxuXHRcdCk7XG5cdH1cblxuXHRnZXRQb3J0cyhpZHM/OiBJRFtdKTogeyBbczogc3RyaW5nXTogUCB8IFBbXSB9IHtcblx0XHRyZXR1cm4gdGhpcy5fcG9ydHMuZ2V0VmFsdWUoKTtcblx0fVxuXG5cdHNldERpbWVuc2lvbnMoeyB3aWR0aCwgaGVpZ2h0IH06IERpbWVuc2lvbnMpIHtcblx0XHR0aGlzLl9kaW1lbnNpb25zLm5leHQoeyB3aWR0aCwgaGVpZ2h0IH0pO1xuXHR9XG5cblx0Z2V0RGltZW5zaW9ucygpOiBEaW1lbnNpb25zIHtcblx0XHRyZXR1cm4gdGhpcy5fZGltZW5zaW9ucy5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0Ly8gVE9ETzogcmV0dXJuIEJhc2VFdmVudCBleHRlbnNpb25cblx0ZGltZW5zaW9uQ2hhbmdlcygpOiBPYnNlcnZhYmxlPERpbWVuc2lvbnM+IHtcblx0XHRyZXR1cm4gdGhpcy5kaW1lbnNpb25zJC5waXBlKFxuXHRcdFx0dGFrZVVudGlsKHRoaXMub25FbnRpdHlEZXN0cm95KCkpLFxuXHRcdFx0ZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcblx0XHRcdHRoaXMud2l0aExvZygnRGltZW5zaW9uQ2hhbmdlcycpXG5cdFx0KTtcblx0fVxuXG5cdGdldEhlaWdodCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLl9kaW1lbnNpb25zLmdldFZhbHVlKCkuaGVpZ2h0O1xuXHR9XG5cblx0Z2V0V2lkdGgoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fZGltZW5zaW9ucy5nZXRWYWx1ZSgpLndpZHRoO1xuXHR9XG5cblx0c2VsZWN0V2lkdGgoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcblx0XHRyZXR1cm4gdGhpcy5kaW1lbnNpb25zJC5waXBlKFxuXHRcdFx0dGFrZVVudGlsKHRoaXMub25FbnRpdHlEZXN0cm95KCkpLFxuXHRcdFx0bWFwKGQgPT4gZC53aWR0aCksXG5cdFx0XHRkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuXHRcdFx0dGhpcy53aXRoTG9nKCdzZWxlY3RXaWR0aCcpXG5cdFx0KTtcblx0fVxuXG5cdHNlbGVjdEhlaWdodCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuXHRcdHJldHVybiB0aGlzLmRpbWVuc2lvbnMkLnBpcGUoXG5cdFx0XHR0YWtlVW50aWwodGhpcy5vbkVudGl0eURlc3Ryb3koKSksXG5cdFx0XHRtYXAoZCA9PiBkLndpZHRoKSxcblx0XHRcdGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG5cdFx0XHR0aGlzLndpdGhMb2coJ3NlbGVjdEhlaWdodCcpXG5cdFx0KTtcblx0fVxuXG5cdHNldEV4dHJhcyhleHRyYXM6IGFueSkge1xuXHRcdHRoaXMuX2V4dHJhcy5uZXh0KGV4dHJhcyk7XG5cdH1cblxuXHRnZXRFeHRyYXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2V4dHJhcy5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0c2VsZWN0RXh0cmFzPEUgPSBhbnk+KHNlbGVjdG9yPzogKGV4dHJhOiBFKSA9PiBFW2tleW9mIEVdIHwgc3RyaW5nIHwgc3RyaW5nW10pIHtcblx0XHQvLyBUT0RPOiBpbXBsIHNlbGVjdG9yXG5cdFx0cmV0dXJuIHRoaXMuZXh0cmFzJC5waXBlKFxuXHRcdFx0dGFrZVVudGlsKHRoaXMub25FbnRpdHlEZXN0cm95KCkpLFxuXHRcdFx0ZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuXHRcdCk7XG5cdH1cbn1cbiJdfQ==