ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
151 lines • 19.8 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { Directive, EventEmitter, Input, Output } from '@angular/core';
import { Subject } from 'rxjs';
import { transition } from 'd3-transition';
import { zoom, zoomIdentity, zoomTransform } from 'd3-zoom';
import { calculateTransform } from './core/utils';
import * as i0 from "@angular/core";
export class NzGraphZoomDirective {
constructor(element, cdr) {
this.element = element;
this.cdr = cdr;
this.nzMinZoom = 0.1;
this.nzMaxZoom = 10;
this.nzTransformEvent = new EventEmitter();
this.nzZoomChange = new EventEmitter();
this.destroy$ = new Subject();
}
ngAfterViewInit() {
this.bind();
}
ngOnDestroy() {
this.unbind();
this.destroy$.next();
this.destroy$.complete();
}
bind() {
this.svgElement = this.element.nativeElement.querySelector('svg');
this.gZoomElement = this.element.nativeElement.querySelector('svg > g');
const { width, height } = this.element.nativeElement.getBoundingClientRect();
this.svgSelection = transition()
.selection()
.select(() => this.svgElement);
this.zoomBehavior = zoom()
.extent([
[0, 0],
[width, height]
])
.scaleExtent([this.nzMinZoom, this.nzMaxZoom])
.on('zoom', e => {
this.zoomed(e);
});
this.svgSelection.call(this.zoomBehavior, zoomIdentity.translate(0, 0).scale(this.nzZoom || 1));
// Init with nzZoom
this.reScale(0, this.nzZoom);
}
unbind() {
// Destroy listener
this.svgSelection?.interrupt().selectAll('*').interrupt();
if (this.zoomBehavior) {
this.zoomBehavior.on('end', null).on('zoom', null);
}
}
// Methods
fitCenter(duration = 0) {
this.reScale(duration);
}
focus(id, duration = 0) {
// Make sure this node is under SVG container
if (!this.svgElement.getElementById(`${id}`)) {
return;
}
const node = this.svgElement.getElementById(`${id}`);
const svgRect = this.svgElement.getBoundingClientRect();
const position = this.getRelativePositionInfo(node);
const svgTransform = zoomTransform(this.svgElement);
const centerX = (position.topLeft.x + position.bottomRight.x) / 2;
const centerY = (position.topLeft.y + position.bottomRight.y) / 2;
const dx = svgRect.left + svgRect.width / 2 - centerX;
const dy = svgRect.top + svgRect.height / 2 - centerY;
this.svgSelection
.transition()
.duration(duration)
.call(this.zoomBehavior.translateBy, dx / svgTransform.k, dy / svgTransform.k);
}
/**
* Handle zoom event
*
* @param transform
*/
zoomed({ transform }) {
const { x, y, k } = transform;
// Update g element transform
this.gZoomElement.setAttribute('transform', `translate(${x}, ${y})scale(${k})`);
this.nzZoom = k;
this.nzZoomChange.emit(this.nzZoom);
this.nzTransformEvent.emit(transform);
this.cdr.markForCheck();
}
/**
* Scale with zoom and duration
*
* @param duration
* @param scale
* @private
*/
reScale(duration, scale) {
const transform = calculateTransform(this.svgElement, this.gZoomElement, scale);
if (!transform) {
return;
}
const { x, y, k } = transform;
const zTransform = zoomIdentity.translate(x, y).scale(Math.max(k, this.nzMinZoom));
this.svgSelection
.transition()
.duration(duration)
.call(this.zoomBehavior.transform, zTransform)
.on('end.fitted', () => {
this.zoomBehavior.on('end.fitted', null);
});
}
getRelativePositionInfo(node) {
const nodeBox = node.getBBox();
const nodeCtm = node.getScreenCTM();
let pointTL = this.svgElement.createSVGPoint();
let pointBR = this.svgElement.createSVGPoint();
pointTL.x = nodeBox.x;
pointTL.y = nodeBox.y;
pointBR.x = nodeBox.x + nodeBox.width;
pointBR.y = nodeBox.y + nodeBox.height;
pointTL = pointTL.matrixTransform(nodeCtm);
pointBR = pointBR.matrixTransform(nodeCtm);
return {
topLeft: pointTL,
bottomRight: pointBR
};
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: NzGraphZoomDirective, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.4", type: NzGraphZoomDirective, isStandalone: true, selector: "[nz-graph-zoom]", inputs: { nzZoom: "nzZoom", nzMinZoom: "nzMinZoom", nzMaxZoom: "nzMaxZoom" }, outputs: { nzTransformEvent: "nzTransformEvent", nzZoomChange: "nzZoomChange" }, exportAs: ["nzGraphZoom"], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: NzGraphZoomDirective, decorators: [{
type: Directive,
args: [{
selector: '[nz-graph-zoom]',
exportAs: 'nzGraphZoom',
standalone: true
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { nzZoom: [{
type: Input
}], nzMinZoom: [{
type: Input
}], nzMaxZoom: [{
type: Input
}], nzTransformEvent: [{
type: Output
}], nzZoomChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtem9vbS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL2dyYXBoL2dyYXBoLXpvb20uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFHTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcvQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxJQUFJLEVBQWdCLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFJMUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDOztBQVFsRCxNQUFNLE9BQU8sb0JBQW9CO0lBa0IvQixZQUNVLE9BQW1CLEVBQ25CLEdBQXNCO1FBRHRCLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFsQnZCLGNBQVMsR0FBRyxHQUFHLENBQUM7UUFDaEIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVMLHFCQUFnQixHQUFrQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JFLGlCQUFZLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFVbkUsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFLcEMsQ0FBQztJQUVKLGVBQWU7UUFDYixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSTtRQUNGLElB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QUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLE9BQU8sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQVEsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQVEsQ0FBQyxDQUFDO1FBQzVDLE9BQU87WUFDTCxPQUFPLEVBQUUsT0FBTztZQUNoQixXQUFXLEVBQUUsT0FBTztTQUNyQixDQUFDO0lBQ0osQ0FBQzs4R0EvSVUsb0JBQW9CO2tHQUFwQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBTGhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjsrR0FFVSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVhLGdCQUFnQjtzQkFBbEMsTUFBTTtnQkFDWSxZQUFZO3NCQUE5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNlbGVjdGlvbiB9IGZyb20gJ2QzLXNlbGVjdGlvbic7XG5pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSAnZDMtdHJhbnNpdGlvbic7XG5pbXBvcnQgeyB6b29tLCBab29tQmVoYXZpb3IsIHpvb21JZGVudGl0eSwgem9vbVRyYW5zZm9ybSB9IGZyb20gJ2QzLXpvb20nO1xuXG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuXG5pbXBvcnQgeyBjYWxjdWxhdGVUcmFuc2Zvcm0gfSBmcm9tICcuL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgTnpab29tVHJhbnNmb3JtLCBSZWxhdGl2ZVBvc2l0aW9uSW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW256LWdyYXBoLXpvb21dJyxcbiAgZXhwb3J0QXM6ICduekdyYXBoWm9vbScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTnpHcmFwaFpvb21EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBuelpvb20/OiBudW1iZXI7XG4gIEBJbnB1dCgpIG56TWluWm9vbSA9IDAuMTtcbiAgQElucHV0KCkgbnpNYXhab29tID0gMTA7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56VHJhbnNmb3JtRXZlbnQ6IEV2ZW50RW1pdHRlcjxOelpvb21UcmFuc2Zvcm0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpab29tQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBzdmdTZWxlY3Rpb24hOiBTZWxlY3Rpb248TnpTYWZlQW55LCBOelNhZmVBbnksIE56U2FmZUFueSwgTnpTYWZlQW55PjtcbiAgem9vbUJlaGF2aW9yITogWm9vbUJlaGF2aW9yPE56U2FmZUFueSwgTnpTYWZlQW55PjtcblxuICAvLyBUT0RPXG4gIC8vIFN1cHBvcnQgc3ZnIGVsZW1lbnQgb25seSBub3dcbiAgc3ZnRWxlbWVudCE6IFNWR1NWR0VsZW1lbnQ7XG4gIGdab29tRWxlbWVudCE6IFNWR0dFbGVtZW50O1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJpbmQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5iaW5kKCk7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgYmluZCgpOiB2b2lkIHtcbiAgICB0aGlzLnN2Z0VsZW1lbnQgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzdmcnKSBhcyBTVkdTVkdFbGVtZW50O1xuICAgIHRoaXMuZ1pvb21FbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcignc3ZnID4gZycpIGFzIFNWR0dFbGVtZW50O1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5zdmdTZWxlY3Rpb24gPSB0cmFuc2l0aW9uKClcbiAgICAgIC5zZWxlY3Rpb24oKVxuICAgICAgLnNlbGVjdCgoKSA9PiB0aGlzLnN2Z0VsZW1lbnQpO1xuICAgIHRoaXMuem9vbUJlaGF2aW9yID0gem9vbSgpXG4gICAgICAuZXh0ZW50KFtcbiAgICAgICAgWzAsIDBdLFxuICAgICAgICBbd2lkdGgsIGhlaWdodF1cbiAgICAgIF0pXG4gICAgICAuc2NhbGVFeHRlbnQoW3RoaXMubnpNaW5ab29tLCB0aGlzLm56TWF4Wm9vbV0pXG4gICAgICAub24oJ3pvb20nLCBlID0+IHtcbiAgICAgICAgdGhpcy56b29tZWQoZSk7XG4gICAgICB9KTtcbiAgICB0aGlzLnN2Z1NlbGVjdGlvbi5jYWxsKHRoaXMuem9vbUJlaGF2aW9yLCB6b29tSWRlbnRpdHkudHJhbnNsYXRlKDAsIDApLnNjYWxlKHRoaXMubnpab29tIHx8IDEpKTtcbiAgICAvLyBJbml0IHdpdGggbnpab29tXG4gICAgdGhpcy5yZVNjYWxlKDAsIHRoaXMubnpab29tKTtcbiAgfVxuXG4gIHVuYmluZCgpOiB2b2lkIHtcbiAgICAvLyBEZXN0cm95IGxpc3RlbmVyXG4gICAgdGhpcy5zdmdTZWxlY3Rpb24/LmludGVycnVwdCgpLnNlbGVjdEFsbCgnKicpLmludGVycnVwdCgpO1xuICAgIGlmICh0aGlzLnpvb21CZWhhdmlvcikge1xuICAgICAgdGhpcy56b29tQmVoYXZpb3Iub24oJ2VuZCcsIG51bGwpLm9uKCd6b29tJywgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWV0aG9kc1xuICBmaXRDZW50ZXIoZHVyYXRpb246IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICB0aGlzLnJlU2NhbGUoZHVyYXRpb24pO1xuICB9XG5cbiAgZm9jdXMoaWQ6IE56U2FmZUFueSwgZHVyYXRpb246IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICAvLyBNYWtlIHN1cmUgdGhpcyBub2RlIGlzIHVuZGVyIFNWRyBjb250YWluZXJcbiAgICBpZiAoIXRoaXMuc3ZnRWxlbWVudC5nZXRFbGVtZW50QnlJZChgJHtpZH1gKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN2Z0VsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7aWR9YCkgYXMgU1ZHR0VsZW1lbnQ7XG4gICAgY29uc3Qgc3ZnUmVjdCA9IHRoaXMuc3ZnRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0UmVsYXRpdmVQb3NpdGlvbkluZm8obm9kZSk7XG4gICAgY29uc3Qgc3ZnVHJhbnNmb3JtID0gem9vbVRyYW5zZm9ybSh0aGlzLnN2Z0VsZW1lbnQpO1xuXG4gICAgY29uc3QgY2VudGVyWCA9IChwb3NpdGlvbi50b3BMZWZ0LnggKyBwb3NpdGlvbi5ib3R0b21SaWdodC54KSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9IChwb3NpdGlvbi50b3BMZWZ0LnkgKyBwb3NpdGlvbi5ib3R0b21SaWdodC55KSAvIDI7XG4gICAgY29uc3QgZHggPSBzdmdSZWN0LmxlZnQgKyBzdmdSZWN0LndpZHRoIC8gMiAtIGNlbnRlclg7XG4gICAgY29uc3QgZHkgPSBzdmdSZWN0LnRvcCArIHN2Z1JlY3QuaGVpZ2h0IC8gMiAtIGNlbnRlclk7XG5cbiAgICB0aGlzLnN2Z1NlbGVjdGlvblxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGR1cmF0aW9uKVxuICAgICAgLmNhbGwodGhpcy56b29tQmVoYXZpb3IudHJhbnNsYXRlQnksIGR4IC8gc3ZnVHJhbnNmb3JtLmssIGR5IC8gc3ZnVHJhbnNmb3JtLmspO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB6b29tIGV2ZW50XG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2Zvcm1cbiAgICovXG4gIHByaXZhdGUgem9vbWVkKHsgdHJhbnNmb3JtIH06IE56U2FmZUFueSk6IHZvaWQge1xuICAgIGNvbnN0IHsgeCwgeSwgayB9ID0gdHJhbnNmb3JtO1xuICAgIC8vIFVwZGF0ZSBnIGVsZW1lbnQgdHJhbnNmb3JtXG4gICAgKHRoaXMuZ1pvb21FbGVtZW50IGFzIFNWR0dFbGVtZW50KS5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt4fSwgJHt5fSlzY2FsZSgke2t9KWApO1xuICAgIHRoaXMubnpab29tID0gaztcbiAgICB0aGlzLm56Wm9vbUNoYW5nZS5lbWl0KHRoaXMubnpab29tKTtcbiAgICB0aGlzLm56VHJhbnNmb3JtRXZlbnQuZW1pdCh0cmFuc2Zvcm0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIHdpdGggem9vbSBhbmQgZHVyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGR1cmF0aW9uXG4gICAqIEBwYXJhbSBzY2FsZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZVNjYWxlKGR1cmF0aW9uOiBudW1iZXIsIHNjYWxlPzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gY2FsY3VsYXRlVHJhbnNmb3JtKHRoaXMuc3ZnRWxlbWVudCwgdGhpcy5nWm9vbUVsZW1lbnQsIHNjYWxlKTtcbiAgICBpZiAoIXRyYW5zZm9ybSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHgsIHksIGsgfSA9IHRyYW5zZm9ybTtcbiAgICBjb25zdCB6VHJhbnNmb3JtID0gem9vbUlkZW50aXR5LnRyYW5zbGF0ZSh4LCB5KS5zY2FsZShNYXRoLm1heChrLCB0aGlzLm56TWluWm9vbSkpO1xuICAgIHRoaXMuc3ZnU2VsZWN0aW9uXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oZHVyYXRpb24pXG4gICAgICAuY2FsbCh0aGlzLnpvb21CZWhhdmlvci50cmFuc2Zvcm0sIHpUcmFuc2Zvcm0pXG4gICAgICAub24oJ2VuZC5maXR0ZWQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuem9vbUJlaGF2aW9yLm9uKCdlbmQuZml0dGVkJywgbnVsbCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVQb3NpdGlvbkluZm8obm9kZTogU1ZHR0VsZW1lbnQpOiBSZWxhdGl2ZVBvc2l0aW9uSW5mbyB7XG4gICAgY29uc3Qgbm9kZUJveCA9IG5vZGUuZ2V0QkJveCgpO1xuICAgIGNvbnN0IG5vZGVDdG0gPSBub2RlLmdldFNjcmVlbkNUTSgpO1xuICAgIGxldCBwb2ludFRMID0gdGhpcy5zdmdFbGVtZW50LmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgbGV0IHBvaW50QlIgPSB0aGlzLnN2Z0VsZW1lbnQuY3JlYXRlU1ZHUG9pbnQoKTtcblxuICAgIHBvaW50VEwueCA9IG5vZGVCb3gueDtcbiAgICBwb2ludFRMLnkgPSBub2RlQm94Lnk7XG4gICAgcG9pbnRCUi54ID0gbm9kZUJveC54ICsgbm9kZUJveC53aWR0aDtcbiAgICBwb2ludEJSLnkgPSBub2RlQm94LnkgKyBub2RlQm94LmhlaWdodDtcbiAgICBwb2ludFRMID0gcG9pbnRUTC5tYXRyaXhUcmFuc2Zvcm0obm9kZUN0bSEpO1xuICAgIHBvaW50QlIgPSBwb2ludEJSLm1hdHJpeFRyYW5zZm9ybShub2RlQ3RtISk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcExlZnQ6IHBvaW50VEwsXG4gICAgICBib3R0b21SaWdodDogcG9pbnRCUlxuICAgIH07XG4gIH1cbn1cbiJdfQ==