UNPKG

ngx-diagrams

Version:

> Light Weight, Modular, Typed Diagram Engine for Angular

141 lines 19.6 kB
import { createEntityState, createValueState } from '../state/state'; import { BaseModel } from './base.model'; export class NodeModel extends BaseModel { constructor(nodeType = 'default', id, extras = {}, x = 0, y = 0, width = 0, height = 0, logPrefix = '[Node]') { super(nodeType, id, logPrefix); this.diagramEngine$ = createValueState(null, this.entityPipe('diagramEngine')); this.extras$ = createValueState({}, this.entityPipe('extras')); this.ports$ = createEntityState([], this.entityPipe('ports')); this.coords$ = createValueState({ x: 0, y: 0 }, this.entityPipe('coords')); this.dimensions$ = createValueState({ width: 0, height: 0 }, this.entityPipe('dimensions')); this.setExtras(extras); this.setDimensions({ width, height }); this.setCoords({ x, y }); } getDiagramEngine() { return this.diagramEngine$.value; } selectDiagramEngine() { return this.diagramEngine$.value$; } setDiagramEngine(diagramEngine) { this.diagramEngine$.set(diagramEngine).emit(); } getCoords() { return this.coords$.value; } setCoords({ x, y }) { const { x: oldX, y: oldY } = this.getCoords(); this.getPorts().forEach((port) => { 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$.set({ x, y }).emit(); } serialize() { const serializedPorts = this.getPortsArray().map((port) => port.serialize()); return Object.assign(Object.assign(Object.assign(Object.assign({}, super.serialize()), { nodeType: this.getType(), extras: this.getExtras(), width: this.getWidth(), height: this.getHeight() }), this.getCoords()), { ports: serializedPorts }); } // TODO: override selectionChanges and replace this with it (convert to rx) getSelectedEntities() { let entities = super.getSelectedEntities(); // add the points of each link that are selected here if (this.getSelected()) { this.getPorts().forEach((port) => { const points = port.getLinksArray().map((link) => link.getPointForPort(port)); entities = entities.concat(points); }); } this.log('selectedEntities', entities); return entities; } // TODO: map to BaseEvent coordsChanges() { return this.coords$.value$; } selectCoords() { return this.coords$.value$; } selectX() { return this.coords$.select((coords) => coords.x); } selectY() { return this.coords$.select((coords) => coords.y); } /** * Assign a port to the node and set the node as its getParent * @returns the inserted port */ addPort(port) { port.setParent(this); this.ports$.add(port).emit(); return port; } removePort(portOrId) { const portId = typeof portOrId === 'string' ? portOrId : portOrId.id; this.ports$.remove(portId).emit(); return portId; } getPort(id) { return this.ports$.get(id); } selectPorts(selector) { // TODO: implement selector // TODO: create coerce func return this.ports$.array$().pipe(this.withLog('selectPorts')); } getPorts() { return this.ports$.value; } getPortsArray() { return this.ports$.array(); } setDimensions(dimensions) { this.dimensions$.set(Object.assign(Object.assign({}, this.getDimensions()), dimensions)).emit(); } getDimensions() { return this.dimensions$.value; } // TODO: return BaseEvent extension dimensionChanges() { return this.dimensions$.select(); } getHeight() { return this.getDimensions().height; } setHeight(height) { return this.setDimensions({ height }); } getWidth() { return this.getDimensions().width; } setWidth(width) { return this.setDimensions({ width }); } selectWidth() { return this.dimensions$.select((d) => d.width).pipe(this.withLog('selectWidth')); } selectHeight() { return this.dimensions$.select((d) => d.height).pipe(this.withLog('selectHeight')); } setExtras(extras) { this.extras$.set(extras).emit(); } getExtras() { return this.extras$.value; } selectExtras(selector) { return this.extras$.select(selector); } destroy() { super.destroy(); this.removeAllPorts(); } removeAllPorts() { this.ports$.clear().emit(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9saWJzL25neC1kaWFncmFtcy9zcmMvIiwic291cmNlcyI6WyJsaWIvbW9kZWxzL25vZGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUl6QyxNQUFNLE9BQU8sU0FBMkMsU0FBUSxTQUF1QjtJQU9yRixZQUNFLFFBQVEsR0FBRyxTQUFTLEVBQ3BCLEVBQVcsRUFDWCxTQUF1QixFQUFFLEVBQ3pCLENBQUMsR0FBRyxDQUFDLEVBQ0wsQ0FBQyxHQUFHLENBQUMsRUFDTCxLQUFLLEdBQUcsQ0FBQyxFQUNULE1BQU0sR0FBRyxDQUFDLEVBQ1YsU0FBUyxHQUFHLFFBQVE7UUFFcEIsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFoQnZCLG1CQUFjLEdBQUcsZ0JBQWdCLENBQWdCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDekYsWUFBTyxHQUFHLGdCQUFnQixDQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDL0QsV0FBTSxHQUFHLGlCQUFpQixDQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUQsWUFBTyxHQUFHLGdCQUFnQixDQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzlFLGdCQUFXLEdBQUcsZ0JBQWdCLENBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFB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QUFDLEtBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFXO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQsWUFBWSxDQUFVLFFBQXVEO1FBQzNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb29yZHMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nvb3Jkcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGltZW5zaW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2VyaWFsaXplZE5vZGVNb2RlbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VyaWFsaXphdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGlhZ3JhbUVuZ2luZSB9IGZyb20gJy4uL3NlcnZpY2VzL2VuZ2luZS5zZXJ2aWNlJztcbmltcG9ydCB7IGNyZWF0ZUVudGl0eVN0YXRlLCBjcmVhdGVWYWx1ZVN0YXRlIH0gZnJvbSAnLi4vc3RhdGUvc3RhdGUnO1xuaW1wb3J0IHsgSUQgfSBmcm9tICcuLi91dGlscy90b29sLWtpdC51dGlsJztcbmltcG9ydCB7IEVudGl0eU1hcCwgSGFzaE1hcCB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gJy4vYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBEaWFncmFtTW9kZWwgfSBmcm9tICcuL2RpYWdyYW0ubW9kZWwnO1xuaW1wb3J0IHsgUG9ydE1vZGVsIH0gZnJvbSAnLi9wb3J0Lm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIE5vZGVNb2RlbDxQIGV4dGVuZHMgUG9ydE1vZGVsID0gUG9ydE1vZGVsPiBleHRlbmRzIEJhc2VNb2RlbDxEaWFncmFtTW9kZWw+IHtcbiAgcHJvdGVjdGVkIGRpYWdyYW1FbmdpbmUkID0gY3JlYXRlVmFsdWVTdGF0ZTxEaWFncmFtRW5naW5lPihudWxsLCB0aGlzLmVudGl0eVBpcGUoJ2RpYWdyYW1FbmdpbmUnKSk7XG4gIHByb3RlY3RlZCBleHRyYXMkID0gY3JlYXRlVmFsdWVTdGF0ZTxhbnk+KHt9LCB0aGlzLmVudGl0eVBpcGUoJ2V4dHJhcycpKTtcbiAgcHJvdGVjdGVkIHBvcnRzJCA9IGNyZWF0ZUVudGl0eVN0YXRlPFA+KFtdLCB0aGlzLmVudGl0eVBpcGUoJ3BvcnRzJykpO1xuICBwcm90ZWN0ZWQgY29vcmRzJCA9IGNyZWF0ZVZhbHVlU3RhdGU8Q29vcmRzPih7IHg6IDAsIHk6IDAgfSwgdGhpcy5lbnRpdHlQaXBlKCdjb29yZHMnKSk7XG4gIHByb3RlY3RlZCBkaW1lbnNpb25zJCA9IGNyZWF0ZVZhbHVlU3RhdGU8RGltZW5zaW9ucz4oeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sIHRoaXMuZW50aXR5UGlwZSgnZGltZW5zaW9ucycpKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBub2RlVHlwZSA9ICdkZWZhdWx0JyxcbiAgICBpZD86IHN0cmluZyxcbiAgICBleHRyYXM6IEhhc2hNYXA8YW55PiA9IHt9LFxuICAgIHggPSAwLFxuICAgIHkgPSAwLFxuICAgIHdpZHRoID0gMCxcbiAgICBoZWlnaHQgPSAwLFxuICAgIGxvZ1ByZWZpeCA9ICdbTm9kZV0nXG4gICkge1xuICAgIHN1cGVyKG5vZGVUeXBlLCBpZCwgbG9nUHJlZml4KTtcbiAgICB0aGlzLnNldEV4dHJhcyhleHRyYXMpO1xuICAgIHRoaXMuc2V0RGltZW5zaW9ucyh7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgdGhpcy5zZXRDb29yZHMoeyB4LCB5IH0pO1xuICB9XG5cbiAgZ2V0RGlhZ3JhbUVuZ2luZSgpOiBEaWFncmFtRW5naW5lIHtcbiAgICByZXR1cm4gdGhpcy5kaWFncmFtRW5naW5lJC52YWx1ZTtcbiAgfVxuXG4gIHNlbGVjdERpYWdyYW1FbmdpbmUoKTogT2JzZXJ2YWJsZTxEaWFncmFtRW5naW5lPiB7XG4gICAgcmV0dXJuIHRoaXMuZGlhZ3JhbUVuZ2luZSQudmFsdWUkO1xuICB9XG5cbiAgc2V0RGlhZ3JhbUVuZ2luZShkaWFncmFtRW5naW5lOiBEaWFncmFtRW5naW5lKSB7XG4gICAgdGhpcy5kaWFncmFtRW5naW5lJC5zZXQoZGlhZ3JhbUVuZ2luZSkuZW1pdCgpO1xuICB9XG5cbiAgZ2V0Q29vcmRzKCk6IENvb3JkcyB7XG4gICAgcmV0dXJuIHRoaXMuY29vcmRzJC52YWx1ZTtcbiAgfVxuXG4gIHNldENvb3Jkcyh7IHgsIHkgfTogQ29vcmRzKSB7XG4gICAgY29uc3QgeyB4OiBvbGRYLCB5OiBvbGRZIH0gPSB0aGlzLmdldENvb3JkcygpO1xuXG4gICAgdGhpcy5nZXRQb3J0cygpLmZvckVhY2goKHBvcnQpID0+IHtcbiAgICAgIHBvcnQuZ2V0TGlua3MoKS5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gbGluay5nZXRQb2ludEZvclBvcnQocG9ydCk7XG4gICAgICAgIGNvbnN0IHsgeDogcG9pbnRYLCB5OiBwb2ludFkgfSA9IHBvaW50LmdldENvb3JkcygpO1xuICAgICAgICBwb2ludC5zZXRDb29yZHMoeyB4OiBwb2ludFggKyB4IC0gb2xkWCwgeTogcG9pbnRZICsgeSAtIG9sZFkgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29vcmRzJC5zZXQoeyB4LCB5IH0pLmVtaXQoKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkTm9kZU1vZGVsIHtcbiAgICBjb25zdCBzZXJpYWxpemVkUG9ydHMgPSB0aGlzLmdldFBvcnRzQXJyYXkoKS5tYXAoKHBvcnQ6IFApID0+IHBvcnQuc2VyaWFsaXplKCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnNlcmlhbGl6ZSgpLFxuICAgICAgbm9kZVR5cGU6IHRoaXMuZ2V0VHlwZSgpLFxuICAgICAgZXh0cmFzOiB0aGlzLmdldEV4dHJhcygpLFxuICAgICAgd2lkdGg6IHRoaXMuZ2V0V2lkdGgoKSxcbiAgICAgIGhlaWdodDogdGhpcy5nZXRIZWlnaHQoKSxcbiAgICAgIC4uLnRoaXMuZ2V0Q29vcmRzKCksXG4gICAgICBwb3J0czogc2VyaWFsaXplZFBvcnRzXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRPRE86IG92ZXJyaWRlIHNlbGVjdGlvbkNoYW5nZXMgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIGl0IChjb252ZXJ0IHRvIHJ4KVxuICBnZXRTZWxlY3RlZEVudGl0aWVzKCkge1xuICAgIGxldCBlbnRpdGllcyA9IHN1cGVyLmdldFNlbGVjdGVkRW50aXRpZXMoKTtcblxuICAgIC8vIGFkZCB0aGUgcG9pbnRzIG9mIGVhY2ggbGluayB0aGF0IGFyZSBzZWxlY3RlZCBoZXJlXG4gICAgaWYgKHRoaXMuZ2V0U2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5nZXRQb3J0cygpLmZvckVhY2goKHBvcnQpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gcG9ydC5nZXRMaW5rc0FycmF5KCkubWFwKChsaW5rKSA9PiBsaW5rLmdldFBvaW50Rm9yUG9ydChwb3J0KSk7XG4gICAgICAgIGVudGl0aWVzID0gZW50aXRpZXMuY29uY2F0KHBvaW50cyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZygnc2VsZWN0ZWRFbnRpdGllcycsIGVudGl0aWVzKTtcbiAgICByZXR1cm4gZW50aXRpZXM7XG4gIH1cblxuICAvLyBUT0RPOiBtYXAgdG8gQmFzZUV2ZW50XG4gIGNvb3Jkc0NoYW5nZXMoKTogT2JzZXJ2YWJsZTxDb29yZHM+IHtcbiAgICByZXR1cm4gdGhpcy5jb29yZHMkLnZhbHVlJDtcbiAgfVxuXG4gIHNlbGVjdENvb3JkcygpOiBPYnNlcnZhYmxlPENvb3Jkcz4ge1xuICAgIHJldHVybiB0aGlzLmNvb3JkcyQudmFsdWUkO1xuICB9XG5cbiAgc2VsZWN0WCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmNvb3JkcyQuc2VsZWN0KChjb29yZHMpID0+IGNvb3Jkcy54KTtcbiAgfVxuXG4gIHNlbGVjdFkoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5jb29yZHMkLnNlbGVjdCgoY29vcmRzKSA9PiBjb29yZHMueSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzaWduIGEgcG9ydCB0byB0aGUgbm9kZSBhbmQgc2V0IHRoZSBub2RlIGFzIGl0cyBnZXRQYXJlbnRcbiAgICogQHJldHVybnMgdGhlIGluc2VydGVkIHBvcnRcbiAgICovXG4gIGFkZFBvcnQocG9ydDogUCk6IFAge1xuICAgIHBvcnQuc2V0UGFyZW50KHRoaXMpO1xuICAgIHRoaXMucG9ydHMkLmFkZChwb3J0KS5lbWl0KCk7XG4gICAgcmV0dXJuIHBvcnQ7XG4gIH1cblxuICByZW1vdmVQb3J0KHBvcnRPcklkOiBJRCB8IFApOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnRJZCA9IHR5cGVvZiBwb3J0T3JJZCA9PT0gJ3N0cmluZycgPyBwb3J0T3JJZCA6IHBvcnRPcklkLmlkO1xuICAgIHRoaXMucG9ydHMkLnJlbW92ZShwb3J0SWQpLmVtaXQoKTtcbiAgICByZXR1cm4gcG9ydElkO1xuICB9XG5cbiAgZ2V0UG9ydChpZDogSUQpOiBQIHtcbiAgICByZXR1cm4gdGhpcy5wb3J0cyQuZ2V0KGlkKTtcbiAgfVxuXG4gIHNlbGVjdFBvcnRzKHNlbGVjdG9yPzogKCkgPT4gYm9vbGVhbiB8IElEIHwgSURbXSk6IE9ic2VydmFibGU8UFtdPiB7XG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHNlbGVjdG9yXG4gICAgLy8gVE9ETzogY3JlYXRlIGNvZXJjZSBmdW5jXG4gICAgcmV0dXJuIHRoaXMucG9ydHMkLmFycmF5JCgpLnBpcGUodGhpcy53aXRoTG9nKCdzZWxlY3RQb3J0cycpKTtcbiAgfVxuXG4gIGdldFBvcnRzKCk6IEVudGl0eU1hcDxQPiB7XG4gICAgcmV0dXJuIHRoaXMucG9ydHMkLnZhbHVlO1xuICB9XG5cbiAgZ2V0UG9ydHNBcnJheSgpOiBQW10ge1xuICAgIHJldHVybiB0aGlzLnBvcnRzJC5hcnJheSgpO1xuICB9XG5cbiAgc2V0RGltZW5zaW9ucyhkaW1lbnNpb25zOiBQYXJ0aWFsPERpbWVuc2lvbnM+KSB7XG4gICAgdGhpcy5kaW1lbnNpb25zJC5zZXQoeyAuLi50aGlzLmdldERpbWVuc2lvbnMoKSwgLi4uZGltZW5zaW9ucyB9KS5lbWl0KCk7XG4gIH1cblxuICBnZXREaW1lbnNpb25zKCk6IERpbWVuc2lvbnMge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbnMkLnZhbHVlO1xuICB9XG5cbiAgLy8gVE9ETzogcmV0dXJuIEJhc2VFdmVudCBleHRlbnNpb25cbiAgZGltZW5zaW9uQ2hhbmdlcygpOiBPYnNlcnZhYmxlPERpbWVuc2lvbnM+IHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25zJC5zZWxlY3QoKTtcbiAgfVxuXG4gIGdldEhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldERpbWVuc2lvbnMoKS5oZWlnaHQ7XG4gIH1cblxuICBzZXRIZWlnaHQoaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5zZXREaW1lbnNpb25zKHsgaGVpZ2h0IH0pO1xuICB9XG5cbiAgZ2V0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCkud2lkdGg7XG4gIH1cblxuICBzZXRXaWR0aCh3aWR0aDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0RGltZW5zaW9ucyh7IHdpZHRoIH0pO1xuICB9XG5cbiAgc2VsZWN0V2lkdGgoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25zJC5zZWxlY3QoKGQpID0+IGQud2lkdGgpLnBpcGUodGhpcy53aXRoTG9nKCdzZWxlY3RXaWR0aCcpKTtcbiAgfVxuXG4gIHNlbGVjdEhlaWdodCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbnMkLnNlbGVjdCgoZCkgPT4gZC5oZWlnaHQpLnBpcGUodGhpcy53aXRoTG9nKCdzZWxlY3RIZWlnaHQnKSk7XG4gIH1cblxuICBzZXRFeHRyYXMoZXh0cmFzOiBhbnkpIHtcbiAgICB0aGlzLmV4dHJhcyQuc2V0KGV4dHJhcykuZW1pdCgpO1xuICB9XG5cbiAgZ2V0RXh0cmFzKCkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhcyQudmFsdWU7XG4gIH1cblxuICBzZWxlY3RFeHRyYXM8RSA9IGFueT4oc2VsZWN0b3I/OiAoZXh0cmE6IEUpID0+IEVba2V5b2YgRV0gfCBzdHJpbmcgfCBzdHJpbmdbXSk6IE9ic2VydmFibGU8RT4ge1xuICAgIHJldHVybiB0aGlzLmV4dHJhcyQuc2VsZWN0KHNlbGVjdG9yKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMucmVtb3ZlQWxsUG9ydHMoKTtcbiAgfVxuXG4gIHJlbW92ZUFsbFBvcnRzKCk6IHZvaWQge1xuICAgIHRoaXMucG9ydHMkLmNsZWFyKCkuZW1pdCgpO1xuICB9XG59XG4iXX0=