@foblex/flow 17.8.9 → 17.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/domain/f-node/providers.d.ts +1 -1
- package/domain/providers.d.ts +1 -1
- package/drag-toolkit/drag-and-drop-base.d.ts +29 -30
- package/drag-toolkit/event.extensions.d.ts +4 -4
- package/drag-toolkit/index.d.ts +0 -1
- package/esm2022/drag-toolkit/drag-and-drop-base.mjs +94 -93
- package/esm2022/drag-toolkit/event.extensions.mjs +13 -14
- package/esm2022/drag-toolkit/index.mjs +1 -2
- package/esm2022/f-canvas/f-canvas.component.mjs +2 -2
- package/esm2022/f-connection/f-connection/f-connection.component.mjs +3 -3
- package/esm2022/f-draggable/f-canvas/f-canvas.drag-handler.mjs +3 -1
- package/esm2022/f-draggable/f-draggable-base.mjs +3 -4
- package/esm2022/f-draggable/f-draggable-data-context.mjs +1 -2
- package/esm2022/f-draggable/f-draggable.directive.mjs +6 -11
- package/esm2022/f-draggable/f-single-select/f-single-select.execution.mjs +5 -4
- package/esm2022/f-flow/f-flow.component.mjs +2 -2
- package/f-connection/providers.d.ts +1 -1
- package/f-draggable/f-draggable-base.d.ts +2 -2
- package/f-draggable/f-draggable-data-context.d.ts +0 -1
- package/f-draggable/f-draggable.directive.d.ts +0 -3
- package/f-draggable/providers.d.ts +1 -1
- package/f-external-item/domain/providers.d.ts +1 -1
- package/f-storage/providers.d.ts +1 -1
- package/fesm2022/foblex-flow.mjs +123 -130
- package/fesm2022/foblex-flow.mjs.map +1 -1
- package/package.json +1 -1
- package/drag-toolkit/i-can-run-outside-angular.d.ts +0 -3
- package/esm2022/drag-toolkit/i-can-run-outside-angular.mjs +0 -2
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
## Welcome to Foblex Flow
|
|
17
17
|
|
|
18
18
|
Foblex Flow is an [Angular](https://angular.dev/) library built to simplify the creation and management of dynamic, interactive flows.
|
|
19
|
-
Whether you're developing complex systems or lightweight visualizations, Foblex Flow provides a robust set of tools to help automate node manipulation and inter-node connections with ease. It's fully compatible with Angular
|
|
19
|
+
Whether you're developing complex systems or lightweight visualizations, Foblex Flow provides a robust set of tools to help automate node manipulation and inter-node connections with ease. It's fully compatible with Angular 15+, Server-Side Rendering (SSR), and the Composition API.
|
|
20
20
|
|
|
21
21
|
### Examples
|
|
22
22
|
|
|
@@ -13,4 +13,4 @@ import { CalculateConnectableSideByConnectedPositions, CalculateConnectableSideB
|
|
|
13
13
|
/**
|
|
14
14
|
* This file exports all the node-related executions that can be used in the F-Flow domain.
|
|
15
15
|
*/
|
|
16
|
-
export declare const F_NODE_FEATURES: (typeof AddNodeToStore | typeof CalculateConnectableSideByConnectedPositions | typeof CalculateConnectableSideByInternalPosition | typeof CalculateInputConnections | typeof CalculateConnectorsConnectableSides | typeof CalculateNodesBoundingBox | typeof CalculateNodesBoundingBoxNormalizedPosition | typeof CalculateOutputConnections | typeof FitToChildNodesAndGroups | typeof GetChildNodeIds | typeof GetNodePadding | typeof GetParentNodes | typeof
|
|
16
|
+
export declare const F_NODE_FEATURES: (typeof UpdateNodeWhenStateOrSizeChanged | typeof AddNodeToStore | typeof CalculateConnectableSideByConnectedPositions | typeof CalculateConnectableSideByInternalPosition | typeof CalculateInputConnections | typeof CalculateConnectorsConnectableSides | typeof CalculateNodesBoundingBox | typeof CalculateNodesBoundingBoxNormalizedPosition | typeof CalculateOutputConnections | typeof FitToChildNodesAndGroups | typeof GetChildNodeIds | typeof GetNodePadding | typeof GetParentNodes | typeof RemoveNodeFromStore)[];
|
package/domain/providers.d.ts
CHANGED
|
@@ -11,4 +11,4 @@ import { GetNormalizedConnectorRectExecution } from './get-normalized-connector-
|
|
|
11
11
|
* draggable elements, flow, line alignment, nodes, selection, zoom,
|
|
12
12
|
* and various utility executions.
|
|
13
13
|
*/
|
|
14
|
-
export declare const COMMON_PROVIDERS: (typeof GetElementRoundedRectExecution | typeof import("./f-canvas").AddCanvasToStoreExecution | typeof import("./f-canvas").CenterGroupOrNodeExecution | typeof import("./f-canvas").FitToFlowExecution | typeof import("./f-canvas").InputCanvasPositionExecution | typeof import("./f-canvas").InputCanvasScaleExecution | typeof import("./f-canvas").RedrawCanvasWithAnimationExecution | typeof import("./f-canvas").ResetScaleAndCenterExecution | typeof import("./f-canvas").UpdateScaleExecution | typeof import("./f-connection").AddConnectionForCreateToStoreExecution | typeof import("./f-connection").AddConnectionMarkerToStoreExecution | typeof import("./f-connection").AddConnectionToStoreExecution | typeof import("./f-connection").AddSnapConnectionToStoreExecution | typeof import("./f-connection").CreateConnectionMarkersExecution | typeof import("./f-connection").CalculateConnectionLineByBehavior | typeof import("./f-connection").RemoveConnectionFromStoreExecution | typeof import("./f-connection").RemoveConnectionMarkerFromStoreExecution | typeof import("./f-background").AddBackgroundToStoreExecution | typeof import("./f-background").AddPatternToBackgroundExecution | typeof import("./f-background").RemoveBackgroundFromStoreExecution | typeof import("./f-background").SetBackgroundTransformExecution | typeof import("./f-connectors").AddInputToStore | typeof import("./f-connectors").AddOutletToStore | typeof import("./f-connectors").AddOutputToStore | typeof import("./f-connectors").CalculateClosestConnector | typeof import("./f-connectors").FindConnectableConnectorUsingPriorityAndPositionExecution | typeof import("./f-connectors").CalculateSourceConnectorsToConnect | typeof import("./f-connectors").CalculateTargetConnectorsToConnect | typeof import("./f-connectors").GetConnectorAndRect | typeof import("./f-connectors").MarkConnectableConnectors | typeof import("./f-connectors").RemoveInputFromStore | typeof import("./f-connectors").RemoveOutletFromStoreExecution | typeof import("./f-connectors").RemoveOutputFromStoreExecution | typeof import("./f-connectors").UnmarkConnectableConnectors | typeof import("./f-draggable").AddDndToStoreExecution | typeof import("./f-draggable").OnPointerMoveExecution | typeof import("./f-flow").AddFlowToStoreExecution | typeof import("./f-flow").GetFlowStateNodesExecution | typeof import("./f-line-alignment").AddLineAlignmentToStore | typeof import("./f-node").AddNodeToStore | typeof import("./f-node").CalculateConnectableSideByConnectedPositions | typeof import("./f-node").CalculateConnectableSideByInternalPosition | typeof import("./f-node").CalculateInputConnections | typeof import("./f-node").CalculateConnectorsConnectableSides | typeof import("./f-node").CalculateNodesBoundingBoxNormalizedPosition | typeof import("./f-node").CalculateOutputConnections | typeof import("./f-node").FitToChildNodesAndGroups | typeof import("./f-node").GetChildNodeIds | typeof import("./f-node").GetNodePadding | typeof import("./f-node").GetParentNodes | typeof import("./f-node").
|
|
14
|
+
export declare const COMMON_PROVIDERS: (typeof import("./f-node").UpdateNodeWhenStateOrSizeChanged | typeof GetElementRoundedRectExecution | typeof import("./f-canvas").AddCanvasToStoreExecution | typeof import("./f-canvas").CenterGroupOrNodeExecution | typeof import("./f-canvas").FitToFlowExecution | typeof import("./f-canvas").InputCanvasPositionExecution | typeof import("./f-canvas").InputCanvasScaleExecution | typeof import("./f-canvas").RedrawCanvasWithAnimationExecution | typeof import("./f-canvas").ResetScaleAndCenterExecution | typeof import("./f-canvas").UpdateScaleExecution | typeof import("./f-connection").AddConnectionForCreateToStoreExecution | typeof import("./f-connection").AddConnectionMarkerToStoreExecution | typeof import("./f-connection").AddConnectionToStoreExecution | typeof import("./f-connection").AddSnapConnectionToStoreExecution | typeof import("./f-connection").CreateConnectionMarkersExecution | typeof import("./f-connection").CalculateConnectionLineByBehavior | typeof import("./f-connection").RemoveConnectionFromStoreExecution | typeof import("./f-connection").RemoveConnectionMarkerFromStoreExecution | typeof import("./f-background").AddBackgroundToStoreExecution | typeof import("./f-background").AddPatternToBackgroundExecution | typeof import("./f-background").RemoveBackgroundFromStoreExecution | typeof import("./f-background").SetBackgroundTransformExecution | typeof import("./f-connectors").AddInputToStore | typeof import("./f-connectors").AddOutletToStore | typeof import("./f-connectors").AddOutputToStore | typeof import("./f-connectors").CalculateClosestConnector | typeof import("./f-connectors").FindConnectableConnectorUsingPriorityAndPositionExecution | typeof import("./f-connectors").CalculateSourceConnectorsToConnect | typeof import("./f-connectors").CalculateTargetConnectorsToConnect | typeof import("./f-connectors").GetConnectorAndRect | typeof import("./f-connectors").MarkConnectableConnectors | typeof import("./f-connectors").RemoveInputFromStore | typeof import("./f-connectors").RemoveOutletFromStoreExecution | typeof import("./f-connectors").RemoveOutputFromStoreExecution | typeof import("./f-connectors").UnmarkConnectableConnectors | typeof import("./f-draggable").AddDndToStoreExecution | typeof import("./f-draggable").OnPointerMoveExecution | typeof import("./f-flow").AddFlowToStoreExecution | typeof import("./f-flow").GetFlowStateNodesExecution | typeof import("./f-line-alignment").AddLineAlignmentToStore | typeof import("./f-node").AddNodeToStore | typeof import("./f-node").CalculateConnectableSideByConnectedPositions | typeof import("./f-node").CalculateConnectableSideByInternalPosition | typeof import("./f-node").CalculateInputConnections | typeof import("./f-node").CalculateConnectorsConnectableSides | typeof import("./f-node").CalculateNodesBoundingBoxNormalizedPosition | typeof import("./f-node").CalculateOutputConnections | typeof import("./f-node").FitToChildNodesAndGroups | typeof import("./f-node").GetChildNodeIds | typeof import("./f-node").GetNodePadding | typeof import("./f-node").GetParentNodes | typeof import("./f-node").RemoveNodeFromStore | typeof import("./f-selection").SelectExecution | typeof import("./f-selection").SelectAndUpdateNodeLayerExecution | typeof import("./f-zoom").AddZoomToStoreExecution | typeof import("./f-zoom").SetZoomExecution | typeof GetDeepChildrenNodesAndGroupsExecution | typeof GetNormalizedConnectorRectExecution | typeof GetNormalizedElementRectExecution | typeof GetNormalizedPointExecution | typeof SortItemsByParentExecution | typeof UpdateItemAndChildrenLayersExecution | typeof MoveFrontElementsBeforeTargetElement)[];
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ICanRunOutsideAngular } from './i-can-run-outside-angular';
|
|
2
1
|
import { IPointerEvent } from './pointer-events';
|
|
3
2
|
export declare const MOUSE_EVENT_IGNORE_TIME = 800;
|
|
4
3
|
/**
|
|
@@ -7,56 +6,54 @@ export declare const MOUSE_EVENT_IGNORE_TIME = 800;
|
|
|
7
6
|
* and provides abstract methods for derived classes to implement specific behaviors.
|
|
8
7
|
*/
|
|
9
8
|
export declare abstract class DragAndDropBase {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
private
|
|
13
|
-
private
|
|
14
|
-
private
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
private lastTouchEventTime;
|
|
9
|
+
private readonly _document;
|
|
10
|
+
private readonly _ngZone;
|
|
11
|
+
private _mouseListeners;
|
|
12
|
+
private _touchListeners;
|
|
13
|
+
private _startListeners;
|
|
14
|
+
isSyntheticEvent(_event: MouseEvent): boolean;
|
|
15
|
+
private _lastTouchEventTime;
|
|
18
16
|
isDragStarted: boolean;
|
|
19
|
-
private
|
|
20
|
-
private
|
|
21
|
-
private
|
|
22
|
-
private
|
|
17
|
+
private _dragStartThreshold;
|
|
18
|
+
private _dragStartDelay;
|
|
19
|
+
private _dragStartTime;
|
|
20
|
+
private _dragStartPosition;
|
|
23
21
|
abstract disabled: boolean;
|
|
24
|
-
private
|
|
25
|
-
private
|
|
26
|
-
protected constructor(ngZone: ICanRunOutsideAngular | undefined);
|
|
22
|
+
private _moveHandler;
|
|
23
|
+
private _pointerDownElement;
|
|
27
24
|
/**
|
|
28
25
|
* Handles the mouse down event to initiate the drag sequence.
|
|
29
26
|
* It checks if the event is synthetic or fake, and if the drag is already started.
|
|
30
27
|
* If not, it sets up the drag start sequence by adding necessary event listeners.
|
|
31
28
|
* @param event - The mouse event that triggered the drag.
|
|
32
29
|
*/
|
|
33
|
-
private
|
|
30
|
+
private _onMouseDown;
|
|
34
31
|
/**
|
|
35
32
|
* Handles the touch down event to initiate the drag sequence.
|
|
36
33
|
* It checks if the event is synthetic or fake, and if the drag is already started.
|
|
37
34
|
* If not, it sets up the drag start sequence by adding necessary event listeners.
|
|
38
35
|
* @param event - The touch event that triggered the drag.
|
|
39
36
|
*/
|
|
40
|
-
private
|
|
37
|
+
private _onTouchDown;
|
|
41
38
|
/**
|
|
42
39
|
* Handles the select start event.
|
|
43
40
|
* This method is called when the user starts selecting text or elements.
|
|
44
41
|
* It prevents the default behavior and calls the onSelect method to handle the selection.
|
|
45
42
|
* @param event - The event that triggered the select start.
|
|
46
43
|
*/
|
|
47
|
-
private
|
|
44
|
+
private _onSelectStart;
|
|
48
45
|
/**
|
|
49
46
|
* Handles the mouse move event during the drag sequence.
|
|
50
47
|
* It checks if the drag sequence should start and calls the move handler accordingly.
|
|
51
48
|
* @param event - The mouse event that triggered the move.
|
|
52
49
|
*/
|
|
53
|
-
private
|
|
50
|
+
private _onMouseMove;
|
|
54
51
|
/**
|
|
55
52
|
* Handles the touch move event during the drag sequence.
|
|
56
53
|
* It checks if the drag sequence should start and calls the move handler accordingly.
|
|
57
54
|
* @param event - The touch event that triggered the move.
|
|
58
55
|
*/
|
|
59
|
-
private
|
|
56
|
+
private _onTouchMove;
|
|
60
57
|
/**
|
|
61
58
|
* Checks if the drag sequence should start based on the pointer position.
|
|
62
59
|
* It compares the current pointer position with the initial drag start position
|
|
@@ -65,7 +62,7 @@ export declare abstract class DragAndDropBase {
|
|
|
65
62
|
* it prepares the drag sequence and sets the move handler to onPointerMove.
|
|
66
63
|
* @param event - The pointer event that triggered the check.
|
|
67
64
|
*/
|
|
68
|
-
private
|
|
65
|
+
private _checkDragSequenceToStart;
|
|
69
66
|
/**
|
|
70
67
|
* Prepares the drag sequence by setting up necessary event listeners
|
|
71
68
|
* and initializing any required state for the drag operation.
|
|
@@ -80,20 +77,22 @@ export declare abstract class DragAndDropBase {
|
|
|
80
77
|
* This method is called when the user releases the mouse button or lifts their finger from the touch screen.
|
|
81
78
|
* @param event - The pointer event that triggered the up action.
|
|
82
79
|
*/
|
|
83
|
-
private
|
|
80
|
+
private _onPointerUpEvent;
|
|
84
81
|
/**
|
|
85
82
|
* Ends the drag sequence by resetting the state and removing event listeners.
|
|
86
83
|
* It sets the isDragStarted flag to false, clears the pointerDownElement,
|
|
87
84
|
* and resets the moveHandler to checkDragSequenceToStart.
|
|
88
85
|
* It also removes all mouse and touch event listeners that were added during the drag sequence.
|
|
89
86
|
*/
|
|
90
|
-
private
|
|
87
|
+
private _endDragSequence;
|
|
91
88
|
protected abstract finalizeDragSequence(): void;
|
|
92
89
|
protected abstract onSelect(event: Event): void;
|
|
93
|
-
abstract onPointerDown(event: IPointerEvent): boolean;
|
|
94
|
-
abstract onPointerMove(event: IPointerEvent): void;
|
|
95
|
-
abstract onPointerUp(event: IPointerEvent): void;
|
|
96
|
-
subscribe(
|
|
97
|
-
unsubscribe(): void;
|
|
98
|
-
private
|
|
90
|
+
protected abstract onPointerDown(event: IPointerEvent): boolean;
|
|
91
|
+
protected abstract onPointerMove(event: IPointerEvent): void;
|
|
92
|
+
protected abstract onPointerUp(event: IPointerEvent): void;
|
|
93
|
+
protected subscribe(): void;
|
|
94
|
+
protected unsubscribe(): void;
|
|
95
|
+
private _listen;
|
|
96
|
+
private _unlisten;
|
|
97
|
+
private _preventDuringDrag;
|
|
99
98
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export declare class EventExtensions {
|
|
2
|
-
private static
|
|
3
|
-
private static
|
|
4
|
-
private static
|
|
2
|
+
private static _isSupported;
|
|
3
|
+
private static _isPassiveEventListenerSupported;
|
|
4
|
+
private static _passiveEventListener;
|
|
5
5
|
static activeListener(): boolean | AddEventListenerOptions;
|
|
6
6
|
static passiveListener(): boolean | AddEventListenerOptions;
|
|
7
7
|
static activeCaptureListener(): boolean | AddEventListenerOptions;
|
|
8
|
-
static emptyListener():
|
|
8
|
+
static emptyListener(): () => void;
|
|
9
9
|
}
|
package/drag-toolkit/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { IMouseEvent, IPointerUpEvent, ITouchDownEvent, ITouchMoveEvent, } from './pointer-events';
|
|
2
2
|
import { EventExtensions } from './event.extensions';
|
|
3
|
+
import { inject, NgZone } from '@angular/core';
|
|
4
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
5
|
export const MOUSE_EVENT_IGNORE_TIME = 800;
|
|
4
6
|
/**
|
|
5
7
|
* Base class for implementing drag and drop functionality.
|
|
@@ -7,57 +9,53 @@ export const MOUSE_EVENT_IGNORE_TIME = 800;
|
|
|
7
9
|
* and provides abstract methods for derived classes to implement specific behaviors.
|
|
8
10
|
*/
|
|
9
11
|
export class DragAndDropBase {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
isSyntheticEvent(
|
|
16
|
-
return !!this.
|
|
17
|
-
(this.lastTouchEventTime + MOUSE_EVENT_IGNORE_TIME > Date.now());
|
|
12
|
+
_document = inject(DOCUMENT);
|
|
13
|
+
_ngZone = inject(NgZone, { optional: true });
|
|
14
|
+
_mouseListeners = EventExtensions.emptyListener();
|
|
15
|
+
_touchListeners = EventExtensions.emptyListener();
|
|
16
|
+
_startListeners = EventExtensions.emptyListener();
|
|
17
|
+
isSyntheticEvent(_event) {
|
|
18
|
+
return (!!this._lastTouchEventTime && this._lastTouchEventTime + MOUSE_EVENT_IGNORE_TIME > Date.now());
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
+
_lastTouchEventTime = 0;
|
|
20
21
|
isDragStarted = false;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
constructor(ngZone) {
|
|
28
|
-
this.ngZone = ngZone;
|
|
29
|
-
}
|
|
22
|
+
_dragStartThreshold = 3;
|
|
23
|
+
_dragStartDelay = 0;
|
|
24
|
+
_dragStartTime = 0;
|
|
25
|
+
_dragStartPosition = { x: 0, y: 0 };
|
|
26
|
+
_moveHandler = this._checkDragSequenceToStart;
|
|
27
|
+
_pointerDownElement = null;
|
|
30
28
|
/**
|
|
31
29
|
* Handles the mouse down event to initiate the drag sequence.
|
|
32
30
|
* It checks if the event is synthetic or fake, and if the drag is already started.
|
|
33
31
|
* If not, it sets up the drag start sequence by adding necessary event listeners.
|
|
34
32
|
* @param event - The mouse event that triggered the drag.
|
|
35
33
|
*/
|
|
36
|
-
|
|
34
|
+
_onMouseDown = (event) => {
|
|
37
35
|
const isSyntheticEvent = this.isSyntheticEvent(event);
|
|
38
36
|
const isFakeEvent = isFakeMousedownFromScreenReader(event);
|
|
39
37
|
const mouseEvent = new IMouseEvent(event);
|
|
40
38
|
if (isSyntheticEvent || isFakeEvent || this.disabled || this.isDragStarted) {
|
|
41
39
|
return;
|
|
42
40
|
}
|
|
43
|
-
this.
|
|
41
|
+
this._pointerDownElement = mouseEvent.targetElement;
|
|
44
42
|
const result = this.onPointerDown(mouseEvent);
|
|
45
43
|
if (result) {
|
|
46
|
-
this.
|
|
47
|
-
this.
|
|
48
|
-
this.
|
|
49
|
-
this.
|
|
50
|
-
this.
|
|
51
|
-
this.
|
|
52
|
-
this.
|
|
53
|
-
this.
|
|
44
|
+
this._dragStartTime = Date.now();
|
|
45
|
+
this._dragStartPosition = mouseEvent.getPosition();
|
|
46
|
+
this._ngZone?.runOutsideAngular(() => {
|
|
47
|
+
this._listen('selectstart', this._onSelectStart, EventExtensions.activeListener());
|
|
48
|
+
this._listen('mousemove', this._onMouseMove);
|
|
49
|
+
this._listen('pointerup', this._onPointerUpEvent);
|
|
50
|
+
this._listen('pointercancel', this._onPointerUpEvent, EventExtensions.activeCaptureListener());
|
|
51
|
+
this._listen('contextmenu', this._preventDuringDrag, EventExtensions.activeCaptureListener());
|
|
54
52
|
});
|
|
55
|
-
this.
|
|
56
|
-
this.
|
|
57
|
-
this.
|
|
58
|
-
this.
|
|
59
|
-
this.
|
|
60
|
-
this.
|
|
53
|
+
this._mouseListeners = () => {
|
|
54
|
+
this._unlisten('selectstart', this._onSelectStart, EventExtensions.activeListener());
|
|
55
|
+
this._unlisten('mousemove', this._onMouseMove);
|
|
56
|
+
this._unlisten('pointerup', this._onPointerUpEvent);
|
|
57
|
+
this._unlisten('pointercancel', this._onPointerUpEvent, EventExtensions.activeCaptureListener());
|
|
58
|
+
this._unlisten('contextmenu', this._preventDuringDrag, EventExtensions.activeCaptureListener());
|
|
61
59
|
};
|
|
62
60
|
}
|
|
63
61
|
};
|
|
@@ -67,30 +65,30 @@ export class DragAndDropBase {
|
|
|
67
65
|
* If not, it sets up the drag start sequence by adding necessary event listeners.
|
|
68
66
|
* @param event - The touch event that triggered the drag.
|
|
69
67
|
*/
|
|
70
|
-
|
|
68
|
+
_onTouchDown = (event) => {
|
|
71
69
|
const isFakeEvent = isFakeTouchstartFromScreenReader(event);
|
|
72
70
|
const touchEvent = new ITouchDownEvent(event);
|
|
73
71
|
if (isFakeEvent || this.disabled || this.isDragStarted) {
|
|
74
72
|
return;
|
|
75
73
|
}
|
|
76
|
-
this.
|
|
74
|
+
this._pointerDownElement = touchEvent.targetElement;
|
|
77
75
|
const result = this.onPointerDown(touchEvent);
|
|
78
76
|
if (result) {
|
|
79
|
-
this.
|
|
80
|
-
this.
|
|
81
|
-
this.
|
|
82
|
-
this.
|
|
83
|
-
this.
|
|
84
|
-
this.
|
|
85
|
-
this.
|
|
86
|
-
this.
|
|
77
|
+
this._dragStartTime = Date.now();
|
|
78
|
+
this._dragStartPosition = touchEvent.getPosition();
|
|
79
|
+
this._ngZone?.runOutsideAngular(() => {
|
|
80
|
+
this._listen('selectstart', this._onSelectStart, EventExtensions.activeListener());
|
|
81
|
+
this._listen('touchmove', this._onTouchMove);
|
|
82
|
+
this._listen('pointerup', this._onPointerUpEvent);
|
|
83
|
+
this._listen('pointercancel', this._onPointerUpEvent, EventExtensions.activeCaptureListener());
|
|
84
|
+
this._listen('contextmenu', this._preventDuringDrag, EventExtensions.activeCaptureListener());
|
|
87
85
|
});
|
|
88
|
-
this.
|
|
89
|
-
this.
|
|
90
|
-
this.
|
|
91
|
-
this.
|
|
92
|
-
this.
|
|
93
|
-
this.
|
|
86
|
+
this._touchListeners = () => {
|
|
87
|
+
this._unlisten('selectstart', this._onSelectStart, EventExtensions.activeListener());
|
|
88
|
+
this._unlisten('touchmove', this._onTouchMove);
|
|
89
|
+
this._unlisten('pointerup', this._onPointerUpEvent);
|
|
90
|
+
this._unlisten('pointercancel', this._onPointerUpEvent, EventExtensions.activeCaptureListener());
|
|
91
|
+
this._unlisten('contextmenu', this._preventDuringDrag, EventExtensions.activeCaptureListener());
|
|
94
92
|
};
|
|
95
93
|
}
|
|
96
94
|
};
|
|
@@ -100,7 +98,7 @@ export class DragAndDropBase {
|
|
|
100
98
|
* It prevents the default behavior and calls the onSelect method to handle the selection.
|
|
101
99
|
* @param event - The event that triggered the select start.
|
|
102
100
|
*/
|
|
103
|
-
|
|
101
|
+
_onSelectStart = (event) => {
|
|
104
102
|
this.onSelect(event);
|
|
105
103
|
};
|
|
106
104
|
/**
|
|
@@ -108,16 +106,16 @@ export class DragAndDropBase {
|
|
|
108
106
|
* It checks if the drag sequence should start and calls the move handler accordingly.
|
|
109
107
|
* @param event - The mouse event that triggered the move.
|
|
110
108
|
*/
|
|
111
|
-
|
|
112
|
-
this.
|
|
109
|
+
_onMouseMove = (event) => {
|
|
110
|
+
this._moveHandler(new IMouseEvent(event));
|
|
113
111
|
};
|
|
114
112
|
/**
|
|
115
113
|
* Handles the touch move event during the drag sequence.
|
|
116
114
|
* It checks if the drag sequence should start and calls the move handler accordingly.
|
|
117
115
|
* @param event - The touch event that triggered the move.
|
|
118
116
|
*/
|
|
119
|
-
|
|
120
|
-
this.
|
|
117
|
+
_onTouchMove = (event) => {
|
|
118
|
+
this._moveHandler(new ITouchMoveEvent(event));
|
|
121
119
|
};
|
|
122
120
|
/**
|
|
123
121
|
* Checks if the drag sequence should start based on the pointer position.
|
|
@@ -127,25 +125,25 @@ export class DragAndDropBase {
|
|
|
127
125
|
* it prepares the drag sequence and sets the move handler to onPointerMove.
|
|
128
126
|
* @param event - The pointer event that triggered the check.
|
|
129
127
|
*/
|
|
130
|
-
|
|
128
|
+
_checkDragSequenceToStart(event) {
|
|
131
129
|
const pointerPosition = event.getPosition();
|
|
132
|
-
if (!this.isDragStarted && this.
|
|
133
|
-
event.setTarget(this.
|
|
134
|
-
const distanceX = Math.abs(pointerPosition.x - this.
|
|
135
|
-
const distanceY = Math.abs(pointerPosition.y - this.
|
|
136
|
-
const isOverThreshold = distanceX + distanceY >= this.
|
|
130
|
+
if (!this.isDragStarted && this._pointerDownElement) {
|
|
131
|
+
event.setTarget(this._pointerDownElement);
|
|
132
|
+
const distanceX = Math.abs(pointerPosition.x - this._dragStartPosition.x);
|
|
133
|
+
const distanceY = Math.abs(pointerPosition.y - this._dragStartPosition.y);
|
|
134
|
+
const isOverThreshold = distanceX + distanceY >= this._dragStartThreshold;
|
|
137
135
|
if (isOverThreshold) {
|
|
138
|
-
const isDelayElapsed = Date.now() >= this.
|
|
136
|
+
const isDelayElapsed = Date.now() >= this._dragStartTime + this._dragStartDelay;
|
|
139
137
|
if (!isDelayElapsed) {
|
|
140
|
-
this.
|
|
138
|
+
this._endDragSequence();
|
|
141
139
|
return;
|
|
142
140
|
}
|
|
143
141
|
event.preventDefault();
|
|
144
142
|
this.prepareDragSequence(event);
|
|
145
143
|
this.isDragStarted = true;
|
|
146
|
-
this.
|
|
144
|
+
this._moveHandler = this.onPointerMove;
|
|
147
145
|
if (isTouchEvent(event.originalEvent)) {
|
|
148
|
-
this.
|
|
146
|
+
this._lastTouchEventTime = Date.now();
|
|
149
147
|
}
|
|
150
148
|
}
|
|
151
149
|
}
|
|
@@ -157,11 +155,11 @@ export class DragAndDropBase {
|
|
|
157
155
|
* This method is called when the user releases the mouse button or lifts their finger from the touch screen.
|
|
158
156
|
* @param event - The pointer event that triggered the up action.
|
|
159
157
|
*/
|
|
160
|
-
|
|
158
|
+
_onPointerUpEvent = (event) => {
|
|
161
159
|
if (this.isDragStarted) {
|
|
162
160
|
this.onPointerUp(new IPointerUpEvent(event));
|
|
163
161
|
}
|
|
164
|
-
this.
|
|
162
|
+
this._endDragSequence();
|
|
165
163
|
};
|
|
166
164
|
/**
|
|
167
165
|
* Ends the drag sequence by resetting the state and removing event listeners.
|
|
@@ -169,39 +167,42 @@ export class DragAndDropBase {
|
|
|
169
167
|
* and resets the moveHandler to checkDragSequenceToStart.
|
|
170
168
|
* It also removes all mouse and touch event listeners that were added during the drag sequence.
|
|
171
169
|
*/
|
|
172
|
-
|
|
170
|
+
_endDragSequence() {
|
|
173
171
|
this.isDragStarted = false;
|
|
174
|
-
this.
|
|
175
|
-
this.
|
|
176
|
-
this.
|
|
177
|
-
this.
|
|
178
|
-
this.
|
|
179
|
-
this.
|
|
172
|
+
this._pointerDownElement = null;
|
|
173
|
+
this._moveHandler = this._checkDragSequenceToStart;
|
|
174
|
+
this._mouseListeners();
|
|
175
|
+
this._mouseListeners = EventExtensions.emptyListener();
|
|
176
|
+
this._touchListeners();
|
|
177
|
+
this._touchListeners = EventExtensions.emptyListener();
|
|
180
178
|
this.finalizeDragSequence();
|
|
181
179
|
}
|
|
182
|
-
subscribe(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
this.ngZone?.runOutsideAngular(() => {
|
|
188
|
-
fDocument.addEventListener('mousedown', this.onMouseDown, EventExtensions.activeListener());
|
|
189
|
-
fDocument.addEventListener('touchstart', this.onTouchDown, EventExtensions.passiveListener());
|
|
180
|
+
subscribe() {
|
|
181
|
+
this.unsubscribe();
|
|
182
|
+
this._ngZone?.runOutsideAngular(() => {
|
|
183
|
+
this._listen('mousedown', this._onMouseDown, EventExtensions.activeListener());
|
|
184
|
+
this._listen('touchstart', this._onTouchDown, EventExtensions.passiveListener());
|
|
190
185
|
});
|
|
191
|
-
this.
|
|
192
|
-
|
|
193
|
-
|
|
186
|
+
this._startListeners = () => {
|
|
187
|
+
this._unlisten('mousedown', this._onMouseDown, EventExtensions.activeListener());
|
|
188
|
+
this._unlisten('touchstart', this._onTouchDown, EventExtensions.passiveListener());
|
|
194
189
|
};
|
|
195
190
|
}
|
|
196
191
|
unsubscribe() {
|
|
197
|
-
this.
|
|
198
|
-
this.
|
|
199
|
-
this.
|
|
200
|
-
this.
|
|
201
|
-
this.
|
|
202
|
-
this.
|
|
192
|
+
this._startListeners();
|
|
193
|
+
this._startListeners = EventExtensions.emptyListener();
|
|
194
|
+
this._touchListeners();
|
|
195
|
+
this._touchListeners = EventExtensions.emptyListener();
|
|
196
|
+
this._mouseListeners();
|
|
197
|
+
this._mouseListeners = EventExtensions.emptyListener();
|
|
198
|
+
}
|
|
199
|
+
_listen(type, listener, options) {
|
|
200
|
+
this._document.addEventListener(type, listener, options);
|
|
201
|
+
}
|
|
202
|
+
_unlisten(type, listener, options) {
|
|
203
|
+
this._document.removeEventListener(type, listener, options);
|
|
203
204
|
}
|
|
204
|
-
|
|
205
|
+
_preventDuringDrag = (e) => {
|
|
205
206
|
if (this.isDragStarted) {
|
|
206
207
|
e.preventDefault();
|
|
207
208
|
}
|
|
@@ -220,4 +221,4 @@ function isFakeTouchstartFromScreenReader(event) {
|
|
|
220
221
|
(touch.radiusX == null || touch.radiusX === 1) &&
|
|
221
222
|
(touch.radiusY == null || touch.radiusY === 1));
|
|
222
223
|
}
|
|
223
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1hbmQtZHJvcC1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9kcmFnLXRvb2xraXQvZHJhZy1hbmQtZHJvcC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxXQUFXLEVBRVgsZUFBZSxFQUNmLGVBQWUsRUFDZixlQUFlLEdBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFnQixlQUFlO0lBZ0N2QjtJQTVCSixRQUFRLENBQXVCO0lBRS9CLGNBQWMsR0FBYSxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0QsY0FBYyxHQUFhLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUUzRCxjQUFjLEdBQWEsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBRTVELGdCQUFnQixDQUFDLEtBQWlCO1FBQ3ZDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0I7WUFDOUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLGtCQUFrQixHQUFXLENBQUMsQ0FBQztJQUVoQyxhQUFhLEdBQVksS0FBSyxDQUFDO0lBQzlCLGtCQUFrQixHQUFXLENBQUMsQ0FBQztJQUMvQixjQUFjLEdBQVcsQ0FBQyxDQUFDO0lBRTNCLGFBQWEsR0FBVyxDQUFDLENBQUM7SUFDMUIsaUJBQWlCLEdBQTZCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFJN0QsV0FBVyxHQUFhLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztJQUV0RCxr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SyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FBQyxLQUFpQjtJQUN6RCxNQUFNLEtBQUssR0FDVCxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFM0YsT0FBTyxDQUNMLENBQUMsQ0FBQyxLQUFLO1FBQ1AsS0FBSyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQy9DLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNhblJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi9pLWNhbi1ydW4tb3V0c2lkZS1hbmd1bGFyJztcbmltcG9ydCB7XG4gIElNb3VzZUV2ZW50LFxuICBJUG9pbnRlckV2ZW50LFxuICBJUG9pbnRlclVwRXZlbnQsXG4gIElUb3VjaERvd25FdmVudCxcbiAgSVRvdWNoTW92ZUV2ZW50LFxufSBmcm9tICcuL3BvaW50ZXItZXZlbnRzJztcbmltcG9ydCB7IEV2ZW50RXh0ZW5zaW9ucyB9IGZyb20gJy4vZXZlbnQuZXh0ZW5zaW9ucyc7XG5cbmV4cG9ydCBjb25zdCBNT1VTRV9FVkVOVF9JR05PUkVfVElNRSA9IDgwMDtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgZHJhZyBhbmQgZHJvcCBmdW5jdGlvbmFsaXR5LlxuICogSXQgaGFuZGxlcyBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzLCBtYW5hZ2VzIHRoZSBkcmFnIHN0YXJ0IHNlcXVlbmNlLFxuICogYW5kIHByb3ZpZGVzIGFic3RyYWN0IG1ldGhvZHMgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBpbXBsZW1lbnQgc3BlY2lmaWMgYmVoYXZpb3JzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRHJhZ0FuZERyb3BCYXNlIHtcblxuICBwdWJsaWMgYWJzdHJhY3QgaG9zdEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgbW91c2VMaXN0ZW5lcnM6IEZ1bmN0aW9uID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgcHJpdmF0ZSB0b3VjaExpc3RlbmVyczogRnVuY3Rpb24gPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuXG4gIHByaXZhdGUgc3RhcnRMaXN0ZW5lcnM6IEZ1bmN0aW9uID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcblxuICBwdWJsaWMgaXNTeW50aGV0aWNFdmVudChldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMubGFzdFRvdWNoRXZlbnRUaW1lICYmXG4gICAgICAodGhpcy5sYXN0VG91Y2hFdmVudFRpbWUgKyBNT1VTRV9FVkVOVF9JR05PUkVfVElNRSA+IERhdGUubm93KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBsYXN0VG91Y2hFdmVudFRpbWU6IG51bWJlciA9IDA7XG5cbiAgcHVibGljIGlzRHJhZ1N0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkcmFnU3RhcnRUaHJlc2hvbGQ6IG51bWJlciA9IDM7XG4gIHByaXZhdGUgZHJhZ1N0YXJ0RGVsYXk6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBkcmFnU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIGRyYWdTdGFydFBvc2l0aW9uOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcblxuICBwdWJsaWMgYWJzdHJhY3QgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBtb3ZlSGFuZGxlcjogRnVuY3Rpb24gPSB0aGlzLmNoZWNrRHJhZ1NlcXVlbmNlVG9TdGFydDtcblxuICBwcml2YXRlIHBvaW50ZXJEb3duRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG5nWm9uZTogSUNhblJ1bk91dHNpZGVBbmd1bGFyIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBtb3VzZSBkb3duIGV2ZW50IHRvIGluaXRpYXRlIHRoZSBkcmFnIHNlcXVlbmNlLlxuICAgKiBJdCBjaGVja3MgaWYgdGhlIGV2ZW50IGlzIHN5bnRoZXRpYyBvciBmYWtlLCBhbmQgaWYgdGhlIGRyYWcgaXMgYWxyZWFkeSBzdGFydGVkLlxuICAgKiBJZiBub3QsIGl0IHNldHMgdXAgdGhlIGRyYWcgc3RhcnQgc2VxdWVuY2UgYnkgYWRkaW5nIG5lY2Vzc2FyeSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgZHJhZy5cbiAgICovXG4gIHByaXZhdGUgb25Nb3VzZURvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBpc1N5bnRoZXRpY0V2ZW50ID0gdGhpcy5pc1N5bnRoZXRpY0V2ZW50KGV2ZW50KTtcbiAgICBjb25zdCBpc0Zha2VFdmVudCA9IGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZlbnQpO1xuICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBuZXcgSU1vdXNlRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKGlzU3ludGhldGljRXZlbnQgfHwgaXNGYWtlRXZlbnQgfHwgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb2ludGVyRG93bkVsZW1lbnQgPSBtb3VzZUV2ZW50LnRhcmdldEVsZW1lbnQ7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5vblBvaW50ZXJEb3duKG1vdXNlRXZlbnQpO1xuICAgIGlmIChyZXN1bHQpIHtcblxuICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gPSBtb3VzZUV2ZW50LmdldFBvc2l0aW9uKCk7XG5cbiAgICAgIHRoaXMubmdab25lPy5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgdGhpcy5vblNlbGVjdFN0YXJ0LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwRXZlbnQpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5vblBvaW50ZXJVcEV2ZW50LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlQ2FwdHVyZUxpc3RlbmVyKCkpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMub25Db250ZXh0TWVudUR1cmluZ0RyYWcsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5tb3VzZUxpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCB0aGlzLm9uU2VsZWN0U3RhcnQsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXBFdmVudCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUG9pbnRlclVwRXZlbnQsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5vbkNvbnRleHRNZW51RHVyaW5nRHJhZywgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHRvdWNoIGRvd24gZXZlbnQgdG8gaW5pdGlhdGUgdGhlIGRyYWcgc2VxdWVuY2UuXG4gICAqIEl0IGNoZWNrcyBpZiB0aGUgZXZlbnQgaXMgc3ludGhldGljIG9yIGZha2UsIGFuZCBpZiB0aGUgZHJhZyBpcyBhbHJlYWR5IHN0YXJ0ZWQuXG4gICAqIElmIG5vdCwgaXQgc2V0cyB1cCB0aGUgZHJhZyBzdGFydCBzZXF1ZW5jZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHRvdWNoIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBkcmFnLlxuICAgKi9cbiAgcHJpdmF0ZSBvblRvdWNoRG93biA9IChldmVudDogVG91Y2hFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRmFrZUV2ZW50ID0gaXNGYWtlVG91Y2hzdGFydEZyb21TY3JlZW5SZWFkZXIoZXZlbnQgYXMgVG91Y2hFdmVudClcbiAgICBjb25zdCB0b3VjaEV2ZW50ID0gbmV3IElUb3VjaERvd25FdmVudChldmVudCk7XG5cbiAgICBpZiAoaXNGYWtlRXZlbnQgfHwgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb2ludGVyRG93bkVsZW1lbnQgPSB0b3VjaEV2ZW50LnRhcmdldEVsZW1lbnQ7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5vblBvaW50ZXJEb3duKHRvdWNoRXZlbnQpO1xuICAgIGlmIChyZXN1bHQpIHtcblxuICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gPSB0b3VjaEV2ZW50LmdldFBvc2l0aW9uKCk7XG5cbiAgICAgIHRoaXMubmdab25lPy5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgdGhpcy5vblNlbGVjdFN0YXJ0LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Ub3VjaE1vdmUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwRXZlbnQpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5vblBvaW50ZXJVcEV2ZW50LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlQ2FwdHVyZUxpc3RlbmVyKCkpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMub25Db250ZXh0TWVudUR1cmluZ0RyYWcsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy50b3VjaExpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCB0aGlzLm9uU2VsZWN0U3RhcnQsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXBFdmVudCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUG9pbnRlclVwRXZlbnQsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5vbkNvbnRleHRNZW51RHVyaW5nRHJhZywgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHNlbGVjdCBzdGFydCBldmVudC5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgc3RhcnRzIHNlbGVjdGluZyB0ZXh0IG9yIGVsZW1lbnRzLlxuICAgKiBJdCBwcmV2ZW50cyB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQgY2FsbHMgdGhlIG9uU2VsZWN0IG1ldGhvZCB0byBoYW5kbGUgdGhlIHNlbGVjdGlvbi5cbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBzZWxlY3Qgc3RhcnQuXG4gICAqL1xuICBwcml2YXRlIG9uU2VsZWN0U3RhcnQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgdGhpcy5vblNlbGVjdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgbW91c2UgbW92ZSBldmVudCBkdXJpbmcgdGhlIGRyYWcgc2VxdWVuY2UuXG4gICAqIEl0IGNoZWNrcyBpZiB0aGUgZHJhZyBzZXF1ZW5jZSBzaG91bGQgc3RhcnQgYW5kIGNhbGxzIHRoZSBtb3ZlIGhhbmRsZXIgYWNjb3JkaW5nbHkuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgbW92ZS5cbiAgICovXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICB0aGlzLm1vdmVIYW5kbGVyKG5ldyBJTW91c2VFdmVudChldmVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHRvdWNoIG1vdmUgZXZlbnQgZHVyaW5nIHRoZSBkcmFnIHNlcXVlbmNlLlxuICAgKiBJdCBjaGVja3MgaWYgdGhlIGRyYWcgc2VxdWVuY2Ugc2hvdWxkIHN0YXJ0IGFuZCBjYWxscyB0aGUgbW92ZSBoYW5kbGVyIGFjY29yZGluZ2x5LlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgdG91Y2ggZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIG1vdmUuXG4gICAqL1xuICBwcml2YXRlIG9uVG91Y2hNb3ZlID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgdGhpcy5tb3ZlSGFuZGxlcihuZXcgSVRvdWNoTW92ZUV2ZW50KGV2ZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBkcmFnIHNlcXVlbmNlIHNob3VsZCBzdGFydCBiYXNlZCBvbiB0aGUgcG9pbnRlciBwb3NpdGlvbi5cbiAgICogSXQgY29tcGFyZXMgdGhlIGN1cnJlbnQgcG9pbnRlciBwb3NpdGlvbiB3aXRoIHRoZSBpbml0aWFsIGRyYWcgc3RhcnQgcG9zaXRpb25cbiAgICogYW5kIGNoZWNrcyBpZiB0aGUgZGlzdGFuY2UgZXhjZWVkcyB0aGUgZHJhZyBzdGFydCB0aHJlc2hvbGQuXG4gICAqIElmIHRoZSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQgYW5kIHRoZSBkZWxheSBoYXMgcGFzc2VkLFxuICAgKiBpdCBwcmVwYXJlcyB0aGUgZHJhZyBzZXF1ZW5jZSBhbmQgc2V0cyB0aGUgbW92ZSBoYW5kbGVyIHRvIG9uUG9pbnRlck1vdmUuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBwb2ludGVyIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tEcmFnU2VxdWVuY2VUb1N0YXJ0KGV2ZW50OiBJUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcG9pbnRlclBvc2l0aW9uID0gZXZlbnQuZ2V0UG9zaXRpb24oKTtcblxuICAgIGlmICghdGhpcy5pc0RyYWdTdGFydGVkICYmIHRoaXMucG9pbnRlckRvd25FbGVtZW50KSB7XG4gICAgICBldmVudC5zZXRUYXJnZXQodGhpcy5wb2ludGVyRG93bkVsZW1lbnQpO1xuICAgICAgY29uc3QgZGlzdGFuY2VYID0gTWF0aC5hYnMocG9pbnRlclBvc2l0aW9uLnggLSB0aGlzLmRyYWdTdGFydFBvc2l0aW9uLngpO1xuICAgICAgY29uc3QgZGlzdGFuY2VZID0gTWF0aC5hYnMocG9pbnRlclBvc2l0aW9uLnkgLSB0aGlzLmRyYWdTdGFydFBvc2l0aW9uLnkpO1xuICAgICAgY29uc3QgaXNPdmVyVGhyZXNob2xkID0gZGlzdGFuY2VYICsgZGlzdGFuY2VZID49IHRoaXMuZHJhZ1N0YXJ0VGhyZXNob2xkO1xuXG4gICAgICBpZiAoaXNPdmVyVGhyZXNob2xkKSB7XG4gICAgICAgIGNvbnN0IGlzRGVsYXlFbGFwc2VkID0gRGF0ZS5ub3coKSA+PSB0aGlzLmRyYWdTdGFydFRpbWUgKyB0aGlzLmRyYWdTdGFydERlbGF5O1xuXG4gICAgICAgIGlmICghaXNEZWxheUVsYXBzZWQpIHtcbiAgICAgICAgICB0aGlzLmVuZERyYWdTZXF1ZW5jZSgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlRHJhZ1NlcXVlbmNlKGV2ZW50KTtcbiAgICAgICAgdGhpcy5pc0RyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5tb3ZlSGFuZGxlciA9IHRoaXMub25Qb2ludGVyTW92ZTtcbiAgICAgICAgaWYgKGlzVG91Y2hFdmVudChldmVudC5vcmlnaW5hbEV2ZW50KSkge1xuICAgICAgICAgIHRoaXMubGFzdFRvdWNoRXZlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyB0aGUgZHJhZyBzZXF1ZW5jZSBieSBzZXR0aW5nIHVwIG5lY2Vzc2FyeSBldmVudCBsaXN0ZW5lcnNcbiAgICogYW5kIGluaXRpYWxpemluZyBhbnkgcmVxdWlyZWQgc3RhdGUgZm9yIHRoZSBkcmFnIG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3NlcyB0byBkZWZpbmUgc3BlY2lmaWMgZHJhZyBiZWhhdmlvci5cbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHBvaW50ZXIgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHByZXBhcmF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHByZXBhcmVEcmFnU2VxdWVuY2UoZXZlbnQ6IElQb2ludGVyRXZlbnQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBwb2ludGVyIHVwIGV2ZW50IGF0IHRoZSBlbmQgb2YgdGhlIGRyYWcgc2VxdWVuY2UuXG4gICAqIEl0IGNoZWNrcyBpZiB0aGUgZHJhZyBoYXMgc3RhcnRlZCBhbmQgY2FsbHMgdGhlIG9uUG9pbnRlclVwIG1ldGhvZC5cbiAgICogSXQgYWxzbyBlbmRzIHRoZSBkcmFnIHNlcXVlbmNlIGJ5IHJlc2V0dGluZyB0aGUgc3RhdGUgYW5kIHJlbW92aW5nIGV2ZW50IGxpc3RlbmVycy5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlIG1vdXNlIGJ1dHRvbiBvciBsaWZ0cyB0aGVpciBmaW5nZXIgZnJvbSB0aGUgdG91Y2ggc2NyZWVuLlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgcG9pbnRlciBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgdXAgYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBvblBvaW50ZXJVcEV2ZW50ID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICBpZiAodGhpcy5pc0RyYWdTdGFydGVkKSB7XG4gICAgICB0aGlzLm9uUG9pbnRlclVwKG5ldyBJUG9pbnRlclVwRXZlbnQoZXZlbnQpKTtcbiAgICB9XG4gICAgdGhpcy5lbmREcmFnU2VxdWVuY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmRzIHRoZSBkcmFnIHNlcXVlbmNlIGJ5IHJlc2V0dGluZyB0aGUgc3RhdGUgYW5kIHJlbW92aW5nIGV2ZW50IGxpc3RlbmVycy5cbiAgICogSXQgc2V0cyB0aGUgaXNEcmFnU3RhcnRlZCBmbGFnIHRvIGZhbHNlLCBjbGVhcnMgdGhlIHBvaW50ZXJEb3duRWxlbWVudCxcbiAgICogYW5kIHJlc2V0cyB0aGUgbW92ZUhhbmRsZXIgdG8gY2hlY2tEcmFnU2VxdWVuY2VUb1N0YXJ0LlxuICAgKiBJdCBhbHNvIHJlbW92ZXMgYWxsIG1vdXNlIGFuZCB0b3VjaCBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkIGR1cmluZyB0aGUgZHJhZyBzZXF1ZW5jZS5cbiAgICovXG4gIHByaXZhdGUgZW5kRHJhZ1NlcXVlbmNlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMucG9pbnRlckRvd25FbGVtZW50ID0gbnVsbDtcblxuICAgIHRoaXMubW92ZUhhbmRsZXIgPSB0aGlzLmNoZWNrRHJhZ1NlcXVlbmNlVG9TdGFydDtcbiAgICB0aGlzLm1vdXNlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5tb3VzZUxpc3RlbmVycyA9IEV2ZW50RXh0ZW5zaW9ucy5lbXB0eUxpc3RlbmVyKCk7XG4gICAgdGhpcy50b3VjaExpc3RlbmVycygpO1xuICAgIHRoaXMudG91Y2hMaXN0ZW5lcnMgPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuICAgIHRoaXMuZmluYWxpemVEcmFnU2VxdWVuY2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBmaW5hbGl6ZURyYWdTZXF1ZW5jZSgpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBvblNlbGVjdChldmVudDogRXZlbnQpOiB2b2lkO1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBvblBvaW50ZXJEb3duKGV2ZW50OiBJUG9pbnRlckV2ZW50KTogYm9vbGVhbjtcblxuICBwdWJsaWMgYWJzdHJhY3Qgb25Qb2ludGVyTW92ZShldmVudDogSVBvaW50ZXJFdmVudCk6IHZvaWQ7XG5cbiAgcHVibGljIGFic3RyYWN0IG9uUG9pbnRlclVwKGV2ZW50OiBJUG9pbnRlckV2ZW50KTogdm9pZDtcblxuICBwdWJsaWMgc3Vic2NyaWJlKGZEb2N1bWVudDogRG9jdW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kb2N1bWVudCkge1xuICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmRvY3VtZW50ID0gZkRvY3VtZW50O1xuXG4gICAgdGhpcy5uZ1pvbmU/LnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duLCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICBmRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaERvd24sIEV2ZW50RXh0ZW5zaW9ucy5wYXNzaXZlTGlzdGVuZXIoKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXJ0TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgZkRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd24sIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgIGZEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vblRvdWNoRG93biwgRXZlbnRFeHRlbnNpb25zLnBhc3NpdmVMaXN0ZW5lcigpKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuXG4gICAgdGhpcy5zdGFydExpc3RlbmVycygpO1xuICAgIHRoaXMuc3RhcnRMaXN0ZW5lcnMgPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuICAgIHRoaXMudG91Y2hMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnRvdWNoTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgICB0aGlzLm1vdXNlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5tb3VzZUxpc3RlbmVycyA9IEV2ZW50RXh0ZW5zaW9ucy5lbXB0eUxpc3RlbmVyKCk7XG4gIH1cblxuICBwcml2YXRlIG9uQ29udGV4dE1lbnVEdXJpbmdEcmFnID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMuaXNEcmFnU3RhcnRlZCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNUb3VjaEV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IGV2ZW50IGlzIFRvdWNoRXZlbnQge1xuICByZXR1cm4gZXZlbnQudHlwZVswXSA9PT0gJ3QnO1xufVxuXG5mdW5jdGlvbiBpc0Zha2VNb3VzZWRvd25Gcm9tU2NyZWVuUmVhZGVyKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiBldmVudC5idXR0b25zID09PSAwIHx8IChldmVudC5vZmZzZXRYID09PSAwICYmIGV2ZW50Lm9mZnNldFkgPT09IDApO1xufVxuXG5mdW5jdGlvbiBpc0Zha2VUb3VjaHN0YXJ0RnJvbVNjcmVlblJlYWRlcihldmVudDogVG91Y2hFdmVudCk6IGJvb2xlYW4ge1xuICBjb25zdCB0b3VjaDogVG91Y2ggfCB1bmRlZmluZWQgPVxuICAgIChldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXNbMF0pIHx8IChldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSk7XG5cbiAgcmV0dXJuIChcbiAgICAhIXRvdWNoICYmXG4gICAgdG91Y2guaWRlbnRpZmllciA9PT0gLTEgJiZcbiAgICAodG91Y2gucmFkaXVzWCA9PSBudWxsIHx8IHRvdWNoLnJhZGl1c1ggPT09IDEpICYmXG4gICAgKHRvdWNoLnJhZGl1c1kgPT0gbnVsbCB8fCB0b3VjaC5yYWRpdXNZID09PSAxKVxuICApO1xufVxuIl19
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1hbmQtZHJvcC1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9kcmFnLXRvb2xraXQvZHJhZy1hbmQtZHJvcC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxXQUFXLEVBRVgsZUFBZSxFQUNmLGVBQWUsRUFDZixlQUFlLEdBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sT0FBZ0IsZUFBZTtJQUNsQixTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFdEQsZUFBZSxHQUFHLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNsRCxlQUFlLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBRWxELGVBQWUsR0FBRyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFFbkQsZ0JBQWdCLENBQUMsTUFBa0I7UUFDeEMsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixHQUFHLHVCQUF1QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDOUYsQ0FBQztJQUNKLENBQUM7SUFFTyxtQkFBbUIsR0FBVyxDQUFDLENBQUM7SUFFakMsYUFBYSxHQUFZLEtBQUssQ0FBQztJQUM5QixtQkFBbUIs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LEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FBQyxLQUFpQjtJQUN6RCxNQUFNLEtBQUssR0FDVCxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFM0YsT0FBTyxDQUNMLENBQUMsQ0FBQyxLQUFLO1FBQ1AsS0FBSyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQy9DLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSU1vdXNlRXZlbnQsXG4gIElQb2ludGVyRXZlbnQsXG4gIElQb2ludGVyVXBFdmVudCxcbiAgSVRvdWNoRG93bkV2ZW50LFxuICBJVG91Y2hNb3ZlRXZlbnQsXG59IGZyb20gJy4vcG9pbnRlci1ldmVudHMnO1xuaW1wb3J0IHsgRXZlbnRFeHRlbnNpb25zIH0gZnJvbSAnLi9ldmVudC5leHRlbnNpb25zJztcbmltcG9ydCB7IGluamVjdCwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmV4cG9ydCBjb25zdCBNT1VTRV9FVkVOVF9JR05PUkVfVElNRSA9IDgwMDtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgZHJhZyBhbmQgZHJvcCBmdW5jdGlvbmFsaXR5LlxuICogSXQgaGFuZGxlcyBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzLCBtYW5hZ2VzIHRoZSBkcmFnIHN0YXJ0IHNlcXVlbmNlLFxuICogYW5kIHByb3ZpZGVzIGFic3RyYWN0IG1ldGhvZHMgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBpbXBsZW1lbnQgc3BlY2lmaWMgYmVoYXZpb3JzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRHJhZ0FuZERyb3BCYXNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9uZ1pvbmUgPSBpbmplY3QoTmdab25lLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHByaXZhdGUgX21vdXNlTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgcHJpdmF0ZSBfdG91Y2hMaXN0ZW5lcnMgPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuXG4gIHByaXZhdGUgX3N0YXJ0TGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcblxuICBwdWJsaWMgaXNTeW50aGV0aWNFdmVudChfZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLl9sYXN0VG91Y2hFdmVudFRpbWUgJiYgdGhpcy5fbGFzdFRvdWNoRXZlbnRUaW1lICsgTU9VU0VfRVZFTlRfSUdOT1JFX1RJTUUgPiBEYXRlLm5vdygpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xhc3RUb3VjaEV2ZW50VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgaXNEcmFnU3RhcnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9kcmFnU3RhcnRUaHJlc2hvbGQ6IG51bWJlciA9IDM7XG4gIHByaXZhdGUgX2RyYWdTdGFydERlbGF5OiBudW1iZXIgPSAwO1xuXG4gIHByaXZhdGUgX2RyYWdTdGFydFRpbWU6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2RyYWdTdGFydFBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcblxuICBwdWJsaWMgYWJzdHJhY3QgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfbW92ZUhhbmRsZXIgPSB0aGlzLl9jaGVja0RyYWdTZXF1ZW5jZVRvU3RhcnQ7XG5cbiAgcHJpdmF0ZSBfcG9pbnRlckRvd25FbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBtb3VzZSBkb3duIGV2ZW50IHRvIGluaXRpYXRlIHRoZSBkcmFnIHNlcXVlbmNlLlxuICAgKiBJdCBjaGVja3MgaWYgdGhlIGV2ZW50IGlzIHN5bnRoZXRpYyBvciBmYWtlLCBhbmQgaWYgdGhlIGRyYWcgaXMgYWxyZWFkeSBzdGFydGVkLlxuICAgKiBJZiBub3QsIGl0IHNldHMgdXAgdGhlIGRyYWcgc3RhcnQgc2VxdWVuY2UgYnkgYWRkaW5nIG5lY2Vzc2FyeSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgZHJhZy5cbiAgICovXG4gIHByaXZhdGUgX29uTW91c2VEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNTeW50aGV0aWNFdmVudCA9IHRoaXMuaXNTeW50aGV0aWNFdmVudChldmVudCk7XG4gICAgY29uc3QgaXNGYWtlRXZlbnQgPSBpc0Zha2VNb3VzZWRvd25Gcm9tU2NyZWVuUmVhZGVyKGV2ZW50KTtcbiAgICBjb25zdCBtb3VzZUV2ZW50ID0gbmV3IElNb3VzZUV2ZW50KGV2ZW50KTtcblxuICAgIGlmIChpc1N5bnRoZXRpY0V2ZW50IHx8IGlzRmFrZUV2ZW50IHx8IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5pc0RyYWdTdGFydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3BvaW50ZXJEb3duRWxlbWVudCA9IG1vdXNlRXZlbnQudGFyZ2V0RWxlbWVudDtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLm9uUG9pbnRlckRvd24obW91c2VFdmVudCk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgdGhpcy5fZHJhZ1N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICB0aGlzLl9kcmFnU3RhcnRQb3NpdGlvbiA9IG1vdXNlRXZlbnQuZ2V0UG9zaXRpb24oKTtcblxuICAgICAgdGhpcy5fbmdab25lPy5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xpc3Rlbignc2VsZWN0c3RhcnQnLCB0aGlzLl9vblNlbGVjdFN0YXJ0LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuX2xpc3RlbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUpO1xuICAgICAgICB0aGlzLl9saXN0ZW4oJ3BvaW50ZXJ1cCcsIHRoaXMuX29uUG9pbnRlclVwRXZlbnQpO1xuICAgICAgICB0aGlzLl9saXN0ZW4oXG4gICAgICAgICAgJ3BvaW50ZXJjYW5jZWwnLFxuICAgICAgICAgIHRoaXMuX29uUG9pbnRlclVwRXZlbnQsXG4gICAgICAgICAgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9saXN0ZW4oXG4gICAgICAgICAgJ2NvbnRleHRtZW51JyxcbiAgICAgICAgICB0aGlzLl9wcmV2ZW50RHVyaW5nRHJhZyxcbiAgICAgICAgICBFdmVudEV4dGVuc2lvbnMuYWN0aXZlQ2FwdHVyZUxpc3RlbmVyKCksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fbW91c2VMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VubGlzdGVuKCdzZWxlY3RzdGFydCcsIHRoaXMuX29uU2VsZWN0U3RhcnQsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgICAgdGhpcy5fdW5saXN0ZW4oJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlKTtcbiAgICAgICAgdGhpcy5fdW5saXN0ZW4oJ3BvaW50ZXJ1cCcsIHRoaXMuX29uUG9pbnRlclVwRXZlbnQpO1xuICAgICAgICB0aGlzLl91bmxpc3RlbihcbiAgICAgICAgICAncG9pbnRlcmNhbmNlbCcsXG4gICAgICAgICAgdGhpcy5fb25Qb2ludGVyVXBFdmVudCxcbiAgICAgICAgICBFdmVudEV4dGVuc2lvbnMuYWN0aXZlQ2FwdHVyZUxpc3RlbmVyKCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3VubGlzdGVuKFxuICAgICAgICAgICdjb250ZXh0bWVudScsXG4gICAgICAgICAgdGhpcy5fcHJldmVudER1cmluZ0RyYWcsXG4gICAgICAgICAgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHRvdWNoIGRvd24gZXZlbnQgdG8gaW5pdGlhdGUgdGhlIGRyYWcgc2VxdWVuY2UuXG4gICAqIEl0IGNoZWNrcyBpZiB0aGUgZXZlbnQgaXMgc3ludGhldGljIG9yIGZha2UsIGFuZCBpZiB0aGUgZHJhZyBpcyBhbHJlYWR5IHN0YXJ0ZWQuXG4gICAqIElmIG5vdCwgaXQgc2V0cyB1cCB0aGUgZHJhZyBzdGFydCBzZXF1ZW5jZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHRvdWNoIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBkcmFnLlxuICAgKi9cbiAgcHJpdmF0ZSBfb25Ub3VjaERvd24gPSAoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHtcbiAgICBjb25zdCBpc0Zha2VFdmVudCA9IGlzRmFrZVRvdWNoc3RhcnRGcm9tU2NyZWVuUmVhZGVyKGV2ZW50IGFzIFRvdWNoRXZlbnQpO1xuICAgIGNvbnN0IHRvdWNoRXZlbnQgPSBuZXcgSVRvdWNoRG93bkV2ZW50KGV2ZW50KTtcblxuICAgIGlmIChpc0Zha2VFdmVudCB8fCB0aGlzLmRpc2FibGVkIHx8IHRoaXMuaXNEcmFnU3RhcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9wb2ludGVyRG93bkVsZW1lbnQgPSB0b3VjaEV2ZW50LnRhcmdldEVsZW1lbnQ7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5vblBvaW50ZXJEb3duKHRvdWNoRXZlbnQpO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHRoaXMuX2RyYWdTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgdGhpcy5fZHJhZ1N0YXJ0UG9zaXRpb24gPSB0b3VjaEV2ZW50LmdldFBvc2l0aW9uKCk7XG5cbiAgICAgIHRoaXMuX25nWm9uZT8ucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLl9saXN0ZW4oJ3NlbGVjdHN0YXJ0JywgdGhpcy5fb25TZWxlY3RTdGFydCwgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUxpc3RlbmVyKCkpO1xuICAgICAgICB0aGlzLl9saXN0ZW4oJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuKCdwb2ludGVydXAnLCB0aGlzLl9vblBvaW50ZXJVcEV2ZW50KTtcbiAgICAgICAgdGhpcy5fbGlzdGVuKFxuICAgICAgICAgICdwb2ludGVyY2FuY2VsJyxcbiAgICAgICAgICB0aGlzLl9vblBvaW50ZXJVcEV2ZW50LFxuICAgICAgICAgIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuKFxuICAgICAgICAgICdjb250ZXh0bWVudScsXG4gICAgICAgICAgdGhpcy5fcHJldmVudER1cmluZ0RyYWcsXG4gICAgICAgICAgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3RvdWNoTGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgICB0aGlzLl91bmxpc3Rlbignc2VsZWN0c3RhcnQnLCB0aGlzLl9vblNlbGVjdFN0YXJ0LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuX3VubGlzdGVuKCd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICAgIHRoaXMuX3VubGlzdGVuKCdwb2ludGVydXAnLCB0aGlzLl9vblBvaW50ZXJVcEV2ZW50KTtcbiAgICAgICAgdGhpcy5fdW5saXN0ZW4oXG4gICAgICAgICAgJ3BvaW50ZXJjYW5jZWwnLFxuICAgICAgICAgIHRoaXMuX29uUG9pbnRlclVwRXZlbnQsXG4gICAgICAgICAgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl91bmxpc3RlbihcbiAgICAgICAgICAnY29udGV4dG1lbnUnLFxuICAgICAgICAgIHRoaXMuX3ByZXZlbnREdXJpbmdEcmFnLFxuICAgICAgICAgIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSxcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBzZWxlY3Qgc3RhcnQgZXZlbnQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHN0YXJ0cyBzZWxlY3RpbmcgdGV4dCBvciBlbGVtZW50cy5cbiAgICogSXQgcHJldmVudHMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kIGNhbGxzIHRoZSBvblNlbGVjdCBtZXRob2QgdG8gaGFuZGxlIHRoZSBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgc2VsZWN0IHN0YXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSBfb25TZWxlY3RTdGFydCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICB0aGlzLm9uU2VsZWN0KGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgbW91c2UgbW92ZSBldmVudCBkdXJpbmcgdGhlIGRyYWcgc2VxdWVuY2UuXG4gICAqIEl0IGNoZWNrcyBpZiB0aGUgZHJhZyBzZXF1ZW5jZSBzaG91bGQgc3RhcnQgYW5kIGNhbGxzIHRoZSBtb3ZlIGhhbmRsZXIgYWNjb3JkaW5nbHkuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgbW92ZS5cbiAgICovXG4gIHByaXZhdGUgX29uTW91c2VNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgdGhpcy5fbW92ZUhhbmRsZXIobmV3IElNb3VzZUV2ZW50KGV2ZW50KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHRvdWNoIG1vdmUgZXZlbnQgZHVyaW5nIHRoZSBkcmFnIHNlcXVlbmNlLlxuICAgKiBJdCBjaGVja3MgaWYgdGhlIGRyYWcgc2VxdWVuY2Ugc2hvdWxkIHN0YXJ0IGFuZCBjYWxscyB0aGUgbW92ZSBoYW5kbGVyIGFjY29yZGluZ2x5LlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgdG91Y2ggZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIG1vdmUuXG4gICAqL1xuICBwcml2YXRlIF9vblRvdWNoTW92ZSA9IChldmVudDogVG91Y2hFdmVudCkgPT4ge1xuICAgIHRoaXMuX21vdmVIYW5kbGVyKG5ldyBJVG91Y2hNb3ZlRXZlbnQoZXZlbnQpKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBkcmFnIHNlcXVlbmNlIHNob3VsZCBzdGFydCBiYXNlZCBvbiB0aGUgcG9pbnRlciBwb3NpdGlvbi5cbiAgICogSXQgY29tcGFyZXMgdGhlIGN1cnJlbnQgcG9pbnRlciBwb3NpdGlvbiB3aXRoIHRoZSBpbml0aWFsIGRyYWcgc3RhcnQgcG9zaXRpb25cbiAgICogYW5kIGNoZWNrcyBpZiB0aGUgZGlzdGFuY2UgZXhjZWVkcyB0aGUgZHJhZyBzdGFydCB0aHJlc2hvbGQuXG4gICAqIElmIHRoZSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQgYW5kIHRoZSBkZWxheSBoYXMgcGFzc2VkLFxuICAgKiBpdCBwcmVwYXJlcyB0aGUgZHJhZyBzZXF1ZW5jZSBhbmQgc2V0cyB0aGUgbW92ZSBoYW5kbGVyIHRvIG9uUG9pbnRlck1vdmUuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBwb2ludGVyIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgX2NoZWNrRHJhZ1NlcXVlbmNlVG9TdGFydChldmVudDogSVBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHBvaW50ZXJQb3NpdGlvbiA9IGV2ZW50LmdldFBvc2l0aW9uKCk7XG5cbiAgICBpZiAoIXRoaXMuaXNEcmFnU3RhcnRlZCAmJiB0aGlzLl9wb2ludGVyRG93bkVsZW1lbnQpIHtcbiAgICAgIGV2ZW50LnNldFRhcmdldCh0aGlzLl9wb2ludGVyRG93bkVsZW1lbnQpO1xuICAgICAgY29uc3QgZGlzdGFuY2VYID0gTWF0aC5hYnMocG9pbnRlclBvc2l0aW9uLnggLSB0aGlzLl9kcmFnU3RhcnRQb3NpdGlvbi54KTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlWSA9IE1hdGguYWJzKHBvaW50ZXJQb3NpdGlvbi55IC0gdGhpcy5fZHJhZ1N0YXJ0UG9zaXRpb24ueSk7XG4gICAgICBjb25zdCBpc092ZXJUaHJlc2hvbGQgPSBkaXN0YW5jZVggKyBkaXN0YW5jZVkgPj0gdGhpcy5fZHJhZ1N0YXJ0VGhyZXNob2xkO1xuXG4gICAgICBpZiAoaXNPdmVyVGhyZXNob2xkKSB7XG4gICAgICAgIGNvbnN0IGlzRGVsYXlFbGFwc2VkID0gRGF0ZS5ub3coKSA+PSB0aGlzLl9kcmFnU3RhcnRUaW1lICsgdGhpcy5fZHJhZ1N0YXJ0RGVsYXk7XG5cbiAgICAgICAgaWYgKCFpc0RlbGF5RWxhcHNlZCkge1xuICAgICAgICAgIHRoaXMuX2VuZERyYWdTZXF1ZW5jZSgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlRHJhZ1NlcXVlbmNlKGV2ZW50KTtcbiAgICAgICAgdGhpcy5pc0RyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbW92ZUhhbmRsZXIgPSB0aGlzLm9uUG9pbnRlck1vdmU7XG4gICAgICAgIGlmIChpc1RvdWNoRXZlbnQoZXZlbnQub3JpZ2luYWxFdmVudCkpIHtcbiAgICAgICAgICB0aGlzLl9sYXN0VG91Y2hFdmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIHRoZSBkcmFnIHNlcXVlbmNlIGJ5IHNldHRpbmcgdXAgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVyc1xuICAgKiBhbmQgaW5pdGlhbGl6aW5nIGFueSByZXF1aXJlZCBzdGF0ZSBmb3IgdGhlIGRyYWcgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzIHRvIGRlZmluZSBzcGVjaWZpYyBkcmFnIGJlaGF2aW9yLlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgcG9pbnRlciBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgcHJlcGFyYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcHJlcGFyZURyYWdTZXF1ZW5jZShldmVudDogSVBvaW50ZXJFdmVudCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHBvaW50ZXIgdXAgZXZlbnQgYXQgdGhlIGVuZCBvZiB0aGUgZHJhZyBzZXF1ZW5jZS5cbiAgICogSXQgY2hlY2tzIGlmIHRoZSBkcmFnIGhhcyBzdGFydGVkIGFuZCBjYWxscyB0aGUgb25Qb2ludGVyVXAgbWV0aG9kLlxuICAgKiBJdCBhbHNvIGVuZHMgdGhlIGRyYWcgc2VxdWVuY2UgYnkgcmVzZXR0aW5nIHRoZSBzdGF0ZSBhbmQgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgbW91c2UgYnV0dG9uIG9yIGxpZnRzIHRoZWlyIGZpbmdlciBmcm9tIHRoZSB0b3VjaCBzY3JlZW4uXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBwb2ludGVyIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSB1cCBhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIF9vblBvaW50ZXJVcEV2ZW50ID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICBpZiAodGhpcy5pc0RyYWdTdGFydGVkKSB7XG4gICAgICB0aGlzLm9uUG9pbnRlclVwKG5ldyBJUG9pbnRlclVwRXZlbnQoZXZlbnQpKTtcbiAgICB9XG4gICAgdGhpcy5fZW5kRHJhZ1NlcXVlbmNlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuZHMgdGhlIGRyYWcgc2VxdWVuY2UgYnkgcmVzZXR0aW5nIHRoZSBzdGF0ZSBhbmQgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBJdCBzZXRzIHRoZSBpc0RyYWdTdGFydGVkIGZsYWcgdG8gZmFsc2UsIGNsZWFycyB0aGUgcG9pbnRlckRvd25FbGVtZW50LFxuICAgKiBhbmQgcmVzZXRzIHRoZSBtb3ZlSGFuZGxlciB0byBjaGVja0RyYWdTZXF1ZW5jZVRvU3RhcnQuXG4gICAqIEl0IGFsc28gcmVtb3ZlcyBhbGwgbW91c2UgYW5kIHRvdWNoIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQgZHVyaW5nIHRoZSBkcmFnIHNlcXVlbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kRHJhZ1NlcXVlbmNlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3BvaW50ZXJEb3duRWxlbWVudCA9IG51bGw7XG5cbiAgICB0aGlzLl9tb3ZlSGFuZGxlciA9IHRoaXMuX2NoZWNrRHJhZ1NlcXVlbmNlVG9TdGFydDtcbiAgICB0aGlzLl9tb3VzZUxpc3RlbmVycygpO1xuICAgIHRoaXMuX21vdXNlTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgICB0aGlzLl90b3VjaExpc3RlbmVycygpO1xuICAgIHRoaXMuX3RvdWNoTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgICB0aGlzLmZpbmFsaXplRHJhZ1NlcXVlbmNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZmluYWxpemVEcmFnU2VxdWVuY2UoKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25TZWxlY3QoZXZlbnQ6IEV2ZW50KTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25Qb2ludGVyRG93bihldmVudDogSVBvaW50ZXJFdmVudCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG9uUG9pbnRlck1vdmUoZXZlbnQ6IElQb2ludGVyRXZlbnQpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBvblBvaW50ZXJVcChldmVudDogSVBvaW50ZXJFdmVudCk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIHN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLl9uZ1pvbmU/LnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX2xpc3RlbignbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24sIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgIHRoaXMuX2xpc3RlbigndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hEb3duLCBFdmVudEV4dGVuc2lvbnMucGFzc2l2ZUxpc3RlbmVyKCkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc3RhcnRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgICB0aGlzLl91bmxpc3RlbignbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24sIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgIHRoaXMuX3VubGlzdGVuKCd0b3VjaHN0YXJ0JywgdGhpcy5fb25Ub3VjaERvd24sIEV2ZW50RXh0ZW5zaW9ucy5wYXNzaXZlTGlzdGVuZXIoKSk7XG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGFydExpc3RlbmVycygpO1xuICAgIHRoaXMuX3N0YXJ0TGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgICB0aGlzLl90b3VjaExpc3RlbmVycygpO1xuICAgIHRoaXMuX3RvdWNoTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgICB0aGlzLl9tb3VzZUxpc3RlbmVycygpO1xuICAgIHRoaXMuX21vdXNlTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbjxLIGV4dGVuZHMga2V5b2YgRG9jdW1lbnRFdmVudE1hcD4oXG4gICAgdHlwZTogSyxcbiAgICBsaXN0ZW5lcjogKHRoaXM6IERvY3VtZW50LCBldjogRG9jdW1lbnRFdmVudE1hcFtLXSkgPT4gdW5rbm93bixcbiAgICBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VubGlzdGVuPEsgZXh0ZW5kcyBrZXlvZiBEb2N1bWVudEV2ZW50TWFwPihcbiAgICB0eXBlOiBLLFxuICAgIGxpc3RlbmVyOiAodGhpczogRG9jdW1lbnQsIGV2OiBEb2N1bWVudEV2ZW50TWFwW0tdKSA9PiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJldmVudER1cmluZ0RyYWcgPSAoZTogRXZlbnQpID0+IHtcbiAgICBpZiAodGhpcy5pc0RyYWdTdGFydGVkKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpc1RvdWNoRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogZXZlbnQgaXMgVG91Y2hFdmVudCB7XG4gIHJldHVybiBldmVudC50eXBlWzBdID09PSAndCc7XG59XG5cbmZ1bmN0aW9uIGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV2ZW50LmJ1dHRvbnMgPT09IDAgfHwgKGV2ZW50Lm9mZnNldFggPT09IDAgJiYgZXZlbnQub2Zmc2V0WSA9PT0gMCk7XG59XG5cbmZ1bmN0aW9uIGlzRmFrZVRvdWNoc3RhcnRGcm9tU2NyZWVuUmVhZGVyKGV2ZW50OiBUb3VjaEV2ZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IHRvdWNoOiBUb3VjaCB8IHVuZGVmaW5lZCA9XG4gICAgKGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlc1swXSkgfHwgKGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKTtcblxuICByZXR1cm4gKFxuICAgICEhdG91Y2ggJiZcbiAgICB0b3VjaC5pZGVudGlmaWVyID09PSAtMSAmJlxuICAgICh0b3VjaC5yYWRpdXNYID09IG51bGwgfHwgdG91Y2gucmFkaXVzWCA9PT0gMSkgJiZcbiAgICAodG91Y2gucmFkaXVzWSA9PSBudWxsIHx8IHRvdWNoLnJhZGl1c1kgPT09IDEpXG4gICk7XG59XG4iXX0=
|