@alauda-fe/common
Version:
Alauda frontend team common codes.
145 lines • 20.5 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core';
import { add, subtract } from 'lodash-es';
import { Subject, takeUntil } from 'rxjs';
import { isEqual } from '../../core/public-api';
import { GraphStoreService } from '../graph-store.service';
import * as i0 from "@angular/core";
import * as i1 from "../graph-store.service";
import * as i2 from "@angular/common";
const _c0 = ["aclGraphLink", ""];
function GraphLinkComponent_ng_container_0_ng_container_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵnamespaceSVG();
i0.ɵɵelement(1, "circle", 2)(2, "polygon", 3);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext(2);
i0.ɵɵadvance();
i0.ɵɵstyleProp("fill", ctx_r0.color);
i0.ɵɵattribute("cx", ctx_r0.points[0][0])("cy", ctx_r0.points[0][1]);
i0.ɵɵadvance();
i0.ɵɵstyleProp("transform", ctx_r0.arrowTransform)("fill", ctx_r0.color);
} }
function GraphLinkComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵnamespaceSVG();
i0.ɵɵelement(1, "path", 1);
i0.ɵɵtemplate(2, GraphLinkComponent_ng_container_0_ng_container_2_Template, 3, 8, "ng-container", 0);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance();
i0.ɵɵstyleProp("stroke", ctx_r0.color);
i0.ɵɵattribute("d", ctx_r0.path(ctx_r0.points));
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", ctx_r0.arrow);
} }
export class GraphLinkComponent {
get arrowTransform() {
const [[x1, y1], [x2, y2]] = this.points;
const deg = this.direction === 'v' && y1 < y2
? -90
: this.direction === 'v'
? 90
: this.direction === 'h' && x1 < x2
? 180
: 0;
return `translate(${x2}px, ${y2}px) rotate(${deg}deg)`;
}
constructor(store, cdr) {
this.store = store;
this.cdr = cdr;
this.direction = 'v';
this.radius = 12;
this.arrow = true;
this.path = ([[x1, y1], [x2, y2]]) => {
const mX = x1 + (x2 - x1) / 2;
const mY = y1 + (y2 - y1) / 2;
const r = Math.min(Math.abs(x1 - x2) / 2, Math.abs(y1 - y2) / 2, this.radius);
return this.direction === 'h'
? `M ${x1} ${y1}
L ${addOrMinus(x1 > x2, mX, r)} ${y1}
Q ${mX} ${y1} ${mX} ${addOrMinus(y1 < y2, y1, r)}
L ${mX} ${addOrMinus(y1 > y2, y2, r)}
Q ${mX} ${y2} ${addOrMinus(x1 < x2, mX, r)} ${y2}
L ${this.arrow ? addOrMinus(x1 > x2, x2, 8) : x2} ${y2}`
: `M ${x1} ${y1}
L ${x1} ${addOrMinus(y1 > y2, mY, r)}
Q ${x1} ${mY} ${addOrMinus(x1 < x2, x1, r)} ${mY}
L ${addOrMinus(x1 > x2, x2, r)} ${mY}
Q ${x2} ${mY} ${x2} ${addOrMinus(y1 < y2, mY, r)}
L ${x2} ${this.arrow ? addOrMinus(y1 > y2, y2, 8) : y2}`;
};
this.parallelDirection = (a, b, al, bl) => a + al < b ? [a + al, b] : [a, b + bl];
this.verticalDirection = (a, b, al, bl) => [
a + al / 2,
b + bl / 2,
];
this.onDestroy$$ = new Subject();
this.store
.nodeChanged()
.pipe(takeUntil(this.onDestroy$$))
.subscribe(() => {
const currentPoints = this.points;
const nextPoints = this.findPoints();
if (isEqual(currentPoints, nextPoints)) {
return;
}
this.points = this.findPoints();
this.cdr.detectChanges();
});
}
ngOnDestroy() {
this.onDestroy$$.next();
}
findPoints() {
const r1 = this.store.getNode(this.from)?.getRect();
const r2 = this.store.getNode(this.to)?.getRect();
if (!r1 || !r2) {
return;
}
const s = this.store.getSurfaceNode().getRect();
const [x1, x2] = (this.direction === 'h' ? this.parallelDirection : this.verticalDirection)(r1.left - s.left, r2.left - s.left, r1.width, r2.width);
const [y1, y2] = (this.direction === 'h' ? this.verticalDirection : this.parallelDirection)(r1.top - s.top, r2.top - s.top, r1.height, r2.height);
return this.unScale([
[x1, y1],
[x2, y2],
]);
}
unScale(points) {
return points.map(p => p.map(n => n / this.store.getScale()));
}
static { this.ɵfac = function GraphLinkComponent_Factory(t) { return new (t || GraphLinkComponent)(i0.ɵɵdirectiveInject(i1.GraphStoreService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: GraphLinkComponent, selectors: [["g", "aclGraphLink", ""]], inputs: { from: "from", to: "to", direction: "direction", radius: "radius", arrow: "arrow", color: "color", path: "path", parallelDirection: "parallelDirection", verticalDirection: "verticalDirection" }, attrs: _c0, decls: 1, vars: 1, consts: [[4, "ngIf"], [1, "acl-graph-link__line"], ["r", "4", 1, "acl-graph-link__dot"], ["points", "0,0 8,-4 8,4", 1, "acl-graph-link__arrow"]], template: function GraphLinkComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, GraphLinkComponent_ng_container_0_Template, 3, 4, "ng-container", 0);
} if (rf & 2) {
i0.ɵɵproperty("ngIf", ctx.points);
} }, dependencies: [i2.NgIf], encapsulation: 2, changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GraphLinkComponent, [{
type: Component,
args: [{ selector: 'g[aclGraphLink]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"points\">\n <svg:path\n class=\"acl-graph-link__line\"\n [attr.d]=\"path(points)\"\n [style.stroke]=\"color\"\n />\n <ng-container *ngIf=\"arrow\">\n <svg:circle\n class=\"acl-graph-link__dot\"\n r=\"4\"\n [attr.cx]=\"points[0][0]\"\n [attr.cy]=\"points[0][1]\"\n [style.fill]=\"color\"\n ></svg:circle>\n <svg:polygon\n class=\"acl-graph-link__arrow\"\n points=\"0,0 8,-4 8,4\"\n [style.transform]=\"arrowTransform\"\n [style.fill]=\"color\"\n ></svg:polygon>\n </ng-container>\n</ng-container>\n" }]
}], () => [{ type: i1.GraphStoreService }, { type: i0.ChangeDetectorRef }], { from: [{
type: Input
}], to: [{
type: Input
}], direction: [{
type: Input
}], radius: [{
type: Input
}], arrow: [{
type: Input
}], color: [{
type: Input
}], path: [{
type: Input
}], parallelDirection: [{
type: Input
}], verticalDirection: [{
type: Input
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GraphLinkComponent, { className: "GraphLinkComponent" }); })();
function addOrMinus(condition, v1, v2) {
return (condition ? add : subtract)(v1, v2);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtbGluay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvZ3JhcGgtY2FudmFzL2NvbXBvbmVudHMvZ3JhcGgtbGluay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvZ3JhcGgtY2FudmFzL2NvbXBvbmVudHMvZ3JhcGgtbGluay50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEdBRU4sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7SUNMekQsNkJBQTRCOztJQVExQixBQVBBLDRCQU1jLGlCQU1DOzs7O0lBUGIsY0FBb0I7SUFBcEIsb0NBQW9COztJQUtwQixjQUFrQztJQUNsQyxBQURBLGtEQUFrQyxzQkFDZDs7O0lBbEIxQiw2QkFBNkI7O0lBQzNCLDBCQUlFO0lBQ0Ysb0dBQTRCOzs7O0lBRjFCLGNBQXNCO0lBQXRCLHNDQUFzQjs7SUFFVCxjQUFXO0lBQVgsbUNBQVc7O0FEYzVCLE1BQU0sT0FBTyxrQkFBa0I7SUFxRTdCLElBQUksY0FBYztRQUNoQixNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pDLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxTQUFTLEtBQUssR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFO1lBQy9CLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDTCxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxHQUFHO2dCQUN4QixDQUFDLENBQUMsRUFBRTtnQkFDSixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUU7b0JBQ25DLENBQUMsQ0FBQyxHQUFHO29CQUNMLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixPQUFPLGFBQWEsRUFBRSxPQUFPLEVBQUUsY0FBYyxHQUFHLE1BQU0sQ0FBQztJQUN6RCxDQUFDO0lBRUQsWUFDbUIsS0FBd0IsRUFDeEIsR0FBc0I7UUFEdEIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE1RXpDLGNBQVMsR0FBYyxHQUFHLENBQUM7UUFHM0IsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUdaLFVBQUssR0FBRyxJQUFJLENBQUM7UUFNYixTQUFJLEdBQStCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUU7WUFDbEUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTlCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUNyQixJQUFJLENBQUMsTUFBTSxDQUNaLENBQUM7WUFFRixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssR0FBRztnQkFDM0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7YUFDUixVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRTthQUNoQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzVDLEVBQUUsSUFBSSxVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ2hDLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7YUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUMzRCxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTthQUNSLEVBQUUsSUFBSSxVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ2hDLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7YUFDNUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7YUFDaEMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUM1QyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMs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LEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDUixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQWM7UUFDcEIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQVcsQ0FBQztJQUMxRSxDQUFDO21GQW5JVSxrQkFBa0I7b0VBQWxCLGtCQUFrQjtZQ3BCL0IscUZBQTZCOztZQUFkLGlDQUFZOzs7aUZEb0JkLGtCQUFrQjtjQU45QixTQUFTOzJCQUVFLGlCQUFpQixtQkFFVix1QkFBdUIsQ0FBQyxNQUFNO2tGQUkvQyxJQUFJO2tCQURILEtBQUs7WUFJTixFQUFFO2tCQURELEtBQUs7WUFJTixTQUFTO2tCQURSLEtBQUs7WUFJTixNQUFNO2tCQURMLEtBQUs7WUFJTixLQUFLO2tCQURKLEtBQUs7WUFJTixLQUFLO2tCQURKLEtBQUs7WUFJTixJQUFJO2tCQURILEtBQUs7WUEyQk4saUJBQWlCO2tCQURoQixLQUFLO1lBVU4saUJBQWlCO2tCQURoQixLQUFLOztrRkF0REssa0JBQWtCO0FBc0kvQixTQUFTLFVBQVUsQ0FBQyxTQUFrQixFQUFFLEVBQVUsRUFBRSxFQUFVO0lBQzVELE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhZGQsIHN1YnRyYWN0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnLi4vLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IEdyYXBoU3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JhcGgtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBQb2ludHMsIE5vZGVJRCB9IGZyb20gJy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnZ1thY2xHcmFwaExpbmtdJyxcbiAgdGVtcGxhdGVVcmw6ICdncmFwaC1saW5rLnRlbXBsYXRlLmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgR3JhcGhMaW5rQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KClcbiAgZnJvbTogTm9kZUlEO1xuXG4gIEBJbnB1dCgpXG4gIHRvOiBOb2RlSUQ7XG5cbiAgQElucHV0KClcbiAgZGlyZWN0aW9uOiAnaCcgfCAndicgPSAndic7XG5cbiAgQElucHV0KClcbiAgcmFkaXVzID0gMTI7XG5cbiAgQElucHV0KClcbiAgYXJyb3cgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGNvbG9yOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcGF0aDogKHBvaW50czogUG9pbnRzKSA9PiBzdHJpbmcgPSAoW1t4MSwgeTFdLCBbeDIsIHkyXV06IFBvaW50cykgPT4ge1xuICAgIGNvbnN0IG1YID0geDEgKyAoeDIgLSB4MSkgLyAyO1xuICAgIGNvbnN0IG1ZID0geTEgKyAoeTIgLSB5MSkgLyAyO1xuXG4gICAgY29uc3QgciA9IE1hdGgubWluKFxuICAgICAgTWF0aC5hYnMoeDEgLSB4MikgLyAyLFxuICAgICAgTWF0aC5hYnMoeTEgLSB5MikgLyAyLFxuICAgICAgdGhpcy5yYWRpdXMsXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRpcmVjdGlvbiA9PT0gJ2gnXG4gICAgICA/IGBNICR7eDF9ICR7eTF9XG4gICAgICAgICBMICR7YWRkT3JNaW51cyh4MSA+IHgyLCBtWCwgcil9ICR7eTF9XG4gICAgICAgICBRICR7bVh9ICR7eTF9ICR7bVh9ICR7YWRkT3JNaW51cyh5MSA8IHkyLCB5MSwgcil9XG4gICAgICAgICBMICR7bVh9ICR7YWRkT3JNaW51cyh5MSA+IHkyLCB5Miwgcil9XG4gICAgICAgICBRICR7bVh9ICR7eTJ9ICR7YWRkT3JNaW51cyh4MSA8IHgyLCBtWCwgcil9ICR7eTJ9XG4gICAgICAgICBMICR7dGhpcy5hcnJvdyA/IGFkZE9yTWludXMoeDEgPiB4MiwgeDIsIDgpIDogeDJ9ICR7eTJ9YFxuICAgICAgOiBgTSAke3gxfSAke3kxfVxuICAgICAgICAgTCAke3gxfSAke2FkZE9yTWludXMoeTEgPiB5MiwgbVksIHIpfVxuICAgICAgICAgUSAke3gxfSAke21ZfSAke2FkZE9yTWludXMoeDEgPCB4MiwgeDEsIHIpfSAke21ZfVxuICAgICAgICAgTCAke2FkZE9yTWludXMoeDEgPiB4MiwgeDIsIHIpfSAke21ZfVxuICAgICAgICAgUSAke3gyfSAke21ZfSAke3gyfSAke2FkZE9yTWludXMoeTEgPCB5MiwgbVksIHIpfVxuICAgICAgICAgTCAke3gyfSAke3RoaXMuYXJyb3cgPyBhZGRPck1pbnVzKHkxID4geTIsIHkyLCA4KSA6IHkyfWA7XG4gIH07XG5cbiAgQElucHV0KClcbiAgcGFyYWxsZWxEaXJlY3Rpb246IChcbiAgICBhOiBudW1iZXIsXG4gICAgYjogbnVtYmVyLFxuICAgIGFsOiBudW1iZXIsXG4gICAgYmw6IG51bWJlcixcbiAgKSA9PiBbbnVtYmVyLCBudW1iZXJdID0gKGE6IG51bWJlciwgYjogbnVtYmVyLCBhbDogbnVtYmVyLCBibDogbnVtYmVyKSA9PlxuICAgIGEgKyBhbCA8IGIgPyBbYSArIGFsLCBiXSA6IFthLCBiICsgYmxdO1xuXG4gIEBJbnB1dCgpXG4gIHZlcnRpY2FsRGlyZWN0aW9uOiAoXG4gICAgYTogbnVtYmVyLFxuICAgIGI6IG51bWJlcixcbiAgICBhbDogbnVtYmVyLFxuICAgIGJsOiBudW1iZXIsXG4gICkgPT4gW251bWJlciwgbnVtYmVyXSA9IChhOiBudW1iZXIsIGI6IG51bWJlciwgYWw6IG51bWJlciwgYmw6IG51bWJlcikgPT4gW1xuICAgIGEgKyBhbCAvIDIsXG4gICAgYiArIGJsIC8gMixcbiAgXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwb2ludHM6IFBvaW50cztcblxuICBnZXQgYXJyb3dUcmFuc2Zvcm0oKSB7XG4gICAgY29uc3QgW1t4MSwgeTFdLCBbeDIsIHkyXV0gPSB0aGlzLnBvaW50cztcbiAgICBjb25zdCBkZWcgPVxuICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICd2JyAmJiB5MSA8IHkyXG4gICAgICAgID8gLTkwXG4gICAgICAgIDogdGhpcy5kaXJlY3Rpb24gPT09ICd2J1xuICAgICAgICA/IDkwXG4gICAgICAgIDogdGhpcy5kaXJlY3Rpb24gPT09ICdoJyAmJiB4MSA8IHgyXG4gICAgICAgID8gMTgwXG4gICAgICAgIDogMDtcbiAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3gyfXB4LCAke3kyfXB4KSByb3RhdGUoJHtkZWd9ZGVnKWA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBHcmFwaFN0b3JlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge1xuICAgIHRoaXMuc3RvcmVcbiAgICAgIC5ub2RlQ2hhbmdlZCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkJCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgICAgICBjb25zdCBuZXh0UG9pbnRzID0gdGhpcy5maW5kUG9pbnRzKCk7XG5cbiAgICAgICAgaWYgKGlzRXF1YWwoY3VycmVudFBvaW50cywgbmV4dFBvaW50cykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvaW50cyA9IHRoaXMuZmluZFBvaW50cygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMub25EZXN0cm95JCQubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUG9pbnRzKCk6IFBvaW50cyB7XG4gICAgY29uc3QgcjEgPSB0aGlzLnN0b3JlLmdldE5vZGUodGhpcy5mcm9tKT8uZ2V0UmVjdCgpO1xuICAgIGNvbnN0IHIyID0gdGhpcy5zdG9yZS5nZXROb2RlKHRoaXMudG8pPy5nZXRSZWN0KCk7XG5cbiAgICBpZiAoIXIxIHx8ICFyMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHMgPSB0aGlzLnN0b3JlLmdldFN1cmZhY2VOb2RlKCkuZ2V0UmVjdCgpO1xuXG4gICAgY29uc3QgW3gxLCB4Ml0gPSAoXG4gICAgICB0aGlzLmRpcmVjdGlvbiA9PT0gJ2gnID8gdGhpcy5wYXJhbGxlbERpcmVjdGlvbiA6IHRoaXMudmVydGljYWxEaXJlY3Rpb25cbiAgICApKHIxLmxlZnQgLSBzLmxlZnQsIHIyLmxlZnQgLSBzLmxlZnQsIHIxLndpZHRoLCByMi53aWR0aCk7XG4gICAgY29uc3QgW3kxLCB5Ml0gPSAoXG4gICAgICB0aGlzLmRpcmVjdGlvbiA9PT0gJ2gnID8gdGhpcy52ZXJ0aWNhbERpcmVjdGlvbiA6IHRoaXMucGFyYWxsZWxEaXJlY3Rpb25cbiAgICApKHIxLnRvcCAtIHMudG9wLCByMi50b3AgLSBzLnRvcCwgcjEuaGVpZ2h0LCByMi5oZWlnaHQpO1xuXG4gICAgcmV0dXJuIHRoaXMudW5TY2FsZShbXG4gICAgICBbeDEsIHkxXSxcbiAgICAgIFt4MiwgeTJdLFxuICAgIF0pO1xuICB9XG5cbiAgdW5TY2FsZShwb2ludHM6IFBvaW50cykge1xuICAgIHJldHVybiBwb2ludHMubWFwKHAgPT4gcC5tYXAobiA9PiBuIC8gdGhpcy5zdG9yZS5nZXRTY2FsZSgpKSkgYXMgUG9pbnRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZE9yTWludXMoY29uZGl0aW9uOiBib29sZWFuLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gIHJldHVybiAoY29uZGl0aW9uID8gYWRkIDogc3VidHJhY3QpKHYxLCB2Mik7XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwicG9pbnRzXCI+XG4gIDxzdmc6cGF0aFxuICAgIGNsYXNzPVwiYWNsLWdyYXBoLWxpbmtfX2xpbmVcIlxuICAgIFthdHRyLmRdPVwicGF0aChwb2ludHMpXCJcbiAgICBbc3R5bGUuc3Ryb2tlXT1cImNvbG9yXCJcbiAgLz5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFycm93XCI+XG4gICAgPHN2ZzpjaXJjbGVcbiAgICAgIGNsYXNzPVwiYWNsLWdyYXBoLWxpbmtfX2RvdFwiXG4gICAgICByPVwiNFwiXG4gICAgICBbYXR0ci5jeF09XCJwb2ludHNbMF1bMF1cIlxuICAgICAgW2F0dHIuY3ldPVwicG9pbnRzWzBdWzFdXCJcbiAgICAgIFtzdHlsZS5maWxsXT1cImNvbG9yXCJcbiAgICA+PC9zdmc6Y2lyY2xlPlxuICAgIDxzdmc6cG9seWdvblxuICAgICAgY2xhc3M9XCJhY2wtZ3JhcGgtbGlua19fYXJyb3dcIlxuICAgICAgcG9pbnRzPVwiMCwwIDgsLTQgOCw0XCJcbiAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwiYXJyb3dUcmFuc2Zvcm1cIlxuICAgICAgW3N0eWxlLmZpbGxdPVwiY29sb3JcIlxuICAgID48L3N2Zzpwb2x5Z29uPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuIl19