@worktile/gantt 18.0.3 → 18.0.4

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.
@@ -1,4 +1,4 @@
1
- import { Injectable } from '@angular/core';
1
+ import { effect, Injectable, signal } from '@angular/core';
2
2
  import { Subject, animationFrameScheduler, fromEvent, interval } from 'rxjs';
3
3
  import { takeUntil } from 'rxjs/operators';
4
4
  import { GanttViewType } from '../../class';
@@ -27,10 +27,10 @@ function createSvgElement(qualifiedName, className) {
27
27
  }
28
28
  export class GanttBarDrag {
29
29
  get dragDisabled() {
30
- return !this.item.draggable || !this.ganttUpper.draggable;
30
+ return !this.item().draggable || !this.ganttUpper.draggable;
31
31
  }
32
32
  get linkDragDisabled() {
33
- return !this.item.linkable || !this.ganttUpper.linkable;
33
+ return !this.item().linkable || !this.ganttUpper.linkable;
34
34
  }
35
35
  get barHandleDragMoveAndScrollDistance() {
36
36
  return this.barHandleDragMoveDistance + this.dragScrollDistance;
@@ -43,7 +43,9 @@ export class GanttBarDrag {
43
43
  this.dom = dom;
44
44
  this.dragContainer = dragContainer;
45
45
  this._ngZone = _ngZone;
46
- this.dragRefs = [];
46
+ this.item = signal(null);
47
+ this.linkDragRefs = [];
48
+ this.barHandleDragRefs = [];
47
49
  this.destroy$ = new Subject();
48
50
  /** Used to signal to the current auto-scroll sequence when to stop. */
49
51
  this.stopScrollTimers$ = new Subject();
@@ -74,6 +76,12 @@ export class GanttBarDrag {
74
76
  }
75
77
  });
76
78
  };
79
+ effect(() => {
80
+ const item = this.item();
81
+ if (item) {
82
+ this.createDrags();
83
+ }
84
+ });
77
85
  }
78
86
  createDragRef(element) {
79
87
  const dragRef = this.dragDrop.createDrag(element);
@@ -83,40 +91,46 @@ export class GanttBarDrag {
83
91
  return fromEvent(this.dom.mainContainer, 'scroll', passiveListenerOptions).pipe(takeUntil(dragRef.ended));
84
92
  }
85
93
  createMouseEvents() {
86
- const dropClass = this.ganttUpper.config.linkOptions?.dependencyTypes?.length === 1 &&
87
- this.ganttUpper.config.linkOptions?.dependencyTypes[0] === GanttLinkType.fs
88
- ? singleDropActiveClass
89
- : dropActiveClass;
90
- fromEvent(this.barElement, 'mouseenter', passiveListenerOptions)
91
- .pipe(takeUntil(this.destroy$))
92
- .subscribe(() => {
93
- if (this.dragContainer.linkDraggingId && this.dragContainer.linkDraggingId !== this.item.id) {
94
- if (this.item.linkable) {
95
- this.barElement.classList.add(dropClass);
96
- this.dragContainer.emitLinkDragEntered({
97
- item: this.item,
98
- element: this.barElement
99
- });
94
+ if (!this.hasMonitorMouseEvent && (!this.dragDisabled || !this.linkDragDisabled)) {
95
+ this.hasMonitorMouseEvent = true;
96
+ const dropClass = this.ganttUpper.config.linkOptions?.dependencyTypes?.length === 1 &&
97
+ this.ganttUpper.config.linkOptions?.dependencyTypes[0] === GanttLinkType.fs
98
+ ? singleDropActiveClass
99
+ : dropActiveClass;
100
+ fromEvent(this.barElement, 'mouseenter', passiveListenerOptions)
101
+ .pipe(takeUntil(this.destroy$))
102
+ .subscribe(() => {
103
+ if (this.dragContainer.linkDraggingId && this.dragContainer.linkDraggingId !== this.item().id) {
104
+ if (!this.linkDragDisabled) {
105
+ this.barElement.classList.add(dropClass);
106
+ this.dragContainer.emitLinkDragEntered({
107
+ item: this.item(),
108
+ element: this.barElement
109
+ });
110
+ }
100
111
  }
101
- }
102
- else {
103
- this.barElement.classList.add(activeClass);
104
- }
105
- });
106
- fromEvent(this.barElement, 'mouseleave', passiveListenerOptions)
107
- .pipe(takeUntil(this.destroy$))
108
- .subscribe(() => {
109
- if (!this.dragContainer.linkDraggingId) {
110
- this.barElement.classList.remove(activeClass);
111
- }
112
- else {
113
- this.dragContainer.emitLinkDragLeaved();
114
- }
115
- this.barElement.classList.remove(dropClass);
116
- });
112
+ else {
113
+ if (!this.dragDisabled || !this.linkDragDisabled) {
114
+ this.barElement.classList.add(activeClass);
115
+ }
116
+ }
117
+ });
118
+ fromEvent(this.barElement, 'mouseleave', passiveListenerOptions)
119
+ .pipe(takeUntil(this.destroy$))
120
+ .subscribe(() => {
121
+ if (!this.dragContainer.linkDraggingId) {
122
+ this.barElement.classList.remove(activeClass);
123
+ }
124
+ else {
125
+ this.dragContainer.emitLinkDragLeaved();
126
+ }
127
+ this.barElement.classList.remove(dropClass);
128
+ });
129
+ }
117
130
  }
118
131
  createBarDrag() {
119
132
  const dragRef = this.createDragRef(this.barElement);
133
+ dragRef.disabled = this.dragDisabled;
120
134
  dragRef.lockAxis = 'x';
121
135
  dragRef.withBoundaryElement(this.dom.mainItems);
122
136
  dragRef.started.subscribe(() => {
@@ -130,7 +144,7 @@ export class GanttBarDrag {
130
144
  this.barDragMove();
131
145
  }
132
146
  });
133
- this.dragContainer.dragStarted.emit({ item: this.item.origin });
147
+ this.dragContainer.dragStarted.emit({ item: this.item().origin });
134
148
  });
135
149
  dragRef.moved.subscribe((event) => {
136
150
  this.startScrollingIfNecessary(event.pointerPosition.x, event.pointerPosition.y);
@@ -147,14 +161,13 @@ export class GanttBarDrag {
147
161
  this.dragScrolling = false;
148
162
  this.dragScrollDistance = 0;
149
163
  this.barDragMoveDistance = 0;
150
- this.item.updateRefs({
151
- width: this.ganttUpper.view.getDateRangeWidth(this.item.start, this.item.end),
152
- x: this.ganttUpper.view.getXPointByDate(this.item.start),
164
+ this.item().updateRefs({
165
+ width: this.ganttUpper.view.getDateRangeWidth(this.item().start, this.item().end),
166
+ x: this.ganttUpper.view.getXPointByDate(this.item().start),
153
167
  y: (this.ganttUpper.styles.lineHeight - this.ganttUpper.styles.barHeight) / 2 - 1
154
168
  });
155
- this.dragContainer.dragEnded.emit({ item: this.item.origin });
169
+ this.dragContainer.dragEnded.emit({ item: this.item().origin });
156
170
  });
157
- this.barDragRef = dragRef;
158
171
  return dragRef;
159
172
  }
160
173
  createBarHandleDrags() {
@@ -163,6 +176,7 @@ export class GanttBarDrag {
163
176
  handles.forEach((handle, index) => {
164
177
  const isBefore = index === 0;
165
178
  const dragRef = this.createDragRef(handle);
179
+ dragRef.disabled = this.dragDisabled;
166
180
  dragRef.lockAxis = 'x';
167
181
  dragRef.withBoundaryElement(this.dom.mainItems);
168
182
  dragRef.started.subscribe(() => {
@@ -185,7 +199,7 @@ export class GanttBarDrag {
185
199
  }
186
200
  }
187
201
  });
188
- this.dragContainer.dragStarted.emit({ item: this.item.origin });
202
+ this.dragContainer.dragStarted.emit({ item: this.item().origin });
189
203
  });
190
204
  dragRef.moved.subscribe((event) => {
191
205
  if (this.barHandleDragMoveRecordDiffs && this.barHandleDragMoveRecordDiffs > 0) {
@@ -209,12 +223,12 @@ export class GanttBarDrag {
209
223
  this.dragScrolling = false;
210
224
  this.dragScrollDistance = 0;
211
225
  this.barHandleDragMoveDistance = 0;
212
- this.item.updateRefs({
213
- width: this.ganttUpper.view.getDateRangeWidth(this.item.start, this.item.end),
214
- x: this.ganttUpper.view.getXPointByDate(this.item.start),
226
+ this.item().updateRefs({
227
+ width: this.ganttUpper.view.getDateRangeWidth(this.item().start, this.item().end),
228
+ x: this.ganttUpper.view.getXPointByDate(this.item().start),
215
229
  y: (this.ganttUpper.styles.lineHeight - this.ganttUpper.styles.barHeight) / 2 - 1
216
230
  });
217
- this.dragContainer.dragEnded.emit({ item: this.item.origin });
231
+ this.dragContainer.dragEnded.emit({ item: this.item().origin });
218
232
  });
219
233
  dragRefs.push(dragRef);
220
234
  });
@@ -226,6 +240,7 @@ export class GanttBarDrag {
226
240
  handles.forEach((handle, index) => {
227
241
  const isBegin = index === 0;
228
242
  const dragRef = this.dragDrop.createDrag(handle);
243
+ dragRef.disabled = this.linkDragDisabled;
229
244
  dragRef.withBoundaryElement(this.dom.root);
230
245
  dragRef.beforeStarted.subscribe(() => {
231
246
  handle.style.pointerEvents = 'none';
@@ -235,7 +250,7 @@ export class GanttBarDrag {
235
250
  this.createLinkDraggingLine();
236
251
  this.dragContainer.emitLinkDragStarted({
237
252
  element: this.barElement,
238
- item: this.item,
253
+ item: this.item(),
239
254
  pos: isBegin ? InBarPosition.start : InBarPosition.finish
240
255
  });
241
256
  });
@@ -310,10 +325,10 @@ export class GanttBarDrag {
310
325
  this.barElement.classList.remove('gantt-bar-draggable-drag');
311
326
  }
312
327
  barDragMove() {
313
- const currentX = this.item.refs.x + this.barDragMoveDistance + this.dragScrollDistance;
328
+ const currentX = this.item().refs.x + this.barDragMoveDistance + this.dragScrollDistance;
314
329
  const currentDate = this.ganttUpper.view.getDateByXPoint(currentX);
315
330
  const currentStartX = this.ganttUpper.view.getXPointByDate(currentDate);
316
- const diffs = this.ganttUpper.view.differenceByPrecisionUnit(this.item.end, this.item.start);
331
+ const diffs = this.ganttUpper.view.differenceByPrecisionUnit(this.item().end, this.item().start);
317
332
  let start = currentDate;
318
333
  let end = currentDate.add(diffs, this.ganttUpper.view?.options?.datePrecisionUnit);
319
334
  // 日视图特殊逻辑处理
@@ -328,59 +343,59 @@ export class GanttBarDrag {
328
343
  const left = currentX - this.barDragMoveDistance;
329
344
  this.barElement.style.left = left + 'px';
330
345
  }
331
- this.openDragBackdrop(this.barElement, this.ganttUpper.view.getDateByXPoint(currentX), this.ganttUpper.view.getDateByXPoint(currentX + this.item.refs.width));
346
+ this.openDragBackdrop(this.barElement, this.ganttUpper.view.getDateByXPoint(currentX), this.ganttUpper.view.getDateByXPoint(currentX + this.item().refs.width));
332
347
  if (!this.isStartOrEndInsideView(start, end)) {
333
348
  return;
334
349
  }
335
350
  this.updateItemDate(start, end);
336
- this.dragContainer.dragMoved.emit({ item: this.item.origin });
351
+ this.dragContainer.dragMoved.emit({ item: this.item().origin });
337
352
  }
338
353
  barBeforeHandleDragMove() {
339
354
  const { x, start, minRangeWidthWidth } = this.startOfBarHandle();
340
- const width = this.item.refs.width + this.barHandleDragMoveAndScrollDistance * -1;
341
- const diffs = this.ganttUpper.view.differenceByPrecisionUnit(this.item.end, start);
355
+ const width = this.item().refs.width + this.barHandleDragMoveAndScrollDistance * -1;
356
+ const diffs = this.ganttUpper.view.differenceByPrecisionUnit(this.item().end, start);
342
357
  if (width > dragMinWidth && diffs > 0) {
343
358
  this.barElement.style.width = width + 'px';
344
359
  this.barElement.style.left = x + 'px';
345
- this.openDragBackdrop(this.barElement, start, this.item.end);
346
- if (!this.isStartOrEndInsideView(start, this.item.end)) {
360
+ this.openDragBackdrop(this.barElement, start, this.item().end);
361
+ if (!this.isStartOrEndInsideView(start, this.item().end)) {
347
362
  return;
348
363
  }
349
- this.updateItemDate(start, this.item.end);
364
+ this.updateItemDate(start, this.item().end);
350
365
  }
351
366
  else {
352
367
  if (this.barHandleDragMoveRecordDiffs > 0 && diffs <= 0) {
353
368
  this.barElement.style.width = minRangeWidthWidth + 'px';
354
- const x = this.ganttUpper.view.getXPointByDate(this.item.end);
369
+ const x = this.ganttUpper.view.getXPointByDate(this.item().end);
355
370
  this.barElement.style.left = x + 'px';
356
371
  }
357
- this.openDragBackdrop(this.barElement, this.item.end, this.item.end);
358
- this.updateItemDate(this.item.end, this.item.end);
372
+ this.openDragBackdrop(this.barElement, this.item().end, this.item().end);
373
+ this.updateItemDate(this.item().end, this.item().end);
359
374
  }
360
375
  this.barHandleDragMoveRecordDiffs = diffs;
361
- this.dragContainer.dragMoved.emit({ item: this.item.origin });
376
+ this.dragContainer.dragMoved.emit({ item: this.item().origin });
362
377
  }
363
378
  barAfterHandleDragMove() {
364
379
  const { width, end } = this.endOfBarHandle();
365
- const diffs = this.ganttUpper.view.differenceByPrecisionUnit(end, this.item.start);
380
+ const diffs = this.ganttUpper.view.differenceByPrecisionUnit(end, this.item().start);
366
381
  if (width > dragMinWidth && diffs > 0) {
367
382
  this.barElement.style.width = width + 'px';
368
- this.openDragBackdrop(this.barElement, this.item.start, end);
369
- if (!this.isStartOrEndInsideView(this.item.start, end)) {
383
+ this.openDragBackdrop(this.barElement, this.item().start, end);
384
+ if (!this.isStartOrEndInsideView(this.item().start, end)) {
370
385
  return;
371
386
  }
372
- this.updateItemDate(this.item.start, end);
387
+ this.updateItemDate(this.item().start, end);
373
388
  }
374
389
  else {
375
390
  if (this.barHandleDragMoveRecordDiffs > 0 && diffs <= 0) {
376
- const minRangeWidth = this.ganttUpper.view.getMinRangeWidthByPrecisionUnit(this.item.start);
391
+ const minRangeWidth = this.ganttUpper.view.getMinRangeWidthByPrecisionUnit(this.item().start);
377
392
  this.barElement.style.width = minRangeWidth + 'px';
378
393
  }
379
- this.openDragBackdrop(this.barElement, this.item.start, this.item.start);
380
- this.updateItemDate(this.item.start, this.item.start);
394
+ this.openDragBackdrop(this.barElement, this.item().start, this.item().start);
395
+ this.updateItemDate(this.item().start, this.item().start);
381
396
  }
382
397
  this.barHandleDragMoveRecordDiffs = diffs;
383
- this.dragContainer.dragMoved.emit({ item: this.item.origin });
398
+ this.dragContainer.dragMoved.emit({ item: this.item().origin });
384
399
  }
385
400
  calcLinkLinePositions(target, isBefore) {
386
401
  const rootRect = this.dom.root.getBoundingClientRect();
@@ -437,33 +452,33 @@ export class GanttBarDrag {
437
452
  const xThreshold = clientWidth * DROP_PROXIMITY_THRESHOLD;
438
453
  if (isBefore) {
439
454
  const { start, minRangeWidthWidth } = this.startOfBarHandle();
440
- const xPointerByEndDate = this.ganttUpper.view.getXPointByDate(this.item.end);
441
- isStartGreaterThanEnd = start.value > this.item.end.value;
455
+ const xPointerByEndDate = this.ganttUpper.view.getXPointByDate(this.item().end);
456
+ isStartGreaterThanEnd = start.value > this.item().end.value;
442
457
  isBarAppearsInView = xPointerByEndDate + minRangeWidthWidth + xThreshold <= scrollLeft + clientWidth;
443
458
  }
444
459
  else {
445
460
  const { end } = this.endOfBarHandle();
446
- const xPointerByStartDate = this.ganttUpper.view.getXPointByDate(this.item.start);
447
- isStartGreaterThanEnd = end.value < this.item.start.value;
461
+ const xPointerByStartDate = this.ganttUpper.view.getXPointByDate(this.item().start);
462
+ isStartGreaterThanEnd = end.value < this.item().start.value;
448
463
  isBarAppearsInView = scrollLeft + xThreshold <= xPointerByStartDate;
449
464
  }
450
465
  return isStartGreaterThanEnd && isBarAppearsInView ? true : false;
451
466
  }
452
467
  // Some data information about dragging start until it is equal to or greater than end
453
468
  startOfBarHandle() {
454
- const x = this.item.refs.x + this.barHandleDragMoveAndScrollDistance;
469
+ const x = this.item().refs.x + this.barHandleDragMoveAndScrollDistance;
455
470
  return {
456
471
  x,
457
472
  start: this.ganttUpper.view.getDateByXPoint(x),
458
- minRangeWidthWidth: this.ganttUpper.view.getMinRangeWidthByPrecisionUnit(this.item.end)
473
+ minRangeWidthWidth: this.ganttUpper.view.getMinRangeWidthByPrecisionUnit(this.item().end)
459
474
  };
460
475
  }
461
476
  // Some data information about dragging end of bar handle
462
477
  endOfBarHandle() {
463
- const width = this.item.refs.width + this.barHandleDragMoveAndScrollDistance;
478
+ const width = this.item().refs.width + this.barHandleDragMoveAndScrollDistance;
464
479
  return {
465
480
  width,
466
- end: this.ganttUpper.view.getDateByXPoint(this.item.refs.x + width)
481
+ end: this.ganttUpper.view.getDateByXPoint(this.item().refs.x + width)
467
482
  };
468
483
  }
469
484
  stopScrolling() {
@@ -482,34 +497,55 @@ export class GanttBarDrag {
482
497
  }
483
498
  }
484
499
  updateItemDate(start, end) {
485
- this.item.updateDate(this.ganttUpper.view.startOfPrecision(start), this.ganttUpper.view.endOfPrecision(end));
500
+ this.item().updateDate(this.ganttUpper.view.startOfPrecision(start), this.ganttUpper.view.endOfPrecision(end));
486
501
  }
487
- createDrags(elementRef, item, ganttUpper) {
488
- this.item = item;
502
+ initialize(elementRef, item, ganttUpper) {
489
503
  this.barElement = elementRef.nativeElement;
490
504
  this.ganttUpper = ganttUpper;
491
- if (this.dragDisabled && this.linkDragDisabled) {
492
- return;
505
+ this.item.set(item);
506
+ }
507
+ createBarDragRef() {
508
+ if (this.barDragRef) {
509
+ this.barDragRef.disabled = this.dragDisabled;
493
510
  }
494
- else {
495
- this.createMouseEvents();
496
- if (!this.dragDisabled) {
497
- const dragRef = this.createBarDrag();
498
- const dragHandlesRefs = this.createBarHandleDrags();
499
- this.dragRefs.push(dragRef, ...dragHandlesRefs);
500
- }
501
- if (!this.linkDragDisabled) {
502
- const linkDragRefs = this.createLinkHandleDrags();
503
- this.dragRefs.push(...linkDragRefs);
504
- }
511
+ else if (!this.dragDisabled) {
512
+ this.barDragRef = this.createBarDrag();
505
513
  }
506
514
  }
515
+ createBarHandleDragRefs() {
516
+ if (this.barHandleDragRefs.length > 0) {
517
+ this.barHandleDragRefs.forEach((dragRef) => {
518
+ dragRef.disabled = this.dragDisabled;
519
+ });
520
+ }
521
+ else if (!this.dragDisabled) {
522
+ this.barHandleDragRefs = this.createBarHandleDrags();
523
+ }
524
+ }
525
+ createLinkDragRefs() {
526
+ if (this.linkDragRefs.length > 0) {
527
+ this.linkDragRefs.forEach((dragRef) => {
528
+ dragRef.disabled = this.linkDragDisabled;
529
+ });
530
+ }
531
+ else if (!this.linkDragDisabled) {
532
+ this.linkDragRefs = this.createLinkHandleDrags();
533
+ }
534
+ }
535
+ createDrags() {
536
+ this.createMouseEvents();
537
+ this.createBarDragRef();
538
+ this.createBarHandleDragRefs();
539
+ this.createLinkDragRefs();
540
+ }
507
541
  updateItem(item) {
508
- this.item = item;
542
+ this.item.set(item);
509
543
  }
510
544
  ngOnDestroy() {
511
545
  this.closeDragBackdrop();
512
- this.dragRefs.forEach((dragRef) => dragRef.dispose());
546
+ this.barDragRef?.dispose();
547
+ this.linkDragRefs?.forEach((dragRef) => dragRef.dispose());
548
+ this.barHandleDragRefs?.forEach((dragRef) => dragRef.dispose());
513
549
  this.destroy$.next();
514
550
  this.destroy$.complete();
515
551
  this.stopScrolling();
@@ -521,4 +557,4 @@ export class GanttBarDrag {
521
557
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GanttBarDrag, decorators: [{
522
558
  type: Injectable
523
559
  }], ctorParameters: () => [{ type: i1.DragDrop }, { type: i2.GanttDomService }, { type: i3.GanttDragContainer }, { type: i0.NgZone }] });
524
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWRyYWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nYW50dC9zcmMvY29tcG9uZW50cy9iYXIvYmFyLWRyYWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFjLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxPQUFPLEVBQXNCLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRy9FLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsNEJBQTRCLEVBQzVCLHVCQUF1QixFQUMxQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7OztBQUV2RTs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUV0QyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDN0IsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUM7QUFDdkMsTUFBTSxlQUFlLEdBQUcsdUJBQXVCLENBQUM7QUFDaEQsTUFBTSxxQkFBcUIsR0FBRyw4QkFBOEIsQ0FBQztBQUU3RCxTQUFTLGdCQUFnQixDQUFDLGFBQXFCLEVBQUUsU0FBaUI7SUFDOUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN0RixPQUFPLENBQUMsU0FBUyxDQUFDLEdB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QztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBdUI7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEMsQ0FBQzs4R0E5akJRLFlBQVk7a0hBQVosWUFBWTs7MkZBQVosWUFBWTtrQkFEeEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERyYWdEcm9wLCBEcmFnUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBOZ1pvbmUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsIGZyb21FdmVudCwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEdhbnR0Vmlld1R5cGUgfSBmcm9tICcuLi8uLi9jbGFzcyc7XG5pbXBvcnQgeyBHYW50dEl0ZW1JbnRlcm5hbCB9IGZyb20gJy4uLy4uL2NsYXNzL2l0ZW0nO1xuaW1wb3J0IHsgR2FudHRMaW5rVHlwZSB9IGZyb20gJy4uLy4uL2NsYXNzL2xpbmsnO1xuaW1wb3J0IHsgR2FudHREb21TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ2FudHQtZG9tLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2FudHREcmFnQ29udGFpbmVyLCBJbkJhclBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vZ2FudHQtZHJhZy1jb250YWluZXInO1xuaW1wb3J0IHsgR2FudHRVcHBlciB9IGZyb20gJy4uLy4uL2dhbnR0LXVwcGVyJztcbmltcG9ydCB7IEdhbnR0RGF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGUnO1xuaW1wb3J0IHtcbiAgICBBdXRvU2Nyb2xsSG9yaXpvbnRhbERpcmVjdGlvbixcbiAgICBnZXRBdXRvU2Nyb2xsU3BlZWRSYXRlcyxcbiAgICBnZXRIb3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uLFxuICAgIGlzUG9pbnRlck5lYXJDbGllbnRSZWN0XG59IGZyb20gJy4uLy4uL3V0aWxzL2RyYWctc2Nyb2xsJztcbmltcG9ydCB7IHBhc3NpdmVMaXN0ZW5lck9wdGlvbnMgfSBmcm9tICcuLi8uLi91dGlscy9wYXNzaXZlLWxpc3RlbmVycyc7XG5cbi8qKlxuICogUHJveGltaXR5LCBhcyBhIHJhdGlvIHRvIHdpZHRoL2hlaWdodCwgYXQgd2hpY2ggYVxuICogZHJhZ2dlZCBpdGVtIHdpbGwgYWZmZWN0IHRoZSBkcm9wIGNvbnRhaW5lci5cbiAqL1xuY29uc3QgRFJPUF9QUk9YSU1JVFlfVEhSRVNIT0xEID0gMC4wNTtcblxuY29uc3QgZHJhZ01pbldpZHRoID0gMTA7XG5jb25zdCBhdXRvU2Nyb2xsQmFzZVN0ZXAgPSAyO1xuY29uc3QgYWN0aXZlQ2xhc3MgPSAnZ2FudHQtYmFyLWFjdGl2ZSc7XG5jb25zdCBkcm9wQWN0aXZlQ2xhc3MgPSAnZ2FudHQtYmFyLWRyb3AtYWN0aXZlJztcbmNvbnN0IHNpbmdsZURyb3BBY3RpdmVDbGFzcyA9ICdnYW50dC1iYXItc2luZ2xlLWRyb3AtYWN0aXZlJztcblxuZnVuY3Rpb24gY3JlYXRlU3ZnRWxlbWVudChxdWFsaWZpZWROYW1lOiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCBxdWFsaWZpZWROYW1lKTtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdhbnR0QmFyRHJhZyBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSBnYW50dFVwcGVyOiBHYW50dFVwcGVyO1xuXG4gICAgcHJpdmF0ZSBiYXJFbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIHByaXZhdGUgaXRlbTogR2FudHRJdGVtSW50ZXJuYWw7XG5cbiAgICBwcml2YXRlIGdldCBkcmFnRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pdGVtLmRyYWdnYWJsZSB8fCAhdGhpcy5nYW50dFVwcGVyLmRyYWdnYWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBsaW5rRHJhZ0Rpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXRlbS5saW5rYWJsZSB8fCAhdGhpcy5nYW50dFVwcGVyLmxpbmthYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGJhckhhbmRsZURyYWdNb3ZlQW5kU2Nyb2xsRGlzdGFuY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhckhhbmRsZURyYWdNb3ZlRGlzdGFuY2UgKyB0aGlzLmRyYWdTY3JvbGxEaXN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBhdXRvU2Nyb2xsU3RlcCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KGF1dG9TY3JvbGxCYXNlU3RlcCwgdGhpcy5hdXRvU2Nyb2xsU3BlZWRSYXRlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsaW5rRHJhZ2dpbmdMaW5lOiBTVkdFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBiYXJEcmFnUmVmOiBEcmFnUmVmO1xuXG4gICAgcHJpdmF0ZSBkcmFnUmVmczogRHJhZ1JlZltdID0gW107XG5cbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBVc2VkIHRvIHNpZ25hbCB0byB0aGUgY3VycmVudCBhdXRvLXNjcm9sbCBzZXF1ZW5jZSB3aGVuIHRvIHN0b3AuICovXG4gICAgcHJpdmF0ZSBzdG9wU2Nyb2xsVGltZXJzJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogY29udGFpbmVyIGVsZW1lbnQgc2Nyb2xsTGVmdCAqL1xuICAgIHByaXZhdGUgY29udGFpbmVyU2Nyb2xsTGVmdDogbnVtYmVyO1xuXG4gICAgLyoqIG1vdmUgZGlzdGFuY2Ugd2hlbiBkcmFnIGJhciAqL1xuICAgIHByaXZhdGUgYmFyRHJhZ01vdmVEaXN0YW5jZSA9IDA7XG5cbiAgICAvKiogbW92ZSBkaXN0YW5jZSB3aGVuIGRyYWcgYmFyIGhhbmRsZSAqL1xuICAgIHByaXZhdGUgYmFySGFuZGxlRHJhZ01vdmVEaXN0YW5jZSA9IDA7XG5cbiAgICAvKiogc2Nyb2xsaW5nIHN0YXRlIHdoZW4gZHJhZyAqL1xuICAgIHByaXZhdGUgZHJhZ1Njcm9sbGluZyA9IGZhbHNlO1xuXG4gICAgLyoqIGRyYWdTY3JvbGxEaXN0YW5jZSAqL1xuICAgIHByaXZhdGUgZHJhZ1Njcm9sbERpc3RhbmNlID0gMDtcblxuICAgIC8qKiBIb3Jpem9udGFsIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgbGlzdCBpcyBjdXJyZW50bHkgc2Nyb2xsaW5nLiAqL1xuICAgIHByaXZhdGUgX2hvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPSBBdXRvU2Nyb2xsSG9yaXpvbnRhbERpcmVjdGlvbi5OT05FO1xuXG4gICAgLyoqIFJlY29yZCBiYXIgZGF5cyB3aGVuIGJhciBoYW5kbGUgZHJhZyBtb3ZlLiAqL1xuICAgIHByaXZhdGUgYmFySGFuZGxlRHJhZ01vdmVSZWNvcmREaWZmczogbnVtYmVyO1xuXG4gICAgLyoqIFNwZWVkIHJhdGlvIGZvciBhdXRvIHNjcm9sbCAqL1xuICAgIHByaXZhdGUgYXV0b1Njcm9sbFNwZWVkUmF0ZXMgPSAxO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZHJhZ0Ryb3A6IERyYWdEcm9wLFxuICAgICAgICBwcml2YXRlIGRvbTogR2FudHREb21TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGRyYWdDb250YWluZXI6IEdhbnR0RHJhZ0NvbnRhaW5lcixcbiAgICAgICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmVcbiAgICApIHt9XG5cbiAgICBwcml2YXRlIGNyZWF0ZURyYWdSZWY8VCA9IGFueT4oZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCk6IERyYWdSZWY8VD4ge1xuICAgICAgICBjb25zdCBkcmFnUmVmID0gdGhpcy5kcmFnRHJvcC5jcmVhdGVEcmFnKGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gZHJhZ1JlZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZURyYWdTY3JvbGxFdmVudChkcmFnUmVmOiBEcmFnUmVmKSB7XG4gICAgICAgIHJldHVybiBmcm9tRXZlbnQodGhpcy5kb20ubWFpbkNvbnRhaW5lciwgJ3Njcm9sbCcsIHBhc3NpdmVMaXN0ZW5lck9wdGlvbnMpLnBpcGUodGFrZVVudGlsKGRyYWdSZWYuZW5kZWQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1vdXNlRXZlbnRzKCkge1xuICAgICAgICBjb25zdCBkcm9wQ2xhc3MgPVxuICAgICAgICAgICAgdGhpcy5nYW50dFVwcGVyLmNvbmZpZy5saW5rT3B0aW9ucz8uZGVwZW5kZW5jeVR5cGVzPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgIHRoaXMuZ2FudHRVcHBlci5jb25maWcubGlua09wdGlvbnM/LmRlcGVuZGVuY3lUeXBlc1swXSA9PT0gR2FudHRMaW5rVHlwZS5mc1xuICAgICAgICAgICAgICAgID8gc2luZ2xlRHJvcEFjdGl2ZUNsYXNzXG4gICAgICAgICAgICAgICAgOiBkcm9wQWN0aXZlQ2xhc3M7XG5cbiAgICAgICAgZnJvbUV2ZW50KHRoaXMuYmFyRWxlbWVudCwgJ21vdXNlZW50ZXInLCBwYXNzaXZlTGlzdGVuZXJPcHRpb25zKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ0NvbnRhaW5lci5saW5rRHJhZ2dpbmdJZCAmJiB0aGlzLmRyYWdDb250YWluZXIubGlua0RyYWdnaW5nSWQgIT09IHRoaXMuaXRlbS5pZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtLmxpbmthYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQuY2xhc3NMaXN0LmFkZChkcm9wQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmVtaXRMaW5rRHJhZ0VudGVyZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IHRoaXMuaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmJhckVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZyb21FdmVudCh0aGlzLmJhckVsZW1lbnQsICdtb3VzZWxlYXZlJywgcGFzc2l2ZUxpc3RlbmVyT3B0aW9ucylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kcmFnQ29udGFpbmVyLmxpbmtEcmFnZ2luZ0lkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdDb250YWluZXIuZW1pdExpbmtEcmFnTGVhdmVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGRyb3BDbGFzcyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUJhckRyYWcoKSB7XG4gICAgICAgIGNvbnN0IGRyYWdSZWYgPSB0aGlzLmNyZWF0ZURyYWdSZWYodGhpcy5iYXJFbGVtZW50KTtcbiAgICAgICAgZHJhZ1JlZi5sb2NrQXhpcyA9ICd4JztcbiAgICAgICAgZHJhZ1JlZi53aXRoQm91bmRhcnlFbGVtZW50KHRoaXMuZG9tLm1haW5JdGVtcyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGRyYWdSZWYuc3RhcnRlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREcmFnZ2luZ1N0eWxlcygpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJTY3JvbGxMZWZ0ID0gdGhpcy5kb20ubWFpbkNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVEcmFnU2Nyb2xsRXZlbnQoZHJhZ1JlZikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZHJhZ1JlZi5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJhZ1Njcm9sbERpc3RhbmNlID0gdGhpcy5kb20ubWFpbkNvbnRhaW5lci5zY3JvbGxMZWZ0IC0gdGhpcy5jb250YWluZXJTY3JvbGxMZWZ0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdTY3JvbGxEaXN0YW5jZSA9IGRyYWdTY3JvbGxEaXN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgZHJhZ1JlZlsnX2JvdW5kYXJ5UmVjdCddID0gdGhpcy5kb20ubWFpbkl0ZW1zLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckRyYWdNb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmRyYWdDb250YWluZXIuZHJhZ1N0YXJ0ZWQuZW1pdCh7IGl0ZW06IHRoaXMuaXRlbS5vcmlnaW4gfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRyYWdSZWYubW92ZWQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGFydFNjcm9sbGluZ0lmTmVjZXNzYXJ5KGV2ZW50LnBvaW50ZXJQb3NpdGlvbi54LCBldmVudC5wb2ludGVyUG9zaXRpb24ueSk7XG4gICAgICAgICAgICB0aGlzLmJhckRyYWdNb3ZlRGlzdGFuY2UgPSBldmVudC5kaXN0YW5jZS54O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRyYWdTY3JvbGxpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhckRyYWdNb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRyYWdSZWYuZW5kZWQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhckRyYWdnaW5nU3R5bGVzKCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRHJhZ0JhY2tkcm9wKCk7XG4gICAgICAgICAgICBldmVudC5zb3VyY2UucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xuICAgICAgICAgICAgdGhpcy5kcmFnU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmRyYWdTY3JvbGxEaXN0YW5jZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmJhckRyYWdNb3ZlRGlzdGFuY2UgPSAwO1xuICAgICAgICAgICAgdGhpcy5pdGVtLnVwZGF0ZVJlZnMoe1xuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXREYXRlUmFuZ2VXaWR0aCh0aGlzLml0ZW0uc3RhcnQsIHRoaXMuaXRlbS5lbmQpLFxuICAgICAgICAgICAgICAgIHg6IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldFhQb2ludEJ5RGF0ZSh0aGlzLml0ZW0uc3RhcnQpLFxuICAgICAgICAgICAgICAgIHk6ICh0aGlzLmdhbnR0VXBwZXIuc3R5bGVzLmxpbmVIZWlnaHQgLSB0aGlzLmdhbnR0VXBwZXIuc3R5bGVzLmJhckhlaWdodCkgLyAyIC0gMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmRyYWdDb250YWluZXIuZHJhZ0VuZGVkLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW0ub3JpZ2luIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5iYXJEcmFnUmVmID0gZHJhZ1JlZjtcblxuICAgICAgICByZXR1cm4gZHJhZ1JlZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUJhckhhbmRsZURyYWdzKCkge1xuICAgICAgICBjb25zdCBkcmFnUmVmcyA9IFtdO1xuICAgICAgICBjb25zdCBoYW5kbGVzID0gdGhpcy5iYXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZHJhZy1oYW5kbGVzIC5oYW5kbGUnKTtcbiAgICAgICAgaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0JlZm9yZSA9IGluZGV4ID09PSAwO1xuICAgICAgICAgICAgY29uc3QgZHJhZ1JlZiA9IHRoaXMuY3JlYXRlRHJhZ1JlZihoYW5kbGUpO1xuICAgICAgICAgICAgZHJhZ1JlZi5sb2NrQXhpcyA9ICd4JztcbiAgICAgICAgICAgIGRyYWdSZWYud2l0aEJvdW5kYXJ5RWxlbWVudCh0aGlzLmRvbS5tYWluSXRlbXMgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgZHJhZ1JlZi5zdGFydGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREcmFnZ2luZ1N0eWxlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyU2Nyb2xsTGVmdCA9IHRoaXMuZG9tLm1haW5Db250YWluZXIuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURyYWdTY3JvbGxFdmVudChkcmFnUmVmKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZHJhZ1JlZi5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdTY3JvbGxEaXN0YW5jZSA9IHRoaXMuZG9tLm1haW5Db250YWluZXIuc2Nyb2xsTGVmdCAtIHRoaXMuY29udGFpbmVyU2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1Njcm9sbERpc3RhbmNlID0gZHJhZ1Njcm9sbERpc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ1JlZlsnX2JvdW5kYXJ5UmVjdCddID0gdGhpcy5kb20ubWFpbkl0ZW1zLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kcmFnU2Nyb2xsaW5nICYmIHRoaXMuaXNTdGFydEdyZWF0ZXJUaGFuRW5kV2hlbkJhckhhbmRsZURyYWdNb3ZlKGlzQmVmb3JlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1Njcm9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckJlZm9yZUhhbmRsZURyYWdNb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyQWZ0ZXJIYW5kbGVEcmFnTW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmRyYWdTdGFydGVkLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW0ub3JpZ2luIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRyYWdSZWYubW92ZWQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJhckhhbmRsZURyYWdNb3ZlUmVjb3JkRGlmZnMgJiYgdGhpcy5iYXJIYW5kbGVEcmFnTW92ZVJlY29yZERpZmZzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U2Nyb2xsaW5nSWZOZWNlc3NhcnkoZXZlbnQucG9pbnRlclBvc2l0aW9uLngsIGV2ZW50LnBvaW50ZXJQb3NpdGlvbi55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5iYXJIYW5kbGVEcmFnTW92ZURpc3RhbmNlID0gZXZlbnQuZGlzdGFuY2UueDtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZHJhZ1Njcm9sbGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNCZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyQmVmb3JlSGFuZGxlRHJhZ01vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyQWZ0ZXJIYW5kbGVEcmFnTW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRyYWdSZWYuZW5kZWQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJEcmFnZ2luZ1N0eWxlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VEcmFnQmFja2Ryb3AoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zb3VyY2UucmVzZXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTY3JvbGxEaXN0YW5jZSA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXJIYW5kbGVEcmFnTW92ZURpc3RhbmNlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW0udXBkYXRlUmVmcyh7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXREYXRlUmFuZ2VXaWR0aCh0aGlzLml0ZW0uc3RhcnQsIHRoaXMuaXRlbS5lbmQpLFxuICAgICAgICAgICAgICAgICAgICB4OiB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXRYUG9pbnRCeURhdGUodGhpcy5pdGVtLnN0YXJ0KSxcbiAgICAgICAgICAgICAgICAgICAgeTogKHRoaXMuZ2FudHRVcHBlci5zdHlsZXMubGluZUhlaWdodCAtIHRoaXMuZ2FudHRVcHBlci5zdHlsZXMuYmFySGVpZ2h0KSAvIDIgLSAxXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmRyYWdFbmRlZC5lbWl0KHsgaXRlbTogdGhpcy5pdGVtLm9yaWdpbiB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZHJhZ1JlZnMucHVzaChkcmFnUmVmKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkcmFnUmVmcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUxpbmtIYW5kbGVEcmFncygpIHtcbiAgICAgICAgY29uc3QgZHJhZ1JlZnMgPSBbXTtcbiAgICAgICAgY29uc3QgaGFuZGxlcyA9IHRoaXMuYmFyRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmxpbmstaGFuZGxlcyAuaGFuZGxlJyk7XG4gICAgICAgIGhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNCZWdpbiA9IGluZGV4ID09PSAwO1xuICAgICAgICAgICAgY29uc3QgZHJhZ1JlZiA9IHRoaXMuZHJhZ0Ryb3AuY3JlYXRlRHJhZyhoYW5kbGUpO1xuICAgICAgICAgICAgZHJhZ1JlZi53aXRoQm91bmRhcnlFbGVtZW50KHRoaXMuZG9tLnJvb3QgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgZHJhZ1JlZi5iZWZvcmVTdGFydGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYmFyRHJhZ1JlZikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckRyYWdSZWYuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUxpbmtEcmFnZ2luZ0xpbmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdDb250YWluZXIuZW1pdExpbmtEcmFnU3RhcnRlZCh7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuYmFyRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbTogdGhpcy5pdGVtLFxuICAgICAgICAgICAgICAgICAgICBwb3M6IGlzQmVnaW4gPyBJbkJhclBvc2l0aW9uLnN0YXJ0IDogSW5CYXJQb3NpdGlvbi5maW5pc2hcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkcmFnUmVmLm1vdmVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5jYWxjTGlua0xpbmVQb3NpdGlvbnMoaGFuZGxlLCBpc0JlZ2luKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmtEcmFnZ2luZ0xpbmUuc2V0QXR0cmlidXRlKCd4MScsIHBvc2l0aW9ucy54MS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmtEcmFnZ2luZ0xpbmUuc2V0QXR0cmlidXRlKCd5MScsIHBvc2l0aW9ucy55MS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmtEcmFnZ2luZ0xpbmUuc2V0QXR0cmlidXRlKCd4MicsIHBvc2l0aW9ucy54Mi50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmtEcmFnZ2luZ0xpbmUuc2V0QXR0cmlidXRlKCd5MicsIHBvc2l0aW9ucy55Mi50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkcmFnUmVmLmVuZGVkLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJhckRyYWdSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJEcmFnUmVmLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOiuoeeul2xpbmXmi5bliqjnmoTokL3ngrnkvY3kuo7nm67moIdCYXLnmoTlgLzvvIzlpoLmnpzlgLzlpKfkuo5CYXLlrr3luqbnmoTkuIDljYrvvIzor7TmmI7mmK/mi5bliqjliLBCZWdpbuS9jee9ru+8jOWQpuWImeWImeS4uuaLluWKqOWIsEVuZOS9jee9rlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyYWdDb250YWluZXIubGlua0RyYWdQYXRoLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlUG9pbnRYID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5nZXRSb290RWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnggLVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmxpbmtEcmFnUGF0aC50by5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLng7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmVtaXRMaW5rRHJhZ0VuZGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZHJhZ0NvbnRhaW5lci5saW5rRHJhZ1BhdGgudG8sXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VQb2ludFggPCB0aGlzLmRyYWdDb250YWluZXIubGlua0RyYWdQYXRoLnRvLml0ZW0ucmVmcy53aWR0aCAvIDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBJbkJhclBvc2l0aW9uLnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW5CYXJQb3NpdGlvbi5maW5pc2hcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmVtaXRMaW5rRHJhZ0VuZGVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5yZXNldCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lMaW5rRHJhZ2dpbmdMaW5lKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZHJhZ1JlZnMucHVzaChkcmFnUmVmKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkcmFnUmVmcztcbiAgICB9XG5cbiAgICBwcml2YXRlIG9wZW5EcmFnQmFja2Ryb3AoZHJhZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBzdGFydDogR2FudHREYXRlLCBlbmQ6IEdhbnR0RGF0ZSkge1xuICAgICAgICBjb25zdCBkcmFnQmFja2Ryb3BFbGVtZW50ID0gdGhpcy5kb20ucm9vdC5xdWVyeVNlbGVjdG9yKCcuZ2FudHQtZHJhZy1iYWNrZHJvcCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBkcmFnTWFza0VsZW1lbnQgPSB0aGlzLmRvbS5yb290LnF1ZXJ5U2VsZWN0b3IoJy5nYW50dC1kcmFnLW1hc2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3Qgcm9vdFJlY3QgPSB0aGlzLmRvbS5yb290LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBkcmFnUmVjdCA9IGRyYWdFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgbGVmdCA9IGRyYWdSZWN0LmxlZnQgLSByb290UmVjdC5sZWZ0IC0gKHRoaXMuZG9tLnNpZGUuY2xpZW50V2lkdGggKyAxKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ1Njcm9sbGluZykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPT09IEF1dG9TY3JvbGxIb3Jpem9udGFsRGlyZWN0aW9uLkxFRlQpIHtcbiAgICAgICAgICAgICAgICBsZWZ0ICs9IHRoaXMuYXV0b1Njcm9sbFN0ZXA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPT09IEF1dG9TY3JvbGxIb3Jpem9udGFsRGlyZWN0aW9uLlJJR0hUKSB7XG4gICAgICAgICAgICAgICAgbGVmdCAtPSB0aGlzLmF1dG9TY3JvbGxTdGVwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZHJhZ1JlY3QucmlnaHQgLSBkcmFnUmVjdC5sZWZ0O1xuXG4gICAgICAgIC8vIE5vdGU6IHVwZGF0aW5nIHN0eWxlcyB3aWxsIGNhdXNlIHJlLWxheW91dCBzbyB3ZSBoYXZlIHRvIHBsYWNlIHRoZW0gY29uc2lzdGVudGx5IG9uZSBieSBvbmUuXG4gICAgICAgIGRyYWdNYXNrRWxlbWVudC5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7XG4gICAgICAgIGRyYWdNYXNrRWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgZHJhZ01hc2tFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkcmFnQmFja2Ryb3BFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAvLyBUaGlzIHdpbGwgaW52YWxpZGF0ZSB0aGUgbGF5b3V0LCBidXQgd2Ugd29uJ3QgbmVlZCByZS1sYXlvdXQsIGJlY2F1c2Ugd2Ugc2V0IHN0eWxlcyBwcmV2aW91c2x5LlxuICAgICAgICBkcmFnTWFza0VsZW1lbnQucXVlcnlTZWxlY3RvcignLnN0YXJ0JykuaW5uZXJIVE1MID0gc3RhcnQuZm9ybWF0KHRoaXMuZ2FudHRVcHBlci52aWV3Lm9wdGlvbnMuZHJhZ1ByZXZpZXdEYXRlRm9ybWF0KTtcbiAgICAgICAgZHJhZ01hc2tFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lbmQnKS5pbm5lckhUTUwgPSBlbmQuZm9ybWF0KHRoaXMuZ2FudHRVcHBlci52aWV3Lm9wdGlvbnMuZHJhZ1ByZXZpZXdEYXRlRm9ybWF0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsb3NlRHJhZ0JhY2tkcm9wKCkge1xuICAgICAgICBjb25zdCBkcmFnQmFja2Ryb3BFbGVtZW50ID0gdGhpcy5kb20ucm9vdC5xdWVyeVNlbGVjdG9yKCcuZ2FudHQtZHJhZy1iYWNrZHJvcCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBkcmFnTWFza0VsZW1lbnQgPSB0aGlzLmRvbS5yb290LnF1ZXJ5U2VsZWN0b3IoJy5nYW50dC1kcmFnLW1hc2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgZHJhZ01hc2tFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRyYWdCYWNrZHJvcEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldERyYWdnaW5nU3R5bGVzKCkge1xuICAgICAgICB0aGlzLmJhckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZ2FudHQtYmFyLWRyYWdnYWJsZS1kcmFnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhckRyYWdnaW5nU3R5bGVzKCkge1xuICAgICAgICB0aGlzLmJhckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZ2FudHQtYmFyLWRyYWdnYWJsZS1kcmFnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiYXJEcmFnTW92ZSgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFggPSB0aGlzLml0ZW0ucmVmcy54ICsgdGhpcy5iYXJEcmFnTW92ZURpc3RhbmNlICsgdGhpcy5kcmFnU2Nyb2xsRGlzdGFuY2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0RGF0ZUJ5WFBvaW50KGN1cnJlbnRYKTtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXJ0WCA9IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldFhQb2ludEJ5RGF0ZShjdXJyZW50RGF0ZSk7XG5cbiAgICAgICAgY29uc3QgZGlmZnMgPSB0aGlzLmdhbnR0VXBwZXIudmlldy5kaWZmZXJlbmNlQnlQcmVjaXNpb25Vbml0KHRoaXMuaXRlbS5lbmQsIHRoaXMuaXRlbS5zdGFydCk7XG5cbiAgICAgICAgbGV0IHN0YXJ0ID0gY3VycmVudERhdGU7XG4gICAgICAgIGxldCBlbmQgPSBjdXJyZW50RGF0ZS5hZGQoZGlmZnMsIHRoaXMuZ2FudHRVcHBlci52aWV3Py5vcHRpb25zPy5kYXRlUHJlY2lzaW9uVW5pdCk7XG5cbiAgICAgICAgLy8g5pel6KeG5Zu+54m55q6K6YC76L6R5aSE55CGXG4gICAgICAgIGlmICh0aGlzLmdhbnR0VXBwZXIudmlldy52aWV3VHlwZSA9PT0gR2FudHRWaWV3VHlwZS5kYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRheVdpZHRoID0gdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0RGF5T2NjdXBhbmN5V2lkdGgoY3VycmVudERhdGUpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRYID4gY3VycmVudFN0YXJ0WCArIGRheVdpZHRoIC8gMikge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQuYWRkRGF5cygxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBlbmQuYWRkRGF5cygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRyYWdTY3JvbGxpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBjdXJyZW50WCAtIHRoaXMuYmFyRHJhZ01vdmVEaXN0YW5jZTtcbiAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wZW5EcmFnQmFja2Ryb3AoXG4gICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXREYXRlQnlYUG9pbnQoY3VycmVudFgpLFxuICAgICAgICAgICAgdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0RGF0ZUJ5WFBvaW50KGN1cnJlbnRYICsgdGhpcy5pdGVtLnJlZnMud2lkdGgpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzU3RhcnRPckVuZEluc2lkZVZpZXcoc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1EYXRlKHN0YXJ0LCBlbmQpO1xuICAgICAgICB0aGlzLmRyYWdDb250YWluZXIuZHJhZ01vdmVkLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW0ub3JpZ2luIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmFyQmVmb3JlSGFuZGxlRHJhZ01vdmUoKSB7XG4gICAgICAgIGNvbnN0IHsgeCwgc3RhcnQsIG1pblJhbmdlV2lkdGhXaWR0aCB9ID0gdGhpcy5zdGFydE9mQmFySGFuZGxlKCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5pdGVtLnJlZnMud2lkdGggKyB0aGlzLmJhckhhbmRsZURyYWdNb3ZlQW5kU2Nyb2xsRGlzdGFuY2UgKiAtMTtcbiAgICAgICAgY29uc3QgZGlmZnMgPSB0aGlzLmdhbnR0VXBwZXIudmlldy5kaWZmZXJlbmNlQnlQcmVjaXNpb25Vbml0KHRoaXMuaXRlbS5lbmQsIHN0YXJ0KTtcblxuICAgICAgICBpZiAod2lkdGggPiBkcmFnTWluV2lkdGggJiYgZGlmZnMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQuc3R5bGUubGVmdCA9IHggKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5vcGVuRHJhZ0JhY2tkcm9wKHRoaXMuYmFyRWxlbWVudCwgc3RhcnQsIHRoaXMuaXRlbS5lbmQpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTdGFydE9yRW5kSW5zaWRlVmlldyhzdGFydCwgdGhpcy5pdGVtLmVuZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbURhdGUoc3RhcnQsIHRoaXMuaXRlbS5lbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFySGFuZGxlRHJhZ01vdmVSZWNvcmREaWZmcyA+IDAgJiYgZGlmZnMgPD0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5zdHlsZS53aWR0aCA9IG1pblJhbmdlV2lkdGhXaWR0aCArICdweCc7XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldFhQb2ludEJ5RGF0ZSh0aGlzLml0ZW0uZW5kKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQuc3R5bGUubGVmdCA9IHggKyAncHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcGVuRHJhZ0JhY2tkcm9wKHRoaXMuYmFyRWxlbWVudCwgdGhpcy5pdGVtLmVuZCwgdGhpcy5pdGVtLmVuZCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1EYXRlKHRoaXMuaXRlbS5lbmQsIHRoaXMuaXRlbS5lbmQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFySGFuZGxlRHJhZ01vdmVSZWNvcmREaWZmcyA9IGRpZmZzO1xuXG4gICAgICAgIHRoaXMuZHJhZ0NvbnRhaW5lci5kcmFnTW92ZWQuZW1pdCh7IGl0ZW06IHRoaXMuaXRlbS5vcmlnaW4gfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiYXJBZnRlckhhbmRsZURyYWdNb3ZlKCkge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBlbmQgfSA9IHRoaXMuZW5kT2ZCYXJIYW5kbGUoKTtcbiAgICAgICAgY29uc3QgZGlmZnMgPSB0aGlzLmdhbnR0VXBwZXIudmlldy5kaWZmZXJlbmNlQnlQcmVjaXNpb25Vbml0KGVuZCwgdGhpcy5pdGVtLnN0YXJ0KTtcblxuICAgICAgICBpZiAod2lkdGggPiBkcmFnTWluV2lkdGggJiYgZGlmZnMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgICAgICAgICB0aGlzLm9wZW5EcmFnQmFja2Ryb3AodGhpcy5iYXJFbGVtZW50LCB0aGlzLml0ZW0uc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTdGFydE9yRW5kSW5zaWRlVmlldyh0aGlzLml0ZW0uc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1EYXRlKHRoaXMuaXRlbS5zdGFydCwgZW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhckhhbmRsZURyYWdNb3ZlUmVjb3JkRGlmZnMgPiAwICYmIGRpZmZzIDw9IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW5SYW5nZVdpZHRoID0gdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0TWluUmFuZ2VXaWR0aEJ5UHJlY2lzaW9uVW5pdCh0aGlzLml0ZW0uc3RhcnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5zdHlsZS53aWR0aCA9IG1pblJhbmdlV2lkdGggKyAncHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcGVuRHJhZ0JhY2tkcm9wKHRoaXMuYmFyRWxlbWVudCwgdGhpcy5pdGVtLnN0YXJ0LCB0aGlzLml0ZW0uc3RhcnQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtRGF0ZSh0aGlzLml0ZW0uc3RhcnQsIHRoaXMuaXRlbS5zdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXJIYW5kbGVEcmFnTW92ZVJlY29yZERpZmZzID0gZGlmZnM7XG4gICAgICAgIHRoaXMuZHJhZ0NvbnRhaW5lci5kcmFnTW92ZWQuZW1pdCh7IGl0ZW06IHRoaXMuaXRlbS5vcmlnaW4gfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjTGlua0xpbmVQb3NpdGlvbnModGFyZ2V0OiBIVE1MRWxlbWVudCwgaXNCZWZvcmU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgcm9vdFJlY3QgPSB0aGlzLmRvbS5yb290LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB0YXJnZXRSZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBsYXllclJlY3QgPSB0YXJnZXQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDE6IGxheWVyUmVjdC5sZWZ0ICsgKGlzQmVmb3JlID8gMCA6IGxheWVyUmVjdC53aWR0aCkgLSByb290UmVjdC5sZWZ0LFxuICAgICAgICAgICAgeTE6IGxheWVyUmVjdC50b3AgKyBsYXllclJlY3QuaGVpZ2h0IC8gMiAtIHJvb3RSZWN0LnRvcCxcbiAgICAgICAgICAgIHgyOiB0YXJnZXRSZWN0LmxlZnQgLSByb290UmVjdC5sZWZ0ICsgdGFyZ2V0UmVjdC53aWR0aCAvIDIsXG4gICAgICAgICAgICB5MjogdGFyZ2V0UmVjdC50b3AgLSByb290UmVjdC50b3AgKyB0YXJnZXRSZWN0LmhlaWdodCAvIDJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUxpbmtEcmFnZ2luZ0xpbmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5saW5rRHJhZ2dpbmdMaW5lKSB7XG4gICAgICAgICAgICBjb25zdCBzdmdFbGVtZW50ID0gY3JlYXRlU3ZnRWxlbWVudCgnc3ZnJywgJ2dhbnR0LWxpbmstZHJhZy1jb250YWluZXInKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbkVsZW1lbnQgPSBjcmVhdGVTdmdFbGVtZW50KCdsaW5lJywgJ2xpbmstZHJhZ2dpbmctbGluZScpO1xuICAgICAgICAgICAgbGluRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgc3ZnRWxlbWVudC5hcHBlbmRDaGlsZChsaW5FbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnJvb3QuYXBwZW5kQ2hpbGQoc3ZnRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmxpbmtEcmFnZ2luZ0xpbmUgPSBsaW5FbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95TGlua0RyYWdnaW5nTGluZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGlua0RyYWdnaW5nTGluZSkge1xuICAgICAgICAgICAgdGhpcy5saW5rRHJhZ2dpbmdMaW5lLnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLmxpbmtEcmFnZ2luZ0xpbmUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFNjcm9sbEludGVydmFsID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcbiAgICAgICAgaW50ZXJ2YWwoMCwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5zdG9wU2Nyb2xsVGltZXJzJCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5kb20ubWFpbkNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxTdGVwID0gdGhpcy5hdXRvU2Nyb2xsU3RlcDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbiA9PT0gQXV0b1Njcm9sbEhvcml6b250YWxEaXJlY3Rpb24uTEVGVCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnNjcm9sbEJ5KC1zY3JvbGxTdGVwLCAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPT09IEF1dG9TY3JvbGxIb3Jpem9udGFsRGlyZWN0aW9uLlJJR0hUKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2Nyb2xsQnkoc2Nyb2xsU3RlcCwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhcnRTY3JvbGxpbmdJZk5lY2Vzc2FyeShwb2ludGVyWDogbnVtYmVyLCBwb2ludGVyWTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSB0aGlzLmRvbS5tYWluQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gdGhpcy5kb20ubWFpbkNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuICAgICAgICBpZiAoaXNQb2ludGVyTmVhckNsaWVudFJlY3QoY2xpZW50UmVjdCwgRFJPUF9QUk9YSU1JVFlfVEhSRVNIT0xELCBwb2ludGVyWCwgcG9pbnRlclkpKSB7XG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uID0gZ2V0SG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbihjbGllbnRSZWN0LCBwb2ludGVyWCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbiA9PT0gQXV0b1Njcm9sbEhvcml6b250YWxEaXJlY3Rpb24uTEVGVCAmJiBzY3JvbGxMZWZ0ID4gMCkgfHxcbiAgICAgICAgICAgICAgICAoaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbiA9PT0gQXV0b1Njcm9sbEhvcml6b250YWxEaXJlY3Rpb24uUklHSFQgJiZcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdCA8IHRoaXMuZ2FudHRVcHBlci52aWV3LndpZHRoIC0gY2xpZW50UmVjdC53aWR0aClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPSBob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b1Njcm9sbFNwZWVkUmF0ZXMgPSBnZXRBdXRvU2Nyb2xsU3BlZWRSYXRlcyhjbGllbnRSZWN0LCBwb2ludGVyWCwgaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIodGhpcy5zdGFydFNjcm9sbEludGVydmFsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb25kaXRpb25zIHRvIHN0b3AgYXV0by1zY3JvbGw6IHdoZW4gdGhlIHN0YXJ0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgZW5kIGFuZCB0aGUgYmFyIGFwcGVhcnMgaW4gdGhlIHZpZXdcbiAgICBwcml2YXRlIGlzU3RhcnRHcmVhdGVyVGhhbkVuZFdoZW5CYXJIYW5kbGVEcmFnTW92ZShpc0JlZm9yZTogYm9vbGVhbikge1xuICAgICAgICBsZXQgaXNTdGFydEdyZWF0ZXJUaGFuRW5kOiBib29sZWFuO1xuICAgICAgICBsZXQgaXNCYXJBcHBlYXJzSW5WaWV3OiBib29sZWFuO1xuXG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSB0aGlzLmRvbS5tYWluQ29udGFpbmVyLnNjcm9sbExlZnQ7XG4gICAgICAgIGNvbnN0IGNsaWVudFdpZHRoID0gdGhpcy5kb20ubWFpbkNvbnRhaW5lci5jbGllbnRXaWR0aDtcbiAgICAgICAgY29uc3QgeFRocmVzaG9sZCA9IGNsaWVudFdpZHRoICogRFJPUF9QUk9YSU1JVFlfVEhSRVNIT0xEO1xuXG4gICAgICAgIGlmIChpc0JlZm9yZSkge1xuICAgICAgICAgICAgY29uc3QgeyBzdGFydCwgbWluUmFuZ2VXaWR0aFdpZHRoIH0gPSB0aGlzLnN0YXJ0T2ZCYXJIYW5kbGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHhQb2ludGVyQnlFbmREYXRlID0gdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0WFBvaW50QnlEYXRlKHRoaXMuaXRlbS5lbmQpO1xuXG4gICAgICAgICAgICBpc1N0YXJ0R3JlYXRlclRoYW5FbmQgPSBzdGFydC52YWx1ZSA+IHRoaXMuaXRlbS5lbmQudmFsdWU7XG4gICAgICAgICAgICBpc0JhckFwcGVhcnNJblZpZXcgPSB4UG9pbnRlckJ5RW5kRGF0ZSArIG1pblJhbmdlV2lkdGhXaWR0aCArIHhUaHJlc2hvbGQgPD0gc2Nyb2xsTGVmdCArIGNsaWVudFdpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBlbmQgfSA9IHRoaXMuZW5kT2ZCYXJIYW5kbGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHhQb2ludGVyQnlTdGFydERhdGUgPSB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXRYUG9pbnRCeURhdGUodGhpcy5pdGVtLnN0YXJ0KTtcblxuICAgICAgICAgICAgaXNTdGFydEdyZWF0ZXJUaGFuRW5kID0gZW5kLnZhbHVlIDwgdGhpcy5pdGVtLnN0YXJ0LnZhbHVlO1xuICAgICAgICAgICAgaXNCYXJBcHBlYXJzSW5WaWV3ID0gc2Nyb2xsTGVmdCArIHhUaHJlc2hvbGQgPD0geFBvaW50ZXJCeVN0YXJ0RGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc1N0YXJ0R3JlYXRlclRoYW5FbmQgJiYgaXNCYXJBcHBlYXJzSW5WaWV3ID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNvbWUgZGF0YSBpbmZvcm1hdGlvbiBhYm91dCBkcmFnZ2luZyBzdGFydCB1bnRpbCBpdCBpcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gZW5kXG4gICAgcHJpdmF0ZSBzdGFydE9mQmFySGFuZGxlKCkge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy5pdGVtLnJlZnMueCArIHRoaXMuYmFySGFuZGxlRHJhZ01vdmVBbmRTY3JvbGxEaXN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICBzdGFydDogdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0RGF0ZUJ5WFBvaW50KHgpLFxuICAgICAgICAgICAgbWluUmFuZ2VXaWR0aFdpZHRoOiB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXRNaW5SYW5nZVdpZHRoQnlQcmVjaXNpb25Vbml0KHRoaXMuaXRlbS5lbmQpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gU29tZSBkYXRhIGluZm9ybWF0aW9uIGFib3V0IGRyYWdnaW5nIGVuZCBvZiBiYXIgaGFuZGxlXG4gICAgcHJpdmF0ZSBlbmRPZkJhckhhbmRsZSgpIHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLml0ZW0ucmVmcy53aWR0aCArIHRoaXMuYmFySGFuZGxlRHJhZ01vdmVBbmRTY3JvbGxEaXN0YW5jZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBlbmQ6IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldERhdGVCeVhQb2ludCh0aGlzLml0ZW0ucmVmcy54ICsgd2lkdGgpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdG9wU2Nyb2xsaW5nKCkge1xuICAgICAgICB0aGlzLnN0b3BTY3JvbGxUaW1lcnMkLm5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU3RhcnRPckVuZEluc2lkZVZpZXcoc3RhcnQ6IEdhbnR0RGF0ZSwgZW5kOiBHYW50dERhdGUpIHtcbiAgICAgICAgY29uc3QgaXRlbVN0YXJ0ID0gc3RhcnQuZ2V0VW5peFRpbWUoKTtcbiAgICAgICAgY29uc3QgaXRlbUVuZCA9IGVuZC5nZXRVbml4VGltZSgpO1xuICAgICAgICBjb25zdCB2aWV3U3RhcnQgPSB0aGlzLmdhbnR0VXBwZXIudmlldy5zdGFydC5nZXRVbml4VGltZSgpO1xuICAgICAgICBjb25zdCB2aWV3RW5kID0gdGhpcy5nYW50dFVwcGVyLnZpZXcuZW5kLmdldFVuaXhUaW1lKCk7XG4gICAgICAgIGlmIChpdGVtU3RhcnQgPCB2aWV3U3RhcnQgfHwgaXRlbUVuZCA+IHZpZXdFbmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVJdGVtRGF0ZShzdGFydDogR2FudHREYXRlLCBlbmQ6IEdhbnR0RGF0ZSkge1xuICAgICAgICB0aGlzLml0ZW0udXBkYXRlRGF0ZSh0aGlzLmdhbnR0VXBwZXIudmlldy5zdGFydE9mUHJlY2lzaW9uKHN0YXJ0KSwgdGhpcy5nYW50dFVwcGVyLnZpZXcuZW5kT2ZQcmVjaXNpb24oZW5kKSk7XG4gICAgfVxuXG4gICAgY3JlYXRlRHJhZ3MoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgaXRlbTogR2FudHRJdGVtSW50ZXJuYWwsIGdhbnR0VXBwZXI6IEdhbnR0VXBwZXIpIHtcbiAgICAgICAgdGhpcy5pdGVtID0gaXRlbTtcbiAgICAgICAgdGhpcy5iYXJFbGVtZW50ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgIHRoaXMuZ2FudHRVcHBlciA9IGdhbnR0VXBwZXI7XG4gICAgICAgIGlmICh0aGlzLmRyYWdEaXNhYmxlZCAmJiB0aGlzLmxpbmtEcmFnRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTW91c2VFdmVudHMoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5kcmFnRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcmFnUmVmID0gdGhpcy5jcmVhdGVCYXJEcmFnKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ0hhbmRsZXNSZWZzID0gdGhpcy5jcmVhdGVCYXJIYW5kbGVEcmFncygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1JlZnMucHVzaChkcmFnUmVmLCAuLi5kcmFnSGFuZGxlc1JlZnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmxpbmtEcmFnRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRHJhZ1JlZnMgPSB0aGlzLmNyZWF0ZUxpbmtIYW5kbGVEcmFncygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1JlZnMucHVzaCguLi5saW5rRHJhZ1JlZnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlSXRlbShpdGVtOiBHYW50dEl0ZW1JbnRlcm5hbCkge1xuICAgICAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsb3NlRHJhZ0JhY2tkcm9wKCk7XG4gICAgICAgIHRoaXMuZHJhZ1JlZnMuZm9yRWFjaCgoZHJhZ1JlZikgPT4gZHJhZ1JlZi5kaXNwb3NlKCkpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcbiAgICAgICAgdGhpcy5zdG9wU2Nyb2xsVGltZXJzJC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiJdfQ==
560
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWRyYWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nYW50dC9zcmMvY29tcG9uZW50cy9iYXIvYmFyLWRyYWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBYyxVQUFVLEVBQXFCLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxPQUFPLEVBQXNCLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRy9FLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsNEJBQTRCLEVBQzVCLHVCQUF1QixFQUMxQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7OztBQUV2RTs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUV0QyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDN0IsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUM7QUFDdkMsTUFBTSxlQUFlLEdBQUcsdUJBQXVCLENBQUM7QUFDaEQsTUFBTSxxQkFBcUIsR0FBRyw4QkFBOEIsQ0FBQztBQUU3RCxTQUFTLGdCQUFnQixDQUFDLGFBQXFCLEVBQUUsU0FBaUI7SUFDOUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN0RixP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ckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7OEdBdG1CUSxZQUFZO2tIQUFaLFlBQVk7OzJGQUFaLFlBQVk7a0JBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEcmFnRHJvcCwgRHJhZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgZWZmZWN0LCBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBOZ1pvbmUsIE9uRGVzdHJveSwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsIGZyb21FdmVudCwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEdhbnR0Vmlld1R5cGUgfSBmcm9tICcuLi8uLi9jbGFzcyc7XG5pbXBvcnQgeyBHYW50dEl0ZW1JbnRlcm5hbCB9IGZyb20gJy4uLy4uL2NsYXNzL2l0ZW0nO1xuaW1wb3J0IHsgR2FudHRMaW5rVHlwZSB9IGZyb20gJy4uLy4uL2NsYXNzL2xpbmsnO1xuaW1wb3J0IHsgR2FudHREb21TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ2FudHQtZG9tLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2FudHREcmFnQ29udGFpbmVyLCBJbkJhclBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vZ2FudHQtZHJhZy1jb250YWluZXInO1xuaW1wb3J0IHsgR2FudHRVcHBlciB9IGZyb20gJy4uLy4uL2dhbnR0LXVwcGVyJztcbmltcG9ydCB7IEdhbnR0RGF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGUnO1xuaW1wb3J0IHtcbiAgICBBdXRvU2Nyb2xsSG9yaXpvbnRhbERpcmVjdGlvbixcbiAgICBnZXRBdXRvU2Nyb2xsU3BlZWRSYXRlcyxcbiAgICBnZXRIb3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uLFxuICAgIGlzUG9pbnRlck5lYXJDbGllbnRSZWN0XG59IGZyb20gJy4uLy4uL3V0aWxzL2RyYWctc2Nyb2xsJztcbmltcG9ydCB7IHBhc3NpdmVMaXN0ZW5lck9wdGlvbnMgfSBmcm9tICcuLi8uLi91dGlscy9wYXNzaXZlLWxpc3RlbmVycyc7XG5cbi8qKlxuICogUHJveGltaXR5LCBhcyBhIHJhdGlvIHRvIHdpZHRoL2hlaWdodCwgYXQgd2hpY2ggYVxuICogZHJhZ2dlZCBpdGVtIHdpbGwgYWZmZWN0IHRoZSBkcm9wIGNvbnRhaW5lci5cbiAqL1xuY29uc3QgRFJPUF9QUk9YSU1JVFlfVEhSRVNIT0xEID0gMC4wNTtcblxuY29uc3QgZHJhZ01pbldpZHRoID0gMTA7XG5jb25zdCBhdXRvU2Nyb2xsQmFzZVN0ZXAgPSAyO1xuY29uc3QgYWN0aXZlQ2xhc3MgPSAnZ2FudHQtYmFyLWFjdGl2ZSc7XG5jb25zdCBkcm9wQWN0aXZlQ2xhc3MgPSAnZ2FudHQtYmFyLWRyb3AtYWN0aXZlJztcbmNvbnN0IHNpbmdsZURyb3BBY3RpdmVDbGFzcyA9ICdnYW50dC1iYXItc2luZ2xlLWRyb3AtYWN0aXZlJztcblxuZnVuY3Rpb24gY3JlYXRlU3ZnRWxlbWVudChxdWFsaWZpZWROYW1lOiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCBxdWFsaWZpZWROYW1lKTtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdhbnR0QmFyRHJhZyBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSBnYW50dFVwcGVyOiBHYW50dFVwcGVyO1xuXG4gICAgcHJpdmF0ZSBiYXJFbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIHByaXZhdGUgaXRlbTogV3JpdGFibGVTaWduYWw8R2FudHRJdGVtSW50ZXJuYWw+ID0gc2lnbmFsKG51bGwpO1xuXG4gICAgcHJpdmF0ZSBoYXNNb25pdG9yTW91c2VFdmVudDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgZ2V0IGRyYWdEaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLml0ZW0oKS5kcmFnZ2FibGUgfHwgIXRoaXMuZ2FudHRVcHBlci5kcmFnZ2FibGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbGlua0RyYWdEaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLml0ZW0oKS5saW5rYWJsZSB8fCAhdGhpcy5nYW50dFVwcGVyLmxpbmthYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGJhckhhbmRsZURyYWdNb3ZlQW5kU2Nyb2xsRGlzdGFuY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhckhhbmRsZURyYWdNb3ZlRGlzdGFuY2UgKyB0aGlzLmRyYWdTY3JvbGxEaXN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBhdXRvU2Nyb2xsU3RlcCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KGF1dG9TY3JvbGxCYXNlU3RlcCwgdGhpcy5hdXRvU2Nyb2xsU3BlZWRSYXRlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsaW5rRHJhZ2dpbmdMaW5lOiBTVkdFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBiYXJEcmFnUmVmOiBEcmFnUmVmO1xuXG4gICAgcHJpdmF0ZSBsaW5rRHJhZ1JlZnM6IERyYWdSZWZbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBiYXJIYW5kbGVEcmFnUmVmczogRHJhZ1JlZltdID0gW107XG5cbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBVc2VkIHRvIHNpZ25hbCB0byB0aGUgY3VycmVudCBhdXRvLXNjcm9sbCBzZXF1ZW5jZSB3aGVuIHRvIHN0b3AuICovXG4gICAgcHJpdmF0ZSBzdG9wU2Nyb2xsVGltZXJzJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogY29udGFpbmVyIGVsZW1lbnQgc2Nyb2xsTGVmdCAqL1xuICAgIHByaXZhdGUgY29udGFpbmVyU2Nyb2xsTGVmdDogbnVtYmVyO1xuXG4gICAgLyoqIG1vdmUgZGlzdGFuY2Ugd2hlbiBkcmFnIGJhciAqL1xuICAgIHByaXZhdGUgYmFyRHJhZ01vdmVEaXN0YW5jZSA9IDA7XG5cbiAgICAvKiogbW92ZSBkaXN0YW5jZSB3aGVuIGRyYWcgYmFyIGhhbmRsZSAqL1xuICAgIHByaXZhdGUgYmFySGFuZGxlRHJhZ01vdmVEaXN0YW5jZSA9IDA7XG5cbiAgICAvKiogc2Nyb2xsaW5nIHN0YXRlIHdoZW4gZHJhZyAqL1xuICAgIHByaXZhdGUgZHJhZ1Njcm9sbGluZyA9IGZhbHNlO1xuXG4gICAgLyoqIGRyYWdTY3JvbGxEaXN0YW5jZSAqL1xuICAgIHByaXZhdGUgZHJhZ1Njcm9sbERpc3RhbmNlID0gMDtcblxuICAgIC8qKiBIb3Jpem9udGFsIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgbGlzdCBpcyBjdXJyZW50bHkgc2Nyb2xsaW5nLiAqL1xuICAgIHByaXZhdGUgX2hvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPSBBdXRvU2Nyb2xsSG9yaXpvbnRhbERpcmVjdGlvbi5OT05FO1xuXG4gICAgLyoqIFJlY29yZCBiYXIgZGF5cyB3aGVuIGJhciBoYW5kbGUgZHJhZyBtb3ZlLiAqL1xuICAgIHByaXZhdGUgYmFySGFuZGxlRHJhZ01vdmVSZWNvcmREaWZmczogbnVtYmVyO1xuXG4gICAgLyoqIFNwZWVkIHJhdGlvIGZvciBhdXRvIHNjcm9sbCAqL1xuICAgIHByaXZhdGUgYXV0b1Njcm9sbFNwZWVkUmF0ZXMgPSAxO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZHJhZ0Ryb3A6IERyYWdEcm9wLFxuICAgICAgICBwcml2YXRlIGRvbTogR2FudHREb21TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGRyYWdDb250YWluZXI6IEdhbnR0RHJhZ0NvbnRhaW5lcixcbiAgICAgICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmVcbiAgICApIHtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW06IEdhbnR0SXRlbUludGVybmFsID0gdGhpcy5pdGVtKCk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRHJhZ3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVEcmFnUmVmPFQgPSBhbnk+KGVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgSFRNTEVsZW1lbnQpOiBEcmFnUmVmPFQ+IHtcbiAgICAgICAgY29uc3QgZHJhZ1JlZiA9IHRoaXMuZHJhZ0Ryb3AuY3JlYXRlRHJhZyhlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIGRyYWdSZWY7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVEcmFnU2Nyb2xsRXZlbnQoZHJhZ1JlZjogRHJhZ1JlZikge1xuICAgICAgICByZXR1cm4gZnJvbUV2ZW50KHRoaXMuZG9tLm1haW5Db250YWluZXIsICdzY3JvbGwnLCBwYXNzaXZlTGlzdGVuZXJPcHRpb25zKS5waXBlKHRha2VVbnRpbChkcmFnUmVmLmVuZGVkKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVNb3VzZUV2ZW50cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc01vbml0b3JNb3VzZUV2ZW50ICYmICghdGhpcy5kcmFnRGlzYWJsZWQgfHwgIXRoaXMubGlua0RyYWdEaXNhYmxlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzTW9uaXRvck1vdXNlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgZHJvcENsYXNzID1cbiAgICAgICAgICAgICAgICB0aGlzLmdhbnR0VXBwZXIuY29uZmlnLmxpbmtPcHRpb25zPy5kZXBlbmRlbmN5VHlwZXM/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZ2FudHRVcHBlci5jb25maWcubGlua09wdGlvbnM/LmRlcGVuZGVuY3lUeXBlc1swXSA9PT0gR2FudHRMaW5rVHlwZS5mc1xuICAgICAgICAgICAgICAgICAgICA/IHNpbmdsZURyb3BBY3RpdmVDbGFzc1xuICAgICAgICAgICAgICAgICAgICA6IGRyb3BBY3RpdmVDbGFzcztcblxuICAgICAgICAgICAgZnJvbUV2ZW50KHRoaXMuYmFyRWxlbWVudCwgJ21vdXNlZW50ZXInLCBwYXNzaXZlTGlzdGVuZXJPcHRpb25zKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ0NvbnRhaW5lci5saW5rRHJhZ2dpbmdJZCAmJiB0aGlzLmRyYWdDb250YWluZXIubGlua0RyYWdnaW5nSWQgIT09IHRoaXMuaXRlbSgpLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubGlua0RyYWdEaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5jbGFzc0xpc3QuYWRkKGRyb3BDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmVtaXRMaW5rRHJhZ0VudGVyZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5iYXJFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZHJhZ0Rpc2FibGVkIHx8ICF0aGlzLmxpbmtEcmFnRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZnJvbUV2ZW50KHRoaXMuYmFyRWxlbWVudCwgJ21vdXNlbGVhdmUnLCBwYXNzaXZlTGlzdGVuZXJPcHRpb25zKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRyYWdDb250YWluZXIubGlua0RyYWdnaW5nSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0NvbnRhaW5lci5lbWl0TGlua0RyYWdMZWF2ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShkcm9wQ2xhc3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCYXJEcmFnKCkge1xuICAgICAgICBjb25zdCBkcmFnUmVmID0gdGhpcy5jcmVhdGVEcmFnUmVmKHRoaXMuYmFyRWxlbWVudCk7XG4gICAgICAgIGRyYWdSZWYuZGlzYWJsZWQgPSB0aGlzLmRyYWdEaXNhYmxlZDtcbiAgICAgICAgZHJhZ1JlZi5sb2NrQXhpcyA9ICd4JztcbiAgICAgICAgZHJhZ1JlZi53aXRoQm91bmRhcnlFbGVtZW50KHRoaXMuZG9tLm1haW5JdGVtcyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGRyYWdSZWYuc3RhcnRlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREcmFnZ2luZ1N0eWxlcygpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJTY3JvbGxMZWZ0ID0gdGhpcy5kb20ubWFpbkNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVEcmFnU2Nyb2xsRXZlbnQoZHJhZ1JlZikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZHJhZ1JlZi5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJhZ1Njcm9sbERpc3RhbmNlID0gdGhpcy5kb20ubWFpbkNvbnRhaW5lci5zY3JvbGxMZWZ0IC0gdGhpcy5jb250YWluZXJTY3JvbGxMZWZ0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdTY3JvbGxEaXN0YW5jZSA9IGRyYWdTY3JvbGxEaXN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgZHJhZ1JlZlsnX2JvdW5kYXJ5UmVjdCddID0gdGhpcy5kb20ubWFpbkl0ZW1zLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckRyYWdNb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmRyYWdDb250YWluZXIuZHJhZ1N0YXJ0ZWQuZW1pdCh7IGl0ZW06IHRoaXMuaXRlbSgpLm9yaWdpbiB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZHJhZ1JlZi5tb3ZlZC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2Nyb2xsaW5nSWZOZWNlc3NhcnkoZXZlbnQucG9pbnRlclBvc2l0aW9uLngsIGV2ZW50LnBvaW50ZXJQb3NpdGlvbi55KTtcbiAgICAgICAgICAgIHRoaXMuYmFyRHJhZ01vdmVEaXN0YW5jZSA9IGV2ZW50LmRpc3RhbmNlLng7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZHJhZ1Njcm9sbGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuYmFyRHJhZ01vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZHJhZ1JlZi5lbmRlZC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyRHJhZ2dpbmdTdHlsZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VEcmFnQmFja2Ryb3AoKTtcbiAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7XG4gICAgICAgICAgICB0aGlzLmRyYWdTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1Njcm9sbERpc3RhbmNlID0gMDtcbiAgICAgICAgICAgIHRoaXMuYmFyRHJhZ01vdmVEaXN0YW5jZSA9IDA7XG4gICAgICAgICAgICB0aGlzLml0ZW0oKS51cGRhdGVSZWZzKHtcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0RGF0ZVJhbmdlV2lkdGgodGhpcy5pdGVtKCkuc3RhcnQsIHRoaXMuaXRlbSgpLmVuZCksXG4gICAgICAgICAgICAgICAgeDogdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0WFBvaW50QnlEYXRlKHRoaXMuaXRlbSgpLnN0YXJ0KSxcbiAgICAgICAgICAgICAgICB5OiAodGhpcy5nYW50dFVwcGVyLnN0eWxlcy5saW5lSGVpZ2h0IC0gdGhpcy5nYW50dFVwcGVyLnN0eWxlcy5iYXJIZWlnaHQpIC8gMiAtIDFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmRyYWdFbmRlZC5lbWl0KHsgaXRlbTogdGhpcy5pdGVtKCkub3JpZ2luIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZHJhZ1JlZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUJhckhhbmRsZURyYWdzKCkge1xuICAgICAgICBjb25zdCBkcmFnUmVmcyA9IFtdO1xuICAgICAgICBjb25zdCBoYW5kbGVzID0gdGhpcy5iYXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZHJhZy1oYW5kbGVzIC5oYW5kbGUnKTtcbiAgICAgICAgaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0JlZm9yZSA9IGluZGV4ID09PSAwO1xuICAgICAgICAgICAgY29uc3QgZHJhZ1JlZiA9IHRoaXMuY3JlYXRlRHJhZ1JlZihoYW5kbGUpO1xuICAgICAgICAgICAgZHJhZ1JlZi5kaXNhYmxlZCA9IHRoaXMuZHJhZ0Rpc2FibGVkO1xuICAgICAgICAgICAgZHJhZ1JlZi5sb2NrQXhpcyA9ICd4JztcbiAgICAgICAgICAgIGRyYWdSZWYud2l0aEJvdW5kYXJ5RWxlbWVudCh0aGlzLmRvbS5tYWluSXRlbXMgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgZHJhZ1JlZi5zdGFydGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREcmFnZ2luZ1N0eWxlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyU2Nyb2xsTGVmdCA9IHRoaXMuZG9tLm1haW5Db250YWluZXIuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURyYWdTY3JvbGxFdmVudChkcmFnUmVmKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZHJhZ1JlZi5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdTY3JvbGxEaXN0YW5jZSA9IHRoaXMuZG9tLm1haW5Db250YWluZXIuc2Nyb2xsTGVmdCAtIHRoaXMuY29udGFpbmVyU2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1Njcm9sbERpc3RhbmNlID0gZHJhZ1Njcm9sbERpc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ1JlZlsnX2JvdW5kYXJ5UmVjdCddID0gdGhpcy5kb20ubWFpbkl0ZW1zLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kcmFnU2Nyb2xsaW5nICYmIHRoaXMuaXNTdGFydEdyZWF0ZXJUaGFuRW5kV2hlbkJhckhhbmRsZURyYWdNb3ZlKGlzQmVmb3JlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1Njcm9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckJlZm9yZUhhbmRsZURyYWdNb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyQWZ0ZXJIYW5kbGVEcmFnTW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmRyYWdTdGFydGVkLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW0oKS5vcmlnaW4gfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZHJhZ1JlZi5tb3ZlZC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYmFySGFuZGxlRHJhZ01vdmVSZWNvcmREaWZmcyAmJiB0aGlzLmJhckhhbmRsZURyYWdNb3ZlUmVjb3JkRGlmZnMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTY3JvbGxpbmdJZk5lY2Vzc2FyeShldmVudC5wb2ludGVyUG9zaXRpb24ueCwgZXZlbnQucG9pbnRlclBvc2l0aW9uLnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmJhckhhbmRsZURyYWdNb3ZlRGlzdGFuY2UgPSBldmVudC5kaXN0YW5jZS54O1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kcmFnU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0JlZm9yZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJCZWZvcmVIYW5kbGVEcmFnTW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJBZnRlckhhbmRsZURyYWdNb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZHJhZ1JlZi5lbmRlZC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckRyYWdnaW5nU3R5bGVzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZURyYWdCYWNrZHJvcCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5yZXNldCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1Njcm9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1Njcm9sbERpc3RhbmNlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmJhckhhbmRsZURyYWdNb3ZlRGlzdGFuY2UgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbSgpLnVwZGF0ZVJlZnMoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0RGF0ZVJhbmdlV2lkdGgodGhpcy5pdGVtKCkuc3RhcnQsIHRoaXMuaXRlbSgpLmVuZCksXG4gICAgICAgICAgICAgICAgICAgIHg6IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldFhQb2ludEJ5RGF0ZSh0aGlzLml0ZW0oKS5zdGFydCksXG4gICAgICAgICAgICAgICAgICAgIHk6ICh0aGlzLmdhbnR0VXBwZXIuc3R5bGVzLmxpbmVIZWlnaHQgLSB0aGlzLmdhbnR0VXBwZXIuc3R5bGVzLmJhckhlaWdodCkgLyAyIC0gMVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0NvbnRhaW5lci5kcmFnRW5kZWQuZW1pdCh7IGl0ZW06IHRoaXMuaXRlbSgpLm9yaWdpbiB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZHJhZ1JlZnMucHVzaChkcmFnUmVmKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkcmFnUmVmcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUxpbmtIYW5kbGVEcmFncygpIHtcbiAgICAgICAgY29uc3QgZHJhZ1JlZnMgPSBbXTtcbiAgICAgICAgY29uc3QgaGFuZGxlcyA9IHRoaXMuYmFyRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmxpbmstaGFuZGxlcyAuaGFuZGxlJyk7XG4gICAgICAgIGhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNCZWdpbiA9IGluZGV4ID09PSAwO1xuICAgICAgICAgICAgY29uc3QgZHJhZ1JlZiA9IHRoaXMuZHJhZ0Ryb3AuY3JlYXRlRHJhZyhoYW5kbGUpO1xuICAgICAgICAgICAgZHJhZ1JlZi5kaXNhYmxlZCA9IHRoaXMubGlua0RyYWdEaXNhYmxlZDtcbiAgICAgICAgICAgIGRyYWdSZWYud2l0aEJvdW5kYXJ5RWxlbWVudCh0aGlzLmRvbS5yb290IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgIGRyYWdSZWYuYmVmb3JlU3RhcnRlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJhckRyYWdSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJEcmFnUmVmLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVMaW5rRHJhZ2dpbmdMaW5lKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmVtaXRMaW5rRHJhZ1N0YXJ0ZWQoe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmJhckVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW06IHRoaXMuaXRlbSgpLFxuICAgICAgICAgICAgICAgICAgICBwb3M6IGlzQmVnaW4gPyBJbkJhclBvc2l0aW9uLnN0YXJ0IDogSW5CYXJQb3NpdGlvbi5maW5pc2hcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkcmFnUmVmLm1vdmVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5jYWxjTGlua0xpbmVQb3NpdGlvbnMoaGFuZGxlLCBpc0JlZ2luKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmtEcmFnZ2luZ0xpbmUuc2V0QXR0cmlidXRlKCd4MScsIHBvc2l0aW9ucy54MS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmtEcmFnZ2luZ0xpbmUuc2V0QXR0cmlidXRlKCd5MScsIHBvc2l0aW9ucy55MS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmtEcmFnZ2luZ0xpbmUuc2V0QXR0cmlidXRlKCd4MicsIHBvc2l0aW9ucy54Mi50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmtEcmFnZ2luZ0xpbmUuc2V0QXR0cmlidXRlKCd5MicsIHBvc2l0aW9ucy55Mi50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkcmFnUmVmLmVuZGVkLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJhckRyYWdSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJEcmFnUmVmLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOiuoeeul2xpbmXmi5bliqjnmoTokL3ngrnkvY3kuo7nm67moIdCYXLnmoTlgLzvvIzlpoLmnpzlgLzlpKfkuo5CYXLlrr3luqbnmoTkuIDljYrvvIzor7TmmI7mmK/mi5bliqjliLBCZWdpbuS9jee9ru+8jOWQpuWImeWImeS4uuaLluWKqOWIsEVuZOS9jee9rlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyYWdDb250YWluZXIubGlua0RyYWdQYXRoLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlUG9pbnRYID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5nZXRSb290RWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnggLVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmxpbmtEcmFnUGF0aC50by5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLng7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmVtaXRMaW5rRHJhZ0VuZGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZHJhZ0NvbnRhaW5lci5saW5rRHJhZ1BhdGgudG8sXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VQb2ludFggPCB0aGlzLmRyYWdDb250YWluZXIubGlua0RyYWdQYXRoLnRvLml0ZW0ucmVmcy53aWR0aCAvIDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBJbkJhclBvc2l0aW9uLnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW5CYXJQb3NpdGlvbi5maW5pc2hcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmVtaXRMaW5rRHJhZ0VuZGVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5yZXNldCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lMaW5rRHJhZ2dpbmdMaW5lKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZHJhZ1JlZnMucHVzaChkcmFnUmVmKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkcmFnUmVmcztcbiAgICB9XG5cbiAgICBwcml2YXRlIG9wZW5EcmFnQmFja2Ryb3AoZHJhZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBzdGFydDogR2FudHREYXRlLCBlbmQ6IEdhbnR0RGF0ZSkge1xuICAgICAgICBjb25zdCBkcmFnQmFja2Ryb3BFbGVtZW50ID0gdGhpcy5kb20ucm9vdC5xdWVyeVNlbGVjdG9yKCcuZ2FudHQtZHJhZy1iYWNrZHJvcCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBkcmFnTWFza0VsZW1lbnQgPSB0aGlzLmRvbS5yb290LnF1ZXJ5U2VsZWN0b3IoJy5nYW50dC1kcmFnLW1hc2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3Qgcm9vdFJlY3QgPSB0aGlzLmRvbS5yb290LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBkcmFnUmVjdCA9IGRyYWdFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgbGVmdCA9IGRyYWdSZWN0LmxlZnQgLSByb290UmVjdC5sZWZ0IC0gKHRoaXMuZG9tLnNpZGUuY2xpZW50V2lkdGggKyAxKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ1Njcm9sbGluZykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPT09IEF1dG9TY3JvbGxIb3Jpem9udGFsRGlyZWN0aW9uLkxFRlQpIHtcbiAgICAgICAgICAgICAgICBsZWZ0ICs9IHRoaXMuYXV0b1Njcm9sbFN0ZXA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPT09IEF1dG9TY3JvbGxIb3Jpem9udGFsRGlyZWN0aW9uLlJJR0hUKSB7XG4gICAgICAgICAgICAgICAgbGVmdCAtPSB0aGlzLmF1dG9TY3JvbGxTdGVwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZHJhZ1JlY3QucmlnaHQgLSBkcmFnUmVjdC5sZWZ0O1xuXG4gICAgICAgIC8vIE5vdGU6IHVwZGF0aW5nIHN0eWxlcyB3aWxsIGNhdXNlIHJlLWxheW91dCBzbyB3ZSBoYXZlIHRvIHBsYWNlIHRoZW0gY29uc2lzdGVudGx5IG9uZSBieSBvbmUuXG4gICAgICAgIGRyYWdNYXNrRWxlbWVudC5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7XG4gICAgICAgIGRyYWdNYXNrRWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgZHJhZ01hc2tFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkcmFnQmFja2Ryb3BFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAvLyBUaGlzIHdpbGwgaW52YWxpZGF0ZSB0aGUgbGF5b3V0LCBidXQgd2Ugd29uJ3QgbmVlZCByZS1sYXlvdXQsIGJlY2F1c2Ugd2Ugc2V0IHN0eWxlcyBwcmV2aW91c2x5LlxuICAgICAgICBkcmFnTWFza0VsZW1lbnQucXVlcnlTZWxlY3RvcignLnN0YXJ0JykuaW5uZXJIVE1MID0gc3RhcnQuZm9ybWF0KHRoaXMuZ2FudHRVcHBlci52aWV3Lm9wdGlvbnMuZHJhZ1ByZXZpZXdEYXRlRm9ybWF0KTtcbiAgICAgICAgZHJhZ01hc2tFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lbmQnKS5pbm5lckhUTUwgPSBlbmQuZm9ybWF0KHRoaXMuZ2FudHRVcHBlci52aWV3Lm9wdGlvbnMuZHJhZ1ByZXZpZXdEYXRlRm9ybWF0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsb3NlRHJhZ0JhY2tkcm9wKCkge1xuICAgICAgICBjb25zdCBkcmFnQmFja2Ryb3BFbGVtZW50ID0gdGhpcy5kb20ucm9vdC5xdWVyeVNlbGVjdG9yKCcuZ2FudHQtZHJhZy1iYWNrZHJvcCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBkcmFnTWFza0VsZW1lbnQgPSB0aGlzLmRvbS5yb290LnF1ZXJ5U2VsZWN0b3IoJy5nYW50dC1kcmFnLW1hc2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgZHJhZ01hc2tFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRyYWdCYWNrZHJvcEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldERyYWdnaW5nU3R5bGVzKCkge1xuICAgICAgICB0aGlzLmJhckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZ2FudHQtYmFyLWRyYWdnYWJsZS1kcmFnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhckRyYWdnaW5nU3R5bGVzKCkge1xuICAgICAgICB0aGlzLmJhckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZ2FudHQtYmFyLWRyYWdnYWJsZS1kcmFnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiYXJEcmFnTW92ZSgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFggPSB0aGlzLml0ZW0oKS5yZWZzLnggKyB0aGlzLmJhckRyYWdNb3ZlRGlzdGFuY2UgKyB0aGlzLmRyYWdTY3JvbGxEaXN0YW5jZTtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXREYXRlQnlYUG9pbnQoY3VycmVudFgpO1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhcnRYID0gdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0WFBvaW50QnlEYXRlKGN1cnJlbnREYXRlKTtcblxuICAgICAgICBjb25zdCBkaWZmcyA9IHRoaXMuZ2FudHRVcHBlci52aWV3LmRpZmZlcmVuY2VCeVByZWNpc2lvblVuaXQodGhpcy5pdGVtKCkuZW5kLCB0aGlzLml0ZW0oKS5zdGFydCk7XG5cbiAgICAgICAgbGV0IHN0YXJ0ID0gY3VycmVudERhdGU7XG4gICAgICAgIGxldCBlbmQgPSBjdXJyZW50RGF0ZS5hZGQoZGlmZnMsIHRoaXMuZ2FudHRVcHBlci52aWV3Py5vcHRpb25zPy5kYXRlUHJlY2lzaW9uVW5pdCk7XG5cbiAgICAgICAgLy8g5pel6KeG5Zu+54m55q6K6YC76L6R5aSE55CGXG4gICAgICAgIGlmICh0aGlzLmdhbnR0VXBwZXIudmlldy52aWV3VHlwZSA9PT0gR2FudHRWaWV3VHlwZS5kYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRheVdpZHRoID0gdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0RGF5T2NjdXBhbmN5V2lkdGgoY3VycmVudERhdGUpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRYID4gY3VycmVudFN0YXJ0WCArIGRheVdpZHRoIC8gMikge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQuYWRkRGF5cygxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBlbmQuYWRkRGF5cygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRyYWdTY3JvbGxpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBjdXJyZW50WCAtIHRoaXMuYmFyRHJhZ01vdmVEaXN0YW5jZTtcbiAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wZW5EcmFnQmFja2Ryb3AoXG4gICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXREYXRlQnlYUG9pbnQoY3VycmVudFgpLFxuICAgICAgICAgICAgdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0RGF0ZUJ5WFBvaW50KGN1cnJlbnRYICsgdGhpcy5pdGVtKCkucmVmcy53aWR0aClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNTdGFydE9yRW5kSW5zaWRlVmlldyhzdGFydCwgZW5kKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlSXRlbURhdGUoc3RhcnQsIGVuZCk7XG4gICAgICAgIHRoaXMuZHJhZ0NvbnRhaW5lci5kcmFnTW92ZWQuZW1pdCh7IGl0ZW06IHRoaXMuaXRlbSgpLm9yaWdpbiB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJhckJlZm9yZUhhbmRsZURyYWdNb3ZlKCkge1xuICAgICAgICBjb25zdCB7IHgsIHN0YXJ0LCBtaW5SYW5nZVdpZHRoV2lkdGggfSA9IHRoaXMuc3RhcnRPZkJhckhhbmRsZSgpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuaXRlbSgpLnJlZnMud2lkdGggKyB0aGlzLmJhckhhbmRsZURyYWdNb3ZlQW5kU2Nyb2xsRGlzdGFuY2UgKiAtMTtcbiAgICAgICAgY29uc3QgZGlmZnMgPSB0aGlzLmdhbnR0VXBwZXIudmlldy5kaWZmZXJlbmNlQnlQcmVjaXNpb25Vbml0KHRoaXMuaXRlbSgpLmVuZCwgc3RhcnQpO1xuXG4gICAgICAgIGlmICh3aWR0aCA+IGRyYWdNaW5XaWR0aCAmJiBkaWZmcyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5zdHlsZS5sZWZ0ID0geCArICdweCc7XG4gICAgICAgICAgICB0aGlzLm9wZW5EcmFnQmFja2Ryb3AodGhpcy5iYXJFbGVtZW50LCBzdGFydCwgdGhpcy5pdGVtKCkuZW5kKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3RhcnRPckVuZEluc2lkZVZpZXcoc3RhcnQsIHRoaXMuaXRlbSgpLmVuZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbURhdGUoc3RhcnQsIHRoaXMuaXRlbSgpLmVuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5iYXJIYW5kbGVEcmFnTW92ZVJlY29yZERpZmZzID4gMCAmJiBkaWZmcyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXJFbGVtZW50LnN0eWxlLndpZHRoID0gbWluUmFuZ2VXaWR0aFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0WFBvaW50QnlEYXRlKHRoaXMuaXRlbSgpLmVuZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXJFbGVtZW50LnN0eWxlLmxlZnQgPSB4ICsgJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3BlbkRyYWdCYWNrZHJvcCh0aGlzLmJhckVsZW1lbnQsIHRoaXMuaXRlbSgpLmVuZCwgdGhpcy5pdGVtKCkuZW5kKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbURhdGUodGhpcy5pdGVtKCkuZW5kLCB0aGlzLml0ZW0oKS5lbmQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFySGFuZGxlRHJhZ01vdmVSZWNvcmREaWZmcyA9IGRpZmZzO1xuXG4gICAgICAgIHRoaXMuZHJhZ0NvbnRhaW5lci5kcmFnTW92ZWQuZW1pdCh7IGl0ZW06IHRoaXMuaXRlbSgpLm9yaWdpbiB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJhckFmdGVySGFuZGxlRHJhZ01vdmUoKSB7XG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGVuZCB9ID0gdGhpcy5lbmRPZkJhckhhbmRsZSgpO1xuICAgICAgICBjb25zdCBkaWZmcyA9IHRoaXMuZ2FudHRVcHBlci52aWV3LmRpZmZlcmVuY2VCeVByZWNpc2lvblVuaXQoZW5kLCB0aGlzLml0ZW0oKS5zdGFydCk7XG5cbiAgICAgICAgaWYgKHdpZHRoID4gZHJhZ01pbldpZHRoICYmIGRpZmZzID4gMCkge1xuICAgICAgICAgICAgdGhpcy5iYXJFbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5vcGVuRHJhZ0JhY2tkcm9wKHRoaXMuYmFyRWxlbWVudCwgdGhpcy5pdGVtKCkuc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTdGFydE9yRW5kSW5zaWRlVmlldyh0aGlzLml0ZW0oKS5zdGFydCwgZW5kKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbURhdGUodGhpcy5pdGVtKCkuc3RhcnQsIGVuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5iYXJIYW5kbGVEcmFnTW92ZVJlY29yZERpZmZzID4gMCAmJiBkaWZmcyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWluUmFuZ2VXaWR0aCA9IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldE1pblJhbmdlV2lkdGhCeVByZWNpc2lvblVuaXQodGhpcy5pdGVtKCkuc3RhcnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5zdHlsZS53aWR0aCA9IG1pblJhbmdlV2lkdGggKyAncHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcGVuRHJhZ0JhY2tkcm9wKHRoaXMuYmFyRWxlbWVudCwgdGhpcy5pdGVtKCkuc3RhcnQsIHRoaXMuaXRlbSgpLnN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbURhdGUodGhpcy5pdGVtKCkuc3RhcnQsIHRoaXMuaXRlbSgpLnN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhckhhbmRsZURyYWdNb3ZlUmVjb3JkRGlmZnMgPSBkaWZmcztcbiAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmRyYWdNb3ZlZC5lbWl0KHsgaXRlbTogdGhpcy5pdGVtKCkub3JpZ2luIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY0xpbmtMaW5lUG9zaXRpb25zKHRhcmdldDogSFRNTEVsZW1lbnQsIGlzQmVmb3JlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5kb20ucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgbGF5ZXJSZWN0ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHgxOiBsYXllclJlY3QubGVmdCArIChpc0JlZm9yZSA/IDAgOiBsYXllclJlY3Qud2lkdGgpIC0gcm9vdFJlY3QubGVmdCxcbiAgICAgICAgICAgIHkxOiBsYXllclJlY3QudG9wICsgbGF5ZXJSZWN0LmhlaWdodCAvIDIgLSByb290UmVjdC50b3AsXG4gICAgICAgICAgICB4MjogdGFyZ2V0UmVjdC5sZWZ0IC0gcm9vdFJlY3QubGVmdCArIHRhcmdldFJlY3Qud2lkdGggLyAyLFxuICAgICAgICAgICAgeTI6IHRhcmdldFJlY3QudG9wIC0gcm9vdFJlY3QudG9wICsgdGFyZ2V0UmVjdC5oZWlnaHQgLyAyXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVMaW5rRHJhZ2dpbmdMaW5lKCkge1xuICAgICAgICBpZiAoIXRoaXMubGlua0RyYWdnaW5nTGluZSkge1xuICAgICAgICAgICAgY29uc3Qgc3ZnRWxlbWVudCA9IGNyZWF0ZVN2Z0VsZW1lbnQoJ3N2ZycsICdnYW50dC1saW5rLWRyYWctY29udGFpbmVyJyk7XG4gICAgICAgICAgICBjb25zdCBsaW5FbGVtZW50ID0gY3JlYXRlU3ZnRWxlbWVudCgnbGluZScsICdsaW5rLWRyYWdnaW5nLWxpbmUnKTtcbiAgICAgICAgICAgIGxpbkVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICAgIHN2Z0VsZW1lbnQuYXBwZW5kQ2hpbGQobGluRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHN2Z0VsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5saW5rRHJhZ2dpbmdMaW5lID0gbGluRWxlbWVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveUxpbmtEcmFnZ2luZ0xpbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmtEcmFnZ2luZ0xpbmUpIHtcbiAgICAgICAgICAgIHRoaXMubGlua0RyYWdnaW5nTGluZS5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5saW5rRHJhZ2dpbmdMaW5lID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhcnRTY3JvbGxJbnRlcnZhbCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7XG4gICAgICAgIGludGVydmFsKDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuc3RvcFNjcm9sbFRpbWVycyQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZG9tLm1haW5Db250YWluZXI7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3RlcCA9IHRoaXMuYXV0b1Njcm9sbFN0ZXA7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPT09IEF1dG9TY3JvbGxIb3Jpem9udGFsRGlyZWN0aW9uLkxFRlQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zY3JvbGxCeSgtc2Nyb2xsU3RlcCwgMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9ob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uID09PSBBdXRvU2Nyb2xsSG9yaXpvbnRhbERpcmVjdGlvbi5SSUdIVCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnNjcm9sbEJ5KHNjcm9sbFN0ZXAsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXJ0U2Nyb2xsaW5nSWZOZWNlc3NhcnkocG9pbnRlclg6IG51bWJlciwgcG9pbnRlclk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gdGhpcy5kb20ubWFpbkNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHRoaXMuZG9tLm1haW5Db250YWluZXIuc2Nyb2xsTGVmdDtcbiAgICAgICAgaWYgKGlzUG9pbnRlck5lYXJDbGllbnRSZWN0KGNsaWVudFJlY3QsIERST1BfUFJPWElNSVRZX1RIUkVTSE9MRCwgcG9pbnRlclgsIHBvaW50ZXJZKSkge1xuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbiA9IGdldEhvcml6b250YWxTY3JvbGxEaXJlY3Rpb24oY2xpZW50UmVjdCwgcG9pbnRlclgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGhvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPT09IEF1dG9TY3JvbGxIb3Jpem9udGFsRGlyZWN0aW9uLkxFRlQgJiYgc2Nyb2xsTGVmdCA+IDApIHx8XG4gICAgICAgICAgICAgICAgKGhvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPT09IEF1dG9TY3JvbGxIb3Jpem9udGFsRGlyZWN0aW9uLlJJR0hUICYmXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbExlZnQgPCB0aGlzLmdhbnR0VXBwZXIudmlldy53aWR0aCAtIGNsaWVudFJlY3Qud2lkdGgpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uID0gaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9TY3JvbGxTcGVlZFJhdGVzID0gZ2V0QXV0b1Njcm9sbFNwZWVkUmF0ZXMoY2xpZW50UmVjdCwgcG9pbnRlclgsIGhvcml6b250YWxTY3JvbGxEaXJlY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKHRoaXMuc3RhcnRTY3JvbGxJbnRlcnZhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1Njcm9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29uZGl0aW9ucyB0byBzdG9wIGF1dG8tc2Nyb2xsOiB3aGVuIHRoZSBzdGFydCBpcyBncmVhdGVyIHRoYW4gdGhlIGVuZCBhbmQgdGhlIGJhciBhcHBlYXJzIGluIHRoZSB2aWV3XG4gICAgcHJpdmF0ZSBpc1N0YXJ0R3JlYXRlclRoYW5FbmRXaGVuQmFySGFuZGxlRHJhZ01vdmUoaXNCZWZvcmU6IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IGlzU3RhcnRHcmVhdGVyVGhhbkVuZDogYm9vbGVhbjtcbiAgICAgICAgbGV0IGlzQmFyQXBwZWFyc0luVmlldzogYm9vbGVhbjtcblxuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gdGhpcy5kb20ubWFpbkNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuICAgICAgICBjb25zdCBjbGllbnRXaWR0aCA9IHRoaXMuZG9tLm1haW5Db250YWluZXIuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IHhUaHJlc2hvbGQgPSBjbGllbnRXaWR0aCAqIERST1BfUFJPWElNSVRZX1RIUkVTSE9MRDtcblxuICAgICAgICBpZiAoaXNCZWZvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhcnQsIG1pblJhbmdlV2lkdGhXaWR0aCB9ID0gdGhpcy5zdGFydE9mQmFySGFuZGxlKCk7XG4gICAgICAgICAgICBjb25zdCB4UG9pbnRlckJ5RW5kRGF0ZSA9IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldFhQb2ludEJ5RGF0ZSh0aGlzLml0ZW0oKS5lbmQpO1xuXG4gICAgICAgICAgICBpc1N0YXJ0R3JlYXRlclRoYW5FbmQgPSBzdGFydC52YWx1ZSA+IHRoaXMuaXRlbSgpLmVuZC52YWx1ZTtcbiAgICAgICAgICAgIGlzQmFyQXBwZWFyc0luVmlldyA9IHhQb2ludGVyQnlFbmREYXRlICsgbWluUmFuZ2VXaWR0aFdpZHRoICsgeFRocmVzaG9sZCA8PSBzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGVuZCB9ID0gdGhpcy5lbmRPZkJhckhhbmRsZSgpO1xuICAgICAgICAgICAgY29uc3QgeFBvaW50ZXJCeVN0YXJ0RGF0ZSA9IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldFhQb2ludEJ5RGF0ZSh0aGlzLml0ZW0oKS5zdGFydCk7XG5cbiAgICAgICAgICAgIGlzU3RhcnRHcmVhdGVyVGhhbkVuZCA9IGVuZC52YWx1ZSA8IHRoaXMuaXRlbSgpLnN0YXJ0LnZhbHVlO1xuICAgICAgICAgICAgaXNCYXJBcHBlYXJzSW5WaWV3ID0gc2Nyb2xsTGVmdCArIHhUaHJlc2hvbGQgPD0geFBvaW50ZXJCeVN0YXJ0RGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc1N0YXJ0R3JlYXRlclRoYW5FbmQgJiYgaXNCYXJBcHBlYXJzSW5WaWV3ID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNvbWUgZGF0YSBpbmZvcm1hdGlvbiBhYm91dCBkcmFnZ2luZyBzdGFydCB1bnRpbCBpdCBpcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gZW5kXG4gICAgcHJpdmF0ZSBzdGFydE9mQmFySGFuZGxlKCkge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy5pdGVtKCkucmVmcy54ICsgdGhpcy5iYXJIYW5kbGVEcmFnTW92ZUFuZFNjcm9sbERpc3RhbmNlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXREYXRlQnlYUG9pbnQoeCksXG4gICAgICAgICAgICBtaW5SYW5nZVdpZHRoV2lkdGg6IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldE1pblJhbmdlV2lkdGhCeVByZWNpc2lvblVuaXQodGhpcy5pdGVtKCkuZW5kKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNvbWUgZGF0YSBpbmZvcm1hdGlvbiBhYm91dCBkcmFnZ2luZyBlbmQgb2YgYmFyIGhhbmRsZVxuICAgIHByaXZhdGUgZW5kT2ZCYXJIYW5kbGUoKSB7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5pdGVtKCkucmVmcy53aWR0aCArIHRoaXMuYmFySGFuZGxlRHJhZ01vdmVBbmRTY3JvbGxEaXN0YW5jZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBlbmQ6IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldERhdGVCeVhQb2ludCh0aGlzLml0ZW0oKS5yZWZzLnggKyB3aWR0aClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0b3BTY3JvbGxpbmcoKSB7XG4gICAgICAgIHRoaXMuc3RvcFNjcm9sbFRpbWVycyQubmV4dCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTdGFydE9yRW5kSW5zaWRlVmlldyhzdGFydDogR2FudHREYXRlLCBlbmQ6IEdhbnR0RGF0ZSkge1xuICAgICAgICBjb25zdCBpdGVtU3RhcnQgPSBzdGFydC5nZXRVbml4VGltZSgpO1xuICAgICAgICBjb25zdCBpdGVtRW5kID0gZW5kLmdldFVuaXhUaW1lKCk7XG4gICAgICAgIGNvbnN0IHZpZXdTdGFydCA9IHRoaXMuZ2FudHRVcHBlci52aWV3LnN0YXJ0LmdldFVuaXhUaW1lKCk7XG4gICAgICAgIGNvbnN0IHZpZXdFbmQgPSB0aGlzLmdhbnR0VXBwZXIudmlldy5lbmQuZ2V0VW5peFRpbWUoKTtcbiAgICAgICAgaWYgKGl0ZW1TdGFydCA8IHZpZXdTdGFydCB8fCBpdGVtRW5kID4gdmlld0VuZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUl0ZW1EYXRlKHN0YXJ0OiBHYW50dERhdGUsIGVuZDogR2FudHREYXRlKSB7XG4gICAgICAgIHRoaXMuaXRlbSgpLnVwZGF0ZURhdGUodGhpcy5nYW50dFVwcGVyLnZpZXcuc3RhcnRPZlByZWNpc2lvbihzdGFydCksIHRoaXMuZ2FudHRVcHBlci52aWV3LmVuZE9mUHJlY2lzaW9uKGVuZCkpO1xuICAgIH1cblxuICAgIGluaXRpYWxpemUoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgaXRlbTogR2FudHRJdGVtSW50ZXJuYWwsIGdhbnR0VXBwZXI6IEdhbnR0VXBwZXIpIHtcbiAgICAgICAgdGhpcy5iYXJFbGVtZW50ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLmdhbnR0VXBwZXIgPSBnYW50dFVwcGVyO1xuICAgICAgICB0aGlzLml0ZW0uc2V0KGl0ZW0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQmFyRHJhZ1JlZigpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFyRHJhZ1JlZikge1xuICAgICAgICAgICAgdGhpcy5iYXJEcmFnUmVmLmRpc2FibGVkID0gdGhpcy5kcmFnRGlzYWJsZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZHJhZ0Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmJhckRyYWdSZWYgPSB0aGlzLmNyZWF0ZUJhckRyYWcoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQmFySGFuZGxlRHJhZ1JlZnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmJhckhhbmRsZURyYWdSZWZzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYmFySGFuZGxlRHJhZ1JlZnMuZm9yRWFjaCgoZHJhZ1JlZikgPT4ge1xuICAgICAgICAgICAgICAgIGRyYWdSZWYuZGlzYWJsZWQgPSB0aGlzLmRyYWdEaXNhYmxlZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRyYWdEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5iYXJIYW5kbGVEcmFnUmVmcyA9IHRoaXMuY3JlYXRlQmFySGFuZGxlRHJhZ3MoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlTGlua0RyYWdSZWZzKCkge1xuICAgICAgICBpZiAodGhpcy5saW5rRHJhZ1JlZnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5saW5rRHJhZ1JlZnMuZm9yRWFjaCgoZHJhZ1JlZikgPT4ge1xuICAgICAgICAgICAgICAgIGRyYWdSZWYuZGlzYWJsZWQgPSB0aGlzLmxpbmtEcmFnRGlzYWJsZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5saW5rRHJhZ0Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmtEcmFnUmVmcyA9IHRoaXMuY3JlYXRlTGlua0hhbmRsZURyYWdzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVEcmFncygpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVNb3VzZUV2ZW50cygpO1xuICAgICAgICB0aGlzLmNyZWF0ZUJhckRyYWdSZWYoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVCYXJIYW5kbGVEcmFnUmVmcygpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxpbmtEcmFnUmVmcygpO1xuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW0oaXRlbTogR2FudHRJdGVtSW50ZXJuYWwpIHtcbiAgICAgICAgdGhpcy5pdGVtLnNldChpdGVtKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZURyYWdCYWNrZHJvcCgpO1xuICAgICAgICB0aGlzLmJhckRyYWdSZWY/LmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5saW5rRHJhZ1JlZnM/LmZvckVhY2goKGRyYWdSZWYpID0+IGRyYWdSZWYuZGlzcG9zZSgpKTtcbiAgICAgICAgdGhpcy5iYXJIYW5kbGVEcmFnUmVmcz8uZm9yRWFjaCgoZHJhZ1JlZikgPT4gZHJhZ1JlZi5kaXNwb3NlKCkpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcbiAgICAgICAgdGhpcy5zdG9wU2Nyb2xsVGltZXJzJC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiJdfQ==