ngx-drag-drop 15.0.0 → 15.1.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.
package/README.md CHANGED
@@ -6,128 +6,134 @@
6
6
 
7
7
  # NgxDragDrop
8
8
 
9
- [_Demo_](https://reppners.github.io/ngx-drag-drop/) / [_StackBlitz Issue Template_](https://stackblitz.com/edit/ngx-drag-drop-issue-template)
9
+ [_Demo_](https://reppners.github.io/ngx-drag-drop/) / [_StackBlitz Issue
10
+ Template_](https://stackblitz.com/edit/ngx-drag-drop-issue-template)
10
11
 
11
12
  `npm install ngx-drag-drop --save`
12
13
 
13
14
  **Angular directives for declarative drag and drop using the HTML5 Drag-And-Drop API**
14
15
 
15
- * sortable lists by using placeholder element (vertical and horizontal)
16
- * nestable
17
- * dropzones optionally support external/native draggables (img, txt, file)
18
- * conditional drag/drop
19
- * typed drag/drop
20
- * utilize [EffectAllowed](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/effectAllowed)
21
- * custom CSS classes
22
- * touch support by using a [polyfill](#touch-support)
23
- * [AOT](https://angular.io/guide/aot-compiler) compatible
16
+ - sortable lists by using placeholder element (vertical and horizontal)
17
+ - nestable
18
+ - dropzones optionally support external/native draggables (img, txt, file)
19
+ - conditional drag/drop
20
+ - typed drag/drop
21
+ - utilize [EffectAllowed](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/effectAllowed)
22
+ - custom CSS classes
23
+ - touch support by using a [polyfill](#touch-support)
24
+ - [AOT](https://angular.io/guide/aot-compiler) compatible
24
25
 
25
26
  Port of [angular-drag-drop-lists](https://github.com/marceljuenemann/angular-drag-and-drop-lists) but without the lists :wink:
26
27
 
27
28
  This has `dropzones` though :+1:
28
29
  The idea is that the directive does not handle lists internally so the `dndDropzone` can be general purpose.
29
30
 
30
-
31
31
  ## Usage
32
32
 
33
33
  `app.component.html`
34
+
34
35
  ```HTML
35
36
  <!--a draggable element-->
36
- <div [dndDraggable]="draggable.data"
37
- [dndEffectAllowed]="draggable.effectAllowed"
38
- [dndDisableIf]="draggable.disable"
39
- (dndStart)="onDragStart($event)"
40
- (dndCopied)="onDraggableCopied($event)"
41
- (dndLinked)="onDraggableLinked($event)"
42
- (dndMoved)="onDraggableMoved($event)"
43
- (dndCanceled)="onDragCanceled($event)"
44
- (dndEnd)="onDragEnd($event)">
45
-
46
- <!--if [dndHandle] is used inside dndDraggable drag can only start from the handle-->
47
- <div *ngIf="draggable.handle"
48
- dndHandle>HANDLE
49
- </div>
50
-
51
- draggable ({{draggable.effectAllowed}}) <span [hidden]="!draggable.disable">DISABLED</span>
52
-
53
- <!--optionally select a child element as drag image-->
54
- <div dndDragImageRef>DRAG_IMAGE</div>
55
-
37
+ <div
38
+ [dndDraggable]="draggable.data"
39
+ [dndEffectAllowed]="draggable.effectAllowed"
40
+ [dndDisableIf]="draggable.disable"
41
+ (dndStart)="onDragStart($event)"
42
+ (dndCopied)="onDraggableCopied($event)"
43
+ (dndLinked)="onDraggableLinked($event)"
44
+ (dndMoved)="onDraggableMoved($event)"
45
+ (dndCanceled)="onDragCanceled($event)"
46
+ (dndEnd)="onDragEnd($event)">
47
+
48
+ <!--if [dndHandle] is used inside dndDraggable drag can only start from the handle-->
49
+ <div
50
+ *ngIf="draggable.handle"
51
+ dndHandle>HANDLE
52
+ </div>
53
+
54
+ draggable ({{draggable.effectAllowed}}) <span [hidden]="!draggable.disable">DISABLED</span>
55
+
56
+ <!--optionally select a child element as drag image-->
57
+ <div dndDragImageRef>DRAG_IMAGE</div>
58
+
56
59
  </div>
57
60
 
58
61
  <!--a dropzone-->
59
62
  <!--to allow dropping content that is not [dndDraggable] set dndAllowExternal to true-->
60
- <section dndDropzone
61
- (dndDragover)="onDragover($event)"
62
- (dndDrop)="onDrop($event)">
63
-
64
- dropzone
65
-
66
- <!--optional placeholder element for dropzone-->
67
- <!--will be removed from DOM on init-->
68
- <div style="border: 1px orangered solid; border-radius: 5px; padding: 15px;"
69
- dndPlaceholderRef>
70
- placeholder
71
- </div>
63
+ <section
64
+ dndDropzone
65
+ (dndDragover)="onDragover($event)"
66
+ (dndDrop)="onDrop($event)">
67
+
68
+ dropzone
69
+
70
+ <!--optional placeholder element for dropzone-->
71
+ <!--will be removed from DOM on init-->
72
+ <div
73
+ style="border: 1px orangered solid; border-radius: 5px; padding: 15px;"
74
+ dndPlaceholderRef>
75
+ placeholder
76
+ </div>
72
77
 
73
78
  </section>
74
79
  ```
75
80
 
76
81
  `app.component`
82
+
77
83
  ```JS
78
- import { Component } from '@angular/core';
84
+ import {Component} from '@angular/core';
79
85
 
80
- import { DndDropEvent } from 'ngx-drag-drop';
86
+ import {DndDropEvent} from 'ngx-drag-drop';
81
87
 
82
88
  @Component()
83
89
  export class AppComponent {
84
-
90
+
85
91
  draggable = {
86
92
  // note that data is handled with JSON.stringify/JSON.parse
87
- // only set simple data or POJO's as methods will be lost
93
+ // only set simple data or POJO's as methods will be lost
88
94
  data: "myDragData",
89
95
  effectAllowed: "all",
90
96
  disable: false,
91
97
  handle: false
92
98
  };
93
-
94
- onDragStart(event:DragEvent) {
99
+
100
+ onDragStart(event: DragEvent) {
95
101
 
96
102
  console.log("drag started", JSON.stringify(event, null, 2));
97
103
  }
98
-
99
- onDragEnd(event:DragEvent) {
100
-
104
+
105
+ onDragEnd(event: DragEvent) {
106
+
101
107
  console.log("drag ended", JSON.stringify(event, null, 2));
102
108
  }
103
-
104
- onDraggableCopied(event:DragEvent) {
105
-
109
+
110
+ onDraggableCopied(event: DragEvent) {
111
+
106
112
  console.log("draggable copied", JSON.stringify(event, null, 2));
107
113
  }
108
-
109
- onDraggableLinked(event:DragEvent) {
110
-
114
+
115
+ onDraggableLinked(event: DragEvent) {
116
+
111
117
  console.log("draggable linked", JSON.stringify(event, null, 2));
112
118
  }
113
-
114
- onDraggableMoved(event:DragEvent) {
115
-
119
+
120
+ onDraggableMoved(event: DragEvent) {
121
+
116
122
  console.log("draggable moved", JSON.stringify(event, null, 2));
117
123
  }
118
-
119
- onDragCanceled(event:DragEvent) {
120
-
124
+
125
+ onDragCanceled(event: DragEvent) {
126
+
121
127
  console.log("drag cancelled", JSON.stringify(event, null, 2));
122
128
  }
123
-
124
- onDragover(event:DragEvent) {
125
-
129
+
130
+ onDragover(event: DragEvent) {
131
+
126
132
  console.log("dragover", JSON.stringify(event, null, 2));
127
133
  }
128
-
129
- onDrop(event:DndDropEvent) {
130
-
134
+
135
+ onDrop(event: DndDropEvent) {
136
+
131
137
  console.log("dropped", JSON.stringify(event, null, 2));
132
138
  }
133
139
  }
@@ -136,12 +142,12 @@ export class AppComponent {
136
142
  `app.module`
137
143
 
138
144
  ```JS
139
- import { BrowserModule } from '@angular/platform-browser';
140
- import { NgModule } from '@angular/core';
145
+ import {BrowserModule} from '@angular/platform-browser';
146
+ import {NgModule} from '@angular/core';
141
147
 
142
- import { DndModule } from 'ngx-drag-drop';
148
+ import {DndModule} from 'ngx-drag-drop';
143
149
 
144
- import { AppComponent } from './app.component';
150
+ import {AppComponent} from './app.component';
145
151
 
146
152
  @NgModule({
147
153
  declarations: [
@@ -154,7 +160,7 @@ import { AppComponent } from './app.component';
154
160
  providers: [],
155
161
  bootstrap: [AppComponent]
156
162
  })
157
- export class AppModule {
163
+ export class AppModule {
158
164
  }
159
165
  ```
160
166
 
@@ -178,47 +184,47 @@ export declare class DndDraggableDirective {
178
184
 
179
185
  // the data attached to the drag
180
186
  dndDraggable: any;
181
-
187
+
182
188
  // the allowed drop effect
183
189
  dndEffectAllowed: EffectAllowed;
184
-
190
+
185
191
  // optionally set the type of dragged data to restrict dropping on compatible dropzones
186
192
  dndType?: string;
187
-
193
+
188
194
  // conditionally disable the draggability
189
195
  dndDisableIf: boolean;
190
196
  dndDisableDragIf: boolean;
191
-
197
+
192
198
  // set a custom class that is applied while dragging
193
199
  dndDraggingClass: string = "dndDragging";
194
-
200
+
195
201
  // set a custom class that is applied to only the src element while dragging
196
202
  dndDraggingSourceClass: string = "dndDraggingSource";
197
-
203
+
198
204
  // set the class that is applied when draggable is disabled by [dndDisableIf]
199
205
  dndDraggableDisabledClass = "dndDraggableDisabled";
200
-
206
+
201
207
  // enables to set a function for calculating custom dragimage offset
202
208
  dndDragImageOffsetFunction:DndDragImageOffsetFunction = calculateDragImageOffset;
203
-
209
+
204
210
  // emits on drag start
205
211
  readonly dndStart: EventEmitter<DragEvent>;
206
-
212
+
207
213
  // emits on drag
208
214
  readonly dndDrag: EventEmitter<DragEvent>;
209
-
215
+
210
216
  // emits on drag end
211
217
  readonly dndEnd: EventEmitter<DragEvent>;
212
-
218
+
213
219
  // emits when the dragged item has been dropped with effect "move"
214
220
  readonly dndMoved: EventEmitter<DragEvent>;
215
-
221
+
216
222
  // emits when the dragged item has been dropped with effect "copy"
217
223
  readonly dndCopied: EventEmitter<DragEvent>;
218
-
224
+
219
225
  // emits when the dragged item has been dropped with effect "link"
220
226
  readonly dndLinked: EventEmitter<DragEvent>;
221
-
227
+
222
228
  // emits when the drag is canceled
223
229
  readonly dndCanceled: EventEmitter<DragEvent>;
224
230
  }
@@ -229,21 +235,21 @@ export interface DndDropEvent {
229
235
 
230
236
  // the original drag event
231
237
  event: DragEvent;
232
-
238
+
233
239
  // the actual drop effect
234
240
  dropEffect: DropEffect;
235
-
241
+
236
242
  // true if the drag did not origin from a [dndDraggable]
237
243
  isExternal:boolean;
238
-
239
- // the data set on the [dndDraggable] that started the drag
244
+
245
+ // the data set on the [dndDraggable] that started the drag
240
246
  // for external drags use the event property which contains the original drop event as this will be undefined
241
247
  data?: any;
242
-
248
+
243
249
  // the index where the draggable was dropped in a dropzone
244
250
  // set only when using a placeholder
245
251
  index?: number;
246
-
252
+
247
253
  // if the dndType input on dndDraggable was set
248
254
  // it will be transported here
249
255
  type?: any;
@@ -256,33 +262,33 @@ export declare class DndDropzoneDirective {
256
262
 
257
263
  // optionally restrict the allowed types
258
264
  dndDropzone?: string[];
259
-
265
+
260
266
  // set the allowed drop effect
261
267
  dndEffectAllowed: EffectAllowed;
262
-
268
+
263
269
  // conditionally disable the dropzone
264
270
  dndDisableIf: boolean;
265
271
  dndDisableDropIf: boolean;
266
-
272
+
267
273
  // if draggables that are not [dndDraggable] are allowed to be dropped
268
274
  // set to true if dragged text, images or files should be handled
269
275
  dndAllowExternal: boolean;
270
-
276
+
271
277
  // if its a horizontal list this influences how the placeholder position
272
278
  // is calculated
273
279
  dndHorizontal: boolean;
274
-
280
+
275
281
  // set the class applied to the dropzone
276
282
  // when a draggable is dragged over it
277
283
  dndDragoverClass: string = "dndDragover";
278
-
284
+
279
285
  // set the class applied to the dropzone
280
- // when the dropzone is disabled by [dndDisableIf]
286
+ // when the dropzone is disabled by [dndDisableIf]
281
287
  dndDropzoneDisabledClass = "dndDropzoneDisabled";
282
-
288
+
283
289
  // emits when a draggable is dragged over the dropzone
284
290
  readonly dndDragover: EventEmitter<DragEvent>;
285
-
291
+
286
292
  // emits on successful drop
287
293
  readonly dndDrop: EventEmitter<DndDropEvent>;
288
294
  }
@@ -293,6 +299,7 @@ export declare class DndDropzoneDirective {
293
299
  Install the `mobile-drag-drop` module available on npm.
294
300
 
295
301
  Add the following lines to your js code
302
+
296
303
  ```JS
297
304
  import { polyfill } from 'mobile-drag-drop';
298
305
  // optional import of scroll behaviour
@@ -317,10 +324,9 @@ https://github.com/timruffles/mobile-drag-drop
317
324
 
318
325
  ### Firefox
319
326
 
320
- * Beware that Firefox does not support dragging on `<button>` elements.
321
- * `<button [dndDraggable]>` and `<button [dndHandler]>` won't work.
322
- * See https://bugzilla.mozilla.org/show_bug.cgi?id=568313
323
-
327
+ - Beware that Firefox does not support dragging on `<button>` elements.
328
+ - `<button [dndDraggable]>` and `<button [dndHandler]>` won't work.
329
+ - See https://bugzilla.mozilla.org/show_bug.cgi?id=568313
324
330
 
325
331
  ## Why?
326
332
 
@@ -328,4 +334,4 @@ HTML Drag-And-Drop API implementations are not behaving the same way across brow
328
334
 
329
335
  The directives contained in this module enable declarative drag and drop that "just works" across browsers in a consistent way.
330
336
 
331
- Credits go to the author and contributors of [angular-drag-drop-lists](https://github.com/marceljuenemann/angular-drag-and-drop-lists).
337
+ Credits go to the author and contributors of [angular-drag-drop-lists](https://github.com/marceljuenemann/angular-drag-and-drop-lists).
@@ -1,32 +1,28 @@
1
- import { Directive, EventEmitter, forwardRef, HostBinding, HostListener, Inject, Input, Output } from "@angular/core";
2
- import { calculateDragImageOffset, setDragData, setDragImage } from "./dnd-utils";
3
- import { dndState, endDrag, startDrag } from "./dnd-state";
1
+ import { Directive, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, inject, Input, NgZone, Output, Renderer2, } from '@angular/core';
2
+ import { dndState, endDrag, startDrag } from './dnd-state';
3
+ import { calculateDragImageOffset, setDragData, setDragImage, } from './dnd-utils';
4
4
  import * as i0 from "@angular/core";
5
5
  export class DndDragImageRefDirective {
6
- constructor(parent, elementRef) {
7
- parent.registerDragImage(elementRef);
6
+ constructor() {
7
+ this.dndDraggableDirective = inject(forwardRef(() => DndDraggableDirective));
8
+ this.elementRef = inject(ElementRef);
9
+ }
10
+ ngOnInit() {
11
+ this.dndDraggableDirective.registerDragImage(this.elementRef);
8
12
  }
9
13
  }
10
- DndDragImageRefDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: DndDragImageRefDirective, deps: [{ token: forwardRef(() => DndDraggableDirective) }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
11
- DndDragImageRefDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.3", type: DndDragImageRefDirective, selector: "[dndDragImageRef]", ngImport: i0 });
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: DndDragImageRefDirective, decorators: [{
14
+ DndDragImageRefDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: DndDragImageRefDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
15
+ DndDragImageRefDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: DndDragImageRefDirective, selector: "[dndDragImageRef]", ngImport: i0 });
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: DndDragImageRefDirective, decorators: [{
13
17
  type: Directive,
14
- args: [{
15
- selector: "[dndDragImageRef]"
16
- }]
17
- }], ctorParameters: function () { return [{ type: DndDraggableDirective, decorators: [{
18
- type: Inject,
19
- args: [forwardRef(() => DndDraggableDirective)]
20
- }] }, { type: i0.ElementRef }]; } });
18
+ args: [{ selector: '[dndDragImageRef]' }]
19
+ }] });
21
20
  export class DndDraggableDirective {
22
- constructor(elementRef, renderer, ngZone) {
23
- this.elementRef = elementRef;
24
- this.renderer = renderer;
25
- this.ngZone = ngZone;
26
- this.dndEffectAllowed = "copy";
27
- this.dndDraggingClass = "dndDragging";
28
- this.dndDraggingSourceClass = "dndDraggingSource";
29
- this.dndDraggableDisabledClass = "dndDraggableDisabled";
21
+ constructor() {
22
+ this.dndEffectAllowed = 'copy';
23
+ this.dndDraggingClass = 'dndDragging';
24
+ this.dndDraggingSourceClass = 'dndDraggingSource';
25
+ this.dndDraggableDisabledClass = 'dndDraggableDisabled';
30
26
  this.dndDragImageOffsetFunction = calculateDragImageOffset;
31
27
  this.dndStart = new EventEmitter();
32
28
  this.dndDrag = new EventEmitter();
@@ -37,6 +33,9 @@ export class DndDraggableDirective {
37
33
  this.dndCanceled = new EventEmitter();
38
34
  this.draggable = true;
39
35
  this.isDragStarted = false;
36
+ this.elementRef = inject(ElementRef);
37
+ this.renderer = inject(Renderer2);
38
+ this.ngZone = inject(NgZone);
40
39
  this.dragEventHandler = (event) => this.onDrag(event);
41
40
  }
42
41
  set dndDisableIf(value) {
@@ -53,22 +52,22 @@ export class DndDraggableDirective {
53
52
  }
54
53
  ngAfterViewInit() {
55
54
  this.ngZone.runOutsideAngular(() => {
56
- this.elementRef.nativeElement.addEventListener("drag", this.dragEventHandler);
55
+ this.elementRef.nativeElement.addEventListener('drag', this.dragEventHandler);
57
56
  });
58
57
  }
59
58
  ngOnDestroy() {
60
- this.elementRef.nativeElement.removeEventListener("drag", this.dragEventHandler);
61
- if (this.isDragStarted === true) {
59
+ this.elementRef.nativeElement.removeEventListener('drag', this.dragEventHandler);
60
+ if (this.isDragStarted) {
62
61
  endDrag();
63
62
  }
64
63
  }
65
64
  onDragStart(event) {
66
- if (this.draggable === false) {
65
+ if (!this.draggable) {
67
66
  return false;
68
67
  }
69
68
  // check if there is dnd handle and if the dnd handle was used to start the drag
70
- if (typeof this.dndHandle !== "undefined"
71
- && typeof event._dndUsingHandle === "undefined") {
69
+ if (this.dndHandle != null && event._dndUsingHandle == null) {
70
+ event.stopPropagation();
72
71
  return false;
73
72
  }
74
73
  // initialize global state
@@ -81,17 +80,19 @@ export class DndDraggableDirective {
81
80
  this.renderer.addClass(this.dragImage, this.dndDraggingClass);
82
81
  // set custom dragimage if present
83
82
  // set dragimage if drag is started from dndHandle
84
- if (typeof this.dndDragImageElementRef !== "undefined"
85
- || typeof event._dndUsingHandle !== "undefined") {
83
+ if (this.dndDragImageElementRef != null || event._dndUsingHandle != null) {
86
84
  setDragImage(event, this.dragImage, this.dndDragImageOffsetFunction);
87
85
  }
88
86
  // add dragging source css class on first drag event
89
- const unregister = this.renderer.listen(this.elementRef.nativeElement, "drag", () => {
87
+ const unregister = this.renderer.listen(this.elementRef.nativeElement, 'drag', () => {
90
88
  this.renderer.addClass(this.elementRef.nativeElement, this.dndDraggingSourceClass);
91
89
  unregister();
92
90
  });
93
91
  this.dndStart.emit(event);
94
92
  event.stopPropagation();
93
+ setTimeout(() => {
94
+ this.renderer.setStyle(this.dragImage, 'pointer-events', 'none');
95
+ }, 100);
95
96
  return true;
96
97
  }
97
98
  onDrag(event) {
@@ -100,15 +101,16 @@ export class DndDraggableDirective {
100
101
  onDragEnd(event) {
101
102
  // get drop effect from custom stored state as its not reliable across browsers
102
103
  const dropEffect = dndState.dropEffect;
104
+ this.renderer.setStyle(this.dragImage, 'pointer-events', 'unset');
103
105
  let dropEffectEmitter;
104
106
  switch (dropEffect) {
105
- case "copy":
107
+ case 'copy':
106
108
  dropEffectEmitter = this.dndCopied;
107
109
  break;
108
- case "link":
110
+ case 'link':
109
111
  dropEffectEmitter = this.dndLinked;
110
112
  break;
111
- case "move":
113
+ case 'move':
112
114
  dropEffectEmitter = this.dndMoved;
113
115
  break;
114
116
  default:
@@ -135,7 +137,7 @@ export class DndDraggableDirective {
135
137
  }
136
138
  determineDragImage() {
137
139
  // evaluate custom drag image existence
138
- if (typeof this.dndDragImageElementRef !== "undefined") {
140
+ if (typeof this.dndDragImageElementRef !== 'undefined') {
139
141
  return this.dndDragImageElementRef.nativeElement;
140
142
  }
141
143
  else {
@@ -143,14 +145,12 @@ export class DndDraggableDirective {
143
145
  }
144
146
  }
145
147
  }
146
- DndDraggableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: DndDraggableDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
147
- DndDraggableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.3", type: DndDraggableDirective, selector: "[dndDraggable]", inputs: { dndDraggable: "dndDraggable", dndEffectAllowed: "dndEffectAllowed", dndType: "dndType", dndDraggingClass: "dndDraggingClass", dndDraggingSourceClass: "dndDraggingSourceClass", dndDraggableDisabledClass: "dndDraggableDisabledClass", dndDragImageOffsetFunction: "dndDragImageOffsetFunction", dndDisableIf: "dndDisableIf", dndDisableDragIf: "dndDisableDragIf" }, outputs: { dndStart: "dndStart", dndDrag: "dndDrag", dndEnd: "dndEnd", dndMoved: "dndMoved", dndCopied: "dndCopied", dndLinked: "dndLinked", dndCanceled: "dndCanceled" }, host: { listeners: { "dragstart": "onDragStart($event)", "dragend": "onDragEnd($event)" }, properties: { "attr.draggable": "this.draggable" } }, ngImport: i0 });
148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: DndDraggableDirective, decorators: [{
148
+ DndDraggableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: DndDraggableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
149
+ DndDraggableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: DndDraggableDirective, selector: "[dndDraggable]", inputs: { dndDraggable: "dndDraggable", dndEffectAllowed: "dndEffectAllowed", dndType: "dndType", dndDraggingClass: "dndDraggingClass", dndDraggingSourceClass: "dndDraggingSourceClass", dndDraggableDisabledClass: "dndDraggableDisabledClass", dndDragImageOffsetFunction: "dndDragImageOffsetFunction", dndDisableIf: "dndDisableIf", dndDisableDragIf: "dndDisableDragIf" }, outputs: { dndStart: "dndStart", dndDrag: "dndDrag", dndEnd: "dndEnd", dndMoved: "dndMoved", dndCopied: "dndCopied", dndLinked: "dndLinked", dndCanceled: "dndCanceled" }, host: { listeners: { "dragstart": "onDragStart($event)", "dragend": "onDragEnd($event)" }, properties: { "attr.draggable": "this.draggable" } }, ngImport: i0 });
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: DndDraggableDirective, decorators: [{
149
151
  type: Directive,
150
- args: [{
151
- selector: "[dndDraggable]"
152
- }]
153
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { dndDraggable: [{
152
+ args: [{ selector: '[dndDraggable]' }]
153
+ }], propDecorators: { dndDraggable: [{
154
154
  type: Input
155
155
  }], dndEffectAllowed: [{
156
156
  type: Input
@@ -180,16 +180,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImpor
180
180
  type: Output
181
181
  }], draggable: [{
182
182
  type: HostBinding,
183
- args: ["attr.draggable"]
183
+ args: ['attr.draggable']
184
184
  }], dndDisableIf: [{
185
185
  type: Input
186
186
  }], dndDisableDragIf: [{
187
187
  type: Input
188
188
  }], onDragStart: [{
189
189
  type: HostListener,
190
- args: ["dragstart", ["$event"]]
190
+ args: ['dragstart', ['$event']]
191
191
  }], onDragEnd: [{
192
192
  type: HostListener,
193
- args: ["dragend", ["$event"]]
193
+ args: ['dragend', ['$event']]
194
194
  }] } });
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQXdDLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEgsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQU0zRCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLFlBQTZELE1BQTZCLEVBQUUsVUFBcUI7UUFDL0csTUFBTSxDQUFDLGlCQUFpQixDQUFFLFVBQVUsQ0FBRSxDQUFDO0lBQ3pDLENBQUM7O3FIQUpVLHdCQUF3QixrQkFFZixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7eUdBRmhELHdCQUF3QjsyRkFBeEIsd0JBQXdCO2tCQUhwQyxTQUFTO21CQUFFO29CQUNWLFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCOzswQkFHYyxNQUFNOzJCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQzs7QUFRN0QsTUFBTSxPQUFPLHFCQUFxQjtJQTZFaEMsWUFBcUIsVUFBcUIsRUFDckIsUUFBa0IsRUFDbEIsTUFBYTtRQUZiLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFPO1FBekVsQyxxQkFBZ0IsR0FBaUIsTUFBTSxDQUFDO1FBTXhDLHFCQUFnQixHQUFHLGFBQWEsQ0FBQztRQUdqQywy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QUN0QztJQUNILENBQUM7O2tIQXZOVSxxQkFBcUI7c0dBQXJCLHFCQUFxQjsyRkFBckIscUJBQXFCO2tCQUhqQyxTQUFTO21CQUFFO29CQUNWLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOzhJQUlDLFlBQVk7c0JBRFgsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sc0JBQXNCO3NCQURyQixLQUFLO2dCQUlOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFJTiwwQkFBMEI7c0JBRHpCLEtBQUs7Z0JBSUcsUUFBUTtzQkFEaEIsTUFBTTtnQkFJRSxPQUFPO3NCQURmLE1BQU07Z0JBSUUsTUFBTTtzQkFEZCxNQUFNO2dCQUlFLFFBQVE7c0JBRGhCLE1BQU07Z0JBSUUsU0FBUztzQkFEakIsTUFBTTtnQkFJRSxTQUFTO3NCQURqQixNQUFNO2dCQUlFLFdBQVc7c0JBRG5CLE1BQU07Z0JBSVAsU0FBUztzQkFEUixXQUFXO3VCQUFFLGdCQUFnQjtnQkFjMUIsWUFBWTtzQkFEZixLQUFLO2dCQWdCRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBd0JOLFdBQVc7c0JBRFYsWUFBWTt1QkFBRSxXQUFXLEVBQUUsQ0FBRSxRQUFRLENBQUU7Z0JBdUR4QyxTQUFTO3NCQURSLFlBQVk7dUJBQUUsU0FBUyxFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgY2FsY3VsYXRlRHJhZ0ltYWdlT2Zmc2V0LCBEbmREcmFnSW1hZ2VPZmZzZXRGdW5jdGlvbiwgRG5kRXZlbnQsIHNldERyYWdEYXRhLCBzZXREcmFnSW1hZ2UgfSBmcm9tIFwiLi9kbmQtdXRpbHNcIjtcbmltcG9ydCB7IERuZEhhbmRsZURpcmVjdGl2ZSB9IGZyb20gXCIuL2RuZC1oYW5kbGUuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBkbmRTdGF0ZSwgZW5kRHJhZywgc3RhcnREcmFnIH0gZnJvbSBcIi4vZG5kLXN0YXRlXCI7XG5pbXBvcnQgeyBFZmZlY3RBbGxvd2VkIH0gZnJvbSBcIi4vZG5kLXR5cGVzXCI7XG5cbkBEaXJlY3RpdmUoIHtcbiAgc2VsZWN0b3I6IFwiW2RuZERyYWdJbWFnZVJlZl1cIlxufSApXG5leHBvcnQgY2xhc3MgRG5kRHJhZ0ltYWdlUmVmRGlyZWN0aXZlIHtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gRG5kRHJhZ2dhYmxlRGlyZWN0aXZlKSkgcGFyZW50OiBEbmREcmFnZ2FibGVEaXJlY3RpdmUsIGVsZW1lbnRSZWY6RWxlbWVudFJlZiApIHtcbiAgICBwYXJlbnQucmVnaXN0ZXJEcmFnSW1hZ2UoIGVsZW1lbnRSZWYgKTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKCB7XG4gIHNlbGVjdG9yOiBcIltkbmREcmFnZ2FibGVdXCJcbn0gKVxuZXhwb3J0IGNsYXNzIERuZERyYWdnYWJsZURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KClcbiAgZG5kRHJhZ2dhYmxlOmFueTtcblxuICBASW5wdXQoKVxuICBkbmRFZmZlY3RBbGxvd2VkOkVmZmVjdEFsbG93ZWQgPSBcImNvcHlcIjtcblxuICBASW5wdXQoKVxuICBkbmRUeXBlPzpzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgZG5kRHJhZ2dpbmdDbGFzcyA9IFwiZG5kRHJhZ2dpbmdcIjtcblxuICBASW5wdXQoKVxuICBkbmREcmFnZ2luZ1NvdXJjZUNsYXNzID0gXCJkbmREcmFnZ2luZ1NvdXJjZVwiO1xuXG4gIEBJbnB1dCgpXG4gIGRuZERyYWdnYWJsZURpc2FibGVkQ2xhc3MgPSBcImRuZERyYWdnYWJsZURpc2FibGVkXCI7XG5cbiAgQElucHV0KClcbiAgZG5kRHJhZ0ltYWdlT2Zmc2V0RnVuY3Rpb246RG5kRHJhZ0ltYWdlT2Zmc2V0RnVuY3Rpb24gPSBjYWxjdWxhdGVEcmFnSW1hZ2VPZmZzZXQ7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZFN0YXJ0OkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZERyYWc6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kRW5kOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZE1vdmVkOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZENvcGllZDpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkbmRMaW5rZWQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kQ2FuY2VsZWQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBASG9zdEJpbmRpbmcoIFwiYXR0ci5kcmFnZ2FibGVcIiApXG4gIGRyYWdnYWJsZSA9IHRydWU7XG5cbiAgcHJpdmF0ZSBkbmRIYW5kbGU/OkRuZEhhbmRsZURpcmVjdGl2ZTtcblxuICBwcml2YXRlIGRuZERyYWdJbWFnZUVsZW1lbnRSZWY/OkVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBkcmFnSW1hZ2U6RWxlbWVudCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGlzRHJhZ1N0YXJ0ZWQ6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZHJhZ0V2ZW50SGFuZGxlcjooIGV2ZW50OkRyYWdFdmVudCApID0+IHZvaWQgPSAoIGV2ZW50OkRyYWdFdmVudCApID0+IHRoaXMub25EcmFnKCBldmVudCApO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkbmREaXNhYmxlSWYoIHZhbHVlOmJvb2xlYW4gKSB7XG5cbiAgICB0aGlzLmRyYWdnYWJsZSA9ICF2YWx1ZTtcblxuICAgIGlmKCB0aGlzLmRyYWdnYWJsZSApIHtcblxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJhZ2dhYmxlRGlzYWJsZWRDbGFzcyApO1xuICAgIH1cbiAgICBlbHNlIHtcblxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJhZ2dhYmxlRGlzYWJsZWRDbGFzcyApO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBkbmREaXNhYmxlRHJhZ0lmKCB2YWx1ZTpib29sZWFuICkge1xuICAgIHRoaXMuZG5kRGlzYWJsZUlmID0gdmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvciggcHJpdmF0ZSBlbGVtZW50UmVmOkVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOlJlbmRlcmVyMixcbiAgICAgICAgICAgICAgIHByaXZhdGUgbmdab25lOk5nWm9uZSApIHtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOnZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCAoKSA9PiB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCBcImRyYWdcIiwgdGhpcy5kcmFnRXZlbnRIYW5kbGVyICk7XG4gICAgfSApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTp2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcImRyYWdcIiwgdGhpcy5kcmFnRXZlbnRIYW5kbGVyICk7XG4gICAgaWYodGhpcy5pc0RyYWdTdGFydGVkID09PSB0cnVlKSB7XG4gICAgICBlbmREcmFnKClcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCBcImRyYWdzdGFydFwiLCBbIFwiJGV2ZW50XCIgXSApXG4gIG9uRHJhZ1N0YXJ0KCBldmVudDpEbmRFdmVudCApOiBib29sZWFuIHtcblxuICAgIGlmKCB0aGlzLmRyYWdnYWJsZSA9PT0gZmFsc2UgKSB7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBkbmQgaGFuZGxlIGFuZCBpZiB0aGUgZG5kIGhhbmRsZSB3YXMgdXNlZCB0byBzdGFydCB0aGUgZHJhZ1xuICAgIGlmKCB0eXBlb2YgdGhpcy5kbmRIYW5kbGUgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICYmIHR5cGVvZiBldmVudC5fZG5kVXNpbmdIYW5kbGUgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGdsb2JhbCBzdGF0ZVxuICAgIHN0YXJ0RHJhZyggZXZlbnQsIHRoaXMuZG5kRWZmZWN0QWxsb3dlZCwgdGhpcy5kbmRUeXBlICk7XG5cbiAgICB0aGlzLmlzRHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgc2V0RHJhZ0RhdGEoIGV2ZW50LCB7ZGF0YTogdGhpcy5kbmREcmFnZ2FibGUsIHR5cGU6IHRoaXMuZG5kVHlwZX0sIGRuZFN0YXRlLmVmZmVjdEFsbG93ZWQhICk7XG5cbiAgICB0aGlzLmRyYWdJbWFnZSA9IHRoaXMuZGV0ZXJtaW5lRHJhZ0ltYWdlKCk7XG5cbiAgICAvLyBzZXQgZHJhZ2dpbmcgY3NzIGNsYXNzIHByaW9yIHRvIHNldERyYWdJbWFnZSBzbyBzdHlsZXMgYXJlIGFwcGxpZWQgYmVmb3JlXG4gICAgLy8gVE9ETyBicmVha2luZyBjaGFuZ2U6IGFkZCBjbGFzcyB0byBlbGVtZW50UmVmIHJhdGhlciB0aGFuIGRyYWcgaW1hZ2Ugd2hpY2ggY291bGQgYmUgYW5vdGhlciBlbGVtZW50XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5kcmFnSW1hZ2UsIHRoaXMuZG5kRHJhZ2dpbmdDbGFzcyApO1xuXG4gICAgLy8gc2V0IGN1c3RvbSBkcmFnaW1hZ2UgaWYgcHJlc2VudFxuICAgIC8vIHNldCBkcmFnaW1hZ2UgaWYgZHJhZyBpcyBzdGFydGVkIGZyb20gZG5kSGFuZGxlXG4gICAgaWYoIHR5cGVvZiB0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgIHx8IHR5cGVvZiBldmVudC5fZG5kVXNpbmdIYW5kbGUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cbiAgICAgIHNldERyYWdJbWFnZSggZXZlbnQsIHRoaXMuZHJhZ0ltYWdlLCB0aGlzLmRuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uICk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGRyYWdnaW5nIHNvdXJjZSBjc3MgY2xhc3Mgb24gZmlyc3QgZHJhZyBldmVudFxuICAgIGNvbnN0IHVucmVnaXN0ZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbiggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIFwiZHJhZ1wiLCAoKSA9PiB7XG5cbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmRuZERyYWdnaW5nU291cmNlQ2xhc3MgKTtcbiAgICAgIHVucmVnaXN0ZXIoKTtcbiAgICB9ICk7XG5cbiAgICB0aGlzLmRuZFN0YXJ0LmVtaXQoIGV2ZW50ICk7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uRHJhZyggZXZlbnQ6RHJhZ0V2ZW50ICkge1xuXG4gICAgdGhpcy5kbmREcmFnLmVtaXQoIGV2ZW50ICk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCBcImRyYWdlbmRcIiwgWyBcIiRldmVudFwiIF0gKVxuICBvbkRyYWdFbmQoIGV2ZW50OkRyYWdFdmVudCApIHtcblxuICAgIC8vIGdldCBkcm9wIGVmZmVjdCBmcm9tIGN1c3RvbSBzdG9yZWQgc3RhdGUgYXMgaXRzIG5vdCByZWxpYWJsZSBhY3Jvc3MgYnJvd3NlcnNcbiAgICBjb25zdCBkcm9wRWZmZWN0ID0gZG5kU3RhdGUuZHJvcEVmZmVjdDtcblxuICAgIGxldCBkcm9wRWZmZWN0RW1pdHRlcjpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PjtcblxuICAgIHN3aXRjaCggZHJvcEVmZmVjdCApIHtcblxuICAgICAgY2FzZSBcImNvcHlcIjpcbiAgICAgICAgZHJvcEVmZmVjdEVtaXR0ZXIgPSB0aGlzLmRuZENvcGllZDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRMaW5rZWQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwibW92ZVwiOlxuICAgICAgICBkcm9wRWZmZWN0RW1pdHRlciA9IHRoaXMuZG5kTW92ZWQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkcm9wRWZmZWN0RW1pdHRlciA9IHRoaXMuZG5kQ2FuY2VsZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRyb3BFZmZlY3RFbWl0dGVyLmVtaXQoIGV2ZW50ICk7XG4gICAgdGhpcy5kbmRFbmQuZW1pdCggZXZlbnQgKTtcblxuICAgIC8vIHJlc2V0IGdsb2JhbCBzdGF0ZVxuICAgIGVuZERyYWcoKTtcblxuICAgIHRoaXMuaXNEcmFnU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyggdGhpcy5kcmFnSW1hZ2UsIHRoaXMuZG5kRHJhZ2dpbmdDbGFzcyApO1xuXG4gICAgLy8gSUU5IHNwZWNpYWwgaGFtbWVyaW5nXG4gICAgd2luZG93LnNldFRpbWVvdXQoICgpID0+IHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmRuZERyYWdnaW5nU291cmNlQ2xhc3MgKTtcbiAgICB9LCAwICk7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHJlZ2lzdGVyRHJhZ0hhbmRsZSggaGFuZGxlOkRuZEhhbmRsZURpcmVjdGl2ZSB8IHVuZGVmaW5lZCApIHtcblxuICAgIHRoaXMuZG5kSGFuZGxlID0gaGFuZGxlO1xuICB9XG5cbiAgcmVnaXN0ZXJEcmFnSW1hZ2UoIGVsZW1lbnRSZWY6RWxlbWVudFJlZiB8IHVuZGVmaW5lZCApIHtcblxuICAgIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gIH1cblxuICBwcml2YXRlIGRldGVybWluZURyYWdJbWFnZSgpOkVsZW1lbnQge1xuXG4gICAgLy8gZXZhbHVhdGUgY3VzdG9tIGRyYWcgaW1hZ2UgZXhpc3RlbmNlXG4gICAgaWYoIHR5cGVvZiB0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cbiAgICAgIHJldHVybiB0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBFbGVtZW50O1xuICAgIH1cbiAgICBlbHNlIHtcblxuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cbiAgfVxufVxuIl19
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFM0QsT0FBTyxFQUNMLHdCQUF3QixFQUd4QixXQUFXLEVBQ1gsWUFBWSxHQUNiLE1BQU0sYUFBYSxDQUFDOztBQUdyQixNQUFNLE9BQU8sd0JBQXdCO0lBRHJDO1FBRUUsMEJBQXFCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDeEUsZUFBVSxHQUE0QixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7S0FLMUQ7SUFIQyxRQUFRO1FBQ04sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDOztxSEFOVSx3QkFBd0I7eUdBQXhCLHdCQUF3QjsyRkFBeEIsd0JBQXdCO2tCQURwQyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFOztBQVc1QyxNQUFNLE9BQU8scUJBQXFCO0lBRGxDO1FBR1cscUJBQWdCLEdBQWtCLE1BQU0sQ0FBQztRQUV6QyxxQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFDakMsMkJBQXNCLEdBQUcsbUJBQW1CLENBQUM7UUFDN0MsOEJBQXlCLEdBQUcsc0JBQXNCLENBQUM7UUFD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UyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERuZEhhbmRsZURpcmVjdGl2ZSB9IGZyb20gJy4vZG5kLWhhbmRsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgZG5kU3RhdGUsIGVuZERyYWcsIHN0YXJ0RHJhZyB9IGZyb20gJy4vZG5kLXN0YXRlJztcbmltcG9ydCB7IEVmZmVjdEFsbG93ZWQgfSBmcm9tICcuL2RuZC10eXBlcyc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVEcmFnSW1hZ2VPZmZzZXQsXG4gIERuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uLFxuICBEbmRFdmVudCxcbiAgc2V0RHJhZ0RhdGEsXG4gIHNldERyYWdJbWFnZSxcbn0gZnJvbSAnLi9kbmQtdXRpbHMnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbZG5kRHJhZ0ltYWdlUmVmXScgfSlcbmV4cG9ydCBjbGFzcyBEbmREcmFnSW1hZ2VSZWZEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBkbmREcmFnZ2FibGVEaXJlY3RpdmUgPSBpbmplY3QoZm9yd2FyZFJlZigoKSA9PiBEbmREcmFnZ2FibGVEaXJlY3RpdmUpKTtcbiAgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kbmREcmFnZ2FibGVEaXJlY3RpdmUucmVnaXN0ZXJEcmFnSW1hZ2UodGhpcy5lbGVtZW50UmVmKTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbZG5kRHJhZ2dhYmxlXScgfSlcbmV4cG9ydCBjbGFzcyBEbmREcmFnZ2FibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBkbmREcmFnZ2FibGU6IGFueTtcbiAgQElucHV0KCkgZG5kRWZmZWN0QWxsb3dlZDogRWZmZWN0QWxsb3dlZCA9ICdjb3B5JztcbiAgQElucHV0KCkgZG5kVHlwZT86IHN0cmluZztcbiAgQElucHV0KCkgZG5kRHJhZ2dpbmdDbGFzcyA9ICdkbmREcmFnZ2luZyc7XG4gIEBJbnB1dCgpIGRuZERyYWdnaW5nU291cmNlQ2xhc3MgPSAnZG5kRHJhZ2dpbmdTb3VyY2UnO1xuICBASW5wdXQoKSBkbmREcmFnZ2FibGVEaXNhYmxlZENsYXNzID0gJ2RuZERyYWdnYWJsZURpc2FibGVkJztcbiAgQElucHV0KCkgZG5kRHJhZ0ltYWdlT2Zmc2V0RnVuY3Rpb246IERuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uID1cbiAgICBjYWxjdWxhdGVEcmFnSW1hZ2VPZmZzZXQ7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRuZFN0YXJ0OiBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBkbmREcmFnOiBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBkbmRFbmQ6IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRuZE1vdmVkOiBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBkbmRDb3BpZWQ6IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRuZExpbmtlZDogRXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZG5kQ2FuY2VsZWQ6IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZHJhZ2dhYmxlJykgZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICBwcml2YXRlIGRuZEhhbmRsZT86IERuZEhhbmRsZURpcmVjdGl2ZTtcbiAgcHJpdmF0ZSBkbmREcmFnSW1hZ2VFbGVtZW50UmVmPzogRWxlbWVudFJlZjtcbiAgcHJpdmF0ZSBkcmFnSW1hZ2U6IEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNEcmFnU3RhcnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgcHJpdmF0ZSBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICBASW5wdXQoKSBzZXQgZG5kRGlzYWJsZUlmKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5kcmFnZ2FibGUgPSAhdmFsdWU7XG5cbiAgICBpZiAodGhpcy5kcmFnZ2FibGUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmRuZERyYWdnYWJsZURpc2FibGVkQ2xhc3NcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmRuZERyYWdnYWJsZURpc2FibGVkQ2xhc3NcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGRuZERpc2FibGVEcmFnSWYodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRuZERpc2FibGVJZiA9IHZhbHVlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdkcmFnJyxcbiAgICAgICAgdGhpcy5kcmFnRXZlbnRIYW5kbGVyXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICdkcmFnJyxcbiAgICAgIHRoaXMuZHJhZ0V2ZW50SGFuZGxlclxuICAgICk7XG4gICAgaWYgKHRoaXMuaXNEcmFnU3RhcnRlZCkge1xuICAgICAgZW5kRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RyYWdzdGFydCcsIFsnJGV2ZW50J10pIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEbmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kcmFnZ2FibGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBkbmQgaGFuZGxlIGFuZCBpZiB0aGUgZG5kIGhhbmRsZSB3YXMgdXNlZCB0byBzdGFydCB0aGUgZHJhZ1xuICAgIGlmICh0aGlzLmRuZEhhbmRsZSAhPSBudWxsICYmIGV2ZW50Ll9kbmRVc2luZ0hhbmRsZSA9PSBudWxsKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGdsb2JhbCBzdGF0ZVxuICAgIHN0YXJ0RHJhZyhldmVudCwgdGhpcy5kbmRFZmZlY3RBbGxvd2VkLCB0aGlzLmRuZFR5cGUpO1xuXG4gICAgdGhpcy5pc0RyYWdTdGFydGVkID0gdHJ1ZTtcblxuICAgIHNldERyYWdEYXRhKFxuICAgICAgZXZlbnQsXG4gICAgICB7IGRhdGE6IHRoaXMuZG5kRHJhZ2dhYmxlLCB0eXBlOiB0aGlzLmRuZFR5cGUgfSxcbiAgICAgIGRuZFN0YXRlLmVmZmVjdEFsbG93ZWQhXG4gICAgKTtcblxuICAgIHRoaXMuZHJhZ0ltYWdlID0gdGhpcy5kZXRlcm1pbmVEcmFnSW1hZ2UoKTtcblxuICAgIC8vIHNldCBkcmFnZ2luZyBjc3MgY2xhc3MgcHJpb3IgdG8gc2V0RHJhZ0ltYWdlIHNvIHN0eWxlcyBhcmUgYXBwbGllZCBiZWZvcmVcbiAgICAvLyBUT0RPIGJyZWFraW5nIGNoYW5nZTogYWRkIGNsYXNzIHRvIGVsZW1lbnRSZWYgcmF0aGVyIHRoYW4gZHJhZyBpbWFnZSB3aGljaCBjb3VsZCBiZSBhbm90aGVyIGVsZW1lbnRcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZHJhZ0ltYWdlLCB0aGlzLmRuZERyYWdnaW5nQ2xhc3MpO1xuXG4gICAgLy8gc2V0IGN1c3RvbSBkcmFnaW1hZ2UgaWYgcHJlc2VudFxuICAgIC8vIHNldCBkcmFnaW1hZ2UgaWYgZHJhZyBpcyBzdGFydGVkIGZyb20gZG5kSGFuZGxlXG4gICAgaWYgKHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZiAhPSBudWxsIHx8IGV2ZW50Ll9kbmRVc2luZ0hhbmRsZSAhPSBudWxsKSB7XG4gICAgICBzZXREcmFnSW1hZ2UoZXZlbnQsIHRoaXMuZHJhZ0ltYWdlLCB0aGlzLmRuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgZHJhZ2dpbmcgc291cmNlIGNzcyBjbGFzcyBvbiBmaXJzdCBkcmFnIGV2ZW50XG4gICAgY29uc3QgdW5yZWdpc3RlciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAnZHJhZycsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoXG4gICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5kbmREcmFnZ2luZ1NvdXJjZUNsYXNzXG4gICAgICAgICk7XG4gICAgICAgIHVucmVnaXN0ZXIoKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5kbmRTdGFydC5lbWl0KGV2ZW50KTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJhZ0ltYWdlLCAncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuICAgIH0sIDEwMCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uRHJhZyhldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgdGhpcy5kbmREcmFnLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ2VuZCcsIFsnJGV2ZW50J10pIG9uRHJhZ0VuZChldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgLy8gZ2V0IGRyb3AgZWZmZWN0IGZyb20gY3VzdG9tIHN0b3JlZCBzdGF0ZSBhcyBpdHMgbm90IHJlbGlhYmxlIGFjcm9zcyBicm93c2Vyc1xuICAgIGNvbnN0IGRyb3BFZmZlY3QgPSBkbmRTdGF0ZS5kcm9wRWZmZWN0O1xuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyYWdJbWFnZSwgJ3BvaW50ZXItZXZlbnRzJywgJ3Vuc2V0Jyk7XG5cbiAgICBsZXQgZHJvcEVmZmVjdEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+O1xuXG4gICAgc3dpdGNoIChkcm9wRWZmZWN0KSB7XG4gICAgICBjYXNlICdjb3B5JzpcbiAgICAgICAgZHJvcEVmZmVjdEVtaXR0ZXIgPSB0aGlzLmRuZENvcGllZDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICBkcm9wRWZmZWN0RW1pdHRlciA9IHRoaXMuZG5kTGlua2VkO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbW92ZSc6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRNb3ZlZDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRDYW5jZWxlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZHJvcEVmZmVjdEVtaXR0ZXIuZW1pdChldmVudCk7XG4gICAgdGhpcy5kbmRFbmQuZW1pdChldmVudCk7XG5cbiAgICAvLyByZXNldCBnbG9iYWwgc3RhdGVcbiAgICBlbmREcmFnKCk7XG5cbiAgICB0aGlzLmlzRHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kcmFnSW1hZ2UsIHRoaXMuZG5kRHJhZ2dpbmdDbGFzcyk7XG5cbiAgICAvLyBJRTkgc3BlY2lhbCBoYW1tZXJpbmdcbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5kbmREcmFnZ2luZ1NvdXJjZUNsYXNzXG4gICAgICApO1xuICAgIH0sIDApO1xuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICByZWdpc3RlckRyYWdIYW5kbGUoaGFuZGxlOiBEbmRIYW5kbGVEaXJlY3RpdmUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmRuZEhhbmRsZSA9IGhhbmRsZTtcbiAgfVxuXG4gIHJlZ2lzdGVyRHJhZ0ltYWdlKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkcmFnRXZlbnRIYW5kbGVyOiAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdm9pZCA9IChcbiAgICBldmVudDogRHJhZ0V2ZW50XG4gICkgPT4gdGhpcy5vbkRyYWcoZXZlbnQpO1xuXG4gIHByaXZhdGUgZGV0ZXJtaW5lRHJhZ0ltYWdlKCk6IEVsZW1lbnQge1xuICAgIC8vIGV2YWx1YXRlIGN1c3RvbSBkcmFnIGltYWdlIGV4aXN0ZW5jZVxuICAgIGlmICh0eXBlb2YgdGhpcy5kbmREcmFnSW1hZ2VFbGVtZW50UmVmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==