@foblex/flow
Version:
An Angular library designed to simplify the creation and manipulation of dynamic flow. Provides components for flows, nodes, and connections, automating node manipulation and inter-node connections.
152 lines • 18.3 kB
JavaScript
import { booleanAttribute, DestroyRef, Directive, EventEmitter, inject, Input, Output, } from "@angular/core";
import { PointExtensions, SizeExtensions } from '@foblex/2d';
import { NotifyTransformChangedRequest } from '../f-storage';
import { FMediator } from '@foblex/mediator';
import { F_NODE, FNodeBase } from './f-node-base';
import { AddNodeToStoreRequest, UpdateNodeWhenStateOrSizeChangedRequest, RemoveNodeFromStoreRequest } from '../domain';
import * as i0 from "@angular/core";
import * as i1 from "@foblex/platform";
let uniqueId = 0;
export class FNodeDirective extends FNodeBase {
renderer;
fBrowser;
_destroyRef = inject(DestroyRef);
_fMediator = inject(FMediator);
fId = `f-node-${uniqueId++}`;
fParentId = null;
set position(value) {
if (!PointExtensions.isEqual(this._position, value)) {
this._position = value;
this.redraw();
this.refresh();
}
}
get position() {
return this._position;
}
positionChange = new EventEmitter();
set size(value) {
if (!this.size || !SizeExtensions.isEqual(this._size, value)) {
this._size = value;
this.redraw();
this.refresh();
}
}
set rotate(value) {
if (this._rotate !== value) {
this._rotate = value;
this.redraw();
this.refresh();
}
}
get rotate() {
return this._rotate;
}
rotateChange = new EventEmitter();
get size() {
return this._size;
}
sizeChange = new EventEmitter();
fDraggingDisabled = false;
fSelectionDisabled = false;
fIncludePadding = true;
//Add ability to connect to first connectable input if node is at pointer position
fConnectOnNode = true;
fMinimapClass = [];
constructor(elementReference, renderer, fBrowser) {
super(elementReference.nativeElement);
this.renderer = renderer;
this.fBrowser = fBrowser;
}
ngOnInit() {
this.setStyle('position', 'absolute');
this.setStyle('transform-origin', 'center');
this.setStyle('user-select', 'none');
this.setStyle('pointer-events', 'all');
this.setStyle('left', '0');
this.setStyle('top', '0');
super.redraw();
this._fMediator.execute(new AddNodeToStoreRequest(this));
}
setStyle(styleName, value) {
this.renderer.setStyle(this.hostElement, styleName, value);
}
redraw() {
super.redraw();
this._fMediator.execute(new NotifyTransformChangedRequest());
}
ngAfterViewInit() {
if (!this.fBrowser.isBrowser()) {
return;
}
this._listenStateSizeChanges();
}
_listenStateSizeChanges() {
this._fMediator.execute(new UpdateNodeWhenStateOrSizeChangedRequest(this, this._destroyRef));
}
refresh() {
this.stateChanges.notify();
}
ngOnDestroy() {
this._fMediator.execute(new RemoveNodeFromStoreRequest(this));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNodeDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.BrowserService }], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.13", type: FNodeDirective, selector: "[fNode]", inputs: { fId: ["fNodeId", "fId"], fParentId: ["fNodeParentId", "fParentId"], position: ["fNodePosition", "position"], size: ["fNodeSize", "size"], rotate: ["fNodeRotate", "rotate"], fDraggingDisabled: ["fNodeDraggingDisabled", "fDraggingDisabled", booleanAttribute], fSelectionDisabled: ["fNodeSelectionDisabled", "fSelectionDisabled", booleanAttribute], fIncludePadding: ["fIncludePadding", "fIncludePadding", booleanAttribute], fConnectOnNode: ["fConnectOnNode", "fConnectOnNode", booleanAttribute], fMinimapClass: "fMinimapClass" }, outputs: { positionChange: "fNodePositionChange", rotateChange: "fNodeRotateChange", sizeChange: "fNodeSizeChange" }, host: { properties: { "attr.data-f-node-id": "fId", "class.f-node-dragging-disabled": "fDraggingDisabled", "class.f-node-selection-disabled": "fSelectionDisabled" }, classAttribute: "f-node f-component" }, providers: [
{ provide: F_NODE, useExisting: FNodeDirective }
], exportAs: ["fComponent"], usesInheritance: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNodeDirective, decorators: [{
type: Directive,
args: [{
selector: "[fNode]",
exportAs: "fComponent",
host: {
'[attr.data-f-node-id]': 'fId',
class: "f-node f-component",
'[class.f-node-dragging-disabled]': 'fDraggingDisabled',
'[class.f-node-selection-disabled]': 'fSelectionDisabled',
},
providers: [
{ provide: F_NODE, useExisting: FNodeDirective }
],
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.BrowserService }], propDecorators: { fId: [{
type: Input,
args: ['fNodeId']
}], fParentId: [{
type: Input,
args: ['fNodeParentId']
}], position: [{
type: Input,
args: ['fNodePosition']
}], positionChange: [{
type: Output,
args: ['fNodePositionChange']
}], size: [{
type: Input,
args: ['fNodeSize']
}], rotate: [{
type: Input,
args: ['fNodeRotate']
}], rotateChange: [{
type: Output,
args: ['fNodeRotateChange']
}], sizeChange: [{
type: Output,
args: ['fNodeSizeChange']
}], fDraggingDisabled: [{
type: Input,
args: [{ alias: 'fNodeDraggingDisabled', transform: booleanAttribute }]
}], fSelectionDisabled: [{
type: Input,
args: [{ alias: 'fNodeSelectionDisabled', transform: booleanAttribute }]
}], fIncludePadding: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], fConnectOnNode: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], fMinimapClass: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1ub2RlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZi1ub2RlL2Ytbm9kZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNVLGdCQUFnQixFQUFFLFVBQVUsRUFDM0MsU0FBUyxFQUVULFlBQVksRUFBRSxNQUFNLEVBQ3BCLEtBQUssRUFHTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5GLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHVDQUF1QyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sV0FBVyxDQUFDOzs7QUFFdkgsSUFBSSxRQUFRLEdBQVcsQ0FBQyxDQUFDO0FBZXpCLE1BQU0sT0FBTyxjQUFlLFNBQVEsU0FBUztJQTZFakM7SUFDQTtJQTVFTyxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLFVBQVUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFHaEMsR0FBRyxHQUFXLFVBQVcsUUFBUSxFQUFHLEVBQUUsQ0FBQztJQUd2QyxTQUFTLEdBQThCLElBQUksQ0FBQztJQUU1RCxJQUNvQixRQUFRLENBQUMsS0FBYTtRQUN4QyxJQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1BQU0s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QXFCO2dCQUlULElBQUk7c0JBRHZCLEtBQUs7dUJBQUMsV0FBVztnQkFVRSxNQUFNO3NCQUR6QixLQUFLO3VCQUFDLGFBQWE7Z0JBYUosWUFBWTtzQkFEM0IsTUFBTTt1QkFBQyxtQkFBbUI7Z0JBU1gsVUFBVTtzQkFEekIsTUFBTTt1QkFBQyxpQkFBaUI7Z0JBSVQsaUJBQWlCO3NCQURoQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJdEQsa0JBQWtCO3NCQURqQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJdkQsZUFBZTtzQkFEOUIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFLdEIsY0FBYztzQkFEN0IsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJdEIsYUFBYTtzQkFENUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsIGJvb2xlYW5BdHRyaWJ1dGUsIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLCBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgUG9pbnRFeHRlbnNpb25zLCBTaXplRXh0ZW5zaW9ucyB9IGZyb20gJ0Bmb2JsZXgvMmQnO1xuaW1wb3J0IHsgQnJvd3NlclNlcnZpY2UgfSBmcm9tICdAZm9ibGV4L3BsYXRmb3JtJztcbmltcG9ydCB7IE5vdGlmeVRyYW5zZm9ybUNoYW5nZWRSZXF1ZXN0IH0gZnJvbSAnLi4vZi1zdG9yYWdlJztcbmltcG9ydCB7IEZNZWRpYXRvciB9IGZyb20gJ0Bmb2JsZXgvbWVkaWF0b3InO1xuaW1wb3J0IHsgRl9OT0RFLCBGTm9kZUJhc2UgfSBmcm9tICcuL2Ytbm9kZS1iYXNlJztcbmltcG9ydCB7IElIYXNIb3N0RWxlbWVudCB9IGZyb20gJy4uL2ktaGFzLWhvc3QtZWxlbWVudCc7XG5pbXBvcnQgeyBBZGROb2RlVG9TdG9yZVJlcXVlc3QsIFVwZGF0ZU5vZGVXaGVuU3RhdGVPclNpemVDaGFuZ2VkUmVxdWVzdCwgUmVtb3ZlTm9kZUZyb21TdG9yZVJlcXVlc3QgfSBmcm9tICcuLi9kb21haW4nO1xuXG5sZXQgdW5pcXVlSWQ6IG51bWJlciA9IDA7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbZk5vZGVdXCIsXG4gIGV4cG9ydEFzOiBcImZDb21wb25lbnRcIixcbiAgaG9zdDoge1xuICAgICdbYXR0ci5kYXRhLWYtbm9kZS1pZF0nOiAnZklkJyxcbiAgICBjbGFzczogXCJmLW5vZGUgZi1jb21wb25lbnRcIixcbiAgICAnW2NsYXNzLmYtbm9kZS1kcmFnZ2luZy1kaXNhYmxlZF0nOiAnZkRyYWdnaW5nRGlzYWJsZWQnLFxuICAgICdbY2xhc3MuZi1ub2RlLXNlbGVjdGlvbi1kaXNhYmxlZF0nOiAnZlNlbGVjdGlvbkRpc2FibGVkJyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBGX05PREUsIHVzZUV4aXN0aW5nOiBGTm9kZURpcmVjdGl2ZSB9XG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZOb2RlRGlyZWN0aXZlIGV4dGVuZHMgRk5vZGVCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBJSGFzSG9zdEVsZW1lbnQsIE9uRGVzdHJveSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZk1lZGlhdG9yID0gaW5qZWN0KEZNZWRpYXRvcik7XG5cbiAgQElucHV0KCdmTm9kZUlkJylcbiAgcHVibGljIG92ZXJyaWRlIGZJZDogc3RyaW5nID0gYGYtbm9kZS0keyB1bmlxdWVJZCsrIH1gO1xuXG4gIEBJbnB1dCgnZk5vZGVQYXJlbnRJZCcpXG4gIHB1YmxpYyBvdmVycmlkZSBmUGFyZW50SWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuXG4gIEBJbnB1dCgnZk5vZGVQb3NpdGlvbicpXG4gIHB1YmxpYyBvdmVycmlkZSBzZXQgcG9zaXRpb24odmFsdWU6IElQb2ludCkge1xuICAgIGlmKCFQb2ludEV4dGVuc2lvbnMuaXNFcXVhbCh0aGlzLl9wb3NpdGlvbiwgdmFsdWUpKSB7XG4gICAgICB0aGlzLl9wb3NpdGlvbiA9IHZhbHVlO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgcG9zaXRpb24oKTogSVBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gIH1cblxuICBAT3V0cHV0KCdmTm9kZVBvc2l0aW9uQ2hhbmdlJylcbiAgcHVibGljIG92ZXJyaWRlIHBvc2l0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SVBvaW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBvaW50PigpO1xuXG4gIEBJbnB1dCgnZk5vZGVTaXplJylcbiAgcHVibGljIG92ZXJyaWRlIHNldCBzaXplKHZhbHVlOiBJU2l6ZSkge1xuICAgIGlmKCF0aGlzLnNpemUgfHwgIVNpemVFeHRlbnNpb25zLmlzRXF1YWwodGhpcy5fc2l6ZSEsIHZhbHVlKSkge1xuICAgICAgdGhpcy5fc2l6ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIHRoaXMucmVmcmVzaCgpXG4gICAgfVxuICB9XG5cbiAgQElucHV0KCdmTm9kZVJvdGF0ZScpXG4gIHB1YmxpYyBvdmVycmlkZSBzZXQgcm90YXRlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZih0aGlzLl9yb3RhdGUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9yb3RhdGUgPSB2YWx1ZTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIGdldCByb3RhdGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcm90YXRlO1xuICB9XG5cbiAgQE91dHB1dCgnZk5vZGVSb3RhdGVDaGFuZ2UnKVxuICBwdWJsaWMgb3ZlcnJpZGUgcm90YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHNpemUoKTogSVNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaXplITtcbiAgfVxuXG4gIEBPdXRwdXQoJ2ZOb2RlU2l6ZUNoYW5nZScpXG4gIHB1YmxpYyBvdmVycmlkZSBzaXplQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SVJlY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUmVjdD4oKTtcblxuICBASW5wdXQoeyBhbGlhczogJ2ZOb2RlRHJhZ2dpbmdEaXNhYmxlZCcsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZkRyYWdnaW5nRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoeyBhbGlhczogJ2ZOb2RlU2VsZWN0aW9uRGlzYWJsZWQnLCB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcHVibGljIG92ZXJyaWRlIGZTZWxlY3Rpb25EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZkluY2x1ZGVQYWRkaW5nOiBib29sZWFuID0gdHJ1ZTtcblxuICAvL0FkZCBhYmlsaXR5IHRvIGNvbm5lY3QgdG8gZmlyc3QgY29ubmVjdGFibGUgaW5wdXQgaWYgbm9kZSBpcyBhdCBwb2ludGVyIHBvc2l0aW9uXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZkNvbm5lY3RPbk5vZGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvdmVycmlkZSBmTWluaW1hcENsYXNzOiBzdHJpbmdbXSB8IHN0cmluZyA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRSZWZlcmVuY2U6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGZCcm93c2VyOiBCcm93c2VyU2VydmljZVxuICApIHtcbiAgICBzdXBlcihlbGVtZW50UmVmZXJlbmNlLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0U3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgdGhpcy5zZXRTdHlsZSgndHJhbnNmb3JtLW9yaWdpbicsICdjZW50ZXInKTtcbiAgICB0aGlzLnNldFN0eWxlKCd1c2VyLXNlbGVjdCcsICdub25lJyk7XG4gICAgdGhpcy5zZXRTdHlsZSgncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgdGhpcy5zZXRTdHlsZSgnbGVmdCcsICcwJyk7XG4gICAgdGhpcy5zZXRTdHlsZSgndG9wJywgJzAnKTtcbiAgICBzdXBlci5yZWRyYXcoKTtcblxuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBBZGROb2RlVG9TdG9yZVJlcXVlc3QodGhpcykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNldFN0eWxlKHN0eWxlTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmhvc3RFbGVtZW50LCBzdHlsZU5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSByZWRyYXcoKTogdm9pZCB7XG4gICAgc3VwZXIucmVkcmF3KCk7XG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUobmV3IE5vdGlmeVRyYW5zZm9ybUNoYW5nZWRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZighdGhpcy5mQnJvd3Nlci5pc0Jyb3dzZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW5TdGF0ZVNpemVDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5TdGF0ZVNpemVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBVcGRhdGVOb2RlV2hlblN0YXRlT3JTaXplQ2hhbmdlZFJlcXVlc3QodGhpcywgdGhpcy5fZGVzdHJveVJlZikpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubm90aWZ5KCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IFJlbW92ZU5vZGVGcm9tU3RvcmVSZXF1ZXN0KHRoaXMpKTtcbiAgfVxufVxuIl19