@limble/limble-tree 0.12.2 → 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} +105 -147
  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 +24 -10
  35. package/bundles/limble-limble-tree.umd.js +0 -2905
  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 -372
  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
@@ -0,0 +1,467 @@
1
+ import { Component, ElementRef, Input, ViewChild, ViewContainerRef } from "@angular/core";
2
+ import { arraysAreEqual, isDraggingAllowed, isNestingAllowed, suddenTreeExit } from "../util";
3
+ import { filter, first, skip, skipUntil } from "rxjs/operators";
4
+ import { DropZone } from "../classes/DropZone";
5
+ import { fromEvent, merge } from "rxjs";
6
+ import { LimbleTreeBranchComponent } from "../limble-tree-branch/limble-tree-branch.component";
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../singletons/component-creator.service";
9
+ import * as i2 from "../singletons/drag-state.service";
10
+ import * as i3 from "../limble-tree-root/drop-zone.service";
11
+ import * as i4 from "../limble-tree-root/tree.service";
12
+ import * as i5 from "../singletons/global-events.service";
13
+ import * as i6 from "../limble-tree-root/tree-construction-status.service";
14
+ const _c0 = ["nodeHost"];
15
+ const _c1 = ["draggableDiv"];
16
+ const _c2 = ["nodeHostContainer"];
17
+ const _c3 = ["innerBranch"];
18
+ function LimbleTreeNodeComponent_drop_zone_0_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵelement(0, "drop-zone", 7);
20
+ } if (rf & 2) {
21
+ const ctx_r0 = i0.ɵɵnextContext();
22
+ i0.ɵɵproperty("dropZone", ctx_r0.dropZoneAbove);
23
+ } }
24
+ function LimbleTreeNodeComponent_ng_template_5_Template(rf, ctx) { }
25
+ function LimbleTreeNodeComponent_limble_tree_branch_7_Template(rf, ctx) { if (rf & 1) {
26
+ i0.ɵɵelement(0, "limble-tree-branch", 8, 9);
27
+ } if (rf & 2) {
28
+ const ctx_r5 = i0.ɵɵnextContext();
29
+ i0.ɵɵproperty("branch", ctx_r5.branch);
30
+ } }
31
+ function LimbleTreeNodeComponent_drop_zone_8_Template(rf, ctx) { if (rf & 1) {
32
+ i0.ɵɵelement(0, "drop-zone", 7);
33
+ } if (rf & 2) {
34
+ const ctx_r6 = i0.ɵɵnextContext();
35
+ i0.ɵɵproperty("dropZone", ctx_r6.dropZoneBelow);
36
+ } }
37
+ export class LimbleTreeNodeComponent {
38
+ constructor(componentCreatorService, changeDetectorRef, dragStateService, dropZoneService, treeService, globalEventsService, ngZone, treeConstructionStatus) {
39
+ this.componentCreatorService = componentCreatorService;
40
+ this.changeDetectorRef = changeDetectorRef;
41
+ this.dragStateService = dragStateService;
42
+ this.dropZoneService = dropZoneService;
43
+ this.treeService = treeService;
44
+ this.globalEventsService = globalEventsService;
45
+ this.ngZone = ngZone;
46
+ this.treeConstructionStatus = treeConstructionStatus;
47
+ this.treeConstructionStatus.constructing();
48
+ if (this.treeService.treeOptions !== undefined &&
49
+ this.treeService.treeOptions.listMode !== true) {
50
+ this.renderInnerBranch = true;
51
+ }
52
+ else {
53
+ this.renderInnerBranch = false;
54
+ }
55
+ this.renderDropZoneBelow = false;
56
+ this.renderDropZoneAbove = false;
57
+ this.treeChangeSubscription = this.treeService.changes$
58
+ .pipe(
59
+ //The first one is the initial tree render, which we can ignore
60
+ skip(1))
61
+ .subscribe(() => {
62
+ this.treeChangeHandler();
63
+ });
64
+ }
65
+ treeChangeHandler() {
66
+ if (this.branch !== undefined &&
67
+ this.currentBranchCoordinates !== undefined &&
68
+ !arraysAreEqual(this.branch.getCoordinates(), this.currentBranchCoordinates)) {
69
+ this.updateDropZones();
70
+ }
71
+ }
72
+ ngOnInit() {
73
+ if (this.treeService.treeOptions?.allowDragging === false) {
74
+ return;
75
+ }
76
+ const parent = this.branch?.getParent();
77
+ if (parent?.data !== null) {
78
+ const parentData = parent?.data;
79
+ if (!isNestingAllowed(this.treeService.treeOptions, parentData)) {
80
+ this.renderInnerBranch = false;
81
+ return;
82
+ }
83
+ }
84
+ this.registerDropZones();
85
+ this.currentBranchCoordinates = this.branch?.getCoordinates();
86
+ this.ngZone.runOutsideAngular(() => {
87
+ if (this.dropZoneAbove === undefined ||
88
+ this.dropZoneBelow === undefined) {
89
+ throw new Error("Zones not registered");
90
+ }
91
+ merge(this.dropZoneAbove.getCommChannel(), this.dropZoneBelow.getCommChannel())
92
+ .pipe(filter((message) => message === "checkRendered"))
93
+ .subscribe(() => {
94
+ if (this.dropZoneAbove === undefined ||
95
+ this.dropZoneBelow === undefined ||
96
+ this.branch === undefined) {
97
+ throw new Error("Zones not registered");
98
+ }
99
+ this.renderDropZoneAbove = this.dropZoneAbove.isRendered();
100
+ this.renderDropZoneBelow = this.dropZoneBelow.isRendered();
101
+ });
102
+ });
103
+ }
104
+ ngAfterViewInit() {
105
+ this.renderNode();
106
+ this.setDropZoneHosts();
107
+ this.checkForHandle();
108
+ this.treeConstructionStatus.doneConstructing();
109
+ this.changeDetectorRef.detectChanges();
110
+ }
111
+ ngOnDestroy() {
112
+ this.treeChangeSubscription.unsubscribe();
113
+ if (this.dropZoneAbove !== undefined) {
114
+ this.dropZoneService.removeDropZone(this.dropZoneAbove);
115
+ }
116
+ if (this.dropZoneBelow !== undefined) {
117
+ this.dropZoneService.removeDropZone(this.dropZoneBelow);
118
+ }
119
+ this.treeService.cleanupSignal$.next(true);
120
+ }
121
+ dragstartHandler(event) {
122
+ event.stopPropagation();
123
+ if (event.dataTransfer === null ||
124
+ this.branch === undefined ||
125
+ this.parentHost === undefined) {
126
+ throw new Error("failed to run dragstartHandler");
127
+ }
128
+ const draggedElement = event.target;
129
+ if (draggedElement.parentElement?.tagName !== "LIMBLE-TREE-NODE") {
130
+ //Don't drag stuff that isn't part of the tree
131
+ event.preventDefault();
132
+ return;
133
+ }
134
+ event.dataTransfer.effectAllowed = "move";
135
+ this.dragStateService.dragging(this.branch, this.parentHost);
136
+ const treeElement = draggedElement.closest("limble-tree-root");
137
+ if (treeElement === null) {
138
+ throw new Error("could not get root of tree");
139
+ }
140
+ this.ngZone.runOutsideAngular(() => {
141
+ //We have to use a setTimeout due to a bug in chrome: https://stackoverflow.com/a/20733870/8796651
142
+ setTimeout(() => {
143
+ draggedElement.classList.add("dragging");
144
+ if (this.treeService.treeData?.length === 1 &&
145
+ this.branch?.getCoordinates().length === 1) {
146
+ //We are dragging the only element in the tree, so we have to use the placeholder system
147
+ this.treeService.placeholder$.next(true);
148
+ }
149
+ });
150
+ //We use this weird subscription/timeout combo in order to avoid a strange bug where the dragleave event
151
+ //does not fire if the user drags out of the tree too quickly. This issue would make the drop zone
152
+ //remain in the UI, potentially causing drop zones to appear in multiple trees at a time. This subscription
153
+ //waits for the dragover event on the tree to fire before rendering any drop zones. If the dragover
154
+ //event does not fire within a half second, we know the mouse left the tree too quickly, and we won't
155
+ //render the drop zone at all.
156
+ const dragSubscription = fromEvent(treeElement, "dragover")
157
+ .pipe(first())
158
+ .subscribe((dragoverEvent) => {
159
+ dragoverEvent.stopPropagation();
160
+ if (this.branch === undefined) {
161
+ throw new Error("Could not show surrounding drop zones");
162
+ }
163
+ const parent = this.branch.getParent();
164
+ let parentData;
165
+ let parentNestingAllowed = true;
166
+ if (parent?.data !== null) {
167
+ parentData = parent?.data;
168
+ parentNestingAllowed = isNestingAllowed(this.treeService.treeOptions, parentData);
169
+ }
170
+ if (this.dropZoneAbove !== undefined && parentNestingAllowed) {
171
+ this.dropZoneService.showDropZoneFamily(this.dropZoneAbove, {
172
+ joinFamilies: true
173
+ });
174
+ }
175
+ });
176
+ setTimeout(() => {
177
+ if (!dragSubscription.closed) {
178
+ dragSubscription.unsubscribe();
179
+ }
180
+ }, 500);
181
+ });
182
+ }
183
+ dragendHandler(event) {
184
+ event?.stopPropagation();
185
+ if (this.draggableDiv === undefined) {
186
+ throw new Error("could not get draggable div");
187
+ }
188
+ this.draggableDiv.nativeElement.classList.remove("dragging");
189
+ if (this.dragStateService.getState() === "captured") {
190
+ if (this.treeService.captured === false) {
191
+ //Dropped in a different tree. Remove the one in this tree
192
+ if (this.branch === undefined) {
193
+ throw new Error("could not get branch in dragendHandler");
194
+ }
195
+ this.treeService.cleanupSignal$.next(true);
196
+ this.treeService.captured = false;
197
+ }
198
+ this.dragStateService.release();
199
+ }
200
+ else {
201
+ //Wasn't dropped into a valid tree, so reset for next drag and
202
+ //don't do anything else.
203
+ this.dragStateService.release();
204
+ this.dropZoneService.clearVisibleZones();
205
+ this.dropZoneService.restoreFamilies();
206
+ if (this.treeService.treeData?.length === 1 &&
207
+ this.branch?.getCoordinates().length === 1) {
208
+ //We were dragging the only element in the tree, so we have to
209
+ //remove the placeholder that we added in the dragstart
210
+ this.treeService.placeholder$.next(false);
211
+ }
212
+ }
213
+ }
214
+ dragoverHandler(event) {
215
+ if (this.globalEventsService.scrolling === true) {
216
+ return;
217
+ }
218
+ if (this.branch === undefined) {
219
+ throw new Error("Can't get current branch during dragover event");
220
+ }
221
+ const data = this.dragStateService.getData();
222
+ if (data === undefined) {
223
+ //They might be dragging something that isn't a node. Just ignore it.
224
+ return;
225
+ }
226
+ const sourceBranch = data.branch;
227
+ //If trying to drop on self, return.
228
+ if (sourceBranch === this.branch ||
229
+ this.branch.getAncestors().includes(sourceBranch)) {
230
+ return;
231
+ }
232
+ const target = event.currentTarget.closest(".node-host-container");
233
+ if (!(target instanceof HTMLElement)) {
234
+ throw new Error("Failed to find node host container while dragging");
235
+ }
236
+ let topLine;
237
+ let bottomLine;
238
+ if (this.innerBranch?.renderDropZoneInside === false) {
239
+ topLine = target.offsetHeight / 2 - 6;
240
+ bottomLine = topLine;
241
+ }
242
+ else {
243
+ topLine = target.offsetHeight / 3 - 3; //an imaginary line 1/3 of the way down from the top of the element;
244
+ bottomLine = topLine * 2; //an imaginary line 1/3 of the way up from the bottom of the element;
245
+ }
246
+ const parent = this.branch.getParent();
247
+ let parentData;
248
+ let parentNestingAllowed = true;
249
+ if (parent?.data !== null) {
250
+ parentData = parent?.data;
251
+ parentNestingAllowed = isNestingAllowed(this.treeService.treeOptions, parentData);
252
+ }
253
+ /** The y-coordinates of the mouse in relation to the node it is hovering over */
254
+ const offsetY = event.clientY - target.getBoundingClientRect().top;
255
+ const activeDropZone = this.dropZoneService.getActiveDropZone();
256
+ if (offsetY < topLine &&
257
+ this.dropZoneAbove !== undefined &&
258
+ parentNestingAllowed &&
259
+ (activeDropZone === null ||
260
+ !DropZone.dropZoneLocationsAreEqual(activeDropZone, this.dropZoneAbove))) {
261
+ const index = this.branch.getIndex();
262
+ if (index === undefined || index === null) {
263
+ throw new Error("can't get branch index");
264
+ }
265
+ this.dropZoneService.showDropZoneFamily(this.dropZoneAbove, {
266
+ activateLowestInsteadOfFounder: true
267
+ });
268
+ if (suddenTreeExit(event)) {
269
+ this.dropZoneService.clearVisibleZones();
270
+ }
271
+ }
272
+ else if (offsetY < bottomLine &&
273
+ offsetY > topLine &&
274
+ this.innerBranch?.renderDropZoneInside === true &&
275
+ this.innerBranch?.dropZoneInside !== undefined &&
276
+ (activeDropZone === null ||
277
+ !DropZone.dropZoneLocationsAreEqual(activeDropZone, this.innerBranch.dropZoneInside))) {
278
+ this.dropZoneService.showDropZoneFamily(this.innerBranch.dropZoneInside);
279
+ if (suddenTreeExit(event)) {
280
+ this.dropZoneService.clearVisibleZones();
281
+ }
282
+ }
283
+ else if (offsetY >= bottomLine &&
284
+ this.dropZoneBelow !== undefined &&
285
+ parentNestingAllowed &&
286
+ (activeDropZone === null ||
287
+ !DropZone.dropZoneLocationsAreEqual(activeDropZone, this.dropZoneBelow)) &&
288
+ this.branch.getChildren().length === 0) {
289
+ const index = this.branch.getIndex();
290
+ if (index === undefined || index === null) {
291
+ throw new Error("can't get branch index");
292
+ }
293
+ this.dropZoneService.showDropZoneFamily(this.dropZoneBelow);
294
+ if (suddenTreeExit(event)) {
295
+ this.dropZoneService.clearVisibleZones();
296
+ }
297
+ }
298
+ }
299
+ renderNode() {
300
+ if (this.nodeHost === undefined || this.branch === undefined) {
301
+ throw new Error("Failed to render tree node");
302
+ }
303
+ let component = this.branch.data.component;
304
+ if (component === undefined) {
305
+ component = this.treeService.treeOptions?.defaultComponent;
306
+ }
307
+ if (component === undefined) {
308
+ throw new Error("limbleTree requires a component to render");
309
+ }
310
+ const componentRef = this.componentCreatorService.appendComponent(component.class, this.nodeHost);
311
+ componentRef.instance.nodeData = this.branch.data;
312
+ for (const binding in component.bindings) {
313
+ componentRef.instance[binding] = component.bindings[binding];
314
+ }
315
+ }
316
+ registerDropZones() {
317
+ this.addDropZoneAbove();
318
+ this.addDropZoneBelow();
319
+ }
320
+ addDropZoneAbove() {
321
+ if (this.branch === undefined) {
322
+ throw new Error("failed to register drop zone above");
323
+ }
324
+ const parent = this.branch.getParent();
325
+ const currentCoordinates = this.branch.getCoordinates();
326
+ const index = currentCoordinates[currentCoordinates.length - 1];
327
+ this.dropZoneAbove = new DropZone([...(parent?.getCoordinates() ?? [])], index);
328
+ this.dropZoneService.addDropZone(this.dropZoneAbove);
329
+ }
330
+ addDropZoneBelow() {
331
+ if (this.branch === undefined) {
332
+ throw new Error("failed to register drop zone below");
333
+ }
334
+ const parent = this.branch.getParent();
335
+ const currentCoordinates = this.branch.getCoordinates();
336
+ const index = currentCoordinates[currentCoordinates.length - 1];
337
+ this.dropZoneBelow = new DropZone([...(parent?.getCoordinates() ?? [])], index + 1);
338
+ this.dropZoneService.addDropZone(this.dropZoneBelow);
339
+ }
340
+ updateDropZones() {
341
+ this.currentBranchCoordinates = this.branch?.getCoordinates();
342
+ this.updateDropZoneAbove();
343
+ this.updateDropZoneBelow();
344
+ this.updateDropZoneInside();
345
+ this.setDropZoneHosts();
346
+ }
347
+ updateDropZoneAbove() {
348
+ if (this.branch === undefined || this.dropZoneAbove === undefined) {
349
+ throw new Error("failed to update drop zone above");
350
+ }
351
+ const parent = this.branch.getParent();
352
+ const currentCoordinates = this.branch.getCoordinates();
353
+ const index = currentCoordinates[currentCoordinates.length - 1];
354
+ const location = this.dropZoneAbove.getLocation();
355
+ location.setParentCoordinates([...(parent?.getCoordinates() ?? [])]);
356
+ location.setInsertIndex(index);
357
+ }
358
+ updateDropZoneBelow() {
359
+ if (this.branch === undefined || this.dropZoneBelow === undefined) {
360
+ throw new Error("failed to update drop zone below");
361
+ }
362
+ const parent = this.branch.getParent();
363
+ const currentCoordinates = this.branch.getCoordinates();
364
+ const index = currentCoordinates[currentCoordinates.length - 1];
365
+ const location = this.dropZoneBelow.getLocation();
366
+ location.setParentCoordinates([...(parent?.getCoordinates() ?? [])]);
367
+ location.setInsertIndex(index + 1);
368
+ }
369
+ updateDropZoneInside() {
370
+ if (this.innerBranch?.dropZoneInside === undefined) {
371
+ return;
372
+ }
373
+ if (this.branch === undefined) {
374
+ throw new Error("failed to update drop zone inside");
375
+ }
376
+ const location = this.innerBranch.dropZoneInside.getLocation();
377
+ location.setParentCoordinates([...this.branch.getCoordinates()]);
378
+ }
379
+ setDropZoneHosts() {
380
+ if (this.dropZoneAbove === undefined ||
381
+ this.dropZoneBelow === undefined) {
382
+ return;
383
+ }
384
+ this.dropZoneAbove.setHost(this.parentHost);
385
+ this.dropZoneBelow.setHost(this.parentHost);
386
+ }
387
+ checkForHandle() {
388
+ if (this.nodeHostContainer === undefined ||
389
+ this.draggableDiv === undefined) {
390
+ return;
391
+ }
392
+ const nodeHostContainerElement = this.nodeHostContainer.nativeElement;
393
+ const handle = nodeHostContainerElement.querySelector(".limble-tree-handle");
394
+ const draggableDivElement = this.draggableDiv.nativeElement;
395
+ if (!isDraggingAllowed(this.treeService.treeOptions, this.branch?.data)) {
396
+ draggableDivElement.setAttribute("draggable", "false");
397
+ }
398
+ else if (handle === null) {
399
+ draggableDivElement.setAttribute("draggable", "true");
400
+ }
401
+ else {
402
+ handle.addEventListener("mousedown", () => {
403
+ draggableDivElement.setAttribute("draggable", "true");
404
+ //For some reason mouseup doesn't fire after a drag, so we use this observable sequence instead.
405
+ const dragging = this.dragStateService.state$.pipe(filter((state) => state === "dragging"), first());
406
+ this.dragStateService.state$
407
+ .pipe(skipUntil(dragging), filter((state) => state === "idle"), first())
408
+ .subscribe(() => {
409
+ draggableDivElement.setAttribute("draggable", "false");
410
+ });
411
+ });
412
+ }
413
+ }
414
+ }
415
+ LimbleTreeNodeComponent.ɵfac = function LimbleTreeNodeComponent_Factory(t) { return new (t || LimbleTreeNodeComponent)(i0.ɵɵdirectiveInject(i1.ComponentCreatorService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.DragStateService), i0.ɵɵdirectiveInject(i3.DropZoneService), i0.ɵɵdirectiveInject(i4.TreeService), i0.ɵɵdirectiveInject(i5.GlobalEventsService), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i6.TreeConstructionStatus)); };
416
+ LimbleTreeNodeComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LimbleTreeNodeComponent, selectors: [["limble-tree-node"]], viewQuery: function LimbleTreeNodeComponent_Query(rf, ctx) { if (rf & 1) {
417
+ i0.ɵɵviewQuery(_c0, 5, ViewContainerRef);
418
+ i0.ɵɵviewQuery(_c1, 5, ElementRef);
419
+ i0.ɵɵviewQuery(_c2, 5, ElementRef);
420
+ i0.ɵɵviewQuery(_c3, 5, LimbleTreeBranchComponent);
421
+ } if (rf & 2) {
422
+ let _t;
423
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.nodeHost = _t.first);
424
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.draggableDiv = _t.first);
425
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.nodeHostContainer = _t.first);
426
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.innerBranch = _t.first);
427
+ } }, inputs: { branch: "branch", parentHost: "parentHost" }, decls: 9, vars: 4, consts: [[3, "dropZone", 4, "ngIf"], [1, "limble-parent-container", 3, "dragstart", "dragend"], ["draggableDiv", ""], [1, "node-host-container", 3, "dragoverEventThrottle", "dragoverNoChangeDetect"], ["nodeHostContainer", ""], ["nodeHost", ""], [3, "branch", 4, "ngIf"], [3, "dropZone"], [3, "branch"], ["innerBranch", ""]], template: function LimbleTreeNodeComponent_Template(rf, ctx) { if (rf & 1) {
428
+ i0.ɵɵtemplate(0, LimbleTreeNodeComponent_drop_zone_0_Template, 1, 1, "drop-zone", 0);
429
+ i0.ɵɵelementStart(1, "div", 1, 2);
430
+ i0.ɵɵlistener("dragstart", function LimbleTreeNodeComponent_Template_div_dragstart_1_listener($event) { return ctx.dragstartHandler($event); })("dragend", function LimbleTreeNodeComponent_Template_div_dragend_1_listener($event) { return ctx.dragendHandler($event); });
431
+ i0.ɵɵelementStart(3, "div", 3, 4);
432
+ i0.ɵɵlistener("dragoverNoChangeDetect", function LimbleTreeNodeComponent_Template_div_dragoverNoChangeDetect_3_listener($event) { return ctx.dragoverHandler($event); });
433
+ i0.ɵɵtemplate(5, LimbleTreeNodeComponent_ng_template_5_Template, 0, 0, "ng-template", null, 5, i0.ɵɵtemplateRefExtractor);
434
+ i0.ɵɵelementEnd();
435
+ i0.ɵɵtemplate(7, LimbleTreeNodeComponent_limble_tree_branch_7_Template, 2, 1, "limble-tree-branch", 6);
436
+ i0.ɵɵelementEnd();
437
+ i0.ɵɵtemplate(8, LimbleTreeNodeComponent_drop_zone_8_Template, 1, 1, "drop-zone", 0);
438
+ } if (rf & 2) {
439
+ i0.ɵɵproperty("ngIf", ctx.renderDropZoneAbove === true);
440
+ i0.ɵɵadvance(3);
441
+ i0.ɵɵproperty("dragoverEventThrottle", 10);
442
+ i0.ɵɵadvance(4);
443
+ i0.ɵɵproperty("ngIf", ctx.branch !== undefined && ctx.renderInnerBranch === true);
444
+ i0.ɵɵadvance(1);
445
+ i0.ɵɵproperty("ngIf", ctx.renderDropZoneBelow === true);
446
+ } }, styles: [".dragging[_ngcontent-%COMP%]{position:absolute;transition:transform .01s;transform:translate(-9999px)}"] });
447
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LimbleTreeNodeComponent, [{
448
+ type: Component,
449
+ args: [{ selector: "limble-tree-node", template: "<drop-zone\n *ngIf=\"renderDropZoneAbove === true\"\n [dropZone]=\"dropZoneAbove\"\n></drop-zone>\n<div\n (dragstart)=\"dragstartHandler($event)\"\n (dragend)=\"dragendHandler($event)\"\n class=\"limble-parent-container\"\n #draggableDiv\n>\n <div\n class=\"node-host-container\"\n (dragoverNoChangeDetect)=\"dragoverHandler($event)\"\n [dragoverEventThrottle]=\"10\"\n #nodeHostContainer\n >\n <ng-template #nodeHost></ng-template>\n </div>\n <limble-tree-branch\n *ngIf=\"branch !== undefined && renderInnerBranch === true\"\n [branch]=\"branch\"\n #innerBranch\n ></limble-tree-branch>\n</div>\n<drop-zone\n *ngIf=\"renderDropZoneBelow === true\"\n [dropZone]=\"dropZoneBelow\"\n></drop-zone>\n", styles: [".dragging{position:absolute;transition:transform .01s;transform:translate(-9999px)}\n"] }]
450
+ }], function () { return [{ type: i1.ComponentCreatorService }, { type: i0.ChangeDetectorRef }, { type: i2.DragStateService }, { type: i3.DropZoneService }, { type: i4.TreeService }, { type: i5.GlobalEventsService }, { type: i0.NgZone }, { type: i6.TreeConstructionStatus }]; }, { branch: [{
451
+ type: Input
452
+ }], nodeHost: [{
453
+ type: ViewChild,
454
+ args: ["nodeHost", { read: ViewContainerRef }]
455
+ }], draggableDiv: [{
456
+ type: ViewChild,
457
+ args: ["draggableDiv", { read: ElementRef }]
458
+ }], nodeHostContainer: [{
459
+ type: ViewChild,
460
+ args: ["nodeHostContainer", { read: ElementRef }]
461
+ }], parentHost: [{
462
+ type: Input
463
+ }], innerBranch: [{
464
+ type: ViewChild,
465
+ args: ["innerBranch", { read: LimbleTreeBranchComponent }]
466
+ }] }); })();
467
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltYmxlLXRyZWUtbm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLW5vZGUvbGltYmxlLXRyZWUtbm9kZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLW5vZGUvbGltYmxlLXRyZWUtbm9kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0osU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBSUwsU0FBUyxFQUNULGdCQUFnQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQU12QixPQUFPLEVBQ0osY0FBYyxFQUNkLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNoQixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7Ozs7Ozs7OztJQzNCL0YsK0JBR2E7OztJQURWLCtDQUEwQjs7OztJQWdCMUIsMkNBSXNCOzs7SUFGbkIsc0NBQWlCOzs7SUFJdkIsK0JBR2E7OztJQURWLCtDQUEwQjs7QURTN0IsTUFBTSxPQUFPLHVCQUF1QjtJQXVCakMsWUFDb0IsdUJBQWdELEVBQ2hELGlCQUFvQyxFQUNwQyxnQkFBa0MsRUFDbEMsZUFBZ0MsRUFDaEMsV0FBd0IsRUFDeEIsbUJBQXdDLEVBQ3hDLE1BQWMsRUFDZCxzQkFBOEM7UUFQOUMs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a0JBRHhCLFNBQVM7bUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBSTNDLFVBQVU7a0JBQWxCLEtBQUs7WUFFRSxXQUFXO2tCQURsQixTQUFTO21CQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICBBZnRlclZpZXdJbml0LFxuICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICBDb21wb25lbnQsXG4gICBFbGVtZW50UmVmLFxuICAgSW5wdXQsXG4gICBOZ1pvbmUsXG4gICBPbkRlc3Ryb3ksXG4gICBPbkluaXQsXG4gICBWaWV3Q2hpbGQsXG4gICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21wb25lbnRDcmVhdG9yU2VydmljZSB9IGZyb20gXCIuLi9zaW5nbGV0b25zL2NvbXBvbmVudC1jcmVhdG9yLnNlcnZpY2VcIjtcbmltcG9ydCB7IERyb3Bab25lU2VydmljZSB9IGZyb20gXCIuLi9saW1ibGUtdHJlZS1yb290L2Ryb3Atem9uZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEcmFnU3RhdGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3NpbmdsZXRvbnMvZHJhZy1zdGF0ZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBMaW1ibGVUcmVlTm9kZSwgVHJlZVNlcnZpY2UgfSBmcm9tIFwiLi4vbGltYmxlLXRyZWUtcm9vdC90cmVlLnNlcnZpY2VcIjtcbmltcG9ydCB7IEJyYW5jaCwgQnJhbmNoQ29vcmRpbmF0ZXMgfSBmcm9tIFwiLi4vY2xhc3Nlcy9CcmFuY2hcIjtcbmltcG9ydCB7XG4gICBhcnJheXNBcmVFcXVhbCxcbiAgIGlzRHJhZ2dpbmdBbGxvd2VkLFxuICAgaXNOZXN0aW5nQWxsb3dlZCxcbiAgIHN1ZGRlblRyZWVFeGl0XG59IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBza2lwLCBza2lwVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IEdsb2JhbEV2ZW50c1NlcnZpY2UgfSBmcm9tIFwiLi4vc2luZ2xldG9ucy9nbG9iYWwtZXZlbnRzLnNlcnZpY2VcIjtcbmltcG9ydCB7IERyb3Bab25lIH0gZnJvbSBcIi4uL2NsYXNzZXMvRHJvcFpvbmVcIjtcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBMaW1ibGVUcmVlQnJhbmNoQ29tcG9uZW50IH0gZnJvbSBcIi4uL2xpbWJsZS10cmVlLWJyYW5jaC9saW1ibGUtdHJlZS1icmFuY2guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUcmVlQ29uc3RydWN0aW9uU3RhdHVzIH0gZnJvbSBcIi4uL2xpbWJsZS10cmVlLXJvb3QvdHJlZS1jb25zdHJ1Y3Rpb24tc3RhdHVzLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gICBzZWxlY3RvcjogXCJsaW1ibGUtdHJlZS1ub2RlXCIsXG4gICB0ZW1wbGF0ZVVybDogXCIuL2xpbWJsZS10cmVlLW5vZGUuY29tcG9uZW50Lmh0bWxcIixcbiAgIHN0eWxlVXJsczogW1wiLi9saW1ibGUtdHJlZS1ub2RlLmNvbXBvbmVudC5zY3NzXCJdXG59KVxuZXhwb3J0IGNsYXNzIExpbWJsZVRyZWVOb2RlQ29tcG9uZW50XG4gICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gICBASW5wdXQoKSBicmFuY2g6IEJyYW5jaDxhbnk+IHwgdW5kZWZpbmVkO1xuICAgQFZpZXdDaGlsZChcIm5vZGVIb3N0XCIsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBwcml2YXRlIG5vZGVIb3N0OlxuICAgICAgfCBWaWV3Q29udGFpbmVyUmVmXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgIHB1YmxpYyBkcm9wWm9uZUFib3ZlOiBEcm9wWm9uZSB8IHVuZGVmaW5lZDtcbiAgIHB1YmxpYyByZW5kZXJEcm9wWm9uZUFib3ZlOiBib29sZWFuO1xuICAgcHVibGljIGRyb3Bab25lQmVsb3c6IERyb3Bab25lIHwgdW5kZWZpbmVkO1xuICAgcHVibGljIHJlbmRlckRyb3Bab25lQmVsb3c6IGJvb2xlYW47XG4gICBwdWJsaWMgcmVuZGVySW5uZXJCcmFuY2g6IEJvb2xlYW47XG4gICBAVmlld0NoaWxkKFwiZHJhZ2dhYmxlRGl2XCIsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIGRyYWdnYWJsZURpdjpcbiAgICAgIHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgQFZpZXdDaGlsZChcIm5vZGVIb3N0Q29udGFpbmVyXCIsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgcHJpdmF0ZSBub2RlSG9zdENvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQ7XG4gICBwcml2YXRlIGN1cnJlbnRCcmFuY2hDb29yZGluYXRlczogQnJhbmNoQ29vcmRpbmF0ZXMgfCB1bmRlZmluZWQ7XG4gICBwcml2YXRlIHJlYWRvbmx5IHRyZWVDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgIEBJbnB1dCgpIHBhcmVudEhvc3Q6IFZpZXdDb250YWluZXJSZWYgfCB1bmRlZmluZWQ7XG4gICBAVmlld0NoaWxkKFwiaW5uZXJCcmFuY2hcIiwgeyByZWFkOiBMaW1ibGVUcmVlQnJhbmNoQ29tcG9uZW50IH0pXG4gICBwcml2YXRlIGlubmVyQnJhbmNoOiBMaW1ibGVUcmVlQnJhbmNoQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuXG4gICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50Q3JlYXRvclNlcnZpY2U6IENvbXBvbmVudENyZWF0b3JTZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGRyYWdTdGF0ZVNlcnZpY2U6IERyYWdTdGF0ZVNlcnZpY2UsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bab25lU2VydmljZTogRHJvcFpvbmVTZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmVlU2VydmljZTogVHJlZVNlcnZpY2UsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEV2ZW50c1NlcnZpY2U6IEdsb2JhbEV2ZW50c1NlcnZpY2UsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmVlQ29uc3RydWN0aW9uU3RhdHVzOiBUcmVlQ29uc3RydWN0aW9uU3RhdHVzXG4gICApIHtcbiAgICAgIHRoaXMudHJlZUNvbnN0cnVjdGlvblN0YXR1cy5jb25zdHJ1Y3RpbmcoKTtcbiAgICAgIGlmIChcbiAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UudHJlZU9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgdGhpcy50cmVlU2VydmljZS50cmVlT3B0aW9ucy5saXN0TW9kZSAhPT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgICB0aGlzLnJlbmRlcklubmVyQnJhbmNoID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0aGlzLnJlbmRlcklubmVyQnJhbmNoID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbmRlckRyb3Bab25lQmVsb3cgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVuZGVyRHJvcFpvbmVBYm92ZSA9IGZhbHNlO1xuICAgICAgdGhpcy50cmVlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy50cmVlU2VydmljZS5jaGFuZ2VzJFxuICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAvL1RoZSBmaXJzdCBvbmUgaXMgdGhlIGluaXRpYWwgdHJlZSByZW5kZXIsIHdoaWNoIHdlIGNhbiBpZ25vcmVcbiAgICAgICAgICAgIHNraXAoMSlcbiAgICAgICAgIClcbiAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmVlQ2hhbmdlSGFuZGxlcigpO1xuICAgICAgICAgfSk7XG4gICB9XG5cbiAgIHByaXZhdGUgdHJlZUNoYW5nZUhhbmRsZXIoKSB7XG4gICAgICBpZiAoXG4gICAgICAgICB0aGlzLmJyYW5jaCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICB0aGlzLmN1cnJlbnRCcmFuY2hDb29yZGluYXRlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAhYXJyYXlzQXJlRXF1YWwoXG4gICAgICAgICAgICB0aGlzLmJyYW5jaC5nZXRDb29yZGluYXRlcygpLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50QnJhbmNoQ29vcmRpbmF0ZXNcbiAgICAgICAgIClcbiAgICAgICkge1xuICAgICAgICAgdGhpcy51cGRhdGVEcm9wWm9uZXMoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgbmdPbkluaXQoKSB7XG4gICAgICBpZiAodGhpcy50cmVlU2VydmljZS50cmVlT3B0aW9ucz8uYWxsb3dEcmFnZ2luZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYnJhbmNoPy5nZXRQYXJlbnQoKTtcbiAgICAgIGlmIChwYXJlbnQ/LmRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgIGNvbnN0IHBhcmVudERhdGEgPSBwYXJlbnQ/LmRhdGEgYXMgTGltYmxlVHJlZU5vZGU7XG4gICAgICAgICBpZiAoIWlzTmVzdGluZ0FsbG93ZWQodGhpcy50cmVlU2VydmljZS50cmVlT3B0aW9ucywgcGFyZW50RGF0YSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVySW5uZXJCcmFuY2ggPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucmVnaXN0ZXJEcm9wWm9uZXMoKTtcbiAgICAgIHRoaXMuY3VycmVudEJyYW5jaENvb3JkaW5hdGVzID0gdGhpcy5icmFuY2g/LmdldENvb3JkaW5hdGVzKCk7XG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmRyb3Bab25lQWJvdmUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdGhpcy5kcm9wWm9uZUJlbG93ID09PSB1bmRlZmluZWRcbiAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWm9uZXMgbm90IHJlZ2lzdGVyZWRcIik7XG4gICAgICAgICB9XG4gICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIHRoaXMuZHJvcFpvbmVBYm92ZS5nZXRDb21tQ2hhbm5lbCgpLFxuICAgICAgICAgICAgdGhpcy5kcm9wWm9uZUJlbG93LmdldENvbW1DaGFubmVsKClcbiAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZSA9PT0gXCJjaGVja1JlbmRlcmVkXCIpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0aGlzLmRyb3Bab25lQWJvdmUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wWm9uZUJlbG93ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgIHRoaXMuYnJhbmNoID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWm9uZXMgbm90IHJlZ2lzdGVyZWRcIik7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICB0aGlzLnJlbmRlckRyb3Bab25lQWJvdmUgPSB0aGlzLmRyb3Bab25lQWJvdmUuaXNSZW5kZXJlZCgpO1xuICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJEcm9wWm9uZUJlbG93ID0gdGhpcy5kcm9wWm9uZUJlbG93LmlzUmVuZGVyZWQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICB9XG5cbiAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgIHRoaXMucmVuZGVyTm9kZSgpO1xuICAgICAgdGhpcy5zZXREcm9wWm9uZUhvc3RzKCk7XG4gICAgICB0aGlzLmNoZWNrRm9ySGFuZGxlKCk7XG4gICAgICB0aGlzLnRyZWVDb25zdHJ1Y3Rpb25TdGF0dXMuZG9uZUNvbnN0cnVjdGluZygpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICB9XG5cbiAgIG5nT25EZXN0cm95KCkge1xuICAgICAgdGhpcy50cmVlQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAodGhpcy5kcm9wWm9uZUFib3ZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnJlbW92ZURyb3Bab25lKHRoaXMuZHJvcFpvbmVBYm92ZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcm9wWm9uZUJlbG93ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnJlbW92ZURyb3Bab25lKHRoaXMuZHJvcFpvbmVCZWxvdyk7XG4gICAgICB9XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNsZWFudXBTaWduYWwkLm5leHQodHJ1ZSk7XG4gICB9XG5cbiAgIHB1YmxpYyBkcmFnc3RhcnRIYW5kbGVyKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKFxuICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyID09PSBudWxsIHx8XG4gICAgICAgICB0aGlzLmJyYW5jaCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICB0aGlzLnBhcmVudEhvc3QgPT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gcnVuIGRyYWdzdGFydEhhbmRsZXJcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBkcmFnZ2VkRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmIChkcmFnZ2VkRWxlbWVudC5wYXJlbnRFbGVtZW50Py50YWdOYW1lICE9PSBcIkxJTUJMRS1UUkVFLU5PREVcIikge1xuICAgICAgICAgLy9Eb24ndCBkcmFnIHN0dWZmIHRoYXQgaXNuJ3QgcGFydCBvZiB0aGUgdHJlZVxuICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJtb3ZlXCI7XG4gICAgICB0aGlzLmRyYWdTdGF0ZVNlcnZpY2UuZHJhZ2dpbmcodGhpcy5icmFuY2gsIHRoaXMucGFyZW50SG9zdCk7XG4gICAgICBjb25zdCB0cmVlRWxlbWVudCA9IGRyYWdnZWRFbGVtZW50LmNsb3Nlc3QoXCJsaW1ibGUtdHJlZS1yb290XCIpO1xuICAgICAgaWYgKHRyZWVFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZ2V0IHJvb3Qgb2YgdHJlZVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgIC8vV2UgaGF2ZSB0byB1c2UgYSBzZXRUaW1lb3V0IGR1ZSB0byBhIGJ1ZyBpbiBjaHJvbWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMDczMzg3MC84Nzk2NjUxXG4gICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJkcmFnZ2luZ1wiKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UudHJlZURhdGE/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgdGhpcy5icmFuY2g/LmdldENvb3JkaW5hdGVzKCkubGVuZ3RoID09PSAxXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgIC8vV2UgYXJlIGRyYWdnaW5nIHRoZSBvbmx5IGVsZW1lbnQgaW4gdGhlIHRyZWUsIHNvIHdlIGhhdmUgdG8gdXNlIHRoZSBwbGFjZWhvbGRlciBzeXN0ZW1cbiAgICAgICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UucGxhY2Vob2xkZXIkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9KTtcbiAgICAgICAgIC8vV2UgdXNlIHRoaXMgd2VpcmQgc3Vic2NyaXB0aW9uL3RpbWVvdXQgY29tYm8gaW4gb3JkZXIgdG8gYXZvaWQgYSBzdHJhbmdlIGJ1ZyB3aGVyZSB0aGUgZHJhZ2xlYXZlIGV2ZW50XG4gICAgICAgICAvL2RvZXMgbm90IGZpcmUgaWYgdGhlIHVzZXIgZHJhZ3Mgb3V0IG9mIHRoZSB0cmVlIHRvbyBxdWlja2x5LiBUaGlzIGlzc3VlIHdvdWxkIG1ha2UgdGhlIGRyb3Agem9uZVxuICAgICAgICAgLy9yZW1haW4gaW4gdGhlIFVJLCBwb3RlbnRpYWxseSBjYXVzaW5nIGRyb3Agem9uZXMgdG8gYXBwZWFyIGluIG11bHRpcGxlIHRyZWVzIGF0IGEgdGltZS4gVGhpcyBzdWJzY3JpcHRpb25cbiAgICAgICAgIC8vd2FpdHMgZm9yIHRoZSBkcmFnb3ZlciBldmVudCBvbiB0aGUgdHJlZSB0byBmaXJlIGJlZm9yZSByZW5kZXJpbmcgYW55IGRyb3Agem9uZXMuIElmIHRoZSBkcmFnb3ZlclxuICAgICAgICAgLy9ldmVudCBkb2VzIG5vdCBmaXJlIHdpdGhpbiBhIGhhbGYgc2Vjb25kLCB3ZSBrbm93IHRoZSBtb3VzZSBsZWZ0IHRoZSB0cmVlIHRvbyBxdWlja2x5LCBhbmQgd2Ugd29uJ3RcbiAgICAgICAgIC8vcmVuZGVyIHRoZSBkcm9wIHpvbmUgYXQgYWxsLlxuICAgICAgICAgY29uc3QgZHJhZ1N1YnNjcmlwdGlvbiA9IGZyb21FdmVudCh0cmVlRWxlbWVudCwgXCJkcmFnb3ZlclwiKVxuICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGRyYWdvdmVyRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgIGRyYWdvdmVyRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICBpZiAodGhpcy5icmFuY2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IHNob3cgc3Vycm91bmRpbmcgZHJvcCB6b25lc1wiKTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYnJhbmNoLmdldFBhcmVudCgpO1xuICAgICAgICAgICAgICAgbGV0IHBhcmVudERhdGE6IExpbWJsZVRyZWVOb2RlO1xuICAgICAgICAgICAgICAgbGV0IHBhcmVudE5lc3RpbmdBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgIGlmIChwYXJlbnQ/LmRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHBhcmVudERhdGEgPSBwYXJlbnQ/LmRhdGEgYXMgTGltYmxlVHJlZU5vZGU7XG4gICAgICAgICAgICAgICAgICBwYXJlbnROZXN0aW5nQWxsb3dlZCA9IGlzTmVzdGluZ0FsbG93ZWQoXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnRyZWVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgcGFyZW50RGF0YVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bab25lQWJvdmUgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnROZXN0aW5nQWxsb3dlZCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wWm9uZVNlcnZpY2Uuc2hvd0Ryb3Bab25lRmFtaWx5KHRoaXMuZHJvcFpvbmVBYm92ZSwge1xuICAgICAgICAgICAgICAgICAgICAgam9pbkZhbWlsaWVzOiB0cnVlXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRyYWdTdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICAgICAgICAgICBkcmFnU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9LCA1MDApO1xuICAgICAgfSk7XG4gICB9XG5cbiAgIHB1YmxpYyBkcmFnZW5kSGFuZGxlcihldmVudD86IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKHRoaXMuZHJhZ2dhYmxlRGl2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBnZXQgZHJhZ2dhYmxlIGRpdlwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHJhZ2dhYmxlRGl2Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImRyYWdnaW5nXCIpO1xuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlU2VydmljZS5nZXRTdGF0ZSgpID09PSBcImNhcHR1cmVkXCIpIHtcbiAgICAgICAgIGlmICh0aGlzLnRyZWVTZXJ2aWNlLmNhcHR1cmVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgLy9Ecm9wcGVkIGluIGEgZGlmZmVyZW50IHRyZWUuIFJlbW92ZSB0aGUgb25lIGluIHRoaXMgdHJlZVxuICAgICAgICAgICAgaWYgKHRoaXMuYnJhbmNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBnZXQgYnJhbmNoIGluIGRyYWdlbmRIYW5kbGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmVlU2VydmljZS5jbGVhbnVwU2lnbmFsJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy50cmVlU2VydmljZS5jYXB0dXJlZCA9IGZhbHNlO1xuICAgICAgICAgfVxuICAgICAgICAgdGhpcy5kcmFnU3RhdGVTZXJ2aWNlLnJlbGVhc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAvL1dhc24ndCBkcm9wcGVkIGludG8gYSB2YWxpZCB0cmVlLCBzbyByZXNldCBmb3IgbmV4dCBkcmFnIGFuZFxuICAgICAgICAgLy9kb24ndCBkbyBhbnl0aGluZyBlbHNlLlxuICAgICAgICAgdGhpcy5kcmFnU3RhdGVTZXJ2aWNlLnJlbGVhc2UoKTtcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmNsZWFyVmlzaWJsZVpvbmVzKCk7XG4gICAgICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5yZXN0b3JlRmFtaWxpZXMoKTtcbiAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UudHJlZURhdGE/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgdGhpcy5icmFuY2g/LmdldENvb3JkaW5hdGVzKCkubGVuZ3RoID09PSAxXG4gICAgICAgICApIHtcbiAgICAgICAgICAgIC8vV2Ugd2VyZSBkcmFnZ2luZyB0aGUgb25seSBlbGVtZW50IGluIHRoZSB0cmVlLCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgICAgICAvL3JlbW92ZSB0aGUgcGxhY2Vob2xkZXIgdGhhdCB3ZSBhZGRlZCBpbiB0aGUgZHJhZ3N0YXJ0XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnBsYWNlaG9sZGVyJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIGRyYWdvdmVySGFuZGxlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgICBpZiAodGhpcy5nbG9iYWxFdmVudHNTZXJ2aWNlLnNjcm9sbGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYnJhbmNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGdldCBjdXJyZW50IGJyYW5jaCBkdXJpbmcgZHJhZ292ZXIgZXZlbnRcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5kcmFnU3RhdGVTZXJ2aWNlLmdldERhdGEoKTtcbiAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIC8vVGhleSBtaWdodCBiZSBkcmFnZ2luZyBzb21ldGhpbmcgdGhhdCBpc24ndCBhIG5vZGUuIEp1c3QgaWdub3JlIGl0LlxuICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc291cmNlQnJhbmNoID0gZGF0YS5icmFuY2g7XG4gICAgICAvL0lmIHRyeWluZyB0byBkcm9wIG9uIHNlbGYsIHJldHVybi5cbiAgICAgIGlmIChcbiAgICAgICAgIHNvdXJjZUJyYW5jaCA9PT0gdGhpcy5icmFuY2ggfHxcbiAgICAgICAgIHRoaXMuYnJhbmNoLmdldEFuY2VzdG9ycygpLmluY2x1ZGVzKHNvdXJjZUJyYW5jaClcbiAgICAgICkge1xuICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXG4gICAgICAgICBcIi5ub2RlLWhvc3QtY29udGFpbmVyXCJcbiAgICAgICk7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kIG5vZGUgaG9zdCBjb250YWluZXIgd2hpbGUgZHJhZ2dpbmdcIik7XG4gICAgICB9XG4gICAgICBsZXQgdG9wTGluZTogbnVtYmVyO1xuICAgICAgbGV0IGJvdHRvbUxpbmU6IG51bWJlcjtcbiAgICAgIGlmICh0aGlzLmlubmVyQnJhbmNoPy5yZW5kZXJEcm9wWm9uZUluc2lkZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgIHRvcExpbmUgPSB0YXJnZXQub2Zmc2V0SGVpZ2h0IC8gMiAtIDY7XG4gICAgICAgICBib3R0b21MaW5lID0gdG9wTGluZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0b3BMaW5lID0gdGFyZ2V0Lm9mZnNldEhlaWdodCAvIDMgLSAzOyAvL2FuIGltYWdpbmFyeSBsaW5lIDEvMyBvZiB0aGUgd2F5IGRvd24gZnJvbSB0aGUgdG9wIG9mIHRoZSBlbGVtZW50O1xuICAgICAgICAgYm90dG9tTGluZSA9IHRvcExpbmUgKiAyOyAvL2FuIGltYWdpbmFyeSBsaW5lIDEvMyBvZiB0aGUgd2F5IHVwIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgZWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYnJhbmNoLmdldFBhcmVudCgpO1xuICAgICAgbGV0IHBhcmVudERhdGE6IExpbWJsZVRyZWVOb2RlO1xuICAgICAgbGV0IHBhcmVudE5lc3RpbmdBbGxvd2VkID0gdHJ1ZTtcbiAgICAgIGlmIChwYXJlbnQ/LmRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgIHBhcmVudERhdGEgPSBwYXJlbnQ/LmRhdGEgYXMgTGltYmxlVHJlZU5vZGU7XG4gICAgICAgICBwYXJlbnROZXN0aW5nQWxsb3dlZCA9IGlzTmVzdGluZ0FsbG93ZWQoXG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnRyZWVPcHRpb25zLFxuICAgICAgICAgICAgcGFyZW50RGF0YVxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8qKiBUaGUgeS1jb29yZGluYXRlcyBvZiB0aGUgbW91c2UgaW4gcmVsYXRpb24gdG8gdGhlIG5vZGUgaXQgaXMgaG92ZXJpbmcgb3ZlciAqL1xuICAgICAgY29uc3Qgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgY29uc3QgYWN0aXZlRHJvcFpvbmUgPSB0aGlzLmRyb3Bab25lU2VydmljZS5nZXRBY3RpdmVEcm9wWm9uZSgpO1xuICAgICAgaWYgKFxuICAgICAgICAgb2Zmc2V0WSA8IHRvcExpbmUgJiZcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVBYm92ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICBwYXJlbnROZXN0aW5nQWxsb3dlZCAmJlxuICAgICAgICAgKGFjdGl2ZURyb3Bab25lID09PSBudWxsIHx8XG4gICAgICAgICAgICAhRHJvcFpvbmUuZHJvcFpvbmVMb2NhdGlvbnNBcmVFcXVhbChcbiAgICAgICAgICAgICAgIGFjdGl2ZURyb3Bab25lLFxuICAgICAgICAgICAgICAgdGhpcy5kcm9wWm9uZUFib3ZlXG4gICAgICAgICAgICApKVxuICAgICAgKSB7XG4gICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuYnJhbmNoLmdldEluZGV4KCk7XG4gICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FuJ3QgZ2V0IGJyYW5jaCBpbmRleFwiKTtcbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnNob3dEcm9wWm9uZUZhbWlseSh0aGlzLmRyb3Bab25lQWJvdmUsIHtcbiAgICAgICAgICAgIGFjdGl2YXRlTG93ZXN0SW5zdGVhZE9mRm91bmRlcjogdHJ1ZVxuICAgICAgICAgfSk7XG4gICAgICAgICBpZiAoc3VkZGVuVHJlZUV4aXQoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5jbGVhclZpc2libGVab25lcygpO1xuICAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIG9mZnNldFkgPCBib3R0b21MaW5lICYmXG4gICAgICAgICBvZmZzZXRZID4gdG9wTGluZSAmJlxuICAgICAgICAgdGhpcy5pbm5lckJyYW5jaD8ucmVuZGVyRHJvcFpvbmVJbnNpZGUgPT09IHRydWUgJiZcbiAgICAgICAgIHRoaXMuaW5uZXJCcmFuY2g/LmRyb3Bab25lSW5zaWRlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIChhY3RpdmVEcm9wWm9uZSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgIURyb3Bab25lLmRyb3Bab25lTG9jYXRpb25zQXJlRXF1YWwoXG4gICAgICAgICAgICAgICBhY3RpdmVEcm9wWm9uZSxcbiAgICAgICAgICAgICAgIHRoaXMuaW5uZXJCcmFuY2guZHJvcFpvbmVJbnNpZGVcbiAgICAgICAgICAgICkpXG4gICAgICApIHtcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnNob3dEcm9wWm9uZUZhbWlseShcbiAgICAgICAgICAgIHRoaXMuaW5uZXJCcmFuY2guZHJvcFpvbmVJbnNpZGVcbiAgICAgICAgICk7XG4gICAgICAgICBpZiAoc3VkZGVuVHJlZUV4aXQoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5jbGVhclZpc2libGVab25lcygpO1xuICAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIG9mZnNldFkgPj0gYm90dG9tTGluZSAmJlxuICAgICAgICAgdGhpcy5kcm9wWm9uZUJlbG93ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIHBhcmVudE5lc3RpbmdBbGxvd2VkICYmXG4gICAgICAgICAoYWN0aXZlRHJvcFpvbmUgPT09IG51bGwgfHxcbiAgICAgICAgICAgICFEcm9wWm9uZS5kcm9wWm9uZUxvY2F0aW9uc0FyZUVxdWFsKFxuICAgICAgICAgICAgICAgYWN0aXZlRHJvcFpvbmUsXG4gICAgICAgICAgICAgICB0aGlzLmRyb3Bab25lQmVsb3dcbiAgICAgICAgICAgICkpICYmXG4gICAgICAgICB0aGlzLmJyYW5jaC5nZXRDaGlsZHJlbigpLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuYnJhbmNoLmdldEluZGV4KCk7XG4gICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FuJ3QgZ2V0IGJyYW5jaCBpbmRleFwiKTtcbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnNob3dEcm9wWm9uZUZhbWlseSh0aGlzLmRyb3Bab25lQmVsb3cpO1xuICAgICAgICAgaWYgKHN1ZGRlblRyZWVFeGl0KGV2ZW50KSkge1xuICAgICAgICAgICAgdGhpcy5kcm9wWm9uZVNlcnZpY2UuY2xlYXJWaXNpYmxlWm9uZXMoKTtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSByZW5kZXJOb2RlKCkge1xuICAgICAgaWYgKHRoaXMubm9kZUhvc3QgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmJyYW5jaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVuZGVyIHRyZWUgbm9kZVwiKTtcbiAgICAgIH1cbiAgICAgIGxldCBjb21wb25lbnQgPSB0aGlzLmJyYW5jaC5kYXRhLmNvbXBvbmVudDtcbiAgICAgIGlmIChjb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgY29tcG9uZW50ID0gdGhpcy50cmVlU2VydmljZS50cmVlT3B0aW9ucz8uZGVmYXVsdENvbXBvbmVudDtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibGltYmxlVHJlZSByZXF1aXJlcyBhIGNvbXBvbmVudCB0byByZW5kZXJcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbXBvbmVudENyZWF0b3JTZXJ2aWNlLmFwcGVuZENvbXBvbmVudDxhbnk+KFxuICAgICAgICAgY29tcG9uZW50LmNsYXNzLFxuICAgICAgICAgdGhpcy5ub2RlSG9zdFxuICAgICAgKTtcbiAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5ub2RlRGF0YSA9IHRoaXMuYnJhbmNoLmRhdGE7XG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgaW4gY29tcG9uZW50LmJpbmRpbmdzKSB7XG4gICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2VbYmluZGluZ10gPSBjb21wb25lbnQuYmluZGluZ3NbYmluZGluZ107XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgcmVnaXN0ZXJEcm9wWm9uZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmFkZERyb3Bab25lQWJvdmUoKTtcbiAgICAgIHRoaXMuYWRkRHJvcFpvbmVCZWxvdygpO1xuICAgfVxuXG4gICBwcml2YXRlIGFkZERyb3Bab25lQWJvdmUoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5icmFuY2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlZ2lzdGVyIGRyb3Agem9uZSBhYm92ZVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYnJhbmNoLmdldFBhcmVudCgpO1xuICAgICAgY29uc3QgY3VycmVudENvb3JkaW5hdGVzID0gdGhpcy5icmFuY2guZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gY3VycmVudENvb3JkaW5hdGVzW2N1cnJlbnRDb29yZGluYXRlcy5sZW5ndGggLSAxXTtcbiAgICAgIHRoaXMuZHJvcFpvbmVBYm92ZSA9IG5ldyBEcm9wWm9uZShcbiAgICAgICAgIFsuLi4ocGFyZW50Py5nZXRDb29yZGluYXRlcygpID8/IFtdKV0sXG4gICAgICAgICBpbmRleFxuICAgICAgKTtcbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmFkZERyb3Bab25lKHRoaXMuZHJvcFpvbmVBYm92ZSk7XG4gICB9XG5cbiAgIHByaXZhdGUgYWRkRHJvcFpvbmVCZWxvdygpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmJyYW5jaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gcmVnaXN0ZXIgZHJvcCB6b25lIGJlbG93XCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5icmFuY2guZ2V0UGFyZW50KCk7XG4gICAgICBjb25zdCBjdXJyZW50Q29vcmRpbmF0ZXMgPSB0aGlzLmJyYW5jaC5nZXRDb29yZGluYXRlcygpO1xuICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50Q29vcmRpbmF0ZXNbY3VycmVudENvb3JkaW5hdGVzLmxlbmd0aCAtIDFdO1xuICAgICAgdGhpcy5kcm9wWm9uZUJlbG93ID0gbmV3IERyb3Bab25lKFxuICAgICAgICAgWy4uLihwYXJlbnQ/LmdldENvb3JkaW5hdGVzKCkgPz8gW10pXSxcbiAgICAgICAgIGluZGV4ICsgMVxuICAgICAgKTtcbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmFkZERyb3Bab25lKHRoaXMuZHJvcFpvbmVCZWxvdyk7XG4gICB9XG5cbiAgIHByaXZhdGUgdXBkYXRlRHJvcFpvbmVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5jdXJyZW50QnJhbmNoQ29vcmRpbmF0ZXMgPSB0aGlzLmJyYW5jaD8uZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICAgIHRoaXMudXBkYXRlRHJvcFpvbmVBYm92ZSgpO1xuICAgICAgdGhpcy51cGRhdGVEcm9wWm9uZUJlbG93KCk7XG4gICAgICB0aGlzLnVwZGF0ZURyb3Bab25lSW5zaWRlKCk7XG4gICAgICB0aGlzLnNldERyb3Bab25lSG9zdHMoKTtcbiAgIH1cblxuICAgcHJpdmF0ZSB1cGRhdGVEcm9wWm9uZUFib3ZlKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuYnJhbmNoID09PSB1bmRlZmluZWQgfHwgdGhpcy5kcm9wWm9uZUFib3ZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImZhaWxlZCB0byB1cGRhdGUgZHJvcCB6b25lIGFib3ZlXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5icmFuY2guZ2V0UGFyZW50KCk7XG4gICAgICBjb25zdCBjdXJyZW50Q29vcmRpbmF0ZXMgPSB0aGlzLmJyYW5jaC5nZXRDb29yZGluYXRlcygpO1xuICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50Q29vcmRpbmF0ZXNbY3VycmVudENvb3JkaW5hdGVzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmRyb3Bab25lQWJvdmUuZ2V0TG9jYXRpb24oKTtcbiAgICAgIGxvY2F0aW9uLnNldFBhcmVudENvb3JkaW5hdGVzKFsuLi4ocGFyZW50Py5nZXRDb29yZGluYXRlcygpID8/IFtdKV0pO1xuICAgICAgbG9jYXRpb24uc2V0SW5zZXJ0SW5kZXgoaW5kZXgpO1xuICAgfVxuXG4gICBwcml2YXRlIHVwZGF0ZURyb3Bab25lQmVsb3coKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5icmFuY2ggPT09IHVuZGVmaW5lZCB8fCB0aGlzLmRyb3Bab25lQmVsb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHVwZGF0ZSBkcm9wIHpvbmUgYmVsb3dcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmJyYW5jaC5nZXRQYXJlbnQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb29yZGluYXRlcyA9IHRoaXMuYnJhbmNoLmdldENvb3JkaW5hdGVzKCk7XG4gICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRDb29yZGluYXRlc1tjdXJyZW50Q29vcmRpbmF0ZXMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuZHJvcFpvbmVCZWxvdy5nZXRMb2NhdGlvbigpO1xuICAgICAgbG9jYXRpb24uc2V0UGFyZW50Q29vcmRpbmF0ZXMoWy4uLihwYXJlbnQ/LmdldENvb3JkaW5hdGVzKCkgPz8gW10pXSk7XG4gICAgICBsb2NhdGlvbi5zZXRJbnNlcnRJbmRleChpbmRleCArIDEpO1xuICAgfVxuXG4gICBwcml2YXRlIHVwZGF0ZURyb3Bab25lSW5zaWRlKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaW5uZXJCcmFuY2g/LmRyb3Bab25lSW5zaWRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmJyYW5jaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gdXBkYXRlIGRyb3Agem9uZSBpbnNpZGVcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuaW5uZXJCcmFuY2guZHJvcFpvbmVJbnNpZGUuZ2V0TG9jYXRpb24oKTtcbiAgICAgIGxvY2F0aW9uLnNldFBhcmVudENvb3JkaW5hdGVzKFsuLi50aGlzLmJyYW5jaC5nZXRDb29yZGluYXRlcygpXSk7XG4gICB9XG5cbiAgIHByaXZhdGUgc2V0RHJvcFpvbmVIb3N0cygpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVBYm92ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICB0aGlzLmRyb3Bab25lQmVsb3cgPT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmRyb3Bab25lQWJvdmUuc2V0SG9zdCh0aGlzLnBhcmVudEhvc3QpO1xuICAgICAgdGhpcy5kcm9wWm9uZUJlbG93LnNldEhvc3QodGhpcy5wYXJlbnRIb3N0KTtcbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja0ZvckhhbmRsZSgpOiB2b2lkIHtcbiAgICAgIGlmIChcbiAgICAgICAgIHRoaXMubm9kZUhvc3RDb250YWluZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgdGhpcy5kcmFnZ2FibGVEaXYgPT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBub2RlSG9zdENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLm5vZGVIb3N0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBoYW5kbGUgPSBub2RlSG9zdENvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgIFwiLmxpbWJsZS10cmVlLWhhbmRsZVwiXG4gICAgICApO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlRGl2RWxlbWVudCA9IHRoaXMuZHJhZ2dhYmxlRGl2Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWlzRHJhZ2dpbmdBbGxvd2VkKHRoaXMudHJlZVNlcnZpY2UudHJlZU9wdGlvbnMsIHRoaXMuYnJhbmNoPy5kYXRhKSkge1xuICAgICAgICAgZHJhZ2dhYmxlRGl2RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIiwgXCJmYWxzZVwiKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlID09PSBudWxsKSB7XG4gICAgICAgICBkcmFnZ2FibGVEaXZFbGVtZW50LnNldEF0dHJpYnV0ZShcImRyYWdnYWJsZVwiLCBcInRydWVcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgKCkgPT4ge1xuICAgICAgICAgICAgZHJhZ2dhYmxlRGl2RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgLy9Gb3Igc29tZSByZWFzb24gbW91c2V1cCBkb2Vzbid0IGZpcmUgYWZ0ZXIgYSBkcmFnLCBzbyB3ZSB1c2UgdGhpcyBvYnNlcnZhYmxlIHNlcXVlbmNlIGluc3RlYWQuXG4gICAgICAgICAgICBjb25zdCBkcmFnZ2luZyA9IHRoaXMuZHJhZ1N0YXRlU2VydmljZS5zdGF0ZSQucGlwZShcbiAgICAgICAgICAgICAgIGZpbHRlcigoc3RhdGUpID0+IHN0YXRlID09PSBcImRyYWdnaW5nXCIpLFxuICAgICAgICAgICAgICAgZmlyc3QoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXRlU2VydmljZS5zdGF0ZSRcbiAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgc2tpcFVudGlsKGRyYWdnaW5nKSxcbiAgICAgICAgICAgICAgICAgIGZpbHRlcigoc3RhdGUpID0+IHN0YXRlID09PSBcImlkbGVcIiksXG4gICAgICAgICAgICAgICAgICBmaXJzdCgpXG4gICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZURpdkVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIsIFwiZmFsc2VcIik7XG4gICAgICAgICAgICAgICB9KTtcbiAgICAgICAgIH0pO1xuICAgICAgfVxuICAgfVxufVxuIiwiPGRyb3Atem9uZVxuICAgKm5nSWY9XCJyZW5kZXJEcm9wWm9uZUFib3ZlID09PSB0cnVlXCJcbiAgIFtkcm9wWm9uZV09XCJkcm9wWm9uZUFib3ZlXCJcbj48L2Ryb3Atem9uZT5cbjxkaXZcbiAgIChkcmFnc3RhcnQpPVwiZHJhZ3N0YXJ0SGFuZGxlcigkZXZlbnQpXCJcbiAgIChkcmFnZW5kKT1cImRyYWdlbmRIYW5kbGVyKCRldmVudClcIlxuICAgY2xhc3M9XCJsaW1ibGUtcGFyZW50LWNvbnRhaW5lclwiXG4gICAjZHJhZ2dhYmxlRGl2XG4+XG4gICA8ZGl2XG4gICAgICBjbGFzcz1cIm5vZGUtaG9zdC1jb250YWluZXJcIlxuICAgICAgKGRyYWdvdmVyTm9DaGFuZ2VEZXRlY3QpPVwiZHJhZ292ZXJIYW5kbGVyKCRldmVudClcIlxuICAgICAgW2RyYWdvdmVyRXZlbnRUaHJvdHRsZV09XCIxMFwiXG4gICAgICAjbm9kZUhvc3RDb250YWluZXJcbiAgID5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9kZUhvc3Q+PC9uZy10ZW1wbGF0ZT5cbiAgIDwvZGl2PlxuICAgPGxpbWJsZS10cmVlLWJyYW5jaFxuICAgICAgKm5nSWY9XCJicmFuY2ggIT09IHVuZGVmaW5lZCAmJiByZW5kZXJJbm5lckJyYW5jaCA9PT0gdHJ1ZVwiXG4gICAgICBbYnJhbmNoXT1cImJyYW5jaFwiXG4gICAgICAjaW5uZXJCcmFuY2hcbiAgID48L2xpbWJsZS10cmVlLWJyYW5jaD5cbjwvZGl2PlxuPGRyb3Atem9uZVxuICAgKm5nSWY9XCJyZW5kZXJEcm9wWm9uZUJlbG93ID09PSB0cnVlXCJcbiAgIFtkcm9wWm9uZV09XCJkcm9wWm9uZUJlbG93XCJcbj48L2Ryb3Atem9uZT5cbiJdfQ==
@@ -62,14 +62,9 @@ LimbleTreePlaceholderComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ ty
62
62
  i0.ɵɵelementEnd();
63
63
  } if (rf & 2) {
64
64
  i0.ɵɵproperty("dropZone", ctx.dropZone);
65
- } }, directives: [i4.DropZoneComponent, i5.DragoverNoChangeDetectDirective], styles: [".placeholder[_ngcontent-%COMP%]{width:100%;height:20px}"], changeDetection: 0 });
65
+ } }, dependencies: [i4.DropZoneComponent, i5.DragoverNoChangeDetectDirective], styles: [".placeholder[_ngcontent-%COMP%]{width:100%;height:20px}"], changeDetection: 0 });
66
66
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LimbleTreePlaceholderComponent, [{
67
67
  type: Component,
68
- args: [{
69
- selector: "limble-tree-placeholder",
70
- templateUrl: "./limble-tree-placeholder.component.html",
71
- styleUrls: ["./limble-tree-placeholder.component.scss"],
72
- changeDetection: ChangeDetectionStrategy.OnPush
73
- }]
68
+ args: [{ selector: "limble-tree-placeholder", changeDetection: ChangeDetectionStrategy.OnPush, template: "<drop-zone [dropZone]=\"dropZone\"></drop-zone>\n<div class=\"placeholder\" (dragoverNoChangeDetect)=\"dragoverHandler()\"></div>\n", styles: [".placeholder{width:100%;height:20px}\n"] }]
74
69
  }], function () { return [{ type: i1.DropZoneService }, { type: i0.ChangeDetectorRef }, { type: i2.TreeService }, { type: i3.TreeConstructionStatus }]; }, null); })();
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltYmxlLXRyZWUtcGxhY2Vob2xkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGltYmxlLXRyZWUvc3JjL2xpYi9saW1ibGUtdHJlZS1wbGFjZWhvbGRlci9saW1ibGUtdHJlZS1wbGFjZWhvbGRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLXBsYWNlaG9sZGVyL2xpbWJsZS10cmVlLXBsYWNlaG9sZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSix1QkFBdUIsRUFFdkIsU0FBUyxFQUdYLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQVcvQyxNQUFNLE9BQU8sOEJBQThCO0lBS3hDLFlBQ29CLGVBQWdDLEVBQ2hDLGlCQUFvQyxFQUNwQyxXQUF3QixFQUN4QixzQkFBOEM7UUFIOUMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUUvRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0MsOEVBQThFO1FBQzlFLG1GQUFtRjtRQUNuRixvRkFBb0Y7UUFDcEYsa0ZBQWtGO1FBQ2xGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQ25FLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUM5QixPQUFPO2FBQ1Q7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNqQixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0M7UUFDSixDQUFDLENBQ0gsQ0FBQztJQUNMLENBQUM7SUFFTSxRQUFRO1FBQ1osSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxlQUFlO1FBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVNLGVBQWU7UUFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUM5QixPQUFPO1NBQ1Q7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sV0FBVztRQUNmLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztTQUM1RDtRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDOzs0R0F6RFMsOEJBQThCO2lGQUE5Qiw4QkFBOEI7UUNwQjNDLCtCQUE2QztRQUM3Qyw4QkFBc0U7UUFBN0MsMElBQTBCLHFCQUFpQixJQUFDO1FBQUMsaUJBQU07O1FBRGpFLHVDQUFxQjs7dUZEb0JuQiw4QkFBOEI7Y0FOMUMsU0FBUztlQUFDO2dCQUNSLFFBQVEsRUFBRSx5QkFBeUI7Z0JBQ25DLFdBQVcsRUFBRSwwQ0FBMEM7Z0JBQ3ZELFNBQVMsRUFBRSxDQUFDLDBDQUEwQyxDQUFDO2dCQUN2RCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTthQUNqRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgIEFmdGVyVmlld0luaXQsXHJcbiAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgQ29tcG9uZW50LFxyXG4gICBPbkRlc3Ryb3ksXHJcbiAgIE9uSW5pdFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IERyb3Bab25lIH0gZnJvbSBcIi4uL2NsYXNzZXMvRHJvcFpvbmVcIjtcclxuaW1wb3J0IHsgRHJvcFpvbmVTZXJ2aWNlIH0gZnJvbSBcIi4uL2xpbWJsZS10cmVlLXJvb3QvZHJvcC16b25lLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVHJlZUNvbnN0cnVjdGlvblN0YXR1cyB9IGZyb20gXCIuLi9saW1ibGUtdHJlZS1yb290L3RyZWUtY29uc3RydWN0aW9uLXN0YXR1cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRyZWVTZXJ2aWNlIH0gZnJvbSBcIi4uL2xpbWJsZS10cmVlLXJvb3QvdHJlZS5zZXJ2aWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgc2VsZWN0b3I6IFwibGltYmxlLXRyZWUtcGxhY2Vob2xkZXJcIixcclxuICAgdGVtcGxhdGVVcmw6IFwiLi9saW1ibGUtdHJlZS1wbGFjZWhvbGRlci5jb21wb25lbnQuaHRtbFwiLFxyXG4gICBzdHlsZVVybHM6IFtcIi4vbGltYmxlLXRyZWUtcGxhY2Vob2xkZXIuY29tcG9uZW50LnNjc3NcIl0sXHJcbiAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaW1ibGVUcmVlUGxhY2Vob2xkZXJDb21wb25lbnRcclxuICAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgIHB1YmxpYyBkcm9wWm9uZTogRHJvcFpvbmUgfCB1bmRlZmluZWQ7XHJcbiAgIHByaXZhdGUgcmVhZG9ubHkgcGxhY2Vob2xkZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcclxuICAgICAgcHJpdmF0ZSByZWFkb25seSBkcm9wWm9uZVNlcnZpY2U6IERyb3Bab25lU2VydmljZSxcclxuICAgICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgdHJlZVNlcnZpY2U6IFRyZWVTZXJ2aWNlLFxyXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHRyZWVDb25zdHJ1Y3Rpb25TdGF0dXM6IFRyZWVDb25zdHJ1Y3Rpb25TdGF0dXNcclxuICAgKSB7XHJcbiAgICAgIHRoaXMudHJlZUNvbnN0cnVjdGlvblN0YXR1cy5jb25zdHJ1Y3RpbmcoKTtcclxuICAgICAgLy9UaGlzIGxvZ2ljIGlzIHZlcnkgc2ltaWxhciB0byB3aGF0IHRoZSBsaWZlY3ljbGUgaG9va3Mgb2YgdGhpcyBjb21wb25lbnQgZG8uXHJcbiAgICAgIC8vV2UgdXNlIHRoaXMgc3Vic2NyaXB0aW9uIGJlY2F1c2Ugc29tZXRpbWVzIHdlIGNhbid0IHdhaXQgZm9yIHRoZSBsaWZlY3ljbGUgaG9va3M6XHJcbiAgICAgIC8vU3BlY2lmaWNhbGx5LCB0aGUgZHJvcCB6b25lIHJlZ2lzdHJhdGlvbiBhbmQgZGVyZWdpc3RyYXRpb24gc29tZXRpbWVzIGNhbid0IGhhcHBlblxyXG4gICAgICAvL2FzeW5jaHJvbm91c2x5IHdpdGhvdXQgY2F1c2luZyBidWdzLiBTbyB3ZSBoYW5kbGUgaXQgc3luY2hyb25vdXNseSBoZXJlIGFzIHdlbGwuXHJcbiAgICAgIHRoaXMucGxhY2Vob2xkZXJTdWJzY3JpcHRpb24gPSB0aGlzLnRyZWVTZXJ2aWNlLnBsYWNlaG9sZGVyJC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcm9wWm9uZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5yZW1vdmVEcm9wWm9uZSh0aGlzLmRyb3Bab25lKTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmFkZERyb3Bab25lKHRoaXMuZHJvcFpvbmUpO1xyXG4gICAgICAgICAgICAgICB0aGlzLmRyb3Bab25lLnNldEhvc3QodGhpcy50cmVlU2VydmljZS5ob3N0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgIH1cclxuXHJcbiAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgdGhpcy5kcm9wWm9uZSA9IG5ldyBEcm9wWm9uZShbXSwgMCk7XHJcbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmFkZERyb3Bab25lKHRoaXMuZHJvcFpvbmUpO1xyXG4gICB9XHJcblxyXG4gICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICBpZiAodGhpcy5kcm9wWm9uZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInBsYWNlaG9sZGVyIGRyb3Agem9uZSBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRyb3Bab25lLnNldEhvc3QodGhpcy50cmVlU2VydmljZS5ob3N0KTtcclxuICAgICAgdGhpcy50cmVlQ29uc3RydWN0aW9uU3RhdHVzLmRvbmVDb25zdHJ1Y3RpbmcoKTtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgIH1cclxuXHJcbiAgIHB1YmxpYyBkcmFnb3ZlckhhbmRsZXIoKSB7XHJcbiAgICAgIGlmICh0aGlzLmRyb3Bab25lID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnNob3dEcm9wWm9uZUZhbWlseSh0aGlzLmRyb3Bab25lKTtcclxuICAgfVxyXG5cclxuICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICB0aGlzLnBsYWNlaG9sZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIGlmICh0aGlzLmRyb3Bab25lID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IHJlbW92ZSBwbGFjZWhvbGRlciBkcm9wIHpvbmVcIik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kcm9wWm9uZVNlcnZpY2UucmVtb3ZlRHJvcFpvbmUodGhpcy5kcm9wWm9uZSk7XHJcbiAgIH1cclxufVxyXG4iLCI8ZHJvcC16b25lIFtkcm9wWm9uZV09XCJkcm9wWm9uZVwiPjwvZHJvcC16b25lPlxuPGRpdiBjbGFzcz1cInBsYWNlaG9sZGVyXCIgKGRyYWdvdmVyTm9DaGFuZ2VEZXRlY3QpPVwiZHJhZ292ZXJIYW5kbGVyKClcIj48L2Rpdj5cbiJdfQ==
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltYmxlLXRyZWUtcGxhY2Vob2xkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGltYmxlLXRyZWUvc3JjL2xpYi9saW1ibGUtdHJlZS1wbGFjZWhvbGRlci9saW1ibGUtdHJlZS1wbGFjZWhvbGRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLXBsYWNlaG9sZGVyL2xpbWJsZS10cmVlLXBsYWNlaG9sZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSix1QkFBdUIsRUFFdkIsU0FBUyxFQUdYLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQVcvQyxNQUFNLE9BQU8sOEJBQThCO0lBS3hDLFlBQ29CLGVBQWdDLEVBQ2hDLGlCQUFvQyxFQUNwQyxXQUF3QixFQUN4QixzQkFBOEM7UUFIOUMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUUvRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0MsOEVBQThFO1FBQzlFLG1GQUFtRjtRQUNuRixvRkFBb0Y7UUFDcEYsa0ZBQWtGO1FBQ2xGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQ25FLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUM5QixPQUFPO2FBQ1Q7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNqQixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0M7UUFDSixDQUFDLENBQ0gsQ0FBQztJQUNMLENBQUM7SUFFTSxRQUFRO1FBQ1osSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxlQUFlO1FBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVNLGVBQWU7UUFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUM5QixPQUFPO1NBQ1Q7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sV0FBVztRQUNmLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztTQUM1RDtRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDOzs0R0F6RFMsOEJBQThCO2lGQUE5Qiw4QkFBOEI7UUNwQjNDLCtCQUE2QztRQUM3Qyw4QkFBc0U7UUFBN0MsMElBQTBCLHFCQUFpQixJQUFDO1FBQUMsaUJBQU07O1FBRGpFLHVDQUFxQjs7dUZEb0JuQiw4QkFBOEI7Y0FOMUMsU0FBUzsyQkFDRyx5QkFBeUIsbUJBR2xCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgQWZ0ZXJWaWV3SW5pdCxcbiAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICBDb21wb25lbnQsXG4gICBPbkRlc3Ryb3ksXG4gICBPbkluaXRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBEcm9wWm9uZSB9IGZyb20gXCIuLi9jbGFzc2VzL0Ryb3Bab25lXCI7XG5pbXBvcnQgeyBEcm9wWm9uZVNlcnZpY2UgfSBmcm9tIFwiLi4vbGltYmxlLXRyZWUtcm9vdC9kcm9wLXpvbmUuc2VydmljZVwiO1xuaW1wb3J0IHsgVHJlZUNvbnN0cnVjdGlvblN0YXR1cyB9IGZyb20gXCIuLi9saW1ibGUtdHJlZS1yb290L3RyZWUtY29uc3RydWN0aW9uLXN0YXR1cy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUcmVlU2VydmljZSB9IGZyb20gXCIuLi9saW1ibGUtdHJlZS1yb290L3RyZWUuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiBcImxpbWJsZS10cmVlLXBsYWNlaG9sZGVyXCIsXG4gICB0ZW1wbGF0ZVVybDogXCIuL2xpbWJsZS10cmVlLXBsYWNlaG9sZGVyLmNvbXBvbmVudC5odG1sXCIsXG4gICBzdHlsZVVybHM6IFtcIi4vbGltYmxlLXRyZWUtcGxhY2Vob2xkZXIuY29tcG9uZW50LnNjc3NcIl0sXG4gICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBMaW1ibGVUcmVlUGxhY2Vob2xkZXJDb21wb25lbnRcbiAgIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgcHVibGljIGRyb3Bab25lOiBEcm9wWm9uZSB8IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgcmVhZG9ubHkgcGxhY2Vob2xkZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBkcm9wWm9uZVNlcnZpY2U6IERyb3Bab25lU2VydmljZSxcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmVlU2VydmljZTogVHJlZVNlcnZpY2UsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHRyZWVDb25zdHJ1Y3Rpb25TdGF0dXM6IFRyZWVDb25zdHJ1Y3Rpb25TdGF0dXNcbiAgICkge1xuICAgICAgdGhpcy50cmVlQ29uc3RydWN0aW9uU3RhdHVzLmNvbnN0cnVjdGluZygpO1xuICAgICAgLy9UaGlzIGxvZ2ljIGlzIHZlcnkgc2ltaWxhciB0byB3aGF0IHRoZSBsaWZlY3ljbGUgaG9va3Mgb2YgdGhpcyBjb21wb25lbnQgZG8uXG4gICAgICAvL1dlIHVzZSB0aGlzIHN1YnNjcmlwdGlvbiBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBjYW4ndCB3YWl0IGZvciB0aGUgbGlmZWN5Y2xlIGhvb2tzOlxuICAgICAgLy9TcGVjaWZpY2FsbHksIHRoZSBkcm9wIHpvbmUgcmVnaXN0cmF0aW9uIGFuZCBkZXJlZ2lzdHJhdGlvbiBzb21ldGltZXMgY2FuJ3QgaGFwcGVuXG4gICAgICAvL2FzeW5jaHJvbm91c2x5IHdpdGhvdXQgY2F1c2luZyBidWdzLiBTbyB3ZSBoYW5kbGUgaXQgc3luY2hyb25vdXNseSBoZXJlIGFzIHdlbGwuXG4gICAgICB0aGlzLnBsYWNlaG9sZGVyU3Vic2NyaXB0aW9uID0gdGhpcy50cmVlU2VydmljZS5wbGFjZWhvbGRlciQuc3Vic2NyaWJlKFxuICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5kcm9wWm9uZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5yZW1vdmVEcm9wWm9uZSh0aGlzLmRyb3Bab25lKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgdGhpcy5kcm9wWm9uZVNlcnZpY2UuYWRkRHJvcFpvbmUodGhpcy5kcm9wWm9uZSk7XG4gICAgICAgICAgICAgICB0aGlzLmRyb3Bab25lLnNldEhvc3QodGhpcy50cmVlU2VydmljZS5ob3N0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgICk7XG4gICB9XG5cbiAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgIHRoaXMuZHJvcFpvbmUgPSBuZXcgRHJvcFpvbmUoW10sIDApO1xuICAgICAgdGhpcy5kcm9wWm9uZVNlcnZpY2UuYWRkRHJvcFpvbmUodGhpcy5kcm9wWm9uZSk7XG4gICB9XG5cbiAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICBpZiAodGhpcy5kcm9wWm9uZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwbGFjZWhvbGRlciBkcm9wIHpvbmUgaXMgbm90IGRlZmluZWRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLmRyb3Bab25lLnNldEhvc3QodGhpcy50cmVlU2VydmljZS5ob3N0KTtcbiAgICAgIHRoaXMudHJlZUNvbnN0cnVjdGlvblN0YXR1cy5kb25lQ29uc3RydWN0aW5nKCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgIH1cblxuICAgcHVibGljIGRyYWdvdmVySGFuZGxlcigpIHtcbiAgICAgIGlmICh0aGlzLmRyb3Bab25lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnNob3dEcm9wWm9uZUZhbWlseSh0aGlzLmRyb3Bab25lKTtcbiAgIH1cblxuICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgdGhpcy5wbGFjZWhvbGRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKHRoaXMuZHJvcFpvbmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IHJlbW92ZSBwbGFjZWhvbGRlciBkcm9wIHpvbmVcIik7XG4gICAgICB9XG4gICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5yZW1vdmVEcm9wWm9uZSh0aGlzLmRyb3Bab25lKTtcbiAgIH1cbn1cbiIsIjxkcm9wLXpvbmUgW2Ryb3Bab25lXT1cImRyb3Bab25lXCI+PC9kcm9wLXpvbmU+XG48ZGl2IGNsYXNzPVwicGxhY2Vob2xkZXJcIiAoZHJhZ292ZXJOb0NoYW5nZURldGVjdCk9XCJkcmFnb3ZlckhhbmRsZXIoKVwiPjwvZGl2PlxuIl19