ngx-diagrams
Version:
> Light Weight, Modular, Typed Diagram Engine for Angular
172 lines • 20.9 kB
JavaScript
import { createValueState } from '../state/state';
import { BaseModel } from './base.model';
import { PointModel } from './point.model';
export class LinkModel extends BaseModel {
constructor(linkType = 'default', id, logPrefix = '[Link]') {
super(linkType, id, logPrefix);
this.label$ = createValueState(null, this.entityPipe('label'));
this.points = [new PointModel(this, { x: 0, y: 0 }), new PointModel(this, { x: 0, y: 0 })];
this.extras = {};
this.sourcePort = null;
this.targetPort = null;
}
serialize() {
var _a;
const serializedPoints = this.points.map((point) => point.serialize());
const label = (_a = this.getLabel()) === null || _a === void 0 ? void 0 : _a.serialize();
return Object.assign(Object.assign({}, super.serialize()), { name: this.getName(), sourcePort: this.getSourcePort().id, targetPort: this.getTargetPort().id, extras: this.getExtras(), points: serializedPoints, label });
}
setName(name) {
this.name = name;
}
getName() {
return this.name;
}
getExtras() {
return this.extras;
}
setExtras(extras) {
this.extras = extras;
}
destroy() {
if (this.sourcePort) {
this.sourcePort.removeLink(this);
}
if (this.targetPort) {
this.targetPort.removeLink(this);
}
super.destroy();
}
doClone(lookupTable = {}, clone) {
clone.setPoints(this.getPoints().map((point) => {
return point.clone(lookupTable);
}));
if (this.sourcePort) {
clone.setSourcePort(this.sourcePort.clone(lookupTable));
}
if (this.targetPort) {
clone.setTargetPort(this.targetPort.clone(lookupTable));
}
}
isLastPoint(point) {
const index = this.getPointIndex(point);
return index === this.points.length - 1;
}
getPointIndex(point) {
return this.points.indexOf(point);
}
getPointModel(id) {
for (const point of this.points) {
if (point.id === id) {
return point;
}
}
return null;
}
getPortForPoint(point) {
if (this.sourcePort !== null && this.getFirstPoint().id === point.id) {
return this.sourcePort;
}
if (this.targetPort !== null && this.getLastPoint().id === point.id) {
return this.targetPort;
}
return null;
}
getPointForPort(port) {
if (this.sourcePort !== null && this.sourcePort.id === port.id) {
return this.getFirstPoint();
}
if (this.targetPort !== null && this.targetPort.id === port.id) {
return this.getLastPoint();
}
return null;
}
getFirstPoint() {
return this.points[0];
}
getLastPoint() {
return this.points[this.points.length - 1];
}
setSourcePort(port) {
if (port !== null) {
port.addLink(this);
}
if (this.sourcePort !== null) {
this.sourcePort.removeLink(this);
}
this.sourcePort = port;
}
getSourcePort() {
return this.sourcePort;
}
getTargetPort() {
return this.targetPort;
}
setTargetPort(port) {
if (port !== null) {
port.addLink(this);
}
if (this.targetPort !== null) {
this.targetPort.removeLink(this);
}
this.targetPort = port;
}
point({ x, y }) {
return this.addPoint(this.generatePoint({ x, y }));
}
getPoints() {
return this.points;
}
setPoints(points) {
points.forEach((point) => {
point.setParent(this);
});
this.points = points;
}
setLabel(label) {
label.setParent(this);
this.label$.set(label).emit();
}
selectLabel() {
return this.label$.value$;
}
getLabel() {
return this.label$.value;
}
resetLabel() {
const currentLabel = this.getLabel();
if (currentLabel) {
currentLabel.setParent(null);
currentLabel.setPainted(false);
}
this.setLabel(null);
}
removePoint(pointModel) {
this.points.splice(this.getPointIndex(pointModel), 1);
}
removePointsBefore(pointModel) {
this.points.splice(0, this.getPointIndex(pointModel));
}
removePointsAfter(pointModel) {
this.points.splice(this.getPointIndex(pointModel) + 1);
}
removeMiddlePoints() {
if (this.points.length > 2) {
this.points.splice(0, this.points.length - 2);
}
}
addPoint(pointModel, index = 1) {
pointModel.setParent(this);
pointModel.setLocked(this.getLocked());
this.points.splice(index, 0, pointModel);
return pointModel;
}
generatePoint({ x = 0, y = 0 }) {
return new PointModel(this, { x, y });
}
setLocked(locked = true) {
super.setLocked(locked);
this.points.forEach((point) => point.setLocked(locked));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9saWJzL25neC1kaWFncmFtcy9zcmMvIiwic291cmNlcyI6WyJsaWIvbW9kZWxzL2xpbmsubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE1BQU0sT0FBTyxTQUFVLFNBQVEsU0FBdUI7SUFZcEQsWUFBWSxRQUFRLEdBQUcsU0FBUyxFQUFFLEVBQVcsRUFBRSxTQUFTLEdBQUcsUUFBUTtRQUNqRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUh2QixXQUFNLEdBQUcsZ0JBQWdCLENBQWEsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUk5RSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVELFNBQVM7O1FBQ1AsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxD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QUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekMsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELGFBQWEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBVTtRQUNwQyxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUk7UUFDckIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvb3JkcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29vcmRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVkTGlua01vZGVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zZXJpYWxpemF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEaWFncmFtRW5naW5lIH0gZnJvbSAnLi4vc2VydmljZXMvZW5naW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgY3JlYXRlVmFsdWVTdGF0ZSB9IGZyb20gJy4uL3N0YXRlL3N0YXRlJztcbmltcG9ydCB7IElEIH0gZnJvbSAnLi4vdXRpbHMvdG9vbC1raXQudXRpbCc7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tICcuL2Jhc2UubW9kZWwnO1xuaW1wb3J0IHsgRGlhZ3JhbU1vZGVsIH0gZnJvbSAnLi9kaWFncmFtLm1vZGVsJztcbmltcG9ydCB7IExhYmVsTW9kZWwgfSBmcm9tICcuL2xhYmVsLm1vZGVsJztcbmltcG9ydCB7IFBvaW50TW9kZWwgfSBmcm9tICcuL3BvaW50Lm1vZGVsJztcbmltcG9ydCB7IFBvcnRNb2RlbCB9IGZyb20gJy4vcG9ydC5tb2RlbCc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rTW9kZWwgZXh0ZW5kcyBCYXNlTW9kZWw8RGlhZ3JhbU1vZGVsPiB7XG4gIGRpYWdyYW1FbmdpbmU6IERpYWdyYW1FbmdpbmU7XG5cbiAgLy8gVE9ETzogZGVjaWRlIHdoYXQgc2hvdWxkIGJlIHJlYWN0aXZlIHVzaW5nIFJYSlNcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHNvdXJjZVBvcnQ6IFBvcnRNb2RlbCB8IG51bGw7XG4gIHByb3RlY3RlZCB0YXJnZXRQb3J0OiBQb3J0TW9kZWwgfCBudWxsO1xuICBwcm90ZWN0ZWQgcG9pbnRzOiBQb2ludE1vZGVsW107XG4gIHByb3RlY3RlZCBleHRyYXM6IGFueTtcblxuICBwcm90ZWN0ZWQgbGFiZWwkID0gY3JlYXRlVmFsdWVTdGF0ZTxMYWJlbE1vZGVsPihudWxsLCB0aGlzLmVudGl0eVBpcGUoJ2xhYmVsJykpO1xuXG4gIGNvbnN0cnVjdG9yKGxpbmtUeXBlID0gJ2RlZmF1bHQnLCBpZD86IHN0cmluZywgbG9nUHJlZml4ID0gJ1tMaW5rXScpIHtcbiAgICBzdXBlcihsaW5rVHlwZSwgaWQsIGxvZ1ByZWZpeCk7XG4gICAgdGhpcy5wb2ludHMgPSBbbmV3IFBvaW50TW9kZWwodGhpcywgeyB4OiAwLCB5OiAwIH0pLCBuZXcgUG9pbnRNb2RlbCh0aGlzLCB7IHg6IDAsIHk6IDAgfSldO1xuICAgIHRoaXMuZXh0cmFzID0ge307XG4gICAgdGhpcy5zb3VyY2VQb3J0ID0gbnVsbDtcbiAgICB0aGlzLnRhcmdldFBvcnQgPSBudWxsO1xuICB9XG5cbiAgc2VyaWFsaXplKCk6IFNlcmlhbGl6ZWRMaW5rTW9kZWwge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRQb2ludHMgPSB0aGlzLnBvaW50cy5tYXAoKHBvaW50KSA9PiBwb2ludC5zZXJpYWxpemUoKSk7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldExhYmVsKCk/LnNlcmlhbGl6ZSgpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5zZXJpYWxpemUoKSxcbiAgICAgIG5hbWU6IHRoaXMuZ2V0TmFtZSgpLFxuICAgICAgc291cmNlUG9ydDogdGhpcy5nZXRTb3VyY2VQb3J0KCkuaWQsXG4gICAgICB0YXJnZXRQb3J0OiB0aGlzLmdldFRhcmdldFBvcnQoKS5pZCxcbiAgICAgIGV4dHJhczogdGhpcy5nZXRFeHRyYXMoKSxcbiAgICAgIHBvaW50czogc2VyaWFsaXplZFBvaW50cyxcbiAgICAgIGxhYmVsXG4gICAgfTtcbiAgfVxuXG4gIHNldE5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgZ2V0RXh0cmFzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0cmFzO1xuICB9XG5cbiAgc2V0RXh0cmFzKGV4dHJhczogYW55KSB7XG4gICAgdGhpcy5leHRyYXMgPSBleHRyYXM7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnNvdXJjZVBvcnQpIHtcbiAgICAgIHRoaXMuc291cmNlUG9ydC5yZW1vdmVMaW5rKHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldFBvcnQpIHtcbiAgICAgIHRoaXMudGFyZ2V0UG9ydC5yZW1vdmVMaW5rKHRoaXMpO1xuICAgIH1cblxuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGRvQ2xvbmUobG9va3VwVGFibGUgPSB7fSwgY2xvbmUpIHtcbiAgICBjbG9uZS5zZXRQb2ludHMoXG4gICAgICB0aGlzLmdldFBvaW50cygpLm1hcCgocG9pbnQ6IFBvaW50TW9kZWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHBvaW50LmNsb25lKGxvb2t1cFRhYmxlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAodGhpcy5zb3VyY2VQb3J0KSB7XG4gICAgICBjbG9uZS5zZXRTb3VyY2VQb3J0KHRoaXMuc291cmNlUG9ydC5jbG9uZShsb29rdXBUYWJsZSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YXJnZXRQb3J0KSB7XG4gICAgICBjbG9uZS5zZXRUYXJnZXRQb3J0KHRoaXMudGFyZ2V0UG9ydC5jbG9uZShsb29rdXBUYWJsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlzTGFzdFBvaW50KHBvaW50OiBQb2ludE1vZGVsKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmdldFBvaW50SW5kZXgocG9pbnQpO1xuICAgIHJldHVybiBpbmRleCA9PT0gdGhpcy5wb2ludHMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIGdldFBvaW50SW5kZXgocG9pbnQ6IFBvaW50TW9kZWwpIHtcbiAgICByZXR1cm4gdGhpcy5wb2ludHMuaW5kZXhPZihwb2ludCk7XG4gIH1cblxuICBnZXRQb2ludE1vZGVsKGlkOiBJRCk6IFBvaW50TW9kZWwgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHRoaXMucG9pbnRzKSB7XG4gICAgICBpZiAocG9pbnQuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiBwb2ludDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRQb3J0Rm9yUG9pbnQocG9pbnQ6IFBvaW50TW9kZWwpOiBQb3J0TW9kZWwge1xuICAgIGlmICh0aGlzLnNvdXJjZVBvcnQgIT09IG51bGwgJiYgdGhpcy5nZXRGaXJzdFBvaW50KCkuaWQgPT09IHBvaW50LmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2VQb3J0O1xuICAgIH1cbiAgICBpZiAodGhpcy50YXJnZXRQb3J0ICE9PSBudWxsICYmIHRoaXMuZ2V0TGFzdFBvaW50KCkuaWQgPT09IHBvaW50LmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy50YXJnZXRQb3J0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldFBvaW50Rm9yUG9ydChwb3J0OiBQb3J0TW9kZWwpOiBQb2ludE1vZGVsIHtcbiAgICBpZiAodGhpcy5zb3VyY2VQb3J0ICE9PSBudWxsICYmIHRoaXMuc291cmNlUG9ydC5pZCA9PT0gcG9ydC5pZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rmlyc3RQb2ludCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldFBvcnQgIT09IG51bGwgJiYgdGhpcy50YXJnZXRQb3J0LmlkID09PSBwb3J0LmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMYXN0UG9pbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldEZpcnN0UG9pbnQoKTogUG9pbnRNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucG9pbnRzWzBdO1xuICB9XG5cbiAgZ2V0TGFzdFBvaW50KCk6IFBvaW50TW9kZWwge1xuICAgIHJldHVybiB0aGlzLnBvaW50c1t0aGlzLnBvaW50cy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHNldFNvdXJjZVBvcnQocG9ydDogUG9ydE1vZGVsKSB7XG4gICAgaWYgKHBvcnQgIT09IG51bGwpIHtcbiAgICAgIHBvcnQuYWRkTGluayh0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc291cmNlUG9ydCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zb3VyY2VQb3J0LnJlbW92ZUxpbmsodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuc291cmNlUG9ydCA9IHBvcnQ7XG4gIH1cblxuICBnZXRTb3VyY2VQb3J0KCk6IFBvcnRNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlUG9ydDtcbiAgfVxuXG4gIGdldFRhcmdldFBvcnQoKTogUG9ydE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXRQb3J0O1xuICB9XG5cbiAgc2V0VGFyZ2V0UG9ydChwb3J0OiBQb3J0TW9kZWwpIHtcbiAgICBpZiAocG9ydCAhPT0gbnVsbCkge1xuICAgICAgcG9ydC5hZGRMaW5rKHRoaXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YXJnZXRQb3J0ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnRhcmdldFBvcnQucmVtb3ZlTGluayh0aGlzKTtcbiAgICB9XG4gICAgdGhpcy50YXJnZXRQb3J0ID0gcG9ydDtcbiAgfVxuXG4gIHBvaW50KHsgeCwgeSB9OiBDb29yZHMpOiBQb2ludE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5hZGRQb2ludCh0aGlzLmdlbmVyYXRlUG9pbnQoeyB4LCB5IH0pKTtcbiAgfVxuXG4gIGdldFBvaW50cygpOiBQb2ludE1vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLnBvaW50cztcbiAgfVxuXG4gIHNldFBvaW50cyhwb2ludHM6IFBvaW50TW9kZWxbXSkge1xuICAgIHBvaW50cy5mb3JFYWNoKChwb2ludCkgPT4ge1xuICAgICAgcG9pbnQuc2V0UGFyZW50KHRoaXMpO1xuICAgIH0pO1xuICAgIHRoaXMucG9pbnRzID0gcG9pbnRzO1xuICB9XG5cbiAgc2V0TGFiZWwobGFiZWw6IExhYmVsTW9kZWwpIHtcbiAgICBsYWJlbC5zZXRQYXJlbnQodGhpcyk7XG4gICAgdGhpcy5sYWJlbCQuc2V0KGxhYmVsKS5lbWl0KCk7XG4gIH1cblxuICBzZWxlY3RMYWJlbCgpOiBPYnNlcnZhYmxlPExhYmVsTW9kZWwgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMubGFiZWwkLnZhbHVlJDtcbiAgfVxuXG4gIGdldExhYmVsKCk6IExhYmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmxhYmVsJC52YWx1ZTtcbiAgfVxuXG4gIHJlc2V0TGFiZWwoKSB7XG4gICAgY29uc3QgY3VycmVudExhYmVsID0gdGhpcy5nZXRMYWJlbCgpO1xuXG4gICAgaWYgKGN1cnJlbnRMYWJlbCkge1xuICAgICAgY3VycmVudExhYmVsLnNldFBhcmVudChudWxsKTtcbiAgICAgIGN1cnJlbnRMYWJlbC5zZXRQYWludGVkKGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldExhYmVsKG51bGwpO1xuICB9XG5cbiAgcmVtb3ZlUG9pbnQocG9pbnRNb2RlbDogUG9pbnRNb2RlbCkge1xuICAgIHRoaXMucG9pbnRzLnNwbGljZSh0aGlzLmdldFBvaW50SW5kZXgocG9pbnRNb2RlbCksIDEpO1xuICB9XG5cbiAgcmVtb3ZlUG9pbnRzQmVmb3JlKHBvaW50TW9kZWw6IFBvaW50TW9kZWwpIHtcbiAgICB0aGlzLnBvaW50cy5zcGxpY2UoMCwgdGhpcy5nZXRQb2ludEluZGV4KHBvaW50TW9kZWwpKTtcbiAgfVxuXG4gIHJlbW92ZVBvaW50c0FmdGVyKHBvaW50TW9kZWw6IFBvaW50TW9kZWwpIHtcbiAgICB0aGlzLnBvaW50cy5zcGxpY2UodGhpcy5nZXRQb2ludEluZGV4KHBvaW50TW9kZWwpICsgMSk7XG4gIH1cblxuICByZW1vdmVNaWRkbGVQb2ludHMoKSB7XG4gICAgaWYgKHRoaXMucG9pbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRoaXMucG9pbnRzLnNwbGljZSgwLCB0aGlzLnBvaW50cy5sZW5ndGggLSAyKTtcbiAgICB9XG4gIH1cblxuICBhZGRQb2ludDxQIGV4dGVuZHMgUG9pbnRNb2RlbD4ocG9pbnRNb2RlbDogUCwgaW5kZXggPSAxKTogUCB7XG4gICAgcG9pbnRNb2RlbC5zZXRQYXJlbnQodGhpcyk7XG4gICAgcG9pbnRNb2RlbC5zZXRMb2NrZWQodGhpcy5nZXRMb2NrZWQoKSk7XG4gICAgdGhpcy5wb2ludHMuc3BsaWNlKGluZGV4LCAwLCBwb2ludE1vZGVsKTtcbiAgICByZXR1cm4gcG9pbnRNb2RlbDtcbiAgfVxuXG4gIGdlbmVyYXRlUG9pbnQoeyB4ID0gMCwgeSA9IDAgfTogQ29vcmRzKTogUG9pbnRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBQb2ludE1vZGVsKHRoaXMsIHsgeCwgeSB9KTtcbiAgfVxuXG4gIHNldExvY2tlZChsb2NrZWQgPSB0cnVlKSB7XG4gICAgc3VwZXIuc2V0TG9ja2VkKGxvY2tlZCk7XG4gICAgdGhpcy5wb2ludHMuZm9yRWFjaCgocG9pbnQpID0+IHBvaW50LnNldExvY2tlZChsb2NrZWQpKTtcbiAgfVxufVxuIl19