@libs-ui/components-draw-line 0.2.306 → 0.2.307-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
- import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, NgZone, Output, inject } from "@angular/core";
2
- import { checkMouseOverInContainer, cloneDeep, get, getDragEventByElement } from "@libs-ui/utils";
3
- import { Subject, takeUntil, tap } from "rxjs";
4
- import { MoCanvasConnectNavigationNewElementUtil } from "./util/connect-navigation-new-element.util";
1
+ import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, NgZone, Output, inject } from '@angular/core';
2
+ import { checkMouseOverInContainer, cloneDeep, get, getDragEventByElement } from '@libs-ui/utils';
3
+ import { Subject, takeUntil, tap } from 'rxjs';
4
+ import { MoCanvasConnectNavigationNewElementUtil } from './util/connect-navigation-new-element.util';
5
5
  import * as i0 from "@angular/core";
6
- export * from "./draw-line.interface";
6
+ export * from './draw-line.interface';
7
7
  export class LibsUiComponentsDrawLineDirective {
8
8
  cdr = inject(ChangeDetectorRef);
9
9
  zone = inject(NgZone);
@@ -19,20 +19,23 @@ export class LibsUiComponentsDrawLineDirective {
19
19
  outDrawLineFunctionControl = new EventEmitter();
20
20
  outConnected = new EventEmitter();
21
21
  ngAfterViewInit() {
22
- this.svgElement = this.svgElement || document.createElementNS("http://www.w3.org/2000/svg", "svg");
22
+ this.svgElement = this.svgElement || document.createElementNS('http://www.w3.org/2000/svg', 'svg');
23
23
  this.elementRef.nativeElement.append(this.svgElement);
24
- this.outDrawLineFunctionControl.emit({
24
+ this.outDrawLineFunctionControl.emit(this.FunctionsControl);
25
+ }
26
+ get FunctionsControl() {
27
+ return {
25
28
  setData: this.setData.bind(this),
26
29
  setReachablePointRange: this.setReachablePointRange.bind(this),
27
30
  removeLine: this.removeLine.bind(this),
28
31
  removeReachablePointRange: this.removeReachablePointRange.bind(this),
29
- updateViewBox: this.updateViewBox.bind(this)
30
- });
32
+ updateViewBox: this.updateViewBox.bind(this),
33
+ };
31
34
  }
32
35
  setData(data) {
33
36
  const newData = [];
34
- data.forEach(item => {
35
- if (this.dataDraw.find(dataDraw => dataDraw.id === item.id && item.points.start.x === dataDraw.points.start.x && item.points.start.y === dataDraw.points.start.y && item.points.end.x === dataDraw.points.end.x && item.points.end.y === dataDraw.points.end.y)) {
37
+ data.forEach((item) => {
38
+ if (this.dataDraw.find((dataDraw) => dataDraw.id === item.id && item.points.start.x === dataDraw.points.start.x && item.points.start.y === dataDraw.points.start.y && item.points.end.x === dataDraw.points.end.x && item.points.end.y === dataDraw.points.end.y)) {
36
39
  return;
37
40
  }
38
41
  const itemClone = cloneDeep(item);
@@ -44,8 +47,8 @@ export class LibsUiComponentsDrawLineDirective {
44
47
  }
45
48
  setReachablePointRange(data) {
46
49
  const newData = [];
47
- data.forEach(item => {
48
- if (this.dataReachablePointRange.find(dataDraw => dataDraw.id === item.id || item.x === dataDraw.x && item.y === dataDraw.y)) {
50
+ data.forEach((item) => {
51
+ if (this.dataReachablePointRange.find((dataDraw) => dataDraw.id === item.id || (item.x === dataDraw.x && item.y === dataDraw.y))) {
49
52
  return;
50
53
  }
51
54
  const itemClone = cloneDeep(item);
@@ -56,26 +59,26 @@ export class LibsUiComponentsDrawLineDirective {
56
59
  this.startProcessDataReachablePointRange(newData);
57
60
  }
58
61
  removeLine(id, points) {
59
- const dataDrawById = this.dataDraw.filter(item => item.id === id);
62
+ const dataDrawById = this.dataDraw.filter((item) => item.id === id);
60
63
  if (!dataDrawById?.length) {
61
64
  return;
62
65
  }
63
66
  const removeByItem = (item) => {
64
67
  this.removeElementOfPoints(item.points);
65
- item.points.separatedPoints?.forEach(separatedPoints => this.removeElementOfPoints(separatedPoints));
68
+ item.points.separatedPoints?.forEach((separatedPoints) => this.removeElementOfPoints(separatedPoints));
66
69
  };
67
70
  if (!points?.length) {
68
- dataDrawById.forEach(item => removeByItem(item));
69
- this.dataDraw = this.dataDraw.filter(item => item.id !== id);
71
+ dataDrawById.forEach((item) => removeByItem(item));
72
+ this.dataDraw = this.dataDraw.filter((item) => item.id !== id);
70
73
  this.updateViewBox();
71
74
  return;
72
75
  }
73
- points.forEach(point => {
74
- const dataDrawRemoveByPoint = dataDrawById.find(item => item.points.start.x === point.start.x && item.points.start.y === point.start.y && item.points.end.x === point.end.x && item.points.end.y === point.end.y);
76
+ points.forEach((point) => {
77
+ const dataDrawRemoveByPoint = dataDrawById.find((item) => item.points.start.x === point.start.x && item.points.start.y === point.start.y && item.points.end.x === point.end.x && item.points.end.y === point.end.y);
75
78
  if (dataDrawRemoveByPoint) {
76
79
  dataDrawRemoveByPoint.isRemove = true;
77
80
  removeByItem(dataDrawRemoveByPoint);
78
- this.dataDraw = this.dataDraw.filter(item => item.id !== id && !item.isRemove);
81
+ this.dataDraw = this.dataDraw.filter((item) => item.id !== id && !item.isRemove);
79
82
  }
80
83
  });
81
84
  this.updateViewBox();
@@ -85,21 +88,21 @@ export class LibsUiComponentsDrawLineDirective {
85
88
  if (!ids.length) {
86
89
  return;
87
90
  }
88
- ids.forEach(id => {
89
- const itemRemove = this.dataReachablePointRange?.find(item => item.id === id);
91
+ ids.forEach((id) => {
92
+ const itemRemove = this.dataReachablePointRange?.find((item) => item.id === id);
90
93
  if (!itemRemove) {
91
94
  return;
92
95
  }
93
96
  itemRemove.onDestroyEvent?.next();
94
97
  itemRemove.element?.remove();
95
- this.dataReachablePointRange = this.dataReachablePointRange?.filter(item => item.id !== id);
98
+ this.dataReachablePointRange = this.dataReachablePointRange?.filter((item) => item.id !== id);
96
99
  });
97
100
  }
98
101
  startProcessDataRow(dataDraw) {
99
102
  this.zone.runOutsideAngular(() => {
100
- dataDraw.forEach(item => {
103
+ dataDraw.forEach((item) => {
101
104
  const { pathElement, arrowElement, circleStartElement, circleEndElement } = this.createPathAndArrowElement(item.id);
102
- item.points.obstacleRect?.forEach(data => this.addRect('rect', data));
105
+ item.points.obstacleRect?.forEach((data) => this.addRect('rect', data));
103
106
  item.points.pathElement = pathElement;
104
107
  item.points.arrowElement = arrowElement;
105
108
  if (item.startCircle) {
@@ -118,12 +121,12 @@ export class LibsUiComponentsDrawLineDirective {
118
121
  }
119
122
  startProcessDataReachablePointRange(data) {
120
123
  this.zone.runOutsideAngular(() => {
121
- data.forEach(item => {
124
+ data.forEach((item) => {
122
125
  item.onDestroyEvent = new Subject();
123
126
  item.element = this.createPathAndArrowElement(item.id).circleEndElement;
124
127
  this.svgElement.append(item.element);
125
128
  this.updateAttributeCircle(item.element, item.id, item, item.style);
126
- this.onDrawLineEnd.pipe(takeUntil(item.onDestroyEvent), takeUntil(this.onDestroy)).subscribe(eventData => {
129
+ this.onDrawLineEnd.pipe(takeUntil(item.onDestroyEvent), takeUntil(this.onDestroy)).subscribe((eventData) => {
127
130
  const { dataLine, event } = eventData;
128
131
  if (!checkMouseOverInContainer(event, item.element) || !dataLine.ref || !item.ref) {
129
132
  return;
@@ -132,7 +135,7 @@ export class LibsUiComponentsDrawLineDirective {
132
135
  eventData.dataLine.idConnected = item.id;
133
136
  this.outConnected.emit({
134
137
  dataLine: dataLine.ref,
135
- dataReachablePointRange: item.ref
138
+ dataReachablePointRange: item.ref,
136
139
  });
137
140
  });
138
141
  });
@@ -157,7 +160,7 @@ export class LibsUiComponentsDrawLineDirective {
157
160
  curve = curve ?? 10;
158
161
  }
159
162
  const preLengthSeparatedPoints = points.separatedPoints?.length;
160
- points.separatedPoints?.forEach(separatedPoints => this.removeElementOfPoints(separatedPoints));
163
+ points.separatedPoints?.forEach((separatedPoints) => this.removeElementOfPoints(separatedPoints));
161
164
  points.separatedPoints = [];
162
165
  MoCanvasConnectNavigationNewElementUtil.START_MODE = 'right-left';
163
166
  if (data.startEndMode) {
@@ -176,10 +179,10 @@ export class LibsUiComponentsDrawLineDirective {
176
179
  return;
177
180
  }
178
181
  let path = '';
179
- points.separatedPoints.forEach(separatedPoints => {
182
+ points.separatedPoints.forEach((separatedPoints) => {
180
183
  path += this.buildPathAndDrawSeparatedPoints(data, separatedPoints, separatedPoints.mode || mode);
181
184
  });
182
- const pathElement = document.createElementNS("http://www.w3.org/2000/svg", "path");
185
+ const pathElement = document.createElementNS('http://www.w3.org/2000/svg', 'path');
183
186
  this.svgElement.append(pathElement);
184
187
  points.pathElement = pathElement;
185
188
  const styleConfig = {
@@ -188,7 +191,7 @@ export class LibsUiComponentsDrawLineDirective {
188
191
  strokeWidth: data.lineStyle?.strokeWidth ?? '1px',
189
192
  fill: data.lineStyle?.fill ?? 'none',
190
193
  curve: data.lineStyle?.curve ?? 10,
191
- distancePoint: data.lineStyle?.distancePoint ?? 10
194
+ distancePoint: data.lineStyle?.distancePoint ?? 10,
192
195
  };
193
196
  points.pathElement?.setAttribute('stroke', styleConfig.stroke);
194
197
  points.pathElement?.setAttribute('fill', styleConfig.fill);
@@ -212,14 +215,14 @@ export class LibsUiComponentsDrawLineDirective {
212
215
  yPoints.add(points.start.y);
213
216
  yPoints.add(points.end.y);
214
217
  };
215
- this.dataDraw?.forEach(item => {
218
+ this.dataDraw?.forEach((item) => {
216
219
  const points = item.points;
217
220
  addPoints(points);
218
- points.separatedPoints?.forEach(separatedPoints => addPoints(separatedPoints));
219
- points.obstacleRect?.forEach(obstacleRect => {
221
+ points.separatedPoints?.forEach((separatedPoints) => addPoints(separatedPoints));
222
+ points.obstacleRect?.forEach((obstacleRect) => {
220
223
  addPoints({
221
224
  start: { x: obstacleRect.x - (obstacleRect.gapXObstacleRect || 8), y: obstacleRect.y - (obstacleRect.gapYObstacleRect || 8) },
222
- end: { x: obstacleRect.x + obstacleRect.width + (obstacleRect.gapXObstacleRect || 8) * 2, y: obstacleRect.y + obstacleRect.height + (obstacleRect.gapYObstacleRect || 8) * 2 }
225
+ end: { x: obstacleRect.x + obstacleRect.width + (obstacleRect.gapXObstacleRect || 8) * 2, y: obstacleRect.y + obstacleRect.height + (obstacleRect.gapYObstacleRect || 8) * 2 },
223
226
  });
224
227
  });
225
228
  });
@@ -241,8 +244,8 @@ export class LibsUiComponentsDrawLineDirective {
241
244
  if (!obstacleRects.length) {
242
245
  return;
243
246
  }
244
- const elementStart = obstacleRects.find(item => this.isPointInsideSquare(points.start, item));
245
- const elementEnd = obstacleRects.find(item => this.isPointInsideSquare(points.end, item));
247
+ const elementStart = obstacleRects.find((item) => this.isPointInsideSquare(points.start, item));
248
+ const elementEnd = obstacleRects.find((item) => this.isPointInsideSquare(points.end, item));
246
249
  if (this.viewBoxConfig?.marginBetweenElement) {
247
250
  MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT = this.viewBoxConfig?.marginBetweenElement ?? 32;
248
251
  }
@@ -256,7 +259,7 @@ export class LibsUiComponentsDrawLineDirective {
256
259
  strokeWidth: data.lineStyle?.strokeWidth ?? '1px',
257
260
  fill: data.lineStyle?.fill ?? 'none',
258
261
  curve: data.lineStyle?.curve ?? 10,
259
- distancePoint: data.lineStyle?.distancePoint ?? 10
262
+ distancePoint: data.lineStyle?.distancePoint ?? 10,
260
263
  };
261
264
  points.pathElement?.setAttribute('stroke', styleConfig.stroke);
262
265
  points.pathElement?.setAttribute('fill', styleConfig.fill);
@@ -265,7 +268,7 @@ export class LibsUiComponentsDrawLineDirective {
265
268
  points.pathElement?.setAttribute('stroke-dasharray', styleConfig.strokeDasharray);
266
269
  }
267
270
  let { curve, distancePoint } = styleConfig;
268
- mode = mode || "quart-in";
271
+ mode = mode || 'quart-in';
269
272
  if (mode !== 'quart-in') {
270
273
  curve = curve ?? 10;
271
274
  distancePoint = distancePoint ?? 10;
@@ -289,7 +292,7 @@ export class LibsUiComponentsDrawLineDirective {
289
292
  this.drawRectAndInitEvent(data, mode);
290
293
  }
291
294
  calculatorDistancePointAndCurve(points, distancePoint, curve, mode) {
292
- if ((!mode.includes('vertical') && !mode.includes('horizontal'))) {
295
+ if (!mode.includes('vertical') && !mode.includes('horizontal')) {
293
296
  return { curve, distancePoint };
294
297
  }
295
298
  const gapX = Math.abs(points.start.x - points.end.x);
@@ -327,15 +330,25 @@ export class LibsUiComponentsDrawLineDirective {
327
330
  }
328
331
  drawBalancedCurve(dPath, points) {
329
332
  dPath.M = { x: points.start.x, y: points.start.y };
330
- dPath.Q = [{ x: points.start.x + (points.end.x - points.start.x) / 4, y: points.start.y + (points.end.y - points.start.y) / 2 }, { x: points.start.x + (points.end.x - points.start.x) / 2, y: points.start.y + (points.end.y - points.start.y) / 2 }];
331
- dPath.Q2 = [{ x: points.end.x - (points.end.x - points.start.x) / 4, y: points.start.y + (points.end.y - points.start.y) / 2 }, { x: points.end.x, y: points.end.y }];
333
+ dPath.Q = [
334
+ { x: points.start.x + (points.end.x - points.start.x) / 4, y: points.start.y + (points.end.y - points.start.y) / 2 },
335
+ { x: points.start.x + (points.end.x - points.start.x) / 2, y: points.start.y + (points.end.y - points.start.y) / 2 },
336
+ ];
337
+ dPath.Q2 = [
338
+ { x: points.end.x - (points.end.x - points.start.x) / 4, y: points.start.y + (points.end.y - points.start.y) / 2 },
339
+ { x: points.end.x, y: points.end.y },
340
+ ];
332
341
  }
333
342
  drawBendBothEndsCurve(dPath, points) {
334
343
  const pointXCurve = (points.start.x + points.end.x) * 0.5;
335
344
  const pointControl1 = { x: pointXCurve, y: points.start.y };
336
345
  const pointControl2 = { x: pointXCurve, y: points.end.y };
337
346
  dPath.M = { x: points.start.x, y: points.start.y };
338
- dPath.C = [{ x: pointControl1.x, y: pointControl1.y }, { x: pointControl2.x, y: pointControl2.y }, { x: points.end.x, y: points.end.y }];
347
+ dPath.C = [
348
+ { x: pointControl1.x, y: pointControl1.y },
349
+ { x: pointControl2.x, y: pointControl2.y },
350
+ { x: points.end.x, y: points.end.y },
351
+ ];
339
352
  }
340
353
  buildDAttributeByPointEndModeHorizontal(dPath, points, distancePoint, curve, mode) {
341
354
  if (!mode.includes('horizontal')) {
@@ -345,17 +358,23 @@ export class LibsUiComponentsDrawLineDirective {
345
358
  const multiplierY = points.start.y < points.end.y ? 1 : -1;
346
359
  const reverseMultiplier = -1;
347
360
  dPath.M = { x: points.start.x, y: points.start.y };
348
- dPath.L = { x: points.end.x + ((distancePoint * 2 + curve) * multiplierX), y: points.start.y };
361
+ dPath.L = { x: points.end.x + (distancePoint * 2 + curve) * multiplierX, y: points.start.y };
349
362
  if (mode.includes('horizontal-single')) {
350
- dPath.L.x = points.end.x + (curve * multiplierX);
363
+ dPath.L.x = points.end.x + curve * multiplierX;
351
364
  }
352
- dPath.Q = [{ x: dPath.L.x + (curve * multiplierX * reverseMultiplier), y: points.start.y }, { x: dPath.L.x + (curve * multiplierX * reverseMultiplier), y: points.start.y + (curve * multiplierY) }];
353
- dPath.L2 = { x: dPath.Q[1].x, y: points.end.y + (curve * multiplierY * reverseMultiplier) };
365
+ dPath.Q = [
366
+ { x: dPath.L.x + curve * multiplierX * reverseMultiplier, y: points.start.y },
367
+ { x: dPath.L.x + curve * multiplierX * reverseMultiplier, y: points.start.y + curve * multiplierY },
368
+ ];
369
+ dPath.L2 = { x: dPath.Q[1].x, y: points.end.y + curve * multiplierY * reverseMultiplier };
354
370
  if (mode.includes('horizontal-single')) {
355
371
  dPath.L2 = points.end;
356
372
  }
357
373
  if (mode === 'horizontal') {
358
- dPath.Q2 = [{ x: dPath.L2.x, y: points.end.y }, { x: dPath.L2.x + (distancePoint * multiplierX * reverseMultiplier), y: points.end.y }];
374
+ dPath.Q2 = [
375
+ { x: dPath.L2.x, y: points.end.y },
376
+ { x: dPath.L2.x + distancePoint * multiplierX * reverseMultiplier, y: points.end.y },
377
+ ];
359
378
  dPath.L3 = { x: points.end.x, y: points.end.y };
360
379
  }
361
380
  }
@@ -367,23 +386,29 @@ export class LibsUiComponentsDrawLineDirective {
367
386
  const multiplierY = points.start.y < points.end.y ? 1 : -1;
368
387
  const reverseMultiplier = -1;
369
388
  dPath.M = points.start;
370
- dPath.L = { x: points.start.x, y: points.start.y + (distancePoint * multiplierY) };
389
+ dPath.L = { x: points.start.x, y: points.start.y + distancePoint * multiplierY };
371
390
  if (mode.includes('vertical-single')) {
372
- dPath.L.y = points.end.y + (distancePoint * multiplierY * reverseMultiplier);
391
+ dPath.L.y = points.end.y + distancePoint * multiplierY * reverseMultiplier;
373
392
  }
374
- dPath.Q = [{ x: dPath.L.x, y: dPath.L.y + (curve * multiplierY) }, { x: dPath.L.x + (curve * multiplierX * reverseMultiplier), y: dPath.L.y + (curve * multiplierY) }];
375
- dPath.L2 = { x: points.end.x + ((curve * 2) * multiplierX), y: dPath.Q[1].y };
393
+ dPath.Q = [
394
+ { x: dPath.L.x, y: dPath.L.y + curve * multiplierY },
395
+ { x: dPath.L.x + curve * multiplierX * reverseMultiplier, y: dPath.L.y + curve * multiplierY },
396
+ ];
397
+ dPath.L2 = { x: points.end.x + curve * 2 * multiplierX, y: dPath.Q[1].y };
376
398
  if (mode.includes('vertical-single')) {
377
399
  dPath.L2 = points.end;
378
400
  }
379
401
  if (mode === 'vertical') {
380
- dPath.Q2 = [{ x: points.end.x, y: dPath.L2.y }, { x: points.end.x, y: dPath.L2.y + (curve * multiplierY) }];
402
+ dPath.Q2 = [
403
+ { x: points.end.x, y: dPath.L2.y },
404
+ { x: points.end.x, y: dPath.L2.y + curve * multiplierY },
405
+ ];
381
406
  dPath.L3 = { x: points.end.x, y: points.end.y };
382
407
  }
383
408
  }
384
409
  builDAttributeToString(dAttribute) {
385
410
  let dString = '';
386
- Object.keys(dAttribute).forEach(key => {
411
+ Object.keys(dAttribute).forEach((key) => {
387
412
  const data = get(dAttribute, key);
388
413
  if (Array.isArray(data)) {
389
414
  const [point1, point2, point3] = data;
@@ -405,7 +430,7 @@ export class LibsUiComponentsDrawLineDirective {
405
430
  stroke: data.arrowStyle?.stroke ?? 'none',
406
431
  strokeWidth: data.arrowStyle?.strokeWidth ?? '0',
407
432
  width: data.arrowStyle?.width ?? 6,
408
- height: data.arrowStyle?.height ?? 8
433
+ height: data.arrowStyle?.height ?? 8,
409
434
  };
410
435
  const pointEnd = cloneDeep(points.end);
411
436
  const arrowElement = points.arrowElement;
@@ -453,7 +478,7 @@ export class LibsUiComponentsDrawLineDirective {
453
478
  getDirection(points, startEndMode) {
454
479
  let pointStart = { ...points.start };
455
480
  if (points.separatedPoints) {
456
- const lineToEnd = points.separatedPoints.find(item => item.end.x === points.end.x && item.end.y === points.end.y);
481
+ const lineToEnd = points.separatedPoints.find((item) => item.end.x === points.end.x && item.end.y === points.end.y);
457
482
  if (lineToEnd) {
458
483
  pointStart = lineToEnd.start;
459
484
  }
@@ -498,7 +523,7 @@ export class LibsUiComponentsDrawLineDirective {
498
523
  preEvent = dragMouseEvent;
499
524
  pointEnd.x += movementX;
500
525
  pointEnd.y += movementY;
501
- if (data.points?.obstacleRect?.length && data.points?.obstacleRect.some(obstacleRect => this.checkPointIncludeRect(pointEnd, obstacleRect))) {
526
+ if (data.points?.obstacleRect?.length && data.points?.obstacleRect.some((obstacleRect) => this.checkPointIncludeRect(pointEnd, obstacleRect))) {
502
527
  return;
503
528
  }
504
529
  points.end.x = pointEnd.x;
@@ -510,15 +535,19 @@ export class LibsUiComponentsDrawLineDirective {
510
535
  getDragEventByElement({
511
536
  elementMouseDown: points.arrowElement,
512
537
  functionMouseUp: functionMouseUp,
513
- onDestroy: this.onDestroy
514
- }).pipe(tap(handlerDrag), takeUntil(points.onDestroyEvent)).subscribe();
538
+ onDestroy: this.onDestroy,
539
+ })
540
+ .pipe(tap(handlerDrag), takeUntil(points.onDestroyEvent))
541
+ .subscribe();
515
542
  }
516
543
  if (points.circleEndElement) {
517
544
  getDragEventByElement({
518
545
  elementMouseDown: points.circleEndElement,
519
546
  functionMouseUp: functionMouseUp,
520
547
  onDestroy: this.onDestroy,
521
- }).pipe(tap(handlerDrag), takeUntil(points.onDestroyEvent)).subscribe();
548
+ })
549
+ .pipe(tap(handlerDrag), takeUntil(points.onDestroyEvent))
550
+ .subscribe();
522
551
  }
523
552
  }
524
553
  checkPointIncludeRect(point, obstacleRect) {
@@ -527,18 +556,18 @@ export class LibsUiComponentsDrawLineDirective {
527
556
  x: obstacleRect.x - (obstacleRect.gapXObstacleRect || gapDefault),
528
557
  y: obstacleRect.y - (obstacleRect.gapYObstacleRect || gapDefault),
529
558
  width: obstacleRect.width + (obstacleRect.gapXObstacleRect || gapDefault) * 2,
530
- height: obstacleRect.height + (obstacleRect.gapYObstacleRect || gapDefault) * 2
559
+ height: obstacleRect.height + (obstacleRect.gapYObstacleRect || gapDefault) * 2,
531
560
  };
532
- if ((obstacleRect.x <= point.x && point.x <= obstacleRect.x + obstacleRect.width) && (obstacleRect.y <= point.y && point.y <= obstacleRect.y + obstacleRect.height)) {
561
+ if (obstacleRect.x <= point.x && point.x <= obstacleRect.x + obstacleRect.width && obstacleRect.y <= point.y && point.y <= obstacleRect.y + obstacleRect.height) {
533
562
  return true;
534
563
  }
535
564
  return false;
536
565
  }
537
566
  createPathAndArrowElement(name) {
538
- const pathElement = document.createElementNS("http://www.w3.org/2000/svg", "path");
539
- const arrowElement = document.createElementNS("http://www.w3.org/2000/svg", "polyline");
540
- const circleStartElement = document.createElementNS("http://www.w3.org/2000/svg", "circle");
541
- const circleEndElement = document.createElementNS("http://www.w3.org/2000/svg", "circle");
567
+ const pathElement = document.createElementNS('http://www.w3.org/2000/svg', 'path');
568
+ const arrowElement = document.createElementNS('http://www.w3.org/2000/svg', 'polyline');
569
+ const circleStartElement = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
570
+ const circleEndElement = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
542
571
  pathElement.setAttribute('name', name);
543
572
  arrowElement.setAttribute('name', name);
544
573
  this.svgElement.append(pathElement);
@@ -549,7 +578,7 @@ export class LibsUiComponentsDrawLineDirective {
549
578
  if (!this.drawRectDebug) {
550
579
  return;
551
580
  }
552
- const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
581
+ const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
553
582
  circle.setAttribute('name', name);
554
583
  circle.setAttribute('cx', `${point.x}`);
555
584
  circle.setAttribute('cy', `${point.y}`);
@@ -561,14 +590,14 @@ export class LibsUiComponentsDrawLineDirective {
561
590
  if (!this.drawRectDebug) {
562
591
  return;
563
592
  }
564
- Array.from(this.svgElement.getElementsByTagName('circle'))?.forEach(item => item.remove());
593
+ Array.from(this.svgElement.getElementsByTagName('circle'))?.forEach((item) => item.remove());
565
594
  }
566
595
  addRect(name, rect) {
567
596
  if (!this.drawRectDebug) {
568
597
  return;
569
598
  }
570
- const rectElement = document.createElementNS("http://www.w3.org/2000/svg", "rect");
571
- const textElement = document.createElementNS("http://www.w3.org/2000/svg", "text");
599
+ const rectElement = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
600
+ const textElement = document.createElementNS('http://www.w3.org/2000/svg', 'text');
572
601
  rectElement.setAttribute('name', name);
573
602
  rectElement.setAttribute('x', `${rect.x}`);
574
603
  rectElement.setAttribute('y', `${rect.y}`);
@@ -585,17 +614,17 @@ export class LibsUiComponentsDrawLineDirective {
585
614
  if (!this.drawRectDebug) {
586
615
  return;
587
616
  }
588
- Array.from(this.svgElement.getElementsByTagName('rect'))?.forEach(item => item.remove());
589
- Array.from(this.svgElement.getElementsByTagName('text'))?.forEach(item => item.remove());
617
+ Array.from(this.svgElement.getElementsByTagName('rect'))?.forEach((item) => item.remove());
618
+ Array.from(this.svgElement.getElementsByTagName('text'))?.forEach((item) => item.remove());
590
619
  }
591
620
  buildPathAndDrawSeparatedPoints(data, points, mode) {
592
621
  let dPath = {};
593
622
  const styleConfig = {
594
623
  curve: data.lineStyle?.curve ?? 10,
595
- distancePoint: data.lineStyle?.distancePoint ?? 10
624
+ distancePoint: data.lineStyle?.distancePoint ?? 10,
596
625
  };
597
626
  let { curve, distancePoint } = styleConfig;
598
- mode = mode || "quart-in";
627
+ mode = mode || 'quart-in';
599
628
  if (mode !== 'quart-in') {
600
629
  curve = curve ?? 10;
601
630
  distancePoint = distancePoint ?? 10;
@@ -626,7 +655,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
626
655
  type: Directive,
627
656
  args: [{
628
657
  // eslint-disable-next-line @angular-eslint/directive-selector
629
- selector: "[LibsUiComponentsDrawLineDirective]",
658
+ selector: '[LibsUiComponentsDrawLineDirective]',
630
659
  standalone: true,
631
660
  }]
632
661
  }], propDecorators: { viewBoxConfig: [{
@@ -640,4 +669,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
640
669
  }], outConnected: [{
641
670
  type: Output
642
671
  }] } });
643
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy1saW5lLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmF3LWxpbmUvc3JjL2RyYXctbGluZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFhLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEosT0FBTyxFQUFFLHlCQUF5QixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0MsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLE1BQU0sNENBQTRDLENBQUM7O0FBRXJHLGNBQWMsdUJBQXVCLENBQUM7QUFNdEMsTUFBTSxPQUFPLGlDQUFpQztJQUNsQyxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDaEMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLHVCQUF1QixDQUFVO0lBQ25DLFFBQVEsR0FBOEIsRUFBRSxDQUFDO0lBQ3pDLHVCQUF1QixHQUFnQyxFQUFFLENBQUM7SUFDMUQsYUFBYSxHQUdoQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ1gsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFL0IsYUFBYSxDQUFrQjtJQUMvQixVQUFVLENBQWlCO0lBQzNCLGFBQWEsQ0FBVztJQUV2QiwwQkFBMEIsR0FBNkMsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMxRixZQUFZLEdBQWtHLElBQUksWUFBWSxF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SUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRU8saUJBQWlCLENBQUMsS0FBd0IsRUFBRSxNQUFlO1FBQ2pFLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkQsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2UCxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEssQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQXdCLEVBQUUsTUFBZTtRQUNyRSxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFMUQsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFD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cnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT3V0cHV0LCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lciwgY2xvbmVEZWVwLCBnZXQsIGdldERyYWdFdmVudEJ5RWxlbWVudCB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgSUF0dHJpYnV0ZURPblBhdGgsIElDaXJjbGVTdHlsZSwgSURyYXdMaW5lRGF0YUlucHV0LCBJTW9EcmF3TGluZUZ1bmN0aW9uQ29udHJvbCwgSVBvaW50LCBJUG9pbnRzLCBJUmVhY2hhYmxlUG9pbnRSYW5nZSwgSVJlY3QsIElWaWV3Qm94Q29uZmlnLCBUWVBFX0RJUkVDVElPTiwgVFlQRV9NT0RFIH0gZnJvbSBcIi4vZHJhdy1saW5lLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbk5ld0VsZW1lbnRVdGlsIH0gZnJvbSBcIi4vdXRpbC9jb25uZWN0LW5hdmlnYXRpb24tbmV3LWVsZW1lbnQudXRpbFwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kcmF3LWxpbmUuaW50ZXJmYWNlXCI7XG5ARGlyZWN0aXZlKHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6IFwiW0xpYnNVaUNvbXBvbmVudHNEcmF3TGluZURpcmVjdGl2ZV1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0RyYXdMaW5lRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByb3RlY3RlZCB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByb3RlY3RlZCBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcm90ZWN0ZWQgaW50ZXJ2YWxTY3JvbGxUb0VsZW1lbnQ/OiBudW1iZXI7XG4gIHByaXZhdGUgZGF0YURyYXc6IEFycmF5PElEcmF3TGluZURhdGFJbnB1dD4gPSBbXTtcbiAgcHJpdmF0ZSBkYXRhUmVhY2hhYmxlUG9pbnRSYW5nZTogQXJyYXk8SVJlYWNoYWJsZVBvaW50UmFuZ2U+ID0gW107XG4gIHByaXZhdGUgb25EcmF3TGluZUVuZDogU3ViamVjdDx7XG4gICAgZGF0YUxpbmU6IElEcmF3TGluZURhdGFJbnB1dCxcbiAgICBldmVudDogTW91c2VFdmVudFxuICB9PiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBASW5wdXQoKSB2aWV3Qm94Q29uZmlnPzogSVZpZXdCb3hDb25maWc7XG4gIEBJbnB1dCgpIHN2Z0VsZW1lbnQhOiBTVkdTVkdFbGVtZW50O1xuICBASW5wdXQoKSBkcmF3UmVjdERlYnVnPzogYm9vbGVhbjtcblxuICBAT3V0cHV0KCkgb3V0RHJhd0xpbmVGdW5jdGlvbkNvbnRyb2w6IEV2ZW50RW1pdHRlcjxJTW9EcmF3TGluZUZ1bmN0aW9uQ29udHJvbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvdXRDb25uZWN0ZWQ6IEV2ZW50RW1pdHRlcjx7IGRhdGFMaW5lOiBJRHJhd0xpbmVEYXRhSW5wdXQsIGRhdGFSZWFjaGFibGVQb2ludFJhbmdlOiBJUmVhY2hhYmxlUG9pbnRSYW5nZSB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN2Z0VsZW1lbnQgPSB0aGlzLnN2Z0VsZW1lbnQgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kKHRoaXMuc3ZnRWxlbWVudCk7XG4gICAgdGhpcy5vdXREcmF3TGluZUZ1bmN0aW9uQ29udHJvbC5lbWl0KHtcbiAgICAgIHNldERhdGE6IHRoaXMuc2V0RGF0YS5iaW5kKHRoaXMpLFxuICAgICAgc2V0UmVhY2hhYmxlUG9pbnRSYW5nZTogdGhpcy5zZXRSZWFjaGFibGVQb2ludFJhbmdlLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVMaW5lOiB0aGlzLnJlbW92ZUxpbmUuYmluZCh0aGlzKSxcbiAgICAgIHJlbW92ZVJlYWNoYWJsZVBvaW50UmFuZ2U6IHRoaXMucmVtb3ZlUmVhY2hhYmxlUG9pbnRSYW5nZS5iaW5kKHRoaXMpLFxuICAgICAgdXBkYXRlVmlld0JveDogdGhpcy51cGRhdGVWaWV3Qm94LmJpbmQodGhpcylcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0YShkYXRhOiBBcnJheTxJRHJhd0xpbmVEYXRhSW5wdXQ+KSB7XG4gICAgY29uc3QgbmV3RGF0YTogQXJyYXk8SURyYXdMaW5lRGF0YUlucHV0PiA9IFtdO1xuXG4gICAgZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKHRoaXMuZGF0YURyYXcuZmluZChkYXRhRHJhdyA9PiBkYXRhRHJhdy5pZCA9PT0gaXRlbS5pZCAmJiBpdGVtLnBvaW50cy5zdGFydC54ID09PSBkYXRhRHJhdy5wb2ludHMuc3RhcnQueCAmJiBpdGVtLnBvaW50cy5zdGFydC55ID09PSBkYXRhRHJhdy5wb2ludHMuc3RhcnQueSAmJiBpdGVtLnBvaW50cy5lbmQueCA9PT0gZGF0YURyYXcucG9pbnRzLmVuZC54ICYmIGl0ZW0ucG9pbnRzLmVuZC55ID09PSBkYXRhRHJhdy5wb2ludHMuZW5kLnkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1DbG9uZSA9IGNsb25lRGVlcChpdGVtKTtcblxuICAgICAgaXRlbUNsb25lLnJlZiA9IGl0ZW07XG4gICAgICBuZXdEYXRhLnB1c2goaXRlbUNsb25lKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YURyYXcucHVzaCguLi5uZXdEYXRhKTtcbiAgICB0aGlzLnN0YXJ0UHJvY2Vzc0RhdGFSb3cobmV3RGF0YSk7XG4gIH1cblxuXG4gIHNldFJlYWNoYWJsZVBvaW50UmFuZ2UoZGF0YTogQXJyYXk8SVJlYWNoYWJsZVBvaW50UmFuZ2U+KSB7XG4gICAgY29uc3QgbmV3RGF0YTogQXJyYXk8SVJlYWNoYWJsZVBvaW50UmFuZ2U+ID0gW107XG5cbiAgICBkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhUmVhY2hhYmxlUG9pbnRSYW5nZS5maW5kKGRhdGFEcmF3ID0+IGRhdGFEcmF3LmlkID09PSBpdGVtLmlkIHx8IGl0ZW0ueCA9PT0gZGF0YURyYXcueCAmJiBpdGVtLnkgPT09IGRhdGFEcmF3LnkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1DbG9uZSA9IGNsb25lRGVlcChpdGVtKTtcblxuICAgICAgaXRlbUNsb25lLnJlZiA9IGl0ZW07XG4gICAgICBuZXdEYXRhLnB1c2goaXRlbUNsb25lKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVJlYWNoYWJsZVBvaW50UmFuZ2UucHVzaCguLi5uZXdEYXRhKTtcbiAgICB0aGlzLnN0YXJ0UHJvY2Vzc0RhdGFSZWFjaGFibGVQb2ludFJhbmdlKG5ld0RhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVMaW5lKGlkOiBzdHJpbmcsIHBvaW50cz86IEFycmF5PElQb2ludHM+KSB7XG4gICAgY29uc3QgZGF0YURyYXdCeUlkID0gdGhpcy5kYXRhRHJhdy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkID09PSBpZCk7XG5cbiAgICBpZiAoIWRhdGFEcmF3QnlJZD8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlQnlJdGVtID0gKGl0ZW06IElEcmF3TGluZURhdGFJbnB1dCkgPT4ge1xuICAgICAgdGhpcy5yZW1vdmVFbGVtZW50T2ZQb2ludHMoaXRlbS5wb2ludHMpO1xuICAgICAgaXRlbS5wb2ludHMuc2VwYXJhdGVkUG9pbnRzPy5mb3JFYWNoKHNlcGFyYXRlZFBvaW50cyA9PiB0aGlzLnJlbW92ZUVsZW1lbnRPZlBvaW50cyhzZXBhcmF0ZWRQb2ludHMpKTtcblxuICAgIH07XG5cbiAgICBpZiAoIXBvaW50cz8ubGVuZ3RoKSB7XG4gICAgICBkYXRhRHJhd0J5SWQuZm9yRWFjaChpdGVtID0+IHJlbW92ZUJ5SXRlbShpdGVtKSk7XG4gICAgICB0aGlzLmRhdGFEcmF3ID0gdGhpcy5kYXRhRHJhdy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBpZCk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdCb3goKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBvaW50cy5mb3JFYWNoKHBvaW50ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFEcmF3UmVtb3ZlQnlQb2ludCA9IGRhdGFEcmF3QnlJZC5maW5kKGl0ZW0gPT4gaXRlbS5wb2ludHMuc3RhcnQueCA9PT0gcG9pbnQuc3RhcnQueCAmJiBpdGVtLnBvaW50cy5zdGFydC55ID09PSBwb2ludC5zdGFydC55ICYmIGl0ZW0ucG9pbnRzLmVuZC54ID09PSBwb2ludC5lbmQueCAmJiBpdGVtLnBvaW50cy5lbmQueSA9PT0gcG9pbnQuZW5kLnkpO1xuXG4gICAgICBpZiAoZGF0YURyYXdSZW1vdmVCeVBvaW50KSB7XG4gICAgICAgIGRhdGFEcmF3UmVtb3ZlQnlQb2ludC5pc1JlbW92ZSA9IHRydWU7XG4gICAgICAgIHJlbW92ZUJ5SXRlbShkYXRhRHJhd1JlbW92ZUJ5UG9pbnQpO1xuICAgICAgICB0aGlzLmRhdGFEcmF3ID0gdGhpcy5kYXRhRHJhdy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBpZCAmJiAhaXRlbS5pc1JlbW92ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVWaWV3Qm94KCk7XG5cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUmVhY2hhYmxlUG9pbnRSYW5nZShpZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLmNsZWFyUmVjdCgpO1xuICAgIGlmICghaWRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlkcy5mb3JFYWNoKGlkID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1SZW1vdmUgPSB0aGlzLmRhdGFSZWFjaGFibGVQb2ludFJhbmdlPy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gaWQpO1xuXG4gICAgICBpZiAoIWl0ZW1SZW1vdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlbVJlbW92ZS5vbkRlc3Ryb3lFdmVudD8ubmV4dCgpO1xuICAgICAgaXRlbVJlbW92ZS5lbGVtZW50Py5yZW1vdmUoKTtcbiAgICAgIHRoaXMuZGF0YVJlYWNoYWJsZVBvaW50UmFuZ2UgPSB0aGlzLmRhdGFSZWFjaGFibGVQb2ludFJhbmdlPy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBpZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UHJvY2Vzc0RhdGFSb3coZGF0YURyYXc6IEFycmF5PElEcmF3TGluZURhdGFJbnB1dD4pIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZGF0YURyYXcuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgeyBwYXRoRWxlbWVudCwgYXJyb3dFbGVtZW50LCBjaXJjbGVTdGFydEVsZW1lbnQsIGNpcmNsZUVuZEVsZW1lbnQgfSA9IHRoaXMuY3JlYXRlUGF0aEFuZEFycm93RWxlbWVudChpdGVtLmlkKTtcblxuICAgICAgICBpdGVtLnBvaW50cy5vYnN0YWNsZVJlY3Q/LmZvckVhY2goZGF0YSA9PiB0aGlzLmFkZFJlY3QoJ3JlY3QnLCBkYXRhKSk7XG4gICAgICAgIGl0ZW0ucG9pbnRzLnBhdGhFbGVtZW50ID0gcGF0aEVsZW1lbnQ7XG4gICAgICAgIGl0ZW0ucG9pbnRzLmFycm93RWxlbWVudCA9IGFycm93RWxlbWVudDtcbiAgICAgICAgaWYgKGl0ZW0uc3RhcnRDaXJjbGUpIHtcbiAgICAgICAgICBpdGVtLnBvaW50cy5jaXJjbGVTdGFydEVsZW1lbnQgPSBjaXJjbGVTdGFydEVsZW1lbnQ7XG4gICAgICAgICAgdGhpcy5zdmdFbGVtZW50LmFwcGVuZChjaXJjbGVTdGFydEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLmVuZENpcmNsZSkge1xuICAgICAgICAgIGl0ZW0ucG9pbnRzLmNpcmNsZUVuZEVsZW1lbnQgPSBjaXJjbGVFbmRFbGVtZW50O1xuICAgICAgICAgIHRoaXMuc3ZnRWxlbWVudC5hcHBlbmQoY2lyY2xlRW5kRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaXRlbS5wb2ludHMub25EZXN0cm95RXZlbnQgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLmRyYXdMaW5lKGl0ZW0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdCb3goKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQcm9jZXNzRGF0YVJlYWNoYWJsZVBvaW50UmFuZ2UoZGF0YTogQXJyYXk8SVJlYWNoYWJsZVBvaW50UmFuZ2U+KSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaXRlbS5vbkRlc3Ryb3lFdmVudCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgIGl0ZW0uZWxlbWVudCA9IHRoaXMuY3JlYXRlUGF0aEFuZEFycm93RWxlbWVudChpdGVtLmlkKS5jaXJjbGVFbmRFbGVtZW50O1xuICAgICAgICB0aGlzLnN2Z0VsZW1lbnQuYXBwZW5kKGl0ZW0uZWxlbWVudCk7XG4gICAgICAgIHRoaXMudXBkYXRlQXR0cmlidXRlQ2lyY2xlKGl0ZW0uZWxlbWVudCwgaXRlbS5pZCwgaXRlbSwgaXRlbS5zdHlsZSk7XG4gICAgICAgIHRoaXMub25EcmF3TGluZUVuZC5waXBlKHRha2VVbnRpbChpdGVtLm9uRGVzdHJveUV2ZW50KSwgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKGV2ZW50RGF0YSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBkYXRhTGluZSwgZXZlbnQgfSA9IGV2ZW50RGF0YTtcblxuICAgICAgICAgIGlmICghY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihldmVudCwgaXRlbS5lbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQpIHx8ICFkYXRhTGluZS5yZWYgfHwgIWl0ZW0ucmVmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaXRlbS5pZENvbm5lY3RlZCA9IGV2ZW50RGF0YS5kYXRhTGluZS5pZDtcbiAgICAgICAgICBldmVudERhdGEuZGF0YUxpbmUuaWRDb25uZWN0ZWQgPSBpdGVtLmlkO1xuICAgICAgICAgIHRoaXMub3V0Q29ubmVjdGVkLmVtaXQoe1xuICAgICAgICAgICAgZGF0YUxpbmU6IGRhdGFMaW5lLnJlZixcbiAgICAgICAgICAgIGRhdGFSZWFjaGFibGVQb2ludFJhbmdlOiBpdGVtLnJlZlxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVWaWV3Qm94KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVsZW1lbnRPZlBvaW50cyhwb2ludHM6IElQb2ludHMpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcG9pbnRzLm9uRGVzdHJveUV2ZW50Py5uZXh0KCk7XG4gICAgICBwb2ludHMub25EZXN0cm95RXZlbnQ/LmNvbXBsZXRlKCk7XG4gICAgICBwb2ludHM/LnBhdGhFbGVtZW50Py5yZW1vdmUoKTtcbiAgICAgIHBvaW50cz8uYXJyb3dFbGVtZW50Py5yZW1vdmUoKTtcbiAgICAgIHBvaW50cz8uY2lyY2xlU3RhcnRFbGVtZW50Py5yZW1vdmUoKTtcbiAgICAgIHBvaW50cy5jaXJjbGVFbmRFbGVtZW50Py5yZW1vdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0xpbmUoZGF0YTogSURyYXdMaW5lRGF0YUlucHV0KSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IHsgcG9pbnRzLCBtb2RlIH0gPSBkYXRhO1xuICAgICAgbGV0IHsgY3VydmUgfSA9IGRhdGE/LmxpbmVTdHlsZSB8fCB7fTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdxdWFydC1pbicpIHtcbiAgICAgICAgY3VydmUgPSBjdXJ2ZSA/PyAxMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByZUxlbmd0aFNlcGFyYXRlZFBvaW50cyA9IHBvaW50cy5zZXBhcmF0ZWRQb2ludHM/Lmxlbmd0aDtcblxuICAgICAgcG9pbnRzLnNlcGFyYXRlZFBvaW50cz8uZm9yRWFjaChzZXBhcmF0ZWRQb2ludHMgPT4gdGhpcy5yZW1vdmVFbGVtZW50T2ZQb2ludHMoc2VwYXJhdGVkUG9pbnRzKSk7XG4gICAgICBwb2ludHMuc2VwYXJhdGVkUG9pbnRzID0gW107XG4gICAgICBNb0NhbnZhc0Nvbm5lY3ROYXZpZ2F0aW9uTmV3RWxlbWVudFV0aWwuU1RBUlRfTU9ERSA9ICdyaWdodC1sZWZ0JztcbiAgICAgIGlmIChkYXRhLnN0YXJ0RW5kTW9kZSkge1xuICAgICAgICBNb0NhbnZhc0Nvbm5lY3ROYXZpZ2F0aW9uTmV3RWxlbWVudFV0aWwuU1RBUlRfTU9ERSA9IGRhdGEuc3RhcnRFbmRNb2RlO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxjdWxhdG9yU2VwYXJhdGVkUG9pbnRzKGRhdGEuaWQsIHBvaW50cywgY3VydmUgfHwgMTAsIHBvaW50cy5zZXBhcmF0ZWRQb2ludHMsIHBvaW50cy5vYnN0YWNsZVJlY3QgfHwgW10pO1xuICAgICAgaWYgKCFwcmVMZW5ndGhTZXBhcmF0ZWRQb2ludHMgJiYgcG9pbnRzLnNlcGFyYXRlZFBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFbGVtZW50T2ZQb2ludHMocG9pbnRzKTtcbiAgICAgICAgY29uc3QgeyBwYXRoRWxlbWVudCwgYXJyb3dFbGVtZW50IH0gPSB0aGlzLmNyZWF0ZVBhdGhBbmRBcnJvd0VsZW1lbnQoZGF0YS5pZCk7XG5cbiAgICAgICAgcG9pbnRzLnBhdGhFbGVtZW50ID0gcGF0aEVsZW1lbnQ7XG4gICAgICAgIHBvaW50cy5hcnJvd0VsZW1lbnQgPSBhcnJvd0VsZW1lbnQ7XG4gICAgICAgIHBvaW50cy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFwb2ludHMuc2VwYXJhdGVkUG9pbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5idWlsZFBhdGhBbmREcmF3KGRhdGEsIHBvaW50cywgbW9kZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgcGF0aCA9ICcnO1xuXG4gICAgICBwb2ludHMuc2VwYXJhdGVkUG9pbnRzLmZvckVhY2goc2VwYXJhdGVkUG9pbnRzID0+IHtcbiAgICAgICAgcGF0aCArPSB0aGlzLmJ1aWxkUGF0aEFuZERyYXdTZXBhcmF0ZWRQb2ludHMoZGF0YSwgc2VwYXJhdGVkUG9pbnRzLCBzZXBhcmF0ZWRQb2ludHMubW9kZSB8fCBtb2RlKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGF0aEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBhdGhcIik7XG5cbiAgICAgIHRoaXMuc3ZnRWxlbWVudC5hcHBlbmQocGF0aEVsZW1lbnQpO1xuICAgICAgcG9pbnRzLnBhdGhFbGVtZW50ID0gcGF0aEVsZW1lbnQ7XG4gICAgICBjb25zdCBzdHlsZUNvbmZpZyA9IHtcbiAgICAgICAgc3Ryb2tlOiBkYXRhLmxpbmVTdHlsZT8uc3Ryb2tlID8/ICcjOUNBMkFEJyxcbiAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiBkYXRhLmxpbmVTdHlsZT8uc3Ryb2tlRGFzaGFycmF5LFxuICAgICAgICBzdHJva2VXaWR0aDogZGF0YS5saW5lU3R5bGU/LnN0cm9rZVdpZHRoID8/ICcxcHgnLFxuICAgICAgICBmaWxsOiBkYXRhLmxpbmVTdHlsZT8uZmlsbCA/PyAnbm9uZScsXG4gICAgICAgIGN1cnZlOiBkYXRhLmxpbmVTdHlsZT8uY3VydmUgPz8gMTAsXG4gICAgICAgIGRpc3RhbmNlUG9pbnQ6IGRhdGEubGluZVN0eWxlPy5kaXN0YW5jZVBvaW50ID8/IDEwXG4gICAgICB9O1xuXG4gICAgICBwb2ludHMucGF0aEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgc3R5bGVDb25maWcuc3Ryb2tlKTtcbiAgICAgIHBvaW50cy5wYXRoRWxlbWVudD8uc2V0QXR0cmlidXRlKCdmaWxsJywgc3R5bGVDb25maWcuZmlsbCk7XG4gICAgICBwb2ludHMucGF0aEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgc3R5bGVDb25maWcuc3Ryb2tlV2lkdGgpO1xuICAgICAgaWYgKHN0eWxlQ29uZmlnLnN0cm9rZURhc2hhcnJheSkge1xuICAgICAgICBwb2ludHMucGF0aEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hhcnJheScsIHN0eWxlQ29uZmlnLnN0cm9rZURhc2hhcnJheSlcbiAgICAgIH1cbiAgICAgIHBvaW50cy5wYXRoRWxlbWVudD8uc2V0QXR0cmlidXRlKCdkJywgcGF0aCk7XG4gICAgICB0aGlzLmRyYXdSZWN0QW5kSW5pdEV2ZW50KGRhdGEsIG1vZGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaWV3Qm94KHZpZXdCb3hDb25maWc/OiBJVmlld0JveENvbmZpZykge1xuICAgIGlmICh2aWV3Qm94Q29uZmlnKSB7XG4gICAgICB0aGlzLnZpZXdCb3hDb25maWcgPSB2aWV3Qm94Q29uZmlnO1xuICAgIH1cbiAgICBjb25zdCB4UG9pbnRzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoWzBdKTtcbiAgICBjb25zdCB5UG9pbnRzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoWzBdKTtcblxuICAgIGNvbnN0IGFkZFBvaW50cyA9IChwb2ludHM6IElQb2ludHMpID0+IHtcbiAgICAgIHhQb2ludHMuYWRkKHBvaW50cy5zdGFydC54KTtcbiAgICAgIHhQb2ludHMuYWRkKHBvaW50cy5lbmQueCk7XG4gICAgICB5UG9pbnRzLmFkZChwb2ludHMuc3RhcnQueSk7XG4gICAgICB5UG9pbnRzLmFkZChwb2ludHMuZW5kLnkpO1xuICAgIH07XG5cbiAgICB0aGlzLmRhdGFEcmF3Py5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgcG9pbnRzID0gaXRlbS5wb2ludHM7XG5cbiAgICAgIGFkZFBvaW50cyhwb2ludHMpO1xuICAgICAgcG9pbnRzLnNlcGFyYXRlZFBvaW50cz8uZm9yRWFjaChzZXBhcmF0ZWRQb2ludHMgPT4gYWRkUG9pbnRzKHNlcGFyYXRlZFBvaW50cykpO1xuICAgICAgcG9pbnRzLm9ic3RhY2xlUmVjdD8uZm9yRWFjaChvYnN0YWNsZVJlY3QgPT4ge1xuICAgICAgICBhZGRQb2ludHMoe1xuICAgICAgICAgIHN0YXJ0OiB7IHg6IG9ic3RhY2xlUmVjdC54IC0gKG9ic3RhY2xlUmVjdC5nYXBYT2JzdGFjbGVSZWN0IHx8IDgpLCB5OiBvYnN0YWNsZVJlY3QueSAtIChvYnN0YWNsZVJlY3QuZ2FwWU9ic3RhY2xlUmVjdCB8fCA4KSB9LFxuICAgICAgICAgIGVuZDogeyB4OiBvYnN0YWNsZVJlY3QueCArIG9ic3RhY2xlUmVjdC53aWR0aCArIChvYnN0YWNsZVJlY3QuZ2FwWE9ic3RhY2xlUmVjdCB8fCA4KSAqIDIsIHk6IG9ic3RhY2xlUmVjdC55ICsgb2JzdGFjbGVSZWN0LmhlaWdodCArIChvYnN0YWNsZVJlY3QuZ2FwWU9ic3RhY2xlUmVjdCB8fCA4KSAqIDIgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeE1heCA9IHRoaXMudmlld0JveENvbmZpZz8ud2lkdGggPz8gKHhQb2ludHMuc2l6ZSA/IE1hdGgubWF4KC4uLnhQb2ludHMpIDogMCkgKyAxNDtcbiAgICBjb25zdCB5TWF4ID0gdGhpcy52aWV3Qm94Q29uZmlnPy5oZWlnaHQgPz8gKHlQb2ludHMuc2l6ZSA/IE1hdGgubWF4KC4uLnlQb2ludHMpIDogMCkgKyAxNDtcblxuICAgIGlmICghdGhpcy52aWV3Qm94Q29uZmlnPy5pZ25vcmVWaWV3Qm94KSB7XG4gICAgICBjb25zdCByZWN0U3ZnRWxlbWVudCA9IHRoaXMuc3ZnRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgdGhpcy5zdmdFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCBgJHt0aGlzLnZpZXdCb3hDb25maWc/Lm1pblggPz8gcmVjdFN2Z0VsZW1lbnQueH0gJHt0aGlzLnZpZXdCb3hDb25maWc/Lm1pblkgPz8gcmVjdFN2Z0VsZW1lbnQueX0gJHt4TWF4fSAke3lNYXh9YCk7XG4gICAgfVxuICAgIHRoaXMuc3ZnRWxlbWVudD8uc2V0QXR0cmlidXRlKCd3aWR0aCcsIGAke3hNYXggPz8gMH1gKTtcbiAgICB0aGlzLnN2Z0VsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgYCR7eU1heCA/PyAwfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BvaW50SW5zaWRlU3F1YXJlKHBvaW50OiBJUG9pbnQsIHNxdWFyZTogSVJlY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHBvaW50O1xuICAgIGNvbnN0IHsgeDogc3F1YXJlWCwgeTogc3F1YXJlWSwgd2lkdGgsIGhlaWdodCB9ID0gc3F1YXJlO1xuXG4gICAgcmV0dXJuIHggPj0gc3F1YXJlWCAmJiB4IDw9IHNxdWFyZVggKyB3aWR0aCAmJiB5ID49IHNxdWFyZVkgJiYgeSA8PSBzcXVhcmVZICsgaGVpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdG9yU2VwYXJhdGVkUG9pbnRzKG5hbWU6IHN0cmluZywgcG9pbnRzOiBJUG9pbnRzLCBjdXJ2ZTogbnVtYmVyLCBzZXBhcmF0ZWRQb2ludHM6IEFycmF5PElQb2ludHM+LCBvYnN0YWNsZVJlY3RzOiBBcnJheTxJUmVjdD4pIHtcbiAgICBpZiAoIW9ic3RhY2xlUmVjdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudFN0YXJ0ID0gb2JzdGFjbGVSZWN0cy5maW5kKGl0ZW0gPT4gdGhpcy5pc1BvaW50SW5zaWRlU3F1YXJlKHBvaW50cy5zdGFydCwgaXRlbSkpO1xuICAgIGNvbnN0IGVsZW1lbnRFbmQgPSBvYnN0YWNsZVJlY3RzLmZpbmQoaXRlbSA9PiB0aGlzLmlzUG9pbnRJbnNpZGVTcXVhcmUocG9pbnRzLmVuZCwgaXRlbSkpO1xuXG4gICAgaWYgKHRoaXMudmlld0JveENvbmZpZz8ubWFyZ2luQmV0d2VlbkVsZW1lbnQpIHtcbiAgICAgIE1vQ2FudmFzQ29ubmVjdE5hdmlnYXRpb25OZXdFbGVtZW50VXRpbC5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUID0gdGhpcy52aWV3Qm94Q29uZmlnPy5tYXJnaW5CZXR3ZWVuRWxlbWVudCA/PyAzMjtcbiAgICB9XG4gICAgTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbk5ld0VsZW1lbnRVdGlsLnNldFhZQ29ubmVjdEVsZW1lbnRzKGVsZW1lbnRTdGFydCA/PyB7IC4uLnBvaW50cy5zdGFydCwgd2lkdGg6IDEsIGhlaWdodDogMSB9LCBlbGVtZW50RW5kID8/IHsgLi4ucG9pbnRzLmVuZCwgd2lkdGg6IDEsIGhlaWdodDogMSB9LCBvYnN0YWNsZVJlY3RzLCBzZXBhcmF0ZWRQb2ludHMsIGN1cnZlKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRQYXRoQW5kRHJhdyhkYXRhOiBJRHJhd0xpbmVEYXRhSW5wdXQsIHBvaW50czogSVBvaW50cywgbW9kZT86IFRZUEVfTU9ERSkge1xuICAgIGxldCBkUGF0aCA9IHt9IGFzIElBdHRyaWJ1dGVET25QYXRoO1xuICAgIGNvbnN0IHN0eWxlQ29uZmlnID0ge1xuICAgICAgc3Ryb2tlOiBkYXRhLmxpbmVTdHlsZT8uc3Ryb2tlID8/ICcjOUNBMkFEJyxcbiAgICAgIHN0cm9rZURhc2hhcnJheTogZGF0YS5saW5lU3R5bGU/LnN0cm9rZURhc2hhcnJheSxcbiAgICAgIHN0cm9rZVdpZHRoOiBkYXRhLmxpbmVTdHlsZT8uc3Ryb2tlV2lkdGggPz8gJzFweCcsXG4gICAgICBmaWxsOiBkYXRhLmxpbmVTdHlsZT8uZmlsbCA/PyAnbm9uZScsXG4gICAgICBjdXJ2ZTogZGF0YS5saW5lU3R5bGU/LmN1cnZlID8/IDEwLFxuICAgICAgZGlzdGFuY2VQb2ludDogZGF0YS5saW5lU3R5bGU/LmRpc3RhbmNlUG9pbnQgPz8gMTBcbiAgICB9O1xuXG4gICAgcG9pbnRzLnBhdGhFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHN0eWxlQ29uZmlnLnN0cm9rZSk7XG4gICAgcG9pbnRzLnBhdGhFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBzdHlsZUNvbmZpZy5maWxsKTtcbiAgICBwb2ludHMucGF0aEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgc3R5bGVDb25maWcuc3Ryb2tlV2lkdGgpO1xuICAgIGlmIChzdHlsZUNvbmZpZy5zdHJva2VEYXNoYXJyYXkpIHtcbiAgICAgIHBvaW50cy5wYXRoRWxlbWVudD8uc2V0QXR0cmlidXRlKCdzdHJva2UtZGFzaGFycmF5Jywgc3R5bGVDb25maWcuc3Ryb2tlRGFzaGFycmF5KTtcbiAgICB9XG4gICAgbGV0IHsgY3VydmUsIGRpc3RhbmNlUG9pbnQgfSA9IHN0eWxlQ29uZmlnO1xuXG4gICAgbW9kZSA9IG1vZGUgfHwgXCJxdWFydC1pblwiO1xuICAgIGlmIChtb2RlICE9PSAncXVhcnQtaW4nKSB7XG4gICAgICBjdXJ2ZSA9IGN1cnZlID8/IDEwO1xuICAgICAgZGlzdGFuY2VQb2ludCA9IGRpc3RhbmNlUG9pbnQgPz8gMTA7XG4gICAgfVxuICAgIGlmIChtb2RlID09PSAncXVhcnQtaW4nIHx8IHBvaW50cy5zdGFydC54ID09PSBwb2ludHMuZW5kLnggfHwgcG9pbnRzLnN0YXJ0LnkgPT09IHBvaW50cy5lbmQueSkge1xuICAgICAgdGhpcy5kcmF3QmFsYW5jZWRDdXJ2ZShkUGF0aCwgcG9pbnRzKTtcblxuICAgICAgaWYgKG1vZGUgPT09ICdxdWFydC1pbicpIHtcbiAgICAgICAgZFBhdGggPSB7fSBhcyBJQXR0cmlidXRlRE9uUGF0aDtcbiAgICAgICAgdGhpcy5kcmF3QmVuZEJvdGhFbmRzQ3VydmUoZFBhdGgsIHBvaW50cyk7XG4gICAgICB9XG4gICAgICBwb2ludHMucGF0aEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnZCcsIHRoaXMuYnVpbERBdHRyaWJ1dGVUb1N0cmluZyhkUGF0aCkpO1xuICAgICAgdGhpcy5kcmF3UmVjdEFuZEluaXRFdmVudChkYXRhLCBtb2RlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNhbGN1bGF0b3JEaXN0YW5jZVBvaW50QW5kQ3VydmUocG9pbnRzLCBkaXN0YW5jZVBvaW50LCBjdXJ2ZSwgbW9kZSk7XG5cbiAgICBkaXN0YW5jZVBvaW50ID0gcmVzdWx0LmRpc3RhbmNlUG9pbnQ7XG4gICAgY3VydmUgPSByZXN1bHQuY3VydmU7XG5cbiAgICB0aGlzLmJ1aWxkREF0dHJpYnV0ZUJ5UG9pbnRFbmRNb2RlSG9yaXpvbnRhbChkUGF0aCwgcG9pbnRzLCBkaXN0YW5jZVBvaW50IHx8IDAsIGN1cnZlIHx8IDAsIG1vZGUpO1xuICAgIHRoaXMuYnVpbGREQXR0cmlidXRlQnlQb2ludEVuZE1vZGVWZXJ0aWNhbChkUGF0aCwgcG9pbnRzLCBkaXN0YW5jZVBvaW50IHx8IDAsIGN1cnZlIHx8IDAsIG1vZGUpO1xuICAgIHBvaW50cy5wYXRoRWxlbWVudD8uc2V0QXR0cmlidXRlKCdkJywgdGhpcy5idWlsREF0dHJpYnV0ZVRvU3RyaW5nKGRQYXRoKSk7XG4gICAgdGhpcy5kcmF3UmVjdEFuZEluaXRFdmVudChkYXRhLCBtb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRvckRpc3RhbmNlUG9pbnRBbmRDdXJ2ZShwb2ludHM6IElQb2ludHMsIGRpc3RhbmNlUG9pbnQ6IG51bWJlciwgY3VydmU6IG51bWJlciwgbW9kZTogVFlQRV9NT0RFKSB7XG4gICAgaWYgKCghbW9kZS5pbmNsdWRlcygndmVydGljYWwnKSAmJiAhbW9kZS5pbmNsdWRlcygnaG9yaXpvbnRhbCcpKSkge1xuICAgICAgcmV0dXJuIHsgY3VydmUsIGRpc3RhbmNlUG9pbnQgfTtcbiAgICB9XG4gICAgY29uc3QgZ2FwWCA9IE1hdGguYWJzKHBvaW50cy5zdGFydC54IC0gcG9pbnRzLmVuZC54KTtcbiAgICBjb25zdCBnYXBZID0gTWF0aC5hYnMocG9pbnRzLnN0YXJ0LnkgLSBwb2ludHMuZW5kLnkpO1xuICAgIGNvbnN0IG11bHRpcGxpZXJDdXJ2ZSA9IG1vZGUuaW5jbHVkZXMoJ2hvcml6b250YWwnKSA/IDEgOiAyO1xuICAgIGNvbnN0IG11bHRpcGxpZXJEaXN0YW5jZSA9IG1vZGUuaW5jbHVkZXMoJ2hvcml6b250YWwnKSA/IDIgOiAxO1xuXG4gICAgaWYgKCFtb2RlLmluY2x1ZGVzKCdzaW5nbGUtY3VydmUnKSkge1xuICAgICAgaWYgKGdhcFggPCBkaXN0YW5jZVBvaW50ICogbXVsdGlwbGllckRpc3RhbmNlICsgY3VydmUgKiBtdWx0aXBsaWVyQ3VydmUpIHtcbiAgICAgICAgZGlzdGFuY2VQb2ludCA9IGN1cnZlID0gZ2FwWCAvIDM7XG4gICAgICB9XG4gICAgICBpZiAoZ2FwWSA8IGRpc3RhbmNlUG9pbnQgKiBtdWx0aXBsaWVyRGlzdGFuY2UgKyBjdXJ2ZSAqIG11bHRpcGxpZXJDdXJ2ZSkge1xuICAgICAgICBkaXN0YW5jZVBvaW50ID0gY3VydmUgPSBnYXBZIC8gMztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY3VydmUsIGRpc3RhbmNlUG9pbnQgfTtcbiAgICB9XG4gICAgY29uc3QgbWluR2FwID0gTWF0aC5taW4oZ2FwWCwgZ2FwWSk7XG5cbiAgICBpZiAobWluR2FwIDwgZGlzdGFuY2VQb2ludCkge1xuICAgICAgZGlzdGFuY2VQb2ludCA9IG1pbkdhcDtcbiAgICB9XG4gICAgaWYgKG1pbkdhcCA8IGN1cnZlKSB7XG4gICAgICBjdXJ2ZSA9IG1pbkdhcDtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjdXJ2ZSwgZGlzdGFuY2VQb2ludCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3UmVjdEFuZEluaXRFdmVudChkYXRhOiBJRHJhd0xpbmVEYXRhSW5wdXQsIG1vZGU6IFRZUEVfTU9ERSkge1xuICAgIGNvbnN0IHBvaW50cyA9IGRhdGEucG9pbnRzO1xuXG4gICAgdGhpcy51cGRhdGVTdHlsZUFycm93KHBvaW50cywgbW9kZSwgZGF0YSk7XG4gICAgaWYgKGRhdGEuc3RhcnRDaXJjbGUgJiYgcG9pbnRzLmNpcmNsZVN0YXJ0RWxlbWVudCkge1xuICAgICAgdGhpcy51cGRhdGVBdHRyaWJ1dGVDaXJjbGUocG9pbnRzLmNpcmNsZVN0YXJ0RWxlbWVudCwgZGF0YS5pZCwgcG9pbnRzLnN0YXJ0LCBkYXRhLnN0YXJ0Q2lyY2xlU3R5bGUpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5lbmRDaXJjbGUgJiYgcG9pbnRzLmNpcmNsZUVuZEVsZW1lbnQpIHtcbiAgICAgIHRoaXMudXBkYXRlQXR0cmlidXRlQ2lyY2xlKHBvaW50cy5jaXJjbGVFbmRFbGVtZW50LCBkYXRhLmlkLCBwb2ludHMuZW5kLCBkYXRhLmVuZENpcmNsZVN0eWxlKTtcbiAgICB9XG4gICAgdGhpcy5pbml0RXZlbnQoZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIGRyYXdCYWxhbmNlZEN1cnZlKGRQYXRoOiBJQXR0cmlidXRlRE9uUGF0aCwgcG9pbnRzOiBJUG9pbnRzKSB7XG4gICAgZFBhdGguTSA9IHsgeDogcG9pbnRzLnN0YXJ0LngsIHk6IHBvaW50cy5zdGFydC55IH07XG4gICAgZFBhdGguUSA9IFt7IHg6IHBvaW50cy5zdGFydC54ICsgKHBvaW50cy5lbmQueCAtIHBvaW50cy5zdGFydC54KSAvIDQsIHk6IHBvaW50cy5zdGFydC55ICsgKHBvaW50cy5lbmQueSAtIHBvaW50cy5zdGFydC55KSAvIDIgfSwgeyB4OiBwb2ludHMuc3RhcnQueCArIChwb2ludHMuZW5kLnggLSBwb2ludHMuc3RhcnQueCkgLyAyLCB5OiBwb2ludHMuc3RhcnQueSArIChwb2ludHMuZW5kLnkgLSBwb2ludHMuc3RhcnQueSkgLyAyIH1dO1xuICAgIGRQYXRoLlEyID0gW3sgeDogcG9pbnRzLmVuZC54IC0gKHBvaW50cy5lbmQueCAtIHBvaW50cy5zdGFydC54KSAvIDQsIHk6IHBvaW50cy5zdGFydC55ICsgKHBvaW50cy5lbmQueSAtIHBvaW50cy5zdGFydC55KSAvIDIgfSwgeyB4OiBwb2ludHMuZW5kLngsIHk6IHBvaW50cy5lbmQueSB9XTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0JlbmRCb3RoRW5kc0N1cnZlKGRQYXRoOiBJQXR0cmlidXRlRE9uUGF0aCwgcG9pbnRzOiBJUG9pbnRzKSB7XG4gICAgY29uc3QgcG9pbnRYQ3VydmUgPSAocG9pbnRzLnN0YXJ0LnggKyBwb2ludHMuZW5kLngpICogMC41O1xuICAgIGNvbnN0IHBvaW50Q29udHJvbDEgPSB7IHg6IHBvaW50WEN1cnZlLCB5OiBwb2ludHMuc3RhcnQueSB9O1xuICAgIGNvbnN0IHBvaW50Q29udHJvbDIgPSB7IHg6IHBvaW50WEN1cnZlLCB5OiBwb2ludHMuZW5kLnkgfTtcblxuICAgIGRQYXRoLk0gPSB7IHg6IHBvaW50cy5zdGFydC54LCB5OiBwb2ludHMuc3RhcnQueSB9O1xuICAgIGRQYXRoLkMgPSBbeyB4OiBwb2ludENvbnRyb2wxLngsIHk6IHBvaW50Q29udHJvbDEueSB9LCB7IHg6IHBvaW50Q29udHJvbDIueCwgeTogcG9pbnRDb250cm9sMi55IH0sIHsgeDogcG9pbnRzLmVuZC54LCB5OiBwb2ludHMuZW5kLnkgfV07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkREF0dHJpYnV0ZUJ5UG9pbnRFbmRNb2RlSG9yaXpvbnRhbChkUGF0aDogSUF0dHJpYnV0ZURPblBhdGgsIHBvaW50czogSVBvaW50cywgZGlzdGFuY2VQb2ludDogbnVtYmVyLCBjdXJ2ZTogbnVtYmVyLCBtb2RlOiBUWVBFX01PREUpIHtcbiAgICBpZiAoIW1vZGUuaW5jbHVkZXMoJ2hvcml6b250YWwnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtdWx0aXBsaWVyWCA9IHBvaW50cy5zdGFydC54IDwgcG9pbnRzLmVuZC54ID8gLTEgOiAxO1xuICAgIGNvbnN0IG11bHRpcGxpZXJZID0gcG9pbnRzLnN0YXJ0LnkgPCBwb2ludHMuZW5kLnkgPyAxIDogLTE7XG4gICAgY29uc3QgcmV2ZXJzZU11bHRpcGxpZXIgPSAtMTtcblxuICAgIGRQYXRoLk0gPSB7IHg6IHBvaW50cy5zdGFydC54LCB5OiBwb2ludHMuc3RhcnQueSB9O1xuICAgIGRQYXRoLkwgPSB7IHg6IHBvaW50cy5lbmQueCArICgoZGlzdGFuY2VQb2ludCAqIDIgKyBjdXJ2ZSkgKiBtdWx0aXBsaWVyWCksIHk6IHBvaW50cy5zdGFydC55IH07XG4gICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2hvcml6b250YWwtc2luZ2xlJykpIHtcbiAgICAgIGRQYXRoLkwueCA9IHBvaW50cy5lbmQueCArIChjdXJ2ZSAqIG11bHRpcGxpZXJYKTtcbiAgICB9XG4gICAgZFBhdGguUSA9IFt7IHg6IGRQYXRoLkwueCArIChjdXJ2ZSAqIG11bHRpcGxpZXJYICogcmV2ZXJzZU11bHRpcGxpZXIpLCB5OiBwb2ludHMuc3RhcnQueSB9LCB7IHg6IGRQYXRoLkwueCArIChjdXJ2ZSAqIG11bHRpcGxpZXJYICogcmV2ZXJzZU11bHRpcGxpZXIpLCB5OiBwb2ludHMuc3RhcnQueSArIChjdXJ2ZSAqIG11bHRpcGxpZXJZKSB9XTtcbiAgICBkUGF0aC5MMiA9IHsgeDogZFBhdGguUVsxXS54LCB5OiBwb2ludHMuZW5kLnkgKyAoY3VydmUgKiBtdWx0aXBsaWVyWSAqIHJldmVyc2VNdWx0aXBsaWVyKSB9O1xuICAgIGlmIChtb2RlLmluY2x1ZGVzKCdob3Jpem9udGFsLXNpbmdsZScpKSB7XG4gICAgICBkUGF0aC5MMiA9IHBvaW50cy5lbmQ7XG4gICAgfVxuICAgIGlmIChtb2RlID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIGRQYXRoLlEyID0gW3sgeDogZFBhdGguTDIueCwgeTogcG9pbnRzLmVuZC55IH0sIHsgeDogZFBhdGguTDIueCArIChkaXN0YW5jZVBvaW50ICogbXVsdGlwbGllclggKiByZXZlcnNlTXVsdGlwbGllciksIHk6IHBvaW50cy5lbmQueSB9XTtcbiAgICAgIGRQYXRoLkwzID0geyB4OiBwb2ludHMuZW5kLngsIHk6IHBvaW50cy5lbmQueSB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREQXR0cmlidXRlQnlQb2ludEVuZE1vZGVWZXJ0aWNhbChkUGF0aDogSUF0dHJpYnV0ZURPblBhdGgsIHBvaW50czogSVBvaW50cywgZGlzdGFuY2VQb2ludDogbnVtYmVyLCBjdXJ2ZTogbnVtYmVyLCBtb2RlOiBUWVBFX01PREUpIHtcbiAgICBpZiAoIW1vZGUuaW5jbHVkZXMoJ3ZlcnRpY2FsJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbXVsdGlwbGllclggPSBwb2ludHMuc3RhcnQueCA8IHBvaW50cy5lbmQueCA/IC0xIDogMTtcbiAgICBjb25zdCBtdWx0aXBsaWVyWSA9IHBvaW50cy5zdGFydC55IDwgcG9pbnRzLmVuZC55ID8gMSA6IC0xO1xuICAgIGNvbnN0IHJldmVyc2VNdWx0aXBsaWVyID0gLTE7XG5cbiAgICBkUGF0aC5NID0gcG9pbnRzLnN0YXJ0O1xuICAgIGRQYXRoLkwgPSB7IHg6IHBvaW50cy5zdGFydC54LCB5OiBwb2ludHMuc3RhcnQueSArIChkaXN0YW5jZVBvaW50ICogbXVsdGlwbGllclkpIH07XG4gICAgaWYgKG1vZGUuaW5jbHVkZXMoJ3ZlcnRpY2FsLXNpbmdsZScpKSB7XG4gICAgICBkUGF0aC5MLnkgPSBwb2ludHMuZW5kLnkgKyAoZGlzdGFuY2VQb2ludCAqIG11bHRpcGxpZXJZICogcmV2ZXJzZU11bHRpcGxpZXIpO1xuICAgIH1cbiAgICBkUGF0aC5RID0gW3sgeDogZFBhdGguTC54LCB5OiBkUGF0aC5MLnkgKyAoY3VydmUgKiBtdWx0aXBsaWVyWSkgfSwgeyB4OiBkUGF0aC5MLnggKyAoY3VydmUgKiBtdWx0aXBsaWVyWCAqIHJldmVyc2VNdWx0aXBsaWVyKSwgeTogZFBhdGguTC55ICsgKGN1cnZlICogbXVsdGlwbGllclkpIH1dO1xuICAgIGRQYXRoLkwyID0geyB4OiBwb2ludHMuZW5kLnggKyAoKGN1cnZlICogMikgKiBtdWx0aXBsaWVyWCksIHk6IGRQYXRoLlFbMV0ueSB9O1xuICAgIGlmIChtb2RlLmluY2x1ZGVzKCd2ZXJ0aWNhbC1zaW5nbGUnKSkge1xuICAgICAgZFBhdGguTDIgPSBwb2ludHMuZW5kO1xuICAgIH1cbiAgICBpZiAobW9kZSA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgZFBhdGguUTIgPSBbeyB4OiBwb2ludHMuZW5kLngsIHk6IGRQYXRoLkwyLnkgfSwgeyB4OiBwb2ludHMuZW5kLngsIHk6IGRQYXRoLkwyLnkgKyAoY3VydmUgKiBtdWx0aXBsaWVyWSkgfV07XG4gICAgICBkUGF0aC5MMyA9IHsgeDogcG9pbnRzLmVuZC54LCB5OiBwb2ludHMuZW5kLnkgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxEQXR0cmlidXRlVG9TdHJpbmcoZEF0dHJpYnV0ZTogSUF0dHJpYnV0ZURPblBhdGgpOiBzdHJpbmcge1xuICAgIGxldCBkU3RyaW5nID0gJyc7XG5cbiAgICBPYmplY3Qua2V5cyhkQXR0cmlidXRlKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0KGRBdHRyaWJ1dGUsIGtleSk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IFtwb2ludDEsIHBvaW50MiwgcG9pbnQzXSA9IGRhdGE7XG5cbiAgICAgICAgZFN0cmluZyA9IGAke2RTdHJpbmd9JHtrZXkucmVwbGFjZSgvXFxkL2csICcnKX0ke3BvaW50MS54fSwke3BvaW50MS55fSAke3BvaW50Mi54fSwke3BvaW50Mi55fSR7cG9pbnQzID8gJyAnICsgcG9pbnQzLnggKyAnLCcgKyBwb2ludDMueSA6ICcnfVxuICAgICAgICBgO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRTdHJpbmcgPSBgJHtkU3RyaW5nfSR7a2V5LnJlcGxhY2UoL1xcZC9nLCAnJyl9JHtkYXRhLnh9LCR7ZGF0YS55fVxuICAgICAgYDtcbiAgICB9KTtcblxuICAgIHJldHVybiBkU3RyaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdHlsZUFycm93KHBvaW50czogSVBvaW50cywgbW9kZTogVFlQRV9NT0RFLCBkYXRhOiBJRHJhd0xpbmVEYXRhSW5wdXQpIHtcbiAgICBpZiAoIXBvaW50cy5hcnJvd0VsZW1lbnQgfHwgZGF0YS5pZ25vcmVEcmF3QXJyb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3R5bGVDb25maWcgPSB7XG4gICAgICBmaWxsOiBkYXRhLmFycm93U3R5bGU/LmZpbGwgPz8gJyM5Q0EyQUQnLFxuICAgICAgc3Ryb2tlOiBkYXRhLmFycm93U3R5bGU/LnN0cm9rZSA/PyAnbm9uZScsXG4gICAgICBzdHJva2VXaWR0aDogZGF0YS5hcnJvd1N0eWxlPy5zdHJva2VXaWR0aCA/PyAnMCcsXG4gICAgICB3aWR0aDogZGF0YS5hcnJvd1N0eWxlPy53aWR0aCA/PyA2LFxuICAgICAgaGVpZ2h0OiBkYXRhLmFycm93U3R5bGU/LmhlaWdodCA/PyA4XG4gICAgfTtcbiAgICBjb25zdCBwb2ludEVuZCA9IGNsb25lRGVlcChwb2ludHMuZW5kKTtcbiAgICBjb25zdCBhcnJvd0VsZW1lbnQgPSBwb2ludHMuYXJyb3dFbGVtZW50O1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGRhdGEuYXJyb3dEaXJlY3Rpb24gfHwgdGhpcy5nZXREaXJlY3Rpb24ocG9pbnRzLCBkYXRhLnN0YXJ0RW5kTW9kZSk7XG5cblxuXG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2hvcml6b250YWwnKSB8fCBtb2RlLmluY2x1ZGVzKCd2ZXJ0aWNhbCcpKSB7XG4gICAgICAgICAgcG9pbnRFbmQueCAtPSBzdHlsZUNvbmZpZy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgYXJyb3dFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIGAke3BvaW50RW5kLnh9LCR7cG9pbnRFbmQueSAtIHN0eWxlQ29uZmlnLndpZHRofSAgJHtwb2ludEVuZC54ICsgc3R5bGVDb25maWcuaGVpZ2h0fSwke3BvaW50RW5kLnl9ICR7cG9pbnRFbmQueH0sJHtwb2ludEVuZC55ICsgc3R5bGVDb25maWcud2lkdGh9IGApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGlmIChtb2RlLmluY2x1ZGVzKCdob3Jpem9udGFsJykgfHwgbW9kZS5pbmNsdWRlcygndmVydGljYWwnKSkge1xuICAgICAgICAgIHBvaW50RW5kLnggKz0gc3R5bGVDb25maWcuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGFycm93RWxlbWVudD8uc2V0QXR0cmlidXRlKCdwb2ludHMnLCBgJHtwb2ludEVuZC54fSwke3BvaW50RW5kLnkgLSBzdHlsZUNvbmZpZy53aWR0aH0gICR7cG9pbnRFbmQueCAtIHN0eWxlQ29uZmlnLmhlaWdodH0sJHtwb2ludEVuZC55fSAke3BvaW50RW5kLnh9LCR7cG9pbnRFbmQueSArIHN0eWxlQ29uZmlnLndpZHRofSBgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIGlmIChtb2RlLmluY2x1ZGVzKCdob3Jpem9udGFsJykgfHwgbW9kZS5pbmNsdWRlcygndmVydGljYWwnKSkge1xuICAgICAgICAgIHBvaW50RW5kLnkgKz0gc3R5bGVDb25maWcuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGFycm93RWxlbWVudD8uc2V0QXR0cmlidXRlKCdwb2ludHMnLCBgJHtwb2ludEVuZC54IC0gc3R5bGVDb25maWcud2lkdGh9LCR7cG9pbnRFbmQueX0gICR7cG9pbnRFbmQueH0sJHtwb2ludEVuZC55IC0gc3R5bGVDb25maWcuaGVpZ2h0fSAke3BvaW50RW5kLnggKyBzdHlsZUNvbmZpZy53aWR0aH0sJHtwb2ludEVuZC55fSBgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIGlmIChtb2RlLmluY2x1ZGVzKCdob3Jpem9udGFsJykgfHwgbW9kZS5pbmNsdWRlcygndmVydGljYWwnKSkge1xuICAgICAgICAgIHBvaW50RW5kLnkgLT0gc3R5bGVDb25maWcuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGFycm93RWxlbWVudD8uc2V0QXR0cmlidXRlKCdwb2ludHMnLCBgJHtwb2ludEVuZC54IC0gc3R5bGVDb25maWcud2lkdGh9LCR7cG9pbnRFbmQueX0gICR7cG9pbnRFbmQueH0sJHtwb2ludEVuZC55ICsgc3R5bGVDb25maWcuaGVpZ2h0fSAke3BvaW50RW5kLnggKyBzdHlsZUNvbmZpZy53aWR0aH0sJHtwb2ludEVuZC55fSBgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXJyb3dFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBzdHlsZUNvbmZpZy5maWxsKTtcbiAgICBhcnJvd0VsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgc3R5bGVDb25maWcuc3Ryb2tlKTtcbiAgICBhcnJvd0VsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgc3R5bGVDb25maWcuc3Ryb2tlV2lkdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBdHRyaWJ1dGVDaXJjbGUoY2lyY2xlRWxlbWVudDogU1ZHQ2lyY2xlRWxlbWVudCwgbmFtZTogc3RyaW5nLCBwb2ludDogeyB4OiBudW1iZXIsIHk6IG51bWJlciB9LCBjaXJjbGVTdHlsZT86IElDaXJjbGVTdHlsZSkge1xuICAgIGNpcmNsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCduYW1lJywgbmFtZSk7XG4gICAgY2lyY2xlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2N4JywgYCR7cG9pbnQueH1gKTtcbiAgICBjaXJjbGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnY3knLCBgJHtwb2ludC55fWApO1xuICAgIGNpcmNsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyJywgYCR7Y2lyY2xlU3R5bGU/LnIgPz8gMn1gKTtcbiAgICBjaXJjbGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZmlsbCcsIGAke2NpcmNsZVN0eWxlPy5maWxsID8/ICdncmVlbid9YCk7XG4gICAgY2lyY2xlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGAke2NpcmNsZVN0eWxlPy5zdHJva2UgPz8gJyM5Q0EyQUQnfWApO1xuICAgIGNpcmNsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBgJHtjaXJjbGVTdHlsZT8uc3Ryb2tlV2lkdGggPz8gJzFweCd9YCk7XG5cbiAgICByZXR1cm4gY2lyY2xlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGlyZWN0aW9uKHBvaW50czogSVBvaW50cywgc3RhcnRFbmRNb2RlOiAncmlnaHQtbGVmdCcgfCAnYm90dG9tLXRvcCcgfCAnYm90dG9tLWxlZnQnIHwgdW5kZWZpbmVkKTogVFlQRV9ESVJFQ1RJT04ge1xuICAgIGxldCBwb2ludFN0YXJ0ID0geyAuLi5wb2ludHMuc3RhcnQgfTtcblxuICAgIGlmIChwb2ludHMuc2VwYXJhdGVkUG9pbnRzKSB7XG4gICAgICBjb25zdCBsaW5lVG9FbmQgPSBwb2ludHMuc2VwYXJhdGVkUG9pbnRzLmZpbmQoaXRlbSA9PiBpdGVtLmVuZC54ID09PSBwb2ludHMuZW5kLnggJiYgaXRlbS5lbmQueSA9PT0gcG9pbnRzLmVuZC55KTtcblxuICAgICAgaWYgKGxpbmVUb0VuZCkge1xuICAgICAgICBwb2ludFN0YXJ0ID0gbGluZVRvRW5kLnN0YXJ0O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtb2RlSG9yaXpvbnRhbCA9IHBvaW50U3RhcnQueCA8IHBvaW50cy5lbmQueCA/ICdyaWdodCcgOiAnbGVmdCc7XG4gICAgY29uc3QgbW9kZVZlcnRpY2FsID0gcG9pbnRTdGFydC55IDwgcG9pbnRzLmVuZC55ID8gJ2JvdHRvbScgOiAndG9wJztcblxuICAgIGlmICghc3RhcnRFbmRNb2RlKSB7XG4gICAgICBpZiAoTWF0aC5hYnMocG9pbnRzLmVuZC54IC0gcG9pbnRTdGFydC54KSA+IE1hdGguYWJzKHBvaW50cy5lbmQueSAtIHBvaW50U3RhcnQueSkpIHtcbiAgICAgICAgcmV0dXJuIG1vZGVIb3Jpem9udGFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbW9kZVZlcnRpY2FsO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc3RhcnRFbmRNb2RlKSB7XG4gICAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIHJldHVybiBtb2RlSG9yaXpvbnRhbDtcblxuICAgICAgY2FzZSAncmlnaHQtbGVmdCc6XG4gICAgICAgIHJldHVybiBtb2RlSG9yaXpvbnRhbDtcblxuICAgICAgY2FzZSAnYm90dG9tLXRvcCc6XG4gICAgICAgIHJldHVybiBtb2RlVmVydGljYWw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0RXZlbnQoZGF0YTogSURyYXdMaW5lRGF0YUlucHV0KSB7XG4gICAgY29uc3QgcG9pbnRzOiBJUG9pbnRzID0gZGF0YS5wb2ludHM7XG4gICAgbGV0IHByZUV2ZW50OiBNb3VzZUV2ZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCghcG9pbnRzLmFycm93RWxlbWVudCAmJiAhcG9pbnRzLmNpcmNsZUVuZEVsZW1lbnQpIHx8ICFwb2ludHMub25EZXN0cm95RXZlbnQgfHwgcG9pbnRzLmluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcG9pbnRzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBjb25zdCBmdW5jdGlvbk1vdXNlVXAgPSAobW91c2VFdmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKHByZUV2ZW50KSB7XG4gICAgICAgIHByZUV2ZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm9uRHJhd0xpbmVFbmQubmV4dCh7IGRhdGFMaW5lOiBkYXRhLCBldmVudDogbW91c2VFdmVudCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyRHJhZyA9IChkcmFnTW91c2VFdmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFwcmVFdmVudCkge1xuICAgICAgICBwcmVFdmVudCA9IGRyYWdNb3VzZUV2ZW50O1xuICAgICAgfVxuICAgICAgY29uc3QgcG9pbnRFbmQgPSBjbG9uZURlZXAocG9pbnRzLmVuZCk7XG5cbiAgICAgIGNvbnN0IG1vdmVtZW50WCA9IGRyYWdNb3VzZUV2ZW50LmNsaWVudFggLSBwcmVFdmVudC5jbGllbnRYO1xuICAgICAgY29uc3QgbW92ZW1lbnRZID0gZHJhZ01vdXNlRXZlbnQuY2xpZW50WSAtIHByZUV2ZW50LmNsaWVudFk7XG5cbiAgICAgIHByZUV2ZW50ID0gZHJhZ01vdXNlRXZlbnQ7XG4gICAgICBwb2ludEVuZC54ICs9IG1vdmVtZW50WDtcbiAgICAgIHBvaW50RW5kLnkgKz0gbW92ZW1lbnRZO1xuICAgICAgaWYgKGRhdGEucG9pbnRzPy5vYnN0YWNsZVJlY3Q/Lmxlbmd0aCAmJiBkYXRhLnBvaW50cz8ub2JzdGFjbGVSZWN0LnNvbWUob2JzdGFjbGVSZWN0ID0+IHRoaXMuY2hlY2tQb2ludEluY2x1ZGVSZWN0KHBvaW50RW5kLCBvYnN0YWNsZVJlY3QpKSkge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHBvaW50cy5lbmQueCA9IHBvaW50RW5kLng7XG4gICAgICBwb2ludHMuZW5kLnkgPSBwb2ludEVuZC55O1xuICAgICAgdGhpcy5kcmF3TGluZShkYXRhKTtcbiAgICAgIHRoaXMudXBkYXRlVmlld0JveCgpO1xuICAgIH07XG5cbiAgICBpZiAocG9pbnRzLmFycm93RWxlbWVudCkge1xuICAgICAgZ2V0RHJhZ0V2ZW50QnlFbGVtZW50KHtcbiAgICAgICAgZWxlbWVudE1vdXNlRG93bjpwb2ludHMuYXJyb3dFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgIGZ1bmN0aW9uTW91c2VVcDpmdW5jdGlvbk1vdXNlVXAsXG4gICAgICAgIG9uRGVzdHJveTp0aGlzLm9uRGVzdHJveVxuICAgICAgfSkucGlwZSh0YXAoaGFuZGxlckRyYWcpLCB0YWtlVW50aWwocG9pbnRzLm9uRGVzdHJveUV2ZW50KSkuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50cy5jaXJjbGVFbmRFbGVtZW50KSB7XG4gICAgICBnZXREcmFnRXZlbnRCeUVsZW1lbnQoe1xuICAgICAgICBlbGVtZW50TW91c2VEb3duOnBvaW50cy5jaXJjbGVFbmRFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgIGZ1bmN0aW9uTW91c2VVcDpmdW5jdGlvbk1vdXNlVXAsXG4gICAgICAgIG9uRGVzdHJveTp0aGlzLm9uRGVzdHJveSxcbiAgICAgIH0pLnBpcGUodGFwKGhhbmRsZXJEcmFnKSwgdGFrZVVudGlsKHBvaW50cy5vbkRlc3Ryb3lFdmVudCkpLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tQb2ludEluY2x1ZGVSZWN0KHBvaW50OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0sIG9ic3RhY2xlUmVjdDogSVJlY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBnYXBEZWZhdWx0ID0gODtcblxuICAgIG9ic3RhY2xlUmVjdCA9IHtcbiAgICAgIHg6IG9ic3RhY2xlUmVjdC54IC0gKG9ic3RhY2xlUmVjdC5nYXBYT2JzdGFjbGVSZWN0IHx8IGdhcERlZmF1bHQpLFxuICAgICAgeTogb2JzdGFjbGVSZWN0LnkgLSAob2JzdGFjbGVSZWN0LmdhcFlPYnN0YWNsZVJlY3QgfHwgZ2FwRGVmYXVsdCksXG4gICAgICB3aWR0aDogb2JzdGFjbGVSZWN0LndpZHRoICsgKG9ic3RhY2xlUmVjdC5nYXBYT2JzdGFjbGVSZWN0IHx8IGdhcERlZmF1bHQpICogMixcbiAgICAgIGhlaWdodDogb2JzdGFjbGVSZWN0LmhlaWdodCArIChvYnN0YWNsZVJlY3QuZ2FwWU9ic3RhY2xlUmVjdCB8fCBnYXBEZWZhdWx0KSAqIDJcbiAgICB9O1xuICAgIGlmICgob2JzdGFjbGVSZWN0LnggPD0gcG9pbnQueCAmJiBwb2ludC54IDw9IG9ic3RhY2xlUmVjdC54ICsgb2JzdGFjbGVSZWN0LndpZHRoKSAmJiAob2JzdGFjbGVSZWN0LnkgPD0gcG9pbnQueSAmJiBwb2ludC55IDw9IG9ic3RhY2xlUmVjdC55ICsgb2JzdGFjbGVSZWN0LmhlaWdodCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGF0aEFuZEFycm93RWxlbWVudChuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgICBjb25zdCBhcnJvd0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBvbHlsaW5lXCIpO1xuICAgIGNvbnN0IGNpcmNsZVN0YXJ0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiY2lyY2xlXCIpO1xuICAgIGNvbnN0IGNpcmNsZUVuZEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImNpcmNsZVwiKTtcblxuICAgIHBhdGhFbGVtZW50LnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgIGFycm93RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBuYW1lKTtcbiAgICB0aGlzLnN2Z0VsZW1lbnQuYXBwZW5kKHBhdGhFbGVtZW50KTtcbiAgICB0aGlzLnN2Z0VsZW1lbnQuYXBwZW5kKGFycm93RWxlbWVudCk7XG5cbiAgICByZXR1cm4geyBwYXRoRWxlbWVudCwgYXJyb3dFbGVtZW50LCBjaXJjbGVTdGFydEVsZW1lbnQsIGNpcmNsZUVuZEVsZW1lbnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ2lyY2xlKG5hbWU6IHN0cmluZywgcG9pbnQ6IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSkge1xuICAgIGlmICghdGhpcy5kcmF3UmVjdERlYnVnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNpcmNsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiY2lyY2xlXCIpO1xuXG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N4JywgYCR7cG9pbnQueH1gKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdjeScsIGAke3BvaW50Lnl9YCk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgncicsICcyJyk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZmlsbDogbm9uZTsgc3Ryb2tlOiBibHVlOyBzdHJva2Utd2lkdGg6IDFweDsnKTtcbiAgICB0aGlzLnN2Z0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2lyY2xlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJDaXJjbGUoKSB7XG4gICAgaWYgKCF0aGlzLmRyYXdSZWN0RGVidWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgQXJyYXkuZnJvbSh0aGlzLnN2Z0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2NpcmNsZScpKT8uZm9yRWFjaChpdGVtID0+IGl0ZW0ucmVtb3ZlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZWN0KG5hbWU6IHN0cmluZywgcmVjdDogSVJlY3QpIHtcbiAgICBpZiAoIXRoaXMuZHJhd1JlY3REZWJ1Zykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicmVjdFwiKTtcbiAgICBjb25zdCB0ZXh0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwidGV4dFwiKTtcblxuICAgIHJlY3RFbGVtZW50LnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgIHJlY3RFbGVtZW50LnNldEF0dHJpYnV0ZSgneCcsIGAke3JlY3QueH1gKTtcbiAgICByZWN0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3knLCBgJHtyZWN0Lnl9YCk7XG4gICAgcmVjdEVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGAke3JlY3Qud2lkdGh9YCk7XG4gICAgcmVjdEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHtyZWN0LmhlaWdodH1gKTtcbiAgICByZWN0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2ZpbGw6IGJsdWU7IHN0cm9rZTogYmx1ZTsnKTtcbiAgICB0aGlzLnN2Z0VsZW1lbnQuYXBwZW5kQ2hpbGQocmVjdEVsZW1lbnQpO1xuXG4gICAgdGV4dEVsZW1lbnQuc2V0QXR0cmlidXRlKCd4JywgYCR7cmVjdC54fWApO1xuICAgIHRleHRFbGVtZW50LnNldEF0dHJpYnV0ZSgneScsIGAke3JlY3QueX1gKTtcbiAgICB0ZXh0RWxlbWVudC50ZXh0Q29udGVudCA9IHJlY3QuaWQgPz8gJyc7XG4gICAgdGhpcy5zdmdFbGVtZW50LmFwcGVuZENoaWxkKHRleHRFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJSZWN0KCkge1xuICAgIGlmICghdGhpcy5kcmF3UmVjdERlYnVnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEFycmF5LmZyb20odGhpcy5zdmdFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdyZWN0JykpPy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5yZW1vdmUoKSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnN2Z0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RleHQnKSk/LmZvckVhY2goaXRlbSA9PiBpdGVtLnJlbW92ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRQYXRoQW5kRHJhd1NlcGFyYXRlZFBvaW50cyhkYXRhOiBJRHJhd0xpbmVEYXRhSW5wdXQsIHBvaW50czogSVBvaW50cywgbW9kZT86IFRZUEVfTU9ERSkge1xuICAgIGxldCBkUGF0aCA9IHt9IGFzIElBdHRyaWJ1dGVET25QYXRoO1xuICAgIGNvbnN0IHN0eWxlQ29uZmlnID0ge1xuICAgICAgY3VydmU6IGRhdGEubGluZVN0eWxlPy5jdXJ2ZSA/PyAxMCxcbiAgICAgIGRpc3RhbmNlUG9pbnQ6IGRhdGEubGluZVN0eWxlPy5kaXN0YW5jZVBvaW50ID8/IDEwXG4gICAgfTtcblxuICAgIGxldCB7IGN1cnZlLCBkaXN0YW5jZVBvaW50IH0gPSBzdHlsZUNvbmZpZztcblxuICAgIG1vZGUgPSBtb2RlIHx8IFwicXVhcnQtaW5cIjtcbiAgICBpZiAobW9kZSAhPT0gJ3F1YXJ0LWluJykge1xuICAgICAgY3VydmUgPSBjdXJ2ZSA/PyAxMDtcbiAgICAgIGRpc3RhbmNlUG9pbnQgPSBkaXN0YW5jZVBvaW50ID8/IDEwO1xuICAgIH1cbiAgICBpZiAobW9kZSA9PT0gJ3F1YXJ0LWluJyB8fCBwb2ludHMuc3RhcnQueCA9PT0gcG9pbnRzLmVuZC54IHx8IHBvaW50cy5zdGFydC55ID09PSBwb2ludHMuZW5kLnkpIHtcbiAgICAgIHRoaXMuZHJhd0JhbGFuY2VkQ3VydmUoZFBhdGgsIHBvaW50cyk7XG5cbiAgICAgIGlmIChtb2RlID09PSAncXVhcnQtaW4nKSB7XG4gICAgICAgIGRQYXRoID0ge30gYXMgSUF0dHJpYnV0ZURPblBhdGg7XG4gICAgICAgIHRoaXMuZHJhd0JlbmRCb3RoRW5kc0N1cnZlKGRQYXRoLCBwb2ludHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5idWlsREF0dHJpYnV0ZVRvU3RyaW5nKGRQYXRoKTtcblxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNhbGN1bGF0b3JEaXN0YW5jZVBvaW50QW5kQ3VydmUocG9pbnRzLCBkaXN0YW5jZVBvaW50LCBjdXJ2ZSwgbW9kZSk7XG5cbiAgICBkaXN0YW5jZVBvaW50ID0gcmVzdWx0LmRpc3RhbmNlUG9pbnQ7XG4gICAgY3VydmUgPSByZXN1bHQuY3VydmU7XG5cbiAgICB0aGlzLmJ1aWxkREF0dHJpYnV0ZUJ5UG9pbnRFbmRNb2RlSG9yaXpvbnRhbChkUGF0aCwgcG9pbnRzLCBkaXN0YW5jZVBvaW50IHx8IDAsIGN1cnZlIHx8IDAsIG1vZGUpO1xuICAgIHRoaXMuYnVpbGREQXR0cmlidXRlQnlQb2ludEVuZE1vZGVWZXJ0aWNhbChkUGF0aCwgcG9pbnRzLCBkaXN0YW5jZVBvaW50IHx8IDAsIGN1cnZlIHx8IDAsIG1vZGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbERBdHRyaWJ1dGVUb1N0cmluZyhkUGF0aCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIl19
672
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy1saW5lLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmF3LWxpbmUvc3JjL2RyYXctbGluZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFhLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEosT0FBTyxFQUFFLHlCQUF5QixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0MsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLE1BQU0sNENBQTRDLENBQUM7O0FBRXJHLGNBQWMsdUJBQXVCLENBQUM7QUFNdEMsTUFBTSxPQUFPLGlDQUFpQztJQUNsQyxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDaEMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLHVCQUF1QixDQUFVO0lBQ25DLFFBQVEsR0FBOEIsRUFBRSxDQUFDO0lBQ3pDLHVCQUF1QixHQUFnQyxFQUFFLENBQUM7SUFDMUQsYUFBYSxHQUdoQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ1gsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFL0IsYUFBYSxDQUFrQjtJQUMvQixVQUFVLENBQWlCO0lBQzNCLGFBQWEsQ0FBVztJQUV2QiwwQkFBMEIsR0FBNkMsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMxRixZQUFZLEdBQWtHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFM0ksZUFBZTtRQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDaEMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDOUQsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN0Qyx5QkFBeUIsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNwRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQzdDLENBQUM7SUFDSixDQUFDO0lBRU8sT0FBTyxDQUFDLElBQStCO1FBQzdDLE1BQU0sT0FBTyxHQUE4QixFQUFFLENBQUM7UUFFOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3BCLElBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hCLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDMU8sRUFDRCxDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWxDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsc0JBQXNCLENBQUMsSUFBaUM7UUFDdEQsTUFBTSxPQUFPLEdBQWdDLEVBQUUsQ0FBQztRQUVoRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqSSxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVsQyxTQUFTLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU8sVUFBVSxDQUFDLEVBQVUsRUFBRSxNQUF1QjtRQUNwRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzFCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUF3QixFQUFFLEVBQUU7WUFDaEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDcEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFckIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkIsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVwTixJQUFJLHFCQUFxQixFQUFFLENBQUM7Z0JBQzFCLHFCQUFxQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3RDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuRixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLHlCQUF5QixDQUFDLEdBQWtCO1FBQ2xELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU87UUFDVCxDQUFDO1FBRUQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ2pCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFaEYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixPQUFPO1lBQ1QsQ0FBQztZQUNELFVBQVUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDbEMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxRQUFtQztRQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3hCLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFcEgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztnQkFDeEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7b0JBQ3BELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQzdDLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7b0JBQ2hELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxtQ0FBbUMsQ0FBQyxJQUFpQztRQUMzRSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO2dCQUN4RSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ3pHLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsU0FBUyxDQUFDO29CQUV0QyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFpQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUM1RyxPQUFPO29CQUNULENBQUM7b0JBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDekMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7d0JBQ3JCLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRzt3QkFDdEIsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLEdBQUc7cUJBQ2xDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHFCQUFxQixDQUFDLE1BQWU7UUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsTUFBTSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM5QixNQUFNLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDOUIsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUMvQixNQUFNLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDckMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFFBQVEsQ0FBQyxJQUF3QjtRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztZQUM5QixJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFFdEMsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3RCLENBQUM7WUFDRCxNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDO1lBRWhFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNsRyxNQUFNLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUM1Qix1Q0FBdUMsQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO1lBQ2xFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN0Qix1Q0FBdUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUN6RSxDQUFDO1lBQ0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hILElBQUksQ0FBQyx3QkFBd0IsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMvRCxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25DLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFOUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2dCQUNuQyxNQUFNLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUM3QixDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUUxQyxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUVkLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUU7Z0JBQ2pELElBQUksSUFBSSxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ3BHLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVuRixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztZQUNqQyxNQUFNLFdBQVcsR0FBRztnQkFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLFNBQVM7Z0JBQzNDLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWU7Z0JBQ2hELFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsSUFBSSxLQUFLO2dCQUNqRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksTUFBTTtnQkFDcEMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2xDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsSUFBSSxFQUFFO2FBQ25ELENBQUM7WUFFRixNQUFNLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRSxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7WUFDRCxNQUFNLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxhQUFhLENBQUMsYUFBOEI7UUFDbEQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQWdCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxNQUFNLE9BQU8sR0FBZ0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUUzQixTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIsTUFBTSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQzVDLFNBQVMsQ0FBQztvQkFDUixLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsRUFBRTtvQkFDN0gsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7aUJBQy9LLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFMUYsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDdkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBRS9ELElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLGNBQWMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksY0FBYyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5SixDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQWEsRUFBRSxNQUFhO1FBQ3RELE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUV6RCxPQUFPLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLE9BQU8sR0FBRyxLQUFLLElBQUksQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN2RixDQUFDO0lBRU8seUJBQXlCLENBQUMsSUFBWSxFQUFFLE1BQWUsRUFBRSxLQUFhLEVBQUUsZUFBK0IsRUFBRSxhQUEyQjtRQUMxSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTVGLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxDQUFDO1lBQzdDLHVDQUF1QyxDQUFDLHFDQUFxQyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsb0JBQW9CLElBQUksRUFBRSxDQUFDO1FBQ2pJLENBQUM7UUFDRCx1Q0FBdUMsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdE4sQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQXdCLEVBQUUsTUFBZSxFQUFFLElBQWdCO1FBQ2xGLElBQUksS0FBSyxHQUFHLEVBQXVCLENBQUM7UUFDcEMsTUFBTSxXQUFXLEdBQUc7WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLFNBQVM7WUFDM0MsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZTtZQUNoRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLElBQUksS0FBSztZQUNqRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksTUFBTTtZQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNsQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLElBQUksRUFBRTtTQUNuRCxDQUFDO1FBRUYsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUUsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxJQUFJLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUUzQyxJQUFJLEdBQUcsSUFBSSxJQUFJLFVBQVUsQ0FBQztRQUMxQixJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN4QixLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwQixhQUFhLEdBQUcsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssVUFBVSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV0QyxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxHQUFHLEVBQXVCLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXRDLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXhGLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQ3JDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRXJCLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLGFBQWEsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRyxJQUFJLENBQUMscUNBQXFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEcsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLCtCQUErQixDQUFDLE1BQWUsRUFBRSxhQUFxQixFQUFFLEtBQWEsRUFBRSxJQUFlO1FBQzVHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQy9ELE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksSUFBSSxHQUFHLGFBQWEsR0FBRyxrQkFBa0IsR0FBRyxLQUFLLEdBQUcsZUFBZSxFQUFFLENBQUM7Z0JBQ3hFLGFBQWEsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsSUFBSSxJQUFJLEdBQUcsYUFBYSxHQUFHLGtCQUFrQixHQUFHLEtBQUssR0FBRyxlQUFlLEVBQUUsQ0FBQztnQkFDeEUsYUFBYSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVwQyxJQUFJLE1BQU0sR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUMzQixhQUFhLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNuQixLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxJQUF3QixFQUFFLElBQWU7UUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUUzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdEcsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEtBQXdCLEVBQUUsTUFBZTtRQUNqRSxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25ELEtBQUssQ0FBQyxDQUFDLEdBQUc7WUFDUixFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BILEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7U0FDckgsQ0FBQztRQUNGLEtBQUssQ0FBQyxFQUFFLEdBQUc7WUFDVCxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2xILEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtTQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQXdCLEVBQUUsTUFBZTtRQUNyRSxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFMUQsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxLQUFLLENBQUMsQ0FBQyxHQUFHO1lBQ1IsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFBRTtZQUMxQyxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxFQUFFO1lBQzFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtTQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVPLHVDQUF1QyxDQUFDLEtBQXdCLEVBQUUsTUFBZSxFQUFFLGFBQXFCLEVBQUUsS0FBYSxFQUFFLElBQWU7UUFDOUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFN0IsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0YsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztZQUN2QyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDO1FBQ2pELENBQUM7UUFDRCxLQUFLLENBQUMsQ0FBQyxHQUFHO1lBQ1IsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsR0FBRyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDN0UsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsR0FBRyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsRUFBRTtTQUNwRyxDQUFDO1FBQ0YsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFGLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDdkMsS0FBSyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxJQUFJLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsRUFBRSxHQUFHO2dCQUNULEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDbEMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsYUFBYSxHQUFHLFdBQVcsR0FBRyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7YUFDckYsQ0FBQztZQUNGLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFTyxxQ0FBcUMsQ0FBQyxLQUF3QixFQUFFLE1BQWUsRUFBRSxhQUFxQixFQUFFLEtBQWEsRUFBRSxJQUFlO1FBQzVJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTdCLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN2QixLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxhQUFhLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDakYsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUNyQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhLEdBQUcsV0FBVyxHQUFHLGlCQUFpQixDQUFDO1FBQzdFLENBQUM7UUFDRCxLQUFLLENBQUMsQ0FBQyxHQUFHO1lBQ1IsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxXQUFXLEVBQUU7WUFDcEQsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsR0FBRyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsRUFBRTtTQUMvRixDQUFDO1FBQ0YsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ3JDLEtBQUssQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLEVBQUUsR0FBRztnQkFDVCxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2xDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsV0FBVyxFQUFFO2FBQ3pELENBQUM7WUFDRixLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsVUFBNkI7UUFDMUQsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRWpCLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVsQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUV0QyxPQUFPLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQzNJLENBQUM7Z0JBRUYsT0FBTztZQUNULENBQUM7WUFDRCxPQUFPLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztPQUMvRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsTUFBZSxFQUFFLElBQWUsRUFBRSxJQUF3QjtRQUNqRixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDakQsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRztZQUNsQixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksU0FBUztZQUN4QyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLElBQUksTUFBTTtZQUN6QyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLElBQUksR0FBRztZQUNoRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLElBQUksQ0FBQztZQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQztTQUNyQyxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXRGLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEIsS0FBSyxPQUFPO2dCQUNWLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0JBQzdELFFBQVEsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQztnQkFDbkMsQ0FBQztnQkFDRCxZQUFZLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDM0wsTUFBTTtZQUVSLEtBQUssTUFBTTtnQkFDVCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUM3RCxRQUFRLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUM7Z0JBQ25DLENBQUM7Z0JBQ0QsWUFBWSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQzNMLE1BQU07WUFFUixLQUFLLEtBQUs7Z0JBQ1IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDN0QsUUFBUSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDO2dCQUNuQyxDQUFDO2dCQUNELFlBQVksRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzTCxNQUFNO1lBRVIsS0FBSyxRQUFRO2dCQUNYLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0JBQzdELFFBQVEsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQztnQkFDbkMsQ0FBQztnQkFDRCxZQUFZLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0wsTUFBTTtRQUNWLENBQUM7UUFFRCxZQUFZLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsWUFBWSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELFlBQVksRUFBRSxZQUFZLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU8scUJBQXFCLENBQUMsYUFBK0IsRUFBRSxJQUFZLEVBQUUsS0FBK0IsRUFBRSxXQUEwQjtRQUN0SSxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUQsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxXQUFXLEVBQUUsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEUsYUFBYSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxXQUFXLEVBQUUsTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDNUUsYUFBYSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsR0FBRyxXQUFXLEVBQUUsV0FBVyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFbkYsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVPLFlBQVksQ0FBQyxNQUFlLEVBQUUsWUFBcUU7UUFDekcsSUFBSSxVQUFVLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVyQyxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVwSCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLFVBQVUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdEUsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFcEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbEYsT0FBTyxjQUFjLENBQUM7WUFDeEIsQ0FBQztZQUVELE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxRQUFRLFlBQVksRUFBRSxDQUFDO1lBQ3JCLEtBQUssYUFBYTtnQkFDaEIsT0FBTyxjQUFjLENBQUM7WUFFeEIsS0FBSyxZQUFZO2dCQUNmLE9BQU8sY0FBYyxDQUFDO1lBRXhCLEtBQUssWUFBWTtnQkFDZixPQUFPLFlBQVksQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUF3QjtRQUN4QyxNQUFNLE1BQU0sR0FBWSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3BDLElBQUksUUFBUSxHQUEyQixTQUFTLENBQUM7UUFFakQsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkcsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUMxQixNQUFNLGVBQWUsR0FBRyxDQUFDLFVBQXNCLEVBQUUsRUFBRTtZQUNqRCxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLFFBQVEsR0FBRyxTQUFTLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNqRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxjQUEwQixFQUFFLEVBQUU7WUFDakQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLFFBQVEsR0FBRyxjQUFjLENBQUM7WUFDNUIsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFdkMsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQzVELE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUU1RCxRQUFRLEdBQUcsY0FBYyxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzlJLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLHFCQUFxQixDQUFDO2dCQUNwQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsWUFBc0M7Z0JBQy9ELGVBQWUsRUFBRSxlQUFlO2dCQUNoQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDMUIsQ0FBQztpQkFDQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ3hELFNBQVMsRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzVCLHFCQUFxQixDQUFDO2dCQUNwQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQTBDO2dCQUNuRSxlQUFlLEVBQUUsZUFBZTtnQkFDaEMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzFCLENBQUM7aUJBQ0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUN4RCxTQUFTLEVBQUUsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQStCLEVBQUUsWUFBbUI7UUFDaEYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLFlBQVksR0FBRztZQUNiLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLGdCQUFnQixJQUFJLFVBQVUsQ0FBQztZQUNqRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxVQUFVLENBQUM7WUFDakUsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUM3RSxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDO1NBQ2hGLENBQUM7UUFDRixJQUFJLFlBQVksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoSyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxJQUFZO1FBQzVDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsNEJBQTRCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkYsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RixNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsNEJBQTRCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUYsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLDRCQUE0QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTFGLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDN0UsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFZLEVBQUUsS0FBK0I7UUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsNEJBQTRCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFaEYsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLDhDQUE4QyxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVPLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBVztRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLDRCQUE0QixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRW5GLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0MsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELFdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDckQsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV6QyxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0MsV0FBVyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVPLCtCQUErQixDQUFDLElBQXdCLEVBQUUsTUFBZSxFQUFFLElBQWdCO1FBQ2pHLElBQUksS0FBSyxHQUFHLEVBQXVCLENBQUM7UUFDcEMsTUFBTSxXQUFXLEdBQUc7WUFDbEIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEMsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxJQUFJLEVBQUU7U0FDbkQsQ0FBQztRQUVGLElBQUksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEdBQUcsV0FBVyxDQUFDO1FBRTNDLElBQUksR0FBRyxJQUFJLElBQUksVUFBVSxDQUFDO1FBQzFCLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3BCLGFBQWEsR0FBRyxhQUFhLElBQUksRUFBRSxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksS0FBSyxVQUFVLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRXRDLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLEdBQUcsRUFBdUIsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV4RixhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUNyQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUVyQixJQUFJLENBQUMsdUNBQXVDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEcsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWhHLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBcHdCVSxpQ0FBaUM7NEZBQWpDLGlDQUFpQzs7NEZBQWpDLGlDQUFpQztrQkFMN0MsU0FBUzttQkFBQztvQkFDVCw4REFBOEQ7b0JBQzlELFFBQVEsRUFBRSxxQ0FBcUM7b0JBQy9DLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFjVSxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFSSwwQkFBMEI7c0JBQW5DLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE5nWm9uZSwgT25EZXN0cm95LCBPdXRwdXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lciwgY2xvbmVEZWVwLCBnZXQsIGdldERyYWdFdmVudEJ5RWxlbWVudCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQXR0cmlidXRlRE9uUGF0aCwgSUNpcmNsZVN0eWxlLCBJRHJhd0xpbmVEYXRhSW5wdXQsIElNb0RyYXdMaW5lRnVuY3Rpb25Db250cm9sLCBJUG9pbnQsIElQb2ludHMsIElSZWFjaGFibGVQb2ludFJhbmdlLCBJUmVjdCwgSVZpZXdCb3hDb25maWcsIFRZUEVfRElSRUNUSU9OLCBUWVBFX01PREUgfSBmcm9tICcuL2RyYXctbGluZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbk5ld0VsZW1lbnRVdGlsIH0gZnJvbSAnLi91dGlsL2Nvbm5lY3QtbmF2aWdhdGlvbi1uZXctZWxlbWVudC51dGlsJztcblxuZXhwb3J0ICogZnJvbSAnLi9kcmF3LWxpbmUuaW50ZXJmYWNlJztcbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tMaWJzVWlDb21wb25lbnRzRHJhd0xpbmVEaXJlY3RpdmVdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0RyYXdMaW5lRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByb3RlY3RlZCB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByb3RlY3RlZCBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcm90ZWN0ZWQgaW50ZXJ2YWxTY3JvbGxUb0VsZW1lbnQ/OiBudW1iZXI7XG4gIHByaXZhdGUgZGF0YURyYXc6IEFycmF5PElEcmF3TGluZURhdGFJbnB1dD4gPSBbXTtcbiAgcHJpdmF0ZSBkYXRhUmVhY2hhYmxlUG9pbnRSYW5nZTogQXJyYXk8SVJlYWNoYWJsZVBvaW50UmFuZ2U+ID0gW107XG4gIHByaXZhdGUgb25EcmF3TGluZUVuZDogU3ViamVjdDx7XG4gICAgZGF0YUxpbmU6IElEcmF3TGluZURhdGFJbnB1dDtcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfT4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQElucHV0KCkgdmlld0JveENvbmZpZz86IElWaWV3Qm94Q29uZmlnO1xuICBASW5wdXQoKSBzdmdFbGVtZW50ITogU1ZHU1ZHRWxlbWVudDtcbiAgQElucHV0KCkgZHJhd1JlY3REZWJ1Zz86IGJvb2xlYW47XG5cbiAgQE91dHB1dCgpIG91dERyYXdMaW5lRnVuY3Rpb25Db250cm9sOiBFdmVudEVtaXR0ZXI8SU1vRHJhd0xpbmVGdW5jdGlvbkNvbnRyb2w+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb3V0Q29ubmVjdGVkOiBFdmVudEVtaXR0ZXI8eyBkYXRhTGluZTogSURyYXdMaW5lRGF0YUlucHV0OyBkYXRhUmVhY2hhYmxlUG9pbnRSYW5nZTogSVJlYWNoYWJsZVBvaW50UmFuZ2UgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3ZnRWxlbWVudCA9IHRoaXMuc3ZnRWxlbWVudCB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFwcGVuZCh0aGlzLnN2Z0VsZW1lbnQpO1xuICAgIHRoaXMub3V0RHJhd0xpbmVGdW5jdGlvbkNvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElNb0RyYXdMaW5lRnVuY3Rpb25Db250cm9sIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0RGF0YTogdGhpcy5zZXREYXRhLmJpbmQodGhpcyksXG4gICAgICBzZXRSZWFjaGFibGVQb2ludFJhbmdlOiB0aGlzLnNldFJlYWNoYWJsZVBvaW50UmFuZ2UuYmluZCh0aGlzKSxcbiAgICAgIHJlbW92ZUxpbmU6IHRoaXMucmVtb3ZlTGluZS5iaW5kKHRoaXMpLFxuICAgICAgcmVtb3ZlUmVhY2hhYmxlUG9pbnRSYW5nZTogdGhpcy5yZW1vdmVSZWFjaGFibGVQb2ludFJhbmdlLmJpbmQodGhpcyksXG4gICAgICB1cGRhdGVWaWV3Qm94OiB0aGlzLnVwZGF0ZVZpZXdCb3guYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRhKGRhdGE6IEFycmF5PElEcmF3TGluZURhdGFJbnB1dD4pIHtcbiAgICBjb25zdCBuZXdEYXRhOiBBcnJheTxJRHJhd0xpbmVEYXRhSW5wdXQ+ID0gW107XG5cbiAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5kYXRhRHJhdy5maW5kKFxuICAgICAgICAgIChkYXRhRHJhdykgPT4gZGF0YURyYXcuaWQgPT09IGl0ZW0uaWQgJiYgaXRlbS5wb2ludHMuc3RhcnQueCA9PT0gZGF0YURyYXcucG9pbnRzLnN0YXJ0LnggJiYgaXRlbS5wb2ludHMuc3RhcnQueSA9PT0gZGF0YURyYXcucG9pbnRzLnN0YXJ0LnkgJiYgaXRlbS5wb2ludHMuZW5kLnggPT09IGRhdGFEcmF3LnBvaW50cy5lbmQueCAmJiBpdGVtLnBvaW50cy5lbmQueSA9PT0gZGF0YURyYXcucG9pbnRzLmVuZC55XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtQ2xvbmUgPSBjbG9uZURlZXAoaXRlbSk7XG5cbiAgICAgIGl0ZW1DbG9uZS5yZWYgPSBpdGVtO1xuICAgICAgbmV3RGF0YS5wdXNoKGl0ZW1DbG9uZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFEcmF3LnB1c2goLi4ubmV3RGF0YSk7XG4gICAgdGhpcy5zdGFydFByb2Nlc3NEYXRhUm93KG5ld0RhdGEpO1xuICB9XG5cbiAgc2V0UmVhY2hhYmxlUG9pbnRSYW5nZShkYXRhOiBBcnJheTxJUmVhY2hhYmxlUG9pbnRSYW5nZT4pIHtcbiAgICBjb25zdCBuZXdEYXRhOiBBcnJheTxJUmVhY2hhYmxlUG9pbnRSYW5nZT4gPSBbXTtcblxuICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGF0YVJlYWNoYWJsZVBvaW50UmFuZ2UuZmluZCgoZGF0YURyYXcpID0+IGRhdGFEcmF3LmlkID09PSBpdGVtLmlkIHx8IChpdGVtLnggPT09IGRhdGFEcmF3LnggJiYgaXRlbS55ID09PSBkYXRhRHJhdy55KSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbUNsb25lID0gY2xvbmVEZWVwKGl0ZW0pO1xuXG4gICAgICBpdGVtQ2xvbmUucmVmID0gaXRlbTtcbiAgICAgIG5ld0RhdGEucHVzaChpdGVtQ2xvbmUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kYXRhUmVhY2hhYmxlUG9pbnRSYW5nZS5wdXNoKC4uLm5ld0RhdGEpO1xuICAgIHRoaXMuc3RhcnRQcm9jZXNzRGF0YVJlYWNoYWJsZVBvaW50UmFuZ2UobmV3RGF0YSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUxpbmUoaWQ6IHN0cmluZywgcG9pbnRzPzogQXJyYXk8SVBvaW50cz4pIHtcbiAgICBjb25zdCBkYXRhRHJhd0J5SWQgPSB0aGlzLmRhdGFEcmF3LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuXG4gICAgaWYgKCFkYXRhRHJhd0J5SWQ/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbW92ZUJ5SXRlbSA9IChpdGVtOiBJRHJhd0xpbmVEYXRhSW5wdXQpID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlRWxlbWVudE9mUG9pbnRzKGl0ZW0ucG9pbnRzKTtcbiAgICAgIGl0ZW0ucG9pbnRzLnNlcGFyYXRlZFBvaW50cz8uZm9yRWFjaCgoc2VwYXJhdGVkUG9pbnRzKSA9PiB0aGlzLnJlbW92ZUVsZW1lbnRPZlBvaW50cyhzZXBhcmF0ZWRQb2ludHMpKTtcbiAgICB9O1xuXG4gICAgaWYgKCFwb2ludHM/Lmxlbmd0aCkge1xuICAgICAgZGF0YURyYXdCeUlkLmZvckVhY2goKGl0ZW0pID0+IHJlbW92ZUJ5SXRlbShpdGVtKSk7XG4gICAgICB0aGlzLmRhdGFEcmF3ID0gdGhpcy5kYXRhRHJhdy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaWQgIT09IGlkKTtcbiAgICAgIHRoaXMudXBkYXRlVmlld0JveCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcG9pbnRzLmZvckVhY2goKHBvaW50KSA9PiB7XG4gICAgICBjb25zdCBkYXRhRHJhd1JlbW92ZUJ5UG9pbnQgPSBkYXRhRHJhd0J5SWQuZmluZCgoaXRlbSkgPT4gaXRlbS5wb2ludHMuc3RhcnQueCA9PT0gcG9pbnQuc3RhcnQueCAmJiBpdGVtLnBvaW50cy5zdGFydC55ID09PSBwb2ludC5zdGFydC55ICYmIGl0ZW0ucG9pbnRzLmVuZC54ID09PSBwb2ludC5lbmQueCAmJiBpdGVtLnBvaW50cy5lbmQueSA9PT0gcG9pbnQuZW5kLnkpO1xuXG4gICAgICBpZiAoZGF0YURyYXdSZW1vdmVCeVBvaW50KSB7XG4gICAgICAgIGRhdGFEcmF3UmVtb3ZlQnlQb2ludC5pc1JlbW92ZSA9IHRydWU7XG4gICAgICAgIHJlbW92ZUJ5SXRlbShkYXRhRHJhd1JlbW92ZUJ5UG9pbnQpO1xuICAgICAgICB0aGlzLmRhdGFEcmF3ID0gdGhpcy5kYXRhRHJhdy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaWQgIT09IGlkICYmICFpdGVtLmlzUmVtb3ZlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZVZpZXdCb3goKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUmVhY2hhYmxlUG9pbnRSYW5nZShpZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLmNsZWFyUmVjdCgpO1xuICAgIGlmICghaWRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgaXRlbVJlbW92ZSA9IHRoaXMuZGF0YVJlYWNoYWJsZVBvaW50UmFuZ2U/LmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkKTtcblxuICAgICAgaWYgKCFpdGVtUmVtb3ZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGl0ZW1SZW1vdmUub25EZXN0cm95RXZlbnQ/Lm5leHQoKTtcbiAgICAgIGl0ZW1SZW1vdmUuZWxlbWVudD8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLmRhdGFSZWFjaGFibGVQb2ludFJhbmdlID0gdGhpcy5kYXRhUmVhY2hhYmxlUG9pbnRSYW5nZT8uZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkICE9PSBpZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UHJvY2Vzc0RhdGFSb3coZGF0YURyYXc6IEFycmF5PElEcmF3TGluZURhdGFJbnB1dD4pIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZGF0YURyYXcuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB7IHBhdGhFbGVtZW50LCBhcnJvd0VsZW1lbnQsIGNpcmNsZVN0YXJ0RWxlbWVudCwgY2lyY2xlRW5kRWxlbWVudCB9ID0gdGhpcy5jcmVhdGVQYXRoQW5kQXJyb3dFbGVtZW50KGl0ZW0uaWQpO1xuXG4gICAgICAgIGl0ZW0ucG9pbnRzLm9ic3RhY2xlUmVjdD8uZm9yRWFjaCgoZGF0YSkgPT4gdGhpcy5hZGRSZWN0KCdyZWN0JywgZGF0YSkpO1xuICAgICAgICBpdGVtLnBvaW50cy5wYXRoRWxlbWVudCA9IHBhdGhFbGVtZW50O1xuICAgICAgICBpdGVtLnBvaW50cy5hcnJvd0VsZW1lbnQgPSBhcnJvd0VsZW1lbnQ7XG4gICAgICAgIGlmIChpdGVtLnN0YXJ0Q2lyY2xlKSB7XG4gICAgICAgICAgaXRlbS5wb2ludHMuY2lyY2xlU3RhcnRFbGVtZW50ID0gY2lyY2xlU3RhcnRFbGVtZW50O1xuICAgICAgICAgIHRoaXMuc3ZnRWxlbWVudC5hcHBlbmQoY2lyY2xlU3RhcnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5lbmRDaXJjbGUpIHtcbiAgICAgICAgICBpdGVtLnBvaW50cy5jaXJjbGVFbmRFbGVtZW50ID0gY2lyY2xlRW5kRWxlbWVudDtcbiAgICAgICAgICB0aGlzLnN2Z0VsZW1lbnQuYXBwZW5kKGNpcmNsZUVuZEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW0ucG9pbnRzLm9uRGVzdHJveUV2ZW50ID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgdGhpcy5kcmF3TGluZShpdGVtKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVWaWV3Qm94KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UHJvY2Vzc0RhdGFSZWFjaGFibGVQb2ludFJhbmdlKGRhdGE6IEFycmF5PElSZWFjaGFibGVQb2ludFJhbmdlPikge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaXRlbS5vbkRlc3Ryb3lFdmVudCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgIGl0ZW0uZWxlbWVudCA9IHRoaXMuY3JlYXRlUGF0aEFuZEFycm93RWxlbWVudChpdGVtLmlkKS5jaXJjbGVFbmRFbGVtZW50O1xuICAgICAgICB0aGlzLnN2Z0VsZW1lbnQuYXBwZW5kKGl0ZW0uZWxlbWVudCk7XG4gICAgICAgIHRoaXMudXBkYXRlQXR0cmlidXRlQ2lyY2xlKGl0ZW0uZWxlbWVudCwgaXRlbS5pZCwgaXRlbSwgaXRlbS5zdHlsZSk7XG4gICAgICAgIHRoaXMub25EcmF3TGluZUVuZC5waXBlKHRha2VVbnRpbChpdGVtLm9uRGVzdHJveUV2ZW50KSwgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKChldmVudERhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGRhdGFMaW5lLCBldmVudCB9ID0gZXZlbnREYXRhO1xuXG4gICAgICAgICAgaWYgKCFjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKGV2ZW50LCBpdGVtLmVsZW1lbnQgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudCkgfHwgIWRhdGFMaW5lLnJlZiB8fCAhaXRlbS5yZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpdGVtLmlkQ29ubmVjdGVkID0gZXZlbnREYXRhLmRhdGFMaW5lLmlkO1xuICAgICAgICAgIGV2ZW50RGF0YS5kYXRhTGluZS5pZENvbm5lY3RlZCA9IGl0ZW0uaWQ7XG4gICAgICAgICAgdGhpcy5vdXRDb25uZWN0ZWQuZW1pdCh7XG4gICAgICAgICAgICBkYXRhTGluZTogZGF0YUxpbmUucmVmLFxuICAgICAgICAgICAgZGF0YVJlYWNoYWJsZVBvaW50UmFuZ2U6IGl0ZW0ucmVmLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVWaWV3Qm94KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVsZW1lbnRPZlBvaW50cyhwb2ludHM6IElQb2ludHMpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcG9pbnRzLm9uRGVzdHJveUV2ZW50Py5uZXh0KCk7XG4gICAgICBwb2ludHMub25EZXN0cm95RXZlbnQ/LmNvbXBsZXRlKCk7XG4gICAgICBwb2ludHM/LnBhdGhFbGVtZW50Py5yZW1vdmUoKTtcbiAgICAgIHBvaW50cz8uYXJyb3dFbGVtZW50Py5yZW1vdmUoKTtcbiAgICAgIHBvaW50cz8uY2lyY2xlU3RhcnRFbGVtZW50Py5yZW1vdmUoKTtcbiAgICAgIHBvaW50cy5jaXJjbGVFbmRFbGVtZW50Py5yZW1vdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0xpbmUoZGF0YTogSURyYXdMaW5lRGF0YUlucHV0KSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IHsgcG9pbnRzLCBtb2RlIH0gPSBkYXRhO1xuICAgICAgbGV0IHsgY3VydmUgfSA9IGRhdGE/LmxpbmVTdHlsZSB8fCB7fTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdxdWFydC1pbicpIHtcbiAgICAgICAgY3VydmUgPSBjdXJ2ZSA/PyAxMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByZUxlbmd0aFNlcGFyYXRlZFBvaW50cyA9IHBvaW50cy5zZXBhcmF0ZWRQb2ludHM/Lmxlbmd0aDtcblxuICAgICAgcG9pbnRzLnNlcGFyYXRlZFBvaW50cz8uZm9yRWFjaCgoc2VwYXJhdGVkUG9pbnRzKSA9PiB0aGlzLnJlbW92ZUVsZW1lbnRPZlBvaW50cyhzZXBhcmF0ZWRQb2ludHMpKTtcbiAgICAgIHBvaW50cy5zZXBhcmF0ZWRQb2ludHMgPSBbXTtcbiAgICAgIE1vQ2FudmFzQ29ubmVjdE5hdmlnYXRpb25OZXdFbGVtZW50VXRpbC5TVEFSVF9NT0RFID0gJ3JpZ2h0LWxlZnQnO1xuICAgICAgaWYgKGRhdGEuc3RhcnRFbmRNb2RlKSB7XG4gICAgICAgIE1vQ2FudmFzQ29ubmVjdE5hdmlnYXRpb25OZXdFbGVtZW50VXRpbC5TVEFSVF9NT0RFID0gZGF0YS5zdGFydEVuZE1vZGU7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGN1bGF0b3JTZXBhcmF0ZWRQb2ludHMoZGF0YS5pZCwgcG9pbnRzLCBjdXJ2ZSB8fCAxMCwgcG9pbnRzLnNlcGFyYXRlZFBvaW50cywgcG9pbnRzLm9ic3RhY2xlUmVjdCB8fCBbXSk7XG4gICAgICBpZiAoIXByZUxlbmd0aFNlcGFyYXRlZFBvaW50cyAmJiBwb2ludHMuc2VwYXJhdGVkUG9pbnRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnRPZlBvaW50cyhwb2ludHMpO1xuICAgICAgICBjb25zdCB7IHBhdGhFbGVtZW50LCBhcnJvd0VsZW1lbnQgfSA9IHRoaXMuY3JlYXRlUGF0aEFuZEFycm93RWxlbWVudChkYXRhLmlkKTtcblxuICAgICAgICBwb2ludHMucGF0aEVsZW1lbnQgPSBwYXRoRWxlbWVudDtcbiAgICAgICAgcG9pbnRzLmFycm93RWxlbWVudCA9IGFycm93RWxlbWVudDtcbiAgICAgICAgcG9pbnRzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXBvaW50cy5zZXBhcmF0ZWRQb2ludHM/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmJ1aWxkUGF0aEFuZERyYXcoZGF0YSwgcG9pbnRzLCBtb2RlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBwYXRoID0gJyc7XG5cbiAgICAgIHBvaW50cy5zZXBhcmF0ZWRQb2ludHMuZm9yRWFjaCgoc2VwYXJhdGVkUG9pbnRzKSA9PiB7XG4gICAgICAgIHBhdGggKz0gdGhpcy5idWlsZFBhdGhBbmREcmF3U2VwYXJhdGVkUG9pbnRzKGRhdGEsIHNlcGFyYXRlZFBvaW50cywgc2VwYXJhdGVkUG9pbnRzLm1vZGUgfHwgbW9kZSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG5cbiAgICAgIHRoaXMuc3ZnRWxlbWVudC5hcHBlbmQocGF0aEVsZW1lbnQpO1xuICAgICAgcG9pbnRzLnBhdGhFbGVtZW50ID0gcGF0aEVsZW1lbnQ7XG4gICAgICBjb25zdCBzdHlsZUNvbmZpZyA9IHtcbiAgICAgICAgc3Ryb2tlOiBkYXRhLmxpbmVTdHlsZT8uc3Ryb2tlID8/ICcjOUNBMkFEJyxcbiAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiBkYXRhLmxpbmVTdHlsZT8uc3Ryb2tlRGFzaGFycmF5LFxuICAgICAgICBzdHJva2VXaWR0aDogZGF0YS5saW5lU3R5bGU/LnN0cm9rZVdpZHRoID8/ICcxcHgnLFxuICAgICAgICBmaWxsOiBkYXRhLmxpbmVTdHlsZT8uZmlsbCA/PyAnbm9uZScsXG4gICAgICAgIGN1cnZlOiBkYXRhLmxpbmVTdHlsZT8uY3VydmUgPz8gMTAsXG4gICAgICAgIGRpc3RhbmNlUG9pbnQ6IGRhdGEubGluZVN0eWxlPy5kaXN0YW5jZVBvaW50ID8/IDEwLFxuICAgICAgfTtcblxuICAgICAgcG9pbnRzLnBhdGhFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHN0eWxlQ29uZmlnLnN0cm9rZSk7XG4gICAgICBwb2ludHMucGF0aEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnZmlsbCcsIHN0eWxlQ29uZmlnLmZpbGwpO1xuICAgICAgcG9pbnRzLnBhdGhFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIHN0eWxlQ29uZmlnLnN0cm9rZVdpZHRoKTtcbiAgICAgIGlmIChzdHlsZUNvbmZpZy5zdHJva2VEYXNoYXJyYXkpIHtcbiAgICAgICAgcG9pbnRzLnBhdGhFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1kYXNoYXJyYXknLCBzdHlsZUNvbmZpZy5zdHJva2VEYXNoYXJyYXkpO1xuICAgICAgfVxuICAgICAgcG9pbnRzLnBhdGhFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2QnLCBwYXRoKTtcbiAgICAgIHRoaXMuZHJhd1JlY3RBbmRJbml0RXZlbnQoZGF0YSwgbW9kZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZpZXdCb3godmlld0JveENvbmZpZz86IElWaWV3Qm94Q29uZmlnKSB7XG4gICAgaWYgKHZpZXdCb3hDb25maWcpIHtcbiAgICAgIHRoaXMudmlld0JveENvbmZpZyA9IHZpZXdCb3hDb25maWc7XG4gICAgfVxuICAgIGNvbnN0IHhQb2ludHM6IFNldDxudW1iZXI+ID0gbmV3IFNldChbMF0pO1xuICAgIGNvbnN0IHlQb2ludHM6IFNldDxudW1iZXI+ID0gbmV3IFNldChbMF0pO1xuXG4gICAgY29uc3QgYWRkUG9pbnRzID0gKHBvaW50czogSVBvaW50cykgPT4ge1xuICAgICAgeFBvaW50cy5hZGQocG9pbnRzLnN0YXJ0LngpO1xuICAgICAgeFBvaW50cy5hZGQocG9pbnRzLmVuZC54KTtcbiAgICAgIHlQb2ludHMuYWRkKHBvaW50cy5zdGFydC55KTtcbiAgICAgIHlQb2ludHMuYWRkKHBvaW50cy5lbmQueSk7XG4gICAgfTtcblxuICAgIHRoaXMuZGF0YURyYXc/LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHBvaW50cyA9IGl0ZW0ucG9pbnRzO1xuXG4gICAgICBhZGRQb2ludHMocG9pbnRzKTtcbiAgICAgIHBvaW50cy5zZXBhcmF0ZWRQb2ludHM/LmZvckVhY2goKHNlcGFyYXRlZFBvaW50cykgPT4gYWRkUG9pbnRzKHNlcGFyYXRlZFBvaW50cykpO1xuICAgICAgcG9pbnRzLm9ic3RhY2xlUmVjdD8uZm9yRWFjaCgob2JzdGFjbGVSZWN0KSA9PiB7XG4gICAgICAgIGFkZFBvaW50cyh7XG4gICAgICAgICAgc3RhcnQ6IHsgeDogb2JzdGFjbGVSZWN0LnggLSAob2JzdGFjbGVSZWN0LmdhcFhPYnN0YWNsZVJlY3QgfHwgOCksIHk6IG9ic3RhY2xlUmVjdC55IC0gKG9ic3RhY2xlUmVjdC5nYXBZT2JzdGFjbGVSZWN0IHx8IDgpIH0sXG4gICAgICAgICAgZW5kOiB7IHg6IG9ic3RhY2xlUmVjdC54ICsgb2JzdGFjbGVSZWN0LndpZHRoICsgKG9ic3RhY2xlUmVjdC5nYXBYT2JzdGFjbGVSZWN0IHx8IDgpICogMiwgeTogb2JzdGFjbGVSZWN0LnkgKyBvYnN0YWNsZVJlY3QuaGVpZ2h0ICsgKG9ic3RhY2xlUmVjdC5nYXBZT2JzdGFjbGVSZWN0IHx8IDgpICogMiB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeE1heCA9IHRoaXMudmlld0JveENvbmZpZz8ud2lkdGggPz8gKHhQb2ludHMuc2l6ZSA/IE1hdGgubWF4KC4uLnhQb2ludHMpIDogMCkgKyAxNDtcbiAgICBjb25zdCB5TWF4ID0gdGhpcy52aWV3Qm94Q29uZmlnPy5oZWlnaHQgPz8gKHlQb2ludHMuc2l6ZSA/IE1hdGgubWF4KC4uLnlQb2ludHMpIDogMCkgKyAxNDtcblxuICAgIGlmICghdGhpcy52aWV3Qm94Q29uZmlnPy5pZ25vcmVWaWV3Qm94KSB7XG4gICAgICBjb25zdCByZWN0U3ZnRWxlbWVudCA9IHRoaXMuc3ZnRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgdGhpcy5zdmdFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCBgJHt0aGlzLnZpZXdCb3hDb25maWc/Lm1pblggPz8gcmVjdFN2Z0VsZW1lbnQueH0gJHt0aGlzLnZpZXdCb3hDb25maWc/Lm1pblkgPz8gcmVjdFN2Z0VsZW1lbnQueX0gJHt4TWF4fSAke3lNYXh9YCk7XG4gICAgfVxuICAgIHRoaXMuc3ZnRWxlbWVudD8uc2V0QXR0cmlidXRlKCd3aWR0aCcsIGAke3hNYXggPz8gMH1gKTtcbiAgICB0aGlzLnN2Z0VsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgYCR7eU1heCA/PyAwfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BvaW50SW5zaWRlU3F1YXJlKHBvaW50OiBJUG9pbnQsIHNxdWFyZTogSVJlY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHBvaW50O1xuICAgIGNvbnN0IHsgeDogc3F1YXJlWCwgeTogc3F1YXJlWSwgd2lkdGgsIGhlaWdodCB9ID0gc3F1YXJlO1xuXG4gICAgcmV0dXJuIHggPj0gc3F1YXJlWCAmJiB4IDw9IHNxdWFyZVggKyB3aWR0aCAmJiB5ID49IHNxdWFyZVkgJiYgeSA8PSBzcXVhcmVZICsgaGVpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdG9yU2VwYXJhdGVkUG9pbnRzKG5hbWU6IHN0cmluZywgcG9pbnRzOiBJUG9pbnRzLCBjdXJ2ZTogbnVtYmVyLCBzZXBhcmF0ZWRQb2ludHM6IEFycmF5PElQb2ludHM+LCBvYnN0YWNsZVJlY3RzOiBBcnJheTxJUmVjdD4pIHtcbiAgICBpZiAoIW9ic3RhY2xlUmVjdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudFN0YXJ0ID0gb2JzdGFjbGVSZWN0cy5maW5kKChpdGVtKSA9PiB0aGlzLmlzUG9pbnRJbnNpZGVTcXVhcmUocG9pbnRzLnN0YXJ0LCBpdGVtKSk7XG4gICAgY29uc3QgZWxlbWVudEVuZCA9IG9ic3RhY2xlUmVjdHMuZmluZCgoaXRlbSkgPT4gdGhpcy5pc1BvaW50SW5zaWRlU3F1YXJlKHBvaW50cy5lbmQsIGl0ZW0pKTtcblxuICAgIGlmICh0aGlzLnZpZXdCb3hDb25maWc/Lm1hcmdpbkJldHdlZW5FbGVtZW50KSB7XG4gICAgICBNb0NhbnZhc0Nvbm5lY3ROYXZpZ2F0aW9uTmV3RWxlbWVudFV0aWwuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCA9IHRoaXMudmlld0JveENvbmZpZz8ubWFyZ2luQmV0d2VlbkVsZW1lbnQgPz8gMzI7XG4gICAgfVxuICAgIE1vQ2FudmFzQ29ubmVjdE5hdmlnYXRpb25OZXdFbGVtZW50VXRpbC5zZXRYWUNvbm5lY3RFbGVtZW50cyhlbGVtZW50U3RhcnQgPz8geyAuLi5wb2ludHMuc3RhcnQsIHdpZHRoOiAxLCBoZWlnaHQ6IDEgfSwgZWxlbWVudEVuZCA/PyB7IC4uLnBvaW50cy5lbmQsIHdpZHRoOiAxLCBoZWlnaHQ6IDEgfSwgb2JzdGFjbGVSZWN0cywgc2VwYXJhdGVkUG9pbnRzLCBjdXJ2ZSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGF0aEFuZERyYXcoZGF0YTogSURyYXdMaW5lRGF0YUlucHV0LCBwb2ludHM6IElQb2ludHMsIG1vZGU/OiBUWVBFX01PREUpIHtcbiAgICBsZXQgZFBhdGggPSB7fSBhcyBJQXR0cmlidXRlRE9uUGF0aDtcbiAgICBjb25zdCBzdHlsZUNvbmZpZyA9IHtcbiAgICAgIHN0cm9rZTogZGF0YS5saW5lU3R5bGU/LnN0cm9rZSA/PyAnIzlDQTJBRCcsXG4gICAgICBzdHJva2VEYXNoYXJyYXk6IGRhdGEubGluZVN0eWxlPy5zdHJva2VEYXNoYXJyYXksXG4gICAgICBzdHJva2VXaWR0aDogZGF0YS5saW5lU3R5bGU/LnN0cm9rZVdpZHRoID8/ICcxcHgnLFxuICAgICAgZmlsbDogZGF0YS5saW5lU3R5bGU/LmZpbGwgPz8gJ25vbmUnLFxuICAgICAgY3VydmU6IGRhdGEubGluZVN0eWxlPy5jdXJ2ZSA/PyAxMCxcbiAgICAgIGRpc3RhbmNlUG9pbnQ6IGRhdGEubGluZVN0eWxlPy5kaXN0YW5jZVBvaW50ID8/IDEwLFxuICAgIH07XG5cbiAgICBwb2ludHMucGF0aEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgc3R5bGVDb25maWcuc3Ryb2tlKTtcbiAgICBwb2ludHMucGF0aEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnZmlsbCcsIHN0eWxlQ29uZmlnLmZpbGwpO1xuICAgIHBvaW50cy5wYXRoRWxlbWVudD8uc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBzdHlsZUNvbmZpZy5zdHJva2VXaWR0aCk7XG4gICAgaWYgKHN0eWxlQ29uZmlnLnN0cm9rZURhc2hhcnJheSkge1xuICAgICAgcG9pbnRzLnBhdGhFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1kYXNoYXJyYXknLCBzdHlsZUNvbmZpZy5zdHJva2VEYXNoYXJyYXkpO1xuICAgIH1cbiAgICBsZXQgeyBjdXJ2ZSwgZGlzdGFuY2VQb2ludCB9ID0gc3R5bGVDb25maWc7XG5cbiAgICBtb2RlID0gbW9kZSB8fCAncXVhcnQtaW4nO1xuICAgIGlmIChtb2RlICE9PSAncXVhcnQtaW4nKSB7XG4gICAgICBjdXJ2ZSA9IGN1cnZlID8/IDEwO1xuICAgICAgZGlzdGFuY2VQb2ludCA9IGRpc3RhbmNlUG9pbnQgPz8gMTA7XG4gICAgfVxuICAgIGlmIChtb2RlID09PSAncXVhcnQtaW4nIHx8IHBvaW50cy5zdGFydC54ID09PSBwb2ludHMuZW5kLnggfHwgcG9pbnRzLnN0YXJ0LnkgPT09IHBvaW50cy5lbmQueSkge1xuICAgICAgdGhpcy5kcmF3QmFsYW5jZWRDdXJ2ZShkUGF0aCwgcG9pbnRzKTtcblxuICAgICAgaWYgKG1vZGUgPT09ICdxdWFydC1pbicpIHtcbiAgICAgICAgZFBhdGggPSB7fSBhcyBJQXR0cmlidXRlRE9uUGF0aDtcbiAgICAgICAgdGhpcy5kcmF3QmVuZEJvdGhFbmRzQ3VydmUoZFBhdGgsIHBvaW50cyk7XG4gICAgICB9XG4gICAgICBwb2ludHMucGF0aEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnZCcsIHRoaXMuYnVpbERBdHRyaWJ1dGVUb1N0cmluZyhkUGF0aCkpO1xuICAgICAgdGhpcy5kcmF3UmVjdEFuZEluaXRFdmVudChkYXRhLCBtb2RlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNhbGN1bGF0b3JEaXN0YW5jZVBvaW50QW5kQ3VydmUocG9pbnRzLCBkaXN0YW5jZVBvaW50LCBjdXJ2ZSwgbW9kZSk7XG5cbiAgICBkaXN0YW5jZVBvaW50ID0gcmVzdWx0LmRpc3RhbmNlUG9pbnQ7XG4gICAgY3VydmUgPSByZXN1bHQuY3VydmU7XG5cbiAgICB0aGlzLmJ1aWxkREF0dHJpYnV0ZUJ5UG9pbnRFbmRNb2RlSG9yaXpvbnRhbChkUGF0aCwgcG9pbnRzLCBkaXN0YW5jZVBvaW50IHx8IDAsIGN1cnZlIHx8IDAsIG1vZGUpO1xuICAgIHRoaXMuYnVpbGREQXR0cmlidXRlQnlQb2ludEVuZE1vZGVWZXJ0aWNhbChkUGF0aCwgcG9pbnRzLCBkaXN0YW5jZVBvaW50IHx8IDAsIGN1cnZlIHx8IDAsIG1vZGUpO1xuICAgIHBvaW50cy5wYXRoRWxlbWVudD8uc2V0QXR0cmlidXRlKCdkJywgdGhpcy5idWlsREF0dHJpYnV0ZVRvU3RyaW5nKGRQYXRoKSk7XG4gICAgdGhpcy5kcmF3UmVjdEFuZEluaXRFdmVudChkYXRhLCBtb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRvckRpc3RhbmNlUG9pbnRBbmRDdXJ2ZShwb2ludHM6IElQb2ludHMsIGRpc3RhbmNlUG9pbnQ6IG51bWJlciwgY3VydmU6IG51bWJlciwgbW9kZTogVFlQRV9NT0RFKSB7XG4gICAgaWYgKCFtb2RlLmluY2x1ZGVzKCd2ZXJ0aWNhbCcpICYmICFtb2RlLmluY2x1ZGVzKCdob3Jpem9udGFsJykpIHtcbiAgICAgIHJldHVybiB7IGN1cnZlLCBkaXN0YW5jZVBvaW50IH07XG4gICAgfVxuICAgIGNvbnN0IGdhcFggPSBNYXRoLmFicyhwb2ludHMuc3RhcnQueCAtIHBvaW50cy5lbmQueCk7XG4gICAgY29uc3QgZ2FwWSA9IE1hdGguYWJzKHBvaW50cy5zdGFydC55IC0gcG9pbnRzLmVuZC55KTtcbiAgICBjb25zdCBtdWx0aXBsaWVyQ3VydmUgPSBtb2RlLmluY2x1ZGVzKCdob3Jpem9udGFsJykgPyAxIDogMjtcbiAgICBjb25zdCBtdWx0aXBsaWVyRGlzdGFuY2UgPSBtb2RlLmluY2x1ZGVzKCdob3Jpem9udGFsJykgPyAyIDogMTtcblxuICAgIGlmICghbW9kZS5pbmNsdWRlcygnc2luZ2xlLWN1cnZlJykpIHtcbiAgICAgIGlmIChnYXBYIDwgZGlzdGFuY2VQb2ludCAqIG11bHRpcGxpZXJEaXN0YW5jZSArIGN1cnZlICogbXVsdGlwbGllckN1cnZlKSB7XG4gICAgICAgIGRpc3RhbmNlUG9pbnQgPSBjdXJ2ZSA9IGdhcFggLyAzO1xuICAgICAgfVxuICAgICAgaWYgKGdhcFkgPCBkaXN0YW5jZVBvaW50ICogbXVsdGlwbGllckRpc3RhbmNlICsgY3VydmUgKiBtdWx0aXBsaWVyQ3VydmUpIHtcbiAgICAgICAgZGlzdGFuY2VQb2ludCA9IGN1cnZlID0gZ2FwWSAvIDM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGN1cnZlLCBkaXN0YW5jZVBvaW50IH07XG4gICAgfVxuICAgIGNvbnN0IG1pbkdhcCA9IE1hdGgubWluKGdhcFgsIGdhcFkpO1xuXG4gICAgaWYgKG1pbkdhcCA8IGRpc3RhbmNlUG9pbnQpIHtcbiAgICAgIGRpc3RhbmNlUG9pbnQgPSBtaW5HYXA7XG4gICAgfVxuICAgIGlmIChtaW5HYXAgPCBjdXJ2ZSkge1xuICAgICAgY3VydmUgPSBtaW5HYXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY3VydmUsIGRpc3RhbmNlUG9pbnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd1JlY3RBbmRJbml0RXZlbnQoZGF0YTogSURyYXdMaW5lRGF0YUlucHV0LCBtb2RlOiBUWVBFX01PREUpIHtcbiAgICBjb25zdCBwb2ludHMgPSBkYXRhLnBvaW50cztcblxuICAgIHRoaXMudXBkYXRlU3R5bGVBcnJvdyhwb2ludHMsIG1vZGUsIGRhdGEpO1xuICAgIGlmIChkYXRhLnN0YXJ0Q2lyY2xlICYmIHBvaW50cy5jaXJjbGVTdGFydEVsZW1lbnQpIHtcbiAgICAgIHRoaXMudXBkYXRlQXR0cmlidXRlQ2lyY2xlKHBvaW50cy5jaXJjbGVTdGFydEVsZW1lbnQsIGRhdGEuaWQsIHBvaW50cy5zdGFydCwgZGF0YS5zdGFydENpcmNsZVN0eWxlKTtcbiAgICB9XG4gICAgaWYgKGRhdGEuZW5kQ2lyY2xlICYmIHBvaW50cy5jaXJjbGVFbmRFbGVtZW50KSB7XG4gICAgICB0aGlzLnVwZGF0ZUF0dHJpYnV0ZUNpcmNsZShwb2ludHMuY2lyY2xlRW5kRWxlbWVudCwgZGF0YS5pZCwgcG9pbnRzLmVuZCwgZGF0YS5lbmRDaXJjbGVTdHlsZSk7XG4gICAgfVxuICAgIHRoaXMuaW5pdEV2ZW50KGRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3QmFsYW5jZWRDdXJ2ZShkUGF0aDogSUF0dHJpYnV0ZURPblBhdGgsIHBvaW50czogSVBvaW50cykge1xuICAgIGRQYXRoLk0gPSB7IHg6IHBvaW50cy5zdGFydC54LCB5OiBwb2ludHMuc3RhcnQueSB9O1xuICAgIGRQYXRoLlEgPSBbXG4gICAgICB7IHg6IHBvaW50cy5zdGFydC54ICsgKHBvaW50cy5lbmQueCAtIHBvaW50cy5zdGFydC54KSAvIDQsIHk6IHBvaW50cy5zdGFydC55ICsgKHBvaW50cy5lbmQueSAtIHBvaW50cy5zdGFydC55KSAvIDIgfSxcbiAgICAgIHsgeDogcG9pbnRzLnN0YXJ0LnggKyAocG9pbnRzLmVuZC54IC0gcG9pbnRzLnN0YXJ0LngpIC8gMiwgeTogcG9pbnRzLnN0YXJ0LnkgKyAocG9pbnRzLmVuZC55IC0gcG9pbnRzLnN0YXJ0LnkpIC8gMiB9LFxuICAgIF07XG4gICAgZFBhdGguUTIgPSBbXG4gICAgICB7IHg6IHBvaW50cy5lbmQueCAtIChwb2ludHMuZW5kLnggLSBwb2ludHMuc3RhcnQueCkgLyA0LCB5OiBwb2ludHMuc3RhcnQueSArIChwb2ludHMuZW5kLnkgLSBwb2ludHMuc3RhcnQueSkgLyAyIH0sXG4gICAgICB7IHg6IHBvaW50cy5lbmQueCwgeTogcG9pbnRzLmVuZC55IH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0JlbmRCb3RoRW5kc0N1cnZlKGRQYXRoOiBJQXR0cmlidXRlRE9uUGF0aCwgcG9pbnRzOiBJUG9pbnRzKSB7XG4gICAgY29uc3QgcG9pbnRYQ3VydmUgPSAocG9pbnRzLnN0YXJ0LnggKyBwb2ludHMuZW5kLngpICogMC41O1xuICAgIGNvbnN0IHBvaW50Q29udHJvbDEgPSB7IHg6IHBvaW50WEN1cnZlLCB5OiBwb2ludHMuc3RhcnQueSB9O1xuICAgIGNvbnN0IHBvaW50Q29udHJvbDIgPSB7IHg6IHBvaW50WEN1cnZlLCB5OiBwb2ludHMuZW5kLnkgfTtcblxuICAgIGRQYXRoLk0gPSB7IHg6IHBvaW50cy5zdGFydC54LCB5OiBwb2ludHMuc3RhcnQueSB9O1xuICAgIGRQYXRoLkMgPSBbXG4gICAgICB7IHg6IHBvaW50Q29udHJvbDEueCwgeTogcG9pbnRDb250cm9sMS55IH0sXG4gICAgICB7IHg6IHBvaW50Q29udHJvbDIueCwgeTogcG9pbnRDb250cm9sMi55IH0sXG4gICAgICB7IHg6IHBvaW50cy5lbmQueCwgeTogcG9pbnRzLmVuZC55IH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREQXR0cmlidXRlQnlQb2ludEVuZE1vZGVIb3Jpem9udGFsKGRQYXRoOiBJQXR0cmlidXRlRE9uUGF0aCwgcG9pbnRzOiBJUG9pbnRzLCBkaXN0YW5jZVBvaW50OiBudW1iZXIsIGN1cnZlOiBudW1iZXIsIG1vZGU6IFRZUEVfTU9ERSkge1xuICAgIGlmICghbW9kZS5pbmNsdWRlcygnaG9yaXpvbnRhbCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG11bHRpcGxpZXJYID0gcG9pbnRzLnN0YXJ0LnggPCBwb2ludHMuZW5kLnggPyAtMSA6IDE7XG4gICAgY29uc3QgbXVsdGlwbGllclkgPSBwb2ludHMuc3RhcnQueSA8IHBvaW50cy5lbmQueSA/IDEgOiAtMTtcbiAgICBjb25zdCByZXZlcnNlTXVsdGlwbGllciA9IC0xO1xuXG4gICAgZFBhdGguTSA9IHsgeDogcG9pbnRzLnN0YXJ0LngsIHk6IHBvaW50cy5zdGFydC55IH07XG4gICAgZFBhdGguTCA9IHsgeDogcG9pbnRzLmVuZC54ICsgKGRpc3RhbmNlUG9pbnQgKiAyICsgY3VydmUpICogbXVsdGlwbGllclgsIHk6IHBvaW50cy5zdGFydC55IH07XG4gICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2hvcml6b250YWwtc2luZ2xlJykpIHtcbiAgICAgIGRQYXRoLkwueCA9IHBvaW50cy5lbmQueCArIGN1cnZlICogbXVsdGlwbGllclg7XG4gICAgfVxuICAgIGRQYXRoLlEgPSBbXG4gICAgICB7IHg6IGRQYXRoLkwueCArIGN1cnZlICogbXVsdGlwbGllclggKiByZXZlcnNlTXVsdGlwbGllciwgeTogcG9pbnRzLnN0YXJ0LnkgfSxcbiAgICAgIHsgeDogZFBhdGguTC54ICsgY3VydmUgKiBtdWx0aXBsaWVyWCAqIHJldmVyc2VNdWx0aXBsaWVyLCB5OiBwb2ludHMuc3RhcnQueSArIGN1cnZlICogbXVsdGlwbGllclkgfSxcbiAgICBdO1xuICAgIGRQYXRoLkwyID0geyB4OiBkUGF0aC5RWzFdLngsIHk6IHBvaW50cy5lbmQueSArIGN1cnZlICogbXVsdGlwbGllclkgKiByZXZlcnNlTXVsdGlwbGllciB9O1xuICAgIGlmIChtb2RlLmluY2x1ZGVzKCdob3Jpem9udGFsLXNpbmdsZScpKSB7XG4gICAgICBkUGF0aC5MMiA9IHBvaW50cy5lbmQ7XG4gICAgfVxuICAgIGlmIChtb2RlID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIGRQYXRoLlEyID0gW1xuICAgICAgICB7IHg6IGRQYXRoLkwyLngsIHk6IHBvaW50cy5lbmQueSB9LFxuICAgICAgICB7IHg6IGRQYXRoLkwyLnggKyBkaXN0YW5jZVBvaW50ICogbXVsdGlwbGllclggKiByZXZlcnNlTXVsdGlwbGllciwgeTogcG9pbnRzLmVuZC55IH0sXG4gICAgICBdO1xuICAgICAgZFBhdGguTDMgPSB7IHg6IHBvaW50cy5lbmQueCwgeTogcG9pbnRzLmVuZC55IH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZERBdHRyaWJ1dGVCeVBvaW50RW5kTW9kZVZlcnRpY2FsKGRQYXRoOiBJQXR0cmlidXRlRE9uUGF0aCwgcG9pbnRzOiBJUG9pbnRzLCBkaXN0YW5jZVBvaW50OiBudW1iZXIsIGN1cnZlOiBudW1iZXIsIG1vZGU6IFRZUEVfTU9ERSkge1xuICAgIGlmICghbW9kZS5pbmNsdWRlcygndmVydGljYWwnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtdWx0aXBsaWVyWCA9IHBvaW50cy5zdGFydC54IDwgcG9pbnRzLmVuZC54ID8gLTEgOiAxO1xuICAgIGNvbnN0IG11bHRpcGxpZXJZID0gcG9pbnRzLnN0YXJ0LnkgPCBwb2ludHMuZW5kLnkgPyAxIDogLTE7XG4gICAgY29uc3QgcmV2ZXJzZU11bHRpcGxpZXIgPSAtMTtcblxuICAgIGRQYXRoLk0gPSBwb2ludHMuc3RhcnQ7XG4gICAgZFBhdGguTCA9IHsgeDogcG9pbnRzLnN0YXJ0LngsIHk6IHBvaW50cy5zdGFydC55ICsgZGlzdGFuY2VQb2ludCAqIG11bHRpcGxpZXJZIH07XG4gICAgaWYgKG1vZGUuaW5jbHVkZXMoJ3ZlcnRpY2FsLXNpbmdsZScpKSB7XG4gICAgICBkUGF0aC5MLnkgPSBwb2ludHMuZW5kLnkgKyBkaXN0YW5jZVBvaW50ICogbXVsdGlwbGllclkgKiByZXZlcnNlTXVsdGlwbGllcjtcbiAgICB9XG4gICAgZFBhdGguUSA9IFtcbiAgICAgIHsgeDogZFBhdGguTC54LCB5OiBkUGF0aC5MLnkgKyBjdXJ2ZSAqIG11bHRpcGxpZXJZIH0sXG4gICAgICB7IHg6IGRQYXRoLkwueCArIGN1cnZlICogbXVsdGlwbGllclggKiByZXZlcnNlTXVsdGlwbGllciwgeTogZFBhdGguTC55ICsgY3VydmUgKiBtdWx0aXBsaWVyWSB9LFxuICAgIF07XG4gICAgZFBhdGguTDIgPSB7IHg6IHBvaW50cy5lbmQueCArIGN1cnZlICogMiAqIG11bHRpcGxpZXJYLCB5OiBkUGF0aC5RWzFdLnkgfTtcbiAgICBpZiAobW9kZS5pbmNsdWRlcygndmVydGljYWwtc2luZ2xlJykpIHtcbiAgICAgIGRQYXRoLkwyID0gcG9pbnRzLmVuZDtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIGRQYXRoLlEyID0gW1xuICAgICAgICB7IHg6IHBvaW50cy5lbmQueCwgeTogZFBhdGguTDIueSB9LFxuICAgICAgICB7IHg6IHBvaW50cy5lbmQueCwgeTogZFBhdGguTDIueSArIGN1cnZlICogbXVsdGlwbGllclkgfSxcbiAgICAgIF07XG4gICAgICBkUGF0aC5MMyA9IHsgeDogcG9pbnRzLmVuZC54LCB5OiBwb2ludHMuZW5kLnkgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxEQXR0cmlidXRlVG9TdHJpbmcoZEF0dHJpYnV0ZTogSUF0dHJpYnV0ZURPblBhdGgpOiBzdHJpbmcge1xuICAgIGxldCBkU3RyaW5nID0gJyc7XG5cbiAgICBPYmplY3Qua2V5cyhkQXR0cmlidXRlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXQoZEF0dHJpYnV0ZSwga2V5KTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgY29uc3QgW3BvaW50MSwgcG9pbnQyLCBwb2ludDNdID0gZGF0YTtcblxuICAgICAgICBkU3RyaW5nID0gYCR7ZFN0cmluZ30ke2tleS5yZXBsYWNlKC9cXGQvZywgJycpfSR7cG9pbnQxLnh9LCR7cG9pbnQxLnl9ICR7cG9pbnQyLnh9LCR7cG9pbnQyLnl9JHtwb2ludDMgPyAnICcgKyBwb2ludDMueCArICcsJyArIHBvaW50My55IDogJyd9XG4gICAgICAgIGA7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZFN0cmluZyA9IGAke2RTdHJpbmd9JHtrZXkucmVwbGFjZSgvXFxkL2csICcnKX0ke2RhdGEueH0sJHtkYXRhLnl9XG4gICAgICBgO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRTdHJpbmc7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0eWxlQXJyb3cocG9pbnRzOiBJUG9pbnRzLCBtb2RlOiBUWVBFX01PREUsIGRhdGE6IElEcmF3TGluZURhdGFJbnB1dCkge1xuICAgIGlmICghcG9pbnRzLmFycm93RWxlbWVudCB8fCBkYXRhLmlnbm9yZURyYXdBcnJvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdHlsZUNvbmZpZyA9IHtcbiAgICAgIGZpbGw6IGRhdGEuYXJyb3dTdHlsZT8uZmlsbCA/PyAnIzlDQTJBRCcsXG4gICAgICBzdHJva2U6IGRhdGEuYXJyb3dTdHlsZT8uc3Ryb2tlID8/ICdub25lJyxcbiAgICAgIHN0cm9rZVdpZHRoOiBkYXRhLmFycm93U3R5bGU/LnN0cm9rZVdpZHRoID8/ICcwJyxcbiAgICAgIHdpZHRoOiBkYXRhLmFycm93U3R5bGU/LndpZHRoID8/IDYsXG4gICAgICBoZWlnaHQ6IGRhdGEuYXJyb3dTdHlsZT8uaGVpZ2h0ID8/IDgsXG4gICAgfTtcbiAgICBjb25zdCBwb2ludEVuZCA9IGNsb25lRGVlcChwb2ludHMuZW5kKTtcbiAgICBjb25zdCBhcnJvd0VsZW1lbnQgPSBwb2ludHMuYXJyb3dFbGVtZW50O1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGRhdGEuYXJyb3dEaXJlY3Rpb24gfHwgdGhpcy5nZXREaXJlY3Rpb24ocG9pbnRzLCBkYXRhLnN0YXJ0RW5kTW9kZSk7XG5cbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICBpZiAobW9kZS5pbmNsdWRlcygnaG9yaXpvbnRhbCcpIHx8IG1vZGUuaW5jbHVkZXMoJ3ZlcnRpY2FsJykpIHtcbiAgICAgICAgICBwb2ludEVuZC54IC09IHN0eWxlQ29uZmlnLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBhcnJvd0VsZW1lbnQ/LnNldEF0dHJpYnV0ZSgncG9pbnRzJywgYCR7cG9pbnRFbmQueH0sJHtwb2ludEVuZC55IC0gc3R5bGVDb25maWcud2lkdGh9ICAke3BvaW50RW5kLnggKyBzdHlsZUNvbmZpZy5oZWlnaHR9LCR7cG9pbnRFbmQueX0gJHtwb2ludEVuZC54fSwke3BvaW50RW5kLnkgKyBzdHlsZUNvbmZpZy53aWR0aH0gYCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2hvcml6b250YWwnKSB8fCBtb2RlLmluY2x1ZGVzKCd2ZXJ0aWNhbCcpKSB7XG4gICAgICAgICAgcG9pbnRFbmQueCArPSBzdHlsZUNvbmZpZy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgYXJyb3dFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIGAke3BvaW50RW5kLnh9LCR7cG9pbnRFbmQueSAtIHN0eWxlQ29uZmlnLndpZHRofSAgJHtwb2ludEVuZC54IC0gc3R5bGVDb25maWcuaGVpZ2h0fSwke3BvaW50RW5kLnl9ICR7cG9pbnRFbmQueH0sJHtwb2ludEVuZC55ICsgc3R5bGVDb25maWcud2lkdGh9IGApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2hvcml6b250YWwnKSB8fCBtb2RlLmluY2x1ZGVzKCd2ZXJ0aWNhbCcpKSB7XG4gICAgICAgICAgcG9pbnRFbmQueSArPSBzdHlsZUNvbmZpZy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgYXJyb3dFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIGAke3BvaW50RW5kLnggLSBzdHlsZUNvbmZpZy53aWR0aH0sJHtwb2ludEVuZC55fSAgJHtwb2ludEVuZC54fSwke3BvaW50RW5kLnkgLSBzdHlsZUNvbmZpZy5oZWlnaHR9ICR7cG9pbnRFbmQueCArIHN0eWxlQ29uZmlnLndpZHRofSwke3BvaW50RW5kLnl9IGApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2hvcml6b250YWwnKSB8fCBtb2RlLmluY2x1ZGVzKCd2ZXJ0aWNhbCcpKSB7XG4gICAgICAgICAgcG9pbnRFbmQueSAtPSBzdHlsZUNvbmZpZy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgYXJyb3dFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIGAke3BvaW50RW5kLnggLSBzdHlsZUNvbmZpZy53aWR0aH0sJHtwb2ludEVuZC55fSAgJHtwb2ludEVuZC54fSwke3BvaW50RW5kLnkgKyBzdHlsZUNvbmZpZy5oZWlnaHR9ICR7cG9pbnRFbmQueCArIHN0eWxlQ29uZmlnLndpZHRofSwke3BvaW50RW5kLnl9IGApO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBhcnJvd0VsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnZmlsbCcsIHN0eWxlQ29uZmlnLmZpbGwpO1xuICAgIGFycm93RWxlbWVudD8uc2V0QXR0cmlidXRlKCdzdHJva2UnLCBzdHlsZUNvbmZpZy5zdHJva2UpO1xuICAgIGFycm93RWxlbWVudD8uc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBzdHlsZUNvbmZpZy5zdHJva2VXaWR0aCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUF0dHJpYnV0ZUNpcmNsZShjaXJjbGVFbGVtZW50OiBTVkdDaXJjbGVFbGVtZW50LCBuYW1lOiBzdHJpbmcsIHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sIGNpcmNsZVN0eWxlPzogSUNpcmNsZVN0eWxlKSB7XG4gICAgY2lyY2xlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBuYW1lKTtcbiAgICBjaXJjbGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnY3gnLCBgJHtwb2ludC54fWApO1xuICAgIGNpcmNsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdjeScsIGAke3BvaW50Lnl9YCk7XG4gICAgY2lyY2xlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3InLCBgJHtjaXJjbGVTdHlsZT8uciA/PyAyfWApO1xuICAgIGNpcmNsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdmaWxsJywgYCR7Y2lyY2xlU3R5bGU/LmZpbGwgPz8gJ2dyZWVuJ31gKTtcbiAgICBjaXJjbGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgYCR7Y2lyY2xlU3R5bGU/LnN0cm9rZSA/PyAnIzlDQTJBRCd9YCk7XG4gICAgY2lyY2xlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIGAke2NpcmNsZVN0eWxlPy5zdHJva2VXaWR0aCA/PyAnMXB4J31gKTtcblxuICAgIHJldHVybiBjaXJjbGVFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXJlY3Rpb24ocG9pbnRzOiBJUG9pbnRzLCBzdGFydEVuZE1vZGU6ICdyaWdodC1sZWZ0JyB8ICdib3R0b20tdG9wJyB8ICdib3R0b20tbGVmdCcgfCB1bmRlZmluZWQpOiBUWVBFX0RJUkVDVElPTiB7XG4gICAgbGV0IHBvaW50U3RhcnQgPSB7IC4uLnBvaW50cy5zdGFydCB9O1xuXG4gICAgaWYgKHBvaW50cy5zZXBhcmF0ZWRQb2ludHMpIHtcbiAgICAgIGNvbnN0IGxpbmVUb0VuZCA9IHBvaW50cy5zZXBhcmF0ZWRQb2ludHMuZmluZCgoaXRlbSkgPT4gaXRlbS5lbmQueCA9PT0gcG9pbnRzLmVuZC54ICYmIGl0ZW0uZW5kLnkgPT09IHBvaW50cy5lbmQueSk7XG5cbiAgICAgIGlmIChsaW5lVG9FbmQpIHtcbiAgICAgICAgcG9pbnRTdGFydCA9IGxpbmVUb0VuZC5zdGFydDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbW9kZUhvcml6b250YWwgPSBwb2ludFN0YXJ0LnggPCBwb2ludHMuZW5kLnggPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgIGNvbnN0IG1vZGVWZXJ0aWNhbCA9IHBvaW50U3RhcnQueSA8IHBvaW50cy5lbmQueSA/ICdib3R0b20nIDogJ3RvcCc7XG5cbiAgICBpZiAoIXN0YXJ0RW5kTW9kZSkge1xuICAgICAgaWYgKE1hdGguYWJzKHBvaW50cy5lbmQueCAtIHBvaW50U3RhcnQueCkgPiBNYXRoLmFicyhwb2ludHMuZW5kLnkgLSBwb2ludFN0YXJ0LnkpKSB7XG4gICAgICAgIHJldHVybiBtb2RlSG9yaXpvbnRhbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1vZGVWZXJ0aWNhbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHN0YXJ0RW5kTW9kZSkge1xuICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICByZXR1cm4gbW9kZUhvcml6b250YWw7XG5cbiAgICAgIGNhc2UgJ3JpZ2h0LWxlZnQnOlxuICAgICAgICByZXR1cm4gbW9kZUhvcml6b250YWw7XG5cbiAgICAgIGNhc2UgJ2JvdHRvbS10b3AnOlxuICAgICAgICByZXR1cm4gbW9kZVZlcnRpY2FsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdEV2ZW50KGRhdGE6IElEcmF3TGluZURhdGFJbnB1dCkge1xuICAgIGNvbnN0IHBvaW50czogSVBvaW50cyA9IGRhdGEucG9pbnRzO1xuICAgIGxldCBwcmVFdmVudDogTW91c2VFdmVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGlmICgoIXBvaW50cy5hcnJvd0VsZW1lbnQgJiYgIXBvaW50cy5jaXJjbGVFbmRFbGVtZW50KSB8fCAhcG9pbnRzLm9uRGVzdHJveUV2ZW50IHx8IHBvaW50cy5pbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBvaW50cy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgY29uc3QgZnVuY3Rpb25Nb3VzZVVwID0gKG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmIChwcmVFdmVudCkge1xuICAgICAgICBwcmVFdmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5vbkRyYXdMaW5lRW5kLm5leHQoeyBkYXRhTGluZTogZGF0YSwgZXZlbnQ6IG1vdXNlRXZlbnQgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZXJEcmFnID0gKGRyYWdNb3VzZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIXByZUV2ZW50KSB7XG4gICAgICAgIHByZUV2ZW50ID0gZHJhZ01vdXNlRXZlbnQ7XG4gICAgICB9XG4gICAgICBjb25zdCBwb2ludEVuZCA9IGNsb25lRGVlcChwb2ludHMuZW5kKTtcblxuICAgICAgY29uc3QgbW92ZW1lbnRYID0gZHJhZ01vdXNlRXZlbnQuY2xpZW50WCAtIHByZUV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBtb3ZlbWVudFkgPSBkcmFnTW91c2VFdmVudC5jbGllbnRZIC0gcHJlRXZlbnQuY2xpZW50WTtcblxuICAgICAgcHJlRXZlbnQgPSBkcmFnTW91c2VFdmVudDtcbiAgICAgIHBvaW50RW5kLnggKz0gbW92ZW1lbnRYO1xuICAgICAgcG9pbnRFbmQueSArPSBtb3ZlbWVudFk7XG4gICAgICBpZiAoZGF0YS5wb2ludHM/Lm9ic3RhY2xlUmVjdD8ubGVuZ3RoICYmIGRhdGEucG9pbnRzPy5vYnN0YWNsZVJlY3Quc29tZSgob2JzdGFjbGVSZWN0KSA9PiB0aGlzLmNoZWNrUG9pbnRJbmNsdWRlUmVjdChwb2ludEVuZCwgb2JzdGFjbGVSZWN0KSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcG9pbnRzLmVuZC54ID0gcG9pbnRFbmQueDtcbiAgICAgIHBvaW50cy5lbmQueSA9IHBvaW50RW5kLnk7XG4gICAgICB0aGlzLmRyYXdMaW5lKGRhdGEpO1xuICAgICAgdGhpcy51cGRhdGVWaWV3Qm94KCk7XG4gICAgfTtcblxuICAgIGlmIChwb2ludHMuYXJyb3dFbGVtZW50KSB7XG4gICAgICBnZXREcmFnRXZlbnRCeUVsZW1lbnQoe1xuICAgICAgICBlbGVtZW50TW91c2VEb3duOiBwb2ludHMuYXJyb3dFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgIGZ1bmN0aW9uTW91c2VVcDogZnVuY3Rpb25Nb3VzZVVwLFxuICAgICAgICBvbkRlc3Ryb3k6IHRoaXMub25EZXN0cm95LFxuICAgICAgfSlcbiAgICAgICAgLnBpcGUodGFwKGhhbmRsZXJEcmFnKSwgdGFrZVVudGlsKHBvaW50cy5vbkRlc3Ryb3lFdmVudCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAocG9pbnRzLmNpcmNsZUVuZEVsZW1lbnQpIHtcbiAgICAgIGdldERyYWdFdmVudEJ5RWxlbWVudCh7XG4gICAgICAgIGVsZW1lbnRNb3VzZURvd246IHBvaW50cy5jaXJjbGVFbmRFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgIGZ1bmN0aW9uTW91c2VVcDogZnVuY3Rpb25Nb3VzZVVwLFxuICAgICAgICBvbkRlc3Ryb3k6IHRoaXMub25EZXN0cm95LFxuICAgICAgfSlcbiAgICAgICAgLnBpcGUodGFwKGhhbmRsZXJEcmFnKSwgdGFrZVVudGlsKHBvaW50cy5vbkRlc3Ryb3lFdmVudCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUG9pbnRJbmNsdWRlUmVjdChwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LCBvYnN0YWNsZVJlY3Q6IElSZWN0KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ2FwRGVmYXVsdCA9IDg7XG5cbiAgICBvYnN0YWNsZVJlY3QgPSB7XG4gICAgICB4OiBvYnN0YWNsZVJlY3QueCAtIChvYnN0YWNsZVJlY3QuZ2FwWE9ic3RhY2xlUmVjdCB8fCBnYXBEZWZhdWx0KSxcbiAgICAgIHk6IG9ic3RhY2xlUmVjdC55IC0gKG9ic3RhY2xlUmVjdC5nYXBZT2JzdGFjbGVSZWN0IHx8IGdhcERlZmF1bHQpLFxuICAgICAgd2lkdGg6IG9ic3RhY2xlUmVjdC53aWR0aCArIChvYnN0YWNsZVJlY3QuZ2FwWE9ic3RhY2xlUmVjdCB8fCBnYXBEZWZhdWx0KSAqIDIsXG4gICAgICBoZWlnaHQ6IG9ic3RhY2xlUmVjdC5oZWlnaHQgKyAob2JzdGFjbGVSZWN0LmdhcFlPYnN0YWNsZVJlY3QgfHwgZ2FwRGVmYXVsdCkgKiAyLFxuICAgIH07XG4gICAgaWYgKG9ic3RhY2xlUmVjdC54IDw9IHBvaW50LnggJiYgcG9pbnQueCA8PSBvYnN0YWNsZVJlY3QueCArIG9ic3RhY2xlUmVjdC53aWR0aCAmJiBvYnN0YWNsZVJlY3QueSA8PSBwb2ludC55ICYmIHBvaW50LnkgPD0gb2JzdGFjbGVSZWN0LnkgKyBvYnN0YWNsZVJlY3QuaGVpZ2h0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVBhdGhBbmRBcnJvd0VsZW1lbnQobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICBjb25zdCBhcnJvd0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BvbHlsaW5lJyk7XG4gICAgY29uc3QgY2lyY2xlU3RhcnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdjaXJjbGUnKTtcbiAgICBjb25zdCBjaXJjbGVFbmRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdjaXJjbGUnKTtcblxuICAgIHBhdGhFbGVtZW50LnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgIGFycm93RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBuYW1lKTtcbiAgICB0aGlzLnN2Z0VsZW1lbnQuYXBwZW5kKHBhdGhFbGVtZW50KTtcbiAgICB0aGlzLnN2Z0VsZW1lbnQuYXBwZW5kKGFycm93RWxlbWVudCk7XG5cbiAgICByZXR1cm4geyBwYXRoRWxlbWVudCwgYXJyb3dFbGVtZW50LCBjaXJjbGVTdGFydEVsZW1lbnQsIGNpcmNsZUVuZEVsZW1lbnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ2lyY2xlKG5hbWU6IHN0cmluZywgcG9pbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgIGlmICghdGhpcy5kcmF3UmVjdERlYnVnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNpcmNsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnY2lyY2xlJyk7XG5cbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCduYW1lJywgbmFtZSk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnY3gnLCBgJHtwb2ludC54fWApO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N5JywgYCR7cG9pbnQueX1gKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdyJywgJzInKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdzdHlsZScsICdmaWxsOiBub25lOyBzdHJva2U6IGJsdWU7IHN0cm9rZS13aWR0aDogMXB4OycpO1xuICAgIHRoaXMuc3ZnRWxlbWVudC5hcHBlbmRDaGlsZChjaXJjbGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckNpcmNsZSgpIHtcbiAgICBpZiAoIXRoaXMuZHJhd1JlY3REZWJ1Zykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBBcnJheS5mcm9tKHRoaXMuc3ZnRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY2lyY2xlJykpPy5mb3JFYWNoKChpdGVtKSA9PiBpdGVtLnJlbW92ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVjdChuYW1lOiBzdHJpbmcsIHJlY3Q6IElSZWN0KSB7XG4gICAgaWYgKCF0aGlzLmRyYXdSZWN0RGVidWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVjdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3JlY3QnKTtcbiAgICBjb25zdCB0ZXh0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAndGV4dCcpO1xuXG4gICAgcmVjdEVsZW1lbnQuc2V0QXR0cmlidXRlKCduYW1lJywgbmFtZSk7XG4gICAgcmVjdEVsZW1lbnQuc2V0QXR0cmlidXRlKCd4JywgYCR7cmVjdC54fWApO1xuICAgIHJlY3RFbGVtZW50LnNldEF0dHJpYnV0ZSgneScsIGAke3JlY3QueX1gKTtcbiAgICByZWN0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgYCR7cmVjdC53aWR0aH1gKTtcbiAgICByZWN0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGAke3JlY3QuaGVpZ2h0fWApO1xuICAgIHJlY3RFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZmlsbDogYmx1ZTsgc3Ryb2tlOiBibHVlOycpO1xuICAgIHRoaXMuc3ZnRWxlbWVudC5hcHBlbmRDaGlsZChyZWN0RWxlbWVudCk7XG5cbiAgICB0ZXh0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3gnLCBgJHtyZWN0Lnh9YCk7XG4gICAgdGV4dEVsZW1lbnQuc2V0QXR0cmlidXRlKCd5JywgYCR7cmVjdC55fWApO1xuICAgIHRleHRFbGVtZW50LnRleHRDb250ZW50ID0gcmVjdC5pZCA/PyAnJztcbiAgICB0aGlzLnN2Z0VsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dEVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclJlY3QoKSB7XG4gICAgaWYgKCF0aGlzLmRyYXdSZWN0RGVidWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgQXJyYXkuZnJvbSh0aGlzLnN2Z0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3JlY3QnKSk/LmZvckVhY2goKGl0ZW0pID0+IGl0ZW0ucmVtb3ZlKCkpO1xuICAgIEFycmF5LmZyb20odGhpcy5zdmdFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZXh0JykpPy5mb3JFYWNoKChpdGVtKSA9PiBpdGVtLnJlbW92ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRQYXRoQW5kRHJhd1NlcGFyYXRlZFBvaW50cyhkYXRhOiBJRHJhd0xpbmVEYXRhSW5wdXQsIHBvaW50czogSVBvaW50cywgbW9kZT86IFRZUEVfTU9ERSkge1xuICAgIGxldCBkUGF0aCA9IHt9IGFzIElBdHRyaWJ1dGVET25QYXRoO1xuICAgIGNvbnN0IHN0eWxlQ29uZmlnID0ge1xuICAgICAgY3VydmU6IGRhdGEubGluZVN0eWxlPy5jdXJ2ZSA/PyAxMCxcbiAgICAgIGRpc3RhbmNlUG9pbnQ6IGRhdGEubGluZVN0eWxlPy5kaXN0YW5jZVBvaW50ID8/IDEwLFxuICAgIH07XG5cbiAgICBsZXQgeyBjdXJ2ZSwgZGlzdGFuY2VQb2ludCB9ID0gc3R5bGVDb25maWc7XG5cbiAgICBtb2RlID0gbW9kZSB8fCAncXVhcnQtaW4nO1xuICAgIGlmIChtb2RlICE9PSAncXVhcnQtaW4nKSB7XG4gICAgICBjdXJ2ZSA9IGN1cnZlID8/IDEwO1xuICAgICAgZGlzdGFuY2VQb2ludCA9IGRpc3RhbmNlUG9pbnQgPz8gMTA7XG4gICAgfVxuICAgIGlmIChtb2RlID09PSAncXVhcnQtaW4nIHx8IHBvaW50cy5zdGFydC54ID09PSBwb2ludHMuZW5kLnggfHwgcG9pbnRzLnN0YXJ0LnkgPT09IHBvaW50cy5lbmQueSkge1xuICAgICAgdGhpcy5kcmF3QmFsYW5jZWRDdXJ2ZShkUGF0aCwgcG9pbnRzKTtcblxuICAgICAgaWYgKG1vZGUgPT09ICdxdWFydC1pbicpIHtcbiAgICAgICAgZFBhdGggPSB7fSBhcyBJQXR0cmlidXRlRE9uUGF0aDtcbiAgICAgICAgdGhpcy5kcmF3QmVuZEJvdGhFbmRzQ3VydmUoZFBhdGgsIHBvaW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmJ1aWxEQXR0cmlidXRlVG9TdHJpbmcoZFBhdGgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNhbGN1bGF0b3JEaXN0YW5jZVBvaW50QW5kQ3VydmUocG9pbnRzLCBkaXN0YW5jZVBvaW50LCBjdXJ2ZSwgbW9kZSk7XG5cbiAgICBkaXN0YW5jZVBvaW50ID0gcmVzdWx0LmRpc3RhbmNlUG9pbnQ7XG4gICAgY3VydmUgPSByZXN1bHQuY3VydmU7XG5cbiAgICB0aGlzLmJ1aWxkREF0dHJpYnV0ZUJ5UG9pbnRFbmRNb2RlSG9yaXpvbnRhbChkUGF0aCwgcG9pbnRzLCBkaXN0YW5jZVBvaW50IHx8IDAsIGN1cnZlIHx8IDAsIG1vZGUpO1xuICAgIHRoaXMuYnVpbGREQXR0cmlidXRlQnlQb2ludEVuZE1vZGVWZXJ0aWNhbChkUGF0aCwgcG9pbnRzLCBkaXN0YW5jZVBvaW50IHx8IDAsIGN1cnZlIHx8IDAsIG1vZGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbERBdHRyaWJ1dGVUb1N0cmluZyhkUGF0aCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIl19