@limble/limble-tree 0.12.4 → 0.13.0

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.
Files changed (45) hide show
  1. package/README.md +149 -149
  2. package/{esm2015/lib/classes/Branch.js → esm2020/lib/classes/Branch.mjs} +1 -1
  3. package/{esm2015/lib/classes/DropZone.js → esm2020/lib/classes/DropZone.mjs} +1 -1
  4. package/{esm2015/lib/classes/DropZoneLocation.js → esm2020/lib/classes/DropZoneLocation.mjs} +1 -1
  5. package/{esm2015/lib/custom-event-bindings/dragleave-no-change-detect.directive.js → esm2020/lib/custom-event-bindings/dragleave-no-change-detect.directive.mjs} +0 -0
  6. package/{esm2015/lib/custom-event-bindings/dragover-no-change-detect.directive.js → esm2020/lib/custom-event-bindings/dragover-no-change-detect.directive.mjs} +1 -1
  7. package/esm2020/lib/drop-zone/drop-zone.component.mjs +75 -0
  8. package/esm2020/lib/limble-tree-branch/limble-tree-branch.component.mjs +110 -0
  9. package/esm2020/lib/limble-tree-node/limble-tree-node.component.mjs +467 -0
  10. package/{esm2015/lib/limble-tree-placeholder/limble-tree-placeholder.component.js → esm2020/lib/limble-tree-placeholder/limble-tree-placeholder.component.mjs} +3 -8
  11. package/esm2020/lib/limble-tree-root/drop-zone.service.mjs +376 -0
  12. package/esm2020/lib/limble-tree-root/limble-tree-root.component.mjs +172 -0
  13. package/{esm2015/lib/limble-tree-root/tree-construction-status.service.js → esm2020/lib/limble-tree-root/tree-construction-status.service.mjs} +1 -1
  14. package/esm2020/lib/limble-tree-root/tree.service.mjs +297 -0
  15. package/{esm2015/lib/limble-tree.module.js → esm2020/lib/limble-tree.module.mjs} +5 -5
  16. package/{esm2015/lib/singletons/component-creator.service.js → esm2020/lib/singletons/component-creator.service.mjs} +1 -1
  17. package/esm2020/lib/singletons/drag-state.service.mjs +63 -0
  18. package/esm2020/lib/singletons/global-events.service.mjs +136 -0
  19. package/{esm2015/lib/util.js → esm2020/lib/util.mjs} +1 -1
  20. package/{esm2015/limble-limble-tree.js → esm2020/limble-limble-tree.mjs} +0 -0
  21. package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
  22. package/fesm2015/limble-limble-tree.mjs +2256 -0
  23. package/fesm2015/limble-limble-tree.mjs.map +1 -0
  24. package/{fesm2015/limble-limble-tree.js → fesm2020/limble-limble-tree.mjs} +89 -136
  25. package/fesm2020/limble-limble-tree.mjs.map +1 -0
  26. package/{limble-limble-tree.d.ts → index.d.ts} +0 -0
  27. package/lib/custom-event-bindings/dragleave-no-change-detect.directive.d.ts +1 -1
  28. package/lib/custom-event-bindings/dragover-no-change-detect.directive.d.ts +1 -1
  29. package/lib/drop-zone/drop-zone.component.d.ts +1 -1
  30. package/lib/limble-tree-branch/limble-tree-branch.component.d.ts +1 -1
  31. package/lib/limble-tree-node/limble-tree-node.component.d.ts +1 -1
  32. package/lib/limble-tree-placeholder/limble-tree-placeholder.component.d.ts +1 -1
  33. package/lib/limble-tree-root/limble-tree-root.component.d.ts +1 -1
  34. package/package.json +22 -9
  35. package/bundles/limble-limble-tree.umd.js +0 -2910
  36. package/bundles/limble-limble-tree.umd.js.map +0 -1
  37. package/esm2015/lib/drop-zone/drop-zone.component.js +0 -81
  38. package/esm2015/lib/limble-tree-branch/limble-tree-branch.component.js +0 -116
  39. package/esm2015/lib/limble-tree-node/limble-tree-node.component.js +0 -484
  40. package/esm2015/lib/limble-tree-root/drop-zone.service.js +0 -377
  41. package/esm2015/lib/limble-tree-root/limble-tree-root.component.js +0 -178
  42. package/esm2015/lib/limble-tree-root/tree.service.js +0 -301
  43. package/esm2015/lib/singletons/drag-state.service.js +0 -64
  44. package/esm2015/lib/singletons/global-events.service.js +0 -137
  45. package/fesm2015/limble-limble-tree.js.map +0 -1
@@ -1,64 +0,0 @@
1
- import { Injectable } from "@angular/core";
2
- import { BehaviorSubject } from "rxjs";
3
- import * as i0 from "@angular/core";
4
- export class DragStateService {
5
- constructor() {
6
- this.state = "idle";
7
- this.state$ = new BehaviorSubject(this.state);
8
- }
9
- /** Called to indicate that something is being dragged. Stores that something for later. */
10
- dragging(branch, parentContainer) {
11
- this._tempData = {
12
- branch: branch,
13
- parentContainer: parentContainer
14
- };
15
- this.state = "dragging";
16
- this.state$.next(this.state);
17
- }
18
- /** Called to indicate that there is a valid active drop zone. Drop is now possible. */
19
- droppable() {
20
- if (this.state !== "dragging") {
21
- throw new Error("Can only call `droppable` when state is `dragging`");
22
- }
23
- this.state = "droppable";
24
- this.state$.next(this.state);
25
- }
26
- /** Called to indicate that there is no longer a valid active drop zone. Drop is no longer possible. */
27
- notDroppable() {
28
- if (this.state !== "droppable") {
29
- throw new Error("Can only call `notDroppable` when state is `droppable`");
30
- }
31
- this.state = "dragging";
32
- this.state$.next(this.state);
33
- }
34
- /** Called to indicate that a drop into a valid drop zone has occurred. Returns the item that was dropped. */
35
- capture() {
36
- var _a;
37
- if (this.state !== "droppable") {
38
- throw new Error("Can only move to `captured` state from `droppable` state");
39
- }
40
- this.state = "captured";
41
- this.state$.next(this.state);
42
- return (_a = this._tempData) === null || _a === void 0 ? void 0 : _a.branch;
43
- }
44
- /** Called to reset the service for future drags */
45
- release() {
46
- this._tempData = undefined;
47
- this.state = "idle";
48
- this.state$.next(this.state);
49
- }
50
- /** gets the current thing being dragged, if any. */
51
- getData() {
52
- return this._tempData;
53
- }
54
- /** gets the current state */
55
- getState() {
56
- return this.state;
57
- }
58
- }
59
- DragStateService.ɵfac = function DragStateService_Factory(t) { return new (t || DragStateService)(); };
60
- DragStateService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: DragStateService, factory: DragStateService.ɵfac });
61
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DragStateService, [{
62
- type: Injectable
63
- }], function () { return []; }, null); })();
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGltYmxlLXRyZWUvc3JjL2xpYi9zaW5nbGV0b25zL2RyYWctc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQVd2QyxNQUFNLE9BQU8sZ0JBQWdCO0lBVTFCO1FBQ0csSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBWSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELDJGQUEyRjtJQUNwRixRQUFRLENBQUMsTUFBbUIsRUFBRSxlQUFpQztRQUNuRSxJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2QsTUFBTSxFQUFFLE1BQU07WUFDZCxlQUFlLEVBQUUsZUFBZTtTQUNsQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCx1RkFBdUY7SUFDaEYsU0FBUztRQUNiLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1NBQ3hFO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCx1R0FBdUc7SUFDaEcsWUFBWTtRQUNoQixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQ1osd0RBQXdELENBQzFELENBQUM7U0FDSjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsOEdBQThHO0lBQ3ZHLE9BQU87O1FBQ1gsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUNaLDBEQUEwRCxDQUM1RCxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsT0FBTyxNQUFBLElBQUksQ0FBQyxTQUFTLDBDQUFFLE1BQU0sQ0FBQztJQUNqQyxDQUFDO0lBRUQsbURBQW1EO0lBQzVDLE9BQU87UUFDWCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELG9EQUFvRDtJQUM3QyxPQUFPO1FBQ1gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3pCLENBQUM7SUFFRCw2QkFBNkI7SUFDdEIsUUFBUTtRQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNyQixDQUFDOztnRkF4RVMsZ0JBQWdCO3NFQUFoQixnQkFBZ0IsV0FBaEIsZ0JBQWdCO3VGQUFoQixnQkFBZ0I7Y0FENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJyYW5jaCB9IGZyb20gXCIuLi9jbGFzc2VzL0JyYW5jaFwiO1xyXG5cclxuZXhwb3J0IHR5cGUgRHJhZ1N0YXRlID0gXCJpZGxlXCIgfCBcImRyYWdnaW5nXCIgfCBcImRyb3BwYWJsZVwiIHwgXCJjYXB0dXJlZFwiO1xyXG5cclxuaW50ZXJmYWNlIFRlbXBEYXRhIHtcclxuICAgYnJhbmNoOiBCcmFuY2g8YW55PjtcclxuICAgcGFyZW50Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBEcmFnU3RhdGVTZXJ2aWNlIHtcclxuICAgLyoqIHB1c2hlcyB0aGUgbmV3IHN0YXRlIHdoZW5ldmVyIHRoZSBzdGF0ZSBjaGFuZ2VzICovXHJcbiAgIHB1YmxpYyBzdGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxEcmFnU3RhdGU+O1xyXG5cclxuICAgLyoqIGhvbGRzIGRhdGEgYWJvdXQgdGhlIHRoaW5nIGJlaW5nIGRyYWdnZWQgKi9cclxuICAgcHJpdmF0ZSBfdGVtcERhdGE6IFRlbXBEYXRhIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkcmFnIHByb2Nlc3MgKi9cclxuICAgcHJpdmF0ZSBzdGF0ZTogRHJhZ1N0YXRlO1xyXG5cclxuICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcImlkbGVcIjtcclxuICAgICAgdGhpcy5zdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERyYWdTdGF0ZT4odGhpcy5zdGF0ZSk7XHJcbiAgIH1cclxuXHJcbiAgIC8qKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCBzb21ldGhpbmcgaXMgYmVpbmcgZHJhZ2dlZC4gU3RvcmVzIHRoYXQgc29tZXRoaW5nIGZvciBsYXRlci4gKi9cclxuICAgcHVibGljIGRyYWdnaW5nKGJyYW5jaDogQnJhbmNoPGFueT4sIHBhcmVudENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZikge1xyXG4gICAgICB0aGlzLl90ZW1wRGF0YSA9IHtcclxuICAgICAgICAgYnJhbmNoOiBicmFuY2gsXHJcbiAgICAgICAgIHBhcmVudENvbnRhaW5lcjogcGFyZW50Q29udGFpbmVyXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcImRyYWdnaW5nXCI7XHJcbiAgICAgIHRoaXMuc3RhdGUkLm5leHQodGhpcy5zdGF0ZSk7XHJcbiAgIH1cclxuXHJcbiAgIC8qKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBhIHZhbGlkIGFjdGl2ZSBkcm9wIHpvbmUuIERyb3AgaXMgbm93IHBvc3NpYmxlLiAqL1xyXG4gICBwdWJsaWMgZHJvcHBhYmxlKCkge1xyXG4gICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gXCJkcmFnZ2luZ1wiKSB7XHJcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbiBvbmx5IGNhbGwgYGRyb3BwYWJsZWAgd2hlbiBzdGF0ZSBpcyBgZHJhZ2dpbmdgXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcImRyb3BwYWJsZVwiO1xyXG4gICAgICB0aGlzLnN0YXRlJC5uZXh0KHRoaXMuc3RhdGUpO1xyXG4gICB9XHJcblxyXG4gICAvKiogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gbG9uZ2VyIGEgdmFsaWQgYWN0aXZlIGRyb3Agem9uZS4gRHJvcCBpcyBubyBsb25nZXIgcG9zc2libGUuICovXHJcbiAgIHB1YmxpYyBub3REcm9wcGFibGUoKSB7XHJcbiAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBcImRyb3BwYWJsZVwiKSB7XHJcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgXCJDYW4gb25seSBjYWxsIGBub3REcm9wcGFibGVgIHdoZW4gc3RhdGUgaXMgYGRyb3BwYWJsZWBcIlxyXG4gICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcImRyYWdnaW5nXCI7XHJcbiAgICAgIHRoaXMuc3RhdGUkLm5leHQodGhpcy5zdGF0ZSk7XHJcbiAgIH1cclxuXHJcbiAgIC8qKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGRyb3AgaW50byBhIHZhbGlkIGRyb3Agem9uZSBoYXMgb2NjdXJyZWQuIFJldHVybnMgdGhlIGl0ZW0gdGhhdCB3YXMgZHJvcHBlZC4gICovXHJcbiAgIHB1YmxpYyBjYXB0dXJlKCkge1xyXG4gICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gXCJkcm9wcGFibGVcIikge1xyXG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgIFwiQ2FuIG9ubHkgbW92ZSB0byBgY2FwdHVyZWRgIHN0YXRlIGZyb20gYGRyb3BwYWJsZWAgc3RhdGVcIlxyXG4gICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcImNhcHR1cmVkXCI7XHJcbiAgICAgIHRoaXMuc3RhdGUkLm5leHQodGhpcy5zdGF0ZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl90ZW1wRGF0YT8uYnJhbmNoO1xyXG4gICB9XHJcblxyXG4gICAvKiogQ2FsbGVkIHRvIHJlc2V0IHRoZSBzZXJ2aWNlIGZvciBmdXR1cmUgZHJhZ3MgKi9cclxuICAgcHVibGljIHJlbGVhc2UoKSB7XHJcbiAgICAgIHRoaXMuX3RlbXBEYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLnN0YXRlID0gXCJpZGxlXCI7XHJcbiAgICAgIHRoaXMuc3RhdGUkLm5leHQodGhpcy5zdGF0ZSk7XHJcbiAgIH1cclxuXHJcbiAgIC8qKiBnZXRzIHRoZSBjdXJyZW50IHRoaW5nIGJlaW5nIGRyYWdnZWQsIGlmIGFueS4gKi9cclxuICAgcHVibGljIGdldERhdGEoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl90ZW1wRGF0YTtcclxuICAgfVxyXG5cclxuICAgLyoqIGdldHMgdGhlIGN1cnJlbnQgc3RhdGUgKi9cclxuICAgcHVibGljIGdldFN0YXRlKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZTtcclxuICAgfVxyXG59XHJcbiJdfQ==
@@ -1,137 +0,0 @@
1
- import { Injectable } from "@angular/core";
2
- import { fromEvent } from "rxjs";
3
- import { filter, throttleTime } from "rxjs/operators";
4
- import * as i0 from "@angular/core";
5
- function getScrollParent(element) {
6
- var _a;
7
- const regex = /(auto|scroll)/;
8
- const parents = (_node, parentList) => {
9
- if (_node === null || _node.parentNode === null) {
10
- return parentList;
11
- }
12
- return parents(_node.parentElement, parentList.concat([_node]));
13
- };
14
- const style = (_node, prop) => getComputedStyle(_node, null).getPropertyValue(prop);
15
- const overflow = (_node) => style(_node, "overflow") +
16
- style(_node, "overflow-y") +
17
- style(_node, "overflow-x");
18
- const scroll = (_node) => regex.test(overflow(_node));
19
- const parentList = parents(element.parentElement, []);
20
- for (const parent of parentList) {
21
- if (scroll(parent)) {
22
- return parent;
23
- }
24
- }
25
- return ((_a = document.scrollingElement) !== null && _a !== void 0 ? _a : document.documentElement);
26
- }
27
- export class GlobalEventsService {
28
- constructor(ngZone) {
29
- this.ngZone = ngZone;
30
- this.ngZone.runOutsideAngular(() => {
31
- this.globalDrag$ = fromEvent(document, "drag");
32
- });
33
- this.scrolling = false;
34
- }
35
- addScrolling() {
36
- this.ngZone.runOutsideAngular(() => {
37
- if (this.globalDragSubscription !== undefined) {
38
- return;
39
- }
40
- if (this.globalDrag$ === undefined) {
41
- throw new Error("Could not get observable");
42
- }
43
- let viewPortHeight;
44
- let scrollAreaSize;
45
- let edgeTop;
46
- let edgeBottom;
47
- let isInTopScrollArea;
48
- let isInBottomScrollArea;
49
- let timer;
50
- let scrollableDiv;
51
- let relativeY;
52
- this.globalDragSubscription = this.globalDrag$
53
- .pipe(throttleTime(25), filter((event) => {
54
- if (!event.target) {
55
- return false;
56
- }
57
- scrollableDiv = getScrollParent(event.target);
58
- viewPortHeight = scrollableDiv.clientHeight;
59
- const viewPortWidth = scrollableDiv.clientWidth;
60
- let relativeX;
61
- if (window
62
- .getComputedStyle(scrollableDiv)
63
- .getPropertyValue("position")
64
- .toLowerCase() === "fixed") {
65
- relativeX = event.clientX;
66
- relativeY = event.clientY;
67
- }
68
- else {
69
- const boundingRect = scrollableDiv.getBoundingClientRect();
70
- const scrollableDivAncestor = getScrollParent(scrollableDiv);
71
- relativeX =
72
- event.clientX -
73
- (boundingRect.left + scrollableDivAncestor.scrollLeft);
74
- relativeY =
75
- event.clientY -
76
- (boundingRect.top + scrollableDivAncestor.scrollTop);
77
- }
78
- if (relativeX < 0 ||
79
- relativeX > viewPortWidth ||
80
- relativeY < 0 ||
81
- relativeY > viewPortHeight) {
82
- //Outside of scrollable div
83
- return false;
84
- }
85
- scrollAreaSize = Math.max(viewPortHeight * 0.1, 100);
86
- edgeTop = scrollAreaSize;
87
- edgeBottom = viewPortHeight - scrollAreaSize;
88
- isInTopScrollArea = relativeY < edgeTop;
89
- isInBottomScrollArea = relativeY > edgeBottom;
90
- return isInTopScrollArea || isInBottomScrollArea;
91
- }))
92
- .subscribe(() => {
93
- if (scrollableDiv === null) {
94
- return;
95
- }
96
- const height = scrollableDiv.scrollHeight;
97
- const maxScrollY = height - viewPortHeight;
98
- const currentScrollY = scrollableDiv.scrollTop;
99
- const canScrollUp = currentScrollY > 0;
100
- const canScrollDown = currentScrollY < maxScrollY;
101
- let nextScrollY;
102
- const maxStep = 75;
103
- if (isInTopScrollArea && canScrollUp) {
104
- const intensity = (edgeTop - relativeY) / scrollAreaSize;
105
- nextScrollY = currentScrollY - maxStep * intensity;
106
- }
107
- else if (isInBottomScrollArea && canScrollDown) {
108
- const intensity = (relativeY - edgeBottom) / scrollAreaSize;
109
- nextScrollY = currentScrollY + maxStep * intensity;
110
- }
111
- else {
112
- return;
113
- }
114
- nextScrollY = Math.max(0, Math.min(maxScrollY, nextScrollY));
115
- if (nextScrollY !== currentScrollY) {
116
- scrollableDiv.scrollTo({ top: nextScrollY });
117
- this.scrolling = true;
118
- clearTimeout(timer);
119
- timer = setTimeout(() => {
120
- this.scrolling = false;
121
- }, 100);
122
- }
123
- });
124
- });
125
- }
126
- removeScrolling() {
127
- if (this.globalDragSubscription !== undefined) {
128
- this.globalDragSubscription.unsubscribe();
129
- }
130
- }
131
- }
132
- GlobalEventsService.ɵfac = function GlobalEventsService_Factory(t) { return new (t || GlobalEventsService)(i0.ɵɵinject(i0.NgZone)); };
133
- GlobalEventsService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: GlobalEventsService, factory: GlobalEventsService.ɵfac });
134
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GlobalEventsService, [{
135
- type: Injectable
136
- }], function () { return [{ type: i0.NgZone }]; }, null); })();
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWV2ZW50cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGltYmxlLXRyZWUvc3JjL2xpYi9zaW5nbGV0b25zL2dsb2JhbC1ldmVudHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRXRELFNBQVMsZUFBZSxDQUFDLE9BQW9COztJQUMxQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUM7SUFDOUIsTUFBTSxPQUFPLEdBQUcsQ0FDYixLQUF5QixFQUN6QixVQUE4QixFQUNYLEVBQUU7UUFDckIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQzlDLE9BQU8sVUFBVSxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQztJQUVGLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBa0IsRUFBRSxJQUFZLEVBQUUsRUFBRSxDQUNoRCxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FDckMsS0FBSyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUM7UUFDeEIsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUM7UUFDMUIsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJ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cUJBQU0sSUFBSSxvQkFBb0IsSUFBSSxhQUFhLEVBQUU7b0JBQy9DLE1BQU0sU0FBUyxHQUFHLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLGNBQWMsQ0FBQztvQkFDNUQsV0FBVyxHQUFHLGNBQWMsR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDO2lCQUNyRDtxQkFBTTtvQkFDSixPQUFPO2lCQUNUO2dCQUNELFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLFdBQVcsS0FBSyxjQUFjLEVBQUU7b0JBQ2pDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBQ3RCLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDcEIsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUMxQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQ1Y7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVNLGVBQWU7UUFDbkIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssU0FBUyxFQUFFO1lBQzVDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM1QztJQUNKLENBQUM7O3NGQWxIUyxtQkFBbUI7eUVBQW5CLG1CQUFtQixXQUFuQixtQkFBbUI7dUZBQW5CLG1CQUFtQjtjQUQvQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIHRocm90dGxlVGltZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICBjb25zdCByZWdleCA9IC8oYXV0b3xzY3JvbGwpLztcclxuICAgY29uc3QgcGFyZW50cyA9IChcclxuICAgICAgX25vZGU6IEhUTUxFbGVtZW50IHwgbnVsbCxcclxuICAgICAgcGFyZW50TGlzdDogQXJyYXk8SFRNTEVsZW1lbnQ+XHJcbiAgICk6IEFycmF5PEhUTUxFbGVtZW50PiA9PiB7XHJcbiAgICAgIGlmIChfbm9kZSA9PT0gbnVsbCB8fCBfbm9kZS5wYXJlbnROb2RlID09PSBudWxsKSB7XHJcbiAgICAgICAgIHJldHVybiBwYXJlbnRMaXN0O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwYXJlbnRzKF9ub2RlLnBhcmVudEVsZW1lbnQsIHBhcmVudExpc3QuY29uY2F0KFtfbm9kZV0pKTtcclxuICAgfTtcclxuXHJcbiAgIGNvbnN0IHN0eWxlID0gKF9ub2RlOiBIVE1MRWxlbWVudCwgcHJvcDogc3RyaW5nKSA9PlxyXG4gICAgICBnZXRDb21wdXRlZFN0eWxlKF9ub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHByb3ApO1xyXG4gICBjb25zdCBvdmVyZmxvdyA9IChfbm9kZTogSFRNTEVsZW1lbnQpID0+XHJcbiAgICAgIHN0eWxlKF9ub2RlLCBcIm92ZXJmbG93XCIpICtcclxuICAgICAgc3R5bGUoX25vZGUsIFwib3ZlcmZsb3cteVwiKSArXHJcbiAgICAgIHN0eWxlKF9ub2RlLCBcIm92ZXJmbG93LXhcIik7XHJcbiAgIGNvbnN0IHNjcm9sbCA9IChfbm9kZTogSFRNTEVsZW1lbnQpID0+IHJlZ2V4LnRlc3Qob3ZlcmZsb3coX25vZGUpKTtcclxuXHJcbiAgIGNvbnN0IHBhcmVudExpc3QgPSBwYXJlbnRzKGVsZW1lbnQucGFyZW50RWxlbWVudCwgW10pO1xyXG4gICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRMaXN0KSB7XHJcbiAgICAgIGlmIChzY3JvbGwocGFyZW50KSkge1xyXG4gICAgICAgICByZXR1cm4gcGFyZW50O1xyXG4gICAgICB9XHJcbiAgIH1cclxuICAgcmV0dXJuIChcclxuICAgICAgKGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQpID8/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxyXG4gICApO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBHbG9iYWxFdmVudHNTZXJ2aWNlIHtcclxuICAgcHJpdmF0ZSBnbG9iYWxEcmFnJDogT2JzZXJ2YWJsZTxEcmFnRXZlbnQ+IHwgdW5kZWZpbmVkO1xyXG4gICBwcml2YXRlIGdsb2JhbERyYWdTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcclxuICAgcHVibGljIHNjcm9sbGluZzogYm9vbGVhbjtcclxuXHJcbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmUpIHtcclxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgICB0aGlzLmdsb2JhbERyYWckID0gZnJvbUV2ZW50PERyYWdFdmVudD4oZG9jdW1lbnQsIFwiZHJhZ1wiKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuc2Nyb2xsaW5nID0gZmFsc2U7XHJcbiAgIH1cclxuXHJcbiAgIHB1YmxpYyBhZGRTY3JvbGxpbmcoKSB7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICAgaWYgKHRoaXMuZ2xvYmFsRHJhZ1N1YnNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgfVxyXG4gICAgICAgICBpZiAodGhpcy5nbG9iYWxEcmFnJCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgb2JzZXJ2YWJsZVwiKTtcclxuICAgICAgICAgfVxyXG4gICAgICAgICBsZXQgdmlld1BvcnRIZWlnaHQ6IG51bWJlcjtcclxuICAgICAgICAgbGV0IHNjcm9sbEFyZWFTaXplOiBudW1iZXI7XHJcbiAgICAgICAgIGxldCBlZGdlVG9wOiBudW1iZXI7XHJcbiAgICAgICAgIGxldCBlZGdlQm90dG9tOiBudW1iZXI7XHJcbiAgICAgICAgIGxldCBpc0luVG9wU2Nyb2xsQXJlYTogYm9vbGVhbjtcclxuICAgICAgICAgbGV0IGlzSW5Cb3R0b21TY3JvbGxBcmVhOiBib29sZWFuO1xyXG4gICAgICAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xyXG4gICAgICAgICBsZXQgc2Nyb2xsYWJsZURpdjogSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgICAgICBsZXQgcmVsYXRpdmVZOiBudW1iZXI7XHJcbiAgICAgICAgIHRoaXMuZ2xvYmFsRHJhZ1N1YnNjcmlwdGlvbiA9IHRoaXMuZ2xvYmFsRHJhZyRcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgIHRocm90dGxlVGltZSgyNSksXHJcbiAgICAgICAgICAgICAgIGZpbHRlcigoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVEaXYgPSBnZXRTY3JvbGxQYXJlbnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgdmlld1BvcnRIZWlnaHQgPSBzY3JvbGxhYmxlRGl2LmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgY29uc3Qgdmlld1BvcnRXaWR0aCA9IHNjcm9sbGFibGVEaXYuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgIGxldCByZWxhdGl2ZVg6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICB3aW5kb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbXB1dGVkU3R5bGUoc2Nyb2xsYWJsZURpdilcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoXCJwb3NpdGlvblwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKSA9PT0gXCJmaXhlZFwiXHJcbiAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVggPSBldmVudC5jbGllbnRYO1xyXG4gICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVkgPSBldmVudC5jbGllbnRZO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICBjb25zdCBib3VuZGluZ1JlY3QgPSBzY3JvbGxhYmxlRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlRGl2QW5jZXN0b3IgPSBnZXRTY3JvbGxQYXJlbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVEaXZcclxuICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVYID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY2xpZW50WCAtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChib3VuZGluZ1JlY3QubGVmdCArIHNjcm9sbGFibGVEaXZBbmNlc3Rvci5zY3JvbGxMZWZ0KTtcclxuICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVZID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY2xpZW50WSAtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChib3VuZGluZ1JlY3QudG9wICsgc2Nyb2xsYWJsZURpdkFuY2VzdG9yLnNjcm9sbFRvcCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVggPCAwIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlWCA+IHZpZXdQb3J0V2lkdGggfHxcclxuICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVZIDwgMCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVkgPiB2aWV3UG9ydEhlaWdodFxyXG4gICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgLy9PdXRzaWRlIG9mIHNjcm9sbGFibGUgZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBzY3JvbGxBcmVhU2l6ZSA9IE1hdGgubWF4KHZpZXdQb3J0SGVpZ2h0ICogMC4xLCAxMDApO1xyXG4gICAgICAgICAgICAgICAgICBlZGdlVG9wID0gc2Nyb2xsQXJlYVNpemU7XHJcbiAgICAgICAgICAgICAgICAgIGVkZ2VCb3R0b20gPSB2aWV3UG9ydEhlaWdodCAtIHNjcm9sbEFyZWFTaXplO1xyXG4gICAgICAgICAgICAgICAgICBpc0luVG9wU2Nyb2xsQXJlYSA9IHJlbGF0aXZlWSA8IGVkZ2VUb3A7XHJcbiAgICAgICAgICAgICAgICAgIGlzSW5Cb3R0b21TY3JvbGxBcmVhID0gcmVsYXRpdmVZID4gZWRnZUJvdHRvbTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzSW5Ub3BTY3JvbGxBcmVhIHx8IGlzSW5Cb3R0b21TY3JvbGxBcmVhO1xyXG4gICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICBpZiAoc2Nyb2xsYWJsZURpdiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gc2Nyb2xsYWJsZURpdi5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgIGNvbnN0IG1heFNjcm9sbFkgPSBoZWlnaHQgLSB2aWV3UG9ydEhlaWdodDtcclxuICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNjcm9sbFkgPSBzY3JvbGxhYmxlRGl2LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgY29uc3QgY2FuU2Nyb2xsVXAgPSBjdXJyZW50U2Nyb2xsWSA+IDA7XHJcbiAgICAgICAgICAgICAgIGNvbnN0IGNhblNjcm9sbERvd24gPSBjdXJyZW50U2Nyb2xsWSA8IG1heFNjcm9sbFk7XHJcbiAgICAgICAgICAgICAgIGxldCBuZXh0U2Nyb2xsWTogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICBjb25zdCBtYXhTdGVwID0gNzU7XHJcbiAgICAgICAgICAgICAgIGlmIChpc0luVG9wU2Nyb2xsQXJlYSAmJiBjYW5TY3JvbGxVcCkge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnRlbnNpdHkgPSAoZWRnZVRvcCAtIHJlbGF0aXZlWSkgLyBzY3JvbGxBcmVhU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgbmV4dFNjcm9sbFkgPSBjdXJyZW50U2Nyb2xsWSAtIG1heFN0ZXAgKiBpbnRlbnNpdHk7XHJcbiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbkJvdHRvbVNjcm9sbEFyZWEgJiYgY2FuU2Nyb2xsRG93bikge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnRlbnNpdHkgPSAocmVsYXRpdmVZIC0gZWRnZUJvdHRvbSkgLyBzY3JvbGxBcmVhU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgbmV4dFNjcm9sbFkgPSBjdXJyZW50U2Nyb2xsWSArIG1heFN0ZXAgKiBpbnRlbnNpdHk7XHJcbiAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICBuZXh0U2Nyb2xsWSA9IE1hdGgubWF4KDAsIE1hdGgubWluKG1heFNjcm9sbFksIG5leHRTY3JvbGxZKSk7XHJcbiAgICAgICAgICAgICAgIGlmIChuZXh0U2Nyb2xsWSAhPT0gY3VycmVudFNjcm9sbFkpIHtcclxuICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZURpdi5zY3JvbGxUbyh7IHRvcDogbmV4dFNjcm9sbFkgfSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgIH1cclxuXHJcbiAgIHB1YmxpYyByZW1vdmVTY3JvbGxpbmcoKSB7XHJcbiAgICAgIGlmICh0aGlzLmdsb2JhbERyYWdTdWJzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICB0aGlzLmdsb2JhbERyYWdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG4gICB9XHJcbn1cclxuIl19