inspector-ng 0.0.15 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, HostListener, Inject, Input, PLATFORM_ID, computed, inject, signal, viewChild, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, HostListener, Inject, Input, PLATFORM_ID, computed, effect, inject, signal, viewChild, } from '@angular/core';
2
2
  import { isPlatformBrowser } from '@angular/common';
3
3
  import { GUIDE_HITBOX_SIZE, GUIDE_SNAP_DISTANCE, } from './constants';
4
4
  import { getInspectMeasurement, getRectFromDom, getTargetElement, getVisibleTextBlocks, } from './dom';
@@ -16,11 +16,11 @@ import { GENERATED_EXTRA_PET_SPRITES } from './generated-pets-extra';
16
16
  import * as i0 from "@angular/core";
17
17
  const INSPECTOR_COMMAND_ACTIONS = [
18
18
  { id: 'save', label: 'Save', ariaLabel: 'Save checkpoint', keywords: 'save checkpoint capture state' },
19
- { id: 'select', label: 'Select', ariaLabel: 'Select mode', keywords: 'select inspect pointer element' },
19
+ { id: 'import', label: 'Paste', ariaLabel: 'Import checkpoint from clipboard', keywords: 'import paste load open json checkpoint restore clipboard' },
20
20
  { id: 'type', label: 'Type', ariaLabel: 'Toggle typography overlay', keywords: 'type typography text overlay' },
21
21
  { id: 'vertical', label: 'V', ariaLabel: 'Vertical guides', keywords: 'vertical v guide guides' },
22
22
  { id: 'horizontal', label: 'H', ariaLabel: 'Horizontal guides', keywords: 'horizontal h guide guides' },
23
- { id: 'off', label: 'Off', ariaLabel: 'Disable inspector', keywords: 'off disable inspector power' },
23
+ { id: 'select', label: 'Inspect', ariaLabel: 'Inspect mode', keywords: 'inspect select pointer element alt i' },
24
24
  ];
25
25
  const INSPECTOR_PETS = [
26
26
  {
@@ -170,6 +170,7 @@ export class inspectorComponent {
170
170
  this.overlayRoot = viewChild('overlayRoot');
171
171
  this.checkpointDialog = viewChild('checkpointDialog');
172
172
  this.checkpointSearch = viewChild('checkpointSearch');
173
+ this.checkpointRename = viewChild('checkpointRename');
173
174
  this.highlightColor = '#4f8cff';
174
175
  this.guideColor = '#ff7a00';
175
176
  this.hoverHighlightEnabled = true;
@@ -194,12 +195,17 @@ export class inspectorComponent {
194
195
  return terms.every((term) => searchableText.includes(term));
195
196
  });
196
197
  });
197
- this.commandResultCount = computed(() => this.filteredCheckpoints().length + this.filteredInspectorActions().length);
198
+ this.navigateTarget = computed(() => this.checkpointService?.resolveRoute(this.checkpointQuery()) ?? null);
199
+ this.actionIndexOffset = computed(() => this.filteredCheckpoints().length + (this.navigateTarget() ? 1 : 0));
200
+ this.commandResultCount = computed(() => this.actionIndexOffset() + this.filteredInspectorActions().length);
198
201
  this.activeCommandResultId = computed(() => {
199
202
  const checkpoint = this.filteredCheckpoints()[this.activeCommandIndex()];
200
203
  if (checkpoint)
201
204
  return `inspector-checkpoint-${checkpoint.id}`;
202
- const actionIndex = this.activeCommandIndex() - this.filteredCheckpoints().length;
205
+ if (this.navigateTarget() && this.activeCommandIndex() === this.filteredCheckpoints().length) {
206
+ return 'inspector-navigate';
207
+ }
208
+ const actionIndex = this.activeCommandIndex() - this.actionIndexOffset();
203
209
  const action = this.filteredInspectorActions()[actionIndex];
204
210
  return action ? `inspector-action-${action.id}` : null;
205
211
  });
@@ -207,6 +213,29 @@ export class inspectorComponent {
207
213
  this.toolMode = signal('none');
208
214
  this.guideOrientation = signal('vertical');
209
215
  this.guides = signal([]);
216
+ this.guideDistances = computed(() => {
217
+ const distances = [];
218
+ const preview = this.guidePreview();
219
+ const visibleGuides = preview
220
+ ? [...this.guides(), preview]
221
+ : this.guides();
222
+ for (const orientation of ['vertical', 'horizontal']) {
223
+ const positions = visibleGuides
224
+ .filter((guide) => guide.orientation === orientation)
225
+ .map((guide) => guide.position)
226
+ .filter((position, index, allPositions) => allPositions.indexOf(position) === index)
227
+ .sort((positionA, positionB) => positionA - positionB);
228
+ for (let index = 1; index < positions.length; index += 1) {
229
+ const start = positions[index - 1];
230
+ const end = positions[index];
231
+ const value = end - start;
232
+ if (value > 0.5) {
233
+ distances.push({ orientation, start, end, value });
234
+ }
235
+ }
236
+ }
237
+ return distances;
238
+ });
210
239
  this.hoverRect = signal(null);
211
240
  this.selectedGuideId = signal(null);
212
241
  this.selectedMeasurement = signal(null);
@@ -235,11 +264,19 @@ export class inspectorComponent {
235
264
  this.draggingGuideId = null;
236
265
  this.selectedElement = null;
237
266
  this.hoverElement = null;
267
+ this.hasSelectedPet = false;
238
268
  this.toastTimer = null;
239
269
  this.trackGuide = (_index, guide) => guide.id;
240
270
  this.trackTextBlock = (_index, block) => block.id;
241
271
  this.trackConnector = (_index, connector) => `${connector.x1}:${connector.y1}:${connector.x2}:${connector.y2}`;
242
272
  this.isBrowser = isPlatformBrowser(platformId);
273
+ effect(() => {
274
+ if (!this.editingCheckpointId())
275
+ return;
276
+ const input = this.checkpointRename()?.nativeElement;
277
+ input?.focus();
278
+ input?.select();
279
+ });
243
280
  }
244
281
  ngOnInit() {
245
282
  if (!this.isBrowser)
@@ -295,9 +332,57 @@ export class inspectorComponent {
295
332
  this.showCheckpointToast(this.checkpointService.error(), true);
296
333
  }
297
334
  }
335
+ downloadCheckpoint(checkpoint, event) {
336
+ event?.stopPropagation();
337
+ if (!this.isBrowser)
338
+ return;
339
+ const blob = new Blob([JSON.stringify(checkpoint, null, 2)], { type: 'application/json' });
340
+ const url = URL.createObjectURL(blob);
341
+ const anchor = document.createElement('a');
342
+ anchor.href = url;
343
+ anchor.download = this.checkpointFileName(checkpoint);
344
+ document.body.appendChild(anchor);
345
+ anchor.click();
346
+ anchor.remove();
347
+ URL.revokeObjectURL(url);
348
+ this.showCheckpointToast(`Exported “${checkpoint.name}”.`);
349
+ }
350
+ async beginImport() {
351
+ if (!this.checkpointService || this.checkpointService.busy())
352
+ return;
353
+ let text;
354
+ try {
355
+ text = await navigator.clipboard.readText();
356
+ }
357
+ catch {
358
+ this.showCheckpointToast('Could not read clipboard.', true);
359
+ return;
360
+ }
361
+ let parsed;
362
+ try {
363
+ parsed = JSON.parse(text);
364
+ }
365
+ catch {
366
+ this.showCheckpointToast('The clipboard does not contain valid JSON.', true);
367
+ return;
368
+ }
369
+ const checkpoint = await this.checkpointService.importCheckpoint(parsed);
370
+ if (checkpoint) {
371
+ this.showCheckpointToast(`Imported “${checkpoint.name}”.`);
372
+ if (this.commandBarOpen()) {
373
+ const index = this.filteredInspectorActions().findIndex(({ id }) => id === 'import');
374
+ if (index >= 0)
375
+ this.setActiveInspectorAction(index);
376
+ }
377
+ }
378
+ else if (this.checkpointService.error()) {
379
+ this.showCheckpointToast(this.checkpointService.error(), true);
380
+ }
381
+ }
298
382
  async openCheckpointCommandBar() {
299
383
  if (!this.checkpointService || !this.isBrowser || this.commandBarOpen())
300
384
  return;
385
+ this.randomizePet();
301
386
  this.commandBarOpen.set(true);
302
387
  this.checkpointQuery.set('');
303
388
  this.activeCommandIndex.set(0);
@@ -326,19 +411,14 @@ export class inspectorComponent {
326
411
  }
327
412
  cyclePet(event) {
328
413
  event?.stopPropagation();
329
- this.petIndex.update((index) => (index + 1) % INSPECTOR_PETS.length);
414
+ this.randomizePet();
330
415
  this.checkpointSearch()?.nativeElement.focus();
331
416
  }
332
417
  setActiveCheckpoint(index) {
333
418
  this.activeCommandIndex.set(index);
334
419
  }
335
- shouldShowCheckpointRoute(checkpoint) {
336
- if (!checkpoint.route.trim())
337
- return false;
338
- return this.normalizeCheckpointLabel(checkpoint.name) !== this.normalizeCheckpointLabel(checkpoint.route);
339
- }
340
420
  setActiveInspectorAction(index) {
341
- this.activeCommandIndex.set(this.filteredCheckpoints().length + index);
421
+ this.activeCommandIndex.set(this.actionIndexOffset() + index);
342
422
  }
343
423
  async executeInspectorAction(action) {
344
424
  if (this.checkpointService?.busy())
@@ -360,6 +440,9 @@ export class inspectorComponent {
360
440
  this.setActiveInspectorAction(index);
361
441
  }
362
442
  break;
443
+ case 'import':
444
+ await this.beginImport();
445
+ break;
363
446
  case 'vertical':
364
447
  this.activateGuideOrientation('vertical');
365
448
  this.closeCheckpointCommandBar();
@@ -368,10 +451,6 @@ export class inspectorComponent {
368
451
  this.activateGuideOrientation('horizontal');
369
452
  this.closeCheckpointCommandBar();
370
453
  break;
371
- case 'off':
372
- this.closeCheckpointCommandBar();
373
- this.disableInspector();
374
- break;
375
454
  }
376
455
  }
377
456
  async restoreCheckpoint(checkpoint) {
@@ -384,6 +463,37 @@ export class inspectorComponent {
384
463
  this.commandBarOpen.set(false);
385
464
  this.showCheckpointToast(`Restored “${checkpoint.name}”.`);
386
465
  }
466
+ activateCheckpoint(checkpoint, event) {
467
+ if (this.deletingCheckpointId() === checkpoint.id ||
468
+ this.editingCheckpointId() === checkpoint.id) {
469
+ return;
470
+ }
471
+ if (event?.shiftKey) {
472
+ void this.navigateToCheckpoint(checkpoint);
473
+ }
474
+ else {
475
+ void this.restoreCheckpoint(checkpoint);
476
+ }
477
+ }
478
+ async navigateToCheckpoint(checkpoint) {
479
+ if (!this.checkpointService || this.checkpointService.busy())
480
+ return;
481
+ if (!await this.checkpointService.navigateToRoute(checkpoint.route))
482
+ return;
483
+ this.checkpointDialog()?.nativeElement.close();
484
+ this.commandBarOpen.set(false);
485
+ this.showCheckpointToast(`Navigated to “${checkpoint.route}” — state unchanged.`);
486
+ }
487
+ async navigateToQueryRoute() {
488
+ const target = this.navigateTarget();
489
+ if (!this.checkpointService || !target || this.checkpointService.busy())
490
+ return;
491
+ if (!await this.checkpointService.navigateToRoute(target))
492
+ return;
493
+ this.checkpointDialog()?.nativeElement.close();
494
+ this.commandBarOpen.set(false);
495
+ this.showCheckpointToast(`Navigated to “${target}” — state unchanged.`);
496
+ }
387
497
  beginRename(checkpoint, event) {
388
498
  event?.stopPropagation();
389
499
  if (this.checkpointService?.busy())
@@ -391,11 +501,6 @@ export class inspectorComponent {
391
501
  this.editingCheckpointId.set(checkpoint.id);
392
502
  this.deletingCheckpointId.set(null);
393
503
  this.renameDraft.set(checkpoint.name);
394
- queueMicrotask(() => {
395
- const input = this.checkpointDialog()?.nativeElement.querySelector('.inspector-command-row__rename');
396
- input?.focus();
397
- input?.select();
398
- });
399
504
  }
400
505
  updateRenameDraft(event) {
401
506
  this.renameDraft.set(event.target.value);
@@ -450,7 +555,17 @@ export class inspectorComponent {
450
555
  this.selectedGuideId.set(guide.id);
451
556
  }
452
557
  formatEdges(edges) {
453
- return `${formatValue(edges.top)} ${formatValue(edges.right)} ${formatValue(edges.bottom)} ${formatValue(edges.left)}`;
558
+ const top = String(formatValue(edges.top));
559
+ const right = String(formatValue(edges.right));
560
+ const bottom = String(formatValue(edges.bottom));
561
+ const left = String(formatValue(edges.left));
562
+ if (top === right && top === bottom && top === left)
563
+ return top;
564
+ if (top === bottom && right === left)
565
+ return `${top} ${right}`;
566
+ if (right === left)
567
+ return `${top} ${right} ${bottom}`;
568
+ return `${top} ${right} ${bottom} ${left}`;
454
569
  }
455
570
  formatGap(selected) {
456
571
  return `${formatValue(selected.gap.row)} / ${formatValue(selected.gap.column)}`;
@@ -459,13 +574,38 @@ export class inspectorComponent {
459
574
  const key = event.key.toLowerCase();
460
575
  if (this.checkpointService &&
461
576
  !event.repeat &&
462
- (event.metaKey || event.ctrlKey) &&
463
- event.shiftKey &&
577
+ event.altKey &&
578
+ !event.ctrlKey &&
579
+ !event.metaKey &&
580
+ !event.shiftKey &&
464
581
  key === 'p') {
465
582
  event.preventDefault();
466
583
  this.commandBarOpen() ? this.closeCheckpointCommandBar() : void this.openCheckpointCommandBar();
467
584
  return;
468
585
  }
586
+ if (!event.repeat &&
587
+ event.altKey &&
588
+ !event.ctrlKey &&
589
+ !event.metaKey &&
590
+ !event.shiftKey &&
591
+ key === 'i') {
592
+ event.preventDefault();
593
+ this.setToolMode('select');
594
+ if (this.commandBarOpen())
595
+ this.closeCheckpointCommandBar();
596
+ return;
597
+ }
598
+ if (this.checkpointService &&
599
+ !event.repeat &&
600
+ event.altKey &&
601
+ !event.ctrlKey &&
602
+ !event.metaKey &&
603
+ !event.shiftKey &&
604
+ key === 's') {
605
+ event.preventDefault();
606
+ void this.saveCheckpoint();
607
+ return;
608
+ }
469
609
  if (this.commandBarOpen()) {
470
610
  this.handleCommandBarKeydown(event, key);
471
611
  return;
@@ -511,12 +651,6 @@ export class inspectorComponent {
511
651
  this.clearGuides();
512
652
  this.refreshTypographyBlocks();
513
653
  }
514
- normalizeCheckpointLabel(value) {
515
- return value
516
- .trim()
517
- .toLocaleLowerCase()
518
- .replace(/^\/+|\/+$/g, '');
519
- }
520
654
  handlePointerMove(event) {
521
655
  if (!this.enabled() || !this.isBrowser) {
522
656
  return;
@@ -627,8 +761,12 @@ export class inspectorComponent {
627
761
  handleCommandBarKeydown(event, key) {
628
762
  const checkpoints = this.filteredCheckpoints();
629
763
  const actions = this.filteredInspectorActions();
764
+ const navigateIndex = checkpoints.length;
765
+ const hasNavigateRow = this.navigateTarget() !== null;
630
766
  const activeCheckpoint = checkpoints[this.activeCommandIndex()];
631
- const activeActionIndex = this.activeCommandIndex() - checkpoints.length;
767
+ const activeNavigateRow = hasNavigateRow && this.activeCommandIndex() === navigateIndex;
768
+ const actionOffset = navigateIndex + (hasNavigateRow ? 1 : 0);
769
+ const activeActionIndex = this.activeCommandIndex() - actionOffset;
632
770
  const activeAction = actions[activeActionIndex];
633
771
  const target = event.target;
634
772
  const isRenameInput = target?.classList?.contains('inspector-command-row__rename') ?? false;
@@ -652,14 +790,32 @@ export class inspectorComponent {
652
790
  }
653
791
  if (isRenameInput)
654
792
  return;
793
+ if (key === 'f2' && activeCheckpoint) {
794
+ event.preventDefault();
795
+ this.beginRename(activeCheckpoint);
796
+ return;
797
+ }
798
+ if (key === 'delete' && activeCheckpoint) {
799
+ event.preventDefault();
800
+ void this.confirmDelete(activeCheckpoint);
801
+ return;
802
+ }
655
803
  if (key === 'arrowdown') {
656
804
  event.preventDefault();
657
- if (activeCheckpoint) {
805
+ if (activeAction && checkpoints.length) {
806
+ this.activeCommandIndex.set(0);
807
+ }
808
+ else if (activeCheckpoint) {
658
809
  const nextIndex = this.activeCommandIndex() < checkpoints.length - 1
659
810
  ? this.activeCommandIndex() + 1
660
- : actions.length ? checkpoints.length : this.activeCommandIndex();
811
+ : hasNavigateRow
812
+ ? navigateIndex
813
+ : actions.length ? actionOffset : this.activeCommandIndex();
661
814
  this.activeCommandIndex.set(nextIndex);
662
815
  }
816
+ else if (activeNavigateRow && actions.length) {
817
+ this.activeCommandIndex.set(actionOffset);
818
+ }
663
819
  this.scrollActiveCommandIntoView();
664
820
  return;
665
821
  }
@@ -668,27 +824,48 @@ export class inspectorComponent {
668
824
  if (activeAction && checkpoints.length) {
669
825
  this.activeCommandIndex.set(checkpoints.length - 1);
670
826
  }
827
+ else if (activeNavigateRow && checkpoints.length) {
828
+ this.activeCommandIndex.set(checkpoints.length - 1);
829
+ }
671
830
  else if (activeCheckpoint) {
672
- this.activeCommandIndex.set(Math.max(0, this.activeCommandIndex() - 1));
831
+ const nextIndex = this.activeCommandIndex() > 0
832
+ ? this.activeCommandIndex() - 1
833
+ : actions.length
834
+ ? actionOffset + actions.length - 1
835
+ : hasNavigateRow ? navigateIndex : 0;
836
+ this.activeCommandIndex.set(nextIndex);
673
837
  }
674
838
  this.scrollActiveCommandIntoView();
675
839
  return;
676
840
  }
677
- if (key === 'arrowright' && (activeCheckpoint || activeAction) && actions.length) {
841
+ if (key === 'arrowright' && (activeCheckpoint || activeNavigateRow || activeAction) && actions.length) {
678
842
  event.preventDefault();
679
843
  const nextActionIndex = activeAction
680
844
  ? Math.min(activeActionIndex + 1, actions.length - 1)
681
845
  : 0;
682
- this.activeCommandIndex.set(checkpoints.length + nextActionIndex);
846
+ this.activeCommandIndex.set(actionOffset + nextActionIndex);
683
847
  this.scrollActiveCommandIntoView();
684
848
  return;
685
849
  }
686
- if (key === 'arrowleft' && activeAction) {
850
+ if (key === 'arrowleft' && (activeCheckpoint || activeNavigateRow || activeAction) && actions.length) {
687
851
  event.preventDefault();
688
- this.activeCommandIndex.set(checkpoints.length + Math.max(0, activeActionIndex - 1));
852
+ const nextActionIndex = activeAction
853
+ ? (activeActionIndex - 1 + actions.length) % actions.length
854
+ : actions.length - 1;
855
+ this.activeCommandIndex.set(actionOffset + nextActionIndex);
689
856
  this.scrollActiveCommandIntoView();
690
857
  return;
691
858
  }
859
+ if (key === 'enter' && event.shiftKey && activeCheckpoint && !this.deletingCheckpointId()) {
860
+ event.preventDefault();
861
+ void this.navigateToCheckpoint(activeCheckpoint);
862
+ return;
863
+ }
864
+ if (key === 'enter' && activeNavigateRow) {
865
+ event.preventDefault();
866
+ void this.navigateToQueryRoute();
867
+ return;
868
+ }
692
869
  if (key === 'enter' && activeCheckpoint && !this.deletingCheckpointId()) {
693
870
  event.preventDefault();
694
871
  void this.restoreCheckpoint(activeCheckpoint);
@@ -719,6 +896,13 @@ export class inspectorComponent {
719
896
  this.checkpointToastIsError.set(false);
720
897
  }, 2500);
721
898
  }
899
+ checkpointFileName(checkpoint) {
900
+ const safe = checkpoint.name
901
+ .replace(/[\\/:*?"<>|]/g, '-')
902
+ .replace(/^-+|-+$/g, '')
903
+ .trim();
904
+ return `${safe || 'checkpoint'}.json`;
905
+ }
722
906
  selectElementAtPoint(event) {
723
907
  const overlay = this.overlayRoot()?.nativeElement ?? null;
724
908
  const target = getTargetElement({ x: event.clientX, y: event.clientY }, overlay);
@@ -753,13 +937,19 @@ export class inspectorComponent {
753
937
  if (!this.altPressed() ||
754
938
  !this.selectedElement ||
755
939
  !this.hoverElement ||
756
- this.selectedElement === this.hoverElement ||
757
- this.selectedElement.contains(this.hoverElement) ||
758
- this.hoverElement.contains(this.selectedElement)) {
940
+ this.selectedElement === this.hoverElement) {
759
941
  this.distanceOverlay.set(null);
760
942
  return;
761
943
  }
762
- this.distanceOverlay.set(getDistanceOverlay(getRectFromDom(this.selectedElement), getRectFromDom(this.hoverElement)));
944
+ const relation = this.getDistanceRelation(this.selectedElement, this.hoverElement);
945
+ this.distanceOverlay.set(getDistanceOverlay(getRectFromDom(this.selectedElement), getRectFromDom(this.hoverElement), relation));
946
+ }
947
+ getDistanceRelation(elementA, elementB) {
948
+ if (elementB.contains(elementA))
949
+ return 'a-inside-b';
950
+ if (elementA.contains(elementB))
951
+ return 'b-inside-a';
952
+ return undefined;
763
953
  }
764
954
  refreshTypographyBlocks() {
765
955
  if (!this.isBrowser || !this.enabled() || !this.showTypography()) {
@@ -781,6 +971,17 @@ export class inspectorComponent {
781
971
  },
782
972
  })));
783
973
  }
974
+ randomizePet() {
975
+ const currentIndex = this.hasSelectedPet ? this.petIndex() : null;
976
+ const availableCount = currentIndex === null
977
+ ? INSPECTOR_PETS.length
978
+ : INSPECTOR_PETS.length - 1;
979
+ const randomOffset = Math.floor(Math.random() * availableCount);
980
+ this.petIndex.set(currentIndex === null
981
+ ? randomOffset
982
+ : (currentIndex + 1 + randomOffset) % INSPECTOR_PETS.length);
983
+ this.hasSelectedPet = true;
984
+ }
784
985
  addGuide(guide) {
785
986
  const nextGuides = [...this.guides(), guide];
786
987
  this.guides.set(nextGuides);
@@ -837,11 +1038,11 @@ export class inspectorComponent {
837
1038
  return null;
838
1039
  }
839
1040
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: inspectorComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
840
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: inspectorComponent, isStandalone: true, selector: "inspector-overlay", inputs: { highlightColor: "highlightColor", guideColor: "guideColor", hoverHighlightEnabled: "hoverHighlightEnabled" }, host: { listeners: { "window:keydown": "handleKeydown($event)", "window:keyup": "handleKeyup($event)", "window:pointermove": "handlePointerMove($event)", "window:pointerup": "handlePointerUp()", "window:click": "handleClick($event)", "window:resize": "handleViewportChange()", "window:scroll": "handleViewportChange()" } }, viewQueries: [{ propertyName: "overlayRoot", first: true, predicate: ["overlayRoot"], descendants: true, isSignal: true }, { propertyName: "checkpointDialog", first: true, predicate: ["checkpointDialog"], descendants: true, isSignal: true }, { propertyName: "checkpointSearch", first: true, predicate: ["checkpointSearch"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"inspector-root\" #overlayRoot>\n @if (checkpointService) {\n <dialog\n #checkpointDialog\n class=\"inspector-command-dialog\"\n aria-labelledby=\"inspector-command-title\"\n (cancel)=\"$event.preventDefault(); closeCheckpointCommandBar()\"\n (click)=\"handleCheckpointDialogClick($event)\"\n >\n <section class=\"inspector-command\" (click)=\"$event.stopPropagation()\">\n <header class=\"inspector-command__search\">\n <label\n id=\"inspector-command-title\"\n class=\"inspector-visually-hidden\"\n for=\"inspector-checkpoint-search\"\n >\n inspector-ng command palette\n </label>\n <button\n type=\"button\"\n class=\"inspector-command__pet-switcher\"\n [attr.aria-label]=\"'Change pet. Current pet: ' + activePet().name\"\n [title]=\"'Change pet: ' + activePet().name\"\n (click)=\"cyclePet($event)\"\n >\n <img\n class=\"inspector-command__pet-sprite\"\n [src]=\"activePet().spriteSrc\"\n alt=\"\"\n aria-hidden=\"true\"\n draggable=\"false\"\n />\n </button>\n <input\n #checkpointSearch\n id=\"inspector-checkpoint-search\"\n type=\"search\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n placeholder=\"inspector-ng\u2026\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"commandBarOpen()\"\n [value]=\"checkpointQuery()\"\n [attr.aria-controls]=\"'inspector-checkpoint-results inspector-command-actions'\"\n [attr.aria-activedescendant]=\"activeCommandResultId()\"\n (input)=\"updateCheckpointQuery($event)\"\n />\n </header>\n\n @if (checkpointService.error(); as error) {\n <p\n class=\"inspector-command__message inspector-command__message--error\"\n role=\"alert\"\n >\n {{ error }}\n </p>\n }\n\n <div\n id=\"inspector-checkpoint-results\"\n class=\"inspector-command__results\"\n role=\"listbox\"\n aria-label=\"Saved checkpoints\"\n >\n @if (checkpointService.loading()) {\n <p class=\"inspector-command__message\" role=\"status\">Loading\u2026</p>\n } @else if (\n !checkpointService.checkpoints().length && !checkpointQuery().trim()\n ) {\n <p class=\"inspector-command__message\" role=\"status\">\n No checkpoints yet\n </p>\n } @else if (\n !filteredCheckpoints().length && !filteredInspectorActions().length\n ) {\n <p class=\"inspector-command__message\" role=\"status\">No matches</p>\n } @else {\n @for (\n checkpoint of filteredCheckpoints();\n track checkpoint.id;\n let index = $index\n ) {\n <div\n class=\"inspector-command-row\"\n role=\"option\"\n [id]=\"'inspector-checkpoint-' + checkpoint.id\"\n [attr.data-command-index]=\"index\"\n [attr.aria-selected]=\"activeCommandIndex() === index\"\n [class.is-active]=\"activeCommandIndex() === index\"\n [class.is-busy]=\"\n checkpointService.busy() && activeCommandIndex() === index\n \"\n (mouseenter)=\"setActiveCheckpoint(index)\"\n (click)=\"\n deletingCheckpointId() === checkpoint.id ||\n editingCheckpointId() === checkpoint.id\n ? null\n : restoreCheckpoint(checkpoint)\n \"\n >\n @if (deletingCheckpointId() === checkpoint.id) {\n <span class=\"inspector-command-row__confirm\"\n >Delete \u201C{{ checkpoint.name }}\u201D?</span\n >\n <span class=\"inspector-command-row__confirm-actions\">\n <button\n type=\"button\"\n class=\"is-danger\"\n (click)=\"confirmDelete(checkpoint, $event)\"\n >\n Delete\n </button>\n <button type=\"button\" (click)=\"cancelDelete($event)\">\n Keep\n </button>\n </span>\n } @else if (editingCheckpointId() === checkpoint.id) {\n <input\n class=\"inspector-command-row__rename\"\n aria-label=\"Checkpoint name\"\n [value]=\"renameDraft()\"\n (input)=\"updateRenameDraft($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span class=\"inspector-command-row__content\">\n <span class=\"inspector-command-row__name\">\n @if (\n checkpointService.busy() &&\n activeCommandIndex() === index\n ) {\n Restoring\u2026\n } @else {\n {{ checkpoint.name }}\n }\n </span>\n <span class=\"inspector-command-row__meta\">\n @if (shouldShowCheckpointRoute(checkpoint)) {\n <span class=\"inspector-command-row__route\">{{\n checkpoint.route\n }}</span>\n <span\n class=\"inspector-command-row__separator\"\n aria-hidden=\"true\"\n >\u00B7</span\n >\n }\n <span class=\"inspector-command-row__activity\">\n {{ checkpoint.lastUsedAt ? \"Used\" : \"Saved\" }}\n {{\n formatRelativeTime(checkpointActivityAt(checkpoint))\n }}\n </span>\n </span>\n </span>\n <span class=\"inspector-command-row__actions\">\n <button\n type=\"button\"\n (click)=\"beginRename(checkpoint, $event)\"\n [attr.aria-label]=\"'Rename ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"m11.8 1.8 2.4 2.4-8.3 8.3-3.1.7.7-3.1zm-8 10.4 1.5-.3-1.2-1.2z\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n (click)=\"beginDelete(checkpoint, $event)\"\n [attr.aria-label]=\"'Delete ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.5 2h5l.5 1H14v1.25H2V3h3zm-2 3.25h9L12 14H4z\"\n />\n </svg>\n </button>\n </span>\n }\n </div>\n }\n }\n </div>\n\n @if (filteredInspectorActions().length) {\n <footer\n id=\"inspector-command-actions\"\n class=\"inspector-command__actions\"\n role=\"listbox\"\n aria-label=\"Inspector actions\"\n aria-orientation=\"horizontal\"\n >\n @for (\n action of filteredInspectorActions();\n track action.id;\n let index = $index\n ) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"inspector-command-action\"\n [id]=\"'inspector-action-' + action.id\"\n [attr.data-command-index]=\"filteredCheckpoints().length + index\"\n [attr.aria-label]=\"action.ariaLabel\"\n [attr.aria-selected]=\"\n activeCommandIndex() === filteredCheckpoints().length + index\n \"\n [attr.aria-disabled]=\"checkpointService.busy()\"\n [class.is-selected]=\"\n activeCommandIndex() === filteredCheckpoints().length + index\n \"\n [class.is-active]=\"\n (action.id === 'select' && toolMode() === 'select') ||\n (action.id === 'type' && showTypography()) ||\n (action.id === 'vertical' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'vertical') ||\n (action.id === 'horizontal' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'horizontal')\n \"\n [class.inspector-command-action--danger]=\"action.id === 'off'\"\n [disabled]=\"checkpointService.busy()\"\n (mouseenter)=\"setActiveInspectorAction(index)\"\n (click)=\"executeInspectorAction(action)\"\n >\n @switch (action.id) {\n @case (\"select\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n }\n @case (\"type\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n }\n @case (\"save\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M2.5 2h9.6l1.4 1.4V14h-11zm2 1.5v3h6v-3zm.5 6V12h6V9.5z\"\n />\n </svg>\n }\n @case (\"vertical\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n }\n @case (\"horizontal\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n }\n @case (\"off\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M7.25 1.5h1.5v6h-1.5zM4.1 3.35l.96 1.15A4.25 4.25 0 1 0 10.94 4.5l.96-1.15A5.75 5.75 0 1 1 4.1 3.35z\"\n />\n </svg>\n }\n }\n <span>{{ action.label }}</span>\n </button>\n }\n </footer>\n }\n </section>\n </dialog>\n }\n\n @if (checkpointToast(); as toast) {\n <p\n class=\"inspector-checkpoint-toast\"\n [class.inspector-checkpoint-toast--error]=\"checkpointToastIsError()\"\n [attr.role]=\"checkpointToastIsError() ? 'alert' : 'status'\"\n >\n {{ toast }}\n </p>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n [attr.aria-label]=\"\n (guide.orientation === 'vertical' ? 'Vertical' : 'Horizontal') +\n ' guide at ' +\n formatValue(guide.position) +\n ' pixels'\n \"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: oklch(20% .012 280 / .92);--inspector-panel-edge: oklch(100% 0 0 / .08);--inspector-text: oklch(96% .005 280);--inspector-muted: oklch(70% .014 280);--inspector-faint: oklch(56% .012 280);--inspector-blue: oklch(68% .15 255);--inspector-blue-soft: oklch(68% .15 255 / .14);--inspector-orange: oklch(78% .14 70);--inspector-green: oklch(74% .15 150);--inspector-violet: oklch(72% .15 305);--inspector-radius: 8px;--inspector-shadow: 0 12px 32px oklch(6% .02 280 / .5);--inspector-font: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;--inspector-ease: cubic-bezier(.16, 1, .3, 1);position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:var(--inspector-font);color:var(--inspector-text);-webkit-font-smoothing:antialiased}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-command-dialog{--command-surface: oklch(17.5% .012 280);--command-surface-active: oklch(25% .012 280);--command-edge: oklch(100% 0 0 / .08);--command-text: oklch(96% .005 280);--command-muted: oklch(68% .014 280);--command-faint: oklch(52% .012 280);--command-accent: oklch(72% .13 255);--command-danger: oklch(68% .17 25);box-sizing:border-box;inset-block-start:max(10vh,48px);width:min(420px,calc(100vw - 24px));max-width:none;max-height:min(360px,calc(100vh - 64px));margin:0 auto;padding:0;overflow:hidden;border:1px solid var(--command-edge);border-radius:var(--inspector-radius);background:var(--command-surface);color:var(--command-text);box-shadow:var(--inspector-shadow);opacity:0;pointer-events:auto;transform:translateY(-4px);transition:opacity .1s ease,transform .1s ease,overlay .1s allow-discrete,display .1s allow-discrete;font-family:var(--inspector-font);-webkit-font-smoothing:antialiased}.inspector-command-dialog[open]{opacity:1;transform:none;transition-duration:.14s;transition-timing-function:var(--inspector-ease)}@starting-style{.inspector-command-dialog[open]{opacity:0;transform:translateY(-4px)}}.inspector-command-dialog::backdrop{background:#01010266}.inspector-command{display:grid;grid-template-rows:auto auto 1fr auto;min-width:0;min-height:0;max-height:min(360px,calc(100vh - 64px))}.inspector-command__search{display:flex;align-items:center;gap:8px;min-height:40px;padding:0 11px;border-bottom:1px solid var(--command-edge)}.inspector-command__pet-switcher{display:block;width:28px;height:28px;flex:0 0 auto;padding:0;overflow:hidden;border:0;border-radius:4px;background:transparent;cursor:pointer;opacity:.72;transition:opacity .14s var(--inspector-ease),transform .1s var(--inspector-ease)}.inspector-command__pet-sprite{display:block;width:500%;height:100%;max-width:none;image-rendering:pixelated;-webkit-user-select:none;user-select:none;transform:translate(0)}.inspector-command__search:focus-within .inspector-command__pet-switcher,.inspector-command__pet-switcher:hover,.inspector-command__pet-switcher:focus-visible{opacity:1}.inspector-command__pet-switcher:hover,.inspector-command__pet-switcher:focus-visible{background:#6aa7f41f}.inspector-command__pet-switcher:active{transform:scale(.94)}.inspector-command__pet-switcher:focus-visible{outline:1px solid var(--command-accent);outline-offset:1px}@media (prefers-reduced-motion: no-preference){.inspector-command__search:focus-within .inspector-command__pet-sprite{animation:inspector-pet-cycle 1s steps(1,end) infinite}}@keyframes inspector-pet-cycle{0%,19.99%{transform:translate(0)}20%,39.99%{transform:translate(-20%)}40%,59.99%{transform:translate(-40%)}60%,79.99%{transform:translate(-60%)}80%,to{transform:translate(-80%)}}.inspector-command__search input,.inspector-command-row__rename{min-width:0;border:0;outline:0;background:transparent;color:var(--command-text);font:inherit}.inspector-command__search input{flex:1 1 auto;width:100%;height:39px;padding:0;font-size:13px;font-weight:450;line-height:1.3}.inspector-command__search input::placeholder{color:var(--command-faint);opacity:1}.inspector-command__search input::-webkit-search-cancel-button{display:none}.inspector-command__results{min-height:0;max-height:260px;overflow:auto;padding:5px;scrollbar-width:thin;scrollbar-color:oklch(100% 0 0 / .1) transparent}.inspector-command-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;min-height:34px;padding:0 7px 0 9px;border-radius:5px;cursor:pointer;-webkit-user-select:none;user-select:none}.inspector-command-row.is-active{background:var(--command-surface-active);box-shadow:inset 0 0 0 1px #6aa7f49e}.inspector-command-row.is-busy{cursor:wait;pointer-events:none;opacity:.7}.inspector-command-row__content{display:flex;align-items:baseline;gap:8px;min-width:0;overflow:hidden}.inspector-command-row__name{flex:0 1 auto;min-width:3ch;overflow:hidden;color:var(--command-text);font-size:12px;font-weight:500;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.inspector-command-row__meta{display:inline-flex;flex:0 1 auto;align-items:baseline;gap:4px;min-width:0;overflow:hidden;color:var(--command-faint);font-size:11px;font-weight:400;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.inspector-command-row__route{min-width:0;overflow:hidden;text-overflow:ellipsis}.inspector-command-row__separator,.inspector-command-row__activity{flex:0 0 auto}.inspector-command-row.is-active .inspector-command-row__meta{color:#c2c3cc}.inspector-command-row__actions,.inspector-command-row__confirm-actions{display:flex;align-items:center;gap:1px}.inspector-command-row__actions{opacity:0;pointer-events:none}.inspector-command-row:hover .inspector-command-row__actions,.inspector-command-row:focus-within .inspector-command-row__actions{opacity:1;pointer-events:auto}.inspector-command-row button{display:inline-grid;width:22px;min-height:22px;padding:0;place-items:center;border:0;border-radius:4px;background:transparent;color:var(--command-muted);cursor:pointer;font-family:inherit;font-size:10px;font-weight:550;line-height:1.2}.inspector-command-row button svg{width:11px;height:11px;fill:currentColor}.inspector-command-row button:hover{background:#ffffff12;color:var(--command-text)}.inspector-command-row button.is-danger{width:auto;padding:0 7px;color:var(--command-danger);font-size:11px}.inspector-command-row button.is-danger:hover{background:#ef66611f}.inspector-command-row__confirm-actions button:not(.is-danger){width:auto;padding:0 7px;font-size:11px}.inspector-command-row button:focus-visible,.inspector-command-row__rename:focus-visible{outline:1px solid var(--command-accent);outline-offset:1px}.inspector-command-row__confirm{grid-column:1;color:var(--command-text);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.inspector-command-row__rename{grid-column:1 / -1;min-height:26px;padding-inline:6px;border:1px solid oklch(72% .13 255 / .4);border-radius:4px;background:#191a21;font-size:12px;font-weight:500}.inspector-command__message{margin:0;padding:16px 10px;color:var(--command-faint);font-size:12px;line-height:1.4;text-align:center}.inspector-command__message--error{padding:6px 10px;border-bottom:1px solid oklch(55% .08 25 / .3);background:#39191780;color:#f7cbc7;text-align:left;font-size:11px}.inspector-command__actions{display:flex;gap:2px;padding:4px;border-top:1px solid var(--command-edge)}.inspector-command-action{display:flex;flex:1 1 0;min-width:0;min-height:28px;align-items:center;justify-content:center;gap:4px;padding:0 4px;overflow:hidden;border:0;border-radius:5px;background:transparent;color:var(--command-muted);cursor:pointer;font:inherit;font-size:10px;font-weight:500;line-height:1;text-align:left}.inspector-command-action svg{width:11px;height:11px;flex:0 0 auto;fill:currentColor}.inspector-command-action span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inspector-command-action:hover:not(:disabled){background:#ffffff0f;color:var(--command-text)}.inspector-command-action.is-active{background:#6aa7f421;color:#c2daf9}.inspector-command-action.is-selected,.inspector-command-action.is-selected:hover:not(:disabled){background:var(--command-surface-active);color:var(--command-text);box-shadow:inset 0 0 0 1px #6aa7f49e}.inspector-command-action--danger:hover:not(:disabled){background:#ef66611a;color:#f5b9b4}.inspector-command-action:disabled{cursor:wait;opacity:.45}.inspector-command-action:focus-visible{outline:1px solid var(--command-accent);outline-offset:-1px}.inspector-visually-hidden{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.inspector-checkpoint-toast{position:fixed;top:10px;left:50%;z-index:500;margin:0;padding:5px 10px;border:1px solid oklch(74% .12 150 / .25);border-radius:999px;background:#0e1f12f0;color:#cce6d0;box-shadow:var(--inspector-shadow);font-size:11px;font-weight:520;line-height:1.25;pointer-events:none;transform:translate(-50%)}.inspector-checkpoint-toast--error{border-color:#e2726b4d;background:#351311f0;color:#fed2cd}@media (prefers-reduced-motion: reduce){.inspector-command-dialog{transition-duration:.01ms!important}.inspector-command-dialog,.inspector-command-dialog[open]{transform:none}.inspector-command__pet-switcher{transition:none}.inspector-command__pet-sprite{animation:none;transform:translate(0)}}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f0a646d1;background:#f0a64614}.inspector-box--padding{border-color:#5ac576d1;background:#5ac57614}.inspector-box--gap{border-color:#bb8aefb8;background:#bb8aef0d}.inspector-box--distance{border-style:dashed;border-color:#539af2b3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 6px));max-width:min(380px,calc(100vw - 20px));padding:4px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:var(--inspector-shadow);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);font-size:10px;font-weight:500;line-height:1.2;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:3px 5px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#0e0f15f0;color:var(--inspector-text);font-size:9px;font-weight:520;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#f5c076}.inspector-box-tag--padding{color:#95dfa4;transform:translateY(0)}.inspector-box-tag--gap{color:oklch(86% .09 305)}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:5px;align-items:center;padding:3px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#0e0f15f0;color:#e4e4e9;font-size:9px;font-weight:500;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:7px;height:7px;border-radius:999px;border:1px solid oklch(100% 0 0 / .16);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#539af2b8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:3px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#0e0f15f2;color:var(--inspector-text);font-size:9px;font-weight:520;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}@media (min-width: 769px) and (min-height: 769px){:host{--inspector-radius: 14px;--inspector-shadow: 0 21px 56px oklch(6% .02 280 / .5)}.inspector-command-dialog{inset-block-start:max(10vh,84px);width:min(735px,calc(100vw - 42px));max-height:min(630px,calc(100vh - 112px))}.inspector-command{max-height:min(630px,calc(100vh - 112px))}.inspector-command__search{gap:14px;min-height:70px;padding:0 19.25px}.inspector-command__pet-switcher{width:42px;height:42px}.inspector-command__search input{height:68.25px;font-size:22.75px}.inspector-command__results{max-height:455px;padding:8.75px}.inspector-command-row{gap:10.5px;min-height:59.5px;padding:0 12.25px 0 15.75px;border-radius:8.75px}.inspector-command-row__content{gap:14px}.inspector-command-row__name,.inspector-command-row__confirm{font-size:21px}.inspector-command-row__meta{gap:7px;font-size:19.25px}.inspector-command-row__actions,.inspector-command-row__confirm-actions{gap:1.75px}.inspector-command-row button{width:38.5px;min-height:38.5px;border-radius:7px;font-size:17.5px}.inspector-command-row button svg{width:19.25px;height:19.25px}.inspector-command-row button.is-danger,.inspector-command-row__confirm-actions button:not(.is-danger){padding:0 12.25px;font-size:19.25px}.inspector-command-row__rename{min-height:45.5px;padding-inline:10.5px;border-radius:7px;font-size:21px}.inspector-command__message{padding:28px 17.5px;font-size:21px}.inspector-command__message--error{padding:10.5px 17.5px;font-size:19.25px}.inspector-command__actions{gap:3.5px;padding:7px}.inspector-command-action{min-height:49px;gap:7px;padding:0 7px;border-radius:8.75px;font-size:17.5px}.inspector-command-action svg{width:19.25px;height:19.25px}.inspector-checkpoint-toast{top:17.5px;padding:8.75px 17.5px;font-size:19.25px}.inspector-label{transform:translateY(calc(-100% - 10.5px));max-width:min(665px,calc(100vw - 35px));padding:7px 12.25px;font-size:17.5px}.inspector-box-tag{padding:5.25px 8.75px;font-size:15.75px}.inspector-box-tag--padding{transform:translateY(0)}.inspector-text-chip{gap:8.75px;padding:5.25px 10.5px;font-size:15.75px}.inspector-text-chip__swatch{width:12.25px;height:12.25px}.inspector-distance-tag{padding:5.25px 10.5px;font-size:15.75px}.inspector-guide--vertical{width:24.5px}.inspector-guide--horizontal{height:24.5px}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1041
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: inspectorComponent, isStandalone: true, selector: "inspector-overlay", inputs: { highlightColor: "highlightColor", guideColor: "guideColor", hoverHighlightEnabled: "hoverHighlightEnabled" }, host: { listeners: { "window:keydown": "handleKeydown($event)", "window:keyup": "handleKeyup($event)", "window:pointermove": "handlePointerMove($event)", "window:pointerup": "handlePointerUp()", "window:click": "handleClick($event)", "window:resize": "handleViewportChange()", "window:scroll": "handleViewportChange()" } }, viewQueries: [{ propertyName: "overlayRoot", first: true, predicate: ["overlayRoot"], descendants: true, isSignal: true }, { propertyName: "checkpointDialog", first: true, predicate: ["checkpointDialog"], descendants: true, isSignal: true }, { propertyName: "checkpointSearch", first: true, predicate: ["checkpointSearch"], descendants: true, isSignal: true }, { propertyName: "checkpointRename", first: true, predicate: ["checkpointRename"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"inspector-root\" #overlayRoot>\n @if (checkpointService) {\n <dialog\n #checkpointDialog\n class=\"inspector-command-dialog\"\n aria-labelledby=\"inspector-command-title\"\n (cancel)=\"$event.preventDefault(); closeCheckpointCommandBar()\"\n (click)=\"handleCheckpointDialogClick($event)\"\n >\n <section class=\"inspector-command\" (click)=\"$event.stopPropagation()\">\n <header class=\"inspector-command__search\">\n <label\n id=\"inspector-command-title\"\n class=\"inspector-visually-hidden\"\n for=\"inspector-checkpoint-search\"\n >\n inspector-ng command palette\n </label>\n <button\n type=\"button\"\n class=\"inspector-command__pet-switcher\"\n [attr.aria-label]=\"'Change pet. Current pet: ' + activePet().name\"\n [title]=\"'Change pet: ' + activePet().name\"\n (click)=\"cyclePet($event)\"\n >\n <img\n class=\"inspector-command__pet-sprite\"\n [src]=\"activePet().spriteSrc\"\n alt=\"\"\n aria-hidden=\"true\"\n draggable=\"false\"\n />\n </button>\n <input\n #checkpointSearch\n id=\"inspector-checkpoint-search\"\n type=\"search\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n placeholder=\"inspector-ng\u2026\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"commandBarOpen()\"\n [value]=\"checkpointQuery()\"\n [attr.aria-controls]=\"'inspector-checkpoint-results inspector-command-actions'\"\n [attr.aria-activedescendant]=\"activeCommandResultId()\"\n (input)=\"updateCheckpointQuery($event)\"\n />\n </header>\n\n @if (checkpointService.error(); as error) {\n <p\n class=\"inspector-command__message inspector-command__message--error\"\n role=\"alert\"\n >\n {{ error }}\n </p>\n }\n\n <div\n id=\"inspector-checkpoint-results\"\n class=\"inspector-command__results\"\n role=\"listbox\"\n aria-label=\"Saved checkpoints\"\n >\n @if (checkpointService.loading()) {\n <p class=\"inspector-command__message\" role=\"status\">Loading\u2026</p>\n } @else if (\n !checkpointService.checkpoints().length && !checkpointQuery().trim()\n ) {\n <p class=\"inspector-command__message\" role=\"status\">\n No checkpoints yet\n </p>\n } @else if (\n !filteredCheckpoints().length &&\n !filteredInspectorActions().length &&\n !navigateTarget()\n ) {\n <p class=\"inspector-command__message\" role=\"status\">No matches</p>\n } @else {\n @for (\n checkpoint of filteredCheckpoints();\n track checkpoint.id;\n let index = $index\n ) {\n <div\n class=\"inspector-command-row\"\n role=\"option\"\n [id]=\"'inspector-checkpoint-' + checkpoint.id\"\n [attr.data-command-index]=\"index\"\n [attr.aria-selected]=\"activeCommandIndex() === index\"\n [class.is-active]=\"activeCommandIndex() === index\"\n [class.is-busy]=\"\n checkpointService.busy() && activeCommandIndex() === index\n \"\n (mouseenter)=\"setActiveCheckpoint(index)\"\n (click)=\"activateCheckpoint(checkpoint, $event)\"\n >\n @if (deletingCheckpointId() === checkpoint.id) {\n <span class=\"inspector-command-row__confirm\"\n >Delete \u201C{{ checkpoint.name }}\u201D?</span\n >\n <span class=\"inspector-command-row__confirm-actions\">\n <button\n type=\"button\"\n class=\"is-danger\"\n (click)=\"confirmDelete(checkpoint, $event)\"\n >\n Delete\n </button>\n <button type=\"button\" (click)=\"cancelDelete($event)\">\n Keep\n </button>\n </span>\n } @else if (editingCheckpointId() === checkpoint.id) {\n <input\n #checkpointRename\n class=\"inspector-command-row__rename\"\n aria-label=\"Checkpoint name\"\n [value]=\"renameDraft()\"\n (input)=\"updateRenameDraft($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span class=\"inspector-command-row__content\">\n <span\n class=\"inspector-command-row__name\"\n [title]=\"checkpoint.name\"\n >\n <bdi dir=\"ltr\">\n @if (\n checkpointService.busy() &&\n activeCommandIndex() === index\n ) {\n Restoring\u2026\n } @else {\n {{ checkpoint.name }}\n }\n </bdi>\n </span>\n <span class=\"inspector-command-row__activity\">\n {{ checkpoint.lastUsedAt ? \"Used\" : \"Saved\" }}\n {{\n formatRelativeTime(checkpointActivityAt(checkpoint))\n }}\n </span>\n </span>\n <span class=\"inspector-command-row__actions\">\n <button\n type=\"button\"\n (click)=\"beginRename(checkpoint, $event)\"\n [attr.aria-label]=\"'Rename ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"m11.8 1.8 2.4 2.4-8.3 8.3-3.1.7.7-3.1zm-8 10.4 1.5-.3-1.2-1.2z\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n (click)=\"downloadCheckpoint(checkpoint, $event)\"\n [attr.aria-label]=\"'Export ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M7.25 2h1.5v5.44l1.72-1.72L11.53 6.78 8 10.31 4.47 6.78l1.06-1.06 1.72 1.72zM2.5 12h11v1.5h-11z\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n (click)=\"beginDelete(checkpoint, $event)\"\n [attr.aria-label]=\"'Delete ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.5 2h5l.5 1H14v1.25H2V3h3zm-2 3.25h9L12 14H4z\"\n />\n </svg>\n </button>\n </span>\n }\n </div>\n }\n @if (navigateTarget(); as target) {\n <div\n class=\"inspector-command-row inspector-command-row--navigate\"\n role=\"option\"\n id=\"inspector-navigate\"\n [attr.data-command-index]=\"filteredCheckpoints().length\"\n [attr.aria-selected]=\"\n activeCommandIndex() === filteredCheckpoints().length\n \"\n [class.is-active]=\"\n activeCommandIndex() === filteredCheckpoints().length\n \"\n [class.is-busy]=\"\n checkpointService.busy() &&\n activeCommandIndex() === filteredCheckpoints().length\n \"\n (mouseenter)=\"setActiveCheckpoint(filteredCheckpoints().length)\"\n (click)=\"navigateToQueryRoute()\"\n >\n <span class=\"inspector-command-row__content\">\n <span\n class=\"inspector-command-row__name\"\n [title]=\"'Navigate to ' + target\"\n >\n <bdi dir=\"ltr\">\n @if (\n checkpointService.busy() &&\n activeCommandIndex() === filteredCheckpoints().length\n ) {\n Navigating\u2026\n } @else {\n Go to {{ target }}\n }\n </bdi>\n </span>\n <span class=\"inspector-command-row__activity\">\n navigate \u00B7 keeps state\n </span>\n </span>\n </div>\n }\n }\n </div>\n\n @if (filteredInspectorActions().length) {\n <footer\n id=\"inspector-command-actions\"\n class=\"inspector-command__actions\"\n role=\"listbox\"\n aria-label=\"Inspector actions\"\n aria-orientation=\"horizontal\"\n >\n @for (\n action of filteredInspectorActions();\n track action.id;\n let index = $index\n ) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"inspector-command-action\"\n [id]=\"'inspector-action-' + action.id\"\n [attr.data-command-index]=\"actionIndexOffset() + index\"\n [attr.aria-label]=\"action.ariaLabel\"\n [attr.aria-selected]=\"\n activeCommandIndex() === actionIndexOffset() + index\n \"\n [attr.aria-disabled]=\"checkpointService.busy()\"\n [class.is-selected]=\"\n activeCommandIndex() === actionIndexOffset() + index\n \"\n [class.is-active]=\"\n (action.id === 'select' && toolMode() === 'select') ||\n (action.id === 'type' && showTypography()) ||\n (action.id === 'vertical' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'vertical') ||\n (action.id === 'horizontal' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'horizontal')\n \"\n [disabled]=\"checkpointService.busy()\"\n (mouseenter)=\"setActiveInspectorAction(index)\"\n (click)=\"executeInspectorAction(action)\"\n >\n @switch (action.id) {\n @case (\"select\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n }\n @case (\"type\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n }\n @case (\"save\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M2.5 2h9.6l1.4 1.4V14h-11zm2 1.5v3h6v-3zm.5 6V12h6V9.5z\"\n />\n </svg>\n }\n @case (\"import\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M8 2l3.53 3.53-1.06 1.06L8.75 4.87V9.5h-1.5V4.87L5.53 6.59 4.47 5.53zM2.5 11h11v1.5h-11z\"\n />\n </svg>\n }\n @case (\"vertical\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n }\n @case (\"horizontal\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n }\n }\n <span>{{ action.label }}</span>\n </button>\n }\n </footer>\n }\n </section>\n </dialog>\n }\n\n @if (checkpointToast(); as toast) {\n <p\n class=\"inspector-checkpoint-toast\"\n [class.inspector-checkpoint-toast--error]=\"checkpointToastIsError()\"\n [attr.role]=\"checkpointToastIsError() ? 'alert' : 'status'\"\n >\n {{ toast }}\n </p>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--spacing\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top + selected.rect.height + 8\"\n >\n <span class=\"inspector-box-tag__margin\">M</span>\n <span>{{ formatEdges(selected.margin) }}</span>\n <span class=\"inspector-box-tag__separator\">\u00B7</span>\n <span class=\"inspector-box-tag__padding\">P</span>\n <span>{{ formatEdges(selected.padding) }}</span>\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @for (horizontal of distance.horizontalDistances; track $index) {\n @if (horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"Math.min(horizontal.x1!, horizontal.x2!)\"\n [style.top.px]=\"horizontal.y!\"\n [style.width.px]=\"Math.abs(horizontal.x2! - horizontal.x1!)\"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"(horizontal.x1! + horizontal.x2!) / 2\"\n [style.top.px]=\"horizontal.y!\"\n >\n {{ formatValue(horizontal.value) }}\n </div>\n }\n }\n\n @for (vertical of distance.verticalDistances; track $index) {\n @if (vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"vertical.x!\"\n [style.top.px]=\"Math.min(vertical.y1!, vertical.y2!)\"\n [style.height.px]=\"Math.abs(vertical.y2! - vertical.y1!)\"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"vertical.x!\"\n [style.top.px]=\"(vertical.y1! + vertical.y2!) / 2\"\n >\n {{ formatValue(vertical.value) }}\n </div>\n }\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n [attr.aria-label]=\"\n (guide.orientation === 'vertical' ? 'Vertical' : 'Horizontal') +\n ' guide at ' +\n formatValue(guide.position) +\n ' pixels'\n \"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n\n @for (distance of guideDistances(); track distance.orientation + \"-\" + distance.start + \"-\" + distance.end) {\n <div\n class=\"inspector-guide-distance\"\n [class.inspector-guide-distance--vertical]=\"distance.orientation === 'vertical'\"\n [class.inspector-guide-distance--horizontal]=\"distance.orientation === 'horizontal'\"\n [style.left.px]=\"distance.orientation === 'vertical' ? distance.start : null\"\n [style.top.px]=\"distance.orientation === 'horizontal' ? distance.start : null\"\n [style.width.px]=\"distance.orientation === 'vertical' ? distance.value : null\"\n [style.height.px]=\"distance.orientation === 'horizontal' ? distance.value : null\"\n [style.--inspector-guide]=\"guideColor\"\n aria-hidden=\"true\"\n >\n <span class=\"inspector-guide-distance__line\"></span>\n <span class=\"inspector-guide-distance__tag\">\n {{ formatValue(distance.value) }} px\n </span>\n </div>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: oklch(20% .012 280 / .92);--inspector-panel-edge: oklch(100% 0 0 / .08);--inspector-text: oklch(96% .005 280);--inspector-muted: oklch(70% .014 280);--inspector-faint: oklch(56% .012 280);--inspector-blue: oklch(68% .15 255);--inspector-blue-soft: oklch(68% .15 255 / .14);--inspector-orange: oklch(78% .14 70);--inspector-green: oklch(74% .15 150);--inspector-violet: oklch(72% .15 305);--inspector-radius: 8px;--inspector-shadow: 0 12px 32px oklch(6% .02 280 / .5);--inspector-font: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;--inspector-ease: cubic-bezier(.16, 1, .3, 1);position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:var(--inspector-font);color:var(--inspector-text);-webkit-font-smoothing:antialiased}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-command-dialog{--command-surface: oklch(17.5% .012 280);--command-surface-active: oklch(25% .012 280);--command-edge: oklch(100% 0 0 / .08);--command-text: oklch(96% .005 280);--command-muted: oklch(68% .014 280);--command-faint: oklch(52% .012 280);--command-accent: oklch(72% .13 255);--command-danger: oklch(68% .17 25);box-sizing:border-box;inset-block-start:max(10vh,48px);width:min(420px,calc(100vw - 24px));max-width:none;max-height:min(360px,calc(100vh - 64px));margin:0 auto;padding:0;overflow:hidden;border:1px solid var(--command-edge);border-radius:var(--inspector-radius);background:var(--command-surface);color:var(--command-text);box-shadow:var(--inspector-shadow);opacity:0;pointer-events:auto;transform:translateY(-4px);transition:opacity .1s ease,transform .1s ease,overlay .1s allow-discrete,display .1s allow-discrete;font-family:var(--inspector-font);-webkit-font-smoothing:antialiased}.inspector-command-dialog[open]{opacity:1;transform:none;transition-duration:.14s;transition-timing-function:var(--inspector-ease)}@starting-style{.inspector-command-dialog[open]{opacity:0;transform:translateY(-4px)}}.inspector-command-dialog::backdrop{background:#01010266}.inspector-command{display:grid;grid-template-rows:auto auto 1fr auto;min-width:0;min-height:0;max-height:min(360px,calc(100vh - 64px))}.inspector-command__search{display:flex;align-items:center;gap:8px;min-height:40px;padding:0 11px;border-bottom:1px solid var(--command-edge)}.inspector-command__pet-switcher{display:block;width:28px;height:28px;flex:0 0 auto;padding:0;overflow:hidden;border:0;border-radius:4px;background:transparent;cursor:pointer;opacity:.72;transition:opacity .14s var(--inspector-ease),transform .1s var(--inspector-ease)}.inspector-command__pet-sprite{display:block;width:500%;height:100%;max-width:none;image-rendering:pixelated;-webkit-user-select:none;user-select:none;transform:translate(0)}.inspector-command__search:focus-within .inspector-command__pet-switcher,.inspector-command__pet-switcher:hover,.inspector-command__pet-switcher:focus-visible{opacity:1}.inspector-command__pet-switcher:hover,.inspector-command__pet-switcher:focus-visible{background:#6aa7f41f}.inspector-command__pet-switcher:active{transform:scale(.94)}.inspector-command__pet-switcher:focus-visible{outline:1px solid var(--command-accent);outline-offset:1px}@media (prefers-reduced-motion: no-preference){.inspector-command__pet-sprite{animation:inspector-pet-cycle 1s steps(1,end) infinite}}@keyframes inspector-pet-cycle{0%,19.99%{transform:translate(0)}20%,39.99%{transform:translate(-20%)}40%,59.99%{transform:translate(-40%)}60%,79.99%{transform:translate(-60%)}80%,to{transform:translate(-80%)}}.inspector-command__search input,.inspector-command-row__rename{min-width:0;border:0;outline:0;background:transparent;color:var(--command-text);font:inherit}.inspector-command__search input{flex:1 1 auto;width:100%;height:39px;padding:0;font-size:13px;font-weight:450;line-height:1.3}.inspector-command__search input::placeholder{color:var(--command-faint);opacity:1}.inspector-command__search input::-webkit-search-cancel-button{display:none}.inspector-command__results{min-height:0;max-height:260px;overflow:auto;padding:5px;scrollbar-width:thin;scrollbar-color:oklch(100% 0 0 / .1) transparent}.inspector-command-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;min-height:34px;padding:0 7px 0 9px;border-radius:5px;cursor:pointer;-webkit-user-select:none;user-select:none}.inspector-command-row.is-active{background:color-mix(in oklch,var(--command-surface-active) 92%,var(--command-accent));box-shadow:inset 0 0 0 1px #6aa7f452}.inspector-command-row.is-busy{cursor:wait;pointer-events:none;opacity:.7}.inspector-command-row__content{display:flex;align-items:baseline;gap:6px;min-width:0;overflow:hidden}.inspector-command-row__name{flex:0 1 auto;min-width:3ch;overflow:hidden;color:var(--command-text);font-size:12px;font-weight:500;line-height:1.25;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}.inspector-command-row__name bdi{direction:ltr;unicode-bidi:isolate}.inspector-command-row__activity{flex:0 0 auto;color:var(--command-faint);font-size:9px;font-weight:450;line-height:1;white-space:nowrap}.inspector-command-row.is-active .inspector-command-row__activity{color:#c2c3cc}.inspector-command-row--navigate{margin-top:4px;padding-top:5px;border-top:1px dashed var(--command-edge)}.inspector-command-row--navigate .inspector-command-row__name{color:color-mix(in oklch,var(--command-text) 78%,var(--command-accent))}.inspector-command-row--navigate .inspector-command-row__name:before{content:\"\\2192 \";color:var(--command-accent)}.inspector-command-row__actions,.inspector-command-row__confirm-actions{display:flex;align-items:center;gap:1px}.inspector-command-row__actions{opacity:0;pointer-events:none}.inspector-command-row.is-active .inspector-command-row__actions,.inspector-command-row:hover .inspector-command-row__actions,.inspector-command-row:focus-within .inspector-command-row__actions{opacity:1;pointer-events:auto}.inspector-command-row button{display:inline-grid;width:22px;min-height:22px;padding:0;place-items:center;border:0;border-radius:4px;background:transparent;color:var(--command-muted);cursor:pointer;font-family:inherit;font-size:10px;font-weight:550;line-height:1.2}.inspector-command-row button svg{width:11px;height:11px;fill:currentColor}.inspector-command-row button:hover{background:#ffffff12;color:var(--command-text)}.inspector-command-row button.is-danger{width:auto;padding:0 7px;color:var(--command-danger);font-size:11px}.inspector-command-row button.is-danger:hover{background:#ef66611f}.inspector-command-row__confirm-actions button:not(.is-danger){width:auto;padding:0 7px;font-size:11px}.inspector-command-row button:focus-visible,.inspector-command-row__rename:focus-visible{outline:1px solid var(--command-accent);outline-offset:1px}.inspector-command-row__confirm{grid-column:1;color:var(--command-text);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.inspector-command-row__rename{grid-column:1 / -1;min-height:26px;padding-inline:6px;border:1px solid oklch(72% .13 255 / .4);border-radius:4px;background:#191a21;font-size:12px;font-weight:500}.inspector-command__message{margin:0;padding:16px 10px;color:var(--command-faint);font-size:12px;line-height:1.4;text-align:center}.inspector-command__message--error{padding:6px 10px;border-bottom:1px solid oklch(55% .08 25 / .3);background:#39191780;color:#f7cbc7;text-align:left;font-size:11px}.inspector-command__actions{display:flex;gap:2px;padding:4px;border-top:1px solid var(--command-edge)}.inspector-command-action{display:flex;flex:1 1 0;min-width:0;min-height:28px;align-items:center;justify-content:center;gap:4px;padding:0 4px;overflow:hidden;border:0;border-radius:5px;background:transparent;color:var(--command-muted);cursor:pointer;font:inherit;font-size:10px;font-weight:500;line-height:1;text-align:left}.inspector-command-action svg{width:11px;height:11px;flex:0 0 auto;fill:currentColor}.inspector-command-action span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inspector-command-action:hover:not(:disabled){background:#ffffff0f;color:var(--command-text)}.inspector-command-action.is-active{background:#6aa7f421;color:#c2daf9}.inspector-command-action.is-selected,.inspector-command-action.is-selected:hover:not(:disabled){background:var(--command-surface-active);color:var(--command-text);box-shadow:inset 0 0 0 1px #6aa7f49e}.inspector-command-action:disabled{cursor:wait;opacity:.45}.inspector-command-action:focus-visible{outline:1px solid var(--command-accent);outline-offset:-1px}.inspector-visually-hidden{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.inspector-checkpoint-toast{position:fixed;top:10px;left:50%;z-index:500;margin:0;display:flex;align-items:center;gap:6px;padding:6px 9px;border:1px solid var(--inspector-panel-edge);border-radius:6px;background:#0f1016f5;color:var(--inspector-text);box-shadow:0 8px 24px #01000352;font-size:11px;font-weight:500;line-height:1.3;pointer-events:none;transform:translate(-50%);animation:inspector-toast-in .16s var(--inspector-ease) both}.inspector-checkpoint-toast:before{width:5px;height:5px;flex:0 0 auto;border-radius:50%;background:var(--inspector-blue);content:\"\"}.inspector-checkpoint-toast--error{border-color:#e2726b4d;background:#351311f0;color:#fed2cd}.inspector-checkpoint-toast--error:before{background:var(--command-danger, oklch(68% .17 25))}@keyframes inspector-toast-in{0%{opacity:0;transform:translate(-50%,-4px)}to{opacity:1;transform:translate(-50%)}}@media (prefers-reduced-motion: reduce){.inspector-command-dialog{transition-duration:.01ms!important}.inspector-command-dialog,.inspector-command-dialog[open]{transform:none}.inspector-command__pet-switcher{transition:none}.inspector-command__pet-sprite{animation:none;transform:translate(0)}.inspector-checkpoint-toast{animation:none}}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f0a646d1;background:#f0a64614}.inspector-box--padding{border-color:#5ac576d1;background:#5ac57614}.inspector-box--gap{border-color:#bb8aefb8;background:#bb8aef0d}.inspector-box--distance{border-style:dashed;border-color:#539af2b3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag,.inspector-guide-distance__tag{border:1px solid var(--inspector-panel-edge);border-radius:4px;background:#0e0f15c2;font-variant-numeric:tabular-nums;text-shadow:none}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 6px));max-width:min(380px,calc(100vw - 20px));padding:1px 3px;color:var(--inspector-text);box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;font-size:9px;font-weight:500;line-height:1.2;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:2px 4px;color:var(--inspector-text);font-size:9px;font-weight:520;line-height:1;pointer-events:none}.inspector-box-tag__margin{color:#f5c076}.inspector-box-tag__padding{color:#95dfa4}.inspector-box-tag--gap{color:oklch(86% .09 305)}.inspector-box-tag--spacing{display:inline-flex;align-items:center;gap:3px;transform:translateY(0);white-space:nowrap}.inspector-box-tag__separator{color:var(--inspector-faint)}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:5px;align-items:center;padding:2px 4px;color:#e4e4e9;font-size:9px;font-weight:500;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:7px;height:7px;border-radius:999px;border:1px solid oklch(100% 0 0 / .16);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#539af2b8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%,-50%);padding:2px 4px;border-color:#539af247;background:#0e0f15b8;color:var(--inspector-text);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);font-size:9px;font-weight:520;line-height:1;pointer-events:none}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}.inspector-guide-distance{position:fixed;z-index:2;pointer-events:none}.inspector-guide-distance--vertical{top:50%;height:1px}.inspector-guide-distance--horizontal{left:50%;width:1px}.inspector-guide-distance__line{position:absolute;background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-distance--vertical .inspector-guide-distance__line{inset:0;height:1px}.inspector-guide-distance--horizontal .inspector-guide-distance__line{inset:0;width:1px}.inspector-guide-distance__line:before,.inspector-guide-distance__line:after{position:absolute;content:\"\";background:var(--inspector-guide, #ff7a00)}.inspector-guide-distance--vertical .inspector-guide-distance__line:before,.inspector-guide-distance--vertical .inspector-guide-distance__line:after{top:-2px;width:1px;height:5px}.inspector-guide-distance--vertical .inspector-guide-distance__line:before{left:0}.inspector-guide-distance--vertical .inspector-guide-distance__line:after{right:0}.inspector-guide-distance--horizontal .inspector-guide-distance__line:before,.inspector-guide-distance--horizontal .inspector-guide-distance__line:after{left:-2px;width:5px;height:1px}.inspector-guide-distance--horizontal .inspector-guide-distance__line:before{top:0}.inspector-guide-distance--horizontal .inspector-guide-distance__line:after{bottom:0}.inspector-guide-distance__tag{position:absolute;padding:2px 4px;border-color:color-mix(in srgb,var(--inspector-guide, #ff7a00) 48%,transparent);background:#0e0f15eb;color:var(--inspector-text);box-shadow:0 1px 4px #01000357;font-size:9px;font-weight:520;line-height:1;white-space:nowrap}.inspector-guide-distance--vertical .inspector-guide-distance__tag{left:50%;top:0;transform:translate(-50%,-50%)}.inspector-guide-distance--horizontal .inspector-guide-distance__tag{left:0;top:50%;transform:translate(-50%,-50%)}@media (min-width: 769px) and (min-height: 769px){:host{--inspector-radius: 14px;--inspector-shadow: 0 21px 56px oklch(6% .02 280 / .5)}.inspector-command-dialog{inset-block-start:max(10vh,84px);width:min(735px,calc(100vw - 42px));max-height:min(630px,calc(100vh - 112px))}.inspector-command{max-height:min(630px,calc(100vh - 112px))}.inspector-command__search{gap:14px;min-height:70px;padding:0 19.25px}.inspector-command__pet-switcher{width:42px;height:42px}.inspector-command__search input{height:68.25px;font-size:22.75px}.inspector-command__results{max-height:455px;padding:8.75px}.inspector-command-row{gap:10.5px;min-height:59.5px;padding:0 12.25px 0 15.75px;border-radius:8.75px}.inspector-command-row__content{gap:10.5px}.inspector-command-row__name,.inspector-command-row__confirm{font-size:21px}.inspector-command-row__activity{font-size:15.75px}.inspector-command-row__actions,.inspector-command-row__confirm-actions{gap:1.75px}.inspector-command-row button{width:38.5px;min-height:38.5px;border-radius:7px;font-size:17.5px}.inspector-command-row button svg{width:19.25px;height:19.25px}.inspector-command-row button.is-danger,.inspector-command-row__confirm-actions button:not(.is-danger){padding:0 12.25px;font-size:19.25px}.inspector-command-row__rename{min-height:45.5px;padding-inline:10.5px;border-radius:7px;font-size:21px}.inspector-command__message{padding:28px 17.5px;font-size:21px}.inspector-command__message--error{padding:10.5px 17.5px;font-size:19.25px}.inspector-command__actions{gap:3.5px;padding:7px}.inspector-command-action{min-height:49px;gap:7px;padding:0 7px;border-radius:8.75px;font-size:17.5px}.inspector-command-action svg{width:19.25px;height:19.25px}.inspector-checkpoint-toast{top:14px;padding:7px 10px;font-size:13px}.inspector-label{transform:translateY(calc(-100% - 10.5px));max-width:min(665px,calc(100vw - 35px));padding:2px 4px;font-size:13px}.inspector-box-tag{padding:3px 5px;font-size:15.75px}.inspector-box-tag--spacing{gap:5px;transform:translateY(0)}.inspector-text-chip{gap:8.75px;padding:3px 5px;font-size:15.75px}.inspector-text-chip__swatch{width:12.25px;height:12.25px}.inspector-distance-tag,.inspector-guide-distance__tag{padding:3px 5px;font-size:15.75px}.inspector-guide--vertical{width:24.5px}.inspector-guide--horizontal{height:24.5px}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
841
1042
  }
842
1043
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: inspectorComponent, decorators: [{
843
1044
  type: Component,
844
- args: [{ selector: 'inspector-overlay', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inspector-root\" #overlayRoot>\n @if (checkpointService) {\n <dialog\n #checkpointDialog\n class=\"inspector-command-dialog\"\n aria-labelledby=\"inspector-command-title\"\n (cancel)=\"$event.preventDefault(); closeCheckpointCommandBar()\"\n (click)=\"handleCheckpointDialogClick($event)\"\n >\n <section class=\"inspector-command\" (click)=\"$event.stopPropagation()\">\n <header class=\"inspector-command__search\">\n <label\n id=\"inspector-command-title\"\n class=\"inspector-visually-hidden\"\n for=\"inspector-checkpoint-search\"\n >\n inspector-ng command palette\n </label>\n <button\n type=\"button\"\n class=\"inspector-command__pet-switcher\"\n [attr.aria-label]=\"'Change pet. Current pet: ' + activePet().name\"\n [title]=\"'Change pet: ' + activePet().name\"\n (click)=\"cyclePet($event)\"\n >\n <img\n class=\"inspector-command__pet-sprite\"\n [src]=\"activePet().spriteSrc\"\n alt=\"\"\n aria-hidden=\"true\"\n draggable=\"false\"\n />\n </button>\n <input\n #checkpointSearch\n id=\"inspector-checkpoint-search\"\n type=\"search\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n placeholder=\"inspector-ng\u2026\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"commandBarOpen()\"\n [value]=\"checkpointQuery()\"\n [attr.aria-controls]=\"'inspector-checkpoint-results inspector-command-actions'\"\n [attr.aria-activedescendant]=\"activeCommandResultId()\"\n (input)=\"updateCheckpointQuery($event)\"\n />\n </header>\n\n @if (checkpointService.error(); as error) {\n <p\n class=\"inspector-command__message inspector-command__message--error\"\n role=\"alert\"\n >\n {{ error }}\n </p>\n }\n\n <div\n id=\"inspector-checkpoint-results\"\n class=\"inspector-command__results\"\n role=\"listbox\"\n aria-label=\"Saved checkpoints\"\n >\n @if (checkpointService.loading()) {\n <p class=\"inspector-command__message\" role=\"status\">Loading\u2026</p>\n } @else if (\n !checkpointService.checkpoints().length && !checkpointQuery().trim()\n ) {\n <p class=\"inspector-command__message\" role=\"status\">\n No checkpoints yet\n </p>\n } @else if (\n !filteredCheckpoints().length && !filteredInspectorActions().length\n ) {\n <p class=\"inspector-command__message\" role=\"status\">No matches</p>\n } @else {\n @for (\n checkpoint of filteredCheckpoints();\n track checkpoint.id;\n let index = $index\n ) {\n <div\n class=\"inspector-command-row\"\n role=\"option\"\n [id]=\"'inspector-checkpoint-' + checkpoint.id\"\n [attr.data-command-index]=\"index\"\n [attr.aria-selected]=\"activeCommandIndex() === index\"\n [class.is-active]=\"activeCommandIndex() === index\"\n [class.is-busy]=\"\n checkpointService.busy() && activeCommandIndex() === index\n \"\n (mouseenter)=\"setActiveCheckpoint(index)\"\n (click)=\"\n deletingCheckpointId() === checkpoint.id ||\n editingCheckpointId() === checkpoint.id\n ? null\n : restoreCheckpoint(checkpoint)\n \"\n >\n @if (deletingCheckpointId() === checkpoint.id) {\n <span class=\"inspector-command-row__confirm\"\n >Delete \u201C{{ checkpoint.name }}\u201D?</span\n >\n <span class=\"inspector-command-row__confirm-actions\">\n <button\n type=\"button\"\n class=\"is-danger\"\n (click)=\"confirmDelete(checkpoint, $event)\"\n >\n Delete\n </button>\n <button type=\"button\" (click)=\"cancelDelete($event)\">\n Keep\n </button>\n </span>\n } @else if (editingCheckpointId() === checkpoint.id) {\n <input\n class=\"inspector-command-row__rename\"\n aria-label=\"Checkpoint name\"\n [value]=\"renameDraft()\"\n (input)=\"updateRenameDraft($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span class=\"inspector-command-row__content\">\n <span class=\"inspector-command-row__name\">\n @if (\n checkpointService.busy() &&\n activeCommandIndex() === index\n ) {\n Restoring\u2026\n } @else {\n {{ checkpoint.name }}\n }\n </span>\n <span class=\"inspector-command-row__meta\">\n @if (shouldShowCheckpointRoute(checkpoint)) {\n <span class=\"inspector-command-row__route\">{{\n checkpoint.route\n }}</span>\n <span\n class=\"inspector-command-row__separator\"\n aria-hidden=\"true\"\n >\u00B7</span\n >\n }\n <span class=\"inspector-command-row__activity\">\n {{ checkpoint.lastUsedAt ? \"Used\" : \"Saved\" }}\n {{\n formatRelativeTime(checkpointActivityAt(checkpoint))\n }}\n </span>\n </span>\n </span>\n <span class=\"inspector-command-row__actions\">\n <button\n type=\"button\"\n (click)=\"beginRename(checkpoint, $event)\"\n [attr.aria-label]=\"'Rename ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"m11.8 1.8 2.4 2.4-8.3 8.3-3.1.7.7-3.1zm-8 10.4 1.5-.3-1.2-1.2z\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n (click)=\"beginDelete(checkpoint, $event)\"\n [attr.aria-label]=\"'Delete ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.5 2h5l.5 1H14v1.25H2V3h3zm-2 3.25h9L12 14H4z\"\n />\n </svg>\n </button>\n </span>\n }\n </div>\n }\n }\n </div>\n\n @if (filteredInspectorActions().length) {\n <footer\n id=\"inspector-command-actions\"\n class=\"inspector-command__actions\"\n role=\"listbox\"\n aria-label=\"Inspector actions\"\n aria-orientation=\"horizontal\"\n >\n @for (\n action of filteredInspectorActions();\n track action.id;\n let index = $index\n ) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"inspector-command-action\"\n [id]=\"'inspector-action-' + action.id\"\n [attr.data-command-index]=\"filteredCheckpoints().length + index\"\n [attr.aria-label]=\"action.ariaLabel\"\n [attr.aria-selected]=\"\n activeCommandIndex() === filteredCheckpoints().length + index\n \"\n [attr.aria-disabled]=\"checkpointService.busy()\"\n [class.is-selected]=\"\n activeCommandIndex() === filteredCheckpoints().length + index\n \"\n [class.is-active]=\"\n (action.id === 'select' && toolMode() === 'select') ||\n (action.id === 'type' && showTypography()) ||\n (action.id === 'vertical' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'vertical') ||\n (action.id === 'horizontal' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'horizontal')\n \"\n [class.inspector-command-action--danger]=\"action.id === 'off'\"\n [disabled]=\"checkpointService.busy()\"\n (mouseenter)=\"setActiveInspectorAction(index)\"\n (click)=\"executeInspectorAction(action)\"\n >\n @switch (action.id) {\n @case (\"select\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n }\n @case (\"type\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n }\n @case (\"save\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M2.5 2h9.6l1.4 1.4V14h-11zm2 1.5v3h6v-3zm.5 6V12h6V9.5z\"\n />\n </svg>\n }\n @case (\"vertical\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n }\n @case (\"horizontal\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n }\n @case (\"off\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M7.25 1.5h1.5v6h-1.5zM4.1 3.35l.96 1.15A4.25 4.25 0 1 0 10.94 4.5l.96-1.15A5.75 5.75 0 1 1 4.1 3.35z\"\n />\n </svg>\n }\n }\n <span>{{ action.label }}</span>\n </button>\n }\n </footer>\n }\n </section>\n </dialog>\n }\n\n @if (checkpointToast(); as toast) {\n <p\n class=\"inspector-checkpoint-toast\"\n [class.inspector-checkpoint-toast--error]=\"checkpointToastIsError()\"\n [attr.role]=\"checkpointToastIsError() ? 'alert' : 'status'\"\n >\n {{ toast }}\n </p>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n [attr.aria-label]=\"\n (guide.orientation === 'vertical' ? 'Vertical' : 'Horizontal') +\n ' guide at ' +\n formatValue(guide.position) +\n ' pixels'\n \"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: oklch(20% .012 280 / .92);--inspector-panel-edge: oklch(100% 0 0 / .08);--inspector-text: oklch(96% .005 280);--inspector-muted: oklch(70% .014 280);--inspector-faint: oklch(56% .012 280);--inspector-blue: oklch(68% .15 255);--inspector-blue-soft: oklch(68% .15 255 / .14);--inspector-orange: oklch(78% .14 70);--inspector-green: oklch(74% .15 150);--inspector-violet: oklch(72% .15 305);--inspector-radius: 8px;--inspector-shadow: 0 12px 32px oklch(6% .02 280 / .5);--inspector-font: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;--inspector-ease: cubic-bezier(.16, 1, .3, 1);position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:var(--inspector-font);color:var(--inspector-text);-webkit-font-smoothing:antialiased}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-command-dialog{--command-surface: oklch(17.5% .012 280);--command-surface-active: oklch(25% .012 280);--command-edge: oklch(100% 0 0 / .08);--command-text: oklch(96% .005 280);--command-muted: oklch(68% .014 280);--command-faint: oklch(52% .012 280);--command-accent: oklch(72% .13 255);--command-danger: oklch(68% .17 25);box-sizing:border-box;inset-block-start:max(10vh,48px);width:min(420px,calc(100vw - 24px));max-width:none;max-height:min(360px,calc(100vh - 64px));margin:0 auto;padding:0;overflow:hidden;border:1px solid var(--command-edge);border-radius:var(--inspector-radius);background:var(--command-surface);color:var(--command-text);box-shadow:var(--inspector-shadow);opacity:0;pointer-events:auto;transform:translateY(-4px);transition:opacity .1s ease,transform .1s ease,overlay .1s allow-discrete,display .1s allow-discrete;font-family:var(--inspector-font);-webkit-font-smoothing:antialiased}.inspector-command-dialog[open]{opacity:1;transform:none;transition-duration:.14s;transition-timing-function:var(--inspector-ease)}@starting-style{.inspector-command-dialog[open]{opacity:0;transform:translateY(-4px)}}.inspector-command-dialog::backdrop{background:#01010266}.inspector-command{display:grid;grid-template-rows:auto auto 1fr auto;min-width:0;min-height:0;max-height:min(360px,calc(100vh - 64px))}.inspector-command__search{display:flex;align-items:center;gap:8px;min-height:40px;padding:0 11px;border-bottom:1px solid var(--command-edge)}.inspector-command__pet-switcher{display:block;width:28px;height:28px;flex:0 0 auto;padding:0;overflow:hidden;border:0;border-radius:4px;background:transparent;cursor:pointer;opacity:.72;transition:opacity .14s var(--inspector-ease),transform .1s var(--inspector-ease)}.inspector-command__pet-sprite{display:block;width:500%;height:100%;max-width:none;image-rendering:pixelated;-webkit-user-select:none;user-select:none;transform:translate(0)}.inspector-command__search:focus-within .inspector-command__pet-switcher,.inspector-command__pet-switcher:hover,.inspector-command__pet-switcher:focus-visible{opacity:1}.inspector-command__pet-switcher:hover,.inspector-command__pet-switcher:focus-visible{background:#6aa7f41f}.inspector-command__pet-switcher:active{transform:scale(.94)}.inspector-command__pet-switcher:focus-visible{outline:1px solid var(--command-accent);outline-offset:1px}@media (prefers-reduced-motion: no-preference){.inspector-command__search:focus-within .inspector-command__pet-sprite{animation:inspector-pet-cycle 1s steps(1,end) infinite}}@keyframes inspector-pet-cycle{0%,19.99%{transform:translate(0)}20%,39.99%{transform:translate(-20%)}40%,59.99%{transform:translate(-40%)}60%,79.99%{transform:translate(-60%)}80%,to{transform:translate(-80%)}}.inspector-command__search input,.inspector-command-row__rename{min-width:0;border:0;outline:0;background:transparent;color:var(--command-text);font:inherit}.inspector-command__search input{flex:1 1 auto;width:100%;height:39px;padding:0;font-size:13px;font-weight:450;line-height:1.3}.inspector-command__search input::placeholder{color:var(--command-faint);opacity:1}.inspector-command__search input::-webkit-search-cancel-button{display:none}.inspector-command__results{min-height:0;max-height:260px;overflow:auto;padding:5px;scrollbar-width:thin;scrollbar-color:oklch(100% 0 0 / .1) transparent}.inspector-command-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;min-height:34px;padding:0 7px 0 9px;border-radius:5px;cursor:pointer;-webkit-user-select:none;user-select:none}.inspector-command-row.is-active{background:var(--command-surface-active);box-shadow:inset 0 0 0 1px #6aa7f49e}.inspector-command-row.is-busy{cursor:wait;pointer-events:none;opacity:.7}.inspector-command-row__content{display:flex;align-items:baseline;gap:8px;min-width:0;overflow:hidden}.inspector-command-row__name{flex:0 1 auto;min-width:3ch;overflow:hidden;color:var(--command-text);font-size:12px;font-weight:500;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.inspector-command-row__meta{display:inline-flex;flex:0 1 auto;align-items:baseline;gap:4px;min-width:0;overflow:hidden;color:var(--command-faint);font-size:11px;font-weight:400;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.inspector-command-row__route{min-width:0;overflow:hidden;text-overflow:ellipsis}.inspector-command-row__separator,.inspector-command-row__activity{flex:0 0 auto}.inspector-command-row.is-active .inspector-command-row__meta{color:#c2c3cc}.inspector-command-row__actions,.inspector-command-row__confirm-actions{display:flex;align-items:center;gap:1px}.inspector-command-row__actions{opacity:0;pointer-events:none}.inspector-command-row:hover .inspector-command-row__actions,.inspector-command-row:focus-within .inspector-command-row__actions{opacity:1;pointer-events:auto}.inspector-command-row button{display:inline-grid;width:22px;min-height:22px;padding:0;place-items:center;border:0;border-radius:4px;background:transparent;color:var(--command-muted);cursor:pointer;font-family:inherit;font-size:10px;font-weight:550;line-height:1.2}.inspector-command-row button svg{width:11px;height:11px;fill:currentColor}.inspector-command-row button:hover{background:#ffffff12;color:var(--command-text)}.inspector-command-row button.is-danger{width:auto;padding:0 7px;color:var(--command-danger);font-size:11px}.inspector-command-row button.is-danger:hover{background:#ef66611f}.inspector-command-row__confirm-actions button:not(.is-danger){width:auto;padding:0 7px;font-size:11px}.inspector-command-row button:focus-visible,.inspector-command-row__rename:focus-visible{outline:1px solid var(--command-accent);outline-offset:1px}.inspector-command-row__confirm{grid-column:1;color:var(--command-text);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.inspector-command-row__rename{grid-column:1 / -1;min-height:26px;padding-inline:6px;border:1px solid oklch(72% .13 255 / .4);border-radius:4px;background:#191a21;font-size:12px;font-weight:500}.inspector-command__message{margin:0;padding:16px 10px;color:var(--command-faint);font-size:12px;line-height:1.4;text-align:center}.inspector-command__message--error{padding:6px 10px;border-bottom:1px solid oklch(55% .08 25 / .3);background:#39191780;color:#f7cbc7;text-align:left;font-size:11px}.inspector-command__actions{display:flex;gap:2px;padding:4px;border-top:1px solid var(--command-edge)}.inspector-command-action{display:flex;flex:1 1 0;min-width:0;min-height:28px;align-items:center;justify-content:center;gap:4px;padding:0 4px;overflow:hidden;border:0;border-radius:5px;background:transparent;color:var(--command-muted);cursor:pointer;font:inherit;font-size:10px;font-weight:500;line-height:1;text-align:left}.inspector-command-action svg{width:11px;height:11px;flex:0 0 auto;fill:currentColor}.inspector-command-action span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inspector-command-action:hover:not(:disabled){background:#ffffff0f;color:var(--command-text)}.inspector-command-action.is-active{background:#6aa7f421;color:#c2daf9}.inspector-command-action.is-selected,.inspector-command-action.is-selected:hover:not(:disabled){background:var(--command-surface-active);color:var(--command-text);box-shadow:inset 0 0 0 1px #6aa7f49e}.inspector-command-action--danger:hover:not(:disabled){background:#ef66611a;color:#f5b9b4}.inspector-command-action:disabled{cursor:wait;opacity:.45}.inspector-command-action:focus-visible{outline:1px solid var(--command-accent);outline-offset:-1px}.inspector-visually-hidden{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.inspector-checkpoint-toast{position:fixed;top:10px;left:50%;z-index:500;margin:0;padding:5px 10px;border:1px solid oklch(74% .12 150 / .25);border-radius:999px;background:#0e1f12f0;color:#cce6d0;box-shadow:var(--inspector-shadow);font-size:11px;font-weight:520;line-height:1.25;pointer-events:none;transform:translate(-50%)}.inspector-checkpoint-toast--error{border-color:#e2726b4d;background:#351311f0;color:#fed2cd}@media (prefers-reduced-motion: reduce){.inspector-command-dialog{transition-duration:.01ms!important}.inspector-command-dialog,.inspector-command-dialog[open]{transform:none}.inspector-command__pet-switcher{transition:none}.inspector-command__pet-sprite{animation:none;transform:translate(0)}}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f0a646d1;background:#f0a64614}.inspector-box--padding{border-color:#5ac576d1;background:#5ac57614}.inspector-box--gap{border-color:#bb8aefb8;background:#bb8aef0d}.inspector-box--distance{border-style:dashed;border-color:#539af2b3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 6px));max-width:min(380px,calc(100vw - 20px));padding:4px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:var(--inspector-shadow);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);font-size:10px;font-weight:500;line-height:1.2;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:3px 5px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#0e0f15f0;color:var(--inspector-text);font-size:9px;font-weight:520;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#f5c076}.inspector-box-tag--padding{color:#95dfa4;transform:translateY(0)}.inspector-box-tag--gap{color:oklch(86% .09 305)}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:5px;align-items:center;padding:3px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#0e0f15f0;color:#e4e4e9;font-size:9px;font-weight:500;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:7px;height:7px;border-radius:999px;border:1px solid oklch(100% 0 0 / .16);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#539af2b8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:3px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#0e0f15f2;color:var(--inspector-text);font-size:9px;font-weight:520;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}@media (min-width: 769px) and (min-height: 769px){:host{--inspector-radius: 14px;--inspector-shadow: 0 21px 56px oklch(6% .02 280 / .5)}.inspector-command-dialog{inset-block-start:max(10vh,84px);width:min(735px,calc(100vw - 42px));max-height:min(630px,calc(100vh - 112px))}.inspector-command{max-height:min(630px,calc(100vh - 112px))}.inspector-command__search{gap:14px;min-height:70px;padding:0 19.25px}.inspector-command__pet-switcher{width:42px;height:42px}.inspector-command__search input{height:68.25px;font-size:22.75px}.inspector-command__results{max-height:455px;padding:8.75px}.inspector-command-row{gap:10.5px;min-height:59.5px;padding:0 12.25px 0 15.75px;border-radius:8.75px}.inspector-command-row__content{gap:14px}.inspector-command-row__name,.inspector-command-row__confirm{font-size:21px}.inspector-command-row__meta{gap:7px;font-size:19.25px}.inspector-command-row__actions,.inspector-command-row__confirm-actions{gap:1.75px}.inspector-command-row button{width:38.5px;min-height:38.5px;border-radius:7px;font-size:17.5px}.inspector-command-row button svg{width:19.25px;height:19.25px}.inspector-command-row button.is-danger,.inspector-command-row__confirm-actions button:not(.is-danger){padding:0 12.25px;font-size:19.25px}.inspector-command-row__rename{min-height:45.5px;padding-inline:10.5px;border-radius:7px;font-size:21px}.inspector-command__message{padding:28px 17.5px;font-size:21px}.inspector-command__message--error{padding:10.5px 17.5px;font-size:19.25px}.inspector-command__actions{gap:3.5px;padding:7px}.inspector-command-action{min-height:49px;gap:7px;padding:0 7px;border-radius:8.75px;font-size:17.5px}.inspector-command-action svg{width:19.25px;height:19.25px}.inspector-checkpoint-toast{top:17.5px;padding:8.75px 17.5px;font-size:19.25px}.inspector-label{transform:translateY(calc(-100% - 10.5px));max-width:min(665px,calc(100vw - 35px));padding:7px 12.25px;font-size:17.5px}.inspector-box-tag{padding:5.25px 8.75px;font-size:15.75px}.inspector-box-tag--padding{transform:translateY(0)}.inspector-text-chip{gap:8.75px;padding:5.25px 10.5px;font-size:15.75px}.inspector-text-chip__swatch{width:12.25px;height:12.25px}.inspector-distance-tag{padding:5.25px 10.5px;font-size:15.75px}.inspector-guide--vertical{width:24.5px}.inspector-guide--horizontal{height:24.5px}}\n"] }]
1045
+ args: [{ selector: 'inspector-overlay', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inspector-root\" #overlayRoot>\n @if (checkpointService) {\n <dialog\n #checkpointDialog\n class=\"inspector-command-dialog\"\n aria-labelledby=\"inspector-command-title\"\n (cancel)=\"$event.preventDefault(); closeCheckpointCommandBar()\"\n (click)=\"handleCheckpointDialogClick($event)\"\n >\n <section class=\"inspector-command\" (click)=\"$event.stopPropagation()\">\n <header class=\"inspector-command__search\">\n <label\n id=\"inspector-command-title\"\n class=\"inspector-visually-hidden\"\n for=\"inspector-checkpoint-search\"\n >\n inspector-ng command palette\n </label>\n <button\n type=\"button\"\n class=\"inspector-command__pet-switcher\"\n [attr.aria-label]=\"'Change pet. Current pet: ' + activePet().name\"\n [title]=\"'Change pet: ' + activePet().name\"\n (click)=\"cyclePet($event)\"\n >\n <img\n class=\"inspector-command__pet-sprite\"\n [src]=\"activePet().spriteSrc\"\n alt=\"\"\n aria-hidden=\"true\"\n draggable=\"false\"\n />\n </button>\n <input\n #checkpointSearch\n id=\"inspector-checkpoint-search\"\n type=\"search\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n placeholder=\"inspector-ng\u2026\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"commandBarOpen()\"\n [value]=\"checkpointQuery()\"\n [attr.aria-controls]=\"'inspector-checkpoint-results inspector-command-actions'\"\n [attr.aria-activedescendant]=\"activeCommandResultId()\"\n (input)=\"updateCheckpointQuery($event)\"\n />\n </header>\n\n @if (checkpointService.error(); as error) {\n <p\n class=\"inspector-command__message inspector-command__message--error\"\n role=\"alert\"\n >\n {{ error }}\n </p>\n }\n\n <div\n id=\"inspector-checkpoint-results\"\n class=\"inspector-command__results\"\n role=\"listbox\"\n aria-label=\"Saved checkpoints\"\n >\n @if (checkpointService.loading()) {\n <p class=\"inspector-command__message\" role=\"status\">Loading\u2026</p>\n } @else if (\n !checkpointService.checkpoints().length && !checkpointQuery().trim()\n ) {\n <p class=\"inspector-command__message\" role=\"status\">\n No checkpoints yet\n </p>\n } @else if (\n !filteredCheckpoints().length &&\n !filteredInspectorActions().length &&\n !navigateTarget()\n ) {\n <p class=\"inspector-command__message\" role=\"status\">No matches</p>\n } @else {\n @for (\n checkpoint of filteredCheckpoints();\n track checkpoint.id;\n let index = $index\n ) {\n <div\n class=\"inspector-command-row\"\n role=\"option\"\n [id]=\"'inspector-checkpoint-' + checkpoint.id\"\n [attr.data-command-index]=\"index\"\n [attr.aria-selected]=\"activeCommandIndex() === index\"\n [class.is-active]=\"activeCommandIndex() === index\"\n [class.is-busy]=\"\n checkpointService.busy() && activeCommandIndex() === index\n \"\n (mouseenter)=\"setActiveCheckpoint(index)\"\n (click)=\"activateCheckpoint(checkpoint, $event)\"\n >\n @if (deletingCheckpointId() === checkpoint.id) {\n <span class=\"inspector-command-row__confirm\"\n >Delete \u201C{{ checkpoint.name }}\u201D?</span\n >\n <span class=\"inspector-command-row__confirm-actions\">\n <button\n type=\"button\"\n class=\"is-danger\"\n (click)=\"confirmDelete(checkpoint, $event)\"\n >\n Delete\n </button>\n <button type=\"button\" (click)=\"cancelDelete($event)\">\n Keep\n </button>\n </span>\n } @else if (editingCheckpointId() === checkpoint.id) {\n <input\n #checkpointRename\n class=\"inspector-command-row__rename\"\n aria-label=\"Checkpoint name\"\n [value]=\"renameDraft()\"\n (input)=\"updateRenameDraft($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span class=\"inspector-command-row__content\">\n <span\n class=\"inspector-command-row__name\"\n [title]=\"checkpoint.name\"\n >\n <bdi dir=\"ltr\">\n @if (\n checkpointService.busy() &&\n activeCommandIndex() === index\n ) {\n Restoring\u2026\n } @else {\n {{ checkpoint.name }}\n }\n </bdi>\n </span>\n <span class=\"inspector-command-row__activity\">\n {{ checkpoint.lastUsedAt ? \"Used\" : \"Saved\" }}\n {{\n formatRelativeTime(checkpointActivityAt(checkpoint))\n }}\n </span>\n </span>\n <span class=\"inspector-command-row__actions\">\n <button\n type=\"button\"\n (click)=\"beginRename(checkpoint, $event)\"\n [attr.aria-label]=\"'Rename ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"m11.8 1.8 2.4 2.4-8.3 8.3-3.1.7.7-3.1zm-8 10.4 1.5-.3-1.2-1.2z\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n (click)=\"downloadCheckpoint(checkpoint, $event)\"\n [attr.aria-label]=\"'Export ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M7.25 2h1.5v5.44l1.72-1.72L11.53 6.78 8 10.31 4.47 6.78l1.06-1.06 1.72 1.72zM2.5 12h11v1.5h-11z\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n (click)=\"beginDelete(checkpoint, $event)\"\n [attr.aria-label]=\"'Delete ' + checkpoint.name\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.5 2h5l.5 1H14v1.25H2V3h3zm-2 3.25h9L12 14H4z\"\n />\n </svg>\n </button>\n </span>\n }\n </div>\n }\n @if (navigateTarget(); as target) {\n <div\n class=\"inspector-command-row inspector-command-row--navigate\"\n role=\"option\"\n id=\"inspector-navigate\"\n [attr.data-command-index]=\"filteredCheckpoints().length\"\n [attr.aria-selected]=\"\n activeCommandIndex() === filteredCheckpoints().length\n \"\n [class.is-active]=\"\n activeCommandIndex() === filteredCheckpoints().length\n \"\n [class.is-busy]=\"\n checkpointService.busy() &&\n activeCommandIndex() === filteredCheckpoints().length\n \"\n (mouseenter)=\"setActiveCheckpoint(filteredCheckpoints().length)\"\n (click)=\"navigateToQueryRoute()\"\n >\n <span class=\"inspector-command-row__content\">\n <span\n class=\"inspector-command-row__name\"\n [title]=\"'Navigate to ' + target\"\n >\n <bdi dir=\"ltr\">\n @if (\n checkpointService.busy() &&\n activeCommandIndex() === filteredCheckpoints().length\n ) {\n Navigating\u2026\n } @else {\n Go to {{ target }}\n }\n </bdi>\n </span>\n <span class=\"inspector-command-row__activity\">\n navigate \u00B7 keeps state\n </span>\n </span>\n </div>\n }\n }\n </div>\n\n @if (filteredInspectorActions().length) {\n <footer\n id=\"inspector-command-actions\"\n class=\"inspector-command__actions\"\n role=\"listbox\"\n aria-label=\"Inspector actions\"\n aria-orientation=\"horizontal\"\n >\n @for (\n action of filteredInspectorActions();\n track action.id;\n let index = $index\n ) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"inspector-command-action\"\n [id]=\"'inspector-action-' + action.id\"\n [attr.data-command-index]=\"actionIndexOffset() + index\"\n [attr.aria-label]=\"action.ariaLabel\"\n [attr.aria-selected]=\"\n activeCommandIndex() === actionIndexOffset() + index\n \"\n [attr.aria-disabled]=\"checkpointService.busy()\"\n [class.is-selected]=\"\n activeCommandIndex() === actionIndexOffset() + index\n \"\n [class.is-active]=\"\n (action.id === 'select' && toolMode() === 'select') ||\n (action.id === 'type' && showTypography()) ||\n (action.id === 'vertical' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'vertical') ||\n (action.id === 'horizontal' &&\n toolMode() === 'guides' &&\n guideOrientation() === 'horizontal')\n \"\n [disabled]=\"checkpointService.busy()\"\n (mouseenter)=\"setActiveInspectorAction(index)\"\n (click)=\"executeInspectorAction(action)\"\n >\n @switch (action.id) {\n @case (\"select\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n }\n @case (\"type\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n }\n @case (\"save\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M2.5 2h9.6l1.4 1.4V14h-11zm2 1.5v3h6v-3zm.5 6V12h6V9.5z\"\n />\n </svg>\n }\n @case (\"import\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M8 2l3.53 3.53-1.06 1.06L8.75 4.87V9.5h-1.5V4.87L5.53 6.59 4.47 5.53zM2.5 11h11v1.5h-11z\"\n />\n </svg>\n }\n @case (\"vertical\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n }\n @case (\"horizontal\") {\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n }\n }\n <span>{{ action.label }}</span>\n </button>\n }\n </footer>\n }\n </section>\n </dialog>\n }\n\n @if (checkpointToast(); as toast) {\n <p\n class=\"inspector-checkpoint-toast\"\n [class.inspector-checkpoint-toast--error]=\"checkpointToastIsError()\"\n [attr.role]=\"checkpointToastIsError() ? 'alert' : 'status'\"\n >\n {{ toast }}\n </p>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--spacing\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top + selected.rect.height + 8\"\n >\n <span class=\"inspector-box-tag__margin\">M</span>\n <span>{{ formatEdges(selected.margin) }}</span>\n <span class=\"inspector-box-tag__separator\">\u00B7</span>\n <span class=\"inspector-box-tag__padding\">P</span>\n <span>{{ formatEdges(selected.padding) }}</span>\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @for (horizontal of distance.horizontalDistances; track $index) {\n @if (horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"Math.min(horizontal.x1!, horizontal.x2!)\"\n [style.top.px]=\"horizontal.y!\"\n [style.width.px]=\"Math.abs(horizontal.x2! - horizontal.x1!)\"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"(horizontal.x1! + horizontal.x2!) / 2\"\n [style.top.px]=\"horizontal.y!\"\n >\n {{ formatValue(horizontal.value) }}\n </div>\n }\n }\n\n @for (vertical of distance.verticalDistances; track $index) {\n @if (vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"vertical.x!\"\n [style.top.px]=\"Math.min(vertical.y1!, vertical.y2!)\"\n [style.height.px]=\"Math.abs(vertical.y2! - vertical.y1!)\"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"vertical.x!\"\n [style.top.px]=\"(vertical.y1! + vertical.y2!) / 2\"\n >\n {{ formatValue(vertical.value) }}\n </div>\n }\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n [attr.aria-label]=\"\n (guide.orientation === 'vertical' ? 'Vertical' : 'Horizontal') +\n ' guide at ' +\n formatValue(guide.position) +\n ' pixels'\n \"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n\n @for (distance of guideDistances(); track distance.orientation + \"-\" + distance.start + \"-\" + distance.end) {\n <div\n class=\"inspector-guide-distance\"\n [class.inspector-guide-distance--vertical]=\"distance.orientation === 'vertical'\"\n [class.inspector-guide-distance--horizontal]=\"distance.orientation === 'horizontal'\"\n [style.left.px]=\"distance.orientation === 'vertical' ? distance.start : null\"\n [style.top.px]=\"distance.orientation === 'horizontal' ? distance.start : null\"\n [style.width.px]=\"distance.orientation === 'vertical' ? distance.value : null\"\n [style.height.px]=\"distance.orientation === 'horizontal' ? distance.value : null\"\n [style.--inspector-guide]=\"guideColor\"\n aria-hidden=\"true\"\n >\n <span class=\"inspector-guide-distance__line\"></span>\n <span class=\"inspector-guide-distance__tag\">\n {{ formatValue(distance.value) }} px\n </span>\n </div>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: oklch(20% .012 280 / .92);--inspector-panel-edge: oklch(100% 0 0 / .08);--inspector-text: oklch(96% .005 280);--inspector-muted: oklch(70% .014 280);--inspector-faint: oklch(56% .012 280);--inspector-blue: oklch(68% .15 255);--inspector-blue-soft: oklch(68% .15 255 / .14);--inspector-orange: oklch(78% .14 70);--inspector-green: oklch(74% .15 150);--inspector-violet: oklch(72% .15 305);--inspector-radius: 8px;--inspector-shadow: 0 12px 32px oklch(6% .02 280 / .5);--inspector-font: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;--inspector-ease: cubic-bezier(.16, 1, .3, 1);position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:var(--inspector-font);color:var(--inspector-text);-webkit-font-smoothing:antialiased}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-command-dialog{--command-surface: oklch(17.5% .012 280);--command-surface-active: oklch(25% .012 280);--command-edge: oklch(100% 0 0 / .08);--command-text: oklch(96% .005 280);--command-muted: oklch(68% .014 280);--command-faint: oklch(52% .012 280);--command-accent: oklch(72% .13 255);--command-danger: oklch(68% .17 25);box-sizing:border-box;inset-block-start:max(10vh,48px);width:min(420px,calc(100vw - 24px));max-width:none;max-height:min(360px,calc(100vh - 64px));margin:0 auto;padding:0;overflow:hidden;border:1px solid var(--command-edge);border-radius:var(--inspector-radius);background:var(--command-surface);color:var(--command-text);box-shadow:var(--inspector-shadow);opacity:0;pointer-events:auto;transform:translateY(-4px);transition:opacity .1s ease,transform .1s ease,overlay .1s allow-discrete,display .1s allow-discrete;font-family:var(--inspector-font);-webkit-font-smoothing:antialiased}.inspector-command-dialog[open]{opacity:1;transform:none;transition-duration:.14s;transition-timing-function:var(--inspector-ease)}@starting-style{.inspector-command-dialog[open]{opacity:0;transform:translateY(-4px)}}.inspector-command-dialog::backdrop{background:#01010266}.inspector-command{display:grid;grid-template-rows:auto auto 1fr auto;min-width:0;min-height:0;max-height:min(360px,calc(100vh - 64px))}.inspector-command__search{display:flex;align-items:center;gap:8px;min-height:40px;padding:0 11px;border-bottom:1px solid var(--command-edge)}.inspector-command__pet-switcher{display:block;width:28px;height:28px;flex:0 0 auto;padding:0;overflow:hidden;border:0;border-radius:4px;background:transparent;cursor:pointer;opacity:.72;transition:opacity .14s var(--inspector-ease),transform .1s var(--inspector-ease)}.inspector-command__pet-sprite{display:block;width:500%;height:100%;max-width:none;image-rendering:pixelated;-webkit-user-select:none;user-select:none;transform:translate(0)}.inspector-command__search:focus-within .inspector-command__pet-switcher,.inspector-command__pet-switcher:hover,.inspector-command__pet-switcher:focus-visible{opacity:1}.inspector-command__pet-switcher:hover,.inspector-command__pet-switcher:focus-visible{background:#6aa7f41f}.inspector-command__pet-switcher:active{transform:scale(.94)}.inspector-command__pet-switcher:focus-visible{outline:1px solid var(--command-accent);outline-offset:1px}@media (prefers-reduced-motion: no-preference){.inspector-command__pet-sprite{animation:inspector-pet-cycle 1s steps(1,end) infinite}}@keyframes inspector-pet-cycle{0%,19.99%{transform:translate(0)}20%,39.99%{transform:translate(-20%)}40%,59.99%{transform:translate(-40%)}60%,79.99%{transform:translate(-60%)}80%,to{transform:translate(-80%)}}.inspector-command__search input,.inspector-command-row__rename{min-width:0;border:0;outline:0;background:transparent;color:var(--command-text);font:inherit}.inspector-command__search input{flex:1 1 auto;width:100%;height:39px;padding:0;font-size:13px;font-weight:450;line-height:1.3}.inspector-command__search input::placeholder{color:var(--command-faint);opacity:1}.inspector-command__search input::-webkit-search-cancel-button{display:none}.inspector-command__results{min-height:0;max-height:260px;overflow:auto;padding:5px;scrollbar-width:thin;scrollbar-color:oklch(100% 0 0 / .1) transparent}.inspector-command-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;min-height:34px;padding:0 7px 0 9px;border-radius:5px;cursor:pointer;-webkit-user-select:none;user-select:none}.inspector-command-row.is-active{background:color-mix(in oklch,var(--command-surface-active) 92%,var(--command-accent));box-shadow:inset 0 0 0 1px #6aa7f452}.inspector-command-row.is-busy{cursor:wait;pointer-events:none;opacity:.7}.inspector-command-row__content{display:flex;align-items:baseline;gap:6px;min-width:0;overflow:hidden}.inspector-command-row__name{flex:0 1 auto;min-width:3ch;overflow:hidden;color:var(--command-text);font-size:12px;font-weight:500;line-height:1.25;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}.inspector-command-row__name bdi{direction:ltr;unicode-bidi:isolate}.inspector-command-row__activity{flex:0 0 auto;color:var(--command-faint);font-size:9px;font-weight:450;line-height:1;white-space:nowrap}.inspector-command-row.is-active .inspector-command-row__activity{color:#c2c3cc}.inspector-command-row--navigate{margin-top:4px;padding-top:5px;border-top:1px dashed var(--command-edge)}.inspector-command-row--navigate .inspector-command-row__name{color:color-mix(in oklch,var(--command-text) 78%,var(--command-accent))}.inspector-command-row--navigate .inspector-command-row__name:before{content:\"\\2192 \";color:var(--command-accent)}.inspector-command-row__actions,.inspector-command-row__confirm-actions{display:flex;align-items:center;gap:1px}.inspector-command-row__actions{opacity:0;pointer-events:none}.inspector-command-row.is-active .inspector-command-row__actions,.inspector-command-row:hover .inspector-command-row__actions,.inspector-command-row:focus-within .inspector-command-row__actions{opacity:1;pointer-events:auto}.inspector-command-row button{display:inline-grid;width:22px;min-height:22px;padding:0;place-items:center;border:0;border-radius:4px;background:transparent;color:var(--command-muted);cursor:pointer;font-family:inherit;font-size:10px;font-weight:550;line-height:1.2}.inspector-command-row button svg{width:11px;height:11px;fill:currentColor}.inspector-command-row button:hover{background:#ffffff12;color:var(--command-text)}.inspector-command-row button.is-danger{width:auto;padding:0 7px;color:var(--command-danger);font-size:11px}.inspector-command-row button.is-danger:hover{background:#ef66611f}.inspector-command-row__confirm-actions button:not(.is-danger){width:auto;padding:0 7px;font-size:11px}.inspector-command-row button:focus-visible,.inspector-command-row__rename:focus-visible{outline:1px solid var(--command-accent);outline-offset:1px}.inspector-command-row__confirm{grid-column:1;color:var(--command-text);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.inspector-command-row__rename{grid-column:1 / -1;min-height:26px;padding-inline:6px;border:1px solid oklch(72% .13 255 / .4);border-radius:4px;background:#191a21;font-size:12px;font-weight:500}.inspector-command__message{margin:0;padding:16px 10px;color:var(--command-faint);font-size:12px;line-height:1.4;text-align:center}.inspector-command__message--error{padding:6px 10px;border-bottom:1px solid oklch(55% .08 25 / .3);background:#39191780;color:#f7cbc7;text-align:left;font-size:11px}.inspector-command__actions{display:flex;gap:2px;padding:4px;border-top:1px solid var(--command-edge)}.inspector-command-action{display:flex;flex:1 1 0;min-width:0;min-height:28px;align-items:center;justify-content:center;gap:4px;padding:0 4px;overflow:hidden;border:0;border-radius:5px;background:transparent;color:var(--command-muted);cursor:pointer;font:inherit;font-size:10px;font-weight:500;line-height:1;text-align:left}.inspector-command-action svg{width:11px;height:11px;flex:0 0 auto;fill:currentColor}.inspector-command-action span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inspector-command-action:hover:not(:disabled){background:#ffffff0f;color:var(--command-text)}.inspector-command-action.is-active{background:#6aa7f421;color:#c2daf9}.inspector-command-action.is-selected,.inspector-command-action.is-selected:hover:not(:disabled){background:var(--command-surface-active);color:var(--command-text);box-shadow:inset 0 0 0 1px #6aa7f49e}.inspector-command-action:disabled{cursor:wait;opacity:.45}.inspector-command-action:focus-visible{outline:1px solid var(--command-accent);outline-offset:-1px}.inspector-visually-hidden{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.inspector-checkpoint-toast{position:fixed;top:10px;left:50%;z-index:500;margin:0;display:flex;align-items:center;gap:6px;padding:6px 9px;border:1px solid var(--inspector-panel-edge);border-radius:6px;background:#0f1016f5;color:var(--inspector-text);box-shadow:0 8px 24px #01000352;font-size:11px;font-weight:500;line-height:1.3;pointer-events:none;transform:translate(-50%);animation:inspector-toast-in .16s var(--inspector-ease) both}.inspector-checkpoint-toast:before{width:5px;height:5px;flex:0 0 auto;border-radius:50%;background:var(--inspector-blue);content:\"\"}.inspector-checkpoint-toast--error{border-color:#e2726b4d;background:#351311f0;color:#fed2cd}.inspector-checkpoint-toast--error:before{background:var(--command-danger, oklch(68% .17 25))}@keyframes inspector-toast-in{0%{opacity:0;transform:translate(-50%,-4px)}to{opacity:1;transform:translate(-50%)}}@media (prefers-reduced-motion: reduce){.inspector-command-dialog{transition-duration:.01ms!important}.inspector-command-dialog,.inspector-command-dialog[open]{transform:none}.inspector-command__pet-switcher{transition:none}.inspector-command__pet-sprite{animation:none;transform:translate(0)}.inspector-checkpoint-toast{animation:none}}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f0a646d1;background:#f0a64614}.inspector-box--padding{border-color:#5ac576d1;background:#5ac57614}.inspector-box--gap{border-color:#bb8aefb8;background:#bb8aef0d}.inspector-box--distance{border-style:dashed;border-color:#539af2b3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag,.inspector-guide-distance__tag{border:1px solid var(--inspector-panel-edge);border-radius:4px;background:#0e0f15c2;font-variant-numeric:tabular-nums;text-shadow:none}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 6px));max-width:min(380px,calc(100vw - 20px));padding:1px 3px;color:var(--inspector-text);box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;font-size:9px;font-weight:500;line-height:1.2;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:2px 4px;color:var(--inspector-text);font-size:9px;font-weight:520;line-height:1;pointer-events:none}.inspector-box-tag__margin{color:#f5c076}.inspector-box-tag__padding{color:#95dfa4}.inspector-box-tag--gap{color:oklch(86% .09 305)}.inspector-box-tag--spacing{display:inline-flex;align-items:center;gap:3px;transform:translateY(0);white-space:nowrap}.inspector-box-tag__separator{color:var(--inspector-faint)}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:5px;align-items:center;padding:2px 4px;color:#e4e4e9;font-size:9px;font-weight:500;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:7px;height:7px;border-radius:999px;border:1px solid oklch(100% 0 0 / .16);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#539af2b8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%,-50%);padding:2px 4px;border-color:#539af247;background:#0e0f15b8;color:var(--inspector-text);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);font-size:9px;font-weight:520;line-height:1;pointer-events:none}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}.inspector-guide-distance{position:fixed;z-index:2;pointer-events:none}.inspector-guide-distance--vertical{top:50%;height:1px}.inspector-guide-distance--horizontal{left:50%;width:1px}.inspector-guide-distance__line{position:absolute;background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-distance--vertical .inspector-guide-distance__line{inset:0;height:1px}.inspector-guide-distance--horizontal .inspector-guide-distance__line{inset:0;width:1px}.inspector-guide-distance__line:before,.inspector-guide-distance__line:after{position:absolute;content:\"\";background:var(--inspector-guide, #ff7a00)}.inspector-guide-distance--vertical .inspector-guide-distance__line:before,.inspector-guide-distance--vertical .inspector-guide-distance__line:after{top:-2px;width:1px;height:5px}.inspector-guide-distance--vertical .inspector-guide-distance__line:before{left:0}.inspector-guide-distance--vertical .inspector-guide-distance__line:after{right:0}.inspector-guide-distance--horizontal .inspector-guide-distance__line:before,.inspector-guide-distance--horizontal .inspector-guide-distance__line:after{left:-2px;width:5px;height:1px}.inspector-guide-distance--horizontal .inspector-guide-distance__line:before{top:0}.inspector-guide-distance--horizontal .inspector-guide-distance__line:after{bottom:0}.inspector-guide-distance__tag{position:absolute;padding:2px 4px;border-color:color-mix(in srgb,var(--inspector-guide, #ff7a00) 48%,transparent);background:#0e0f15eb;color:var(--inspector-text);box-shadow:0 1px 4px #01000357;font-size:9px;font-weight:520;line-height:1;white-space:nowrap}.inspector-guide-distance--vertical .inspector-guide-distance__tag{left:50%;top:0;transform:translate(-50%,-50%)}.inspector-guide-distance--horizontal .inspector-guide-distance__tag{left:0;top:50%;transform:translate(-50%,-50%)}@media (min-width: 769px) and (min-height: 769px){:host{--inspector-radius: 14px;--inspector-shadow: 0 21px 56px oklch(6% .02 280 / .5)}.inspector-command-dialog{inset-block-start:max(10vh,84px);width:min(735px,calc(100vw - 42px));max-height:min(630px,calc(100vh - 112px))}.inspector-command{max-height:min(630px,calc(100vh - 112px))}.inspector-command__search{gap:14px;min-height:70px;padding:0 19.25px}.inspector-command__pet-switcher{width:42px;height:42px}.inspector-command__search input{height:68.25px;font-size:22.75px}.inspector-command__results{max-height:455px;padding:8.75px}.inspector-command-row{gap:10.5px;min-height:59.5px;padding:0 12.25px 0 15.75px;border-radius:8.75px}.inspector-command-row__content{gap:10.5px}.inspector-command-row__name,.inspector-command-row__confirm{font-size:21px}.inspector-command-row__activity{font-size:15.75px}.inspector-command-row__actions,.inspector-command-row__confirm-actions{gap:1.75px}.inspector-command-row button{width:38.5px;min-height:38.5px;border-radius:7px;font-size:17.5px}.inspector-command-row button svg{width:19.25px;height:19.25px}.inspector-command-row button.is-danger,.inspector-command-row__confirm-actions button:not(.is-danger){padding:0 12.25px;font-size:19.25px}.inspector-command-row__rename{min-height:45.5px;padding-inline:10.5px;border-radius:7px;font-size:21px}.inspector-command__message{padding:28px 17.5px;font-size:21px}.inspector-command__message--error{padding:10.5px 17.5px;font-size:19.25px}.inspector-command__actions{gap:3.5px;padding:7px}.inspector-command-action{min-height:49px;gap:7px;padding:0 7px;border-radius:8.75px;font-size:17.5px}.inspector-command-action svg{width:19.25px;height:19.25px}.inspector-checkpoint-toast{top:14px;padding:7px 10px;font-size:13px}.inspector-label{transform:translateY(calc(-100% - 10.5px));max-width:min(665px,calc(100vw - 35px));padding:2px 4px;font-size:13px}.inspector-box-tag{padding:3px 5px;font-size:15.75px}.inspector-box-tag--spacing{gap:5px;transform:translateY(0)}.inspector-text-chip{gap:8.75px;padding:3px 5px;font-size:15.75px}.inspector-text-chip__swatch{width:12.25px;height:12.25px}.inspector-distance-tag,.inspector-guide-distance__tag{padding:3px 5px;font-size:15.75px}.inspector-guide--vertical{width:24.5px}.inspector-guide--horizontal{height:24.5px}}\n"] }]
845
1046
  }], ctorParameters: () => [{ type: undefined, decorators: [{
846
1047
  type: Inject,
847
1048
  args: [PLATFORM_ID]
@@ -873,4 +1074,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
873
1074
  type: HostListener,
874
1075
  args: ['window:scroll']
875
1076
  }] } });
876
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BlY3Rvci1uZy9zcmMvbGliL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG1CQUFtQixHQUNwQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVVoRSxPQUFPLEVBQ0wsb0JBQW9CLEVBRXBCLDBCQUEwQixHQUMzQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENB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a2ZBOzs0RkQzUmEsa0JBQWtCO2tCQVI5QixTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsRUFBRSxtQkFHTSx1QkFBdUIsQ0FBQyxNQUFNOzswQkE0RmxDLE1BQU07MkJBQUMsV0FBVzt5Q0FoRnRCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBdVVOLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFzQzFDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBeUN4QyxpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBdUU5QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCO2dCQVNoQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTJCeEMsb0JBQW9CO3NCQUZuQixZQUFZO3VCQUFDLGVBQWU7O3NCQUM1QixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgUExBVEZPUk1fSUQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEdVSURFX0hJVEJPWF9TSVpFLFxuICBHVUlERV9TTkFQX0RJU1RBTkNFLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBnZXRJbnNwZWN0TWVhc3VyZW1lbnQsXG4gIGdldFJlY3RGcm9tRG9tLFxuICBnZXRUYXJnZXRFbGVtZW50LFxuICBnZXRWaXNpYmxlVGV4dEJsb2Nrcyxcbn0gZnJvbSAnLi9kb20nO1xuaW1wb3J0IHsgZ2V0RGlzdGFuY2VPdmVybGF5IH0gZnJvbSAnLi9kaXN0YW5jZXMnO1xuaW1wb3J0IHsgY2xhbXAsIGdldFZpZXdwb3J0U2l6ZSwgcmVjdHNFcXVhbCB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHtcbiAgRGlzdGFuY2VPdmVybGF5LFxuICBHdWlkZSxcbiAgR3VpZGVPcmllbnRhdGlvbixcbiAgSW5zcGVjdE1lYXN1cmVtZW50LFxuICBSZWN0LFxuICBUZXh0QmxvY2tBbm5vdGF0aW9uLFxuICBUb29sTW9kZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBjaGVja3BvaW50QWN0aXZpdHlBdCxcbiAgSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCxcbiAgSW5zcGVjdG9yQ2hlY2twb2ludFNlcnZpY2UsXG59IGZyb20gJy4vY2hlY2twb2ludHMnO1xuaW1wb3J0IHsgZnV6enlDaGVja3BvaW50cyB9IGZyb20gJy4vY2hlY2twb2ludC1zZWFyY2gnO1xuaW1wb3J0IHsgY3JlYXRlSWQsIGZvcm1hdFJlbGF0aXZlVGltZSwgZm9ybWF0VmFsdWUgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IE1FQVNVUkVfQ0FURVJQSUxMQVJfU1BSSVRFX1NSQyB9IGZyb20gJy4vbWVhc3VyZS1jYXRlcnBpbGxhcic7XG5pbXBvcnQgeyBDQVRfUEVUX1NQUklURV9TUkMgfSBmcm9tICcuL3BldC1jYXQnO1xuaW1wb3J0IHsgRE9HX1BFVF9TUFJJVEVfU1JDIH0gZnJvbSAnLi9wZXQtZG9nJztcbmltcG9ydCB7IEJVTk5ZX1BFVF9TUFJJVEVfU1JDIH0gZnJvbSAnLi9wZXQtYnVubnknO1xuaW1wb3J0IHsgR0VORVJBVEVEX1BFVF9TUFJJVEVTIH0gZnJvbSAnLi9nZW5lcmF0ZWQtcGV0cyc7XG5pbXBvcnQgeyBHRU5FUkFURURfRVhUUkFfUEVUX1NQUklURVMgfSBmcm9tICcuL2dlbmVyYXRlZC1wZXRzLWV4dHJhJztcblxudHlwZSBJbnNwZWN0b3JDb21tYW5kQWN0aW9uSWQgPSAnc2VsZWN0JyB8ICd0eXBlJyB8ICdzYXZlJyB8ICd2ZXJ0aWNhbCcgfCAnaG9yaXpvbnRhbCcgfCAnb2ZmJztcblxuaW50ZXJmYWNlIEluc3BlY3RvckNvbW1hbmRBY3Rpb24ge1xuICByZWFkb25seSBpZDogSW5zcGVjdG9yQ29tbWFuZEFjdGlvbklkO1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICByZWFkb25seSBhcmlhTGFiZWw6IHN0cmluZztcbiAgcmVhZG9ubHkga2V5d29yZHM6IHN0cmluZztcbn1cblxuY29uc3QgSU5TUEVDVE9SX0NPTU1BTkRfQUNUSU9OUzogcmVhZG9ubHkgSW5zcGVjdG9yQ29tbWFuZEFjdGlvbltdID0gW1xuICB7IGlkOiAnc2F2ZScsIGxhYmVsOiAnU2F2ZScsIGFyaWFMYWJlbDogJ1NhdmUgY2hlY2twb2ludCcsIGtleXdvcmRzOiAnc2F2ZSBjaGVja3BvaW50IGNhcHR1cmUgc3RhdGUnIH0sXG4gIHsgaWQ6ICdzZWxlY3QnLCBsYWJlbDogJ1NlbGVjdCcsIGFyaWFMYWJlbDogJ1NlbGVjdCBtb2RlJywga2V5d29yZHM6ICdzZWxlY3QgaW5zcGVjdCBwb2ludGVyIGVsZW1lbnQnIH0sXG4gIHsgaWQ6ICd0eXBlJywgbGFiZWw6ICdUeXBlJywgYXJpYUxhYmVsOiAnVG9nZ2xlIHR5cG9ncmFwaHkgb3ZlcmxheScsIGtleXdvcmRzOiAndHlwZSB0eXBvZ3JhcGh5IHRleHQgb3ZlcmxheScgfSxcbiAgeyBpZDogJ3ZlcnRpY2FsJywgbGFiZWw6ICdWJywgYXJpYUxhYmVsOiAnVmVydGljYWwgZ3VpZGVzJywga2V5d29yZHM6ICd2ZXJ0aWNhbCB2IGd1aWRlIGd1aWRlcycgfSxcbiAgeyBpZDogJ2hvcml6b250YWwnLCBsYWJlbDogJ0gnLCBhcmlhTGFiZWw6ICdIb3Jpem9udGFsIGd1aWRlcycsIGtleXdvcmRzOiAnaG9yaXpvbnRhbCBoIGd1aWRlIGd1aWRlcycgfSxcbiAgeyBpZDogJ29mZicsIGxhYmVsOiAnT2ZmJywgYXJpYUxhYmVsOiAnRGlzYWJsZSBpbnNwZWN0b3InLCBrZXl3b3JkczogJ29mZiBkaXNhYmxlIGluc3BlY3RvciBwb3dlcicgfSxcbl07XG5cbmNvbnN0IElOU1BFQ1RPUl9QRVRTID0gW1xuICB7XG4gICAgbmFtZTogJ01lYXN1cmluZyBjYXRlcnBpbGxhcicsXG4gICAgc3ByaXRlU3JjOiBNRUFTVVJFX0NBVEVSUElMTEFSX1NQUklURV9TUkMsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnUGl4ZWwgY2F0JyxcbiAgICBzcHJpdGVTcmM6IENBVF9QRVRfU1BSSVRFX1NSQyxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdDb3JnaScsXG4gICAgc3ByaXRlU3JjOiBET0dfUEVUX1NQUklURV9TUkMsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnQnVubnknLFxuICAgIHNwcml0ZVNyYzogQlVOTllfUEVUX1NQUklURV9TUkMsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnRm94JyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9QRVRfU1BSSVRFUy5mb3gsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnUGFuZGEnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX1BFVF9TUFJJVEVTLnBhbmRhLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0Zyb2cnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX1BFVF9TUFJJVEVTLmZyb2csXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnQXhvbG90bCcsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfUEVUX1NQUklURVMuYXhvbG90bCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdSYWNjb29uJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9QRVRfU1BSSVRFUy5yYWNjb29uLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0R1Y2tsaW5nJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9QRVRfU1BSSVRFUy5kdWNrbGluZyxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdUdXJ0bGUnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX1BFVF9TUFJJVEVTLnR1cnRsZSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdIZWRnZWhvZycsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfUEVUX1NQUklURVMuaGVkZ2Vob2csXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnUmVkIHBhbmRhJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9QRVRfU1BSSVRFU1sncmVkLXBhbmRhJ10sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnUGVuZ3VpbicsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfUEVUX1NQUklURVMucGVuZ3VpbixcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdPdHRlcicsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfRVhUUkFfUEVUX1NQUklURVMub3R0ZXIsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnQ2FweWJhcmEnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLmNhcHliYXJhLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ1NoaWJhIGludScsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfRVhUUkFfUEVUX1NQUklURVMuc2hpYmEsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnTW91c2UnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLm1vdXNlLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0hhbXN0ZXInLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLmhhbXN0ZXIsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnS29hbGEnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLmtvYWxhLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ1Nsb3RoJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5zbG90aCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdCYWJ5IHNlYWwnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLnNlYWwsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnT2N0b3B1cycsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfRVhUUkFfUEVUX1NQUklURVMub2N0b3B1cyxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdDcmFiJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5jcmFiLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0J1bWJsZWJlZScsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfRVhUUkFfUEVUX1NQUklURVMuYmVlLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ01vdGgnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLm1vdGgsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnVGlueSBiYXQnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLmJhdCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdPd2wnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLm93bCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdQYXJyb3QnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLnBhcnJvdCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdDaGFtZWxlb24nLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLmNoYW1lbGVvbixcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdHZWNrbycsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfRVhUUkFfUEVUX1NQUklURVMuZ2Vja28sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnU25haWwnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLnNuYWlsLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0JhYnkgdHJpY2VyYXRvcHMnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLnRyaWNlcmF0b3BzLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0FscGFjYScsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfRVhUUkFfUEVUX1NQUklURVMuYWxwYWNhLFxuICB9LFxuXSBhcyBjb25zdDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW5zcGVjdG9yLW92ZXJsYXknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2luc3BlY3Rvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9pbnNwZWN0b3IuY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBpbnNwZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICByZWFkb25seSBNYXRoID0gTWF0aDtcbiAgcmVhZG9ubHkgY2hlY2twb2ludEFjdGl2aXR5QXQgPSBjaGVja3BvaW50QWN0aXZpdHlBdDtcbiAgcmVhZG9ubHkgZm9ybWF0VmFsdWUgPSBmb3JtYXRWYWx1ZTtcbiAgcmVhZG9ubHkgZm9ybWF0UmVsYXRpdmVUaW1lID0gZm9ybWF0UmVsYXRpdmVUaW1lO1xuICByZWFkb25seSBndWlkZUhpdGJveFNpemUgPSBHVUlERV9ISVRCT1hfU0laRTtcbiAgcmVhZG9ubHkgb3ZlcmxheVJvb3QgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdvdmVybGF5Um9vdCcpO1xuICByZWFkb25seSBjaGVja3BvaW50RGlhbG9nID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTERpYWxvZ0VsZW1lbnQ+PignY2hlY2twb2ludERpYWxvZycpO1xuICByZWFkb25seSBjaGVja3BvaW50U2VhcmNoID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdjaGVja3BvaW50U2VhcmNoJyk7XG5cbiAgQElucHV0KCkgaGlnaGxpZ2h0Q29sb3IgPSAnIzRmOGNmZic7XG4gIEBJbnB1dCgpIGd1aWRlQ29sb3IgPSAnI2ZmN2EwMCc7XG4gIEBJbnB1dCgpIGhvdmVySGlnaGxpZ2h0RW5hYmxlZCA9IHRydWU7XG5cbiAgcmVhZG9ubHkgY2hlY2twb2ludFNlcnZpY2UgPSBpbmplY3QoSW5zcGVjdG9yQ2hlY2twb2ludFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHJlYWRvbmx5IGNvbW1hbmRCYXJPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludFF1ZXJ5ID0gc2lnbmFsKCcnKTtcbiAgcmVhZG9ubHkgYWN0aXZlQ29tbWFuZEluZGV4ID0gc2lnbmFsKDApO1xuICByZWFkb25seSBlZGl0aW5nQ2hlY2twb2ludElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBkZWxldGluZ0NoZWNrcG9pbnRJZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgcmVuYW1lRHJhZnQgPSBzaWduYWwoJycpO1xuICByZWFkb25seSBjaGVja3BvaW50VG9hc3QgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGNoZWNrcG9pbnRUb2FzdElzRXJyb3IgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBwZXRJbmRleCA9IHNpZ25hbCgwKTtcbiAgcmVhZG9ubHkgYWN0aXZlUGV0ID0gY29tcHV0ZWQoKCkgPT4gSU5TUEVDVE9SX1BFVFNbdGhpcy5wZXRJbmRleCgpXSk7XG4gIHJlYWRvbmx5IGZpbHRlcmVkQ2hlY2twb2ludHMgPSBjb21wdXRlZCgoKSA9PlxuICAgIGZ1enp5Q2hlY2twb2ludHMoXG4gICAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5jaGVja3BvaW50cygpID8/IFtdLFxuICAgICAgdGhpcy5jaGVja3BvaW50UXVlcnkoKSxcbiAgICApLFxuICApO1xuICByZWFkb25seSBmaWx0ZXJlZEluc3BlY3RvckFjdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdGVybXMgPSB0aGlzLmNoZWNrcG9pbnRRdWVyeSgpLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmICghdGVybXMubGVuZ3RoKSByZXR1cm4gSU5TUEVDVE9SX0NPTU1BTkRfQUNUSU9OUztcbiAgICByZXR1cm4gSU5TUEVDVE9SX0NPTU1BTkRfQUNUSU9OUy5maWx0ZXIoKGFjdGlvbikgPT4ge1xuICAgICAgY29uc3Qgc2VhcmNoYWJsZVRleHQgPSBgJHthY3Rpb24ubGFiZWx9ICR7YWN0aW9uLmFyaWFMYWJlbH0gJHthY3Rpb24ua2V5d29yZHN9YC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHRlcm1zLmV2ZXJ5KCh0ZXJtKSA9PiBzZWFyY2hhYmxlVGV4dC5pbmNsdWRlcyh0ZXJtKSk7XG4gICAgfSk7XG4gIH0pO1xuICByZWFkb25seSBjb21tYW5kUmVzdWx0Q291bnQgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLmZpbHRlcmVkQ2hlY2twb2ludHMoKS5sZW5ndGggKyB0aGlzLmZpbHRlcmVkSW5zcGVjdG9yQWN0aW9ucygpLmxlbmd0aCxcbiAgKTtcbiAgcmVhZG9ubHkgYWN0aXZlQ29tbWFuZFJlc3VsdElkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSB0aGlzLmZpbHRlcmVkQ2hlY2twb2ludHMoKVt0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleCgpXTtcbiAgICBpZiAoY2hlY2twb2ludCkgcmV0dXJuIGBpbnNwZWN0b3ItY2hlY2twb2ludC0ke2NoZWNrcG9pbnQuaWR9YDtcbiAgICBjb25zdCBhY3Rpb25JbmRleCA9IHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4KCkgLSB0aGlzLmZpbHRlcmVkQ2hlY2twb2ludHMoKS5sZW5ndGg7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5maWx0ZXJlZEluc3BlY3RvckFjdGlvbnMoKVthY3Rpb25JbmRleF07XG4gICAgcmV0dXJuIGFjdGlvbiA/IGBpbnNwZWN0b3ItYWN0aW9uLSR7YWN0aW9uLmlkfWAgOiBudWxsO1xuICB9KTtcblxuICByZWFkb25seSBlbmFibGVkID0gc2lnbmFsKHRydWUpO1xuICByZWFkb25seSB0b29sTW9kZSA9IHNpZ25hbDxUb29sTW9kZT4oJ25vbmUnKTtcbiAgcmVhZG9ubHkgZ3VpZGVPcmllbnRhdGlvbiA9IHNpZ25hbDxHdWlkZU9yaWVudGF0aW9uPigndmVydGljYWwnKTtcbiAgcmVhZG9ubHkgZ3VpZGVzID0gc2lnbmFsPEd1aWRlW10+KFtdKTtcbiAgcmVhZG9ubHkgaG92ZXJSZWN0ID0gc2lnbmFsPFJlY3QgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRHdWlkZUlkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzZWxlY3RlZE1lYXN1cmVtZW50ID0gc2lnbmFsPEluc3BlY3RNZWFzdXJlbWVudCB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzaG93VHlwb2dyYXBoeSA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGFsdFByZXNzZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBkaXN0YW5jZU92ZXJsYXkgPSBzaWduYWw8RGlzdGFuY2VPdmVybGF5IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHRleHRCbG9ja3MgPSBzaWduYWw8VGV4dEJsb2NrQW5ub3RhdGlvbltdPihbXSk7XG4gIHJlYWRvbmx5IGd1aWRlUHJldmlldyA9IHNpZ25hbDxHdWlkZSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkTWV0YUxpbmUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQoKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBgJHtzZWxlY3RlZC5sYWJlbH0gwrcgJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5yZWN0LndpZHRoKX0geCAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLnJlY3QuaGVpZ2h0KX0gwrcgJHtzZWxlY3RlZC5zdHlsZXMuZm9udFNpemV9IC8gJHtzZWxlY3RlZC5zdHlsZXMubGluZUhlaWdodH0gLyAke3NlbGVjdGVkLnN0eWxlcy5jb2xvcn1gO1xuICB9KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlzQnJvd3NlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVDYXB0dXJlZENsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKFxuICAgICAgIWV2ZW50LnNoaWZ0S2V5IHx8XG4gICAgICAhdGhpcy5jYW5JbnNwZWN0Q2xpY2soZXZlbnQpIHx8XG4gICAgICAhdGhpcy5zZWxlY3RFbGVtZW50QXRQb2ludChldmVudClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9O1xuICBwcml2YXRlIGRyYWdnaW5nR3VpZGVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VsZWN0ZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0b2FzdFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IG9iamVjdCkge1xuICAgIHRoaXMuaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSByZXR1cm47XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNhcHR1cmVkQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDYXB0dXJlZENsaWNrLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLnRvYXN0VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0VGltZXIpO1xuICB9XG5cbiAgc2V0VG9vbE1vZGUobW9kZTogVG9vbE1vZGUpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmVuYWJsZWQuc2V0KHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMudG9vbE1vZGUuc2V0KHRoaXMudG9vbE1vZGUoKSA9PT0gbW9kZSA/ICdub25lJyA6IG1vZGUpO1xuICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHNldEd1aWRlT3JpZW50YXRpb24ob3JpZW50YXRpb246IEd1aWRlT3JpZW50YXRpb24pIHtcbiAgICB0aGlzLmd1aWRlT3JpZW50YXRpb24uc2V0KG9yaWVudGF0aW9uKTtcbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gIH1cblxuICBhY3RpdmF0ZUd1aWRlT3JpZW50YXRpb24ob3JpZW50YXRpb246IEd1aWRlT3JpZW50YXRpb24pIHtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMudG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycgJiYgdGhpcy5ndWlkZU9yaWVudGF0aW9uKCkgPT09IG9yaWVudGF0aW9uO1xuICAgIHRoaXMuc2V0R3VpZGVPcmllbnRhdGlvbihvcmllbnRhdGlvbik7XG4gICAgaWYgKGlzQWN0aXZlIHx8IHRoaXMudG9vbE1vZGUoKSAhPT0gJ2d1aWRlcycpIHtcbiAgICAgIHRoaXMuc2V0VG9vbE1vZGUoJ2d1aWRlcycpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVR5cG9ncmFwaHkoKSB7XG4gICAgdGhpcy5zaG93VHlwb2dyYXBoeS51cGRhdGUoKHZhbHVlKSA9PiAhdmFsdWUpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIGRpc2FibGVJbnNwZWN0b3IoKSB7XG4gICAgdGhpcy5zZXRJbnNwZWN0b3JFbmFibGVkKGZhbHNlKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVDaGVja3BvaW50KCkge1xuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5zYXZlKCk7XG4gICAgaWYgKGNoZWNrcG9pbnQpIHtcbiAgICAgIHRoaXMuc2hvd0NoZWNrcG9pbnRUb2FzdChgU2F2ZWQg4oCcJHtjaGVja3BvaW50Lm5hbWV94oCdLmApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja3BvaW50U2VydmljZT8uZXJyb3IoKSkge1xuICAgICAgdGhpcy5zaG93Q2hlY2twb2ludFRvYXN0KHRoaXMuY2hlY2twb2ludFNlcnZpY2UuZXJyb3IoKSEsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9wZW5DaGVja3BvaW50Q29tbWFuZEJhcigpIHtcbiAgICBpZiAoIXRoaXMuY2hlY2twb2ludFNlcnZpY2UgfHwgIXRoaXMuaXNCcm93c2VyIHx8IHRoaXMuY29tbWFuZEJhck9wZW4oKSkgcmV0dXJuO1xuICAgIHRoaXMuY29tbWFuZEJhck9wZW4uc2V0KHRydWUpO1xuICAgIHRoaXMuY2hlY2twb2ludFF1ZXJ5LnNldCgnJyk7XG4gICAgdGhpcy5hY3RpdmVDb21tYW5kSW5kZXguc2V0KDApO1xuICAgIHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VydmljZS5jbGVhckVycm9yKCk7XG4gICAgdGhpcy5jaGVja3BvaW50RGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuc2hvd01vZGFsKCk7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSk7XG4gICAgYXdhaXQgdGhpcy5jaGVja3BvaW50U2VydmljZS5sb2FkKCk7XG4gICAgdGhpcy5jbGFtcEFjdGl2ZUNvbW1hbmQoKTtcbiAgfVxuXG4gIGNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKSB7XG4gICAgaWYgKHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmJ1c3koKSkgcmV0dXJuO1xuICAgIHRoaXMuY2hlY2twb2ludERpYWxvZygpPy5uYXRpdmVFbGVtZW50LmNsb3NlKCk7XG4gICAgdGhpcy5jb21tYW5kQmFyT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gIH1cblxuICB1cGRhdGVDaGVja3BvaW50UXVlcnkoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5jaGVja3BvaW50UXVlcnkuc2V0KChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xuICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldCgwKTtcbiAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmNsZWFyRXJyb3IoKTtcbiAgfVxuXG4gIGN5Y2xlUGV0KGV2ZW50PzogRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5wZXRJbmRleC51cGRhdGUoKGluZGV4KSA9PiAoaW5kZXggKyAxKSAlIElOU1BFQ1RPUl9QRVRTLmxlbmd0aCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIHNldEFjdGl2ZUNoZWNrcG9pbnQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldChpbmRleCk7XG4gIH1cblxuICBzaG91bGRTaG93Q2hlY2twb2ludFJvdXRlKGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQpIHtcbiAgICBpZiAoIWNoZWNrcG9pbnQucm91dGUudHJpbSgpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMubm9ybWFsaXplQ2hlY2twb2ludExhYmVsKGNoZWNrcG9pbnQubmFtZSkgIT09IHRoaXMubm9ybWFsaXplQ2hlY2twb2ludExhYmVsKGNoZWNrcG9pbnQucm91dGUpO1xuICB9XG5cbiAgc2V0QWN0aXZlSW5zcGVjdG9yQWN0aW9uKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleC5zZXQodGhpcy5maWx0ZXJlZENoZWNrcG9pbnRzKCkubGVuZ3RoICsgaW5kZXgpO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUluc3BlY3RvckFjdGlvbihhY3Rpb246IEluc3BlY3RvckNvbW1hbmRBY3Rpb24pIHtcbiAgICBpZiAodGhpcy5jaGVja3BvaW50U2VydmljZT8uYnVzeSgpKSByZXR1cm47XG4gICAgc3dpdGNoIChhY3Rpb24uaWQpIHtcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHRoaXMuc2V0VG9vbE1vZGUoJ3NlbGVjdCcpO1xuICAgICAgICB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0eXBlJzpcbiAgICAgICAgdGhpcy50b2dnbGVUeXBvZ3JhcGh5KCk7XG4gICAgICAgIHRoaXMuY2xvc2VDaGVja3BvaW50Q29tbWFuZEJhcigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NhdmUnOlxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVDaGVja3BvaW50KCk7XG4gICAgICAgIGlmICh0aGlzLmNvbW1hbmRCYXJPcGVuKCkpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZmlsdGVyZWRJbnNwZWN0b3JBY3Rpb25zKCkuZmluZEluZGV4KCh7IGlkIH0pID0+IGlkID09PSBhY3Rpb24uaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB0aGlzLnNldEFjdGl2ZUluc3BlY3RvckFjdGlvbihpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICAgIHRoaXMuYWN0aXZhdGVHdWlkZU9yaWVudGF0aW9uKCd2ZXJ0aWNhbCcpO1xuICAgICAgICB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdob3Jpem9udGFsJzpcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUd1aWRlT3JpZW50YXRpb24oJ2hvcml6b250YWwnKTtcbiAgICAgICAgdGhpcy5jbG9zZUNoZWNrcG9pbnRDb21tYW5kQmFyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgdGhpcy5jbG9zZUNoZWNrcG9pbnRDb21tYW5kQmFyKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZUluc3BlY3RvcigpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXN0b3JlQ2hlY2twb2ludChjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlIHx8IHRoaXMuY2hlY2twb2ludFNlcnZpY2UuYnVzeSgpKSByZXR1cm47XG4gICAgY29uc3QgcmVzdG9yZWQgPSBhd2FpdCB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlLnJlc3RvcmUoY2hlY2twb2ludC5pZCk7XG4gICAgaWYgKCFyZXN0b3JlZCkgcmV0dXJuO1xuICAgIHRoaXMuY2hlY2twb2ludERpYWxvZygpPy5uYXRpdmVFbGVtZW50LmNsb3NlKCk7XG4gICAgdGhpcy5jb21tYW5kQmFyT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuc2hvd0NoZWNrcG9pbnRUb2FzdChgUmVzdG9yZWQg4oCcJHtjaGVja3BvaW50Lm5hbWV94oCdLmApO1xuICB9XG5cbiAgYmVnaW5SZW5hbWUoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCwgZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jaGVja3BvaW50U2VydmljZT8uYnVzeSgpKSByZXR1cm47XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChjaGVja3BvaW50LmlkKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLnJlbmFtZURyYWZ0LnNldChjaGVja3BvaW50Lm5hbWUpO1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5jaGVja3BvaW50RGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcbiAgICAgICAgJy5pbnNwZWN0b3ItY29tbWFuZC1yb3dfX3JlbmFtZScsXG4gICAgICApO1xuICAgICAgaW5wdXQ/LmZvY3VzKCk7XG4gICAgICBpbnB1dD8uc2VsZWN0KCk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVSZW5hbWVEcmFmdChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnJlbmFtZURyYWZ0LnNldCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5jbGVhckVycm9yKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hSZW5hbWUoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCkge1xuICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5yZW5hbWUoY2hlY2twb2ludC5pZCwgdGhpcy5yZW5hbWVEcmFmdCgpKSkge1xuICAgICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICAgIHRoaXMuY2hlY2twb2ludFNlYXJjaCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsUmVuYW1lKCkge1xuICAgIHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VydmljZT8uY2xlYXJFcnJvcigpO1xuICAgIHRoaXMuY2hlY2twb2ludFNlYXJjaCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBiZWdpbkRlbGV0ZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLCBldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5idXN5KCkpIHJldHVybjtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChjaGVja3BvaW50LmlkKTtcbiAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICB9XG5cbiAgY2FuY2VsRGVsZXRlKGV2ZW50PzogRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpcm1EZWxldGUoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCwgZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIWF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmRlbGV0ZShjaGVja3BvaW50LmlkKSkgcmV0dXJuO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMuY2xhbXBBY3RpdmVDb21tYW5kKCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGhhbmRsZUNoZWNrcG9pbnREaWFsb2dDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmIChcbiAgICAgIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5jaGVja3BvaW50RGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQgJiZcbiAgICAgICF0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5idXN5KCkgJiZcbiAgICAgICF0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkKClcbiAgICApIHtcbiAgICAgIHRoaXMuY2xvc2VDaGVja3BvaW50Q29tbWFuZEJhcigpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyR3VpZGVzKCkge1xuICAgIHRoaXMuZ3VpZGVzLnNldChbXSk7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KG51bGwpO1xuICB9XG5cbiAgdHJhY2tHdWlkZSA9IChfaW5kZXg6IG51bWJlciwgZ3VpZGU6IEd1aWRlKSA9PiBndWlkZS5pZDtcbiAgdHJhY2tUZXh0QmxvY2sgPSAoX2luZGV4OiBudW1iZXIsIGJsb2NrOiBUZXh0QmxvY2tBbm5vdGF0aW9uKSA9PiBibG9jay5pZDtcbiAgdHJhY2tDb25uZWN0b3IgPSAoXG4gICAgX2luZGV4OiBudW1iZXIsXG4gICAgY29ubmVjdG9yOiBEaXN0YW5jZU92ZXJsYXlbJ2Nvbm5lY3RvcnMnXVtudW1iZXJdLFxuICApID0+IGAke2Nvbm5lY3Rvci54MX06JHtjb25uZWN0b3IueTF9OiR7Y29ubmVjdG9yLngyfToke2Nvbm5lY3Rvci55Mn1gO1xuXG4gIHN0YXJ0R3VpZGVEcmFnKGV2ZW50OiBQb2ludGVyRXZlbnQsIGd1aWRlOiBHdWlkZSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgPSBndWlkZS5pZDtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQoZ3VpZGUuaWQpO1xuICB9XG5cbiAgZm9ybWF0RWRnZXMoZWRnZXM6IEluc3BlY3RNZWFzdXJlbWVudFsncGFkZGluZyddKSB7XG4gICAgcmV0dXJuIGAke2Zvcm1hdFZhbHVlKGVkZ2VzLnRvcCl9ICR7Zm9ybWF0VmFsdWUoZWRnZXMucmlnaHQpfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLmJvdHRvbSl9ICR7Zm9ybWF0VmFsdWUoZWRnZXMubGVmdCl9YDtcbiAgfVxuXG4gIGZvcm1hdEdhcChzZWxlY3RlZDogSW5zcGVjdE1lYXN1cmVtZW50KSB7XG4gICAgcmV0dXJuIGAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLmdhcC5yb3cpfSAvICR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQuZ2FwLmNvbHVtbil9YDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGVja3BvaW50U2VydmljZSAmJlxuICAgICAgIWV2ZW50LnJlcGVhdCAmJlxuICAgICAgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiZcbiAgICAgIGV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICBrZXkgPT09ICdwJ1xuICAgICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY29tbWFuZEJhck9wZW4oKSA/IHRoaXMuY2xvc2VDaGVja3BvaW50Q29tbWFuZEJhcigpIDogdm9pZCB0aGlzLm9wZW5DaGVja3BvaW50Q29tbWFuZEJhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbW1hbmRCYXJPcGVuKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ29tbWFuZEJhcktleWRvd24oZXZlbnQsIGtleSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXZlbnQua2V5ID09PSAnQWx0JyAmJlxuICAgICAgdGhpcy5lbmFibGVkKCkgJiZcbiAgICAgIHRoaXMudG9vbE1vZGUoKSA9PT0gJ3NlbGVjdCdcbiAgICApIHtcbiAgICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdlc2NhcGUnICYmIHRoaXMuaGFzSW5zcGVjdG9yQ2FudmFzU3RhdGUoKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY2xlYXJJbnNwZWN0b3JDYW52YXMoKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxuICBoYW5kbGVLZXl1cChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdBbHQnKSB7XG4gICAgICB0aGlzLmFsdFByZXNzZWQuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0luc3BlY3RvckNhbnZhc1N0YXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmd1aWRlcygpLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudCgpICE9PSBudWxsIHx8XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZCgpICE9PSBudWxsIHx8XG4gICAgICB0aGlzLmhvdmVyUmVjdCgpICE9PSBudWxsIHx8XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheSgpICE9PSBudWxsIHx8XG4gICAgICB0aGlzLmFsdFByZXNzZWQoKSB8fFxuICAgICAgdGhpcy5ndWlkZVByZXZpZXcoKSAhPT0gbnVsbCB8fFxuICAgICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgIT09IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNsZWFySW5zcGVjdG9yQ2FudmFzKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQobnVsbCk7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KG51bGwpO1xuICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgdGhpcy5hbHRQcmVzc2VkLnNldChmYWxzZSk7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgPSBudWxsO1xuICAgIHRoaXMuY2xlYXJHdWlkZXMoKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUNoZWNrcG9pbnRMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICAudHJpbSgpXG4gICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVybW92ZScsIFsnJGV2ZW50J10pXG4gIGhhbmRsZVBvaW50ZXJNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICAgIHRoaXMuZ3VpZGVzLnNldChcbiAgICAgICAgdGhpcy5ndWlkZXMoKS5tYXAoKGd1aWRlKSA9PiB7XG4gICAgICAgICAgaWYgKGd1aWRlLmlkICE9PSB0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGd1aWRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByYXdQb3NpdGlvbiA9XG4gICAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGV2ZW50LmNsaWVudFggOiBldmVudC5jbGllbnRZO1xuICAgICAgICAgIGNvbnN0IG1heCA9XG4gICAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHZpZXdwb3J0LndpZHRoIDogdmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICAgIHJldHVybiB7IC4uLmd1aWRlLCBwb3NpdGlvbjogY2xhbXAocmF3UG9zaXRpb24sIDAsIG1heCkgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdndWlkZXMnKSB7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSA/P1xuICAgICAgICBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQodGhpcy5nZXRHdWlkZVByZXZpZXcoZXZlbnQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG5cbiAgICBpZiAodGhpcy50b29sTW9kZSgpICE9PSAnc2VsZWN0JyB8fCAhdGhpcy5ob3ZlckhpZ2hsaWdodEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmICghdGhpcy5hbHRQcmVzc2VkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldEVsZW1lbnQoXG4gICAgICB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgIHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsLFxuICAgICk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gZ2V0UmVjdEZyb21Eb20odGFyZ2V0KTtcbiAgICB0aGlzLmhvdmVyRWxlbWVudCA9IHRhcmdldDtcbiAgICBpZiAoIXJlY3RzRXF1YWwocmVjdCwgdGhpcy5ob3ZlclJlY3QoKSkpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChyZWN0KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVydXAnKVxuICBoYW5kbGVQb2ludGVyVXAoKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRyYWdnaW5nR3VpZGVJZCA9IG51bGw7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6Y2xpY2snLCBbJyRldmVudCddKVxuICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsO1xuXG4gICAgaWYgKHRoaXMudG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycpIHtcbiAgICAgIGlmIChvdmVybGF5ICYmIG92ZXJsYXkuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGd1aWRlID0gdGhpcy5nZXRHdWlkZVByZXZpZXcoZXZlbnQpO1xuICAgICAgdGhpcy5hZGRHdWlkZSh7IC4uLmd1aWRlLCBpZDogY3JlYXRlSWQoKSB9KTtcbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChndWlkZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhbkluc3BlY3RDbGljayhldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdEVsZW1lbnRBdFBvaW50KGV2ZW50KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJylcbiAgaGFuZGxlVmlld3BvcnRDaGFuZ2UoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50ICYmIGRvY3VtZW50LmNvbnRhaW5zKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSkge1xuICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChnZXRJbnNwZWN0TWVhc3VyZW1lbnQodGhpcy5zZWxlY3RlZEVsZW1lbnQpKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBwcml2YXRlIGNhbkluc3BlY3RDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuaXNCcm93c2VyIHx8IHRoaXMudG9vbE1vZGUoKSAhPT0gJ3NlbGVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGw7XG4gICAgcmV0dXJuICEob3ZlcmxheSAmJiBvdmVybGF5LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSk7XG4gIH1cblxuICBwcml2YXRlIHNldEluc3BlY3RvckVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZW5hYmxlZC5zZXQoZW5hYmxlZCk7XG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICB0aGlzLnRvb2xNb2RlLnNldCgnbm9uZScpO1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChudWxsKTtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoW10pO1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgdGhpcy5hbHRQcmVzc2VkLnNldChmYWxzZSk7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmRyYWdnaW5nR3VpZGVJZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29tbWFuZEJhcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgY2hlY2twb2ludHMgPSB0aGlzLmZpbHRlcmVkQ2hlY2twb2ludHMoKTtcbiAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5maWx0ZXJlZEluc3BlY3RvckFjdGlvbnMoKTtcbiAgICBjb25zdCBhY3RpdmVDaGVja3BvaW50ID0gY2hlY2twb2ludHNbdGhpcy5hY3RpdmVDb21tYW5kSW5kZXgoKV07XG4gICAgY29uc3QgYWN0aXZlQWN0aW9uSW5kZXggPSB0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleCgpIC0gY2hlY2twb2ludHMubGVuZ3RoO1xuICAgIGNvbnN0IGFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbYWN0aXZlQWN0aW9uSW5kZXhdO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgaXNSZW5hbWVJbnB1dCA9IHRhcmdldD8uY2xhc3NMaXN0Py5jb250YWlucygnaW5zcGVjdG9yLWNvbW1hbmQtcm93X19yZW5hbWUnKSA/PyBmYWxzZTtcblxuICAgIGlmIChrZXkgPT09ICdlc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZCgpKSB0aGlzLmNhbmNlbFJlbmFtZSgpO1xuICAgICAgZWxzZSBpZiAodGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZCgpKSB0aGlzLmNhbmNlbERlbGV0ZSgpO1xuICAgICAgZWxzZSB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmJ1c3koKSkgcmV0dXJuO1xuICAgIGNvbnN0IGVkaXRpbmdDaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoeyBpZCB9KSA9PiBpZCA9PT0gdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkKCkpO1xuICAgIGlmIChpc1JlbmFtZUlucHV0ICYmIGtleSA9PT0gJ2VudGVyJyAmJiBlZGl0aW5nQ2hlY2twb2ludCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZvaWQgdGhpcy5maW5pc2hSZW5hbWUoZWRpdGluZ0NoZWNrcG9pbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNSZW5hbWVJbnB1dCkgcmV0dXJuO1xuICAgIGlmIChrZXkgPT09ICdhcnJvd2Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGFjdGl2ZUNoZWNrcG9pbnQpIHtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5hY3RpdmVDb21tYW5kSW5kZXgoKSA8IGNoZWNrcG9pbnRzLmxlbmd0aCAtIDFcbiAgICAgICAgICA/IHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4KCkgKyAxXG4gICAgICAgICAgOiBhY3Rpb25zLmxlbmd0aCA/IGNoZWNrcG9pbnRzLmxlbmd0aCA6IHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4KCk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zY3JvbGxBY3RpdmVDb21tYW5kSW50b1ZpZXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ2Fycm93dXAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGFjdGl2ZUFjdGlvbiAmJiBjaGVja3BvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVDb21tYW5kSW5kZXguc2V0KGNoZWNrcG9pbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmVDaGVja3BvaW50KSB7XG4gICAgICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldChNYXRoLm1heCgwLCB0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleCgpIC0gMSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5zY3JvbGxBY3RpdmVDb21tYW5kSW50b1ZpZXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ2Fycm93cmlnaHQnICYmIChhY3RpdmVDaGVja3BvaW50IHx8IGFjdGl2ZUFjdGlvbikgJiYgYWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBuZXh0QWN0aW9uSW5kZXggPSBhY3RpdmVBY3Rpb25cbiAgICAgICAgPyBNYXRoLm1pbihhY3RpdmVBY3Rpb25JbmRleCArIDEsIGFjdGlvbnMubGVuZ3RoIC0gMSlcbiAgICAgICAgOiAwO1xuICAgICAgdGhpcy5hY3RpdmVDb21tYW5kSW5kZXguc2V0KGNoZWNrcG9pbnRzLmxlbmd0aCArIG5leHRBY3Rpb25JbmRleCk7XG4gICAgICB0aGlzLnNjcm9sbEFjdGl2ZUNvbW1hbmRJbnRvVmlldygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSAnYXJyb3dsZWZ0JyAmJiBhY3RpdmVBY3Rpb24pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleC5zZXQoY2hlY2twb2ludHMubGVuZ3RoICsgTWF0aC5tYXgoMCwgYWN0aXZlQWN0aW9uSW5kZXggLSAxKSk7XG4gICAgICB0aGlzLnNjcm9sbEFjdGl2ZUNvbW1hbmRJbnRvVmlldygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSAnZW50ZXInICYmIGFjdGl2ZUNoZWNrcG9pbnQgJiYgIXRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQoKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZvaWQgdGhpcy5yZXN0b3JlQ2hlY2twb2ludChhY3RpdmVDaGVja3BvaW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ2VudGVyJyAmJiBhY3RpdmVBY3Rpb24pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2b2lkIHRoaXMuZXhlY3V0ZUluc3BlY3RvckFjdGlvbihhY3RpdmVBY3Rpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xhbXBBY3RpdmVDb21tYW5kKCkge1xuICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldChcbiAgICAgIE1hdGgubWluKHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4KCksIE1hdGgubWF4KDAsIHRoaXMuY29tbWFuZFJlc3VsdENvdW50KCkgLSAxKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsQWN0aXZlQ29tbWFuZEludG9WaWV3KCkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMuY2hlY2twb2ludERpYWxvZygpPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxuICAgICAgICBgW2RhdGEtY29tbWFuZC1pbmRleD1cIiR7dGhpcy5hY3RpdmVDb21tYW5kSW5kZXgoKX1cIl1gLFxuICAgICAgKTtcbiAgICAgIHJvdz8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93Q2hlY2twb2ludFRvYXN0KG1lc3NhZ2U6IHN0cmluZywgaXNFcnJvciA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMudG9hc3RUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RUaW1lcik7XG4gICAgdGhpcy5jaGVja3BvaW50VG9hc3RJc0Vycm9yLnNldChpc0Vycm9yKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRUb2FzdC5zZXQobWVzc2FnZSk7XG4gICAgdGhpcy50b2FzdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRUb2FzdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRUb2FzdElzRXJyb3Iuc2V0KGZhbHNlKTtcbiAgICB9LCAyNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGw7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgb3ZlcmxheSxcbiAgICApO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEN0cmwrY2xpY2s6IHNlbGVjdCB0aGUgbWluaW11bSBjb21tb24gcGFyZW50IG9mIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBjbGlja2VkIGVsZW1lbnRcbiAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgdGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNvbW1vblBhcmVudCA9IHRoaXMuZmluZE1pbmltdW1Db21tb25QYXJlbnQoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LFxuICAgICAgICB0YXJnZXQsXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBjb21tb25QYXJlbnQgJiZcbiAgICAgICAgY29tbW9uUGFyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICAgIGNvbW1vblBhcmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChnZXRJbnNwZWN0TWVhc3VyZW1lbnQoY29tbW9uUGFyZW50KSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gY29tbW9uUGFyZW50O1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQoZ2V0SW5zcGVjdE1lYXN1cmVtZW50KHRhcmdldCkpO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChcbiAgICAgIHRoaXMuZmluZEd1aWRlQXRQb2ludChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSxcbiAgICApO1xuICAgIHRoaXMudXBkYXRlRGlzdGFuY2VPdmVybGF5KCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEaXN0YW5jZU92ZXJsYXkoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuYWx0UHJlc3NlZCgpIHx8XG4gICAgICAhdGhpcy5zZWxlY3RlZEVsZW1lbnQgfHxcbiAgICAgICF0aGlzLmhvdmVyRWxlbWVudCB8fFxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPT09IHRoaXMuaG92ZXJFbGVtZW50IHx8XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5jb250YWlucyh0aGlzLmhvdmVyRWxlbWVudCkgfHxcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50LmNvbnRhaW5zKHRoaXMuc2VsZWN0ZWRFbGVtZW50KVxuICAgICkge1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChcbiAgICAgIGdldERpc3RhbmNlT3ZlcmxheShcbiAgICAgICAgZ2V0UmVjdEZyb21Eb20odGhpcy5zZWxlY3RlZEVsZW1lbnQpLFxuICAgICAgICBnZXRSZWN0RnJvbURvbSh0aGlzLmhvdmVyRWxlbWVudCksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCkge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIgfHwgIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLnNob3dUeXBvZ3JhcGh5KCkpIHtcbiAgICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZXdwb3J0ID0gZ2V0Vmlld3BvcnRTaXplKCk7XG4gICAgdGhpcy50ZXh0QmxvY2tzLnNldChcbiAgICAgIGdldFZpc2libGVUZXh0QmxvY2tzKHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChibG9jaykgPT5cbiAgICAgICAgICAgIGJsb2NrLnJlY3QudG9wID49IDAgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QudG9wIDw9IHZpZXdwb3J0LmhlaWdodCAmJlxuICAgICAgICAgICAgYmxvY2sucmVjdC5sZWZ0ID49IDAgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QubGVmdCA8PSB2aWV3cG9ydC53aWR0aCxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChibG9jaykgPT4gKHtcbiAgICAgICAgICAuLi5ibG9jayxcbiAgICAgICAgICByZWN0OiB7XG4gICAgICAgICAgICAuLi5ibG9jay5yZWN0LFxuICAgICAgICAgICAgbGVmdDogY2xhbXAoYmxvY2sucmVjdC5sZWZ0LCAwLCB2aWV3cG9ydC53aWR0aCAtIDEyKSxcbiAgICAgICAgICAgIHRvcDogY2xhbXAoYmxvY2sucmVjdC50b3AsIDE0LCB2aWV3cG9ydC5oZWlnaHQpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRHdWlkZShndWlkZTogR3VpZGUpIHtcbiAgICBjb25zdCBuZXh0R3VpZGVzID0gWy4uLnRoaXMuZ3VpZGVzKCksIGd1aWRlXTtcbiAgICB0aGlzLmd1aWRlcy5zZXQobmV4dEd1aWRlcyk7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KGd1aWRlLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3VpZGVQcmV2aWV3KGV2ZW50OiBQb2ludGVyRXZlbnQgfCBNb3VzZUV2ZW50KTogR3VpZGUge1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gZ2V0Vmlld3BvcnRTaXplKCk7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSB0aGlzLmd1aWRlT3JpZW50YXRpb24oKTtcbiAgICBjb25zdCByYXdQb3NpdGlvbiA9XG4gICAgICBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGV2ZW50LmNsaWVudFggOiBldmVudC5jbGllbnRZO1xuICAgIGNvbnN0IG1heCA9IG9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gdmlld3BvcnQud2lkdGggOiB2aWV3cG9ydC5oZWlnaHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdwcmV2aWV3JyxcbiAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgcG9zaXRpb246IHRoaXMuc25hcEd1aWRlKGNsYW1wKHJhd1Bvc2l0aW9uLCAwLCBtYXgpKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzbmFwR3VpZGUocG9zaXRpb246IG51bWJlcikge1xuICAgIGZvciAoY29uc3QgZ3VpZGUgb2YgdGhpcy5ndWlkZXMoKSkge1xuICAgICAgaWYgKE1hdGguYWJzKGd1aWRlLnBvc2l0aW9uIC0gcG9zaXRpb24pIDw9IEdVSURFX1NOQVBfRElTVEFOQ0UpIHtcbiAgICAgICAgcmV0dXJuIGd1aWRlLnBvc2l0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIGZpbmRHdWlkZUF0UG9pbnQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IGd1aWRlIG9mIHRoaXMuZ3VpZGVzKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgJiZcbiAgICAgICAgTWF0aC5hYnMoZ3VpZGUucG9zaXRpb24gLSB4KSA8PSBHVUlERV9ISVRCT1hfU0laRVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBndWlkZS5pZDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyAmJlxuICAgICAgICBNYXRoLmFicyhndWlkZS5wb3NpdGlvbiAtIHkpIDw9IEdVSURFX0hJVEJPWF9TSVpFXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGd1aWRlLmlkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE1pbmltdW1Db21tb25QYXJlbnQoXG4gICAgZWxlbWVudEE6IEhUTUxFbGVtZW50LFxuICAgIGVsZW1lbnRCOiBIVE1MRWxlbWVudCxcbiAgKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAvLyBCdWlsZCBhbmNlc3RvciBjaGFpbiBmb3IgZWxlbWVudCBBXG4gICAgY29uc3QgYW5jZXN0b3JzQSA9IG5ldyBTZXQ8RWxlbWVudD4oKTtcbiAgICBsZXQgY3VycmVudDogRWxlbWVudCB8IG51bGwgPSBlbGVtZW50QTtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgYW5jZXN0b3JzQS5hZGQoY3VycmVudCk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFdhbGsgdXAgZnJvbSBlbGVtZW50QiB1bnRpbCB3ZSBmaW5kIGEgY29tbW9uIGFuY2VzdG9yXG4gICAgY3VycmVudCA9IGVsZW1lbnRCO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBpZiAoYW5jZXN0b3JzQS5oYXMoY3VycmVudCkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLXJvb3RcIiAjb3ZlcmxheVJvb3Q+XG4gIEBpZiAoY2hlY2twb2ludFNlcnZpY2UpIHtcbiAgICA8ZGlhbG9nXG4gICAgICAjY2hlY2twb2ludERpYWxvZ1xuICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1kaWFsb2dcIlxuICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiaW5zcGVjdG9yLWNvbW1hbmQtdGl0bGVcIlxuICAgICAgKGNhbmNlbCk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgY2xvc2VDaGVja3BvaW50Q29tbWFuZEJhcigpXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVDaGVja3BvaW50RGlhbG9nQ2xpY2soJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgPGhlYWRlciBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19zZWFyY2hcIj5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGlkPVwiaW5zcGVjdG9yLWNvbW1hbmQtdGl0bGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItdmlzdWFsbHktaGlkZGVuXCJcbiAgICAgICAgICAgIGZvcj1cImluc3BlY3Rvci1jaGVja3BvaW50LXNlYXJjaFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgaW5zcGVjdG9yLW5nIGNvbW1hbmQgcGFsZXR0ZVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19wZXQtc3dpdGNoZXJcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQ2hhbmdlIHBldC4gQ3VycmVudCBwZXQ6ICcgKyBhY3RpdmVQZXQoKS5uYW1lXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInQ2hhbmdlIHBldDogJyArIGFjdGl2ZVBldCgpLm5hbWVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImN5Y2xlUGV0KCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fcGV0LXNwcml0ZVwiXG4gICAgICAgICAgICAgIFtzcmNdPVwiYWN0aXZlUGV0KCkuc3ByaXRlU3JjXCJcbiAgICAgICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNjaGVja3BvaW50U2VhcmNoXG4gICAgICAgICAgICBpZD1cImluc3BlY3Rvci1jaGVja3BvaW50LXNlYXJjaFwiXG4gICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiaW5zcGVjdG9yLW5n4oCmXCJcbiAgICAgICAgICAgIGFyaWEtYXV0b2NvbXBsZXRlPVwibGlzdFwiXG4gICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImNvbW1hbmRCYXJPcGVuKClcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImNoZWNrcG9pbnRRdWVyeSgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ2luc3BlY3Rvci1jaGVja3BvaW50LXJlc3VsdHMgaW5zcGVjdG9yLWNvbW1hbmQtYWN0aW9ucydcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImFjdGl2ZUNvbW1hbmRSZXN1bHRJZCgpXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJ1cGRhdGVDaGVja3BvaW50UXVlcnkoJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgQGlmIChjaGVja3BvaW50U2VydmljZS5lcnJvcigpOyBhcyBlcnJvcikge1xuICAgICAgICAgIDxwXG4gICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19tZXNzYWdlIGluc3BlY3Rvci1jb21tYW5kX19tZXNzYWdlLS1lcnJvclwiXG4gICAgICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGVycm9yIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGlkPVwiaW5zcGVjdG9yLWNoZWNrcG9pbnQtcmVzdWx0c1wiXG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fcmVzdWx0c1wiXG4gICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJTYXZlZCBjaGVja3BvaW50c1wiXG4gICAgICAgID5cbiAgICAgICAgICBAaWYgKGNoZWNrcG9pbnRTZXJ2aWNlLmxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZVwiIHJvbGU9XCJzdGF0dXNcIj5Mb2FkaW5n4oCmPC9wPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKFxuICAgICAgICAgICAgIWNoZWNrcG9pbnRTZXJ2aWNlLmNoZWNrcG9pbnRzKCkubGVuZ3RoICYmICFjaGVja3BvaW50UXVlcnkoKS50cmltKClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmRfX21lc3NhZ2VcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgICAgICAgIE5vIGNoZWNrcG9pbnRzIHlldFxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKFxuICAgICAgICAgICAgIWZpbHRlcmVkQ2hlY2twb2ludHMoKS5sZW5ndGggJiYgIWZpbHRlcmVkSW5zcGVjdG9yQWN0aW9ucygpLmxlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZVwiIHJvbGU9XCJzdGF0dXNcIj5ObyBtYXRjaGVzPC9wPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgIGNoZWNrcG9pbnQgb2YgZmlsdGVyZWRDaGVja3BvaW50cygpO1xuICAgICAgICAgICAgICB0cmFjayBjaGVja3BvaW50LmlkO1xuICAgICAgICAgICAgICBsZXQgaW5kZXggPSAkaW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgIFtpZF09XCInaW5zcGVjdG9yLWNoZWNrcG9pbnQtJyArIGNoZWNrcG9pbnQuaWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY29tbWFuZC1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJhY3RpdmVDb21tYW5kSW5kZXgoKSA9PT0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiYWN0aXZlQ29tbWFuZEluZGV4KCkgPT09IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYnVzeV09XCJcbiAgICAgICAgICAgICAgICAgIGNoZWNrcG9pbnRTZXJ2aWNlLmJ1c3koKSAmJiBhY3RpdmVDb21tYW5kSW5kZXgoKSA9PT0gaW5kZXhcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNldEFjdGl2ZUNoZWNrcG9pbnQoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICBkZWxldGluZ0NoZWNrcG9pbnRJZCgpID09PSBjaGVja3BvaW50LmlkIHx8XG4gICAgICAgICAgICAgICAgICBlZGl0aW5nQ2hlY2twb2ludElkKCkgPT09IGNoZWNrcG9pbnQuaWRcbiAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgIDogcmVzdG9yZUNoZWNrcG9pbnQoY2hlY2twb2ludClcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChkZWxldGluZ0NoZWNrcG9pbnRJZCgpID09PSBjaGVja3BvaW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fY29uZmlybVwiXG4gICAgICAgICAgICAgICAgICAgID5EZWxldGUg4oCce3sgY2hlY2twb2ludC5uYW1lIH194oCdPzwvc3BhblxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX2NvbmZpcm0tYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maXJtRGVsZXRlKGNoZWNrcG9pbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2FuY2VsRGVsZXRlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICBLZWVwXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGVkaXRpbmdDaGVja3BvaW50SWQoKSA9PT0gY2hlY2twb2ludC5pZCkge1xuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtcm93X19yZW5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2hlY2twb2ludCBuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJlbmFtZURyYWZ0KClcIlxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwidXBkYXRlUmVuYW1lRHJhZnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtcm93X19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtcm93X19uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrcG9pbnRTZXJ2aWNlLmJ1c3koKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlQ29tbWFuZEluZGV4KCkgPT09IGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZXN0b3JpbmfigKZcbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNoZWNrcG9pbnQubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fbWV0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvdWxkU2hvd0NoZWNrcG9pbnRSb3V0ZShjaGVja3BvaW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX3JvdXRlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2twb2ludC5yb3V0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fc2VwYXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPsK3PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtcm93X19hY3Rpdml0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY2hlY2twb2ludC5sYXN0VXNlZEF0ID8gXCJVc2VkXCIgOiBcIlNhdmVkXCIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFJlbGF0aXZlVGltZShjaGVja3BvaW50QWN0aXZpdHlBdChjaGVja3BvaW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJlZ2luUmVuYW1lKGNoZWNrcG9pbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbmFtZSAnICsgY2hlY2twb2ludC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0xMS44IDEuOCAyLjQgMi40LTguMyA4LjMtMy4xLjcuNy0zLjF6bS04IDEwLjQgMS41LS4zLTEuMi0xLjJ6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJlZ2luRGVsZXRlKGNoZWNrcG9pbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0RlbGV0ZSAnICsgY2hlY2twb2ludC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk01LjUgMmg1bC41IDFIMTR2MS4yNUgyVjNoM3ptLTIgMy4yNWg5TDEyIDE0SDR6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKGZpbHRlcmVkSW5zcGVjdG9yQWN0aW9ucygpLmxlbmd0aCkge1xuICAgICAgICAgIDxmb290ZXJcbiAgICAgICAgICAgIGlkPVwiaW5zcGVjdG9yLWNvbW1hbmQtYWN0aW9uc1wiXG4gICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19hY3Rpb25zXCJcbiAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJJbnNwZWN0b3IgYWN0aW9uc1wiXG4gICAgICAgICAgICBhcmlhLW9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgIGFjdGlvbiBvZiBmaWx0ZXJlZEluc3BlY3RvckFjdGlvbnMoKTtcbiAgICAgICAgICAgICAgdHJhY2sgYWN0aW9uLmlkO1xuICAgICAgICAgICAgICBsZXQgaW5kZXggPSAkaW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1hY3Rpb25cIlxuICAgICAgICAgICAgICAgIFtpZF09XCInaW5zcGVjdG9yLWFjdGlvbi0nICsgYWN0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWNvbW1hbmQtaW5kZXhdPVwiZmlsdGVyZWRDaGVja3BvaW50cygpLmxlbmd0aCArIGluZGV4XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFjdGlvbi5hcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiXG4gICAgICAgICAgICAgICAgICBhY3RpdmVDb21tYW5kSW5kZXgoKSA9PT0gZmlsdGVyZWRDaGVja3BvaW50cygpLmxlbmd0aCArIGluZGV4XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImNoZWNrcG9pbnRTZXJ2aWNlLmJ1c3koKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cIlxuICAgICAgICAgICAgICAgICAgYWN0aXZlQ29tbWFuZEluZGV4KCkgPT09IGZpbHRlcmVkQ2hlY2twb2ludHMoKS5sZW5ndGggKyBpbmRleFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJcbiAgICAgICAgICAgICAgICAgIChhY3Rpb24uaWQgPT09ICdzZWxlY3QnICYmIHRvb2xNb2RlKCkgPT09ICdzZWxlY3QnKSB8fFxuICAgICAgICAgICAgICAgICAgKGFjdGlvbi5pZCA9PT0gJ3R5cGUnICYmIHNob3dUeXBvZ3JhcGh5KCkpIHx8XG4gICAgICAgICAgICAgICAgICAoYWN0aW9uLmlkID09PSAndmVydGljYWwnICYmXG4gICAgICAgICAgICAgICAgICAgIHRvb2xNb2RlKCkgPT09ICdndWlkZXMnICYmXG4gICAgICAgICAgICAgICAgICAgIGd1aWRlT3JpZW50YXRpb24oKSA9PT0gJ3ZlcnRpY2FsJykgfHxcbiAgICAgICAgICAgICAgICAgIChhY3Rpb24uaWQgPT09ICdob3Jpem9udGFsJyAmJlxuICAgICAgICAgICAgICAgICAgICB0b29sTW9kZSgpID09PSAnZ3VpZGVzJyAmJlxuICAgICAgICAgICAgICAgICAgICBndWlkZU9yaWVudGF0aW9uKCkgPT09ICdob3Jpem9udGFsJylcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItY29tbWFuZC1hY3Rpb24tLWRhbmdlcl09XCJhY3Rpb24uaWQgPT09ICdvZmYnXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2hlY2twb2ludFNlcnZpY2UuYnVzeSgpXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRBY3RpdmVJbnNwZWN0b3JBY3Rpb24oaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0ZUluc3BlY3RvckFjdGlvbihhY3Rpb24pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBzd2l0Y2ggKGFjdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgICAgQGNhc2UgKFwic2VsZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDJsOCA4LTMgLjdMNi43IDEzIDYgMTAgMyAyelwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGNhc2UgKFwidHlwZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA0VjJoMTB2MmgtNHYxMEg3VjR6XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJzYXZlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMi41IDJoOS42bDEuNCAxLjRWMTRoLTExem0yIDEuNXYzaDZ2LTN6bS41IDZWMTJoNlY5LjV6XCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBjYXNlIChcInZlcnRpY2FsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjI1IDJoMS41djEyaC0xLjV6XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yIDcuMjVoMTJ2MS41SDJ6XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJvZmZcIikge1xuICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjI1IDEuNWgxLjV2NmgtMS41ek00LjEgMy4zNWwuOTYgMS4xNUE0LjI1IDQuMjUgMCAxIDAgMTAuOTQgNC41bC45Ni0xLjE1QTUuNzUgNS43NSAwIDEgMSA0LjEgMy4zNXpcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBhY3Rpb24ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICB9XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9kaWFsb2c+XG4gIH1cblxuICBAaWYgKGNoZWNrcG9pbnRUb2FzdCgpOyBhcyB0b2FzdCkge1xuICAgIDxwXG4gICAgICBjbGFzcz1cImluc3BlY3Rvci1jaGVja3BvaW50LXRvYXN0XCJcbiAgICAgIFtjbGFzcy5pbnNwZWN0b3ItY2hlY2twb2ludC10b2FzdC0tZXJyb3JdPVwiY2hlY2twb2ludFRvYXN0SXNFcnJvcigpXCJcbiAgICAgIFthdHRyLnJvbGVdPVwiY2hlY2twb2ludFRvYXN0SXNFcnJvcigpID8gJ2FsZXJ0JyA6ICdzdGF0dXMnXCJcbiAgICA+XG4gICAgICB7eyB0b2FzdCB9fVxuICAgIDwvcD5cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIHRvb2xNb2RlKCkgPT09IFwic2VsZWN0XCIpIHtcbiAgICBAaWYgKGhvdmVyUmVjdCgpICYmIGhvdmVySGlnaGxpZ2h0RW5hYmxlZCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0taG92ZXJcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJob3ZlclJlY3QoKSEubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiaG92ZXJSZWN0KCkhLnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJob3ZlclJlY3QoKSEud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhvdmVyUmVjdCgpIS5oZWlnaHRcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItYWNjZW50XT1cImhpZ2hsaWdodENvbG9yXCJcbiAgICAgID48L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKHNlbGVjdGVkTWVhc3VyZW1lbnQoKTsgYXMgc2VsZWN0ZWQpIHtcbiAgICAgIEBpZiAoc2VsZWN0ZWQuZ2FwLmFjdGl2ZSAmJiBzZWxlY3RlZC5wYXJlbnRSZWN0KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tZ2FwXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LmxlZnRcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC50b3BcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QuaGVpZ2h0XCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tZ2FwXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LmxlZnRcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC50b3AgLSA4XCJcbiAgICAgICAgPlxuICAgICAgICAgIEcge3sgZm9ybWF0R2FwKHNlbGVjdGVkKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tbWFyZ2luXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LmhlaWdodFwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveC10YWcgaW5zcGVjdG9yLWJveC10YWctLW1hcmdpblwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC50b3AgLSA4XCJcbiAgICAgID5cbiAgICAgICAgTSB7eyBmb3JtYXRFZGdlcyhzZWxlY3RlZC5tYXJnaW4pIH19XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tc2VsZWN0ZWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5yZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLnJlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnJlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnJlY3QuaGVpZ2h0XCJcbiAgICAgICAgW3N0eWxlLi0taW5zcGVjdG9yLWFjY2VudF09XCJoaWdobGlnaHRDb2xvclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItbGFiZWxcIj57eyBzZWxlY3RlZE1ldGFMaW5lKCkgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1wYWRkaW5nXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5oZWlnaHRcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnIGluc3BlY3Rvci1ib3gtdGFnLS1wYWRkaW5nXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiXG4gICAgICAgICAgc2VsZWN0ZWQucGFkZGluZ1JlY3QudG9wICsgc2VsZWN0ZWQucGFkZGluZ1JlY3QuaGVpZ2h0ICsgOFxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICBQIHt7IGZvcm1hdEVkZ2VzKHNlbGVjdGVkLnBhZGRpbmcpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cblxuICBAaWYgKGVuYWJsZWQoKSAmJiBzaG93VHlwb2dyYXBoeSgpKSB7XG4gICAgQGZvciAoYmxvY2sgb2YgdGV4dEJsb2NrcygpOyB0cmFjayBibG9jay5pZCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci10ZXh0LWNoaXBcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJibG9jay5yZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImJsb2NrLnJlY3QudG9wIC0gOFwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItdGV4dC1jaGlwX19zd2F0Y2hcIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJsb2NrLnN0eWxlcy5jb2xvclwiXG4gICAgICAgID48L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IGJsb2NrLnN0eWxlcy5mb250U2l6ZSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmxpbmVIZWlnaHQgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IGJsb2NrLnN0eWxlcy5jb2xvciB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIGFsdFByZXNzZWQoKSAmJiBkaXN0YW5jZU92ZXJsYXkoKTsgYXMgZGlzdGFuY2UpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tZGlzdGFuY2VcIlxuICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UucmVjdEEubGVmdFwiXG4gICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLnJlY3RBLnRvcFwiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwiZGlzdGFuY2UucmVjdEEud2lkdGhcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkaXN0YW5jZS5yZWN0QS5oZWlnaHRcIlxuICAgID48L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tZGlzdGFuY2VcIlxuICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UucmVjdEIubGVmdFwiXG4gICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLnJlY3RCLnRvcFwiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwiZGlzdGFuY2UucmVjdEIud2lkdGhcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkaXN0YW5jZS5yZWN0Qi5oZWlnaHRcIlxuICAgID48L2Rpdj5cblxuICAgIEBmb3IgKFxuICAgICAgY29ubmVjdG9yIG9mIGRpc3RhbmNlLmNvbm5lY3RvcnM7XG4gICAgICB0cmFjayB0cmFja0Nvbm5lY3RvcigkaW5kZXgsIGNvbm5lY3RvcilcbiAgICApIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29ubmVjdG9yXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1jb25uZWN0b3ItLXZlcnRpY2FsXT1cImNvbm5lY3Rvci54MSA9PT0gY29ubmVjdG9yLngyXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1jb25uZWN0b3ItLWhvcml6b250YWxdPVwiY29ubmVjdG9yLnkxID09PSBjb25uZWN0b3IueTJcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJNYXRoLm1pbihjb25uZWN0b3IueDEsIGNvbm5lY3Rvci54MilcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIk1hdGgubWluKGNvbm5lY3Rvci55MSwgY29ubmVjdG9yLnkyKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJNYXRoLm1heCgxLCBNYXRoLmFicyhjb25uZWN0b3IueDIgLSBjb25uZWN0b3IueDEpKVwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiTWF0aC5tYXgoMSwgTWF0aC5hYnMoY29ubmVjdG9yLnkyIC0gY29ubmVjdG9yLnkxKSlcIlxuICAgICAgPjwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoZGlzdGFuY2UuaG9yaXpvbnRhbCAmJiBkaXN0YW5jZS5ob3Jpem9udGFsLnZhbHVlID4gMCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS1saW5lIGluc3BlY3Rvci1kaXN0YW5jZS1saW5lLS1ob3Jpem9udGFsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiXG4gICAgICAgICAgTWF0aC5taW4oZGlzdGFuY2UuaG9yaXpvbnRhbC54MSEsIGRpc3RhbmNlLmhvcml6b250YWwueDIhKVxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLmhvcml6b250YWwueSFcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEgLSBkaXN0YW5jZS5ob3Jpem9udGFsLngxISlcbiAgICAgICAgXCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtdGFnXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiXG4gICAgICAgICAgKGRpc3RhbmNlLmhvcml6b250YWwueDEhICsgZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEpIC8gMlxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLmhvcml6b250YWwueSEgKyAxMFwiXG4gICAgICA+XG4gICAgICAgIHt7IGZvcm1hdFZhbHVlKGRpc3RhbmNlLmhvcml6b250YWwudmFsdWUpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGRpc3RhbmNlLnZlcnRpY2FsICYmIGRpc3RhbmNlLnZlcnRpY2FsLnZhbHVlID4gMCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS1saW5lIGluc3BlY3Rvci1kaXN0YW5jZS1saW5lLS12ZXJ0aWNhbFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImRpc3RhbmNlLnZlcnRpY2FsLnghXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJNYXRoLm1pbihkaXN0YW5jZS52ZXJ0aWNhbC55MSEsIGRpc3RhbmNlLnZlcnRpY2FsLnkyISlcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIlxuICAgICAgICAgIE1hdGguYWJzKGRpc3RhbmNlLnZlcnRpY2FsLnkyISAtIGRpc3RhbmNlLnZlcnRpY2FsLnkxISlcbiAgICAgICAgXCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtdGFnIGluc3BlY3Rvci1kaXN0YW5jZS10YWctLXZlcnRpY2FsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UudmVydGljYWwueCEgKyAxMFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiKGRpc3RhbmNlLnZlcnRpY2FsLnkxISArIGRpc3RhbmNlLnZlcnRpY2FsLnkyISkgLyAyXCJcbiAgICAgID5cbiAgICAgICAge3sgZm9ybWF0VmFsdWUoZGlzdGFuY2UudmVydGljYWwudmFsdWUpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cblxuICBAaWYgKGVuYWJsZWQoKSkge1xuICAgIEBpZiAodG9vbE1vZGUoKSA9PT0gXCJndWlkZXNcIikge1xuICAgICAgQGlmIChndWlkZVByZXZpZXcoKTsgYXMgcHJldmlldykge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGUgaW5zcGVjdG9yLWd1aWRlLS1wcmV2aWV3XCJcbiAgICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS12ZXJ0aWNhbF09XCJwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAndmVydGljYWwnXCJcbiAgICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS1ob3Jpem9udGFsXT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICAgIHByZXZpZXcub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBwcmV2aWV3LnBvc2l0aW9uIDogbnVsbFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJcbiAgICAgICAgICAgIHByZXZpZXcub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IHByZXZpZXcucG9zaXRpb24gOiBudWxsXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItZ3VpZGVdPVwiZ3VpZGVDb2xvclwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1ndWlkZS1saW5lXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAZm9yIChndWlkZSBvZiBndWlkZXMoKTsgdHJhY2sgZ3VpZGUuaWQpIHtcbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1ndWlkZS0tdmVydGljYWxdPVwiZ3VpZGUub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS1ob3Jpem9udGFsXT1cImd1aWRlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS1zZWxlY3RlZF09XCJzZWxlY3RlZEd1aWRlSWQoKSA9PT0gZ3VpZGUuaWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGd1aWRlLnBvc2l0aW9uIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIlxuICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBndWlkZS5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgXCJcbiAgICAgICAgW3N0eWxlLi0taW5zcGVjdG9yLWd1aWRlXT1cImd1aWRlQ29sb3JcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgIChndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/ICdWZXJ0aWNhbCcgOiAnSG9yaXpvbnRhbCcpICtcbiAgICAgICAgICAnIGd1aWRlIGF0ICcgK1xuICAgICAgICAgIGZvcm1hdFZhbHVlKGd1aWRlLnBvc2l0aW9uKSArXG4gICAgICAgICAgJyBwaXhlbHMnXG4gICAgICAgIFwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJzdGFydEd1aWRlRHJhZygkZXZlbnQsIGd1aWRlKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIH1cbjwvZGl2PlxuIl19
1077
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BlY3Rvci1uZy9zcmMvbGliL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsR0FDcEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLG9CQUFvQixHQUNyQixNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFXaEUsT0FBTyxFQUNMLG9CQUFvQixFQUVwQiwwQkFBMEIsR0FDM0IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDcEUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1B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ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIFBMQVRGT1JNX0lELFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEdVSURFX0hJVEJPWF9TSVpFLFxuICBHVUlERV9TTkFQX0RJU1RBTkNFLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBnZXRJbnNwZWN0TWVhc3VyZW1lbnQsXG4gIGdldFJlY3RGcm9tRG9tLFxuICBnZXRUYXJnZXRFbGVtZW50LFxuICBnZXRWaXNpYmxlVGV4dEJsb2Nrcyxcbn0gZnJvbSAnLi9kb20nO1xuaW1wb3J0IHsgZ2V0RGlzdGFuY2VPdmVybGF5IH0gZnJvbSAnLi9kaXN0YW5jZXMnO1xuaW1wb3J0IHsgY2xhbXAsIGdldFZpZXdwb3J0U2l6ZSwgcmVjdHNFcXVhbCB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHtcbiAgRGlzdGFuY2VPdmVybGF5LFxuICBEaXN0YW5jZVJlbGF0aW9uLFxuICBHdWlkZSxcbiAgR3VpZGVPcmllbnRhdGlvbixcbiAgSW5zcGVjdE1lYXN1cmVtZW50LFxuICBSZWN0LFxuICBUZXh0QmxvY2tBbm5vdGF0aW9uLFxuICBUb29sTW9kZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBjaGVja3BvaW50QWN0aXZpdHlBdCxcbiAgSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCxcbiAgSW5zcGVjdG9yQ2hlY2twb2ludFNlcnZpY2UsXG59IGZyb20gJy4vY2hlY2twb2ludHMnO1xuaW1wb3J0IHsgZnV6enlDaGVja3BvaW50cyB9IGZyb20gJy4vY2hlY2twb2ludC1zZWFyY2gnO1xuaW1wb3J0IHsgY3JlYXRlSWQsIGZvcm1hdFJlbGF0aXZlVGltZSwgZm9ybWF0VmFsdWUgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IE1FQVNVUkVfQ0FURVJQSUxMQVJfU1BSSVRFX1NSQyB9IGZyb20gJy4vbWVhc3VyZS1jYXRlcnBpbGxhcic7XG5pbXBvcnQgeyBDQVRfUEVUX1NQUklURV9TUkMgfSBmcm9tICcuL3BldC1jYXQnO1xuaW1wb3J0IHsgRE9HX1BFVF9TUFJJVEVfU1JDIH0gZnJvbSAnLi9wZXQtZG9nJztcbmltcG9ydCB7IEJVTk5ZX1BFVF9TUFJJVEVfU1JDIH0gZnJvbSAnLi9wZXQtYnVubnknO1xuaW1wb3J0IHsgR0VORVJBVEVEX1BFVF9TUFJJVEVTIH0gZnJvbSAnLi9nZW5lcmF0ZWQtcGV0cyc7XG5pbXBvcnQgeyBHRU5FUkFURURfRVhUUkFfUEVUX1NQUklURVMgfSBmcm9tICcuL2dlbmVyYXRlZC1wZXRzLWV4dHJhJztcblxudHlwZSBJbnNwZWN0b3JDb21tYW5kQWN0aW9uSWQgPSAnc2VsZWN0JyB8ICd0eXBlJyB8ICdzYXZlJyB8ICdpbXBvcnQnIHwgJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJztcblxuaW50ZXJmYWNlIEluc3BlY3RvckNvbW1hbmRBY3Rpb24ge1xuICByZWFkb25seSBpZDogSW5zcGVjdG9yQ29tbWFuZEFjdGlvbklkO1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICByZWFkb25seSBhcmlhTGFiZWw6IHN0cmluZztcbiAgcmVhZG9ubHkga2V5d29yZHM6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEd1aWRlRGlzdGFuY2Uge1xuICByZWFkb25seSBvcmllbnRhdGlvbjogR3VpZGVPcmllbnRhdGlvbjtcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgZW5kOiBudW1iZXI7XG4gIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG59XG5cbmNvbnN0IElOU1BFQ1RPUl9DT01NQU5EX0FDVElPTlM6IHJlYWRvbmx5IEluc3BlY3RvckNvbW1hbmRBY3Rpb25bXSA9IFtcbiAgeyBpZDogJ3NhdmUnLCBsYWJlbDogJ1NhdmUnLCBhcmlhTGFiZWw6ICdTYXZlIGNoZWNrcG9pbnQnLCBrZXl3b3JkczogJ3NhdmUgY2hlY2twb2ludCBjYXB0dXJlIHN0YXRlJyB9LFxuICB7IGlkOiAnaW1wb3J0JywgbGFiZWw6ICdQYXN0ZScsIGFyaWFMYWJlbDogJ0ltcG9ydCBjaGVja3BvaW50IGZyb20gY2xpcGJvYXJkJywga2V5d29yZHM6ICdpbXBvcnQgcGFzdGUgbG9hZCBvcGVuIGpzb24gY2hlY2twb2ludCByZXN0b3JlIGNsaXBib2FyZCcgfSxcbiAgeyBpZDogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBhcmlhTGFiZWw6ICdUb2dnbGUgdHlwb2dyYXBoeSBvdmVybGF5Jywga2V5d29yZHM6ICd0eXBlIHR5cG9ncmFwaHkgdGV4dCBvdmVybGF5JyB9LFxuICB7IGlkOiAndmVydGljYWwnLCBsYWJlbDogJ1YnLCBhcmlhTGFiZWw6ICdWZXJ0aWNhbCBndWlkZXMnLCBrZXl3b3JkczogJ3ZlcnRpY2FsIHYgZ3VpZGUgZ3VpZGVzJyB9LFxuICB7IGlkOiAnaG9yaXpvbnRhbCcsIGxhYmVsOiAnSCcsIGFyaWFMYWJlbDogJ0hvcml6b250YWwgZ3VpZGVzJywga2V5d29yZHM6ICdob3Jpem9udGFsIGggZ3VpZGUgZ3VpZGVzJyB9LFxuICB7IGlkOiAnc2VsZWN0JywgbGFiZWw6ICdJbnNwZWN0JywgYXJpYUxhYmVsOiAnSW5zcGVjdCBtb2RlJywga2V5d29yZHM6ICdpbnNwZWN0IHNlbGVjdCBwb2ludGVyIGVsZW1lbnQgYWx0IGknIH0sXG5dO1xuXG5jb25zdCBJTlNQRUNUT1JfUEVUUyA9IFtcbiAge1xuICAgIG5hbWU6ICdNZWFzdXJpbmcgY2F0ZXJwaWxsYXInLFxuICAgIHNwcml0ZVNyYzogTUVBU1VSRV9DQVRFUlBJTExBUl9TUFJJVEVfU1JDLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ1BpeGVsIGNhdCcsXG4gICAgc3ByaXRlU3JjOiBDQVRfUEVUX1NQUklURV9TUkMsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnQ29yZ2knLFxuICAgIHNwcml0ZVNyYzogRE9HX1BFVF9TUFJJVEVfU1JDLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0J1bm55JyxcbiAgICBzcHJpdGVTcmM6IEJVTk5ZX1BFVF9TUFJJVEVfU1JDLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0ZveCcsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfUEVUX1NQUklURVMuZm94LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ1BhbmRhJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9QRVRfU1BSSVRFUy5wYW5kYSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdGcm9nJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9QRVRfU1BSSVRFUy5mcm9nLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0F4b2xvdGwnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX1BFVF9TUFJJVEVTLmF4b2xvdGwsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnUmFjY29vbicsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfUEVUX1NQUklURVMucmFjY29vbixcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdEdWNrbGluZycsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfUEVUX1NQUklURVMuZHVja2xpbmcsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnVHVydGxlJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9QRVRfU1BSSVRFUy50dXJ0bGUsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnSGVkZ2Vob2cnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX1BFVF9TUFJJVEVTLmhlZGdlaG9nLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ1JlZCBwYW5kYScsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfUEVUX1NQUklURVNbJ3JlZC1wYW5kYSddLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ1Blbmd1aW4nLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX1BFVF9TUFJJVEVTLnBlbmd1aW4sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnT3R0ZXInLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLm90dGVyLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0NhcHliYXJhJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5jYXB5YmFyYSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdTaGliYSBpbnUnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLnNoaWJhLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ01vdXNlJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5tb3VzZSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdIYW1zdGVyJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5oYW1zdGVyLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ0tvYWxhJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5rb2FsYSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdTbG90aCcsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfRVhUUkFfUEVUX1NQUklURVMuc2xvdGgsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnQmFieSBzZWFsJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5zZWFsLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ09jdG9wdXMnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLm9jdG9wdXMsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnQ3JhYicsXG4gICAgc3ByaXRlU3JjOiBHRU5FUkFURURfRVhUUkFfUEVUX1NQUklURVMuY3JhYixcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdCdW1ibGViZWUnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLmJlZSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdNb3RoJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5tb3RoLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ1RpbnkgYmF0JyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5iYXQsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnT3dsJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5vd2wsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnUGFycm90JyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5wYXJyb3QsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnQ2hhbWVsZW9uJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5jaGFtZWxlb24sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnR2Vja28nLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLmdlY2tvLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ1NuYWlsJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy5zbmFpbCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdCYWJ5IHRyaWNlcmF0b3BzJyxcbiAgICBzcHJpdGVTcmM6IEdFTkVSQVRFRF9FWFRSQV9QRVRfU1BSSVRFUy50cmljZXJhdG9wcyxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdBbHBhY2EnLFxuICAgIHNwcml0ZVNyYzogR0VORVJBVEVEX0VYVFJBX1BFVF9TUFJJVEVTLmFscGFjYSxcbiAgfSxcbl0gYXMgY29uc3Q7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2luc3BlY3Rvci1vdmVybGF5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW10sXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vaW5zcGVjdG9yLmNvbXBvbmVudC5jc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgaW5zcGVjdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgTWF0aCA9IE1hdGg7XG4gIHJlYWRvbmx5IGNoZWNrcG9pbnRBY3Rpdml0eUF0ID0gY2hlY2twb2ludEFjdGl2aXR5QXQ7XG4gIHJlYWRvbmx5IGZvcm1hdFZhbHVlID0gZm9ybWF0VmFsdWU7XG4gIHJlYWRvbmx5IGZvcm1hdFJlbGF0aXZlVGltZSA9IGZvcm1hdFJlbGF0aXZlVGltZTtcbiAgcmVhZG9ubHkgZ3VpZGVIaXRib3hTaXplID0gR1VJREVfSElUQk9YX1NJWkU7XG4gIHJlYWRvbmx5IG92ZXJsYXlSb290ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pignb3ZlcmxheVJvb3QnKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludERpYWxvZyA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaWFsb2dFbGVtZW50Pj4oJ2NoZWNrcG9pbnREaWFsb2cnKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludFNlYXJjaCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+PignY2hlY2twb2ludFNlYXJjaCcpO1xuICByZWFkb25seSBjaGVja3BvaW50UmVuYW1lID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdjaGVja3BvaW50UmVuYW1lJyk7XG5cbiAgQElucHV0KCkgaGlnaGxpZ2h0Q29sb3IgPSAnIzRmOGNmZic7XG4gIEBJbnB1dCgpIGd1aWRlQ29sb3IgPSAnI2ZmN2EwMCc7XG4gIEBJbnB1dCgpIGhvdmVySGlnaGxpZ2h0RW5hYmxlZCA9IHRydWU7XG5cbiAgcmVhZG9ubHkgY2hlY2twb2ludFNlcnZpY2UgPSBpbmplY3QoSW5zcGVjdG9yQ2hlY2twb2ludFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHJlYWRvbmx5IGNvbW1hbmRCYXJPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludFF1ZXJ5ID0gc2lnbmFsKCcnKTtcbiAgcmVhZG9ubHkgYWN0aXZlQ29tbWFuZEluZGV4ID0gc2lnbmFsKDApO1xuICByZWFkb25seSBlZGl0aW5nQ2hlY2twb2ludElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBkZWxldGluZ0NoZWNrcG9pbnRJZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgcmVuYW1lRHJhZnQgPSBzaWduYWwoJycpO1xuICByZWFkb25seSBjaGVja3BvaW50VG9hc3QgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGNoZWNrcG9pbnRUb2FzdElzRXJyb3IgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBwZXRJbmRleCA9IHNpZ25hbCgwKTtcbiAgcmVhZG9ubHkgYWN0aXZlUGV0ID0gY29tcHV0ZWQoKCkgPT4gSU5TUEVDVE9SX1BFVFNbdGhpcy5wZXRJbmRleCgpXSk7XG4gIHJlYWRvbmx5IGZpbHRlcmVkQ2hlY2twb2ludHMgPSBjb21wdXRlZCgoKSA9PlxuICAgIGZ1enp5Q2hlY2twb2ludHMoXG4gICAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5jaGVja3BvaW50cygpID8/IFtdLFxuICAgICAgdGhpcy5jaGVja3BvaW50UXVlcnkoKSxcbiAgICApLFxuICApO1xuICByZWFkb25seSBmaWx0ZXJlZEluc3BlY3RvckFjdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdGVybXMgPSB0aGlzLmNoZWNrcG9pbnRRdWVyeSgpLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmICghdGVybXMubGVuZ3RoKSByZXR1cm4gSU5TUEVDVE9SX0NPTU1BTkRfQUNUSU9OUztcbiAgICByZXR1cm4gSU5TUEVDVE9SX0NPTU1BTkRfQUNUSU9OUy5maWx0ZXIoKGFjdGlvbikgPT4ge1xuICAgICAgY29uc3Qgc2VhcmNoYWJsZVRleHQgPSBgJHthY3Rpb24ubGFiZWx9ICR7YWN0aW9uLmFyaWFMYWJlbH0gJHthY3Rpb24ua2V5d29yZHN9YC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHRlcm1zLmV2ZXJ5KCh0ZXJtKSA9PiBzZWFyY2hhYmxlVGV4dC5pbmNsdWRlcyh0ZXJtKSk7XG4gICAgfSk7XG4gIH0pO1xuICByZWFkb25seSBuYXZpZ2F0ZVRhcmdldCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LnJlc29sdmVSb3V0ZSh0aGlzLmNoZWNrcG9pbnRRdWVyeSgpKSA/PyBudWxsLFxuICApO1xuICByZWFkb25seSBhY3Rpb25JbmRleE9mZnNldCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuZmlsdGVyZWRDaGVja3BvaW50cygpLmxlbmd0aCArICh0aGlzLm5hdmlnYXRlVGFyZ2V0KCkgPyAxIDogMCksXG4gICk7XG4gIHJlYWRvbmx5IGNvbW1hbmRSZXN1bHRDb3VudCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuYWN0aW9uSW5kZXhPZmZzZXQoKSArIHRoaXMuZmlsdGVyZWRJbnNwZWN0b3JBY3Rpb25zKCkubGVuZ3RoLFxuICApO1xuICByZWFkb25seSBhY3RpdmVDb21tYW5kUmVzdWx0SWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY2hlY2twb2ludCA9IHRoaXMuZmlsdGVyZWRDaGVja3BvaW50cygpW3RoaXMuYWN0aXZlQ29tbWFuZEluZGV4KCldO1xuICAgIGlmIChjaGVja3BvaW50KSByZXR1cm4gYGluc3BlY3Rvci1jaGVja3BvaW50LSR7Y2hlY2twb2ludC5pZH1gO1xuICAgIGlmICh0aGlzLm5hdmlnYXRlVGFyZ2V0KCkgJiYgdGhpcy5hY3RpdmVDb21tYW5kSW5kZXgoKSA9PT0gdGhpcy5maWx0ZXJlZENoZWNrcG9pbnRzKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJ2luc3BlY3Rvci1uYXZpZ2F0ZSc7XG4gICAgfVxuICAgIGNvbnN0IGFjdGlvbkluZGV4ID0gdGhpcy5hY3RpdmVDb21tYW5kSW5kZXgoKSAtIHRoaXMuYWN0aW9uSW5kZXhPZmZzZXQoKTtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmZpbHRlcmVkSW5zcGVjdG9yQWN0aW9ucygpW2FjdGlvbkluZGV4XTtcbiAgICByZXR1cm4gYWN0aW9uID8gYGluc3BlY3Rvci1hY3Rpb24tJHthY3Rpb24uaWR9YCA6IG51bGw7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGVuYWJsZWQgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IHRvb2xNb2RlID0gc2lnbmFsPFRvb2xNb2RlPignbm9uZScpO1xuICByZWFkb25seSBndWlkZU9yaWVudGF0aW9uID0gc2lnbmFsPEd1aWRlT3JpZW50YXRpb24+KCd2ZXJ0aWNhbCcpO1xuICByZWFkb25seSBndWlkZXMgPSBzaWduYWw8R3VpZGVbXT4oW10pO1xuICByZWFkb25seSBndWlkZURpc3RhbmNlcyA9IGNvbXB1dGVkPEd1aWRlRGlzdGFuY2VbXT4oKCkgPT4ge1xuICAgIGNvbnN0IGRpc3RhbmNlczogR3VpZGVEaXN0YW5jZVtdID0gW107XG4gICAgY29uc3QgcHJldmlldyA9IHRoaXMuZ3VpZGVQcmV2aWV3KCk7XG4gICAgY29uc3QgdmlzaWJsZUd1aWRlcyA9IHByZXZpZXdcbiAgICAgID8gWy4uLnRoaXMuZ3VpZGVzKCksIHByZXZpZXddXG4gICAgICA6IHRoaXMuZ3VpZGVzKCk7XG5cbiAgICBmb3IgKGNvbnN0IG9yaWVudGF0aW9uIG9mIFsndmVydGljYWwnLCAnaG9yaXpvbnRhbCddIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBwb3NpdGlvbnMgPSB2aXNpYmxlR3VpZGVzXG4gICAgICAgIC5maWx0ZXIoKGd1aWRlKSA9PiBndWlkZS5vcmllbnRhdGlvbiA9PT0gb3JpZW50YXRpb24pXG4gICAgICAgIC5tYXAoKGd1aWRlKSA9PiBndWlkZS5wb3NpdGlvbilcbiAgICAgICAgLmZpbHRlcigocG9zaXRpb24sIGluZGV4LCBhbGxQb3NpdGlvbnMpID0+XG4gICAgICAgICAgYWxsUG9zaXRpb25zLmluZGV4T2YocG9zaXRpb24pID09PSBpbmRleFxuICAgICAgICApXG4gICAgICAgIC5zb3J0KChwb3NpdGlvbkEsIHBvc2l0aW9uQikgPT4gcG9zaXRpb25BIC0gcG9zaXRpb25CKTtcblxuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHBvc2l0aW9ucy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwb3NpdGlvbnNbaW5kZXggLSAxXTtcbiAgICAgICAgY29uc3QgZW5kID0gcG9zaXRpb25zW2luZGV4XTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlbmQgLSBzdGFydDtcbiAgICAgICAgaWYgKHZhbHVlID4gMC41KSB7XG4gICAgICAgICAgZGlzdGFuY2VzLnB1c2goeyBvcmllbnRhdGlvbiwgc3RhcnQsIGVuZCwgdmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGlzdGFuY2VzO1xuICB9KTtcbiAgcmVhZG9ubHkgaG92ZXJSZWN0ID0gc2lnbmFsPFJlY3QgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRHdWlkZUlkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzZWxlY3RlZE1lYXN1cmVtZW50ID0gc2lnbmFsPEluc3BlY3RNZWFzdXJlbWVudCB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzaG93VHlwb2dyYXBoeSA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGFsdFByZXNzZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBkaXN0YW5jZU92ZXJsYXkgPSBzaWduYWw8RGlzdGFuY2VPdmVybGF5IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHRleHRCbG9ja3MgPSBzaWduYWw8VGV4dEJsb2NrQW5ub3RhdGlvbltdPihbXSk7XG4gIHJlYWRvbmx5IGd1aWRlUHJldmlldyA9IHNpZ25hbDxHdWlkZSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkTWV0YUxpbmUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQoKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBgJHtzZWxlY3RlZC5sYWJlbH0gwrcgJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5yZWN0LndpZHRoKX0geCAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLnJlY3QuaGVpZ2h0KX0gwrcgJHtzZWxlY3RlZC5zdHlsZXMuZm9udFNpemV9IC8gJHtzZWxlY3RlZC5zdHlsZXMubGluZUhlaWdodH0gLyAke3NlbGVjdGVkLnN0eWxlcy5jb2xvcn1gO1xuICB9KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlzQnJvd3NlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVDYXB0dXJlZENsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKFxuICAgICAgIWV2ZW50LnNoaWZ0S2V5IHx8XG4gICAgICAhdGhpcy5jYW5JbnNwZWN0Q2xpY2soZXZlbnQpIHx8XG4gICAgICAhdGhpcy5zZWxlY3RFbGVtZW50QXRQb2ludChldmVudClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9O1xuICBwcml2YXRlIGRyYWdnaW5nR3VpZGVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VsZWN0ZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBoYXNTZWxlY3RlZFBldCA9IGZhbHNlO1xuICBwcml2YXRlIHRvYXN0VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogb2JqZWN0KSB7XG4gICAgdGhpcy5pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQoKSkgcmV0dXJuO1xuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmNoZWNrcG9pbnRSZW5hbWUoKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlucHV0Py5mb2N1cygpO1xuICAgICAgaW5wdXQ/LnNlbGVjdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3NlcikgcmV0dXJuO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDYXB0dXJlZENsaWNrLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2FwdHVyZWRDbGljaywge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAodGhpcy50b2FzdFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy50b2FzdFRpbWVyKTtcbiAgfVxuXG4gIHNldFRvb2xNb2RlKG1vZGU6IFRvb2xNb2RlKSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5lbmFibGVkLnNldCh0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLnRvb2xNb2RlLnNldCh0aGlzLnRvb2xNb2RlKCkgPT09IG1vZGUgPyAnbm9uZScgOiBtb2RlKTtcbiAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBzZXRHdWlkZU9yaWVudGF0aW9uKG9yaWVudGF0aW9uOiBHdWlkZU9yaWVudGF0aW9uKSB7XG4gICAgdGhpcy5ndWlkZU9yaWVudGF0aW9uLnNldChvcmllbnRhdGlvbik7XG4gICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICB9XG5cbiAgYWN0aXZhdGVHdWlkZU9yaWVudGF0aW9uKG9yaWVudGF0aW9uOiBHdWlkZU9yaWVudGF0aW9uKSB7XG4gICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLnRvb2xNb2RlKCkgPT09ICdndWlkZXMnICYmIHRoaXMuZ3VpZGVPcmllbnRhdGlvbigpID09PSBvcmllbnRhdGlvbjtcbiAgICB0aGlzLnNldEd1aWRlT3JpZW50YXRpb24ob3JpZW50YXRpb24pO1xuICAgIGlmIChpc0FjdGl2ZSB8fCB0aGlzLnRvb2xNb2RlKCkgIT09ICdndWlkZXMnKSB7XG4gICAgICB0aGlzLnNldFRvb2xNb2RlKCdndWlkZXMnKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVUeXBvZ3JhcGh5KCkge1xuICAgIHRoaXMuc2hvd1R5cG9ncmFwaHkudXBkYXRlKCh2YWx1ZSkgPT4gIXZhbHVlKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBkaXNhYmxlSW5zcGVjdG9yKCkge1xuICAgIHRoaXMuc2V0SW5zcGVjdG9yRW5hYmxlZChmYWxzZSk7XG4gIH1cblxuICBhc3luYyBzYXZlQ2hlY2twb2ludCgpIHtcbiAgICBjb25zdCBjaGVja3BvaW50ID0gYXdhaXQgdGhpcy5jaGVja3BvaW50U2VydmljZT8uc2F2ZSgpO1xuICAgIGlmIChjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNob3dDaGVja3BvaW50VG9hc3QoYFNhdmVkIOKAnCR7Y2hlY2twb2ludC5uYW1lfeKAnS5gKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmVycm9yKCkpIHtcbiAgICAgIHRoaXMuc2hvd0NoZWNrcG9pbnRUb2FzdCh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlLmVycm9yKCkhLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBkb3dubG9hZENoZWNrcG9pbnQoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCwgZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSByZXR1cm47XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShjaGVja3BvaW50LCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgY29uc3QgYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGFuY2hvci5ocmVmID0gdXJsO1xuICAgIGFuY2hvci5kb3dubG9hZCA9IHRoaXMuY2hlY2twb2ludEZpbGVOYW1lKGNoZWNrcG9pbnQpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYW5jaG9yKTtcbiAgICBhbmNob3IuY2xpY2soKTtcbiAgICBhbmNob3IucmVtb3ZlKCk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIHRoaXMuc2hvd0NoZWNrcG9pbnRUb2FzdChgRXhwb3J0ZWQg4oCcJHtjaGVja3BvaW50Lm5hbWV94oCdLmApO1xuICB9XG5cbiAgYXN5bmMgYmVnaW5JbXBvcnQoKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlIHx8IHRoaXMuY2hlY2twb2ludFNlcnZpY2UuYnVzeSgpKSByZXR1cm47XG5cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICB0ZXh0ID0gYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5zaG93Q2hlY2twb2ludFRvYXN0KCdDb3VsZCBub3QgcmVhZCBjbGlwYm9hcmQuJywgdHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuc2hvd0NoZWNrcG9pbnRUb2FzdCgnVGhlIGNsaXBib2FyZCBkb2VzIG5vdCBjb250YWluIHZhbGlkIEpTT04uJywgdHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2twb2ludCA9IGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2UuaW1wb3J0Q2hlY2twb2ludChwYXJzZWQpO1xuICAgIGlmIChjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNob3dDaGVja3BvaW50VG9hc3QoYEltcG9ydGVkIOKAnCR7Y2hlY2twb2ludC5uYW1lfeKAnS5gKTtcbiAgICAgIGlmICh0aGlzLmNvbW1hbmRCYXJPcGVuKCkpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbHRlcmVkSW5zcGVjdG9yQWN0aW9ucygpLmZpbmRJbmRleCgoeyBpZCB9KSA9PiBpZCA9PT0gJ2ltcG9ydCcpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkgdGhpcy5zZXRBY3RpdmVJbnNwZWN0b3JBY3Rpb24oaW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja3BvaW50U2VydmljZS5lcnJvcigpKSB7XG4gICAgICB0aGlzLnNob3dDaGVja3BvaW50VG9hc3QodGhpcy5jaGVja3BvaW50U2VydmljZS5lcnJvcigpISwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3BlbkNoZWNrcG9pbnRDb21tYW5kQmFyKCkge1xuICAgIGlmICghdGhpcy5jaGVja3BvaW50U2VydmljZSB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgdGhpcy5jb21tYW5kQmFyT3BlbigpKSByZXR1cm47XG4gICAgdGhpcy5yYW5kb21pemVQZXQoKTtcbiAgICB0aGlzLmNvbW1hbmRCYXJPcGVuLnNldCh0cnVlKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRRdWVyeS5zZXQoJycpO1xuICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldCgwKTtcbiAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMuY2hlY2twb2ludFNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIHRoaXMuY2hlY2twb2ludERpYWxvZygpPy5uYXRpdmVFbGVtZW50LnNob3dNb2RhbCgpO1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuY2hlY2twb2ludFNlYXJjaCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCkpO1xuICAgIGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2UubG9hZCgpO1xuICAgIHRoaXMuY2xhbXBBY3RpdmVDb21tYW5kKCk7XG4gIH1cblxuICBjbG9zZUNoZWNrcG9pbnRDb21tYW5kQmFyKCkge1xuICAgIGlmICh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5idXN5KCkpIHJldHVybjtcbiAgICB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudC5jbG9zZSgpO1xuICAgIHRoaXMuY29tbWFuZEJhck9wZW4uc2V0KGZhbHNlKTtcbiAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICB9XG5cbiAgdXBkYXRlQ2hlY2twb2ludFF1ZXJ5KGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuY2hlY2twb2ludFF1ZXJ5LnNldCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcbiAgICB0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleC5zZXQoMCk7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5jbGVhckVycm9yKCk7XG4gIH1cblxuICBjeWNsZVBldChldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmFuZG9taXplUGV0KCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIHNldEFjdGl2ZUNoZWNrcG9pbnQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldChpbmRleCk7XG4gIH1cblxuICBzZXRBY3RpdmVJbnNwZWN0b3JBY3Rpb24oaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldCh0aGlzLmFjdGlvbkluZGV4T2Zmc2V0KCkgKyBpbmRleCk7XG4gIH1cblxuICBhc3luYyBleGVjdXRlSW5zcGVjdG9yQWN0aW9uKGFjdGlvbjogSW5zcGVjdG9yQ29tbWFuZEFjdGlvbikge1xuICAgIGlmICh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5idXN5KCkpIHJldHVybjtcbiAgICBzd2l0Y2ggKGFjdGlvbi5pZCkge1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgdGhpcy5zZXRUb29sTW9kZSgnc2VsZWN0Jyk7XG4gICAgICAgIHRoaXMuY2xvc2VDaGVja3BvaW50Q29tbWFuZEJhcigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICB0aGlzLnRvZ2dsZVR5cG9ncmFwaHkoKTtcbiAgICAgICAgdGhpcy5jbG9zZUNoZWNrcG9pbnRDb21tYW5kQmFyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2F2ZSc6XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZUNoZWNrcG9pbnQoKTtcbiAgICAgICAgaWYgKHRoaXMuY29tbWFuZEJhck9wZW4oKSkge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maWx0ZXJlZEluc3BlY3RvckFjdGlvbnMoKS5maW5kSW5kZXgoKHsgaWQgfSkgPT4gaWQgPT09IGFjdGlvbi5pZCk7XG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHRoaXMuc2V0QWN0aXZlSW5zcGVjdG9yQWN0aW9uKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ltcG9ydCc6XG4gICAgICAgIGF3YWl0IHRoaXMuYmVnaW5JbXBvcnQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICAgIHRoaXMuYWN0aXZhdGVHdWlkZU9yaWVudGF0aW9uKCd2ZXJ0aWNhbCcpO1xuICAgICAgICB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdob3Jpem9udGFsJzpcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUd1aWRlT3JpZW50YXRpb24oJ2hvcml6b250YWwnKTtcbiAgICAgICAgdGhpcy5jbG9zZUNoZWNrcG9pbnRDb21tYW5kQmFyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmVDaGVja3BvaW50KGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQpIHtcbiAgICBpZiAoIXRoaXMuY2hlY2twb2ludFNlcnZpY2UgfHwgdGhpcy5jaGVja3BvaW50U2VydmljZS5idXN5KCkpIHJldHVybjtcbiAgICBjb25zdCByZXN0b3JlZCA9IGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2UucmVzdG9yZShjaGVja3BvaW50LmlkKTtcbiAgICBpZiAoIXJlc3RvcmVkKSByZXR1cm47XG4gICAgdGhpcy5jaGVja3BvaW50RGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICB0aGlzLmNvbW1hbmRCYXJPcGVuLnNldChmYWxzZSk7XG4gICAgdGhpcy5zaG93Q2hlY2twb2ludFRvYXN0KGBSZXN0b3JlZCDigJwke2NoZWNrcG9pbnQubmFtZX3igJ0uYCk7XG4gIH1cblxuICBhY3RpdmF0ZUNoZWNrcG9pbnQoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCwgZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZCgpID09PSBjaGVja3BvaW50LmlkIHx8XG4gICAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQoKSA9PT0gY2hlY2twb2ludC5pZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQ/LnNoaWZ0S2V5KSB7XG4gICAgICB2b2lkIHRoaXMubmF2aWdhdGVUb0NoZWNrcG9pbnQoY2hlY2twb2ludCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZvaWQgdGhpcy5yZXN0b3JlQ2hlY2twb2ludChjaGVja3BvaW50KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuYXZpZ2F0ZVRvQ2hlY2twb2ludChjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlIHx8IHRoaXMuY2hlY2twb2ludFNlcnZpY2UuYnVzeSgpKSByZXR1cm47XG4gICAgaWYgKCFhd2FpdCB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlLm5hdmlnYXRlVG9Sb3V0ZShjaGVja3BvaW50LnJvdXRlKSkgcmV0dXJuO1xuICAgIHRoaXMuY2hlY2twb2ludERpYWxvZygpPy5uYXRpdmVFbGVtZW50LmNsb3NlKCk7XG4gICAgdGhpcy5jb21tYW5kQmFyT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuc2hvd0NoZWNrcG9pbnRUb2FzdChgTmF2aWdhdGVkIHRvIOKAnCR7Y2hlY2twb2ludC5yb3V0ZX3igJ0g4oCUIHN0YXRlIHVuY2hhbmdlZC5gKTtcbiAgfVxuXG4gIGFzeW5jIG5hdmlnYXRlVG9RdWVyeVJvdXRlKCkge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMubmF2aWdhdGVUYXJnZXQoKTtcbiAgICBpZiAoIXRoaXMuY2hlY2twb2ludFNlcnZpY2UgfHwgIXRhcmdldCB8fCB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlLmJ1c3koKSkgcmV0dXJuO1xuICAgIGlmICghYXdhaXQgdGhpcy5jaGVja3BvaW50U2VydmljZS5uYXZpZ2F0ZVRvUm91dGUodGFyZ2V0KSkgcmV0dXJuO1xuICAgIHRoaXMuY2hlY2twb2ludERpYWxvZygpPy5uYXRpdmVFbGVtZW50LmNsb3NlKCk7XG4gICAgdGhpcy5jb21tYW5kQmFyT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuc2hvd0NoZWNrcG9pbnRUb2FzdChgTmF2aWdhdGVkIHRvIOKAnCR7dGFyZ2V0feKAnSDigJQgc3RhdGUgdW5jaGFuZ2VkLmApO1xuICB9XG5cbiAgYmVnaW5SZW5hbWUoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCwgZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jaGVja3BvaW50U2VydmljZT8uYnVzeSgpKSByZXR1cm47XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChjaGVja3BvaW50LmlkKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLnJlbmFtZURyYWZ0LnNldChjaGVja3BvaW50Lm5hbWUpO1xuICB9XG5cbiAgdXBkYXRlUmVuYW1lRHJhZnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5yZW5hbWVEcmFmdC5zZXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VydmljZT8uY2xlYXJFcnJvcigpO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoUmVuYW1lKGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQpIHtcbiAgICBpZiAoYXdhaXQgdGhpcy5jaGVja3BvaW50U2VydmljZT8ucmVuYW1lKGNoZWNrcG9pbnQuaWQsIHRoaXMucmVuYW1lRHJhZnQoKSkpIHtcbiAgICAgIHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIGNhbmNlbFJlbmFtZSgpIHtcbiAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgYmVnaW5EZWxldGUoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCwgZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jaGVja3BvaW50U2VydmljZT8uYnVzeSgpKSByZXR1cm47XG4gICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZC5zZXQoY2hlY2twb2ludC5pZCk7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgfVxuXG4gIGNhbmNlbERlbGV0ZShldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMuY2hlY2twb2ludFNlYXJjaCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBhc3luYyBjb25maXJtRGVsZXRlKGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQsIGV2ZW50PzogRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5kZWxldGUoY2hlY2twb2ludC5pZCkpIHJldHVybjtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNsYW1wQWN0aXZlQ29tbWFuZCgpO1xuICAgIHRoaXMuY2hlY2twb2ludFNlYXJjaCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBoYW5kbGVDaGVja3BvaW50RGlhbG9nQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoXG4gICAgICBldmVudC50YXJnZXQgPT09IHRoaXMuY2hlY2twb2ludERpYWxvZygpPy5uYXRpdmVFbGVtZW50ICYmXG4gICAgICAhdGhpcy5jaGVja3BvaW50U2VydmljZT8uYnVzeSgpICYmXG4gICAgICAhdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZCgpXG4gICAgKSB7XG4gICAgICB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckd1aWRlcygpIHtcbiAgICB0aGlzLmd1aWRlcy5zZXQoW10pO1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgfVxuXG4gIHRyYWNrR3VpZGUgPSAoX2luZGV4OiBudW1iZXIsIGd1aWRlOiBHdWlkZSkgPT4gZ3VpZGUuaWQ7XG4gIHRyYWNrVGV4dEJsb2NrID0gKF9pbmRleDogbnVtYmVyLCBibG9jazogVGV4dEJsb2NrQW5ub3RhdGlvbikgPT4gYmxvY2suaWQ7XG4gIHRyYWNrQ29ubmVjdG9yID0gKFxuICAgIF9pbmRleDogbnVtYmVyLFxuICAgIGNvbm5lY3RvcjogRGlzdGFuY2VPdmVybGF5Wydjb25uZWN0b3JzJ11bbnVtYmVyXSxcbiAgKSA9PiBgJHtjb25uZWN0b3IueDF9OiR7Y29ubmVjdG9yLnkxfToke2Nvbm5lY3Rvci54Mn06JHtjb25uZWN0b3IueTJ9YDtcblxuICBzdGFydEd1aWRlRHJhZyhldmVudDogUG9pbnRlckV2ZW50LCBndWlkZTogR3VpZGUpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gZ3VpZGUuaWQ7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KGd1aWRlLmlkKTtcbiAgfVxuXG4gIGZvcm1hdEVkZ2VzKGVkZ2VzOiBJbnNwZWN0TWVhc3VyZW1lbnRbJ3BhZGRpbmcnXSkge1xuICAgIGNvbnN0IHRvcCA9IFN0cmluZyhmb3JtYXRWYWx1ZShlZGdlcy50b3ApKTtcbiAgICBjb25zdCByaWdodCA9IFN0cmluZyhmb3JtYXRWYWx1ZShlZGdlcy5yaWdodCkpO1xuICAgIGNvbnN0IGJvdHRvbSA9IFN0cmluZyhmb3JtYXRWYWx1ZShlZGdlcy5ib3R0b20pKTtcbiAgICBjb25zdCBsZWZ0ID0gU3RyaW5nKGZvcm1hdFZhbHVlKGVkZ2VzLmxlZnQpKTtcbiAgICBpZiAodG9wID09PSByaWdodCAmJiB0b3AgPT09IGJvdHRvbSAmJiB0b3AgPT09IGxlZnQpIHJldHVybiB0b3A7XG4gICAgaWYgKHRvcCA9PT0gYm90dG9tICYmIHJpZ2h0ID09PSBsZWZ0KSByZXR1cm4gYCR7dG9wfSAke3JpZ2h0fWA7XG4gICAgaWYgKHJpZ2h0ID09PSBsZWZ0KSByZXR1cm4gYCR7dG9wfSAke3JpZ2h0fSAke2JvdHRvbX1gO1xuICAgIHJldHVybiBgJHt0b3B9ICR7cmlnaHR9ICR7Ym90dG9tfSAke2xlZnR9YDtcbiAgfVxuXG4gIGZvcm1hdEdhcChzZWxlY3RlZDogSW5zcGVjdE1lYXN1cmVtZW50KSB7XG4gICAgcmV0dXJuIGAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLmdhcC5yb3cpfSAvICR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQuZ2FwLmNvbHVtbil9YDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGVja3BvaW50U2VydmljZSAmJlxuICAgICAgIWV2ZW50LnJlcGVhdCAmJlxuICAgICAgZXZlbnQuYWx0S2V5ICYmXG4gICAgICAhZXZlbnQuY3RybEtleSAmJlxuICAgICAgIWV2ZW50Lm1ldGFLZXkgJiZcbiAgICAgICFldmVudC5zaGlmdEtleSAmJlxuICAgICAga2V5ID09PSAncCdcbiAgICApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNvbW1hbmRCYXJPcGVuKCkgPyB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKSA6IHZvaWQgdGhpcy5vcGVuQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhZXZlbnQucmVwZWF0ICYmXG4gICAgICBldmVudC5hbHRLZXkgJiZcbiAgICAgICFldmVudC5jdHJsS2V5ICYmXG4gICAgICAhZXZlbnQubWV0YUtleSAmJlxuICAgICAgIWV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICBrZXkgPT09ICdpJ1xuICAgICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0VG9vbE1vZGUoJ3NlbGVjdCcpO1xuICAgICAgaWYgKHRoaXMuY29tbWFuZEJhck9wZW4oKSkgdGhpcy5jbG9zZUNoZWNrcG9pbnRDb21tYW5kQmFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGVja3BvaW50U2VydmljZSAmJlxuICAgICAgIWV2ZW50LnJlcGVhdCAmJlxuICAgICAgZXZlbnQuYWx0S2V5ICYmXG4gICAgICAhZXZlbnQuY3RybEtleSAmJlxuICAgICAgIWV2ZW50Lm1ldGFLZXkgJiZcbiAgICAgICFldmVudC5zaGlmdEtleSAmJlxuICAgICAga2V5ID09PSAncydcbiAgICApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2b2lkIHRoaXMuc2F2ZUNoZWNrcG9pbnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb21tYW5kQmFyT3BlbigpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbW1hbmRCYXJLZXlkb3duKGV2ZW50LCBrZXkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0FsdCcgJiZcbiAgICAgIHRoaXMuZW5hYmxlZCgpICYmXG4gICAgICB0aGlzLnRvb2xNb2RlKCkgPT09ICdzZWxlY3QnXG4gICAgKSB7XG4gICAgICB0aGlzLmFsdFByZXNzZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnZXNjYXBlJyAmJiB0aGlzLmhhc0luc3BlY3RvckNhbnZhc1N0YXRlKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNsZWFySW5zcGVjdG9yQ2FudmFzKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5dXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQWx0Jykge1xuICAgICAgdGhpcy5hbHRQcmVzc2VkLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNJbnNwZWN0b3JDYW52YXNTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ndWlkZXMoKS5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQoKSAhPT0gbnVsbCB8fFxuICAgICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSAhPT0gbnVsbCB8fFxuICAgICAgdGhpcy5ob3ZlclJlY3QoKSAhPT0gbnVsbCB8fFxuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkoKSAhPT0gbnVsbCB8fFxuICAgICAgdGhpcy5hbHRQcmVzc2VkKCkgfHxcbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3KCkgIT09IG51bGwgfHxcbiAgICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckluc3BlY3RvckNhbnZhcygpIHtcbiAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KG51bGwpO1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQoZmFsc2UpO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLmhvdmVyRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gbnVsbDtcbiAgICB0aGlzLmNsZWFyR3VpZGVzKCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJtb3ZlJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlUG9pbnRlck1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgICAgdGhpcy5ndWlkZXMuc2V0KFxuICAgICAgICB0aGlzLmd1aWRlcygpLm1hcCgoZ3VpZGUpID0+IHtcbiAgICAgICAgICBpZiAoZ3VpZGUuaWQgIT09IHRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3VpZGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJhd1Bvc2l0aW9uID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgICAgICAgY29uc3QgbWF4ID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gdmlld3BvcnQud2lkdGggOiB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uZ3VpZGUsIHBvc2l0aW9uOiBjbGFtcChyYXdQb3NpdGlvbiwgMCwgbWF4KSB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpID8/XG4gICAgICAgIGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldCh0aGlzLmdldEd1aWRlUHJldmlldyhldmVudCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgIT09ICdzZWxlY3QnIHx8ICF0aGlzLmhvdmVySGlnaGxpZ2h0RW5hYmxlZCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLmFsdFByZXNzZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGwsXG4gICAgKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSBnZXRSZWN0RnJvbURvbSh0YXJnZXQpO1xuICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gdGFyZ2V0O1xuICAgIGlmICghcmVjdHNFcXVhbChyZWN0LCB0aGlzLmhvdmVyUmVjdCgpKSkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KHJlY3QpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJ1cCcpXG4gIGhhbmRsZVBvaW50ZXJVcCgpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gbnVsbDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpjbGljaycsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGw7XG5cbiAgICBpZiAodGhpcy50b29sTW9kZSgpID09PSAnZ3VpZGVzJykge1xuICAgICAgaWYgKG92ZXJsYXkgJiYgb3ZlcmxheS5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3VpZGUgPSB0aGlzLmdldEd1aWRlUHJldmlldyhldmVudCk7XG4gICAgICB0aGlzLmFkZEd1aWRlKHsgLi4uZ3VpZGUsIGlkOiBjcmVhdGVJZCgpIH0pO1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KGd1aWRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2FuSW5zcGVjdENsaWNrKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBoYW5kbGVWaWV3cG9ydENoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQgJiYgZG9jdW1lbnQuY29udGFpbnModGhpcy5zZWxlY3RlZEVsZW1lbnQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCkpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuSW5zcGVjdENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgdGhpcy50b29sTW9kZSgpICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgICByZXR1cm4gIShvdmVybGF5ICYmIG92ZXJsYXkuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SW5zcGVjdG9yRW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5lbmFibGVkLnNldChlbmFibGVkKTtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHRoaXMudG9vbE1vZGUuc2V0KCdub25lJyk7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgdGhpcy50ZXh0QmxvY2tzLnNldChbXSk7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICB0aGlzLmFsdFByZXNzZWQuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDb21tYW5kQmFyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjaGVja3BvaW50cyA9IHRoaXMuZmlsdGVyZWRDaGVja3BvaW50cygpO1xuICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmZpbHRlcmVkSW5zcGVjdG9yQWN0aW9ucygpO1xuICAgIGNvbnN0IG5hdmlnYXRlSW5kZXggPSBjaGVja3BvaW50cy5sZW5ndGg7XG4gICAgY29uc3QgaGFzTmF2aWdhdGVSb3cgPSB0aGlzLm5hdmlnYXRlVGFyZ2V0KCkgIT09IG51bGw7XG4gICAgY29uc3QgYWN0aXZlQ2hlY2twb2ludCA9IGNoZWNrcG9pbnRzW3RoaXMuYWN0aXZlQ29tbWFuZEluZGV4KCldO1xuICAgIGNvbnN0IGFjdGl2ZU5hdmlnYXRlUm93ID0gaGFzTmF2aWdhdGVSb3cgJiYgdGhpcy5hY3RpdmVDb21tYW5kSW5kZXgoKSA9PT0gbmF2aWdhdGVJbmRleDtcbiAgICBjb25zdCBhY3Rpb25PZmZzZXQgPSBuYXZpZ2F0ZUluZGV4ICsgKGhhc05hdmlnYXRlUm93ID8gMSA6IDApO1xuICAgIGNvbnN0IGFjdGl2ZUFjdGlvbkluZGV4ID0gdGhpcy5hY3RpdmVDb21tYW5kSW5kZXgoKSAtIGFjdGlvbk9mZnNldDtcbiAgICBjb25zdCBhY3RpdmVBY3Rpb24gPSBhY3Rpb25zW2FjdGl2ZUFjdGlvbkluZGV4XTtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IGlzUmVuYW1lSW5wdXQgPSB0YXJnZXQ/LmNsYXNzTGlzdD8uY29udGFpbnMoJ2luc3BlY3Rvci1jb21tYW5kLXJvd19fcmVuYW1lJykgPz8gZmFsc2U7XG5cbiAgICBpZiAoa2V5ID09PSAnZXNjYXBlJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmICh0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQoKSkgdGhpcy5jYW5jZWxSZW5hbWUoKTtcbiAgICAgIGVsc2UgaWYgKHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQoKSkgdGhpcy5jYW5jZWxEZWxldGUoKTtcbiAgICAgIGVsc2UgdGhpcy5jbG9zZUNoZWNrcG9pbnRDb21tYW5kQmFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5idXN5KCkpIHJldHVybjtcbiAgICBjb25zdCBlZGl0aW5nQ2hlY2twb2ludCA9IGNoZWNrcG9pbnRzLmZpbmQoKHsgaWQgfSkgPT4gaWQgPT09IHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZCgpKTtcbiAgICBpZiAoaXNSZW5hbWVJbnB1dCAmJiBrZXkgPT09ICdlbnRlcicgJiYgZWRpdGluZ0NoZWNrcG9pbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2b2lkIHRoaXMuZmluaXNoUmVuYW1lKGVkaXRpbmdDaGVja3BvaW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzUmVuYW1lSW5wdXQpIHJldHVybjtcbiAgICBpZiAoa2V5ID09PSAnZjInICYmIGFjdGl2ZUNoZWNrcG9pbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmJlZ2luUmVuYW1lKGFjdGl2ZUNoZWNrcG9pbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSAnZGVsZXRlJyAmJiBhY3RpdmVDaGVja3BvaW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdm9pZCB0aGlzLmNvbmZpcm1EZWxldGUoYWN0aXZlQ2hlY2twb2ludCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdhcnJvd2Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGFjdGl2ZUFjdGlvbiAmJiBjaGVja3BvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVDb21tYW5kSW5kZXguc2V0KDApO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmVDaGVja3BvaW50KSB7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4KCkgPCBjaGVja3BvaW50cy5sZW5ndGggLSAxXG4gICAgICAgICAgPyB0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleCgpICsgMVxuICAgICAgICAgIDogaGFzTmF2aWdhdGVSb3dcbiAgICAgICAgICAgID8gbmF2aWdhdGVJbmRleFxuICAgICAgICAgICAgOiBhY3Rpb25zLmxlbmd0aCA/IGFjdGlvbk9mZnNldCA6IHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4KCk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmVOYXZpZ2F0ZVJvdyAmJiBhY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleC5zZXQoYWN0aW9uT2Zmc2V0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2Nyb2xsQWN0aXZlQ29tbWFuZEludG9WaWV3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdhcnJvd3VwJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChhY3RpdmVBY3Rpb24gJiYgY2hlY2twb2ludHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldChjaGVja3BvaW50cy5sZW5ndGggLSAxKTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlTmF2aWdhdGVSb3cgJiYgY2hlY2twb2ludHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldChjaGVja3BvaW50cy5sZW5ndGggLSAxKTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlQ2hlY2twb2ludCkge1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleCgpID4gMFxuICAgICAgICAgID8gdGhpcy5hY3RpdmVDb21tYW5kSW5kZXgoKSAtIDFcbiAgICAgICAgICA6IGFjdGlvbnMubGVuZ3RoXG4gICAgICAgICAgICA/IGFjdGlvbk9mZnNldCArIGFjdGlvbnMubGVuZ3RoIC0gMVxuICAgICAgICAgICAgOiBoYXNOYXZpZ2F0ZVJvdyA/IG5hdmlnYXRlSW5kZXggOiAwO1xuICAgICAgICB0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2Nyb2xsQWN0aXZlQ29tbWFuZEludG9WaWV3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdhcnJvd3JpZ2h0JyAmJiAoYWN0aXZlQ2hlY2twb2ludCB8fCBhY3RpdmVOYXZpZ2F0ZVJvdyB8fCBhY3RpdmVBY3Rpb24pICYmIGFjdGlvbnMubGVuZ3RoKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgbmV4dEFjdGlvbkluZGV4ID0gYWN0aXZlQWN0aW9uXG4gICAgICAgID8gTWF0aC5taW4oYWN0aXZlQWN0aW9uSW5kZXggKyAxLCBhY3Rpb25zLmxlbmd0aCAtIDEpXG4gICAgICAgIDogMDtcbiAgICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldChhY3Rpb25PZmZzZXQgKyBuZXh0QWN0aW9uSW5kZXgpO1xuICAgICAgdGhpcy5zY3JvbGxBY3RpdmVDb21tYW5kSW50b1ZpZXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ2Fycm93bGVmdCcgJiYgKGFjdGl2ZUNoZWNrcG9pbnQgfHwgYWN0aXZlTmF2aWdhdGVSb3cgfHwgYWN0aXZlQWN0aW9uKSAmJiBhY3Rpb25zLmxlbmd0aCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IG5leHRBY3Rpb25JbmRleCA9IGFjdGl2ZUFjdGlvblxuICAgICAgICA/IChhY3RpdmVBY3Rpb25JbmRleCAtIDEgKyBhY3Rpb25zLmxlbmd0aCkgJSBhY3Rpb25zLmxlbmd0aFxuICAgICAgICA6IGFjdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgIHRoaXMuYWN0aXZlQ29tbWFuZEluZGV4LnNldChhY3Rpb25PZmZzZXQgKyBuZXh0QWN0aW9uSW5kZXgpO1xuICAgICAgdGhpcy5zY3JvbGxBY3RpdmVDb21tYW5kSW50b1ZpZXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ2VudGVyJyAmJiBldmVudC5zaGlmdEtleSAmJiBhY3RpdmVDaGVja3BvaW50ICYmICF0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2b2lkIHRoaXMubmF2aWdhdGVUb0NoZWNrcG9pbnQoYWN0aXZlQ2hlY2twb2ludCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdlbnRlcicgJiYgYWN0aXZlTmF2aWdhdGVSb3cpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2b2lkIHRoaXMubmF2aWdhdGVUb1F1ZXJ5Um91dGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ2VudGVyJyAmJiBhY3RpdmVDaGVja3BvaW50ICYmICF0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2b2lkIHRoaXMucmVzdG9yZUNoZWNrcG9pbnQoYWN0aXZlQ2hlY2twb2ludCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdlbnRlcicgJiYgYWN0aXZlQWN0aW9uKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdm9pZCB0aGlzLmV4ZWN1dGVJbnNwZWN0b3JBY3Rpb24oYWN0aXZlQWN0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsYW1wQWN0aXZlQ29tbWFuZCgpIHtcbiAgICB0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleC5zZXQoXG4gICAgICBNYXRoLm1pbih0aGlzLmFjdGl2ZUNvbW1hbmRJbmRleCgpLCBNYXRoLm1heCgwLCB0aGlzLmNvbW1hbmRSZXN1bHRDb3VudCgpIC0gMSkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbEFjdGl2ZUNvbW1hbmRJbnRvVmlldygpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCByb3cgPSB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgYFtkYXRhLWNvbW1hbmQtaW5kZXg9XCIke3RoaXMuYWN0aXZlQ29tbWFuZEluZGV4KCl9XCJdYCxcbiAgICAgICk7XG4gICAgICByb3c/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0NoZWNrcG9pbnRUb2FzdChtZXNzYWdlOiBzdHJpbmcsIGlzRXJyb3IgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnRvYXN0VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0VGltZXIpO1xuICAgIHRoaXMuY2hlY2twb2ludFRvYXN0SXNFcnJvci5zZXQoaXNFcnJvcik7XG4gICAgdGhpcy5jaGVja3BvaW50VG9hc3Quc2V0KG1lc3NhZ2UpO1xuICAgIHRoaXMudG9hc3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jaGVja3BvaW50VG9hc3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5jaGVja3BvaW50VG9hc3RJc0Vycm9yLnNldChmYWxzZSk7XG4gICAgfSwgMjUwMCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrcG9pbnRGaWxlTmFtZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYWZlID0gY2hlY2twb2ludC5uYW1lXG4gICAgICAucmVwbGFjZSgvW1xcXFwvOio/XCI8PnxdL2csICctJylcbiAgICAgIC5yZXBsYWNlKC9eLSt8LSskL2csICcnKVxuICAgICAgLnRyaW0oKTtcbiAgICByZXR1cm4gYCR7c2FmZSB8fCAnY2hlY2twb2ludCd9Lmpzb25gO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RFbGVtZW50QXRQb2ludChldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXRFbGVtZW50KFxuICAgICAgeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sXG4gICAgICBvdmVybGF5LFxuICAgICk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ3RybCtjbGljazogc2VsZWN0IHRoZSBtaW5pbXVtIGNvbW1vbiBwYXJlbnQgb2YgY3VycmVudCBzZWxlY3Rpb24gYW5kIGNsaWNrZWQgZWxlbWVudFxuICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiB0aGlzLnNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgY29tbW9uUGFyZW50ID0gdGhpcy5maW5kTWluaW11bUNvbW1vblBhcmVudChcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQsXG4gICAgICAgIHRhcmdldCxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1vblBhcmVudCAmJlxuICAgICAgICBjb21tb25QYXJlbnQgIT09IGRvY3VtZW50LmJvZHkgJiZcbiAgICAgICAgY29tbW9uUGFyZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudChjb21tb25QYXJlbnQpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBjb21tb25QYXJlbnQ7XG4gICAgICAgIHRoaXMudXBkYXRlRGlzdGFuY2VPdmVybGF5KCk7XG4gICAgICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChnZXRJbnNwZWN0TWVhc3VyZW1lbnQodGFyZ2V0KSk7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSB0YXJnZXQ7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KFxuICAgICAgdGhpcy5maW5kR3VpZGVBdFBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpLFxuICAgICk7XG4gICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5hbHRQcmVzc2VkKCkgfHxcbiAgICAgICF0aGlzLnNlbGVjdGVkRWxlbWVudCB8fFxuICAgICAgIXRoaXMuaG92ZXJFbGVtZW50IHx8XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9PT0gdGhpcy5ob3ZlckVsZW1lbnRcbiAgICApIHtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbiA9IHRoaXMuZ2V0RGlzdGFuY2VSZWxhdGlvbihcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LFxuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQsXG4gICAgKTtcbiAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQoXG4gICAgICBnZXREaXN0YW5jZU92ZXJsYXkoXG4gICAgICAgIGdldFJlY3RGcm9tRG9tKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSxcbiAgICAgICAgZ2V0UmVjdEZyb21Eb20odGhpcy5ob3ZlckVsZW1lbnQpLFxuICAgICAgICByZWxhdGlvbixcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGlzdGFuY2VSZWxhdGlvbihcbiAgICBlbGVtZW50QTogSFRNTEVsZW1lbnQsXG4gICAgZWxlbWVudEI6IEhUTUxFbGVtZW50LFxuICApOiBEaXN0YW5jZVJlbGF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZWxlbWVudEIuY29udGFpbnMoZWxlbWVudEEpKSByZXR1cm4gJ2EtaW5zaWRlLWInO1xuICAgIGlmIChlbGVtZW50QS5jb250YWlucyhlbGVtZW50QikpIHJldHVybiAnYi1pbnNpZGUtYSc7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3NlciB8fCAhdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuc2hvd1R5cG9ncmFwaHkoKSkge1xuICAgICAgdGhpcy50ZXh0QmxvY2tzLnNldChbXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFxuICAgICAgZ2V0VmlzaWJsZVRleHRCbG9ja3ModGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGwpXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGJsb2NrKSA9PlxuICAgICAgICAgICAgYmxvY2sucmVjdC50b3AgPj0gMCAmJlxuICAgICAgICAgICAgYmxvY2sucmVjdC50b3AgPD0gdmlld3BvcnQuaGVpZ2h0ICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LmxlZnQgPj0gMCAmJlxuICAgICAgICAgICAgYmxvY2sucmVjdC5sZWZ0IDw9IHZpZXdwb3J0LndpZHRoLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGJsb2NrKSA9PiAoe1xuICAgICAgICAgIC4uLmJsb2NrLFxuICAgICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICAgIC4uLmJsb2NrLnJlY3QsXG4gICAgICAgICAgICBsZWZ0OiBjbGFtcChibG9jay5yZWN0LmxlZnQsIDAsIHZpZXdwb3J0LndpZHRoIC0gMTIpLFxuICAgICAgICAgICAgdG9wOiBjbGFtcChibG9jay5yZWN0LnRvcCwgMTQsIHZpZXdwb3J0LmhlaWdodCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJhbmRvbWl6ZVBldCgpIHtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmhhc1NlbGVjdGVkUGV0ID8gdGhpcy5wZXRJbmRleCgpIDogbnVsbDtcbiAgICBjb25zdCBhdmFpbGFibGVDb3VudCA9IGN1cnJlbnRJbmRleCA9PT0gbnVsbFxuICAgICAgPyBJTlNQRUNUT1JfUEVUUy5sZW5ndGhcbiAgICAgIDogSU5TUEVDVE9SX1BFVFMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCByYW5kb21PZmZzZXQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhdmFpbGFibGVDb3VudCk7XG4gICAgdGhpcy5wZXRJbmRleC5zZXQoXG4gICAgICBjdXJyZW50SW5kZXggPT09IG51bGxcbiAgICAgICAgPyByYW5kb21PZmZzZXRcbiAgICAgICAgOiAoY3VycmVudEluZGV4ICsgMSArIHJhbmRvbU9mZnNldCkgJSBJTlNQRUNUT1JfUEVUUy5sZW5ndGgsXG4gICAgKTtcbiAgICB0aGlzLmhhc1NlbGVjdGVkUGV0ID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkR3VpZGUoZ3VpZGU6IEd1aWRlKSB7XG4gICAgY29uc3QgbmV4dEd1aWRlcyA9IFsuLi50aGlzLmd1aWRlcygpLCBndWlkZV07XG4gICAgdGhpcy5ndWlkZXMuc2V0KG5leHRHdWlkZXMpO1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChndWlkZS5pZCk7XG4gIH1cblxuICBwcml2YXRlIGdldEd1aWRlUHJldmlldyhldmVudDogUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCk6IEd1aWRlIHtcbiAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdGhpcy5ndWlkZU9yaWVudGF0aW9uKCk7XG4gICAgY29uc3QgcmF3UG9zaXRpb24gPVxuICAgICAgb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBldmVudC5jbGllbnRYIDogZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBtYXggPSBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHZpZXdwb3J0LndpZHRoIDogdmlld3BvcnQuaGVpZ2h0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiAncHJldmlldycsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnNuYXBHdWlkZShjbGFtcChyYXdQb3NpdGlvbiwgMCwgbWF4KSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc25hcEd1aWRlKHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IGd1aWRlIG9mIHRoaXMuZ3VpZGVzKCkpIHtcbiAgICAgIGlmIChNYXRoLmFicyhndWlkZS5wb3NpdGlvbiAtIHBvc2l0aW9uKSA8PSBHVUlERV9TTkFQX0RJU1RBTkNFKSB7XG4gICAgICAgIHJldHVybiBndWlkZS5wb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kR3VpZGVBdFBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBndWlkZSBvZiB0aGlzLmd1aWRlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnICYmXG4gICAgICAgIE1hdGguYWJzKGd1aWRlLnBvc2l0aW9uIC0geCkgPD0gR1VJREVfSElUQk9YX1NJWkVcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZ3VpZGUuaWQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgJiZcbiAgICAgICAgTWF0aC5hYnMoZ3VpZGUucG9zaXRpb24gLSB5KSA8PSBHVUlERV9ISVRCT1hfU0laRVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBndWlkZS5pZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZpbmRNaW5pbXVtQ29tbW9uUGFyZW50KFxuICAgIGVsZW1lbnRBOiBIVE1MRWxlbWVudCxcbiAgICBlbGVtZW50QjogSFRNTEVsZW1lbnQsXG4gICk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgLy8gQnVpbGQgYW5jZXN0b3IgY2hhaW4gZm9yIGVsZW1lbnQgQVxuICAgIGNvbnN0IGFuY2VzdG9yc0EgPSBuZXcgU2V0PEVsZW1lbnQ+KCk7XG4gICAgbGV0IGN1cnJlbnQ6IEVsZW1lbnQgfCBudWxsID0gZWxlbWVudEE7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGFuY2VzdG9yc0EuYWRkKGN1cnJlbnQpO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBXYWxrIHVwIGZyb20gZWxlbWVudEIgdW50aWwgd2UgZmluZCBhIGNvbW1vbiBhbmNlc3RvclxuICAgIGN1cnJlbnQgPSBlbGVtZW50QjtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgaWYgKGFuY2VzdG9yc0EuaGFzKGN1cnJlbnQpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImluc3BlY3Rvci1yb290XCIgI292ZXJsYXlSb290PlxuICBAaWYgKGNoZWNrcG9pbnRTZXJ2aWNlKSB7XG4gICAgPGRpYWxvZ1xuICAgICAgI2NoZWNrcG9pbnREaWFsb2dcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtZGlhbG9nXCJcbiAgICAgIGFyaWEtbGFiZWxsZWRieT1cImluc3BlY3Rvci1jb21tYW5kLXRpdGxlXCJcbiAgICAgIChjYW5jZWwpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKVwiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlQ2hlY2twb2ludERpYWxvZ0NsaWNrKCRldmVudClcIlxuICAgID5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIDxoZWFkZXIgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fc2VhcmNoXCI+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBpZD1cImluc3BlY3Rvci1jb21tYW5kLXRpdGxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXZpc3VhbGx5LWhpZGRlblwiXG4gICAgICAgICAgICBmb3I9XCJpbnNwZWN0b3ItY2hlY2twb2ludC1zZWFyY2hcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIGluc3BlY3Rvci1uZyBjb21tYW5kIHBhbGV0dGVcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fcGV0LXN3aXRjaGVyXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NoYW5nZSBwZXQuIEN1cnJlbnQgcGV0OiAnICsgYWN0aXZlUGV0KCkubmFtZVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NoYW5nZSBwZXQ6ICcgKyBhY3RpdmVQZXQoKS5uYW1lXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjeWNsZVBldCgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmRfX3BldC1zcHJpdGVcIlxuICAgICAgICAgICAgICBbc3JjXT1cImFjdGl2ZVBldCgpLnNwcml0ZVNyY1wiXG4gICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjY2hlY2twb2ludFNlYXJjaFxuICAgICAgICAgICAgaWQ9XCJpbnNwZWN0b3ItY2hlY2twb2ludC1zZWFyY2hcIlxuICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImluc3BlY3Rvci1uZ+KAplwiXG4gICAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJjb21tYW5kQmFyT3BlbigpXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJjaGVja3BvaW50UXVlcnkoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidpbnNwZWN0b3ItY2hlY2twb2ludC1yZXN1bHRzIGluc3BlY3Rvci1jb21tYW5kLWFjdGlvbnMnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJhY3RpdmVDb21tYW5kUmVzdWx0SWQoKVwiXG4gICAgICAgICAgICAoaW5wdXQpPVwidXBkYXRlQ2hlY2twb2ludFF1ZXJ5KCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIEBpZiAoY2hlY2twb2ludFNlcnZpY2UuZXJyb3IoKTsgYXMgZXJyb3IpIHtcbiAgICAgICAgICA8cFxuICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZSBpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZS0tZXJyb3JcIlxuICAgICAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBlcnJvciB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBpZD1cImluc3BlY3Rvci1jaGVja3BvaW50LXJlc3VsdHNcIlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmRfX3Jlc3VsdHNcIlxuICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiU2F2ZWQgY2hlY2twb2ludHNcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChjaGVja3BvaW50U2VydmljZS5sb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmRfX21lc3NhZ2VcIiByb2xlPVwic3RhdHVzXCI+TG9hZGluZ+KApjwvcD5cbiAgICAgICAgICB9IEBlbHNlIGlmIChcbiAgICAgICAgICAgICFjaGVja3BvaW50U2VydmljZS5jaGVja3BvaW50cygpLmxlbmd0aCAmJiAhY2hlY2twb2ludFF1ZXJ5KCkudHJpbSgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19tZXNzYWdlXCIgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgICBObyBjaGVja3BvaW50cyB5ZXRcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9IEBlbHNlIGlmIChcbiAgICAgICAgICAgICFmaWx0ZXJlZENoZWNrcG9pbnRzKCkubGVuZ3RoICYmXG4gICAgICAgICAgICAhZmlsdGVyZWRJbnNwZWN0b3JBY3Rpb25zKCkubGVuZ3RoICYmXG4gICAgICAgICAgICAhbmF2aWdhdGVUYXJnZXQoKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZVwiIHJvbGU9XCJzdGF0dXNcIj5ObyBtYXRjaGVzPC9wPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgIGNoZWNrcG9pbnQgb2YgZmlsdGVyZWRDaGVja3BvaW50cygpO1xuICAgICAgICAgICAgICB0cmFjayBjaGVja3BvaW50LmlkO1xuICAgICAgICAgICAgICBsZXQgaW5kZXggPSAkaW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgIFtpZF09XCInaW5zcGVjdG9yLWNoZWNrcG9pbnQtJyArIGNoZWNrcG9pbnQuaWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY29tbWFuZC1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJhY3RpdmVDb21tYW5kSW5kZXgoKSA9PT0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiYWN0aXZlQ29tbWFuZEluZGV4KCkgPT09IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYnVzeV09XCJcbiAgICAgICAgICAgICAgICAgIGNoZWNrcG9pbnRTZXJ2aWNlLmJ1c3koKSAmJiBhY3RpdmVDb21tYW5kSW5kZXgoKSA9PT0gaW5kZXhcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNldEFjdGl2ZUNoZWNrcG9pbnQoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVDaGVja3BvaW50KGNoZWNrcG9pbnQsICRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChkZWxldGluZ0NoZWNrcG9pbnRJZCgpID09PSBjaGVja3BvaW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fY29uZmlybVwiXG4gICAgICAgICAgICAgICAgICAgID5EZWxldGUg4oCce3sgY2hlY2twb2ludC5uYW1lIH194oCdPzwvc3BhblxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX2NvbmZpcm0tYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maXJtRGVsZXRlKGNoZWNrcG9pbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2FuY2VsRGVsZXRlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICBLZWVwXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGVkaXRpbmdDaGVja3BvaW50SWQoKSA9PT0gY2hlY2twb2ludC5pZCkge1xuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICNjaGVja3BvaW50UmVuYW1lXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtcm93X19yZW5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2hlY2twb2ludCBuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJlbmFtZURyYWZ0KClcIlxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwidXBkYXRlUmVuYW1lRHJhZnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtcm93X19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX25hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJjaGVja3BvaW50Lm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGJkaSBkaXI9XCJsdHJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrcG9pbnRTZXJ2aWNlLmJ1c3koKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb21tYW5kSW5kZXgoKSA9PT0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN0b3JpbmfigKZcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjaGVja3BvaW50Lm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2JkaT5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fYWN0aXZpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBjaGVja3BvaW50Lmxhc3RVc2VkQXQgPyBcIlVzZWRcIiA6IFwiU2F2ZWRcIiB9fVxuICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRSZWxhdGl2ZVRpbWUoY2hlY2twb2ludEFjdGl2aXR5QXQoY2hlY2twb2ludCkpXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX2FjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiZWdpblJlbmFtZShjaGVja3BvaW50LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW5hbWUgJyArIGNoZWNrcG9pbnQubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJtMTEuOCAxLjggMi40IDIuNC04LjMgOC4zLTMuMS43LjctMy4xem0tOCAxMC40IDEuNS0uMy0xLjItMS4yelwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkb3dubG9hZENoZWNrcG9pbnQoY2hlY2twb2ludCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRXhwb3J0ICcgKyBjaGVja3BvaW50Lm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMjUgMmgxLjV2NS40NGwxLjcyLTEuNzJMMTEuNTMgNi43OCA4IDEwLjMxIDQuNDcgNi43OGwxLjA2LTEuMDYgMS43MiAxLjcyek0yLjUgMTJoMTF2MS41aC0xMXpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmVnaW5EZWxldGUoY2hlY2twb2ludCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVsZXRlICcgKyBjaGVja3BvaW50Lm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTUuNSAyaDVsLjUgMUgxNHYxLjI1SDJWM2gzem0tMiAzLjI1aDlMMTIgMTRINHpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobmF2aWdhdGVUYXJnZXQoKTsgYXMgdGFyZ2V0KSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvdyBpbnNwZWN0b3ItY29tbWFuZC1yb3ctLW5hdmlnYXRlXCJcbiAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICBpZD1cImluc3BlY3Rvci1uYXZpZ2F0ZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jb21tYW5kLWluZGV4XT1cImZpbHRlcmVkQ2hlY2twb2ludHMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiXG4gICAgICAgICAgICAgICAgICBhY3RpdmVDb21tYW5kSW5kZXgoKSA9PT0gZmlsdGVyZWRDaGVja3BvaW50cygpLmxlbmd0aFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvbW1hbmRJbmRleCgpID09PSBmaWx0ZXJlZENoZWNrcG9pbnRzKCkubGVuZ3RoXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYnVzeV09XCJcbiAgICAgICAgICAgICAgICAgIGNoZWNrcG9pbnRTZXJ2aWNlLmJ1c3koKSAmJlxuICAgICAgICAgICAgICAgICAgYWN0aXZlQ29tbWFuZEluZGV4KCkgPT09IGZpbHRlcmVkQ2hlY2twb2ludHMoKS5sZW5ndGhcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNldEFjdGl2ZUNoZWNrcG9pbnQoZmlsdGVyZWRDaGVja3BvaW50cygpLmxlbmd0aClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVRvUXVlcnlSb3V0ZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtcm93X19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInTmF2aWdhdGUgdG8gJyArIHRhcmdldFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxiZGkgZGlyPVwibHRyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrcG9pbnRTZXJ2aWNlLmJ1c3koKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlQ29tbWFuZEluZGV4KCkgPT09IGZpbHRlcmVkQ2hlY2twb2ludHMoKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE5hdmlnYXRpbmfigKZcbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEdvIHRvIHt7IHRhcmdldCB9fVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9iZGk+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fYWN0aXZpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGUgwrcga2VlcHMgc3RhdGVcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChmaWx0ZXJlZEluc3BlY3RvckFjdGlvbnMoKS5sZW5ndGgpIHtcbiAgICAgICAgICA8Zm9vdGVyXG4gICAgICAgICAgICBpZD1cImluc3BlY3Rvci1jb21tYW5kLWFjdGlvbnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fYWN0aW9uc1wiXG4gICAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiSW5zcGVjdG9yIGFjdGlvbnNcIlxuICAgICAgICAgICAgYXJpYS1vcmllbnRhdGlvbj1cImhvcml6b250YWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICBhY3Rpb24gb2YgZmlsdGVyZWRJbnNwZWN0b3JBY3Rpb25zKCk7XG4gICAgICAgICAgICAgIHRyYWNrIGFjdGlvbi5pZDtcbiAgICAgICAgICAgICAgbGV0IGluZGV4ID0gJGluZGV4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtYWN0aW9uXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiJ2luc3BlY3Rvci1hY3Rpb24tJyArIGFjdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jb21tYW5kLWluZGV4XT1cImFjdGlvbkluZGV4T2Zmc2V0KCkgKyBpbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhY3Rpb24uYXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIlxuICAgICAgICAgICAgICAgICAgYWN0aXZlQ29tbWFuZEluZGV4KCkgPT09IGFjdGlvbkluZGV4T2Zmc2V0KCkgKyBpbmRleFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJjaGVja3BvaW50U2VydmljZS5idXN5KClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvbW1hbmRJbmRleCgpID09PSBhY3Rpb25JbmRleE9mZnNldCgpICsgaW5kZXhcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiXG4gICAgICAgICAgICAgICAgICAoYWN0aW9uLmlkID09PSAnc2VsZWN0JyAmJiB0b29sTW9kZSgpID09PSAnc2VsZWN0JykgfHxcbiAgICAgICAgICAgICAgICAgIChhY3Rpb24uaWQgPT09ICd0eXBlJyAmJiBzaG93VHlwb2dyYXBoeSgpKSB8fFxuICAgICAgICAgICAgICAgICAgKGFjdGlvbi5pZCA9PT0gJ3ZlcnRpY2FsJyAmJlxuICAgICAgICAgICAgICAgICAgICB0b29sTW9kZSgpID09PSAnZ3VpZGVzJyAmJlxuICAgICAgICAgICAgICAgICAgICBndWlkZU9yaWVudGF0aW9uKCkgPT09ICd2ZXJ0aWNhbCcpIHx8XG4gICAgICAgICAgICAgICAgICAoYWN0aW9uLmlkID09PSAnaG9yaXpvbnRhbCcgJiZcbiAgICAgICAgICAgICAgICAgICAgdG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycgJiZcbiAgICAgICAgICAgICAgICAgICAgZ3VpZGVPcmllbnRhdGlvbigpID09PSAnaG9yaXpvbnRhbCcpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2hlY2twb2ludFNlcnZpY2UuYnVzeSgpXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRBY3RpdmVJbnNwZWN0b3JBY3Rpb24oaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0ZUluc3BlY3RvckFjdGlvbihhY3Rpb24pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBzd2l0Y2ggKGFjdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgICAgQGNhc2UgKFwic2VsZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDJsOCA4LTMgLjdMNi43IDEzIDYgMTAgMyAyelwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGNhc2UgKFwidHlwZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA0VjJoMTB2MmgtNHYxMEg3VjR6XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJzYXZlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMi41IDJoOS42bDEuNCAxLjRWMTRoLTExem0yIDEuNXYzaDZ2LTN6bS41IDZWMTJoNlY5LjV6XCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBjYXNlIChcImltcG9ydFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTggMmwzLjUzIDMuNTMtMS4wNiAxLjA2TDguNzUgNC44N1Y5LjVoLTEuNVY0Ljg3TDUuNTMgNi41OSA0LjQ3IDUuNTN6TTIuNSAxMWgxMXYxLjVoLTExelwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJ2ZXJ0aWNhbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNSAyaDEuNXYxMmgtMS41elwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGNhc2UgKFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMiA3LjI1aDEydjEuNUgyelwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBhY3Rpb24ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICB9XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9kaWFsb2c+XG4gIH1cblxuICBAaWYgKGNoZWNrcG9pbnRUb2FzdCgpOyBhcyB0b2FzdCkge1xuICAgIDxwXG4gICAgICBjbGFzcz1cImluc3BlY3Rvci1jaGVja3BvaW50LXRvYXN0XCJcbiAgICAgIFtjbGFzcy5pbnNwZWN0b3ItY2hlY2twb2ludC10b2FzdC0tZXJyb3JdPVwiY2hlY2twb2ludFRvYXN0SXNFcnJvcigpXCJcbiAgICAgIFthdHRyLnJvbGVdPVwiY2hlY2twb2ludFRvYXN0SXNFcnJvcigpID8gJ2FsZXJ0JyA6ICdzdGF0dXMnXCJcbiAgICA+XG4gICAgICB7eyB0b2FzdCB9fVxuICAgIDwvcD5cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIHRvb2xNb2RlKCkgPT09IFwic2VsZWN0XCIpIHtcbiAgICBAaWYgKGhvdmVyUmVjdCgpICYmIGhvdmVySGlnaGxpZ2h0RW5hYmxlZCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0taG92ZXJcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJob3ZlclJlY3QoKSEubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiaG92ZXJSZWN0KCkhLnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJob3ZlclJlY3QoKSEud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhvdmVyUmVjdCgpIS5oZWlnaHRcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItYWNjZW50XT1cImhpZ2hsaWdodENvbG9yXCJcbiAgICAgID48L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKHNlbGVjdGVkTWVhc3VyZW1lbnQoKTsgYXMgc2VsZWN0ZWQpIHtcbiAgICAgIEBpZiAoc2VsZWN0ZWQuZ2FwLmFjdGl2ZSAmJiBzZWxlY3RlZC5wYXJlbnRSZWN0KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tZ2FwXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LmxlZnRcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC50b3BcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QuaGVpZ2h0XCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tZ2FwXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LmxlZnRcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC50b3AgLSA4XCJcbiAgICAgICAgPlxuICAgICAgICAgIEcge3sgZm9ybWF0R2FwKHNlbGVjdGVkKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tbWFyZ2luXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LmhlaWdodFwiXG4gICAgICA+PC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLXNlbGVjdGVkXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQucmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5yZWN0LnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5yZWN0LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJzZWxlY3RlZC5yZWN0LmhlaWdodFwiXG4gICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1hY2NlbnRdPVwiaGlnaGxpZ2h0Q29sb3JcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLWxhYmVsXCI+e3sgc2VsZWN0ZWRNZXRhTGluZSgpIH19PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tcGFkZGluZ1wiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tc3BhY2luZ1wiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucmVjdC50b3AgKyBzZWxlY3RlZC5yZWN0LmhlaWdodCArIDhcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnX19tYXJnaW5cIj5NPC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBmb3JtYXRFZGdlcyhzZWxlY3RlZC5tYXJnaW4pIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnX19zZXBhcmF0b3JcIj7Ctzwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZ19fcGFkZGluZ1wiPlA8L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IGZvcm1hdEVkZ2VzKHNlbGVjdGVkLnBhZGRpbmcpIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgc2hvd1R5cG9ncmFwaHkoKSkge1xuICAgIEBmb3IgKGJsb2NrIG9mIHRleHRCbG9ja3MoKTsgdHJhY2sgYmxvY2suaWQpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItdGV4dC1jaGlwXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiYmxvY2sucmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJibG9jay5yZWN0LnRvcCAtIDhcIlxuICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXRleHQtY2hpcF9fc3dhdGNoXCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJibG9jay5zdHlsZXMuY29sb3JcIlxuICAgICAgICA+PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBibG9jay5zdHlsZXMuZm9udFNpemUgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IGJsb2NrLnN0eWxlcy5saW5lSGVpZ2h0IH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBibG9jay5zdHlsZXMuY29sb3IgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cblxuICBAaWYgKGVuYWJsZWQoKSAmJiBhbHRQcmVzc2VkKCkgJiYgZGlzdGFuY2VPdmVybGF5KCk7IGFzIGRpc3RhbmNlKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLWRpc3RhbmNlXCJcbiAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImRpc3RhbmNlLnJlY3RBLmxlZnRcIlxuICAgICAgW3N0eWxlLnRvcC5weF09XCJkaXN0YW5jZS5yZWN0QS50b3BcIlxuICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRpc3RhbmNlLnJlY3RBLndpZHRoXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZGlzdGFuY2UucmVjdEEuaGVpZ2h0XCJcbiAgICA+PC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLWRpc3RhbmNlXCJcbiAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImRpc3RhbmNlLnJlY3RCLmxlZnRcIlxuICAgICAgW3N0eWxlLnRvcC5weF09XCJkaXN0YW5jZS5yZWN0Qi50b3BcIlxuICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRpc3RhbmNlLnJlY3RCLndpZHRoXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZGlzdGFuY2UucmVjdEIuaGVpZ2h0XCJcbiAgICA+PC9kaXY+XG5cbiAgICBAZm9yIChcbiAgICAgIGNvbm5lY3RvciBvZiBkaXN0YW5jZS5jb25uZWN0b3JzO1xuICAgICAgdHJhY2sgdHJhY2tDb25uZWN0b3IoJGluZGV4LCBjb25uZWN0b3IpXG4gICAgKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNvbm5lY3RvclwiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItY29ubmVjdG9yLS12ZXJ0aWNhbF09XCJjb25uZWN0b3IueDEgPT09IGNvbm5lY3Rvci54MlwiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItY29ubmVjdG9yLS1ob3Jpem9udGFsXT1cImNvbm5lY3Rvci55MSA9PT0gY29ubmVjdG9yLnkyXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiTWF0aC5taW4oY29ubmVjdG9yLngxLCBjb25uZWN0b3IueDIpXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJNYXRoLm1pbihjb25uZWN0b3IueTEsIGNvbm5lY3Rvci55MilcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiTWF0aC5tYXgoMSwgTWF0aC5hYnMoY29ubmVjdG9yLngyIC0gY29ubmVjdG9yLngxKSlcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIk1hdGgubWF4KDEsIE1hdGguYWJzKGNvbm5lY3Rvci55MiAtIGNvbm5lY3Rvci55MSkpXCJcbiAgICAgID48L2Rpdj5cbiAgICB9XG5cbiAgICBAZm9yIChob3Jpem9udGFsIG9mIGRpc3RhbmNlLmhvcml6b250YWxEaXN0YW5jZXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgQGlmIChob3Jpem9udGFsLnZhbHVlID4gMCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtbGluZSBpbnNwZWN0b3ItZGlzdGFuY2UtbGluZS0taG9yaXpvbnRhbFwiXG4gICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiTWF0aC5taW4oaG9yaXpvbnRhbC54MSEsIGhvcml6b250YWwueDIhKVwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJob3Jpem9udGFsLnkhXCJcbiAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiTWF0aC5hYnMoaG9yaXpvbnRhbC54MiEgLSBob3Jpem9udGFsLngxISlcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWdcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIihob3Jpem9udGFsLngxISArIGhvcml6b250YWwueDIhKSAvIDJcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiaG9yaXpvbnRhbC55IVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBmb3JtYXRWYWx1ZShob3Jpem9udGFsLnZhbHVlKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAZm9yICh2ZXJ0aWNhbCBvZiBkaXN0YW5jZS52ZXJ0aWNhbERpc3RhbmNlczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICBAaWYgKHZlcnRpY2FsLnZhbHVlID4gMCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtbGluZSBpbnNwZWN0b3ItZGlzdGFuY2UtbGluZS0tdmVydGljYWxcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInZlcnRpY2FsLnghXCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cIk1hdGgubWluKHZlcnRpY2FsLnkxISwgdmVydGljYWwueTIhKVwiXG4gICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJNYXRoLmFicyh2ZXJ0aWNhbC55MiEgLSB2ZXJ0aWNhbC55MSEpXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtdGFnIGluc3BlY3Rvci1kaXN0YW5jZS10YWctLXZlcnRpY2FsXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJ2ZXJ0aWNhbC54IVwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCIodmVydGljYWwueTEhICsgdmVydGljYWwueTIhKSAvIDJcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZm9ybWF0VmFsdWUodmVydGljYWwudmFsdWUpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpKSB7XG4gICAgQGlmICh0b29sTW9kZSgpID09PSBcImd1aWRlc1wiKSB7XG4gICAgICBAaWYgKGd1aWRlUHJldmlldygpOyBhcyBwcmV2aWV3KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ndWlkZSBpbnNwZWN0b3ItZ3VpZGUtLXByZXZpZXdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXZlcnRpY2FsXT1cInByZXZpZXcub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiXG4gICAgICAgICAgICBwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHByZXZpZXcucG9zaXRpb24gOiBudWxsXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gcHJldmlldy5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1ndWlkZV09XCJndWlkZUNvbG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cblxuICAgIEBmb3IgKGd1aWRlIG9mIGd1aWRlcygpOyB0cmFjayBndWlkZS5pZCkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGVcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS12ZXJ0aWNhbF09XCJndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXNlbGVjdGVkXT1cInNlbGVjdGVkR3VpZGVJZCgpID09PSBndWlkZS5pZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZ3VpZGUucG9zaXRpb24gOiBudWxsXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiXG4gICAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGd1aWRlLnBvc2l0aW9uIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItZ3VpZGVdPVwiZ3VpZGVDb2xvclwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgKGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gJ1ZlcnRpY2FsJyA6ICdIb3Jpem9udGFsJykgK1xuICAgICAgICAgICcgZ3VpZGUgYXQgJyArXG4gICAgICAgICAgZm9ybWF0VmFsdWUoZ3VpZGUucG9zaXRpb24pICtcbiAgICAgICAgICAnIHBpeGVscydcbiAgICAgICAgXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cInN0YXJ0R3VpZGVEcmFnKCRldmVudCwgZ3VpZGUpXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGUtbGluZVwiPjwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIEBmb3IgKGRpc3RhbmNlIG9mIGd1aWRlRGlzdGFuY2VzKCk7IHRyYWNrIGRpc3RhbmNlLm9yaWVudGF0aW9uICsgXCItXCIgKyBkaXN0YW5jZS5zdGFydCArIFwiLVwiICsgZGlzdGFuY2UuZW5kKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWRpc3RhbmNlXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1ndWlkZS1kaXN0YW5jZS0tdmVydGljYWxdPVwiZGlzdGFuY2Uub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLWRpc3RhbmNlLS1ob3Jpem9udGFsXT1cImRpc3RhbmNlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGRpc3RhbmNlLnN0YXJ0IDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2Uub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGRpc3RhbmNlLnN0YXJ0IDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGRpc3RhbmNlLnZhbHVlIDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZGlzdGFuY2Uub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGRpc3RhbmNlLnZhbHVlIDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1ndWlkZV09XCJndWlkZUNvbG9yXCJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGUtZGlzdGFuY2VfX2xpbmVcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWRpc3RhbmNlX190YWdcIj5cbiAgICAgICAgICB7eyBmb3JtYXRWYWx1ZShkaXN0YW5jZS52YWx1ZSkgfX0gcHhcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG48L2Rpdj5cbiJdfQ==