UNPKG

@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.

234 lines 39 kB
import { booleanAttribute, ContentChildren, Directive, ElementRef, EventEmitter, inject, Inject, Input, NgZone, numberAttribute, Optional, Output } from "@angular/core"; import { FDraggableBase } from './f-draggable-base'; import { FNodeMoveFinalizeRequest, FNodeMovePreparationRequest } from './f-node-move'; import { FCanvasMoveFinalizeRequest, FCanvasMovePreparationRequest } from './f-canvas'; import { FReassignConnectionPreparationRequest, FReassignConnectionFinalizeRequest, FCreateConnectionPreparationRequest, FCreateConnectionFinalizeRequest } from './f-connection'; import { FMediator } from '@foblex/mediator'; import { AddDndToStoreRequest, EmitSelectionChangeEventRequest, PrepareDragSequenceRequest, RemoveDndFromStoreRequest, EndDragSequenceRequest, InitializeDragSequenceRequest, OnPointerMoveRequest, defaultEventTrigger } from '../domain'; import { FExternalItemFinalizeRequest, FExternalItemPreparationRequest, PreventDefaultIsExternalItemRequest } from '../f-external-item'; import { FSingleSelectRequest } from './f-single-select'; import { FNodeResizeFinalizeRequest, FNodeResizePreparationRequest } from './f-node-resize'; import { F_AFTER_MAIN_PLUGIN, F_BEFORE_MAIN_PLUGIN } from './i-f-drag-and-drop-plugin'; import { EOperationSystem, PlatformService } from '@foblex/platform'; import { FDragHandlerResult } from './f-drag-handler'; import { FNodeDropToGroupFinalizeRequest, FNodeDropToGroupPreparationRequest } from './f-drop-to-group'; import { FNodeRotateFinalizeRequest, FNodeRotatePreparationRequest } from './f-node-rotate'; import * as i0 from "@angular/core"; import * as i1 from "@foblex/platform"; // ┌──────────────────────────────┐ // │ Angular Realm │ // │ │ // │ ┌────────────────────────┐ │ // │ │ FDraggableDirective │ │ // │ └──────────┬─────────────┘ │ // │ │ extends │ // │ ┌──────────▼─────────────┐ │ // │ │ FDraggableBase │ │ // │ └──────────┬─────────────┘ │ // │ │ │ // │ │ overrides │ // │ ┌──────────▼─────────────┐ │ // │ │ DragAndDropBase │ │ // │ └──────────┬─────────────┘ │ // │ │ │ // │ subscribes to │ // │ │ │ // │ ┌────▼────┐ │ // │ │ Document│ │ // │ └─────────┘ │ // │ │ // │ ┌────────────────────────┐ │ // │ │ FMediator │◄─┬────┐ // │ └─────┬────────┬─────────┘ │ │ // │ │ │ │ │ // │ executes executes │ │ // │ F*Request F*Event │ │ // │ │ │ │ │ // └────────┴────────┴────────────┴────┘ // // // ┌──────────────────────────────────────┐ // │ Drag & Drop Runtime Layer │ // │ │ // │ Events from DOM: │ // │ - mousedown / touchstart │ // │ - mousemove / touchmove │ // │ - pointerup │ // │ │ // │ ↓ Routed to │ // │ │ // │ ┌──────────────────────────────┐ │ // │ │ DragAndDropBase │ │ // │ └──────────────────────────────┘ │ // │ ▲ ▲ │ // │ │ │ │ // │ checkDrag onPointerMove │ // │ Sequence + Finalization │ // │ To Start │ // └──────────────────────────────────────┘ export class FDraggableDirective extends FDraggableBase { _fBrowser; _elementReference = inject(ElementRef); _fResult = inject(FDragHandlerResult); _fMediator = inject(FMediator); _fPlatform = inject(PlatformService); disabled = false; get hostElement() { return this._elementReference.nativeElement; } fMultiSelectTrigger = (event) => { return (this._fPlatform.getOS() === EOperationSystem.MAC_OS) ? event.metaKey : event.ctrlKey; }; fReassignConnectionTrigger = defaultEventTrigger; fCreateConnectionTrigger = defaultEventTrigger; fNodeResizeTrigger = defaultEventTrigger; fNodeRotateTrigger = defaultEventTrigger; fNodeMoveTrigger = defaultEventTrigger; fCanvasMoveTrigger = defaultEventTrigger; fExternalItemTrigger = defaultEventTrigger; fSelectionChange = new EventEmitter(); fNodeIntersectedWithConnections = new EventEmitter(); fEmitOnNodeIntersect = false; fCreateNode = new EventEmitter(); fReassignConnection = new EventEmitter(); fCreateConnection = new EventEmitter(); fDropToGroup = new EventEmitter(); vCellSize = 1; hCellSize = 1; fCellSizeWhileDragging = false; fDragStarted = new EventEmitter(); fDragEnded = new EventEmitter(); _beforePlugins; _afterPlugins; constructor(ngZone, _fBrowser) { super(ngZone); this._fBrowser = _fBrowser; } ngOnInit() { this._fMediator.execute(new AddDndToStoreRequest(this)); } ngAfterViewInit() { super.subscribe(this._fBrowser.document); } onPointerDown(event) { this._fResult.clear(); this._fMediator.execute(new InitializeDragSequenceRequest()); this._beforePlugins.forEach((p) => p.onPointerDown?.(event)); this._fMediator.execute(new FSingleSelectRequest(event, this.fMultiSelectTrigger)); this._fMediator.execute(new FReassignConnectionPreparationRequest(event, this.fReassignConnectionTrigger)); this._fMediator.execute(new FCreateConnectionPreparationRequest(event, this.fCreateConnectionTrigger)); this._afterPlugins.forEach((p) => p.onPointerDown?.(event)); const isMouseLeftOrTouch = event.isMouseLeftButton(); if (!isMouseLeftOrTouch) { this.finalizeDragSequence(); } return isMouseLeftOrTouch; } prepareDragSequence(event) { this._beforePlugins.forEach((p) => p.prepareDragSequence?.(event)); this._fMediator.execute(new FNodeResizePreparationRequest(event, this.fNodeResizeTrigger)); this._fMediator.execute(new FNodeRotatePreparationRequest(event, this.fNodeRotateTrigger)); this._fMediator.execute(new FNodeMovePreparationRequest(event, this.fNodeMoveTrigger)); this._fMediator.execute(new FExternalItemPreparationRequest(event, this.fExternalItemTrigger)); this._fMediator.execute(new FNodeDropToGroupPreparationRequest(event)); this._fMediator.execute(new FCanvasMovePreparationRequest(event, this.fCanvasMoveTrigger)); this._afterPlugins.forEach((p) => p.prepareDragSequence?.(event)); this._fMediator.execute(new PrepareDragSequenceRequest()); } onSelect(event) { this._fMediator.execute(new PreventDefaultIsExternalItemRequest(event)); } onPointerMove(event) { this._fMediator.execute(new OnPointerMoveRequest(event)); } onPointerUp(event) { this._beforePlugins.forEach((x) => x.onPointerUp?.(event)); this._fMediator.execute(new FReassignConnectionFinalizeRequest(event)); this._fMediator.execute(new FCreateConnectionFinalizeRequest(event)); this._fMediator.execute(new FNodeResizeFinalizeRequest(event)); this._fMediator.execute(new FNodeRotateFinalizeRequest(event)); this._fMediator.execute(new FNodeMoveFinalizeRequest(event)); this._fMediator.execute(new FExternalItemFinalizeRequest(event)); this._fMediator.execute(new FNodeDropToGroupFinalizeRequest(event)); this._fMediator.execute(new FCanvasMoveFinalizeRequest(event)); this._afterPlugins.forEach((x) => x.onPointerUp?.(event)); this._fMediator.execute(new EndDragSequenceRequest()); } finalizeDragSequence() { this._fMediator.execute(new EmitSelectionChangeEventRequest()); this._fResult.clear(); } ngOnDestroy() { this._fMediator.execute(new RemoveDndFromStoreRequest()); super.unsubscribe(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FDraggableDirective, deps: [{ token: NgZone, optional: true }, { token: i1.BrowserService }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.13", type: FDraggableDirective, selector: "f-flow[fDraggable]", inputs: { disabled: ["fDraggableDisabled", "disabled", booleanAttribute], fMultiSelectTrigger: "fMultiSelectTrigger", fReassignConnectionTrigger: "fReassignConnectionTrigger", fCreateConnectionTrigger: "fCreateConnectionTrigger", fNodeResizeTrigger: "fNodeResizeTrigger", fNodeRotateTrigger: "fNodeRotateTrigger", fNodeMoveTrigger: "fNodeMoveTrigger", fCanvasMoveTrigger: "fCanvasMoveTrigger", fExternalItemTrigger: "fExternalItemTrigger", fEmitOnNodeIntersect: ["fEmitOnNodeIntersect", "fEmitOnNodeIntersect", booleanAttribute], vCellSize: ["vCellSize", "vCellSize", numberAttribute], hCellSize: ["hCellSize", "hCellSize", numberAttribute], fCellSizeWhileDragging: ["fCellSizeWhileDragging", "fCellSizeWhileDragging", booleanAttribute] }, outputs: { fSelectionChange: "fSelectionChange", fNodeIntersectedWithConnections: "fNodeIntersectedWithConnections", fCreateNode: "fCreateNode", fReassignConnection: "fReassignConnection", fCreateConnection: "fCreateConnection", fDropToGroup: "fDropToGroup", fDragStarted: "fDragStarted", fDragEnded: "fDragEnded" }, providers: [FDragHandlerResult], queries: [{ propertyName: "_beforePlugins", predicate: F_BEFORE_MAIN_PLUGIN, descendants: true }, { propertyName: "_afterPlugins", predicate: F_AFTER_MAIN_PLUGIN, descendants: true }], exportAs: ["fDraggable"], usesInheritance: true, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FDraggableDirective, decorators: [{ type: Directive, args: [{ selector: "f-flow[fDraggable]", exportAs: 'fDraggable', providers: [FDragHandlerResult] }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [NgZone] }, { type: Optional }] }, { type: i1.BrowserService }], propDecorators: { disabled: [{ type: Input, args: [{ transform: booleanAttribute, alias: 'fDraggableDisabled' }] }], fMultiSelectTrigger: [{ type: Input }], fReassignConnectionTrigger: [{ type: Input }], fCreateConnectionTrigger: [{ type: Input }], fNodeResizeTrigger: [{ type: Input }], fNodeRotateTrigger: [{ type: Input }], fNodeMoveTrigger: [{ type: Input }], fCanvasMoveTrigger: [{ type: Input }], fExternalItemTrigger: [{ type: Input }], fSelectionChange: [{ type: Output }], fNodeIntersectedWithConnections: [{ type: Output }], fEmitOnNodeIntersect: [{ type: Input, args: [{ transform: booleanAttribute }] }], fCreateNode: [{ type: Output }], fReassignConnection: [{ type: Output }], fCreateConnection: [{ type: Output }], fDropToGroup: [{ type: Output }], vCellSize: [{ type: Input, args: [{ transform: numberAttribute }] }], hCellSize: [{ type: Input, args: [{ transform: numberAttribute }] }], fCellSizeWhileDragging: [{ type: Input, args: [{ transform: booleanAttribute }] }], fDragStarted: [{ type: Output }], fDragEnded: [{ type: Output }], _beforePlugins: [{ type: ContentChildren, args: [F_BEFORE_MAIN_PLUGIN, { descendants: true }] }], _afterPlugins: [{ type: ContentChildren, args: [F_AFTER_MAIN_PLUGIN, { descendants: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1kcmFnZ2FibGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9mLWRyYWdnYWJsZS9mLWRyYWdnYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNVLGdCQUFnQixFQUFFLGVBQWUsRUFDaEQsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFDNUIsS0FBSyxFQUNMLE1BQU0sRUFBRSxlQUFlLEVBRWYsUUFBUSxFQUFFLE1BQU0sRUFDekIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsMkJBQTJCLEVBQzVCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2RixPQUFPLEVBR0wscUNBQXFDLEVBQ3JDLGtDQUFrQyxFQUNsQyxtQ0FBbUMsRUFDbkMsZ0NBQWdDLEVBQ2pDLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsK0JBQStCLEVBQy9CLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLDZCQUE2QixFQUM3QixvQkFBb0IsRUFBZ0MsbUJBQW1CLEVBQ3hFLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsK0JBQStCLEVBRS9CLG1DQUFtQyxFQUNwQyxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSw2QkFBNkIsRUFBRSxN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QUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSXRCLFlBQVk7c0JBRDNCLE1BQU07Z0JBSVMsVUFBVTtzQkFEekIsTUFBTTtnQkFJQyxjQUFjO3NCQURyQixlQUFlO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFJcEQsYUFBYTtzQkFEcEIsZUFBZTt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LCBib29sZWFuQXR0cmlidXRlLCBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLCBpbmplY3QsIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSwgbnVtYmVyQXR0cmlidXRlLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgUXVlcnlMaXN0XG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGRHJhZ2dhYmxlQmFzZSB9IGZyb20gJy4vZi1kcmFnZ2FibGUtYmFzZSc7XG5pbXBvcnQge1xuICBGTm9kZU1vdmVGaW5hbGl6ZVJlcXVlc3QsXG4gIEZOb2RlTW92ZVByZXBhcmF0aW9uUmVxdWVzdFxufSBmcm9tICcuL2Ytbm9kZS1tb3ZlJztcbmltcG9ydCB7IEZDYW52YXNNb3ZlRmluYWxpemVSZXF1ZXN0LCBGQ2FudmFzTW92ZVByZXBhcmF0aW9uUmVxdWVzdCB9IGZyb20gJy4vZi1jYW52YXMnO1xuaW1wb3J0IHtcbiAgRkNyZWF0ZUNvbm5lY3Rpb25FdmVudCxcbiAgRlJlYXNzaWduQ29ubmVjdGlvbkV2ZW50LFxuICBGUmVhc3NpZ25Db25uZWN0aW9uUHJlcGFyYXRpb25SZXF1ZXN0LFxuICBGUmVhc3NpZ25Db25uZWN0aW9uRmluYWxpemVSZXF1ZXN0LFxuICBGQ3JlYXRlQ29ubmVjdGlvblByZXBhcmF0aW9uUmVxdWVzdCxcbiAgRkNyZWF0ZUNvbm5lY3Rpb25GaW5hbGl6ZVJlcXVlc3Rcbn0gZnJvbSAnLi9mLWNvbm5lY3Rpb24nO1xuaW1wb3J0IHsgRlNlbGVjdGlvbkNoYW5nZUV2ZW50IH0gZnJvbSAnLi9mLXNlbGVjdGlvbi1jaGFuZ2UtZXZlbnQnO1xuaW1wb3J0IHsgRk1lZGlhdG9yIH0gZnJvbSAnQGZvYmxleC9tZWRpYXRvcic7XG5pbXBvcnQge1xuICBBZGREbmRUb1N0b3JlUmVxdWVzdCxcbiAgRW1pdFNlbGVjdGlvbkNoYW5nZUV2ZW50UmVxdWVzdCxcbiAgUHJlcGFyZURyYWdTZXF1ZW5jZVJlcXVlc3QsXG4gIFJlbW92ZURuZEZyb21TdG9yZVJlcXVlc3QsXG4gIEVuZERyYWdTZXF1ZW5jZVJlcXVlc3QsXG4gIEluaXRpYWxpemVEcmFnU2VxdWVuY2VSZXF1ZXN0LFxuICBPblBvaW50ZXJNb3ZlUmVxdWVzdCwgRkV2ZW50VHJpZ2dlciwgRlRyaWdnZXJFdmVudCwgZGVmYXVsdEV2ZW50VHJpZ2dlclxufSBmcm9tICcuLi9kb21haW4nO1xuaW1wb3J0IHtcbiAgRkV4dGVybmFsSXRlbUZpbmFsaXplUmVxdWVzdCxcbiAgRkV4dGVybmFsSXRlbVByZXBhcmF0aW9uUmVxdWVzdCxcbiAgRkNyZWF0ZU5vZGVFdmVudCxcbiAgUHJldmVudERlZmF1bHRJc0V4dGVybmFsSXRlbVJlcXVlc3Rcbn0gZnJvbSAnLi4vZi1leHRlcm5hbC1pdGVtJztcbmltcG9ydCB7IEZTaW5nbGVTZWxlY3RSZXF1ZXN0IH0gZnJvbSAnLi9mLXNpbmdsZS1zZWxlY3QnO1xuaW1wb3J0IHsgRk5vZGVSZXNpemVGaW5hbGl6ZVJlcXVlc3QsIEZOb2RlUmVzaXplUHJlcGFyYXRpb25SZXF1ZXN0IH0gZnJvbSAnLi9mLW5vZGUtcmVzaXplJztcbmltcG9ydCB7IEZfQUZURVJfTUFJTl9QTFVHSU4sIEZfQkVGT1JFX01BSU5fUExVR0lOLCBJRkRyYWdBbmREcm9wUGx1Z2luIH0gZnJvbSAnLi9pLWYtZHJhZy1hbmQtZHJvcC1wbHVnaW4nO1xuaW1wb3J0IHsgQnJvd3NlclNlcnZpY2UsIEVPcGVyYXRpb25TeXN0ZW0sIFBsYXRmb3JtU2VydmljZSB9IGZyb20gJ0Bmb2JsZXgvcGxhdGZvcm0nO1xuaW1wb3J0IHsgRkRyYWdTdGFydGVkRXZlbnQsIEZOb2RlSW50ZXJzZWN0ZWRXaXRoQ29ubmVjdGlvbnMgfSBmcm9tICcuL2RvbWFpbic7XG5pbXBvcnQgeyBGRHJhZ0hhbmRsZXJSZXN1bHQgfSBmcm9tICcuL2YtZHJhZy1oYW5kbGVyJztcbmltcG9ydCB7XG4gIEZEcm9wVG9Hcm91cEV2ZW50LFxuICBGTm9kZURyb3BUb0dyb3VwRmluYWxpemVSZXF1ZXN0LFxuICBGTm9kZURyb3BUb0dyb3VwUHJlcGFyYXRpb25SZXF1ZXN0XG59IGZyb20gJy4vZi1kcm9wLXRvLWdyb3VwJztcbmltcG9ydCB7IEZOb2RlUm90YXRlRmluYWxpemVSZXF1ZXN0LCBGTm9kZVJvdGF0ZVByZXBhcmF0aW9uUmVxdWVzdCB9IGZyb20gJy4vZi1ub2RlLXJvdGF0ZSc7XG5pbXBvcnQge0lDYW5SdW5PdXRzaWRlQW5ndWxhciwgSVBvaW50ZXJFdmVudH0gZnJvbSBcIi4uL2RyYWctdG9vbGtpdFwiO1xuLy8g4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4vLyDilIIgICAgICAgIEFuZ3VsYXIgUmVhbG0gICAgICAgICDilIJcbi8vIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuLy8g4pSCICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgIOKUglxuLy8g4pSCICDilIIgIEZEcmFnZ2FibGVEaXJlY3RpdmUgICDilIIgIOKUglxuLy8g4pSCICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggIOKUglxuLy8g4pSCICAgICAgICAgICAgIOKUgiBleHRlbmRzICAgICAgICDilIJcbi8vIOKUgiAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICDilIJcbi8vIOKUgiAg4pSCICAgICBGRHJhZ2dhYmxlQmFzZSAgICAg4pSCICDilIJcbi8vIOKUgiAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICDilIJcbi8vIOKUgiAgICAgICAgICAgICDilIIgICAgICAgICAgICAgICAg4pSCXG4vLyDilIIgICAgICAgICAgICAg4pSCIG92ZXJyaWRlcyAgICAgIOKUglxuLy8g4pSCICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgIOKUglxuLy8g4pSCICDilIIgICBEcmFnQW5kRHJvcEJhc2UgICAgICDilIIgIOKUglxuLy8g4pSCICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggIOKUglxuLy8g4pSCICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAgICDilIJcbi8vIOKUgiAgICAgIHN1YnNjcmliZXMgdG8gICAgICAgICAgIOKUglxuLy8g4pSCICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAgICDilIJcbi8vIOKUgiAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSQICAgICAgICAgICDilIJcbi8vIOKUgiAgICAgICAg4pSCIERvY3VtZW504pSCICAgICAgICAgICDilIJcbi8vIOKUgiAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgICAgICDilIJcbi8vIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuLy8g4pSCICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgIOKUglxuLy8g4pSCICDilIIgICAgICAgRk1lZGlhdG9yICAgICAgICDilILil4TilIDilKzilIDilIDilIDilIDilJBcbi8vIOKUgiAg4pSU4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICDilIIgICAg4pSCXG4vLyDilIIgICAgICAgIOKUgiAgICAgICAg4pSCICAgICAgICAgICAg4pSCICAgIOKUglxuLy8g4pSCICAgZXhlY3V0ZXMgICBleGVjdXRlcyAgICAgICAg4pSCICAgIOKUglxuLy8g4pSCICAgRipSZXF1ZXN0ICAgRipFdmVudCAgICAgICAg4pSCICAgIOKUglxuLy8g4pSCICAgICAgICDilIIgICAgICAgIOKUgiAgICAgICAgICAgIOKUgiAgICDilIJcbi8vIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUmFxuLy9cbi8vXG4vLyDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbi8vIOKUgiAgICAgICBEcmFnICYgRHJvcCBSdW50aW1lIExheWVyICAgICAg4pSCXG4vLyDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuLy8g4pSCICBFdmVudHMgZnJvbSBET006ICAgICAgICAgICAgICAgICAgICDilIJcbi8vIOKUgiAgICAtIG1vdXNlZG93biAvIHRvdWNoc3RhcnQgICAgICAgICAg4pSCXG4vLyDilIIgICAgLSBtb3VzZW1vdmUgLyB0b3VjaG1vdmUgICAgICAgICAgIOKUglxuLy8g4pSCICAgIC0gcG9pbnRlcnVwICAgICAgICAgICAgICAgICAgICAgICDilIJcbi8vIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXG4vLyDilIIgIOKGkyBSb3V0ZWQgdG8gICAgICAgICAgICAgICAgICAgICAgICAg4pSCXG4vLyDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuLy8g4pSCICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAg4pSCXG4vLyDilIIgIOKUgiAgICAgRHJhZ0FuZERyb3BCYXNlICAgICAgICAgIOKUgiAgICDilIJcbi8vIOKUgiAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgIOKUglxuLy8g4pSCICAgICAgICDilrIgICAgICAgICAgICAg4payICAgICAgICAgICAgICAg4pSCXG4vLyDilIIgICAgICAgIOKUgiAgICAgICAgICAgICDilIIgICAgICAgICAgICAgICDilIJcbi8vIOKUgiAgIGNoZWNrRHJhZyAgICAgb25Qb2ludGVyTW92ZSAgICAgICAg4pSCXG4vLyDilIIgICBTZXF1ZW5jZSAgICAgICsgRmluYWxpemF0aW9uICAgICAgIOKUglxuLy8g4pSCICAgVG8gU3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbi8vIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcImYtZmxvd1tmRHJhZ2dhYmxlXVwiLFxuICBleHBvcnRBczogJ2ZEcmFnZ2FibGUnLFxuICBwcm92aWRlcnM6IFsgRkRyYWdIYW5kbGVyUmVzdWx0IF1cbn0pXG5leHBvcnQgY2xhc3MgRkRyYWdnYWJsZURpcmVjdGl2ZSBleHRlbmRzIEZEcmFnZ2FibGVCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgX2VsZW1lbnRSZWZlcmVuY2UgPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgcHJpdmF0ZSBfZlJlc3VsdCA9IGluamVjdChGRHJhZ0hhbmRsZXJSZXN1bHQpO1xuICBwcml2YXRlIF9mTWVkaWF0b3IgPSBpbmplY3QoRk1lZGlhdG9yKTtcbiAgcHJpdmF0ZSBfZlBsYXRmb3JtID0gaW5qZWN0KFBsYXRmb3JtU2VydmljZSk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ2ZEcmFnZ2FibGVEaXNhYmxlZCcgfSlcbiAgcHVibGljIG92ZXJyaWRlIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldCBob3N0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWZlcmVuY2UubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmTXVsdGlTZWxlY3RUcmlnZ2VyOiBGRXZlbnRUcmlnZ2VyID0gKGV2ZW50OiBGVHJpZ2dlckV2ZW50KSA9PiB7XG4gICAgcmV0dXJuICh0aGlzLl9mUGxhdGZvcm0uZ2V0T1MoKSA9PT0gRU9wZXJhdGlvblN5c3RlbS5NQUNfT1MpID8gZXZlbnQubWV0YUtleSA6IGV2ZW50LmN0cmxLZXk7XG4gIH07XG5cbiAgQElucHV0KClcbiAgcHVibGljIGZSZWFzc2lnbkNvbm5lY3Rpb25UcmlnZ2VyOiBGRXZlbnRUcmlnZ2VyID0gZGVmYXVsdEV2ZW50VHJpZ2dlcjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZkNyZWF0ZUNvbm5lY3Rpb25UcmlnZ2VyOiBGRXZlbnRUcmlnZ2VyID0gZGVmYXVsdEV2ZW50VHJpZ2dlcjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZk5vZGVSZXNpemVUcmlnZ2VyOiBGRXZlbnRUcmlnZ2VyID0gZGVmYXVsdEV2ZW50VHJpZ2dlcjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZk5vZGVSb3RhdGVUcmlnZ2VyOiBGRXZlbnRUcmlnZ2VyID0gZGVmYXVsdEV2ZW50VHJpZ2dlcjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZk5vZGVNb3ZlVHJpZ2dlcjogRkV2ZW50VHJpZ2dlciA9IGRlZmF1bHRFdmVudFRyaWdnZXI7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGZDYW52YXNNb3ZlVHJpZ2dlcjogRkV2ZW50VHJpZ2dlciA9IGRlZmF1bHRFdmVudFRyaWdnZXI7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGZFeHRlcm5hbEl0ZW1UcmlnZ2VyOiBGRXZlbnRUcmlnZ2VyID0gZGVmYXVsdEV2ZW50VHJpZ2dlcjtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIG92ZXJyaWRlIGZTZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZTZWxlY3Rpb25DaGFuZ2VFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIG92ZXJyaWRlIGZOb2RlSW50ZXJzZWN0ZWRXaXRoQ29ubmVjdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPEZOb2RlSW50ZXJzZWN0ZWRXaXRoQ29ubmVjdGlvbnM+KCk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBvdmVycmlkZSBmRW1pdE9uTm9kZUludGVyc2VjdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb3ZlcnJpZGUgZkNyZWF0ZU5vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPEZDcmVhdGVOb2RlRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvdmVycmlkZSBmUmVhc3NpZ25Db25uZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxGUmVhc3NpZ25Db25uZWN0aW9uRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvdmVycmlkZSBmQ3JlYXRlQ29ubmVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8RkNyZWF0ZUNvbm5lY3Rpb25FdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIG92ZXJyaWRlIGZEcm9wVG9Hcm91cCA9IG5ldyBFdmVudEVtaXR0ZXI8RkRyb3BUb0dyb3VwRXZlbnQ+KCk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgcHVibGljIG92ZXJyaWRlIHZDZWxsU2l6ZSA9IDE7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgcHVibGljIG92ZXJyaWRlIGhDZWxsU2l6ZSA9IDE7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBvdmVycmlkZSBmQ2VsbFNpemVXaGlsZURyYWdnaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvdmVycmlkZSBmRHJhZ1N0YXJ0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZEcmFnU3RhcnRlZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb3ZlcnJpZGUgZkRyYWdFbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKEZfQkVGT1JFX01BSU5fUExVR0lOLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHByaXZhdGUgX2JlZm9yZVBsdWdpbnMhOiBRdWVyeUxpc3Q8SUZEcmFnQW5kRHJvcFBsdWdpbj47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihGX0FGVEVSX01BSU5fUExVR0lOLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHByaXZhdGUgX2FmdGVyUGx1Z2lucyE6IFF1ZXJ5TGlzdDxJRkRyYWdBbmREcm9wUGx1Z2luPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE5nWm9uZSkgQE9wdGlvbmFsKCkgbmdab25lOiBJQ2FuUnVuT3V0c2lkZUFuZ3VsYXIsXG4gICAgcHJpdmF0ZSBfZkJyb3dzZXI6IEJyb3dzZXJTZXJ2aWNlLFxuICApIHtcbiAgICBzdXBlcihuZ1pvbmUpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBBZGREbmRUb1N0b3JlUmVxdWVzdCh0aGlzKSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLnN1YnNjcmliZSh0aGlzLl9mQnJvd3Nlci5kb2N1bWVudCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25Qb2ludGVyRG93bihldmVudDogSVBvaW50ZXJFdmVudCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2ZSZXN1bHQuY2xlYXIoKTtcblxuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBJbml0aWFsaXplRHJhZ1NlcXVlbmNlUmVxdWVzdCgpKTtcblxuICAgIHRoaXMuX2JlZm9yZVBsdWdpbnMuZm9yRWFjaCgocCkgPT4gcC5vblBvaW50ZXJEb3duPy4oZXZlbnQpKTtcblxuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBGU2luZ2xlU2VsZWN0UmVxdWVzdChldmVudCwgdGhpcy5mTXVsdGlTZWxlY3RUcmlnZ2VyKSk7XG5cbiAgICB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTx2b2lkPihuZXcgRlJlYXNzaWduQ29ubmVjdGlvblByZXBhcmF0aW9uUmVxdWVzdChldmVudCwgdGhpcy5mUmVhc3NpZ25Db25uZWN0aW9uVHJpZ2dlcikpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IEZDcmVhdGVDb25uZWN0aW9uUHJlcGFyYXRpb25SZXF1ZXN0KGV2ZW50LCB0aGlzLmZDcmVhdGVDb25uZWN0aW9uVHJpZ2dlcikpO1xuXG4gICAgdGhpcy5fYWZ0ZXJQbHVnaW5zLmZvckVhY2goKHApID0+IHAub25Qb2ludGVyRG93bj8uKGV2ZW50KSk7XG5cbiAgICBjb25zdCBpc01vdXNlTGVmdE9yVG91Y2ggPSBldmVudC5pc01vdXNlTGVmdEJ1dHRvbigpO1xuICAgIGlmICghaXNNb3VzZUxlZnRPclRvdWNoKSB7XG4gICAgICB0aGlzLmZpbmFsaXplRHJhZ1NlcXVlbmNlKCk7XG4gICAgfVxuICAgIHJldHVybiBpc01vdXNlTGVmdE9yVG91Y2g7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlcGFyZURyYWdTZXF1ZW5jZShldmVudDogSVBvaW50ZXJFdmVudCkge1xuXG4gICAgdGhpcy5fYmVmb3JlUGx1Z2lucy5mb3JFYWNoKChwKSA9PiBwLnByZXBhcmVEcmFnU2VxdWVuY2U/LihldmVudCkpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IEZOb2RlUmVzaXplUHJlcGFyYXRpb25SZXF1ZXN0KGV2ZW50LCB0aGlzLmZOb2RlUmVzaXplVHJpZ2dlcikpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IEZOb2RlUm90YXRlUHJlcGFyYXRpb25SZXF1ZXN0KGV2ZW50LCB0aGlzLmZOb2RlUm90YXRlVHJpZ2dlcikpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IEZOb2RlTW92ZVByZXBhcmF0aW9uUmVxdWVzdChldmVudCwgdGhpcy5mTm9kZU1vdmVUcmlnZ2VyKSk7XG5cbiAgICB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTx2b2lkPihuZXcgRkV4dGVybmFsSXRlbVByZXBhcmF0aW9uUmVxdWVzdChldmVudCwgdGhpcy5mRXh0ZXJuYWxJdGVtVHJpZ2dlcikpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IEZOb2RlRHJvcFRvR3JvdXBQcmVwYXJhdGlvblJlcXVlc3QoZXZlbnQpKTtcblxuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBGQ2FudmFzTW92ZVByZXBhcmF0aW9uUmVxdWVzdChldmVudCwgdGhpcy5mQ2FudmFzTW92ZVRyaWdnZXIpKTtcblxuICAgIHRoaXMuX2FmdGVyUGx1Z2lucy5mb3JFYWNoKChwKSA9PiBwLnByZXBhcmVEcmFnU2VxdWVuY2U/LihldmVudCkpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IFByZXBhcmVEcmFnU2VxdWVuY2VSZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBQcmV2ZW50RGVmYXVsdElzRXh0ZXJuYWxJdGVtUmVxdWVzdChldmVudCkpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9uUG9pbnRlck1vdmUoZXZlbnQ6IElQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTx2b2lkPihuZXcgT25Qb2ludGVyTW92ZVJlcXVlc3QoZXZlbnQpKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvblBvaW50ZXJVcChldmVudDogSVBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2JlZm9yZVBsdWdpbnMuZm9yRWFjaCgoeCkgPT4geC5vblBvaW50ZXJVcD8uKGV2ZW50KSk7XG5cbiAgICB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTx2b2lkPihuZXcgRlJlYXNzaWduQ29ubmVjdGlvbkZpbmFsaXplUmVxdWVzdChldmVudCkpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IEZDcmVhdGVDb25uZWN0aW9uRmluYWxpemVSZXF1ZXN0KGV2ZW50KSk7XG5cbiAgICB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTx2b2lkPihuZXcgRk5vZGVSZXNpemVGaW5hbGl6ZVJlcXVlc3QoZXZlbnQpKTtcblxuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBGTm9kZVJvdGF0ZUZpbmFsaXplUmVxdWVzdChldmVudCkpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IEZOb2RlTW92ZUZpbmFsaXplUmVxdWVzdChldmVudCkpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IEZFeHRlcm5hbEl0ZW1GaW5hbGl6ZVJlcXVlc3QoZXZlbnQpKTtcblxuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBGTm9kZURyb3BUb0dyb3VwRmluYWxpemVSZXF1ZXN0KGV2ZW50KSk7XG5cbiAgICB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTx2b2lkPihuZXcgRkNhbnZhc01vdmVGaW5hbGl6ZVJlcXVlc3QoZXZlbnQpKTtcblxuICAgIHRoaXMuX2FmdGVyUGx1Z2lucy5mb3JFYWNoKCh4KSA9PiB4Lm9uUG9pbnRlclVwPy4oZXZlbnQpKTtcblxuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBFbmREcmFnU2VxdWVuY2VSZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpbmFsaXplRHJhZ1NlcXVlbmNlKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBFbWl0U2VsZWN0aW9uQ2hhbmdlRXZlbnRSZXF1ZXN0KCkpO1xuXG4gICAgdGhpcy5fZlJlc3VsdC5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBSZW1vdmVEbmRGcm9tU3RvcmVSZXF1ZXN0KCkpO1xuICAgIHN1cGVyLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cblxuIl19