verben-workflow-ui 0.5.70 → 0.5.71

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.
@@ -616,7 +616,12 @@ export class DesignerCanvasComponent {
616
616
  this.hideConnectionPopup();
617
617
  return;
618
618
  }
619
- const { endX, endY, sourceSwimlaneIndex } = pathData;
619
+ const { endX, endY } = pathData;
620
+ // Determine the target swimlane from the drop position (NOT the source
621
+ // swimlane). `addNode` expects an absolute canvas Y plus the target
622
+ // swimlane index, and performs the swimlane-relative conversion itself.
623
+ let targetSwimlaneIndex = Math.floor(endY / this.swimlaneHeight);
624
+ targetSwimlaneIndex = Math.max(0, Math.min(targetSwimlaneIndex, this.state.swimlanes.length - 1));
620
625
  // Get source node info
621
626
  const sourcePoint = this.state.draggingConnectionData.sourcePoint;
622
627
  if (!sourcePoint) {
@@ -633,12 +638,10 @@ export class DesignerCanvasComponent {
633
638
  // Store information for later stage creation
634
639
  this.pendingDecisionConnection = {
635
640
  decisionNodeId: sourceNodeInfo.node.id,
636
- swimlaneIndex: sourceSwimlaneIndex,
641
+ swimlaneIndex: targetSwimlaneIndex,
637
642
  x: endX,
638
643
  y: endY,
639
644
  };
640
- // Calculate popup position - position it near the decision node
641
- const swimlaneOffsetY = sourceSwimlaneIndex * 263;
642
645
  // Center the popup over the connection endpoint
643
646
  this.decisionConditionPopupX = endX;
644
647
  this.decisionConditionPopupY = endY - 150; // Position above the endpoint
@@ -649,26 +652,11 @@ export class DesignerCanvasComponent {
649
652
  this.hideConnectionPopup();
650
653
  return;
651
654
  }
652
- const swimlaneIndex = Math.floor(endY / this.swimlaneHeight);
653
- const swimlaneTop = swimlaneIndex * this.swimlaneHeight;
654
- // Calculate swimlane-relative position
655
- const swimlaneOffsetY = sourceSwimlaneIndex * 263;
656
- let relativeY = endY - swimlaneOffsetY - 50; // Add half node height for better alignment
657
- const swimlaneBottom = swimlaneTop + 263;
658
- // Clamp nodeY so node stays within swimlane
659
- console.log(endY, swimlaneIndex, swimlaneOffsetY, swimlaneBottom);
660
- if (endY - 50 < swimlaneTop) {
661
- console.log('Less');
662
- relativeY = swimlaneTop; // Node would overflow above, so align to top
663
- }
664
- else if (endY + 50 > swimlaneBottom) {
665
- console.log('More');
666
- relativeY = swimlaneBottom - 100; // Node would overflow below, so align to bottom
667
- }
668
655
  // Handle preconditions based on node type
669
656
  if (nodeType === 'stage') {
670
- // Create the stage directly with default properties
671
- const newNode = this.state.addNode(sourceSwimlaneIndex, 'stage', endX, relativeY, { Name: 'New Stage' } // Add default properties
657
+ // Create the stage in the target swimlane. `addNode` converts the
658
+ // absolute endY to a swimlane-relative position internally.
659
+ const newNode = this.state.addNode(targetSwimlaneIndex, 'stage', endX, endY, { Name: 'New Stage' } // Add default properties
672
660
  );
673
661
  if (newNode &&
674
662
  newNode.connectionPoints &&
@@ -684,7 +672,7 @@ export class DesignerCanvasComponent {
684
672
  const targetPoint = newNode.connectionPoints.find((p) => p.type === opposingType);
685
673
  if (targetPoint) {
686
674
  // Create the connection
687
- const connection = this.state.createConnection(newNode.id, targetPoint.id, sourceSwimlaneIndex);
675
+ const connection = this.state.createConnection(newNode.id, targetPoint.id, targetSwimlaneIndex);
688
676
  if (connection) {
689
677
  this.onConnectionCreated(connection);
690
678
  }
@@ -694,14 +682,14 @@ export class DesignerCanvasComponent {
694
682
  return;
695
683
  }
696
684
  else if (nodeType === 'subflow') {
697
- console.log('Creating subflow from connection at:', endX, endY, 'swimlane:', sourceSwimlaneIndex);
685
+ console.log('Creating subflow from connection at:', endX, endY, 'swimlane:', targetSwimlaneIndex);
698
686
  // Show workflow selection popup and store connection data for later use
699
- this.showSubflowSelectionPopup(endX, endY, sourceSwimlaneIndex);
687
+ this.showSubflowSelectionPopup(endX, endY, targetSwimlaneIndex);
700
688
  this.hideConnectionPopup();
701
689
  return;
702
690
  }
703
691
  // For other nodes Create the new node at the end position of the connection
704
- const newNode = this.state.addNode(sourceSwimlaneIndex, nodeType, endX, relativeY);
692
+ const newNode = this.state.addNode(targetSwimlaneIndex, nodeType, endX, endY);
705
693
  if (newNode &&
706
694
  newNode.connectionPoints &&
707
695
  newNode.connectionPoints.length > 0) {
@@ -720,7 +708,7 @@ export class DesignerCanvasComponent {
720
708
  targetPoint = newNode.connectionPoints.find((p) => p.type === opposingType);
721
709
  if (targetPoint) {
722
710
  // Create the connection
723
- const connection = this.state.createConnection(newNode.id, targetPoint.id, sourceSwimlaneIndex);
711
+ const connection = this.state.createConnection(newNode.id, targetPoint.id, targetSwimlaneIndex);
724
712
  if (connection) {
725
713
  this.onConnectionCreated(connection);
726
714
  }
@@ -1211,4 +1199,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1211
1199
  type: HostListener,
1212
1200
  args: ['window:mouseup', ['$event']]
1213
1201
  }] } });
1214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItY2FudmFzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvd29ya2Zsb3ctZGVzaWduZXIvZGVzaWduZXItY2FudmFzL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL2Rlc2lnbmVyLWNhbnZhcy9kZXNpZ25lci1jYW52YXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBa0J2QixNQUFNLE9BQU8sdUJBQXVCO0lBNkd6QjtJQUNDO0lBN0dELFlBQVksR0FBYSxJQUFJLENBQUM7SUFDN0IsZUFBZSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0lBQy9ELGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQy9DLG9CQUFvQixHQUNsQixJQUFJLENBQUM7SUFDRyxzQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFHL0MsQ0FBQztJQUNLLHVCQUF1QixHQUFHLElBQUksWUFBWSxFQUdoRCxDQUFDO0lBRUwsK0JBQStCO0lBQ1EsU0FBUyxDQUEwQjtJQUcxRSxlQUFlLENBQUMsS0FBaUI7UUFDL0Isc0VBQXNFO1FBQ3RFLElBQ0UsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3RCLENBQUMsSUFBSSxDQUFDLHNCQUFzQjtZQUM1QixDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksdUNBQXVDO1lBQzdELElBQUks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QyxFQUFFLEVBQUUsQ0FBQztnQkFDOUIsT0FBTztvQkFDTCxHQUFHLElBQUk7b0JBQ1AsS0FBSyxFQUFFLEtBQUs7aUJBQ2IsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F6aURVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLHlkQzdCcEMsMjZvQkFzY0E7OzRGRHphYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UscUJBQXFCOzRIQUt0QixZQUFZO3NCQUFwQixLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFHRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBSUcsdUJBQXVCO3NCQUFoQyxNQUFNO2dCQU1nQyxTQUFTO3NCQUEvQyxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR3JDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgc2lnbmFsLFxuICBWaWV3Q2hpbGQsXG4gIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVzY2FsYXRpb25UeXBlLCBGb3JtLCBXb3JrZmxvdywgV29ya2Zsb3dBY3Rpb24sIFdvcmtmbG93U3RhZ2UgfSBmcm9tICd2ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dEYXRhU2VydmljZSB9IGZyb20gJy4uL3dvcmtmbG93LWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUgfSBmcm9tICcuLi93b3JrZmxvdy1kZXNpZ25lci5zdGF0ZSc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBDb25uZWN0aW9uUG9pbnQsXG4gIE5vZGUsXG4gIFN3aW1sYW5lSXRlbSxcbiAgVG9vbFR5cGUsXG4gIE5vZGUgYXMgV0ZOb2RlLFxufSBmcm9tICcuLi93b3JrZmxvdy1kZXNpZ25lci50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kZXNpZ25lci1jYW52YXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVzaWduZXItY2FudmFzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduZXJDYW52YXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBzZWxlY3RlZFRvb2w6IFRvb2xUeXBlID0gbnVsbDtcbiAgQE91dHB1dCgpIGNsaWNrZWRQb3NpdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgc3ViZmxvd1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwZW5kaW5nU3RhZ2VQb3NpdGlvbjogeyBzd2ltbGFuZUluZGV4OiBudW1iZXI7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID1cbiAgICBudWxsO1xuICBAT3V0cHV0KCkgc3RhZ2VQcm9wZXJ0aWVzVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIHN0YWdlRGF0YTogUGFydGlhbDxXb3JrZmxvd1N0YWdlPjtcbiAgfT4oKTtcbiAgQE91dHB1dCgpIGFjdGlvblByb3BlcnRpZXNVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgY29ubmVjdGlvbklkOiBzdHJpbmc7XG4gICAgYWN0aW9uRGF0YTogUGFydGlhbDxXb3JrZmxvd0FjdGlvbj47XG4gIH0+KCk7XG5cbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBTVkcgZWxlbWVudFxuICBAVmlld0NoaWxkKCdjYW52YXMnLCB7IHN0YXRpYzogdHJ1ZSB9KSBjYW52YXNSZWYhOiBFbGVtZW50UmVmPFNWR0VsZW1lbnQ+O1xuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgb25XaW5kb3dNb3VzZVVwKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIHBvcHVwIG9wZW4gYnV0IHRoZSBtb3VzZSBpcyByZWxlYXNlZCBvdXRzaWRlLCBjbGVhbiB1cFxuICAgIGlmIChcbiAgICAgICF0aGlzLnNob3dTdWJmbG93UG9wdXAgJiZcbiAgICAgICF0aGlzLnNob3dTdGFydE5vZGVGb3JtUG9wdXAgJiZcbiAgICAgICF0aGlzLnBvcHVwVmlzaWJsZSAmJiAvLyBPbmx5IGVuZCBkcmFnIGlmIG5vIHBvcHVwIGlzIHZpc2libGVcbiAgICAgIHRoaXMuc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKVxuICAgICkge1xuICAgICAgY29uc29sZS5sb2coJ0V4dGVybmFsIG1vdXNldXAgZGV0ZWN0ZWQgLSBjbGVhbmluZyB1cCBjb25uZWN0aW9uIGRyYWcnKTtcbiAgICAgIHRoaXMuc3RhdGUuZW5kQ29ubmVjdGlvbkRyYWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBDYW52YXMgZGltZW5zaW9uc1xuICBjYW52YXNXaWR0aCA9IDMwMDA7XG4gIGNhbnZhc0hlaWdodCA9IDIwMDA7XG5cbiAgLy8gR3JpZCBzaXplXG4gIGdyaWRTaXplID0gMjA7XG5cbiAgc3dpbWxhbmVIZWlnaHQgPSAyNjM7XG4gIHZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcG9wdXBWaXNpYmxlID0gZmFsc2U7XG4gIHBvcHVwWCA9IDA7XG4gIHBvcHVwWSA9IDA7XG4gIGFsbG93ZWROb2RlVHlwZXM6IHN0cmluZ1tdID0gW107XG5cbiAgc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cDogYm9vbGVhbiA9IGZhbHNlO1xuICBzdGFydE5vZGVGb3Jtc0xpc3Q6IEZvcm1bXSA9IFtdO1xuICBpc0xvYWRpbmdTdGFydE5vZGVGb3JtczogYm9vbGVhbiA9IGZhbHNlO1xuICBzdGFydE5vZGVGb3JtUG9wdXBYOiBudW1iZXIgPSAwO1xuICBzdGFydE5vZGVGb3JtUG9wdXBZOiBudW1iZXIgPSAwO1xuICBhY3RpdmVOb2RlRm9yRm9ybVNlbGVjdGlvbjogTm9kZSB8IG51bGwgPSBudWxsO1xuICBub2RlRm9ybXM6IFdyaXRhYmxlU2lnbmFsPFxuICAgIFJlY29yZDxzdHJpbmcsIHsgZm9ybUlkOiBzdHJpbmc7IGZvcm1OYW1lOiBzdHJpbmcgfT5cbiAgPiA9IHNpZ25hbCh7fSk7XG5cbiAgc2hvd1N1YmZsb3dQb3B1cDogYm9vbGVhbiA9IGZhbHNlO1xuICB3b3JrZmxvd3NMaXN0OiBXb3JrZmxvd1tdID0gW107XG4gIGlzTG9hZGluZ1dvcmtmbG93czogYm9vbGVhbiA9IGZhbHNlO1xuICBzdWJmbG93UG9wdXBYOiBudW1iZXIgPSAwO1xuICBzdWJmbG93UG9wdXBZOiBudW1iZXIgPSAwO1xuICBwZW5kaW5nU3ViZmxvd1Bvc2l0aW9uOiB7XG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyO1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBwZW5kaW5nRGVjaXNpb25Db25uZWN0aW9uOiB7XG4gICAgZGVjaXNpb25Ob2RlSWQ6IHN0cmluZztcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXI7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIHBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQ6IENvbm5lY3Rpb25Qb2ludCB8IG51bGwgPSBudWxsO1xuICBwZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8vIOKUgOKUgOKUgCBOb2RlLWRyYWcgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGlzRHJhZ2dpbmdOb2RlID0gZmFsc2U7XG4gIGRyYWdnaW5nTm9kZTogTm9kZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRyYWdnaW5nTm9kZVN3aW1sYW5lSW5kZXg6IG51bWJlciA9IC0xO1xuICAvKiogTW91c2Ugb2Zmc2V0IHJlbGF0aXZlIHRvIG5vZGUgdG9wLWxlZnQgYXQgZHJhZyBzdGFydCAoYWJzb2x1dGUgY2FudmFzIGNvb3JkcykuICovXG4gIHByaXZhdGUgZHJhZ09mZnNldFggPSAwO1xuICBwcml2YXRlIGRyYWdPZmZzZXRZID0gMDtcblxuICBzaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0NvbmRpdGlvbnNEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWN0aXZlRGVjaXNpb25Ob2RlSWQ6IHN0cmluZyA9ICcnO1xuICBhY3RpdmVDb25uZWN0aW9uSWQ6IHN0cmluZyA9ICcnO1xuICBkZWNpc2lvbkNvbmRpdGlvblBvcHVwWDogbnVtYmVyID0gMDtcbiAgZGVjaXNpb25Db25kaXRpb25Qb3B1cFk6IG51bWJlciA9IDA7XG5cbiAgaXNDcmVhdGluZ1N0YWdlRnJvbURlY2lzaW9uOiBib29sZWFuID0gZmFsc2U7XG4gIHBlbmRpbmdEZWNpc2lvbkNvbmRpdGlvbjogc3RyaW5nID0gJyc7XG4gIGFjdGl2ZVN0YWdlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBhY3RpdmVBY3Rpb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgc2hvd1N0YWdlRGlhbG9nTG9jYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0VzY2FsYXRpb25EaWFsb2dMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBhY3RpdmVFc2NhbGF0aW9uVHlwZTogV3JpdGFibGVTaWduYWw8RXNjYWxhdGlvblR5cGUgfCBudWxsPiA9IHNpZ25hbChudWxsKTtcbiAgYWN0aXZlU3RhZ2VDb2RlOiBXcml0YWJsZVNpZ25hbDxzdHJpbmcgfCBudWxsPiA9IHNpZ25hbChudWxsKTtcbiAgYWN0aXZlU3RhZ2VEYXRhOiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+ID0ge307XG4gIGFjdGl2ZUFjdGlvbkRhdGE6IENvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBzaG93QWN0aW9uRGlhbG9nTG9jYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwb3RlbnRpYWxUYXJnZXRQb2ludElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RhdGU6IFdvcmtmbG93RGVzaWduZXJTdGF0ZSxcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBXb3JrZmxvd0RhdGFTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDYW52YXNTaXplKCk7XG4gIH1cblxuICAvLyBIYW5kbGUgbW91c2UgY2xpY2sgb24gY2FudmFzXG4gIG9uQ2FudmFzQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBPbmx5IHByb2Nlc3MgY2FudmFzIGNsaWNrcyBpZiBhIHRvb2wgaXMgc2VsZWN0ZWRcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUb29sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgY2xpY2sgb2NjdXJyZWRcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICAnQ2FudmFzIGNsaWNrZWQgYXQ6JyxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgJ3dpdGggdG9vbDonLFxuICAgICAgdGhpcy5zZWxlY3RlZFRvb2xcbiAgICApO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBzd2ltbGFuZSBpbmRleCBiYXNlZCBvbiBwb3NpdGlvblxuICAgIC8vIGNvbnN0IHN3aW1sYW5lSW5kZXggPSBNYXRoLmZsb29yKHBvc2l0aW9uLnkgLyB0aGlzLnN3aW1sYW5lSGVpZ2h0KTtcblxuICAgIC8vIE9ubHkgZW1pdCB0aGUgcG9zaXRpb24gaWYgd2UgaGF2ZSBhIHRvb2wgc2VsZWN0ZWQgYW5kIGl0J3MgYSB2YWxpZCBjbGljayBhcmVhXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUb29sKSB7XG4gICAgICB0aGlzLmNsaWNrZWRQb3NpdGlvbi5lbWl0KHtcbiAgICAgICAgeDogcG9zaXRpb24ueCxcbiAgICAgICAgeTogcG9zaXRpb24ueSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uU2hvd1NoaWVsZERpYWxvZyhzdGFnZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBub2RlXG4gICAgY29uc3Qgbm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChzdGFnZUlkKTtcbiAgICBpZiAobm9kZUluZm8pIHtcbiAgICAgIHRoaXMuYWN0aXZlU3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgICB0aGlzLmFjdGl2ZVN0YWdlRGF0YSA9IHsgLi4ubm9kZUluZm8ubm9kZS5zdGFnZURhdGEsIGlkOiBzdGFnZUlkIH07XG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmFjdGl2ZVN0YWdlRGF0YSwgXCJBQ1RJVkUgU1RBR0UgREFUQVwiKTtcbiAgICAgIHRoaXMuc2hvd1N0YWdlRGlhbG9nTG9jYWwgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG9uU2hvd0FjdGlvbkRpYWxvZyhjb25uZWN0aW9uSW5mbzogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwiQ09ORUNUSU9OXCIsIGNvbm5lY3Rpb25JbmZvKTtcbiAgICAvLyBGaW5kIHRoZSBub2RlXG4gICAgLy8gY29uc3QgY29ubmVjdGlvbkluZm8gPSB0aGlzLnN0YXRlLmZpbmRBY3Rpb25CeUlkKGFjdGlvbklkKTtcbiAgICBpZiAoY29ubmVjdGlvbkluZm8pIHtcbiAgICAgIHRoaXMuYWN0aXZlQWN0aW9uSWQgPSBjb25uZWN0aW9uSW5mby5pZDtcbiAgICAgIHRoaXMuYWN0aXZlQWN0aW9uRGF0YSA9IGNvbm5lY3Rpb25JbmZvO1xuICAgICAgY29uc29sZS5sb2codGhpcy5hY3RpdmVBY3Rpb25EYXRhKTtcbiAgICAgIHRoaXMuc2hvd0FjdGlvbkRpYWxvZ0xvY2FsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBvblNob3dFc2NhbGF0aW9uRGlhbG9nKGV2ZW50OiB7XG4gICAgc3RhZ2VJZDogc3RyaW5nO1xuICAgIHR5cGU6IEVzY2FsYXRpb25UeXBlO1xuICB9KTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgbm9kZVxuICAgIGNvbnN0IG5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoZXZlbnQuc3RhZ2VJZCk7XG4gICAgaWYgKG5vZGVJbmZvKSB7XG4gICAgICB0aGlzLmFjdGl2ZVN0YWdlSWQgPSBldmVudC5zdGFnZUlkO1xuICAgICAgdGhpcy5hY3RpdmVTdGFnZURhdGEgPSBub2RlSW5mby5ub2RlLnN0YWdlRGF0YSB8fCB7XG4gICAgICAgIGlkOiB0aGlzLmFjdGl2ZVN0YWdlSWQsXG4gICAgICB9O1xuICAgICAgdGhpcy5hY3RpdmVFc2NhbGF0aW9uVHlwZS5zZXQoZXZlbnQudHlwZSk7XG4gICAgICB0aGlzLmFjdGl2ZVN0YWdlQ29kZS5zZXQodGhpcy5hY3RpdmVTdGFnZURhdGE/LkNvZGUgfHwgJycpO1xuICAgICAgY29uc29sZS5sb2coJ0FjdGl2ZSBTdGFnZSBEYXRhOicsIHRoaXMuYWN0aXZlU3RhZ2VEYXRhKTtcbiAgICAgIGNvbnNvbGUubG9nKCdFc2NhbGF0aW9uIFR5cGU6JywgdGhpcy5hY3RpdmVFc2NhbGF0aW9uVHlwZSgpKTtcbiAgICAgIHRoaXMuc2hvd0VzY2FsYXRpb25EaWFsb2dMb2NhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBkaWFsb2cgY2xvc3VyZVxuICBvblN0YWdlRGlhbG9nQ2xvc2VkKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd1N0YWdlRGlhbG9nTG9jYWwgPSBmYWxzZTtcbiAgICB0aGlzLmFjdGl2ZVN0YWdlSWQgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlU3RhZ2VEYXRhID0ge307XG4gIH1cblxuICBvbkFjdGlvbkRpYWxvZ0Nsb3NlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dBY3Rpb25EaWFsb2dMb2NhbCA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aXZlQWN0aW9uSWQgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlQWN0aW9uRGF0YSA9IG51bGw7XG4gIH1cblxuICBvbkFjdGlvbkRpYWxvZ0RlbGV0ZWQoY29ubmVjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgdGhlIGNvbm5lY3Rpb24gZnJvbSBzdGF0ZVxuICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMgPSB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLmZpbHRlcihcbiAgICAgIChjKSA9PiBjLmlkICE9PSBjb25uZWN0aW9uSWRcbiAgICApO1xuICAgIC8vIENsb3NlIHRoZSBkaWFsb2dcbiAgICB0aGlzLm9uQWN0aW9uRGlhbG9nQ2xvc2VkKCk7XG4gIH1cblxuICAvLyBBZGQgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGRpYWxvZyBjbG9zdXJlXG4gIG9uRXNjYWxhdGlvbkRpYWxvZ0Nsb3NlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dFc2NhbGF0aW9uRGlhbG9nTG9jYWwgPSBmYWxzZTtcbiAgICB0aGlzLmFjdGl2ZVN0YWdlSWQgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlRXNjYWxhdGlvblR5cGUuc2V0KG51bGwpO1xuICAgIHRoaXMuYWN0aXZlU3RhZ2VDb2RlLnNldChudWxsKTtcbiAgICB0aGlzLmFjdGl2ZVN0YWdlRGF0YSA9IHt9O1xuICB9XG5cbiAgLy8gQWRkIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzYXZpbmcgc3RhZ2UgZGF0YVxuICBvblN0YWdlRGlhbG9nU2F2ZWQoc3RhZ2VEYXRhOiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlU3RhZ2VJZCkge1xuICAgICAgLy8gRWRpdGluZyBhbiBleGlzdGluZyBzdGFnZVxuICAgICAgY29uc3Qgbm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZCh0aGlzLmFjdGl2ZVN0YWdlSWQpO1xuICAgICAgaWYgKG5vZGVJbmZvKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RhZ2UgZGF0YVxuICAgICAgICBub2RlSW5mby5ub2RlLnN0YWdlRGF0YSA9IHtcbiAgICAgICAgICAuLi5ub2RlSW5mby5ub2RlLnN0YWdlRGF0YSxcbiAgICAgICAgICAuLi5zdGFnZURhdGEsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnNvbGUubG9nKCdVcGRhdGVkIHN0YWdlIGRhdGE6Jywgbm9kZUluZm8ubm9kZS5zdGFnZURhdGEpO1xuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHBhcmVudCBjb21wb25lbnQgdG8ga25vdyBhYm91dCB0aGUgdXBkYXRlXG4gICAgICAgIHRoaXMuc3RhZ2VQcm9wZXJ0aWVzVXBkYXRlZC5lbWl0KHtcbiAgICAgICAgICBub2RlSWQ6IHRoaXMuYWN0aXZlU3RhZ2VJZCxcbiAgICAgICAgICBzdGFnZURhdGE6IG5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbG9zZSB0aGUgZGlhbG9nXG4gICAgdGhpcy5vblN0YWdlRGlhbG9nQ2xvc2VkKCk7XG4gIH1cblxuICBvbkFjdGlvbkRpYWxvZ1NhdmVkKGFjdGlvbkRhdGE6IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVBY3Rpb25JZCkge1xuICAgICAgLy8gRWRpdGluZyBhbiBleGlzdGluZyBzdGFnZVxuICAgICAgLy8gbGV0IGNvbm5lY3Rpb25JbmZvID0gdGhpcy5zdGF0ZS5maW5kQWN0aW9uQnlJZCh0aGlzLmFjdGl2ZUFjdGlvbklkKTtcbiAgICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMgPSB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLm1hcCgoY29ubmVjdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgPT09IHRoaXMuYWN0aXZlQWN0aW9uSWQpIHtcbiAgICAgICAgICBjb25uZWN0aW9uLmxhYmVsID0gYWN0aW9uRGF0YS5sYWJlbDtcbiAgICAgICAgICBjb25uZWN0aW9uLmFjdGlvbiA9IGFjdGlvbkRhdGEuYWN0aW9uO1xuICAgICAgICAgIGNvbm5lY3Rpb24udGFyZ2V0U3RhdHVzID0gYWN0aW9uRGF0YS50YXJnZXRTdGF0dXM7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZWQgYWN0aW9uIGRhdGE6JywgY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIENsb3NlIHRoZSBkaWFsb2dcbiAgICB0aGlzLm9uQWN0aW9uRGlhbG9nQ2xvc2VkKCk7XG4gIH1cblxuICB1cGRhdGVDYW52YXNTaXplKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcXVpcmVkSGVpZ2h0ID1cbiAgICAgICh0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGggKyAxKSAqIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG4gICAgdGhpcy5jYW52YXNIZWlnaHQgPSBNYXRoLm1heCgyMDAwLCByZXF1aXJlZEhlaWdodCk7IC8vIEVuc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG91ciBkZWZhdWx0IGhlaWdodFxuXG4gICAgLy8gVXBkYXRlIGFsbCB0aGUgc3dpbWxhbmUgY2xpcCBwYXRocyB3aGVuIHNpemUgY2hhbmdlc1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXMuZm9yRWFjaCgoc3dpbWxhbmUsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNsaXBQYXRoSWQgPSBgc3dpbWxhbmUtY2xpcC0ke2luZGV4fWA7XG4gICAgICAgIGNvbnN0IGNsaXBQYXRoRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNsaXBQYXRoSWQpO1xuICAgICAgICBpZiAoY2xpcFBhdGhFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcmVjdEVsZW1lbnQgPSBjbGlwUGF0aEVsZW1lbnQucXVlcnlTZWxlY3RvcigncmVjdCcpO1xuICAgICAgICAgIGlmIChyZWN0RWxlbWVudCkge1xuICAgICAgICAgICAgcmVjdEVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMuY2FudmFzV2lkdGgudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgU1ZHIGNhbnZhc1xuICBwcml2YXRlIGdldE1vdXNlUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIC8vIFVzZSBjbGllbnRYL1kgYW5kIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGZvciBjcm9zcy1icm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCByZWN0ID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCxcbiAgICAgIHk6IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCxcbiAgICB9O1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIG1vdXNlIHBvc2l0aW9uIGZvciB2aWV3cG9ydC1iYXNlZCBwb3B1cHNcbiAgLy8gVGhpcyBhY2NvdW50cyBmb3IgY2FudmFzIHNjcm9sbCBwb3NpdGlvblxuICBwcml2YXRlIGdldFZpZXdwb3J0UG9zaXRpb24oY2FudmFzWDogbnVtYmVyLCBjYW52YXNZOiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHBhcmVudEVsZW1lbnQ/LnNjcm9sbExlZnQgfHwgMDtcbiAgICBjb25zdCBzY3JvbGxUb3AgPSBwYXJlbnRFbGVtZW50Py5zY3JvbGxUb3AgfHwgMDtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiBjYW52YXNYIC0gc2Nyb2xsTGVmdCxcbiAgICAgIHk6IGNhbnZhc1kgLSBzY3JvbGxUb3AsXG4gICAgfTtcbiAgfVxuXG4gIHNob3dDb25uZWN0aW9uUG9pbnRzKG5vZGVJZDogc3RyaW5nLCBzd2ltbGFuZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID0gbm9kZUlkO1xuICB9XG5cbiAgaXNNb3VzZU92ZXJOb2RlKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIG5vZGU6IFdGTm9kZSxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuICAgIGNvbnN0IG5vZGVCb3VuZHMgPSB0aGlzLmdldE5vZGVCb3VuZHNXaXRoUGFkZGluZyhub2RlLCBzd2ltbGFuZUluZGV4KTtcblxuICAgIHJldHVybiAoXG4gICAgICBwb3NpdGlvbi54ID49IG5vZGVCb3VuZHMueCAmJlxuICAgICAgcG9zaXRpb24ueCA8PSBub2RlQm91bmRzLnggKyBub2RlQm91bmRzLndpZHRoICYmXG4gICAgICBwb3NpdGlvbi55ID49IG5vZGVCb3VuZHMueSAmJlxuICAgICAgcG9zaXRpb24ueSA8PSBub2RlQm91bmRzLnkgKyBub2RlQm91bmRzLmhlaWdodFxuICAgICk7XG4gIH1cblxuICAvLyBoZWxwZXIgbWV0aG9kIHRvIGNhbGN1bGF0ZSBub2RlIGJvdW5kcyB3aXRoIHBhZGRpbmdcbiAgZ2V0Tm9kZUJvdW5kc1dpdGhQYWRkaW5nKFxuICAgIG5vZGU6IFdGTm9kZSxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgcGFkZGluZyA9IDEwOyAvLyBBZGQgMTBweCBwYWRkaW5nIGFyb3VuZCBub2RlcyBmb3IgZWFzaWVyIGhvdmVyIGRldGVjdGlvblxuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBhYnNvbHV0ZSBZIHBvc2l0aW9uIGluY2x1ZGluZyBzd2ltbGFuZSBvZmZzZXRcbiAgICBjb25zdCBhYnNvbHV0ZVkgPSBub2RlLnkgKyBzd2ltbGFuZUluZGV4ICogMjYzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IG5vZGUueCAtIHBhZGRpbmcsXG4gICAgICB5OiBhYnNvbHV0ZVkgLSBwYWRkaW5nLFxuICAgICAgd2lkdGg6IG5vZGUud2lkdGggKyBwYWRkaW5nICogMixcbiAgICAgIGhlaWdodDogbm9kZS5oZWlnaHQgKyBwYWRkaW5nICogMixcbiAgICB9O1xuICB9XG5cbiAgaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID09PSBub2RlSWQgJiZcbiAgICAgICF0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKClcbiAgICApIHtcbiAgICAgIHRoaXMudmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGlzQ29ubmVjdGlvblBvaW50VmlzaWJsZShub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID09PSBub2RlSWQ7XG4gIH1cblxuICBzdGFydENvbm5lY3Rpb25EcmFnKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIHBvaW50OiBDb25uZWN0aW9uUG9pbnQsXG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGV4aXQgcG9pbnQgbm9kZVxuICAgIGNvbnN0IG5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQocG9pbnQubm9kZUlkKTtcbiAgICBpZiAoXG4gICAgICBub2RlSW5mbyAmJlxuICAgICAgbm9kZUluZm8ubm9kZS50eXBlID09PSAnc3RhZ2UnICYmXG4gICAgICBub2RlSW5mby5ub2RlLnN0YWdlRGF0YT8uSXNFeGl0UG9pbnRcbiAgICApIHtcbiAgICAgIC8vIERvbid0IGFsbG93IGNvbm5lY3Rpb25zIGZyb20gZXhpdCBwb2ludHNcbiAgICAgIGNvbnNvbGUubG9nKCdDYW5ub3QgY3JlYXRlIGNvbm5lY3Rpb25zIGZyb20gZXhpdCBwb2ludHMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgdGhpcy5zdGF0ZS5zdGFydENvbm5lY3Rpb25EcmFnKFxuICAgICAgcG9pbnQsXG4gICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgcG9zaXRpb24ueCxcbiAgICAgIHBvc2l0aW9uLnlcbiAgICApO1xuXG4gICAgLy8gQWRkIG1vdXNlIG1vdmUgYW5kIG1vdXNlIHVwIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgZG9jdW1lbnRcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICB9XG5cbiAgaGlnaGxpZ2h0UG90ZW50aWFsVGFyZ2V0cyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKSByZXR1cm47XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc3QgdGFyZ2V0UG9pbnRJbmZvID0gdGhpcy5maW5kQ29ubmVjdGlvblBvaW50QXRQb3NpdGlvbihcbiAgICAgIHBvc2l0aW9uLngsXG4gICAgICBwb3NpdGlvbi55XG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldFBvaW50SW5mbyAmJlxuICAgICAgdGFyZ2V0UG9pbnRJbmZvLnBvaW50LmlkICE9PSB0aGlzLnBvdGVudGlhbFRhcmdldFBvaW50SWRcbiAgICApIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBuZXcgdGFyZ2V0IHBvaW50XG4gICAgICB0aGlzLnBvdGVudGlhbFRhcmdldFBvaW50SWQgPSB0YXJnZXRQb2ludEluZm8ucG9pbnQuaWQ7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0UG9pbnRJbmZvICYmIHRoaXMucG90ZW50aWFsVGFyZ2V0UG9pbnRJZCkge1xuICAgICAgLy8gV2UncmUgbm8gbG9uZ2VyIG92ZXIgYSB0YXJnZXQgcG9pbnRcbiAgICAgIHRoaXMucG90ZW50aWFsVGFyZ2V0UG9pbnRJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIE5vZGUgZHJhZyBsb2dpY1xuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ2FsbGVkIGZyb20gdGhlIHRlbXBsYXRlIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgbW91c2UgYnV0dG9uIG9uIGEgbm9kZS5cbiAgICogU3RhcnRzIHRoZSBkcmFnIGludGVyYWN0aW9uIGFuZCByZWdpc3RlcnMgZG9jdW1lbnQtbGV2ZWwgbGlzdGVuZXJzIHNvIHRoZVxuICAgKiBkcmFnIGNvbnRpbnVlcyBldmVuIHdoZW4gdGhlIGN1cnNvciBsZWF2ZXMgdGhlIFNWRyBjYW52YXMuXG4gICAqL1xuICBvbk5vZGVNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIG5vZGU6IE5vZGUsIHN3aW1sYW5lSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIERvIG5vdCBpbnRlcmZlcmUgd2l0aCBjb25uZWN0aW9uIGRyYWdnaW5nIG9yIG9wZW4gcG9wdXBzXG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpIHx8XG4gICAgICB0aGlzLnBvcHVwVmlzaWJsZSB8fFxuICAgICAgdGhpcy5zaG93U3RhcnROb2RlRm9ybVBvcHVwIHx8XG4gICAgICB0aGlzLnNob3dTdWJmbG93UG9wdXBcbiAgICApIHJldHVybjtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBQcmV2ZW50IG9uQ2FudmFzQ2xpY2sgZnJvbSBmaXJpbmdcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuICAgIC8vIFRlbXBsYXRlIGZvcm11bGE6IGFic29sdXRlU1ZHWSA9IG5vZGUueSArIHN3aW1sYW5lLm9yZGVyICogMjYzXG4gICAgY29uc3QgYWJzb2x1dGVOb2RlWSA9IG5vZGUueSArIHN3aW1sYW5lSW5kZXggKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuXG4gICAgdGhpcy5pc0RyYWdnaW5nTm9kZSA9IHRydWU7XG4gICAgdGhpcy5kcmFnZ2luZ05vZGUgPSBub2RlO1xuICAgIHRoaXMuZHJhZ2dpbmdOb2RlU3dpbWxhbmVJbmRleCA9IHN3aW1sYW5lSW5kZXg7XG4gICAgLy8gU3RvcmUgdGhlIG9mZnNldCBmcm9tIHRoZSBub2RlJ3MgdG9wLWxlZnQgc28gdGhlIG5vZGUgZG9lc24ndCBqdW1wXG4gICAgdGhpcy5kcmFnT2Zmc2V0WCA9IHBvc2l0aW9uLnggLSBub2RlLng7XG4gICAgdGhpcy5kcmFnT2Zmc2V0WSA9IHBvc2l0aW9uLnkgLSBhYnNvbHV0ZU5vZGVZO1xuXG4gICAgLy8gU2VlZCBwZW5kaW5nIHZhbHVlcyB3aXRoIHRoZSBub2RlJ3MgQ1VSUkVOVCBwb3NpdGlvbiBzbyB0aGF0IGEgcGxhaW5cbiAgICAvLyBjbGljayAobm8gbW91c2Vtb3ZlKSBsZWF2ZXMgbm9kZS55IHVuY2hhbmdlZCBpbiBvbk5vZGVEcmFnRW5kLlxuICAgIHRoaXMuX3BlbmRpbmdBYnNvbHV0ZVkgPSBhYnNvbHV0ZU5vZGVZO1xuICAgIHRoaXMuX3BlbmRpbmdUYXJnZXRTd2ltbGFuZUluZGV4ID0gc3dpbWxhbmVJbmRleDtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Ob2RlRHJhZ01vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTm9kZURyYWdFbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFycm93IGZ1bmN0aW9uIChwcmVzZXJ2ZXMgYHRoaXNgKSDigJQgcnVucyBvbiBldmVyeSBtb3VzZW1vdmUgd2hpbGUgZHJhZ2dpbmdcbiAgICogYSBub2RlLiAgVXBkYXRlcyBub2RlLnggLyBub2RlLnkgaW4tcGxhY2Ugc28gQW5ndWxhcidzIGNoYW5nZSBkZXRlY3Rpb25cbiAgICogcGlja3MgaXQgdXAgYW5kIHJlZHJhd3MgdGhlIG5vZGUgYW5kIGFsbCBjb25uZWN0ZWQgcGF0aHMgYXV0b21hdGljYWxseS5cbiAgICovXG4gIG9uTm9kZURyYWdNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmdOb2RlIHx8ICF0aGlzLmRyYWdnaW5nTm9kZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuXG4gICAgLy8gUmF3IGRlc2lyZWQgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIG5vZGUgdG9wLWxlZnRcbiAgICBjb25zdCByYXdBYnNvbHV0ZVggPSBwb3NpdGlvbi54IC0gdGhpcy5kcmFnT2Zmc2V0WDtcbiAgICBjb25zdCByYXdBYnNvbHV0ZVkgPSBwb3NpdGlvbi55IC0gdGhpcy5kcmFnT2Zmc2V0WTtcblxuICAgIC8vIERldGVybWluZSB3aGljaCBzd2ltbGFuZSB0aGUgbm9kZSBpcyBiZWluZyBkcmFnZ2VkIGludG8gIChieSBjdXJzb3IgWSlcbiAgICBsZXQgdGFyZ2V0U3dpbWxhbmVJbmRleCA9IE1hdGguZmxvb3IocG9zaXRpb24ueSAvIHRoaXMuc3dpbWxhbmVIZWlnaHQpO1xuICAgIHRhcmdldFN3aW1sYW5lSW5kZXggPSBNYXRoLm1heChcbiAgICAgIDAsXG4gICAgICBNYXRoLm1pbih0YXJnZXRTd2ltbGFuZUluZGV4LCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGggLSAxKVxuICAgICk7XG5cbiAgICBjb25zdCBzd2ltbGFuZVRvcFkgPSB0YXJnZXRTd2ltbGFuZUluZGV4ICogdGhpcy5zd2ltbGFuZUhlaWdodDtcbiAgICBjb25zdCBzd2ltbGFuZUJvdHRvbVkgPSBzd2ltbGFuZVRvcFkgKyB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuICAgIGNvbnN0IHBhZGRpbmcgPSA1O1xuXG4gICAgLy8gWDoga2VlcCBub2RlIGZ1bGx5IG9uIGNhbnZhcyAobm8gbGVmdC9yaWdodCBib3VuZGFyeSBuZWVkZWQgZm9yIHN3aW1sYW5lcylcbiAgICBjb25zdCBuZXdBYnNvbHV0ZVggPSBNYXRoLm1heChwYWRkaW5nLCByYXdBYnNvbHV0ZVgpO1xuXG4gICAgLy8gWTogY2xhbXAgc28gdGhlIG5vZGUgc3RheXMgaW5zaWRlIHRoZSB0YXJnZXRlZCBzd2ltbGFuZVxuICAgIGxldCBuZXdBYnNvbHV0ZVkgPSByYXdBYnNvbHV0ZVk7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZHJhZ2dpbmdOb2RlO1xuICAgIGlmIChuZXdBYnNvbHV0ZVkgPCBzd2ltbGFuZVRvcFkgKyBwYWRkaW5nKSB7XG4gICAgICBuZXdBYnNvbHV0ZVkgPSBzd2ltbGFuZVRvcFkgKyBwYWRkaW5nO1xuICAgIH0gZWxzZSBpZiAobmV3QWJzb2x1dGVZICsgbm9kZS5oZWlnaHQgPiBzd2ltbGFuZUJvdHRvbVkgLSBwYWRkaW5nKSB7XG4gICAgICBuZXdBYnNvbHV0ZVkgPSBzd2ltbGFuZUJvdHRvbVkgLSBub2RlLmhlaWdodCAtIHBhZGRpbmc7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBhYnNvbHV0ZSBZIHRvIHN3aW1sYW5lLXJlbGF0aXZlIFkgZm9yIHN0b3JhZ2VcbiAgICBjb25zdCBuZXdSZWxhdGl2ZVkgPSBuZXdBYnNvbHV0ZVkgLSB0YXJnZXRTd2ltbGFuZUluZGV4ICogdGhpcy5zd2ltbGFuZUhlaWdodDtcblxuICAgIC8vIExpdmUgcHJldmlldzogdXBkYXRlIHBvc2l0aW9uIGRpcmVjdGx5LlxuICAgIC8vIFRlbXBsYXRlIGZvcm11bGE6IGFic29sdXRlU1ZHWSA9IG5vZGUueSArIHN3aW1sYW5lLm9yZGVyICogMjYzXG4gICAgLy8gPT4gbm9kZS55ID0gYWJzb2x1dGVZIC0gc3dpbWxhbmUub3JkZXIgKiAyNjMgIChzd2ltbGFuZS1yZWxhdGl2ZSlcbiAgICAvLyBUaGUgbm9kZSBpcyBTVElMTCBpbiB0aGUgc291cmNlIHN3aW1sYW5lJ3MgYXJyYXkgZHVyaW5nIHByZXZpZXcsXG4gICAgLy8gc28gc3dpbWxhbmUub3JkZXIgPSBkcmFnZ2luZ05vZGVTd2ltbGFuZUluZGV4LlxuICAgIG5vZGUueCA9IG5ld0Fic29sdXRlWDtcbiAgICBub2RlLnkgPSBuZXdBYnNvbHV0ZVkgLSB0aGlzLmRyYWdnaW5nTm9kZVN3aW1sYW5lSW5kZXggKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuXG4gICAgLy8gU3RvcmUgY29tcHV0ZWQgdmFsdWVzIGZvciBvbk5vZGVEcmFnRW5kXG4gICAgdGhpcy5fcGVuZGluZ1RhcmdldFN3aW1sYW5lSW5kZXggPSB0YXJnZXRTd2ltbGFuZUluZGV4O1xuICAgIHRoaXMuX3BlbmRpbmdBYnNvbHV0ZVkgPSBuZXdBYnNvbHV0ZVk7XG4gIH07XG5cbiAgLyoqIFNjcmF0Y2ggZmllbGRzIHVzZWQgdG8gcGFzcyBjb21wdXRlZCB2YWx1ZXMgZnJvbSBtb3ZlIOKGkiBlbmQgaGFuZGxlcnMuICovXG4gIHByaXZhdGUgX3BlbmRpbmdUYXJnZXRTd2ltbGFuZUluZGV4ID0gLTE7XG4gIHByaXZhdGUgX3BlbmRpbmdBYnNvbHV0ZVkgPSAwO1xuXG4gIC8qKlxuICAgKiBBcnJvdyBmdW5jdGlvbiAocHJlc2VydmVzIGB0aGlzYCkg4oCUIGZpcmVzIG9uIG1vdXNldXAgYWZ0ZXIgYSBub2RlIGRyYWcuXG4gICAqIEZpbmFsaXNlcyB0aGUgbm9kZSBwb3NpdGlvbiBhbmQgcGVyZm9ybXMgc3dpbWxhbmUgbWlncmF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIG9uTm9kZURyYWdFbmQgPSAoX2V2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk5vZGVEcmFnTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Ob2RlRHJhZ0VuZCk7XG5cbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ05vZGUgfHwgIXRoaXMuZHJhZ2dpbmdOb2RlKSB7XG4gICAgICB0aGlzLmlzRHJhZ2dpbmdOb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLmRyYWdnaW5nTm9kZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZHJhZ2dpbmdOb2RlO1xuICAgIGNvbnN0IGZyb21JbmRleCA9IHRoaXMuZHJhZ2dpbmdOb2RlU3dpbWxhbmVJbmRleDtcbiAgICBjb25zdCB0b0luZGV4ID0gdGhpcy5fcGVuZGluZ1RhcmdldFN3aW1sYW5lSW5kZXggIT09IC0xXG4gICAgICA/IHRoaXMuX3BlbmRpbmdUYXJnZXRTd2ltbGFuZUluZGV4XG4gICAgICA6IGZyb21JbmRleDtcbiAgICBjb25zdCBhYnNvbHV0ZVkgPSB0aGlzLl9wZW5kaW5nQWJzb2x1dGVZO1xuXG4gICAgaWYgKGZyb21JbmRleCAhPT0gdG9JbmRleCkge1xuICAgICAgLy8gQ3Jvc3Mtc3dpbWxhbmUgZHJvcDogc3RhdGUgaGVscGVyIG1vdmVzIG5vZGUgYmV0d2VlbiBhcnJheXMsXG4gICAgICAvLyB1cGRhdGVzIGNvbm5lY3Rpb25zLCBhbmQgc3luY3MgdGFncy4gSXQgYWxzbyBzZXRzIG5vZGUueSBjb3JyZWN0bHkuXG4gICAgICB0aGlzLnN0YXRlLm1vdmVOb2RlVG9Td2ltbGFuZShub2RlLmlkLCBmcm9tSW5kZXgsIHRvSW5kZXgsIG5vZGUueCwgYWJzb2x1dGVZKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2FtZSBzd2ltbGFuZTogbm9kZS55ID0gYWJzb2x1dGVZIC0gc3dpbWxhbmUub3JkZXIgKiAyNjMgKHN3aW1sYW5lLXJlbGF0aXZlKVxuICAgICAgbm9kZS55ID0gYWJzb2x1dGVZIC0gZnJvbUluZGV4ICogdGhpcy5zd2ltbGFuZUhlaWdodDtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBkcmFnIHN0YXRlXG4gICAgdGhpcy5pc0RyYWdnaW5nTm9kZSA9IGZhbHNlO1xuICAgIHRoaXMuZHJhZ2dpbmdOb2RlID0gbnVsbDtcbiAgICB0aGlzLmRyYWdnaW5nTm9kZVN3aW1sYW5lSW5kZXggPSAtMTtcbiAgICB0aGlzLmRyYWdPZmZzZXRYID0gMDtcbiAgICB0aGlzLmRyYWdPZmZzZXRZID0gMDtcbiAgICB0aGlzLl9wZW5kaW5nVGFyZ2V0U3dpbWxhbmVJbmRleCA9IC0xO1xuICAgIHRoaXMuX3BlbmRpbmdBYnNvbHV0ZVkgPSAwO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgQ1NTIGN1cnNvciB2YWx1ZSBmb3IgdGhlIG5vZGUgcmVuZGVyaW5nLlxuICAgKiBTaG93cyAnZ3JhYmJpbmcnIHdoaWxlIHRoZSBub2RlIGlzIGJlaW5nIGRyYWdnZWQsICdncmFiJyBvdGhlcndpc2UuXG4gICAqL1xuICBnZXRDdXJzb3JGb3JOb2RlKG5vZGVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0RyYWdnaW5nTm9kZSAmJiB0aGlzLmRyYWdnaW5nTm9kZT8uaWQgPT09IG5vZGVJZCA/ICdncmFiYmluZycgOiAnZ3JhYic7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gQ29ubmVjdGlvbiBkcmFnIGxvZ2ljIChleGlzdGluZylcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLy8gVXNlIGFycm93IGZ1bmN0aW9ucyB0byBwcmVzZXJ2ZSAndGhpcycgY29udGV4dFxuICBvbk1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb25EcmFnKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuICAgIHRoaXMuaGlnaGxpZ2h0UG90ZW50aWFsVGFyZ2V0cyhldmVudCk7XG4gIH07XG5cbiAgdXBkYXRlQ29ubmVjdGlvbkRyYWcoY3VycmVudFg6IG51bWJlciwgY3VycmVudFk6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQpIHtcbiAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5jdXJyZW50WCA9IGN1cnJlbnRYO1xuICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLmN1cnJlbnRZID0gY3VycmVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB3aGljaCBzd2ltbGFuZSB0aGUgY3Vyc29yIGlzIG92ZXJcbiAgICAgIGNvbnN0IHN3aW1sYW5lSW5kZXggPSBNYXRoLmZsb29yKGN1cnJlbnRZIC8gdGhpcy5zd2ltbGFuZUhlaWdodCk7XG4gICAgICBpZiAoc3dpbWxhbmVJbmRleCA+PSAwICYmIHN3aW1sYW5lSW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gRW5zdXJlIHRoZSB0YXJnZXQgc3dpbWxhbmUgaXMgZnVsbHkgdmlzaWJsZVxuICAgICAgICB0aGlzLmVuc3VyZVN3aW1sYW5lSW5WaWV3KHN3aW1sYW5lSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uTW91c2VVcCA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc29sZS5sb2coJ01vdXNlIHVwIGF0IHBvc2l0aW9uOicsIHBvc2l0aW9uKTtcbiAgICBjb25zb2xlLmxvZygnSXMgY29ubmVjdGlvbiBkcmFnZ2luZzonLCB0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpO1xuXG4gICAgLy8gT25seSBwcm9jZWVkIGlmIHdlIGFyZSBkcmFnZ2luZyBhIGNvbm5lY3Rpb25cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGRyb3BwaW5nIG9udG8gYSBjb25uZWN0aW9uIHBvaW50XG4gICAgY29uc3QgdGFyZ2V0UG9pbnRJbmZvID0gdGhpcy5maW5kQ29ubmVjdGlvblBvaW50QXRQb3NpdGlvbihcbiAgICAgIHBvc2l0aW9uLngsXG4gICAgICBwb3NpdGlvbi55XG4gICAgKTtcblxuICAgIGlmICh0YXJnZXRQb2ludEluZm8pIHtcbiAgICAgIC8vIFdlIGZvdW5kIGEgdGFyZ2V0IGNvbm5lY3Rpb24gcG9pbnRcbiAgICAgIGNvbnNvbGUubG9nKCdGb3VuZCB0YXJnZXQgY29ubmVjdGlvbiBwb2ludDonLCB0YXJnZXRQb2ludEluZm8pO1xuXG4gICAgICAvLyBHZXQgdGhlIHNvdXJjZSBwb2ludCBhbmQgc3dpbWxhbmUgaW5kZXhcbiAgICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50O1xuICAgICAgY29uc3Qgc291cmNlU3dpbWxhbmVJbmRleCA9XG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VTd2ltbGFuZUluZGV4O1xuXG4gICAgICBpZiAoc291cmNlUG9pbnQgJiYgc291cmNlU3dpbWxhbmVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFByZXZlbnQgY29ubmVjdGluZyBhIG5vZGUgdG8gaXRzZWxmXG4gICAgICAgIGlmIChzb3VyY2VQb2ludC5ub2RlSWQgIT09IHRhcmdldFBvaW50SW5mby5ub2RlSWQpIHtcbiAgICAgICAgICAvLyBHZXQgc291cmNlIGFuZCB0YXJnZXQgbm9kZSB0eXBlcyB0byBjaGVjayBpZiBjb25uZWN0aW9uIGlzIGFsbG93ZWRcbiAgICAgICAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKHNvdXJjZVBvaW50Lm5vZGVJZCk7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChcbiAgICAgICAgICAgIHRhcmdldFBvaW50SW5mby5ub2RlSWRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc291cmNlTm9kZUluZm8gJiZcbiAgICAgICAgICAgIHRhcmdldE5vZGVJbmZvICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmNhbkNvbm5lY3QoXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJbmZvLm5vZGUudHlwZSxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUluZm8ubm9kZS50eXBlXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgICAgICAgIGlkOiBgY29ubi0ke0RhdGUubm93KCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCl9YCxcbiAgICAgICAgICAgICAgc291cmNlTm9kZUlkOiBzb3VyY2VQb2ludC5ub2RlSWQsXG4gICAgICAgICAgICAgIHRhcmdldE5vZGVJZDogdGFyZ2V0UG9pbnRJbmZvLm5vZGVJZCxcbiAgICAgICAgICAgICAgc291cmNlUG9pbnRJZDogc291cmNlUG9pbnQuaWQsXG4gICAgICAgICAgICAgIHRhcmdldFBvaW50SWQ6IHRhcmdldFBvaW50SW5mby5wb2ludC5pZCxcbiAgICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogc291cmNlU3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogdGFyZ2V0UG9pbnRJbmZvLnN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICAgICAgYWN0aW9uOiBudWxsLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gQWRkIHRvIGNvbm5lY3Rpb25zIGFycmF5XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlZCBkaXJlY3QgY29ubmVjdGlvbiBiZXR3ZWVuIG5vZGVzOicsIGNvbm5lY3Rpb24pO1xuXG4gICAgICAgICAgICAvLyBOb3RpZnkgYWJvdXQgY29ubmVjdGlvbiBjcmVhdGlvblxuICAgICAgICAgICAgdGhpcy5vbkNvbm5lY3Rpb25DcmVhdGVkKGNvbm5lY3Rpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgJ0Nhbm5vdCBjb25uZWN0IHRoZXNlIG5vZGUgdHlwZXM6JyxcbiAgICAgICAgICAgICAgc291cmNlTm9kZUluZm8/Lm5vZGUudHlwZSxcbiAgICAgICAgICAgICAgJy0+JyxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUluZm8/Lm5vZGUudHlwZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Nhbm5vdCBjb25uZWN0IGEgbm9kZSB0byBpdHNlbGYnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFbmQgdGhlIGNvbm5lY3Rpb24gZHJhZ1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBwb3NpdGlvbiBpcyB3aXRoaW4gYW55IHN3aW1sYW5lXG4gICAgY29uc3QgaXNJbnNpZGVTd2ltbGFuZSA9IHRoaXMuaXNQb3NpdGlvbkluc2lkZVN3aW1sYW5lKHBvc2l0aW9uLnkpO1xuICAgIGNvbnNvbGUubG9nKCdJcyBpbnNpZGUgc3dpbWxhbmU6JywgaXNJbnNpZGVTd2ltbGFuZSk7XG5cbiAgICAvLyBPbmx5IHNob3cgcG9wdXAgaWYgd2l0aGluIGEgc3dpbWxhbmVcbiAgICBpZiAoaXNJbnNpZGVTd2ltbGFuZSAmJiB0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdTaG93aW5nIGNvbm5lY3Rpb24gcG9wdXAnKTtcbiAgICAgIHRoaXMuc2hvd0Nvbm5lY3Rpb25Qb3B1cChwb3NpdGlvbi54LCBwb3NpdGlvbi55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW5kIHRoZSBjb25uZWN0aW9uIGRyYWcgaWYgb3V0c2lkZSBhIHN3aW1sYW5lXG4gICAgICBjb25zb2xlLmxvZygnRW5kaW5nIGNvbm5lY3Rpb24gZHJhZyB3aXRob3V0IHNob3dpbmcgcG9wdXAnKTtcbiAgICAgIHRoaXMuc3RhdGUuZW5kQ29ubmVjdGlvbkRyYWcoKTtcbiAgICB9XG4gIH07XG5cbiAgZmluZENvbm5lY3Rpb25Qb2ludEF0UG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB0b2xlcmFuY2U6IG51bWJlciA9IDEwXG4gICk6IHtcbiAgICBwb2ludDogQ29ubmVjdGlvblBvaW50O1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlcjtcbiAgfSB8IG51bGwge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgc3dpbWxhbmVzIGFuZCBub2RlcyB0byBmaW5kIGNvbm5lY3Rpb24gcG9pbnRzXG4gICAgZm9yIChcbiAgICAgIGxldCBzd2ltbGFuZUluZGV4ID0gMDtcbiAgICAgIHN3aW1sYW5lSW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGg7XG4gICAgICBzd2ltbGFuZUluZGV4KytcbiAgICApIHtcbiAgICAgIGNvbnN0IHN3aW1sYW5lID0gdGhpcy5zdGF0ZS5zd2ltbGFuZXNbc3dpbWxhbmVJbmRleF07XG5cbiAgICAgIGlmICghc3dpbWxhbmUubm9kZXMpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygc3dpbWxhbmUubm9kZXMpIHtcbiAgICAgICAgaWYgKCFub2RlLmNvbm5lY3Rpb25Qb2ludHMpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIG5vZGUgKGluY2x1ZGluZyBzd2ltbGFuZSBvZmZzZXQpXG4gICAgICAgIGNvbnN0IGFic29sdXRlTm9kZVggPSBub2RlLng7XG4gICAgICAgIGNvbnN0IGFic29sdXRlTm9kZVkgPSBub2RlLnkgKyBzd2ltbGFuZUluZGV4ICogdGhpcy5zd2ltbGFuZUhlaWdodDtcblxuICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIG5vZGUuY29ubmVjdGlvblBvaW50cykge1xuICAgICAgICAgIC8vIENhbGN1bGF0ZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgY29ubmVjdGlvbiBwb2ludFxuICAgICAgICAgIGNvbnN0IHBvaW50WCA9IGFic29sdXRlTm9kZVggKyBwb2ludC54O1xuICAgICAgICAgIGNvbnN0IHBvaW50WSA9IGFic29sdXRlTm9kZVkgKyBwb2ludC55O1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIHdpdGhpbiB0b2xlcmFuY2Ugb2YgdGhpcyBwb2ludFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIE1hdGguYWJzKHggLSBwb2ludFgpIDw9IHRvbGVyYW5jZSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoeSAtIHBvaW50WSkgPD0gdG9sZXJhbmNlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBwb2ludDogcG9pbnQsXG4gICAgICAgICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICAgICAgc3dpbWxhbmVJbmRleDogc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpc1Bvc2l0aW9uSW5zaWRlU3dpbWxhbmUoeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgeSBwb3NpdGlvbiBpcyB3aXRoaW4gYW55IHN3aW1sYW5lXG4gICAgY29uc3Qgc3dpbWxhbmVDb3VudCA9IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aDtcbiAgICBpZiAoc3dpbWxhbmVDb3VudCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gRWFjaCBzd2ltbGFuZSBoYXMgYSBoZWlnaHQgb2YgMjYzcHhcbiAgICBjb25zdCB0b3RhbFN3aW1sYW5lSGVpZ2h0ID0gc3dpbWxhbmVDb3VudCAqIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG5cbiAgICAvLyBDaGVjayBpZiB5IGlzIHdpdGhpbiB0aGUgdG90YWwgaGVpZ2h0IG9mIGFsbCBzd2ltbGFuZXNcbiAgICByZXR1cm4geSA+PSAwICYmIHkgPCB0b3RhbFN3aW1sYW5lSGVpZ2h0O1xuICB9XG5cbiAgc2hvd0Nvbm5lY3Rpb25Qb3B1cCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTaG93aW5nIGNvbm5lY3Rpb24gcG9wdXAgYXQ6JywgeCwgeSk7XG5cbiAgICAvLyBDb252ZXJ0IGNhbnZhcyBjb29yZGluYXRlcyB0byB2aWV3cG9ydCBjb29yZGluYXRlcyBmb3IgcG9wdXAgcG9zaXRpb25pbmdcbiAgICBjb25zdCB2aWV3cG9ydFBvcyA9IHRoaXMuZ2V0Vmlld3BvcnRQb3NpdGlvbih4LCB5KTtcbiAgICB0aGlzLnBvcHVwWCA9IHZpZXdwb3J0UG9zLng7XG4gICAgdGhpcy5wb3B1cFkgPSB2aWV3cG9ydFBvcy55O1xuXG4gICAgLy8gR2V0IGFsbG93ZWQgbm9kZSB0eXBlcyBiYXNlZCBvbiB0aGUgc291cmNlIG5vZGUgdHlwZVxuICAgIHRoaXMuYWxsb3dlZE5vZGVUeXBlcyA9IHRoaXMuc3RhdGUuZ2V0QWxsb3dlZFRhcmdldE5vZGVUeXBlcygpO1xuICAgIGNvbnNvbGUubG9nKCdBbGxvd2VkIG5vZGUgdHlwZXM6JywgdGhpcy5hbGxvd2VkTm9kZVR5cGVzKTtcblxuICAgIC8vIE9ubHkgc2hvdyB0aGUgcG9wdXAgaWYgd2UgaGF2ZSBhbGxvd2VkIG5vZGUgdHlwZXNcbiAgICBpZiAodGhpcy5hbGxvd2VkTm9kZVR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucG9wdXBWaXNpYmxlID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdQb3B1cCB2aXNpYmlsaXR5IHNldCB0byB0cnVlJyk7XG5cbiAgICAgIC8vIEZvcmNlIHRoZSBwb3B1cCB0byBiZSB2aXNpYmxlIGluIHRoZSBuZXh0IHRpY2tcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnSXMgcG9wdXAgdmlzaWJsZSBpbiBuZXh0IHRpY2s6JywgdGhpcy5wb3B1cFZpc2libGUpO1xuICAgICAgfSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGFsbG93ZWQgbm9kZSB0eXBlcywganVzdCBlbmQgdGhlIGRyYWdcbiAgICAgIGNvbnNvbGUubG9nKCdObyBhbGxvd2VkIG5vZGUgdHlwZXMsIGVuZGluZyBkcmFnJyk7XG4gICAgICB0aGlzLnN0YXRlLmVuZENvbm5lY3Rpb25EcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgaGlkZUNvbm5lY3Rpb25Qb3B1cCgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnQ2FsbCB0byBoaWRlJyk7XG4gICAgdGhpcy5wb3B1cFZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXRlLmVuZENvbm5lY3Rpb25EcmFnKCk7XG4gIH1cblxuICAvLyBBZGQgdGhpcyBoYW5kbGVyIHRvIGNsb3NlIHRoZSBwb3B1cCB3aGVuIGNsaWNraW5nIG91dHNpZGVcbiAgLy8gQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICAvLyBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgLy8gICBpZiAodGhpcy5wb3B1cFZpc2libGUpIHtcbiAgLy8gICAgIGNvbnN0IHBvcHVwRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZlcmJlbi1wb3AtVXAnKTtcbiAgLy8gICAgIGlmIChwb3B1cEVsZW1lbnQgJiYgIXBvcHVwRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgLy8gICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgY3JlYXRlTm9kZUNvbm5lY3Rpb24obm9kZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGhEYXRhID0gdGhpcy5zdGF0ZS5nZXRDb25uZWN0aW9uUGF0aERhdGEoKTtcbiAgICBpZiAoIXBhdGhEYXRhKSB7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgdHlwZSBpcyBhbGxvd2VkIHRvIGJlIGNyZWF0ZWRcbiAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLnN0YXRlLmdldEFsbG93ZWRUYXJnZXROb2RlVHlwZXMoKTtcbiAgICBpZiAoIWFsbG93ZWRUeXBlcy5pbmNsdWRlcyhub2RlVHlwZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBDYW5ub3QgY3JlYXRlIGNvbm5lY3Rpb24gdG8gJHtub2RlVHlwZX0gZnJvbSBjdXJyZW50IG5vZGUgdHlwZWBcbiAgICAgICk7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGVuZFgsIGVuZFksIHNvdXJjZVN3aW1sYW5lSW5kZXggfSA9IHBhdGhEYXRhO1xuXG4gICAgLy8gR2V0IHNvdXJjZSBub2RlIGluZm9cbiAgICBjb25zdCBzb3VyY2VQb2ludCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludDtcbiAgICBpZiAoIXNvdXJjZVBvaW50KSB7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKHNvdXJjZVBvaW50Lm5vZGVJZCk7XG4gICAgaWYgKCFzb3VyY2VOb2RlSW5mbykge1xuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgY29ubmVjdGluZyBmcm9tIGEgZGVjaXNpb24gdG8gYSBzdGFnZSwgc2hvdyBjb25kaXRpb24gcG9wdXAgZmlyc3RcbiAgICBpZiAoc291cmNlTm9kZUluZm8ubm9kZS50eXBlID09PSAnZGVjaXNpb24nICYmIG5vZGVUeXBlID09PSAnc3RhZ2UnKSB7XG4gICAgICAvLyBTdG9yZSBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgc3RhZ2UgY3JlYXRpb25cbiAgICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uQ29ubmVjdGlvbiA9IHtcbiAgICAgICAgZGVjaXNpb25Ob2RlSWQ6IHNvdXJjZU5vZGVJbmZvLm5vZGUuaWQsXG4gICAgICAgIHN3aW1sYW5lSW5kZXg6IHNvdXJjZVN3aW1sYW5lSW5kZXgsXG4gICAgICAgIHg6IGVuZFgsXG4gICAgICAgIHk6IGVuZFksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxjdWxhdGUgcG9wdXAgcG9zaXRpb24gLSBwb3NpdGlvbiBpdCBuZWFyIHRoZSBkZWNpc2lvbiBub2RlXG4gICAgICBjb25zdCBzd2ltbGFuZU9mZnNldFkgPSBzb3VyY2VTd2ltbGFuZUluZGV4ICogMjYzO1xuXG4gICAgICAvLyBDZW50ZXIgdGhlIHBvcHVwIG92ZXIgdGhlIGNvbm5lY3Rpb24gZW5kcG9pbnRcbiAgICAgIHRoaXMuZGVjaXNpb25Db25kaXRpb25Qb3B1cFggPSBlbmRYO1xuICAgICAgdGhpcy5kZWNpc2lvbkNvbmRpdGlvblBvcHVwWSA9IGVuZFkgLSAxNTA7IC8vIFBvc2l0aW9uIGFib3ZlIHRoZSBlbmRwb2ludFxuXG4gICAgICAvLyBTZXQgZGVjaXNpb24gbm9kZSBJRFxuICAgICAgdGhpcy5hY3RpdmVEZWNpc2lvbk5vZGVJZCA9IHNvdXJjZU5vZGVJbmZvLm5vZGUuaWQ7XG4gICAgICB0aGlzLnNob3dEZWNpc2lvbkNvbmRpdGlvbkRpYWxvZyA9IHRydWU7XG5cbiAgICAgIC8vIEVuZCB0aGUgY29ubmVjdGlvbiBkcmFnXG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzd2ltbGFuZUluZGV4ID0gTWF0aC5mbG9vcihlbmRZIC8gdGhpcy5zd2ltbGFuZUhlaWdodCk7XG4gICAgY29uc3Qgc3dpbWxhbmVUb3AgPSBzd2ltbGFuZUluZGV4ICogdGhpcy5zd2ltbGFuZUhlaWdodDtcbiAgICAvLyBDYWxjdWxhdGUgc3dpbWxhbmUtcmVsYXRpdmUgcG9zaXRpb25cbiAgICBjb25zdCBzd2ltbGFuZU9mZnNldFkgPSBzb3VyY2VTd2ltbGFuZUluZGV4ICogMjYzO1xuICAgIGxldCByZWxhdGl2ZVkgPSBlbmRZIC0gc3dpbWxhbmVPZmZzZXRZIC0gNTA7IC8vIEFkZCBoYWxmIG5vZGUgaGVpZ2h0IGZvciBiZXR0ZXIgYWxpZ25tZW50XG4gICAgY29uc3Qgc3dpbWxhbmVCb3R0b20gPSBzd2ltbGFuZVRvcCArIDI2MztcblxuICAgIC8vIENsYW1wIG5vZGVZIHNvIG5vZGUgc3RheXMgd2l0aGluIHN3aW1sYW5lXG5cbiAgICBjb25zb2xlLmxvZyhlbmRZLCBzd2ltbGFuZUluZGV4LCBzd2ltbGFuZU9mZnNldFksIHN3aW1sYW5lQm90dG9tKTtcblxuICAgIGlmIChlbmRZIC0gNTAgPCBzd2ltbGFuZVRvcCkge1xuICAgICAgY29uc29sZS5sb2coJ0xlc3MnKTtcbiAgICAgIHJlbGF0aXZlWSA9IHN3aW1sYW5lVG9wOyAvLyBOb2RlIHdvdWxkIG92ZXJmbG93IGFib3ZlLCBzbyBhbGlnbiB0byB0b3BcbiAgICB9IGVsc2UgaWYgKGVuZFkgKyA1MCA+IHN3aW1sYW5lQm90dG9tKSB7XG4gICAgICBjb25zb2xlLmxvZygnTW9yZScpO1xuICAgICAgcmVsYXRpdmVZID0gc3dpbWxhbmVCb3R0b20gLSAxMDA7IC8vIE5vZGUgd291bGQgb3ZlcmZsb3cgYmVsb3csIHNvIGFsaWduIHRvIGJvdHRvbVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcmVjb25kaXRpb25zIGJhc2VkIG9uIG5vZGUgdHlwZVxuICAgIGlmIChub2RlVHlwZSA9PT0gJ3N0YWdlJykge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBzdGFnZSBkaXJlY3RseSB3aXRoIGRlZmF1bHQgcHJvcGVydGllc1xuICAgICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleCxcbiAgICAgICAgJ3N0YWdlJyxcbiAgICAgICAgZW5kWCxcbiAgICAgICAgcmVsYXRpdmVZLFxuICAgICAgICB7IE5hbWU6ICdOZXcgU3RhZ2UnIH0gLy8gQWRkIGRlZmF1bHQgcHJvcGVydGllc1xuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBuZXdOb2RlICYmXG4gICAgICAgIG5ld05vZGUuY29ubmVjdGlvblBvaW50cyAmJlxuICAgICAgICBuZXdOb2RlLmNvbm5lY3Rpb25Qb2ludHMubGVuZ3RoID4gMCAmJlxuICAgICAgICBzb3VyY2VQb2ludFxuICAgICAgKSB7XG4gICAgICAgIC8vIEhhbmRsZSBjb25uZWN0aW9uIGNyZWF0aW9uXG4gICAgICAgIGNvbnN0IG9wcG9zaW5nVHlwZSA9IHtcbiAgICAgICAgICByaWdodDogJ2xlZnQnLFxuICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgICAgdG9wOiAnYm90dG9tJyxcbiAgICAgICAgICBib3R0b206ICd0b3AnLFxuICAgICAgICB9W3NvdXJjZVBvaW50LnR5cGVdIGFzICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldFBvaW50ID0gbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzLmZpbmQoXG4gICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gb3Bwb3NpbmdUeXBlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBvaW50KSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuc3RhdGUuY3JlYXRlQ29ubmVjdGlvbihcbiAgICAgICAgICAgIG5ld05vZGUuaWQsXG4gICAgICAgICAgICB0YXJnZXRQb2ludC5pZCxcbiAgICAgICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXhcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMub25Db25uZWN0aW9uQ3JlYXRlZChjb25uZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChub2RlVHlwZSA9PT0gJ3N1YmZsb3cnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0NyZWF0aW5nIHN1YmZsb3cgZnJvbSBjb25uZWN0aW9uIGF0OicsXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICAgICdzd2ltbGFuZTonLFxuICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4XG4gICAgICApO1xuICAgICAgLy8gU2hvdyB3b3JrZmxvdyBzZWxlY3Rpb24gcG9wdXAgYW5kIHN0b3JlIGNvbm5lY3Rpb24gZGF0YSBmb3IgbGF0ZXIgdXNlXG4gICAgICB0aGlzLnNob3dTdWJmbG93U2VsZWN0aW9uUG9wdXAoZW5kWCwgZW5kWSwgc291cmNlU3dpbWxhbmVJbmRleCk7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3Igb3RoZXIgbm9kZXMgQ3JlYXRlIHRoZSBuZXcgbm9kZSBhdCB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXgsXG4gICAgICBub2RlVHlwZSBhcyBUb29sVHlwZSxcbiAgICAgIGVuZFgsXG4gICAgICByZWxhdGl2ZVlcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgbmV3Tm9kZSAmJlxuICAgICAgbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzICYmXG4gICAgICBuZXdOb2RlLmNvbm5lY3Rpb25Qb2ludHMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgLy8gRmluZCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBjb25uZWN0aW9uIHBvaW50IChjbG9zZXN0IHRvIHRoZSBzb3VyY2UpXG4gICAgICBpZiAoc291cmNlUG9pbnQpIHtcbiAgICAgICAgLy8gRm9yIHNpbXBsaWNpdHksIHVzZSB0aGUgZmlyc3QgY29ubmVjdGlvbiBwb2ludCBvZiBvcHBvc2luZyB0eXBlXG4gICAgICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgeW91J2QgZmluZCB0aGUgY2xvc2VzdCBvciBtb3N0IGFwcHJvcHJpYXRlIHBvaW50XG4gICAgICAgIGxldCB0YXJnZXRQb2ludDtcblxuICAgICAgICAvLyBJZiBzb3VyY2UgaXMgb24gcmlnaHQsIHRhcmdldCBzaG91bGQgYmUgb24gbGVmdCwgZXRjLlxuICAgICAgICBjb25zdCBvcHBvc2luZ1R5cGUgPSB7XG4gICAgICAgICAgcmlnaHQ6ICdsZWZ0JyxcbiAgICAgICAgICBsZWZ0OiAncmlnaHQnLFxuICAgICAgICAgIHRvcDogJ2JvdHRvbScsXG4gICAgICAgICAgYm90dG9tOiAndG9wJyxcbiAgICAgICAgfVtzb3VyY2VQb2ludC50eXBlXSBhcyAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JztcblxuICAgICAgICB0YXJnZXRQb2ludCA9IG5ld05vZGUuY29ubmVjdGlvblBvaW50cy5maW5kKFxuICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09IG9wcG9zaW5nVHlwZVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0YXJnZXRQb2ludCkge1xuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29ubmVjdGlvblxuICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLnN0YXRlLmNyZWF0ZUNvbm5lY3Rpb24oXG4gICAgICAgICAgICBuZXdOb2RlLmlkLFxuICAgICAgICAgICAgdGFyZ2V0UG9pbnQuaWQsXG4gICAgICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdGlvbkNyZWF0ZWQoY29ubmVjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZU5vZGVJbmZvKSB7XG4gICAgICB0aGlzLnVwZGF0ZU5vZGVDb25uZWN0aW9ucyhzb3VyY2VOb2RlSW5mby5ub2RlKTtcbiAgICB9XG5cbiAgICAvLyBFbmQgdGhlIGNvbm5lY3Rpb24gZHJhZ1xuICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICB9XG5cbiAgLy8gTWV0aG9kIHRvIGhhbmRsZSBzYXZpbmcgdGhlIGNvbmRpdGlvblxuICBvbkRlY2lzaW9uQ29uZGl0aW9uU2F2ZWQoZXZlbnQ6IHtcbiAgICBjb25uZWN0aW9uSWQ6IHN0cmluZztcbiAgICBjb25kaXRpb246IHN0cmluZztcbiAgfSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wZW5kaW5nRGVjaXNpb25Db25uZWN0aW9uKSB7XG4gICAgICB0aGlzLnNob3dEZWNpc2lvbkNvbmRpdGlvbkRpYWxvZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZGVjaXNpb25Ob2RlSWQsIHN3aW1sYW5lSW5kZXgsIHgsIHkgfSA9XG4gICAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbkNvbm5lY3Rpb247XG5cbiAgICAvLyBDcmVhdGUgdGhlIHN0YWdlIGRpcmVjdGx5IHdpdGggZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgIHN3aW1sYW5lSW5kZXgsXG4gICAgICAnc3RhZ2UnLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB7IE5hbWU6ICdOZXcgU3RhZ2UnIH0gLy8gQWRkIGRlZmF1bHQgcHJvcGVydGllc1xuICAgICk7XG5cbiAgICBpZiAobm9kZSkge1xuICAgICAgY29uc3QgZGVjaXNpb25Ob2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGRlY2lzaW9uTm9kZUlkKTtcblxuICAgICAgaWYgKFxuICAgICAgICBkZWNpc2lvbk5vZGVJbmZvICYmXG4gICAgICAgIG5vZGUuY29ubmVjdGlvblBvaW50cyAmJlxuICAgICAgICBub2RlLmNvbm5lY3Rpb25Qb2ludHMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIC8vIEZpbmQgYSBzdWl0YWJsZSBjb25uZWN0aW9uIHBvaW50IGZyb20gdGhlIGRlY2lzaW9uIG5vZGVcbiAgICAgICAgY29uc3QgZGVjaXNpb25Ob2RlID0gZGVjaXNpb25Ob2RlSW5mby5ub2RlO1xuICAgICAgICBjb25zdCBkZWNpc2lvbk5vZGVQb2ludHMgPSBkZWNpc2lvbk5vZGUuY29ubmVjdGlvblBvaW50cyB8fCBbXTtcbiAgICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSBkZWNpc2lvbk5vZGVQb2ludHMuZmluZChcbiAgICAgICAgICAocCkgPT4gcC50eXBlID09PSAncmlnaHQnIHx8IHAudHlwZSA9PT0gJ2JvdHRvbSdcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoc291cmNlUG9pbnQpIHtcbiAgICAgICAgICAvLyBGaW5kIG9wcG9zaW5nIHR5cGUgY29ubmVjdGlvbiBwb2ludCBvbiB0aGUgbmV3IHN0YWdlXG4gICAgICAgICAgY29uc3Qgb3Bwb3NpbmdUeXBlID0ge1xuICAgICAgICAgICAgcmlnaHQ6ICdsZWZ0JyxcbiAgICAgICAgICAgIGJvdHRvbTogJ3RvcCcsXG4gICAgICAgICAgICBsZWZ0OiAncmlnaHQnLFxuICAgICAgICAgICAgdG9wOiAnYm90dG9tJyxcbiAgICAgICAgICB9W3NvdXJjZVBvaW50LnR5cGVdIGFzICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnO1xuXG4gICAgICAgICAgY29uc3QgdGFyZ2V0UG9pbnQgPSBub2RlLmNvbm5lY3Rpb25Qb2ludHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09IG9wcG9zaW5nVHlwZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0UG9pbnQpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uIHdpdGggY29uZGl0aW9uXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ge1xuICAgICAgICAgICAgICBpZDogYGNvbm4tJHtEYXRlLm5vdygpfS0ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApfWAsXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJZDogZGVjaXNpb25Ob2RlLmlkLFxuICAgICAgICAgICAgICB0YXJnZXROb2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgIHNvdXJjZVBvaW50SWQ6IHNvdXJjZVBvaW50LmlkLFxuICAgICAgICAgICAgICB0YXJnZXRQb2ludElkOiB0YXJnZXRQb2ludC5pZCxcbiAgICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogZGVjaXNpb25Ob2RlSW5mby5zd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgICB0YXJnZXRTd2ltbGFuZUluZGV4OiBzd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgICBjb25kaXRpb246IGV2ZW50LmNvbmRpdGlvbixcbiAgICAgICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgICAgICBhY3Rpb246IG51bGwsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBBZGQgY29ubmVjdGlvbiB0byB0aGUgc3RhdGVcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAnQ3JlYXRlZCBkZWNpc2lvbiBjb25uZWN0aW9uIHdpdGggY29uZGl0aW9uOicsXG4gICAgICAgICAgICAgIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgcGVuZGluZyBkYXRhXG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb25Db25uZWN0aW9uID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbkNvbmRpdGlvbiA9ICcnO1xuXG4gICAgLy8gSGlkZSB0aGUgY29uZGl0aW9uIHBvcHVwXG4gICAgdGhpcy5zaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2cgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRGVjaXNpb25Db25kaXRpb25DYW5jZWxsZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2cgPSBmYWxzZTtcbiAgICAvLyBEb24ndCBjcmVhdGUgdGhlIHN0YWdlIG9yIGNvbm5lY3Rpb25cbiAgfVxuXG4gIGdldENvbm5lY3Rpb25QYXRoKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGF0aERhdGEgPSB0aGlzLnN0YXRlLmdldENvbm5lY3Rpb25QYXRoRGF0YSgpO1xuICAgIGlmICghcGF0aERhdGEpIHJldHVybiAnJztcblxuICAgIGNvbnN0IHsgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFkgfSA9IHBhdGhEYXRhO1xuICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50O1xuXG4gICAgaWYgKCFzb3VyY2VQb2ludCkgcmV0dXJuICcnO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0T3J0aG9nb25hbFBhdGgoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIHNvdXJjZVBvaW50LnR5cGUpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvblBhdGhGb3JTYXZlZENvbm5lY3Rpb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhdGhEYXRhID0gdGhpcy5zdGF0ZS5nZXRDb25uZWN0aW9uRGF0YShjb25uZWN0aW9uKTtcbiAgICAgIGlmICghcGF0aERhdGEpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gcGF0aCBkYXRhIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFkgfSA9IHBhdGhEYXRhO1xuXG4gICAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGNvbm5lY3Rpb24uc291cmNlTm9kZUlkKTtcbiAgICAgIGlmICghc291cmNlTm9kZUluZm8pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU291cmNlIG5vZGUgbm90IGZvdW5kIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBzb3VyY2VOb2RlSW5mby5ub2RlO1xuICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSBzb3VyY2VOb2RlLmNvbm5lY3Rpb25Qb2ludHM/LmZpbmQoXG4gICAgICAgIChwKSA9PiBwLmlkID09PSBjb25uZWN0aW9uLnNvdXJjZVBvaW50SWRcbiAgICAgICk7XG5cbiAgICAgIGlmICghc291cmNlUG9pbnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU291cmNlIHBvaW50IG5vdCBmb3VuZCBmb3IgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5nZXRPcnRob2dvbmFsUGF0aChcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICAgIHNvdXJjZVBvaW50LnR5cGVcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdlbmVyYXRpbmcgcGF0aCBmb3IgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uLCBlcnJvcik7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3J0aG9nb25hbFBhdGgoXG4gICAgc3RhcnRYOiBudW1iZXIsXG4gICAgc3RhcnRZOiBudW1iZXIsXG4gICAgZW5kWDogbnVtYmVyLFxuICAgIGVuZFk6IG51bWJlcixcbiAgICBwb2ludFR5cGU6ICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnXG4gICk6IHN0cmluZyB7XG4gICAgLy8gRGV0ZXJtaW5lIGluaXRpYWwgZGlyZWN0aW9uIGJhc2VkIG9uIGNvbm5lY3Rpb24gcG9pbnQgdHlwZVxuICAgIGxldCBwYXRoID0gJyc7XG5cbiAgICAvLyBGb3Igc2lkZSBwb2ludHMgKGxlZnQvcmlnaHQpLCBzdGFydCB3aXRoIGhvcml6b250YWwgbGluZVxuICAgIGlmIChwb2ludFR5cGUgPT09ICdsZWZ0JyB8fCBwb2ludFR5cGUgPT09ICdyaWdodCcpIHtcbiAgICAgIC8vIENhbGN1bGF0ZSBob3Jpem9udGFsIGRpc3RhbmNlXG4gICAgICBjb25zdCBob3Jpem9udGFsRGlzdCA9IGVuZFggLSBzdGFydFg7XG5cbiAgICAgIC8vIElmIHRoZSBlbmQgcG9pbnQgaXMgdmVyeSBjbG9zZSBob3Jpem9udGFsbHksIHVzZSBhIHNpbXBsZSAzLXNlZ21lbnQgcGF0aFxuICAgICAgaWYgKE1hdGguYWJzKGhvcml6b250YWxEaXN0KSA8IDMwKSB7XG4gICAgICAgIGNvbnN0IG1pZFkgPSAoc3RhcnRZICsgZW5kWSkgLyAyO1xuICAgICAgICBwYXRoID0gYE0gJHtzdGFydFh9ICR7c3RhcnRZfSBIICR7ZW5kWH0gViAke21pZFl9IFYgJHtlbmRZfWA7XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBhIHBhdGggd2l0aCBob3Jpem9udGFsIHNlZ21lbnQgZmlyc3QsIHRoZW4gdmVydGljYWwsIHRoZW4gaG9yaXpvbnRhbFxuICAgICAgZWxzZSB7XG4gICAgICAgIHBhdGggPSBgTSAke3N0YXJ0WH0gJHtzdGFydFl9IEggJHtzdGFydFggKyBob3Jpem9udGFsRGlzdCAvIDJcbiAgICAgICAgICB9IFYgJHtlbmRZfSBIICR7ZW5kWH1gO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGb3IgdG9wL2JvdHRvbSBwb2ludHMsIHN0YXJ0IHdpdGggdmVydGljYWwgbGluZVxuICAgIGVsc2UgaWYgKHBvaW50VHlwZSA9PT0gJ3RvcCcgfHwgcG9pbnRUeXBlID09PSAnYm90dG9tJykge1xuICAgICAgLy8gQ2FsY3VsYXRlIHZlcnRpY2FsIGRpc3RhbmNlXG4gICAgICBjb25zdCB2ZXJ0aWNhbERpc3QgPSBlbmRZIC0gc3RhcnRZO1xuXG4gICAgICAvLyBJZiB0aGUgZW5kIHBvaW50IGlzIHZlcnkgY2xvc2UgdmVydGljYWxseSwgdXNlIGEgc2ltcGxlIDMtc2VnbWVudCBwYXRoXG4gICAgICBpZiAoTWF0aC5hYnModmVydGljYWxEaXN0KSA8IDMwKSB7XG4gICAgICAgIGNvbnN0IG1pZFggPSAoc3RhcnRYICsgZW5kWCkgLyAyO1xuICAgICAgICBwYXRoID0gYE0gJHtzdGFydFh9ICR7c3RhcnRZfSBWICR7ZW5kWX0gSCAke21pZFh9IEggJHtlbmRYfWA7XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBhIHBhdGggd2l0aCB2ZXJ0aWNhbCBzZWdtZW50IGZpcnN0LCB0aGVuIGhvcml6b250YWwsIHRoZW4gdmVydGljYWxcbiAgICAgIGVsc2Uge1xuICAgICAgICBwYXRoID0gYE0gJHtzdGFydFh9ICR7c3RhcnRZfSBWICR7c3RhcnRZICsgdmVydGljYWxEaXN0IC8gMlxuICAgICAgICAgIH0gSCAke2VuZFh9IFYgJHtlbmRZfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICBzZWxlY3RGb3JtRm9yU3RhZ2UoZm9ybTogRm9ybSB8IG51bGwsIG5vZGU6IE5vZGUpIHtcbiAgICAvLyBJZiBmb3JtIGlzIG51bGwsIHdlJ3JlIGNsZWFyaW5nIHRoZSBzZWxlY3Rpb25cbiAgICBpZiAobm9kZSkge1xuICAgICAgaWYgKCFub2RlLnN0YWdlRGF0YSkge1xuICAgICAgICBub2RlLnN0YWdlRGF0YSA9IHt9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybSkge1xuICAgICAgICBub2RlLnN0YWdlRGF0YS5mb3JtSWQgPSBmb3JtLkNvZGU7XG4gICAgICAgIG5vZGUuc3RhZ2VEYXRhLmZvcm1OYW1lID0gZm9ybS5OYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ2xlYXIgZm9ybSBzZWxlY3Rpb25cbiAgICAgICAgZGVsZXRlIG5vZGUuc3RhZ2VEYXRhLmZvcm1JZDtcbiAgICAgICAgZGVsZXRlIG5vZGUuc3RhZ2VEYXRhLmZvcm1OYW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IGFuIGV2ZW50IHRvIHVwZGF0ZSB0aGUgc3RhZ2UgZGF0YVxuICAgICAgdGhpcy5vblN0YWdlUHJvcGVydGllc1VwZGF0ZWQoe1xuICAgICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgIHN0YWdlRGF0YTogbm9kZS5zdGFnZURhdGEsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblN0YWdlUHJvcGVydGllc1VwZGF0ZWQoZXZlbnQ6IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICBzdGFnZURhdGE6IFBhcnRpYWw8V29ya2Zsb3dTdGFnZT47XG4gIH0pOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBub2RlIGluIHRoZSBzd2ltbGFuZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzd2ltbGFuZSA9IHRoaXMuc3RhdGUuc3dpbWxhbmVzW2ldO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gc3dpbWxhbmUubm9kZXM/LmZpbmRJbmRleCgobikgPT4gbi5pZCA9PT0gZXZlbnQubm9kZUlkKTtcblxuICAgICAgaWYgKG5vZGVJbmRleCAhPT0gdW5kZWZpbmVkICYmIG5vZGVJbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RhZ2UgZGF0YVxuICAgICAgICBpZiAoc3dpbWxhbmUubm9kZXMpIHtcbiAgICAgICAgICBzd2ltbGFuZS5ub2Rlc1tub2RlSW5kZXhdLnN0YWdlRGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnN3aW1sYW5lLm5vZGVzW25vZGVJbmRleF0uc3RhZ2VEYXRhLFxuICAgICAgICAgICAgLi4uZXZlbnQuc3RhZ2VEYXRhLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAnVXBkYXRlZCBzdGFnZSBkYXRhIGluIHN3aW1sYW5lOicsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgJ25vZGU6JyxcbiAgICAgICAgICAgIG5vZGVJbmRleCxcbiAgICAgICAgICAgICdkYXRhOicsXG4gICAgICAgICAgICBzd2ltbGFuZS5ub2Rlc1tub2RlSW5kZXhdLnN0YWdlRGF0YVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0aW9uQ3JlYXRlZChjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gQWZ0ZXIgYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWQsIHJlZnJlc2ggdGhlIHNvdXJjZSBub2RlIHRvIHVwZGF0ZSBpdHMgc3RhdGVcbiAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGNvbm5lY3Rpb24uc291cmNlTm9kZUlkKTtcbiAgICBpZiAoc291cmNlTm9kZUluZm8gJiYgc291cmNlTm9kZUluZm8ubm9kZS50eXBlID09PSAnc3RhZ2UnKSB7XG4gICAgICAvLyBSZWZyZXNoIG5vZGUgc3RhdGVcbiAgICAgIHRoaXMudXBkYXRlTm9kZUNvbm5lY3Rpb25zKHNvdXJjZU5vZGVJbmZvLm5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gdXBkYXRlIG5vZGUncyBjb25uZWN0aW9uIHN0YXR1c1xuICB1cGRhdGVOb2RlQ29ubmVjdGlvbnMobm9kZTogV0ZOb2RlKTogdm9pZCB7XG4gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBvdXRnb2luZyBjb25uZWN0aW9ucyB0aGF0IGNvbm5lY3QgdG8gc3RhZ2VzXG4gICAgY29uc3Qgb3V0Z29pbmdDb25uZWN0aW9ucyA9IHRoaXMuc3RhdGUuY29ubmVjdGlvbnMuZmlsdGVyKFxuICAgICAgKGNvbm4pID0+IGNvbm4uc291cmNlTm9kZUlkID09PSBub2RlLmlkXG4gICAgKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgbm9kZXMgYXJlIHN0YWdlc1xuICAgIGNvbnN0IGNvbm5lY3RlZFN0YWdlTm9kZXMgPSBvdXRnb2luZ0Nvbm5lY3Rpb25zXG4gICAgICAubWFwKChjb25uKSA9PiB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChjb25uLnRhcmdldE5vZGVJZCkpXG4gICAgICAuZmlsdGVyKChub2RlSW5mbykgPT4gbm9kZUluZm8gJiYgbm9kZUluZm8ubm9kZS50eXBlID09PSAnc3RhZ2UnKTtcblxuICAgIG5vZGUuaGFzTXVsdGlwbGVDb25uZWN0ZWRTdGFnZXMgPSBjb25uZWN0ZWRTdGFnZU5vZGVzLmxlbmd0aCA+IDE7XG4gICAgbm9kZS5oYXNQYXJhbGxlbFN0YWdlcyA9IGNvbm5lY3RlZFN0YWdlTm9kZXMuZXZlcnkoXG4gICAgICAobmQpID0+IG5kPy5ub2RlLnN0YWdlRGF0YT8uSXNQYXJhbGxlbFxuICAgICk7XG4gIH1cblxuICBvbkVkaXRTd2ltbGFuZShcbiAgICBldmVudDogTW91c2VFdmVudCxcbiAgICBzd2ltbGFuZTogU3dpbWxhbmVJdGVtLFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gUHJldmVudCB0aGUgY2FudmFzIGNsaWNrIGV2ZW50IGZyb20gZmlyaW5nXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zb2xlLmxvZygnRWRpdCBzd2ltbGFuZSBidXR0b24gY2xpY2tlZCBmb3Igc3dpbWxhbmU6Jywgc3dpbWxhbmVJbmRleCk7XG5cbiAgICAvLyBFbWl0IGEgc3BlY2lhbCBldmVudCBmb3IgZWRpdGluZyBhIHN3aW1sYW5lXG4gICAgdGhpcy5jbGlja2VkUG9zaXRpb24uZW1pdCh7XG4gICAgICB4OiAtMSwgLy8gU3BlY2lhbCB2YWx1ZSB0byBpbmRpY2F0ZSBlZGl0IG1vZGVcbiAgICAgIHk6IHN3aW1sYW5lSW5kZXgsXG4gICAgfSk7XG4gIH1cblxuICAvLyBzaG93U3RhcnROb2RlRm9ybVBvcHVwKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gIC8vICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgLy8gICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAvLyAgIC8vIEltcGxlbWVudGF0aW9uIHdpbGwgYmUgc2ltaWxhciB0byB0aGUgc3RhZ2UgZm9ybSBwb3B1cFxuICAvLyAgIC8vIFdlJ2xsIG5lZWQgdG8gYWRkIFVJIGVsZW1lbnRzIGZvciB0aGlzXG4gIC8vICAgY29uc29sZS5sb2coJ1N0YXJ0IG5vZGUgZm9ybSBwb3B1cCByZXF1ZXN0ZWQnKTtcblxuICAvLyAgIC8vIEZvciBub3csIHRoaXMgaXMgYSBwbGFjZWhvbGRlclxuICAvLyAgIC8vIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gd291bGQgbG9hZCBmb3JtcyBhbmQgYWRkIHRoZW0gdG8gdGhlIHdvcmtmbG93XG4gIC8vIH1cblxuICB0b2dnbGVTdGFydE5vZGVGb3JtUG9wdXAoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgbm9kZVg6IG51bWJlcixcbiAgICBub2RlWTogbnVtYmVyLFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlcixcbiAgICBub2RlPzogTm9kZVxuICApOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gU2V0IHBvcHVwIHBvc2l0aW9uIC0gY29udmVydCBjYW52YXMgY29vcmRpbmF0ZXMgdG8gdmlld3BvcnQgY29vcmRpbmF0ZXNcbiAgICBjb25zdCBzd2ltbGFuZU9mZnNldCA9IHN3aW1sYW5lSW5kZXggKiAyNjM7XG4gICAgY29uc3QgY2FudmFzWCA9IG5vZGVYIC0gKCFub2RlID8gMzAgOiAwKTtcbiAgICBjb25zdCBjYW52YXNZID0gbm9kZVkgKyBzd2ltbGFuZU9mZnNldDtcblxuICAgIGNvbnN0IHZpZXdwb3J0UG9zID0gdGhpcy5nZXRWaWV3cG9ydFBvc2l0aW9uKGNhbnZhc1gsIGNhbnZhc1kpO1xuICAgIHRoaXMuc3RhcnROb2RlRm9ybVBvcHVwWCA9IHZpZXdwb3J0UG9zLng7XG4gICAgdGhpcy5zdGFydE5vZGVGb3JtUG9wdXBZID0gdmlld3BvcnRQb3MueTtcblxuICAgIC8vIElmIHdlJ3JlIG9wZW5pbmcgdGhlIHBvcHVwLCBsb2FkIGZvcm1zXG4gICAgaWYgKCF0aGlzLnNob3dTdGFydE5vZGVGb3JtUG9wdXApIHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nU3RhcnROb2RlRm9ybXMgPSB0cnVlO1xuICAgICAgdGhpcy5kYXRhU2VydmljZVxuICAgICAgICAuZ2V0Rm9ybXMoKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLnN0YXJ0Tm9kZUZvcm1zTGlzdCA9IHJlc3BvbnNlLlJlc3VsdDtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGZvcm1zOicsIGVycm9yKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChub2RlKSB7XG4gICAgICB0aGlzLmFjdGl2ZU5vZGVGb3JGb3JtU2VsZWN0aW9uID0gbm9kZTtcbiAgICAgIGNvbnNvbGUubG9nKCdBY3RpdmUgbm9kZSBmb3IgZm9ybSBzZWxlY3Rpb246Jywgbm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlTm9kZUZvckZvcm1TZWxlY3Rpb24gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cCA9ICF0aGlzLnNob3dTdGFydE5vZGVGb3JtUG9wdXA7XG4gIH1cblxuICBzZWxlY3RTdGFydE5vZGVGb3JtKGZvcm06IEZvcm0gfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlTm9kZUZvckZvcm1TZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0Rm9ybUZvclN0YWdlKGZvcm0sIHRoaXMuYWN0aXZlTm9kZUZvckZvcm1TZWxlY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZm9ybSkge1xuICAgICAgICB0aGlzLnN0YXRlLnNldFdvcmtmbG93Rm9ybShmb3JtLkNvZGUsIGZvcm0uTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLnNldFdvcmtmbG93Rm9ybShudWxsLCBudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbG9zZSB0aGUgcG9wdXBcbiAgICB0aGlzLnNob3dTdGFydE5vZGVGb3JtUG9wdXAgPSBmYWxzZTtcbiAgfVxuXG4gIHNob3dTdWJmbG93U2VsZWN0aW9uUG9wdXAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHN3aW1sYW5lSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgY2FudmFzIGNvb3JkaW5hdGVzIHRvIHZpZXdwb3J0IGNvb3JkaW5hdGVzIGZvciBwb3B1cCBwb3NpdGlvbmluZ1xuICAgIGNvbnN0IHZpZXdwb3J0UG9zID0gdGhpcy5nZXRWaWV3cG9ydFBvc2l0aW9uKHgsIHkpO1xuICAgIHRoaXMuc3ViZmxvd1BvcHVwWCA9IHZpZXdwb3J0UG9zLng7XG4gICAgdGhpcy5zdWJmbG93UG9wdXBZID0gdmlld3BvcnRQb3MueTtcbiAgICB0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb24gPSB7IHN3aW1sYW5lSW5kZXgsIHgsIHkgfTtcblxuICAgIC8vIFN0b3JlIGNvbm5lY3Rpb24gZGF0YSBpZiB3ZSdyZSBjcmVhdGluZyBmcm9tIGEgY29ubmVjdGlvblxuICAgIGlmICh0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpIHtcbiAgICAgIC8vIFN0b3JlIHRoZSBzb3VyY2UgY29ubmVjdGlvbiBkYXRhXG4gICAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQgPVxuICAgICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQgPz8gbnVsbDtcbiAgICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4ID1cbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVN3aW1sYW5lSW5kZXggPz8gbnVsbDtcbiAgICAgIGNvbnNvbGUubG9nKCdTdG9yZWQgY29ubmVjdGlvbiBkYXRhIGZvciBzdWJmbG93OicsIHtcbiAgICAgICAgc291cmNlUG9pbnQ6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCxcbiAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHdvcmtmbG93c1xuICAgIHRoaXMuaXNMb2FkaW5nV29ya2Zsb3dzID0gdHJ1ZTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAuZ2V0V29ya2Zsb3dzKClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLndvcmtmbG93c0xpc3QgPSByZXNwb25zZS5SZXN1bHQ7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nV29ya2Zsb3dzID0gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHdvcmtmbG93czonLCBlcnJvcik7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nV29ya2Zsb3dzID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2hvd1N1YmZsb3dQb3B1cCA9IHRydWU7XG4gIH1cblxuICBzZWxlY3RTdWJmbG93V29ya2Zsb3cod29ya2Zsb3c6IFdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGluZyB3b3JrZmxvdyBmb3Igc3ViZmxvdzonLCB3b3JrZmxvdy5OYW1lKTtcbiAgICBjb25zb2xlLmxvZygnUGVuZGluZyBjb25uZWN0aW9uIGRhdGE6Jywge1xuICAgICAgc291cmNlUG9pbnQ6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCxcbiAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgcG9zaXRpb246IHRoaXMucGVuZGluZ1N1YmZsb3dQb3NpdGlvbixcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IHsgc3dpbWxhbmVJbmRleCwgeCwgeSB9ID0gdGhpcy5wZW5kaW5nU3ViZmxvd1Bvc2l0aW9uO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHN1YmZsb3cgbm9kZSB3aXRoIHRoZSBzZWxlY3RlZCB3b3JrZmxvdyBkYXRhXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGF0ZS5hZGROb2RlKFxuICAgICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgICAnc3ViZmxvdycsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHsgTmFtZTogd29ya2Zsb3cuTmFtZSB9LCAvLyBJbml0aWFsaXplIHN0YWdlIG5hbWUgZnJvbSB3b3JrZmxvd1xuICAgICAgICB7IGlkOiB3b3JrZmxvdy5Db2RlLCBuYW1lOiB3b3JrZmxvdy5OYW1lIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGVkIHN1YmZsb3cgbm9kZTonLCBub2RlKTtcblxuICAgICAgLy8gSWYgdGhpcyB3YXMgY3JlYXRlZCBmcm9tIGEgY29ubmVjdGlvbiwgY3JlYXRlIHRoZSBjb25uZWN0aW9uXG4gICAgICBpZiAobm9kZSAmJiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0aW5nIGNvbm5lY3Rpb24gdG8gbmV3IHN1YmZsb3cgbm9kZScpO1xuXG4gICAgICAgIC8vIEZpbmQgYSBzdWl0YWJsZSBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSBuZXcgbm9kZVxuICAgICAgICBpZiAobm9kZS5jb25uZWN0aW9uUG9pbnRzICYmIG5vZGUuY29ubmVjdGlvblBvaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQ7XG5cbiAgICAgICAgICAvLyBGaW5kIG9wcG9zaW5nIHR5cGUgY29ubmVjdGlvbiBwb2ludFxuICAgICAgICAgIGNvbnN0IG9wcG9zaW5nVHlwZSA9IHtcbiAgICAgICAgICAgIHJpZ2h0OiAnbGVmdCcsXG4gICAgICAgICAgICBsZWZ0OiAncmlnaHQnLFxuICAgICAgICAgICAgdG9wOiAnYm90dG9tJyxcbiAgICAgICAgICAgIGJvdHRvbTogJ3RvcCcsXG4gICAgICAgICAgfVtzb3VyY2VQb2ludC50eXBlXSBhcyAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JztcblxuICAgICAgICAgIGNvbnN0IHRhcmdldFBvaW50ID0gbm9kZS5jb25uZWN0aW9uUG9pbnRzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gcC50eXBlID09PSBvcHBvc2luZ1R5cGVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHRhcmdldFBvaW50KSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgY29ubmVjdGlvblxuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgaWQ6IGBjb25uLSR7RGF0ZS5ub3coKX0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKX1gLFxuICAgICAgICAgICAgICBzb3VyY2VOb2RlSWQ6IHNvdXJjZVBvaW50Lm5vZGVJZCxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgICAgICBzb3VyY2VQb2ludElkOiBzb3VyY2VQb2ludC5pZCxcbiAgICAgICAgICAgICAgdGFyZ2V0UG9pbnRJZDogdGFyZ2V0UG9pbnQuaWQsXG4gICAgICAgICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4ISxcbiAgICAgICAgICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgICAgICBhY3Rpb246IG51bGwsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBBZGQgY29ubmVjdGlvbiBkaXJlY3RseSB0byB0aGUgc3RhdGUncyBjb25uZWN0aW9ucyBhcnJheVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkZGVkIGNvbm5lY3Rpb24gdG8gc3RhdGU6JywgY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ29ubmVjdGlvbnMgYWZ0ZXIgYWRkaW5nOicsIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5vbkNvbm5lY3Rpb25DcmVhdGVkKGNvbm5lY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlLmVuZENvbm5lY3Rpb25EcmFnKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IHNlbGVjdGlvbiB0b29sIGluIHBhcmVudCBjb21wb25lbnRcbiAgICAgIHRoaXMuc3ViZmxvd1NlbGVjdGVkLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cFxuICAgIHRoaXMuc2hvd1N1YmZsb3dQb3B1cCA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1N1YmZsb3dQb3NpdGlvbiA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50ID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleCA9IG51bGw7XG4gIH1cblxuICBzaG93RGVjaXNpb25Db25kaXRpb25zUG9wdXAoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgbm9kZTogV0ZOb2RlLFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBmb3IgdGhlIHBvcHVwXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuXG4gICAgLy8gQ29udmVydCBjYW52YXMgY29vcmRpbmF0ZXMgdG8gdmlld3BvcnQgY29vcmRpbmF0ZXMgZm9yIHBvcHVwIHBvc2l0aW9uaW5nXG4gICAgY29uc3Qgdmlld3BvcnRQb3MgPSB0aGlzLmdldFZpZXdwb3J0UG9zaXRpb24ocG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG5cbiAgICAvLyBGaW5kIGFsbCBjb25uZWN0aW9ucyBmcm9tIHRoaXMgZGVjaXNpb24gbm9kZVxuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5maWx0ZXIoXG4gICAgICAoY29ubikgPT4gY29ubi5zb3VyY2VOb2RlSWQgPT09IG5vZGUuaWRcbiAgICApO1xuXG4gICAgaWYgKGNvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gTm8gY29ubmVjdGlvbnMgdG8gc2hvd1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNob3cgdGhlIGRlY2lzaW9uIGNvbmRpdGlvbnMgcG9wdXBcbiAgICB0aGlzLmFjdGl2ZURlY2lzaW9uTm9kZUlkID0gbm9kZS5pZDtcbiAgICB0aGlzLmRlY2lzaW9uQ29uZGl0aW9uUG9wdXBYID0gdmlld3BvcnRQb3MueDtcbiAgICB0aGlzLmRlY2lzaW9uQ29uZGl0aW9uUG9wdXBZID0gdmlld3BvcnRQb3MueTtcblxuICAgIC8vIFNldCB0aGUgY29ycmVjdCBwb3B1cCB2aXNpYmlsaXR5IGZsYWcgLSB0aGlzIGlzIGxpa2VseSB0aGUgaXNzdWVcbiAgICB0aGlzLnNob3dEZWNpc2lvbkNvbmRpdGlvbkRpYWxvZyA9IHRydWU7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnU2hvd2luZyBkZWNpc2lvbiBwb3B1cDonLCB7XG4gICAgLy8gICB5OiBnbG9iYWxZLFxuICAgIC8vICAgbm9kZUlkOiBub2RlLmlkLFxuICAgIC8vICAgaXNWaXNpYmxlOiB0aGlzLnNob3dEZWNpc2lvbkNvbmRpdGlvbkRpYWxvZyxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIGVuc3VyZVN3aW1sYW5lSW5WaWV3KHN3aW1sYW5lSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIGVub3VnaCBzd2ltbGFuZXMgdmlzaWJsZVxuICAgIGNvbnN0IHJlcXVpcmVkSGVpZ2h0ID0gKHN3aW1sYW5lSW5kZXggKyAxKSAqIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG4gICAgaWYgKHRoaXMuY2FudmFzSGVpZ2h0IDwgcmVxdWlyZWRIZWlnaHQpIHtcbiAgICAgIHRoaXMuY2FudmFzSGVpZ2h0ID0gcmVxdWlyZWRIZWlnaHQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0TGFiZWxQb3NpdGlvbihjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF0aERhdGEgPSB0aGlzLnN0YXRlLmdldENvbm5lY3Rpb25EYXRhKGNvbm5lY3Rpb24pO1xuICAgICAgaWYgKCFwYXRoRGF0YSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBwYXRoIGRhdGEgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSB9ID0gcGF0aERhdGE7XG5cbiAgICAgIGNvbnN0IHNvdXJjZU5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoY29ubmVjdGlvbi5zb3VyY2VOb2RlSWQpO1xuICAgICAgaWYgKCFzb3VyY2VOb2RlSW5mbykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTb3VyY2Ugbm9kZSBub3QgZm91bmQgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlTm9kZSA9IHNvdXJjZU5vZGVJbmZvLm5vZGU7XG4gICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHNvdXJjZU5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgKHApID0+IHAuaWQgPT09IGNvbm5lY3Rpb24uc291cmNlUG9pbnRJZFxuICAgICAgKTtcblxuICAgICAgaWYgKCFzb3VyY2VQb2ludCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTb3VyY2UgcG9pbnQgbm90IGZvdW5kIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBtaWRwb2ludCBiYXNlZCBvbiB0aGUgY29ubmVjdGlvbiBwb2ludCB0eXBlXG4gICAgICBpZiAoc291cmNlUG9pbnQudHlwZSA9PT0gJ2xlZnQnIHx8IHNvdXJjZVBvaW50LnR5cGUgPT09ICdyaWdodCcpIHtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbERpc3QgPSBlbmRYIC0gc3RhcnRYO1xuXG4gICAgICAgIGlmIChNYXRoLmFicyhob3Jpem9udGFsRGlzdCkgPCAzMCkge1xuICAgICAgICAgIC8vIEZvciBzaG9ydCBob3Jpem9udGFsIGNvbm5lY3Rpb25zXG4gICAgICAgICAgY29uc3QgbWlkWSA9IChzdGFydFkgKyBlbmRZKSAvIDI7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHN0YXJ0WCArIChlbmRYIC0gc3RhcnRYKSAvIDIsXG4gICAgICAgICAgICB5OiBtaWRZLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIHJlZ3VsYXIgY29ubmVjdGlvbnMgc3RhcnRpbmcgaG9yaXpvbnRhbGx5XG4gICAgICAgICAgY29uc3QgbWlkWCA9IHN0YXJ0WCArIGhvcml6b250YWxEaXN0IC8gMjtcbiAgICAgICAgICBjb25zdCBtaWRZID0gZW5kWTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogbWlkWCxcbiAgICAgICAgICAgIHk6IChzdGFydFkgKyBlbmRZKSAvIDIsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gJ3RvcCcgb3IgJ2JvdHRvbSdcbiAgICAgICAgY29uc3QgdmVydGljYWxEaXN0ID0gZW5kWSAtIHN0YXJ0WTtcblxuICAgICAgICBpZiAoTWF0aC5hYnModmVydGljYWxEaXN0KSA8IDMwKSB7XG4gICAgICAgICAgLy8gRm9yIHNob3J0IHZlcnRpY2FsIGNvbm5lY3Rpb25zXG4gICAgICAgICAgY29uc3QgbWlkWCA9IChzdGFydFggKyBlbmRYKSAvIDI7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IG1pZFgsXG4gICAgICAgICAgICB5OiBzdGFydFkgKyAoZW5kWSAtIHN0YXJ0WSkgLyAyLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIHJlZ3VsYXIgY29ubmVjdGlvbnMgc3RhcnRpbmcgdmVydGljYWxseVxuICAgICAgICAgIGNvbnN0IG1pZFggPSBlbmRYO1xuICAgICAgICAgIGNvbnN0IG1pZFkgPSBzdGFydFkgKyB2ZXJ0aWNhbERpc3QgLyAyO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiAoc3RhcnRYICsgZW5kWCkgLyAyLFxuICAgICAgICAgICAgeTogbWlkWSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdFcnJvciBjYWxjdWxhdGluZyBsYWJlbCBwb3NpdGlvbiBmb3IgY29ubmVjdGlvbjonLFxuICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICBlcnJvclxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgICB9XG4gIH1cblxuICBzYXZlQ29ubmVjdGlvbkxhYmVsKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIGxhYmVsOiBzdHJpbmcpIHtcbiAgICAvLyBVcGRhdGUgdGhlIGNvbm5lY3Rpb24gbGFiZWwgaW4gdGhlIHN0YXRlXG4gICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucyA9IHRoaXMuc3RhdGUuY29ubmVjdGlvbnMubWFwKChjb25uKSA9PiB7XG4gICAgICBpZiAoY29ubi5pZCA9PT0gY29ubmVjdGlvbi5pZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbm4sXG4gICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbm47XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjYW52YXMtY29udGFpbmVyXCI+XG4gIDxzdmcgI2NhbnZhcyBbYXR0ci53aWR0aF09XCJjYW52YXNXaWR0aFwiIFthdHRyLmhlaWdodF09XCJjYW52YXNIZWlnaHRcIiBjbGFzcz1cImRlc2lnbmVyLWNhbnZhc1wiXG4gICAgKGNsaWNrKT1cIm9uQ2FudmFzQ2xpY2soJGV2ZW50KVwiPlxuICAgIDxkZWZzPlxuICAgICAgPCEtLSBHcmlkIHBhdHRlcm4gZGVmaW5pdGlvbiAtLT5cblxuICAgICAgPHBhdHRlcm4gaWQ9XCJncmlkXCIgW2F0dHIud2lkdGhdPVwiZ3JpZFNpemVcIiBbYXR0ci5oZWlnaHRdPVwiZ3JpZFNpemVcIiBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxuICAgICAgICA8cGF0aCBkPVwiTSAyMCAwIEwgMCAwIDAgMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNlMmU4ZjBcIiBzdHJva2Utd2lkdGg9XCIwLjVcIiAvPlxuICAgICAgPC9wYXR0ZXJuPlxuXG4gICAgICA8IS0tIEFycm93IGhlYWQgbWFya2VyIGRlZmluaXRpb24gLS0+XG4gICAgICA8bWFya2VyIGlkPVwiYXJyb3doZWFkXCIgbWFya2VyV2lkdGg9XCIxMFwiIG1hcmtlckhlaWdodD1cIjdcIiByZWZYPVwiOVwiIHJlZlk9XCIzLjVcIiBvcmllbnQ9XCJhdXRvXCI+XG4gICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjAgMCwgMTAgMy41LCAwIDdcIiBmaWxsPVwiI0QzNkNGRlwiIC8+XG4gICAgICA8L21hcmtlcj5cblxuICAgICAgPCEtLSBDb25uZWN0aW9uIHBvaW50OiBvdXRlciB0cmFuc3BhcmVudCByaW5nIGV4cGFuZHMgdGhlIGhpdCB0YXJnZXQgc28gYVxuICAgICAgICAgICBjb25uZWN0aW9uIGRyYWcgY2FuIGJlIHN0YXJ0ZWQgd2l0aG91dCBwaXhlbC1wcmVjaXNlIGFpbS4gVGhlIHZpc2libGVcbiAgICAgICAgICAgY2lyY2xlIHN0YXlzIGF0IHI9NS4gVGhlIGhpdCByaW5nIGV4dGVuZHMgaW53YXJkIHVwIHRvIHRoZSBub2RlJ3NcbiAgICAgICAgICAgZHJhZy1oYW5kbGUgZWRnZSBzbyBjbGlja3MgbmVhciB0aGUgZWRnZSBmYWxsIHRvIHRoZSBjb25uZWN0aW9uIHBvaW50XG4gICAgICAgICAgIChyZW5kZXJlZCB0b3Btb3N0KSByYXRoZXIgdGhhbiB0byB0aGUgZHJhZyBoYW5kbGUgYmVuZWF0aC4gLS0+XG4gICAgICA8ZyBpZD1cImNvbm5lY3Rpb24tcG9pbnQtdGVtcGxhdGVcIj5cbiAgICAgICAgPGNpcmNsZSByPVwiMTJcIiBmaWxsPVwidHJhbnNwYXJlbnRcIiAvPlxuICAgICAgICA8Y2lyY2xlIHI9XCI1XCIgZmlsbD1cIiNEMzZDRkZcIiBzdHJva2U9XCIjRkZGRkZGXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIC8+XG4gICAgICA8L2c+XG5cbiAgICAgIDwhLS0gRGFzaGVkIGxpbmUgc3R5bGUgZm9yIGNvbm5lY3Rpb24gcHJldmlldyAtLT5cbiAgICAgIDxwYXR0ZXJuIGlkPVwiZGFzaGVkLWxpbmVcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxuICAgICAgICA8bGluZSB4MT1cIjBcIiB5MT1cIjVcIiB4Mj1cIjEwXCIgeTI9XCI1XCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtZGFzaGFycmF5PVwiNSw1XCIgLz5cbiAgICAgIDwvcGF0dGVybj5cblxuICAgICAgQGZvciAoc3dpbWxhbmUgb2Ygc3RhdGUuc3dpbWxhbmVzOyB0cmFjayBzd2ltbGFuZS5vcmRlcikge1xuICAgICAgPGNsaXBQYXRoIFthdHRyLmlkXT1cIidzd2ltbGFuZS1jbGlwLScgKyBzd2ltbGFuZS5vcmRlclwiPlxuICAgICAgICA8cmVjdCB4PVwiMFwiIHk9XCIwXCIgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIiBoZWlnaHQ9XCIyNjNcIiAvPlxuICAgICAgPC9jbGlwUGF0aD5cbiAgICAgIH1cbiAgICA8L2RlZnM+XG5cbiAgICA8IS0tIEJhY2tncm91bmQgZ3JpZCAtLT5cbiAgICA8cmVjdCB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCIgZmlsbD1cInVybCgjZ3JpZClcIiAvPlxuXG4gICAgPCEtLSBEaXNwbGF5IGEgbWVzc2FnZSB3aGVuIG5vIHN3aW1sYW5lcyBleGlzdCAtLT5cbiAgICBAaWYgKHN0YXRlLnN3aW1sYW5lcy5sZW5ndGggPT09IDApIHtcbiAgICA8dGV4dCB4PVwiNTAlXCIgeT1cIjUwJVwiIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiIGZvbnQtc2l6ZT1cIjE2XCIgZmlsbD1cIiM5NGEzYjhcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiPlxuICAgICAgU2VsZWN0IHRoZSBTd2ltbGFuZSB0b29sIGFuZCBjbGljayBvbiB0aGUgY2FudmFzIHRvIGFkZCBhIHN3aW1sYW5lXG4gICAgPC90ZXh0PlxuICAgIH1cblxuICAgIDwhLS0gVGhpcyBpcyB3aGVyZSB3b3JrZmxvdyBlbGVtZW50cyB3aWxsIGJlIGFkZGVkIGxhdGVyIC0tPlxuICAgIEBmb3IgKHN3aW1sYW5lIG9mIHN0YXRlLnN3aW1sYW5lczsgdHJhY2sgc3dpbWxhbmUub3JkZXIpIHtcbiAgICA8IS0tIDxnXG4gICAgICBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgwLCcgKyBzd2ltbGFuZS5vcmRlciAqIDI2MyArICcpJ1wiXG4gICAgICBbYXR0ci5jbGlwLXBhdGhdPVwiJ3VybCgjc3dpbWxhbmUtY2xpcC0nICsgc3dpbWxhbmUub3JkZXIgKyAnKSdcIlxuICAgID5cbiAgICAgIDxyZWN0XG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJjYW52YXNXaWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCIyNjNcIlxuICAgICAgICBmaWxsPVwiI2ZmZmZmZlwiXG4gICAgICAgIHN0cm9rZT1cIiNlMmU4ZjBcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgID48L3JlY3Q+XG5cbiAgICAgIDxyZWN0XG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJjYW52YXNXaWR0aFwiXG4gICAgICAgIGhlaWdodD1cIjQwXCJcbiAgICAgICAgZmlsbD1cIiNmOGZhZmNcIlxuICAgICAgICBzdHJva2U9XCIjZTJlOGYwXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICA+PC9yZWN0PlxuXG4gICAgICA8dGV4dFxuICAgICAgICB4PVwiMjBcIlxuICAgICAgICB5PVwiMjVcIlxuICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICBmb250LXNpemU9XCIxNFwiXG4gICAgICAgIGZpbGw9XCIjMzMzMzMzXCJcbiAgICAgICAgZm9udC13ZWlnaHQ9XCJib2xkXCJcbiAgICAgID5cbiAgICAgICAge3sgc3dpbWxhbmUubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cblxuICAgICAgPGdcbiAgICAgICAgY2xhc3M9XCJlZGl0LXN3aW1sYW5lLWJ1dHRvblwiXG4gICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKDEwMCwgMjApJ1wiXG4gICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICBvbkVkaXRTd2ltbGFuZSgkZXZlbnQsIHN3aW1sYW5lLCBzd2ltbGFuZS5vcmRlcik7XG4gICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxyZWN0XG4gICAgICAgICAgeD1cIi01XCJcbiAgICAgICAgICB5PVwiLTE1XCJcbiAgICAgICAgICB3aWR0aD1cIjQwXCJcbiAgICAgICAgICBoZWlnaHQ9XCIyMFwiXG4gICAgICAgICAgZmlsbD1cIiNmM2U4ZmZcIlxuICAgICAgICAgIHJ4PVwiM1wiXG4gICAgICAgICAgcnk9XCIzXCJcbiAgICAgICAgICBzdHJva2U9XCIjZDhiNGZlXCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgPjwvcmVjdD5cbiAgICAgICAgPHRleHRcbiAgICAgICAgICB4PVwiMTVcIlxuICAgICAgICAgIHk9XCIwXCJcbiAgICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjEyXCJcbiAgICAgICAgICBmaWxsPVwiIzdlMjJjZVwiXG4gICAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgICA+XG4gICAgICAgICAgRWRpdFxuICAgICAgICA8L3RleHQ+XG4gICAgICA8L2c+XG5cbiAgICAgIDxnIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKDIwMCwgMjApJ1wiPlxuICAgICAgICBAZm9yICh0YWcgb2Ygc3dpbWxhbmUudGFncy5zbGljZSgwLCAzKTsgdHJhY2sgdGFnLk5hbWU7IGxldCBpID0gJGluZGV4KVxuICAgICAgICB7XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgW2F0dHIueF09XCJpICogMTAwXCJcbiAgICAgICAgICB5PVwiNVwiXG4gICAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMlwiXG4gICAgICAgICAgZmlsbD1cIiM2NjY2NjZcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdGFnLk5hbWUgfX1cbiAgICAgICAgPC90ZXh0PlxuICAgICAgICB9IEBpZiAoc3dpbWxhbmUudGFncy5sZW5ndGggPiAzKSB7XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgW2F0dHIueF09XCIzICogMTAwICsgMTBcIlxuICAgICAgICAgIHk9XCI1XCJcbiAgICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjEyXCJcbiAgICAgICAgICBmaWxsPVwiIzY2NjY2NlwiXG4gICAgICAgID5cbiAgICAgICAgICAre3sgc3dpbWxhbmUudGFncy5sZW5ndGggLSAzIH19IG1vcmVcbiAgICAgICAgPC90ZXh0PlxuICAgICAgICB9XG4gICAgICA8L2c+XG4gICAgPC9nPiAtLT5cblxuICAgIDxnIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKDAsJyArIHN3aW1sYW5lLm9yZGVyICogMjYzICsgJyknXCI+XG4gICAgICA8IS0tIFN3aW1sYW5lIGNvbnRhaW5lciAtIHJlbW92ZSBzdHJva2UgdG8gbWFrZSBpdCBwdXJlbHkgYmFja2dyb3VuZCAtLT5cbiAgICAgIDxyZWN0IHg9XCIwXCIgeT1cIjBcIiBbYXR0ci53aWR0aF09XCJjYW52YXNXaWR0aFwiIFthdHRyLmhlaWdodF09XCIyNjNcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInN3aW1sYW5lLm9yZGVyICUgMiA9PT0gMCA/ICcjRkNGM0ZGJyA6ICcjRUNGRkY1J1wiIHN0cm9rZT1cIm5vbmVcIj48L3JlY3Q+XG5cbiAgICAgIDwhLS0gVmVydGljYWwgc3dpbWxhbmUgbGFiZWwgb24gdGhlIGxlZnQgLS0+XG4gICAgICA8ZyBjbGFzcz1cInN3aW1sYW5lLWxhYmVsXCI+XG4gICAgICAgIDwhLS0gUHVycGxlIGJhY2tncm91bmQgZm9yIHRoZSBsYWJlbCAtLT5cbiAgICAgICAgPHJlY3QgeD1cIjAuNVwiIHk9XCIwLjVcIiB3aWR0aD1cIjQzXCIgaGVpZ2h0PVwiMjE1XCIgcng9XCIxMC41XCIgZmlsbD1cIndoaXRlXCIgc3Ryb2tlPVwiI0QzNkNGRlwiPjwvcmVjdD5cblxuICAgICAgICA8IS0tIFBsdXMgYnV0dG9uIGF0IHRoZSB0b3AgLS0+XG4gICAgICAgIDxnIChjbGljayk9XCJcbiAgICAgICAgICAgIG9uRWRpdFN3aW1sYW5lKCRldmVudCwgc3dpbWxhbmUsIHN3aW1sYW5lLm9yZGVyKTtcbiAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIFwiPlxuICAgICAgICAgIDxyZWN0IHg9XCIxMi41XCIgeT1cIjEwXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cInRyYW5zcGFyZW50XCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIj48L3JlY3Q+XG5cbiAgICAgICAgICA8cGF0aCBkPVwiTTIyLjUyIDEyLjE3NFYxNy4wOEgyNy40N1YxOC41MUgyMi41MlYyMy4zOTRIMjEuMlYxOC41MUgxNi4yNVYxNy4wOEgyMS4yVjEyLjE3NEgyMi41MlpcIlxuICAgICAgICAgICAgZmlsbD1cIiMwMDAwRkZcIiBjbGFzcz1cInBsdXMtaWNvblwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCI+PC9wYXRoPlxuICAgICAgICA8L2c+XG5cbiAgICAgICAgPCEtLSBTd2ltbGFuZSBsYWJlbCAtLT5cbiAgICAgICAgPHRleHQgeD1cIjIyXCIgeT1cIjEwNlwiIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiIGZvbnQtc2l6ZT1cIjE0XCIgZmlsbD1cIiMzMzMzMzNcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKC05MCwgMjIsIDEwMClcIj5cbiAgICAgICAgICB7e1xuICAgICAgICAgIHN3aW1sYW5lLmxhYmVsLmxlbmd0aCA+IDEyXG4gICAgICAgICAgPyBzd2ltbGFuZS5sYWJlbC5zdWJzdHJpbmcoMCwgMTApICsgXCIuLi5cIlxuICAgICAgICAgIDogc3dpbWxhbmUubGFiZWxcbiAgICAgICAgICB9fVxuICAgICAgICA8L3RleHQ+XG5cbiAgICAgICAgPCEtLSBUYWcgY291bnQgaW5kaWNhdG9yIGF0IHRoZSBib3R0b20gLS0+XG4gICAgICAgIDxyZWN0IHg9XCIxMS41XCIgeT1cIjE4N1wiIHdpZHRoPVwiMjFcIiBoZWlnaHQ9XCIxOVwiIHJ4PVwiOS41XCIgZmlsbD1cIiM5RTlFOUVcIj48L3JlY3Q+XG4gICAgICAgIDx0ZXh0IHg9XCIyNFwiIHk9XCIyMDZcIiBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIiBmb250LXNpemU9XCIxMlwiIGZpbGw9XCJibGFja1wiIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoLTkwLCAyMiwgMjAwKVwiPlxuICAgICAgICAgIHt7IHN3aW1sYW5lLnRhZ3MubGVuZ3RoIH19XG4gICAgICAgIDwvdGV4dD5cbiAgICAgIDwvZz5cbiAgICA8L2c+XG5cbiAgICB9XG5cbiAgICA8IS0tIE5vZGVzIC0tPlxuICAgIEBmb3IgKHN3aW1sYW5lIG9mIHN0YXRlLnN3aW1sYW5lczsgdHJhY2sgc3dpbWxhbmUub3JkZXIpIHtcbiAgICA8IS0tIFJlbmRlciBub2RlcyBpbiB0aGlzIHN3aW1sYW5lIC0tPlxuICAgIEBmb3IgKG5vZGUgb2Ygc3dpbWxhbmUubm9kZXM7IHRyYWNrIG5vZGUuaWQpIHtcbiAgICA8ZyBjbGFzcz1cIm5vZGUtZWxlbWVudFwiIFthdHRyLnRyYW5zZm9ybV09XCJcbiAgICAgICAgJ3RyYW5zbGF0ZSgnICsgbm9kZS54ICsgJywnICsgKG5vZGUueSArIHN3aW1sYW5lLm9yZGVyICogMjYzKSArICcpJ1wiXG4gICAgICAobW91c2VlbnRlcik9XCJzaG93Q29ubmVjdGlvblBvaW50cyhub2RlLmlkLCBzd2ltbGFuZS5vcmRlcilcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZS5pZClcIj5cbiAgICAgIDwhLS0gU3RhcnQgbm9kZSBpbmRpY2F0b3IgKGNpcmNsZSBhbmQgYXJyb3cpIGZvciB0aGUgZmlyc3Qgbm9kZSAtLT5cbiAgICAgIEBpZiAobm9kZS5pc1N0YXJ0Tm9kZSkge1xuICAgICAgPCEtLSBDaXJjbGUgLS0+XG4gICAgICA8Y2lyY2xlIGN4PVwiLTUwXCIgY3k9XCI1MFwiIHI9XCIzMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjFcIj48L2NpcmNsZT5cbiAgICAgIDwhLS0gRm9ybSBpY29uIGZvciBzdGFydCBub2RlIC0tPlxuICAgICAgPHN2ZzpnIChjbGljayk9XCJcbiAgICAgICAgICB0b2dnbGVTdGFydE5vZGVGb3JtUG9wdXAoJGV2ZW50LCBub2RlLngsIG5vZGUueSwgc3dpbWxhbmUub3JkZXIpXG4gICAgICAgIFwiIGNsYXNzPVwic3RhZ2UtaWNvblwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNDUsIDQyKVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBwb2ludGVyLWV2ZW50czogYWxsXCI+XG4gICAgICAgIDwhLS0gVHJhbnNwYXJlbnQgcmVjdGFuZ2xlIHRvIGNhcHR1cmUgY2xpY2tzIC0tPlxuICAgICAgICA8c3ZnOnJlY3QgeD1cIi0yXCIgeT1cIi0yXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgZmlsbD1cInRyYW5zcGFyZW50XCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIiAvPlxuICAgICAgICA8c3ZnOnBhdGhcbiAgICAgICAgICBkPVwiTTE2LjUgMjAuNDc1VjE3LjQ3NUgxMy41VjE2LjQ3NUgxNi41VjEzLjQ3NUgxNy41VjE2LjQ3NUgyMC41VjE3LjQ3NUgxNy41VjIwLjQ3NUgxNi41Wk0zLjUgMTcuNVYxNi41SDQuNVYxNy41SDMuNVpNNi41IDE3LjVWMTYuNUgxMS41MTdDMTEuNTA1NyAxNi42NzY3IDExLjUwNDMgMTYuODQ1IDExLjUxMyAxNy4wMDVDMTEuNTIxIDE3LjE2NSAxMS41MzEgMTcuMzMgMTEuNTQzIDE3LjVINi41Wk0zLjUgMTMuNVYxMi41SDQuNVYxMy41SDMuNVpNNi41IDEzLjVWMTIuNUgxMy44MDRDMTMuNjEyNyAxMi42Mzg3IDEzLjQzMzMgMTIuNzkxMyAxMy4yNjYgMTIuOTU4QzEzLjA5OTMgMTMuMTI0NyAxMi45Mzc3IDEzLjMwNTMgMTIuNzgxIDEzLjVINi41Wk0zLjUgOS41VjguNUg0LjVWOS41SDMuNVpNNi41IDkuNVY4LjVIMTguNVY5LjVINi41Wk0zLjUgNS41VjQuNUg0LjVWNS41SDMuNVpNNi41IDUuNVY0LjVIMTguNVY1LjVINi41WlwiXG4gICAgICAgICAgW2F0dHIuZmlsbF09XCJzdGF0ZS53b3JrZmxvd0Zvcm1JZCA/ICcjRDM2Q0ZGJyA6ICdibGFjaydcIiB0cmFuc2Zvcm09XCJzY2FsZSgwLjcpXCIgLz5cbiAgICAgIDwvc3ZnOmc+XG4gICAgICA8IS0tIEFycm93IGZyb20gY2lyY2xlIHRvIG5vZGUgLS0+XG4gICAgICA8cGF0aCBkPVwiTSAtMjAgNTAgTCAwIDUwXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjFcIiBtYXJrZXItZW5kPVwidXJsKCNhcnJvd2hlYWQpXCI+PC9wYXRoPlxuICAgICAgfVxuXG4gICAgICA8IS0tIEV4aXQgcG9pbnQgaW5kaWNhdG9yIChjaXJjbGUgYW5kIGFycm93KSAtLT5cbiAgICAgIEBpZiAobm9kZS5zdGFnZURhdGE/LklzRXhpdFBvaW50KSB7XG4gICAgICA8IS0tIEFycm93IGZyb20gbm9kZSB0byBjaXJjbGUgLS0+XG4gICAgICA8cGF0aCBbYXR0ci5kXT1cIidNICcgKyBub2RlLndpZHRoICsgJyA1MCBMICcgKyAobm9kZS53aWR0aCArIDIwKSArICcgNTAnXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICBtYXJrZXItZW5kPVwidXJsKCNhcnJvd2hlYWQpXCI+PC9wYXRoPlxuICAgICAgPCEtLSBDaXJjbGUgLS0+XG4gICAgICA8Y2lyY2xlIFthdHRyLmN4XT1cIm5vZGUud2lkdGggKyA1MFwiIGN5PVwiNTBcIiByPVwiMzBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2Utd2lkdGg9XCIyXCI+PC9jaXJjbGU+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gSW5uZXIgZHJhZy1oYW5kbGU6IGluc2V0IDEycHggc28gdGhlIG5vZGUgZWRnZSByaW5nIHN0YXlzIGRyYWctZnJlZS5cbiAgICAgICAgICAgUmVuZGVyZWQgQkVGT1JFIHRoZSBub2RlIHNoYXBlcy9pY29ucyBzbyB0aGUgY2xpY2thYmxlIGljb25zIHBhaW50IG9uXG4gICAgICAgICAgIHRvcCBvZiBpdCBhbmQgd2luIHBvaW50ZXIgZXZlbnRzOyB0aGUgbm9kZSBib2R5IHN0aWxsIGZhbGxzIHRocm91Z2ggdG9cbiAgICAgICAgICAgdGhpcyBoYW5kbGUgYmVjYXVzZSBpdHMgc2hhcGUvbGFiZWwgdXNlIHBvaW50ZXItZXZlbnRzOm5vbmUuXG4gICAgICAgICAgIENvbm5lY3Rpb24gcG9pbnQgPHVzZT4gZWxlbWVudHMgYXJlIHJlbmRlcmVkIGFmdGVyIGV2ZXJ5dGhpbmcgc28gdGhleVxuICAgICAgICAgICBzdGF5IHRvcG1vc3QgYW5kIHdpbiBwb2ludGVyIGV2ZW50cyBhdCB0aGUgbm9kZSBlZGdlcy4gLS0+XG4gICAgICA8cmVjdCBjbGFzcz1cIm5vZGUtZHJhZy1oYW5kbGVcIlxuICAgICAgICBbYXR0ci54XT1cIjEyXCIgW2F0dHIueV09XCIxMlwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cIm5vZGUud2lkdGggLSAyNFwiIFthdHRyLmhlaWdodF09XCJub2RlLmhlaWdodCAtIDI0XCJcbiAgICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgW3N0eWxlLmN1cnNvcl09XCJnZXRDdXJzb3JGb3JOb2RlKG5vZGUuaWQpXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvbk5vZGVNb3VzZURvd24oJGV2ZW50LCBub2RlLCBzd2ltbGFuZS5vcmRlcilcIiAvPlxuXG4gICAgICA8IS0tIFN0YWdlIG5vZGUgLS0+XG4gICAgICBAaWYgKG5vZGUudHlwZSA9PT0gJ3N0YWdlJykge1xuICAgICAgPCEtLSA8cmVjdFxuICAgICAgICAgICAgICAgICAgeD1cIjBcIlxuICAgICAgICAgICAgICAgICAgeT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIud2lkdGhdPVwibm9kZS53aWR0aFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwibm9kZS5oZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0QzNkNGRlwiXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgICAgICAgICA+PC9yZWN0PiAtLT5cbiAgICAgIDxzdmc6ZyBsaWItc3RhZ2Utbm9kZSBbbm9kZV09XCJub2RlXCIgW2lzU3RhcnROb2RlXT1cIm5vZGUuaXNTdGFydE5vZGVcIlxuICAgICAgICAoc3RhZ2VQcm9wZXJ0aWVzVXBkYXRlZCk9XCJvblN0YWdlUHJvcGVydGllc1VwZGF0ZWQoJGV2ZW50KVwiIChzaG93U2hpZWxkRGlhbG9nKT1cIm9uU2hvd1NoaWVsZERpYWxvZygkZXZlbnQpXCJcbiAgICAgICAgKHNob3dFc2NhbGF0aW9uRGlhbG9nKT1cIm9uU2hvd0VzY2FsYXRpb25EaWFsb2coJGV2ZW50KVwiIChzaG93Rm9ybURpYWxvZyk9XCJcbiAgICAgICAgICB0b2dnbGVTdGFydE5vZGVGb3JtUG9wdXAoJGV2ZW50LCBub2RlLngsIG5vZGUueSwgc3dpbWxhbmUub3JkZXIsIG5vZGUpXG4gICAgICAgIFwiPjwvc3ZnOmc+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gRGVjaXNpb24gbm9kZSAtLT5cbiAgICAgIEBpZiAobm9kZS50eXBlID09PSAnZGVjaXNpb24nKSB7XG4gICAgICA8cGF0aCBbYXR0ci5kXT1cIlxuICAgICAgICAgICdNIDAgJyArXG4gICAgICAgICAgbm9kZS5oZWlnaHQgLyAyICtcbiAgICAgICAgICAnIEwgJyArXG4gICAgICAgICAgbm9kZS53aWR0aCAvIDIgK1xuICAgICAgICAgICcgMCcgK1xuICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICBub2RlLndpZHRoICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgIG5vZGUuaGVpZ2h0IC8gMiArXG4gICAgICAgICAgJyBMICcgK1xuICAgICAgICAgIG5vZGUud2lkdGggLyAyICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgIG5vZGUuaGVpZ2h0ICtcbiAgICAgICAgICAnIFonXG4gICAgICAgIFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lXCI+PC9wYXRoPlxuXG4gICAgICA8IS0tIERlY2lzaW9uIG5vZGUgY29uZGl0aW9uIGluZGljYXRvciBpY29uIC0tPlxuICAgICAgPHN2ZzpnIChjbGljayk9XCJzaG93RGVjaXNpb25Db25kaXRpb25zUG9wdXAoJGV2ZW50LCBub2RlLCBzd2ltbGFuZS5vcmRlcilcIiBjbGFzcz1cImRlY2lzaW9uLWNvbmRpdGlvbi1pY29uXCJcbiAgICAgICAgW2F0dHIudHJhbnNmb3JtXT1cIlxuICAgICAgICAgICd0cmFuc2xhdGUoJyArXG4gICAgICAgICAgKG5vZGUud2lkdGggLyAyIC0gMTApICtcbiAgICAgICAgICAnLCcgK1xuICAgICAgICAgIChub2RlLmhlaWdodCAvIDIgLSAxMCkgK1xuICAgICAgICAgICcpJ1xuICAgICAgICBcIj5cbiAgICAgICAgPHN2ZzpyZWN0IHg9XCItNVwiIHk9XCItNVwiIHdpZHRoPVwiMzBcIiBoZWlnaHQ9XCIzMFwiIGZpbGw9XCJ0cmFuc3BhcmVudFwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCIgLz5cbiAgICAgICAgPHN2ZzpwYXRoIGQ9XCJNMTAgMEgyMFYySDEwVjBaTTEwIDhIMjBWMTBIMTBWOFpNMTAgNEgyMFY2SDEwVjRaTTAgMEg4VjJIMFYwWk0wIDhIOFYxMEgwVjhaTTAgNEg4VjZIMFY0WlwiXG4gICAgICAgICAgZmlsbD1cIiNEMzZDRkZcIiAvPlxuICAgICAgPC9zdmc6Zz5cbiAgICAgIH1cblxuICAgICAgPCEtLSBGb3JtIG5vZGUgLS0+XG4gICAgICBAaWYgKG5vZGUudHlwZSA9PT0gJ2Zvcm0nKSB7XG4gICAgICA8cGF0aFxuICAgICAgICBkPVwiTTk1LjA2MjUgNTAuNTU5MVY5NS4wNjI1Qzk1LjA2MjUgOTcuOTcxNiA5My45MDY5IDEwMC43NjIgOTEuODQ5OCAxMDIuODE5Qzg5Ljc5MjggMTA0Ljg3NiA4Ny4wMDI4IDEwNi4wMzEgODQuMDkzOCAxMDYuMDMxSDMyLjkwNjJDMjkuOTk3MiAxMDYuMDMxIDI3LjIwNzIgMTA0Ljg3NiAyNS4xNTAyIDEwMi44MTlDMjMuMDkzMSAxMDAuNzYyIDIxLjkzNzUgOTcuOTcxNiAyMS45Mzc1IDk1LjA2MjVWMjEuOTM3NUMyMS45Mzc1IDE5LjAyODQgMjMuMDkzMSAxNi4yMzg1IDI1LjE1MDIgMTQuMTgxNEMyNy4yMDcyIDEyLjEyNDQgMjkuOTk3MiAxMC45Njg4IDMyLjkwNjIgMTAuOTY4OEg1NS40NzIyQzU3LjQxMDkgMTAuOTY5IDU5LjI3MDEgMTEuNzM5MiA2MC42NDEyIDEzLjEwOTlMOTIuOTIxMyA0NS4zOTAxQzk0LjI5MiA0Ni43NjExIDk1LjA2MjIgNDguNjIwNCA5NS4wNjI1IDUwLjU1OTFaXCJcbiAgICAgICAgdHJhbnNmb3JtPVwic2NhbGUoMC43KVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZVwiIC8+XG4gICAgICA8cGF0aFxuICAgICAgICBkPVwiTTU4LjUgMTIuNzk2OVY0MC4yMTg4QzU4LjUgNDIuMTU4MSA1OS4yNzA0IDQ0LjAxODEgNjAuNjQxOCA0NS4zODk1QzYyLjAxMzEgNDYuNzYwOCA2My44NzMxIDQ3LjUzMTIgNjUuODEyNSA0Ny41MzEySDkzLjIzNDRcIlxuICAgICAgICB0cmFuc2Zvcm09XCJzY2FsZSgwLjcpXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmVcIiAvPlxuICAgICAgPHRleHQgeD1cIjUwJVwiIHk9XCI1MCVcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiIGRvbWluYW50LWJhc2VsaW5lPVwibWlkZGxlXCIgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCIgZm9udC1zaXplPVwiMTRcIlxuICAgICAgICBmaWxsPVwiI0QzNkNGRlwiIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmVcIj5cbiAgICAgICAgRm9ybVxuICAgICAgPC90ZXh0PlxuICAgICAgfVxuXG4gICAgICA8IS0tIFN1YmZsb3cgbm9kZSAtLT5cbiAgICAgIEBpZiAobm9kZS50eXBlID09PSAnc3ViZmxvdycpIHtcbiAgICAgIDxzdmc6ZyBsaWItc3RhZ2Utbm9kZSBbbm9kZV09XCJub2RlXCIgW2lzU3RhcnROb2RlXT1cIm5vZGUuaXNTdGFydE5vZGVcIiBbaXNTdWJmbG93XT1cInRydWVcIlxuICAgICAgICAoc3RhZ2VQcm9wZXJ0aWVzVXBkYXRlZCk9XCJvblN0YWdlUHJvcGVydGllc1VwZGF0ZWQoJGV2ZW50KVwiIChzaG93U2hpZWxkRGlhbG9nKT1cIm9uU2hvd1NoaWVsZERpYWxvZygkZXZlbnQpXCJcbiAgICAgICAgKHNob3dFc2NhbGF0aW9uRGlhbG9nKT1cIm9uU2hvd0VzY2FsYXRpb25EaWFsb2coJGV2ZW50KVwiIChzaG93Rm9ybURpYWxvZyk9XCJcbiAgICAgICAgICB0b2dnbGVTdGFydE5vZGVGb3JtUG9wdXAoJGV2ZW50LCBub2RlLngsIG5vZGUueSwgc3dpbWxhbmUub3JkZXIsIG5vZGUpXG4gICAgICAgIFwiPjwvc3ZnOmc+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gQ29ubmVjdGlvbiBwb2ludHMgZm9yIHRoaXMgbm9kZSAocmVuZGVyZWQgbGFzdCA9IHRvcG1vc3QpIC0tPlxuICAgICAgQGZvciAocG9pbnQgb2Ygbm9kZS5jb25uZWN0aW9uUG9pbnRzIHx8IFtdOyB0cmFjayBwb2ludC5pZCkge1xuICAgICAgICBAaWYgKGlzQ29ubmVjdGlvblBvaW50VmlzaWJsZShub2RlLmlkKSkge1xuICAgICAgICAgIDx1c2UgY2xhc3M9XCJjb25uZWN0aW9uLXBvaW50XCIgW2F0dHIuaHJlZl09XCInI2Nvbm5lY3Rpb24tcG9pbnQtdGVtcGxhdGUnXCIgW2F0dHIueF09XCJwb2ludC54XCIgW2F0dHIueV09XCJwb2ludC55XCJcbiAgICAgICAgICAgIFthdHRyLmlkXT1cInBvaW50LmlkXCIgKG1vdXNlZG93bik9XCJzdGFydENvbm5lY3Rpb25EcmFnKCRldmVudCwgcG9pbnQsIHN3aW1sYW5lLm9yZGVyKVwiIC8+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2c+XG4gICAgPCEtLSBBIHRyYW5zcGFyZW50IGhvdmVyIGFyZWEgZm9yIGltcHJvdmVkIGhvdmVyIGRldGVjdGlvbiAtLT5cbiAgICA8cmVjdCBbYXR0ci54XT1cIm5vZGUueCAtIDEwXCIgW2F0dHIueV09XCJub2RlLnkgLSAxMFwiIFthdHRyLndpZHRoXT1cIm5vZGUud2lkdGggKyAyMFwiIFthdHRyLmhlaWdodF09XCJub2RlLmhlaWdodCArIDIwXCJcbiAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiIChtb3VzZW92ZXIpPVwic2hvd0Nvbm5lY3Rpb25Qb2ludHMobm9kZS5pZCwgc3dpbWxhbmUub3JkZXIpXCJcbiAgICAgIChtb3VzZW91dCk9XCJoaWRlQ29ubmVjdGlvblBvaW50cyhub2RlLmlkKVwiIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmVcIiAvPlxuICAgIH0gfVxuXG4gICAgPCEtLSBDb25uZWN0aW9ucyAtLT5cbiAgICBAZm9yIChjb25uZWN0aW9uIG9mIHN0YXRlLmNvbm5lY3Rpb25zOyB0cmFjayBjb25uZWN0aW9uLmlkKSB7XG4gICAgPGcgY2xhc3M9XCJjb25uZWN0aW9uLWVsZW1lbnRcIj5cbiAgICAgIDxwYXRoIFthdHRyLmRdPVwiZ2V0Q29ubmVjdGlvblBhdGhGb3JTYXZlZENvbm5lY3Rpb24oY29ubmVjdGlvbilcIiBzdHJva2U9XCIjRDM2Q0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgbWFya2VyLWVuZD1cInVybCgjYXJyb3doZWFkKVwiPjwvcGF0aD5cblxuICAgICAgPCEtLSBDb25uZWN0aW9uIExhYmVsIC0tPlxuICAgICAgQGlmIChjb25uZWN0aW9uLnNvdXJjZU5vZGVJZCAmJiBjb25uZWN0aW9uLnRhcmdldE5vZGVJZCkge1xuICAgICAgPGZvcmVpZ25PYmplY3QgW2F0dHIueF09XCJnZXRMYWJlbFBvc2l0aW9uKGNvbm5lY3Rpb24pLnhcIiBbYXR0ci55XT1cImdldExhYmVsUG9zaXRpb24oY29ubmVjdGlvbikueVwiIHdpZHRoPVwiMTUwXCJcbiAgICAgICAgaGVpZ2h0PVwiNDBcIiBzdHlsZT1cIm92ZXJmbG93OiB2aXNpYmxlOyBwb2ludGVyLWV2ZW50czogYWxsO1wiIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKC03NSwgLTEwKSdcIj5cbiAgICAgICAgPHdmLWxhYmVsLWVkaXRvciBbbGFiZWxdPVwiY29ubmVjdGlvbi5sYWJlbCB8fCAnTmV3IEFjdGlvbidcIiBbeF09XCIwXCIgW3ldPVwiMFwiIFtpc0Nvbm5lY3Rpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgKGxhYmVsQ2hhbmdlKT1cInNhdmVDb25uZWN0aW9uTGFiZWwoY29ubmVjdGlvbiwgJGV2ZW50KVwiIChvcGVuRGlhbG9nKT1cIm9uU2hvd0FjdGlvbkRpYWxvZyhjb25uZWN0aW9uKVwiIC8+XG4gICAgICA8L2ZvcmVpZ25PYmplY3Q+XG4gICAgICB9XG4gICAgPC9nPlxuICAgIH1cblxuICAgIDwhLS0gQ29ubmVjdGlvbiBwcmV2aWV3IGxpbmUgLS0+XG4gICAgQGlmIChzdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKSB7XG4gICAgPGc+XG4gICAgICA8cGF0aCBbYXR0ci5kXT1cImdldENvbm5lY3Rpb25QYXRoKClcIiBzdHJva2U9XCIjRDM2Q0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1kYXNoYXJyYXk9XCI1LDVcIiBmaWxsPVwibm9uZVwiPjwvcGF0aD5cbiAgICA8L2c+XG4gICAgfVxuICA8L3N2Zz5cblxuICA8ZGl2ICpuZ0lmPVwicG9wdXBWaXNpYmxlXCIgW3N0eWxlLnBvc2l0aW9uXT1cIidhYnNvbHV0ZSdcIiBbc3R5bGUubGVmdC5weF09XCJwb3B1cFhcIiBbc3R5bGUudG9wLnB4XT1cInBvcHVwWVwiPlxuICAgIDx2ZXJiZW4tcG9wLVVwIFtkcm9wZG93bk9wZW5dPVwidHJ1ZVwiIFtjdXN0b21TdHlsZXNdPVwieyAnei1pbmRleCc6ICc5OScgfVwiIFtlbmFibGVNb3VzZUxlYXZlXT1cImZhbHNlXCJcbiAgICAgIChkcm9wZG93bk9wZW5DaGFuZ2UpPVwiJGV2ZW50ID8gbnVsbCA6IGhpZGVDb25uZWN0aW9uUG9wdXAoKVwiPlxuICAgICAgPGRpdiBkcm9wZG93bi10cmlnZ2VyIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiPlxuICAgICAgICA8IS0tIEhpZGRlbiB0cmlnZ2VyIGVsZW1lbnQgLS0+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTMgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHNoYWRvdy1tZFwiIGRyb3Bkb3duLWNvbnRlbnQ+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1iLTIgZm9udC1tZWRpdW1cIj5DcmVhdGUgQ29ubmVjdGlvbjwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdHlwZSBvZiBhbGxvd2VkTm9kZVR5cGVzXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlTm9kZUNvbm5lY3Rpb24odHlwZSlcIj5cbiAgICAgICAgICAgICAgQ3JlYXRlIHt7IHR5cGUgfCB0aXRsZWNhc2UgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJweC0zIHB5LTIgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHRleHQtc20gaG92ZXI6YmctZ3JheS01MFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGlkZUNvbm5lY3Rpb25Qb3B1cCgpXCI+XG4gICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3ZlcmJlbi1wb3AtVXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJzaG93U3RhcnROb2RlRm9ybVBvcHVwXCIgW3N0eWxlLnBvc2l0aW9uXT1cIidhYnNvbHV0ZSdcIiBbc3R5bGUubGVmdC5weF09XCJzdGFydE5vZGVGb3JtUG9wdXBYXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInN0YXJ0Tm9kZUZvcm1Qb3B1cFlcIj5cbiAgICA8dmVyYmVuLXBvcC1VcCBbZHJvcGRvd25PcGVuXT1cInRydWVcIiBbY3VzdG9tU3R5bGVzXT1cInsgJ3otaW5kZXgnOiAnMTAwJyB9XCI+XG4gICAgICA8ZGl2IGRyb3Bkb3duLXRyaWdnZXIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+XG4gICAgICAgIDwhLS0gSGlkZGVuIHRyaWdnZXIgZWxlbWVudCAtLT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInAtMyBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQgc2hhZG93LW1kIHctNjRcIiBkcm9wZG93bi1jb250ZW50XG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IHotaW5kZXg6IDEwMDBcIj5cbiAgICAgICAgPGg0IGNsYXNzPVwibWItMiBmb250LW1lZGl1bVwiPlNlbGVjdCBXb3JrZmxvdyBGb3JtPC9oND5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0yXCI+XG4gICAgICAgICAgTG9hZGluZyBmb3Jtcy4uLlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmdTdGFydE5vZGVGb3Jtc1wiIGNsYXNzPVwibWF4LWgtNDggb3ZlcmZsb3cteS1hdXRvXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAxOTJweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBweC0zIHB5LTIgYmctZ3JheS01MCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQgdGV4dC1zbSBob3ZlcjpiZy1ncmF5LTUwIHRleHQtbGVmdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTdGFydE5vZGVGb3JtKG51bGwpXCI+XG4gICAgICAgICAgICAgIENsZWFyIGZvcm0gc2VsZWN0aW9uXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmb3JtIG9mIHN0YXJ0Tm9kZUZvcm1zTGlzdFwiIGNsYXNzPVwibWItMVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInctZnVsbCBweC0zIHB5LTIgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHRleHQtc20gaG92ZXI6YmctZ3JheS01MCB0ZXh0LWxlZnRcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdiZy1ibHVlLTUwICFib3JkZXItYmx1ZS01MDAgIWJvcmRlci0yIGZvbnQtc2VtaWJvbGQnOiBmb3JtPy5Db2RlID09PSBhY3RpdmVOb2RlRm9yRm9ybVNlbGVjdGlvbj8uc3RhZ2VEYXRhPy5mb3JtSWR9XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN0YXJ0Tm9kZUZvcm0oZm9ybSlcIj5cbiAgICAgICAgICAgICAge3sgZm9ybS5OYW1lIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3RhcnROb2RlRm9ybXNMaXN0Lmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwidGV4dC1jZW50ZXIgcHktMiB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICBObyBmb3JtcyBhdmFpbGFibGVcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3ZlcmJlbi1wb3AtVXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJzaG93U3ViZmxvd1BvcHVwXCIgW3N0eWxlLnBvc2l0aW9uXT1cIidhYnNvbHV0ZSdcIiBbc3R5bGUubGVmdC5weF09XCJzdWJmbG93UG9wdXBYXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInN1YmZsb3dQb3B1cFlcIj5cbiAgICA8dmVyYmVuLXBvcC1VcCBbZHJvcGRvd25PcGVuXT1cInRydWVcIiBbY3VzdG9tU3R5bGVzXT1cInsgJ3otaW5kZXgnOiAnMTAwJyB9XCI+XG4gICAgICA8ZGl2IGRyb3Bkb3duLXRyaWdnZXIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+XG4gICAgICAgIDwhLS0gSGlkZGVuIHRyaWdnZXIgZWxlbWVudCAtLT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInAtMyBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQgc2hhZG93LW1kIHctNjRcIiBkcm9wZG93bi1jb250ZW50XG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IHotaW5kZXg6IDEwMDBcIj5cbiAgICAgICAgPGg0IGNsYXNzPVwibWItMiBmb250LW1lZGl1bVwiPlNlbGVjdCBXb3JrZmxvdzwvaDQ+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdXb3JrZmxvd3NcIiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTJcIj5cbiAgICAgICAgICBMb2FkaW5nIHdvcmtmbG93cy4uLlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmdXb3JrZmxvd3NcIiBjbGFzcz1cIm1heC1oLTQ4IG92ZXJmbG93LXktYXV0b1wiIHN0eWxlPVwibWF4LWhlaWdodDogMTkycHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgd29ya2Zsb3cgb2Ygd29ya2Zsb3dzTGlzdFwiIGNsYXNzPVwibWItMVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInctZnVsbCBweC0zIHB5LTIgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHRleHQtc20gaG92ZXI6YmctZ3JheS01MCB0ZXh0LWxlZnRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U3ViZmxvd1dvcmtmbG93KHdvcmtmbG93KVwiPlxuICAgICAgICAgICAgICB7eyB3b3JrZmxvdy5OYW1lIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwid29ya2Zsb3dzTGlzdC5sZW5ndGggPT09IDBcIiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTIgdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgTm8gd29ya2Zsb3dzIGF2YWlsYWJsZVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgPC9kaXY+XG5cbiAgPGxpYi1jb25kaXRpb25zLXBvcHVwIFt2aXNpYmxlXT1cInNob3dEZWNpc2lvbkNvbmRpdGlvbkRpYWxvZ1wiIFtkZWNpc2lvbk5vZGVJZF09XCJhY3RpdmVEZWNpc2lvbk5vZGVJZFwiXG4gICAgW25ld0Nvbm5lY3Rpb25JZF09XCJhY3RpdmVDb25uZWN0aW9uSWRcIiBbcG9wdXBYXT1cImRlY2lzaW9uQ29uZGl0aW9uUG9wdXBYXCIgW3BvcHVwWV09XCJkZWNpc2lvbkNvbmRpdGlvblBvcHVwWVwiXG4gICAgKGNsb3NlZCk9XCJvbkRlY2lzaW9uQ29uZGl0aW9uQ2FuY2VsbGVkKClcIiAoc2F2ZWQpPVwib25EZWNpc2lvbkNvbmRpdGlvblNhdmVkKCRldmVudClcIj48L2xpYi1jb25kaXRpb25zLXBvcHVwPlxuXG4gIDwhLS0gPGxpYi1kZWNpc2lvbi1wb3B1cFxuICAgIFt2aXNpYmxlXT1cInNob3dDb25kaXRpb25zRGlhbG9nXCJcbiAgICBbZGVjaXNpb25Ob2RlSWRdPVwiYWN0aXZlRGVjaXNpb25Ob2RlSWRcIlxuICAgIFtwb3B1cFhdPVwiZGVjaXNpb25Db25kaXRpb25Qb3B1cFhcIlxuICAgIFtwb3B1cFldPVwiZGVjaXNpb25Db25kaXRpb25Qb3B1cFlcIlxuICAgIChjbG9zZWQpPVwib25EZWNpc2lvbkNvbmRpdGlvbkNhbmNlbGxlZCgpXCJcbiAgPjwvbGliLWRlY2lzaW9uLXBvcHVwPiAtLT5cblxuICA8bGliLXN0YWdlLWRpYWxvZyBbdmlzaWJsZV09XCJzaG93U3RhZ2VEaWFsb2dMb2NhbFwiIFtzdGFnZURhdGFdPVwiYWN0aXZlU3RhZ2VEYXRhIHx8IHt9XCJcbiAgICAoY2xvc2VkKT1cIm9uU3RhZ2VEaWFsb2dDbG9zZWQoKVwiIChzYXZlZCk9XCJvblN0YWdlRGlhbG9nU2F2ZWQoJGV2ZW50KVwiPjwvbGliLXN0YWdlLWRpYWxvZz5cblxuICA8bGliLWFjdGlvbi1kaWFsb2cgW3Zpc2libGVdPVwic2hvd0FjdGlvbkRpYWxvZ0xvY2FsXCIgW2FjdGlvbkRhdGFdPVwiYWN0aXZlQWN0aW9uRGF0YVwiIChjbG9zZWQpPVwib25BY3Rpb25EaWFsb2dDbG9zZWQoKVwiXG4gICAgKHNhdmVkKT1cIm9uQWN0aW9uRGlhbG9nU2F2ZWQoJGV2ZW50KVwiIChkZWxldGVkKT1cIm9uQWN0aW9uRGlhbG9nRGVsZXRlZCgkZXZlbnQpXCI+PC9saWItYWN0aW9uLWRpYWxvZz5cblxuXG4gIDxsaWItZXNjYWxhdGlvbi1kaWFsb2cgW3Zpc2libGVdPVwic2hvd0VzY2FsYXRpb25EaWFsb2dMb2NhbFwiIFt0eXBlXT1cImFjdGl2ZUVzY2FsYXRpb25UeXBlKCkhXCJcbiAgICBbc3RhZ2VDb2RlXT1cImFjdGl2ZVN0YWdlQ29kZSgpIHx8ICcnXCIgW3dvcmtmbG93Q29kZV09XCJzdGF0ZS53b3JrZmxvdz8uQ29kZSB8fCAnJ1wiXG4gICAgKGNsb3NlZCk9XCJvbkVzY2FsYXRpb25EaWFsb2dDbG9zZWQoKVwiPjwvbGliLWVzY2FsYXRpb24tZGlhbG9nPlxuPC9kaXY+XG4iXX0=
1202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItY2FudmFzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvd29ya2Zsb3ctZGVzaWduZXIvZGVzaWduZXItY2FudmFzL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL2Rlc2lnbmVyLWNhbnZhcy9kZXNpZ25lci1jYW52YXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBa0J2QixNQUFNLE9BQU8sdUJBQXVCO0lBNkd6QjtJQUNDO0lBN0dELFlBQVksR0FBYSxJQUFJLENBQUM7SUFDN0IsZUFBZSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0lBQy9ELGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQy9DLG9CQUFvQixHQUNsQixJQUFJLENBQUM7SUFDRyxzQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFHL0MsQ0FBQztJQUNLLHVCQUF1QixHQUFHLElBQUksWUFBWSxFQUdoRCxDQUFDO0lBRUwsK0JBQStCO0lBQ1EsU0FBUyxDQUEwQjtJQUcxRSxlQUFlLENBQUMsS0FBaUI7UUFDL0Isc0VBQXNFO1FBQ3RFLElBQ0UsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3RCLENBQUMsSUFBSSxDQUFDLHNCQUFzQjtZQUM1QixDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksdUNBQXVDO1lBQzdELElBQUks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LENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBzaWduYWwsXG4gIFZpZXdDaGlsZCxcbiAgV3JpdGFibGVTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXNjYWxhdGlvblR5cGUsIEZvcm0sIFdvcmtmbG93LCBXb3JrZmxvd0FjdGlvbiwgV29ya2Zsb3dTdGFnZSB9IGZyb20gJ3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBXb3JrZmxvd0RhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vd29ya2Zsb3ctZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IFdvcmtmbG93RGVzaWduZXJTdGF0ZSB9IGZyb20gJy4uL3dvcmtmbG93LWRlc2lnbmVyLnN0YXRlJztcbmltcG9ydCB7XG4gIENvbm5lY3Rpb24sXG4gIENvbm5lY3Rpb25Qb2ludCxcbiAgTm9kZSxcbiAgU3dpbWxhbmVJdGVtLFxuICBUb29sVHlwZSxcbiAgTm9kZSBhcyBXRk5vZGUsXG59IGZyb20gJy4uL3dvcmtmbG93LWRlc2lnbmVyLnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWRlc2lnbmVyLWNhbnZhcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXNpZ25lci1jYW52YXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZGVzaWduZXItY2FudmFzLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25lckNhbnZhc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHNlbGVjdGVkVG9vbDogVG9vbFR5cGUgPSBudWxsO1xuICBAT3V0cHV0KCkgY2xpY2tlZFBvc2l0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBzdWJmbG93U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHBlbmRpbmdTdGFnZVBvc2l0aW9uOiB7IHN3aW1sYW5lSW5kZXg6IG51bWJlcjsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPVxuICAgIG51bGw7XG4gIEBPdXRwdXQoKSBzdGFnZVByb3BlcnRpZXNVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgc3RhZ2VEYXRhOiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+O1xuICB9PigpO1xuICBAT3V0cHV0KCkgYWN0aW9uUHJvcGVydGllc1VwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBjb25uZWN0aW9uSWQ6IHN0cmluZztcbiAgICBhY3Rpb25EYXRhOiBQYXJ0aWFsPFdvcmtmbG93QWN0aW9uPjtcbiAgfT4oKTtcblxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIFNWRyBlbGVtZW50XG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8U1ZHRWxlbWVudD47XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93Om1vdXNldXAnLCBbJyRldmVudCddKVxuICBvbldpbmRvd01vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgcG9wdXAgb3BlbiBidXQgdGhlIG1vdXNlIGlzIHJlbGVhc2VkIG91dHNpZGUsIGNsZWFuIHVwXG4gICAgaWYgKFxuICAgICAgIXRoaXMuc2hvd1N1YmZsb3dQb3B1cCAmJlxuICAgICAgIXRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cCAmJlxuICAgICAgIXRoaXMucG9wdXBWaXNpYmxlICYmIC8vIE9ubHkgZW5kIGRyYWcgaWYgbm8gcG9wdXAgaXMgdmlzaWJsZVxuICAgICAgdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZygnRXh0ZXJuYWwgbW91c2V1cCBkZXRlY3RlZCAtIGNsZWFuaW5nIHVwIGNvbm5lY3Rpb24gZHJhZycpO1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbnZhcyBkaW1lbnNpb25zXG4gIGNhbnZhc1dpZHRoID0gMzAwMDtcbiAgY2FudmFzSGVpZ2h0ID0gMjAwMDtcblxuICAvLyBHcmlkIHNpemVcbiAgZ3JpZFNpemUgPSAyMDtcblxuICBzd2ltbGFuZUhlaWdodCA9IDI2MztcbiAgdmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwb3B1cFZpc2libGUgPSBmYWxzZTtcbiAgcG9wdXBYID0gMDtcbiAgcG9wdXBZID0gMDtcbiAgYWxsb3dlZE5vZGVUeXBlczogc3RyaW5nW10gPSBbXTtcblxuICBzaG93U3RhcnROb2RlRm9ybVBvcHVwOiBib29sZWFuID0gZmFsc2U7XG4gIHN0YXJ0Tm9kZUZvcm1zTGlzdDogRm9ybVtdID0gW107XG4gIGlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zOiBib29sZWFuID0gZmFsc2U7XG4gIHN0YXJ0Tm9kZUZvcm1Qb3B1cFg6IG51bWJlciA9IDA7XG4gIHN0YXJ0Tm9kZUZvcm1Qb3B1cFk6IG51bWJlciA9IDA7XG4gIGFjdGl2ZU5vZGVGb3JGb3JtU2VsZWN0aW9uOiBOb2RlIHwgbnVsbCA9IG51bGw7XG4gIG5vZGVGb3JtczogV3JpdGFibGVTaWduYWw8XG4gICAgUmVjb3JkPHN0cmluZywgeyBmb3JtSWQ6IHN0cmluZzsgZm9ybU5hbWU6IHN0cmluZyB9PlxuICA+ID0gc2lnbmFsKHt9KTtcblxuICBzaG93U3ViZmxvd1BvcHVwOiBib29sZWFuID0gZmFsc2U7XG4gIHdvcmtmbG93c0xpc3Q6IFdvcmtmbG93W10gPSBbXTtcbiAgaXNMb2FkaW5nV29ya2Zsb3dzOiBib29sZWFuID0gZmFsc2U7XG4gIHN1YmZsb3dQb3B1cFg6IG51bWJlciA9IDA7XG4gIHN1YmZsb3dQb3B1cFk6IG51bWJlciA9IDA7XG4gIHBlbmRpbmdTdWJmbG93UG9zaXRpb246IHtcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXI7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIHBlbmRpbmdEZWNpc2lvbkNvbm5lY3Rpb246IHtcbiAgICBkZWNpc2lvbk5vZGVJZDogc3RyaW5nO1xuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgcGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludDogQ29ubmVjdGlvblBvaW50IHwgbnVsbCA9IG51bGw7XG4gIHBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8g4pSA4pSA4pSAIE5vZGUtZHJhZyBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgaXNEcmFnZ2luZ05vZGUgPSBmYWxzZTtcbiAgZHJhZ2dpbmdOb2RlOiBOb2RlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZHJhZ2dpbmdOb2RlU3dpbWxhbmVJbmRleDogbnVtYmVyID0gLTE7XG4gIC8qKiBNb3VzZSBvZmZzZXQgcmVsYXRpdmUgdG8gbm9kZSB0b3AtbGVmdCBhdCBkcmFnIHN0YXJ0IChhYnNvbHV0ZSBjYW52YXMgY29vcmRzKS4gKi9cbiAgcHJpdmF0ZSBkcmFnT2Zmc2V0WCA9IDA7XG4gIHByaXZhdGUgZHJhZ09mZnNldFkgPSAwO1xuXG4gIHNob3dEZWNpc2lvbkNvbmRpdGlvbkRpYWxvZzogYm9vbGVhbiA9IGZhbHNlO1xuICBzaG93Q29uZGl0aW9uc0RpYWxvZzogYm9vbGVhbiA9IGZhbHNlO1xuICBhY3RpdmVEZWNpc2lvbk5vZGVJZDogc3RyaW5nID0gJyc7XG4gIGFjdGl2ZUNvbm5lY3Rpb25JZDogc3RyaW5nID0gJyc7XG4gIGRlY2lzaW9uQ29uZGl0aW9uUG9wdXBYOiBudW1iZXIgPSAwO1xuICBkZWNpc2lvbkNvbmRpdGlvblBvcHVwWTogbnVtYmVyID0gMDtcblxuICBpc0NyZWF0aW5nU3RhZ2VGcm9tRGVjaXNpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGVuZGluZ0RlY2lzaW9uQ29uZGl0aW9uOiBzdHJpbmcgPSAnJztcbiAgYWN0aXZlU3RhZ2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGFjdGl2ZUFjdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBzaG93U3RhZ2VEaWFsb2dMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBzaG93RXNjYWxhdGlvbkRpYWxvZ0xvY2FsOiBib29sZWFuID0gZmFsc2U7XG4gIGFjdGl2ZUVzY2FsYXRpb25UeXBlOiBXcml0YWJsZVNpZ25hbDxFc2NhbGF0aW9uVHlwZSB8IG51bGw+ID0gc2lnbmFsKG51bGwpO1xuICBhY3RpdmVTdGFnZUNvZGU6IFdyaXRhYmxlU2lnbmFsPHN0cmluZyB8IG51bGw+ID0gc2lnbmFsKG51bGwpO1xuICBhY3RpdmVTdGFnZURhdGE6IFBhcnRpYWw8V29ya2Zsb3dTdGFnZT4gPSB7fTtcbiAgYWN0aXZlQWN0aW9uRGF0YTogQ29ubmVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIHNob3dBY3Rpb25EaWFsb2dMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHBvdGVudGlhbFRhcmdldFBvaW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzdGF0ZTogV29ya2Zsb3dEZXNpZ25lclN0YXRlLFxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IFdvcmtmbG93RGF0YVNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNhbnZhc1NpemUoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBtb3VzZSBjbGljayBvbiBjYW52YXNcbiAgb25DYW52YXNDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIE9ubHkgcHJvY2VzcyBjYW52YXMgY2xpY2tzIGlmIGEgdG9vbCBpcyBzZWxlY3RlZFxuICAgIGlmICghdGhpcy5zZWxlY3RlZFRvb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBjbGljayBvY2N1cnJlZFxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdDYW52YXMgY2xpY2tlZCBhdDonLFxuICAgICAgcG9zaXRpb24sXG4gICAgICAnd2l0aCB0b29sOicsXG4gICAgICB0aGlzLnNlbGVjdGVkVG9vbFxuICAgICk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHN3aW1sYW5lIGluZGV4IGJhc2VkIG9uIHBvc2l0aW9uXG4gICAgLy8gY29uc3Qgc3dpbWxhbmVJbmRleCA9IE1hdGguZmxvb3IocG9zaXRpb24ueSAvIHRoaXMuc3dpbWxhbmVIZWlnaHQpO1xuXG4gICAgLy8gT25seSBlbWl0IHRoZSBwb3NpdGlvbiBpZiB3ZSBoYXZlIGEgdG9vbCBzZWxlY3RlZCBhbmQgaXQncyBhIHZhbGlkIGNsaWNrIGFyZWFcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRvb2wpIHtcbiAgICAgIHRoaXMuY2xpY2tlZFBvc2l0aW9uLmVtaXQoe1xuICAgICAgICB4OiBwb3NpdGlvbi54LFxuICAgICAgICB5OiBwb3NpdGlvbi55LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25TaG93U2hpZWxkRGlhbG9nKHN0YWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIG5vZGVcbiAgICBjb25zdCBub2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKHN0YWdlSWQpO1xuICAgIGlmIChub2RlSW5mbykge1xuICAgICAgdGhpcy5hY3RpdmVTdGFnZUlkID0gc3RhZ2VJZDtcbiAgICAgIHRoaXMuYWN0aXZlU3RhZ2VEYXRhID0geyAuLi5ub2RlSW5mby5ub2RlLnN0YWdlRGF0YSwgaWQ6IHN0YWdlSWQgfTtcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuYWN0aXZlU3RhZ2VEYXRhLCBcIkFDVElWRSBTVEFHRSBEQVRBXCIpO1xuICAgICAgdGhpcy5zaG93U3RhZ2VEaWFsb2dMb2NhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgb25TaG93QWN0aW9uRGlhbG9nKGNvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coXCJDT05FQ1RJT05cIiwgY29ubmVjdGlvbkluZm8pO1xuICAgIC8vIEZpbmQgdGhlIG5vZGVcbiAgICAvLyBjb25zdCBjb25uZWN0aW9uSW5mbyA9IHRoaXMuc3RhdGUuZmluZEFjdGlvbkJ5SWQoYWN0aW9uSWQpO1xuICAgIGlmIChjb25uZWN0aW9uSW5mbykge1xuICAgICAgdGhpcy5hY3RpdmVBY3Rpb25JZCA9IGNvbm5lY3Rpb25JbmZvLmlkO1xuICAgICAgdGhpcy5hY3RpdmVBY3Rpb25EYXRhID0gY29ubmVjdGlvbkluZm87XG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmFjdGl2ZUFjdGlvbkRhdGEpO1xuICAgICAgdGhpcy5zaG93QWN0aW9uRGlhbG9nTG9jYWwgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG9uU2hvd0VzY2FsYXRpb25EaWFsb2coZXZlbnQ6IHtcbiAgICBzdGFnZUlkOiBzdHJpbmc7XG4gICAgdHlwZTogRXNjYWxhdGlvblR5cGU7XG4gIH0pOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBub2RlXG4gICAgY29uc3Qgbm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChldmVudC5zdGFnZUlkKTtcbiAgICBpZiAobm9kZUluZm8pIHtcbiAgICAgIHRoaXMuYWN0aXZlU3RhZ2VJZCA9IGV2ZW50LnN0YWdlSWQ7XG4gICAgICB0aGlzLmFjdGl2ZVN0YWdlRGF0YSA9IG5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhIHx8IHtcbiAgICAgICAgaWQ6IHRoaXMuYWN0aXZlU3RhZ2VJZCxcbiAgICAgIH07XG4gICAgICB0aGlzLmFjdGl2ZUVzY2FsYXRpb25UeXBlLnNldChldmVudC50eXBlKTtcbiAgICAgIHRoaXMuYWN0aXZlU3RhZ2VDb2RlLnNldCh0aGlzLmFjdGl2ZVN0YWdlRGF0YT8uQ29kZSB8fCAnJyk7XG4gICAgICBjb25zb2xlLmxvZygnQWN0aXZlIFN0YWdlIERhdGE6JywgdGhpcy5hY3RpdmVTdGFnZURhdGEpO1xuICAgICAgY29uc29sZS5sb2coJ0VzY2FsYXRpb24gVHlwZTonLCB0aGlzLmFjdGl2ZUVzY2FsYXRpb25UeXBlKCkpO1xuICAgICAgdGhpcy5zaG93RXNjYWxhdGlvbkRpYWxvZ0xvY2FsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGRpYWxvZyBjbG9zdXJlXG4gIG9uU3RhZ2VEaWFsb2dDbG9zZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93U3RhZ2VEaWFsb2dMb2NhbCA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aXZlU3RhZ2VJZCA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVTdGFnZURhdGEgPSB7fTtcbiAgfVxuXG4gIG9uQWN0aW9uRGlhbG9nQ2xvc2VkKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0FjdGlvbkRpYWxvZ0xvY2FsID0gZmFsc2U7XG4gICAgdGhpcy5hY3RpdmVBY3Rpb25JZCA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVBY3Rpb25EYXRhID0gbnVsbDtcbiAgfVxuXG4gIG9uQWN0aW9uRGlhbG9nRGVsZXRlZChjb25uZWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSB0aGUgY29ubmVjdGlvbiBmcm9tIHN0YXRlXG4gICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucyA9IHRoaXMuc3RhdGUuY29ubmVjdGlvbnMuZmlsdGVyKFxuICAgICAgKGMpID0+IGMuaWQgIT09IGNvbm5lY3Rpb25JZFxuICAgICk7XG4gICAgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xuICAgIHRoaXMub25BY3Rpb25EaWFsb2dDbG9zZWQoKTtcbiAgfVxuXG4gIC8vIEFkZCB0aGlzIG1ldGhvZCB0byBoYW5kbGUgZGlhbG9nIGNsb3N1cmVcbiAgb25Fc2NhbGF0aW9uRGlhbG9nQ2xvc2VkKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0VzY2FsYXRpb25EaWFsb2dMb2NhbCA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aXZlU3RhZ2VJZCA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVFc2NhbGF0aW9uVHlwZS5zZXQobnVsbCk7XG4gICAgdGhpcy5hY3RpdmVTdGFnZUNvZGUuc2V0KG51bGwpO1xuICAgIHRoaXMuYWN0aXZlU3RhZ2VEYXRhID0ge307XG4gIH1cblxuICAvLyBBZGQgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNhdmluZyBzdGFnZSBkYXRhXG4gIG9uU3RhZ2VEaWFsb2dTYXZlZChzdGFnZURhdGE6IFBhcnRpYWw8V29ya2Zsb3dTdGFnZT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVTdGFnZUlkKSB7XG4gICAgICAvLyBFZGl0aW5nIGFuIGV4aXN0aW5nIHN0YWdlXG4gICAgICBjb25zdCBub2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKHRoaXMuYWN0aXZlU3RhZ2VJZCk7XG4gICAgICBpZiAobm9kZUluZm8pIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzdGFnZSBkYXRhXG4gICAgICAgIG5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhID0ge1xuICAgICAgICAgIC4uLm5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhLFxuICAgICAgICAgIC4uLnN0YWdlRGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZWQgc3RhZ2UgZGF0YTonLCBub2RlSW5mby5ub2RlLnN0YWdlRGF0YSk7XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcGFyZW50IGNvbXBvbmVudCB0byBrbm93IGFib3V0IHRoZSB1cGRhdGVcbiAgICAgICAgdGhpcy5zdGFnZVByb3BlcnRpZXNVcGRhdGVkLmVtaXQoe1xuICAgICAgICAgIG5vZGVJZDogdGhpcy5hY3RpdmVTdGFnZUlkLFxuICAgICAgICAgIHN0YWdlRGF0YTogbm9kZUluZm8ubm9kZS5zdGFnZURhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIHRoZSBkaWFsb2dcbiAgICB0aGlzLm9uU3RhZ2VEaWFsb2dDbG9zZWQoKTtcbiAgfVxuXG4gIG9uQWN0aW9uRGlhbG9nU2F2ZWQoYWN0aW9uRGF0YTogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZUFjdGlvbklkKSB7XG4gICAgICAvLyBFZGl0aW5nIGFuIGV4aXN0aW5nIHN0YWdlXG4gICAgICAvLyBsZXQgY29ubmVjdGlvbkluZm8gPSB0aGlzLnN0YXRlLmZpbmRBY3Rpb25CeUlkKHRoaXMuYWN0aXZlQWN0aW9uSWQpO1xuICAgICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucyA9IHRoaXMuc3RhdGUuY29ubmVjdGlvbnMubWFwKChjb25uZWN0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5pZCA9PT0gdGhpcy5hY3RpdmVBY3Rpb25JZCkge1xuICAgICAgICAgIGNvbm5lY3Rpb24ubGFiZWwgPSBhY3Rpb25EYXRhLmxhYmVsO1xuICAgICAgICAgIGNvbm5lY3Rpb24uYWN0aW9uID0gYWN0aW9uRGF0YS5hY3Rpb247XG4gICAgICAgICAgY29ubmVjdGlvbi50YXJnZXRTdGF0dXMgPSBhY3Rpb25EYXRhLnRhcmdldFN0YXR1cztcbiAgICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRlZCBhY3Rpb24gZGF0YTonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xuICAgIHRoaXMub25BY3Rpb25EaWFsb2dDbG9zZWQoKTtcbiAgfVxuXG4gIHVwZGF0ZUNhbnZhc1NpemUoKTogdm9pZCB7XG4gICAgY29uc3QgcmVxdWlyZWRIZWlnaHQgPVxuICAgICAgKHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCArIDEpICogdGhpcy5zd2ltbGFuZUhlaWdodDtcbiAgICB0aGlzLmNhbnZhc0hlaWdodCA9IE1hdGgubWF4KDIwMDAsIHJlcXVpcmVkSGVpZ2h0KTsgLy8gRW5zdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb3VyIGRlZmF1bHQgaGVpZ2h0XG5cbiAgICAvLyBVcGRhdGUgYWxsIHRoZSBzd2ltbGFuZSBjbGlwIHBhdGhzIHdoZW4gc2l6ZSBjaGFuZ2VzXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlLnN3aW1sYW5lcy5mb3JFYWNoKChzd2ltbGFuZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY2xpcFBhdGhJZCA9IGBzd2ltbGFuZS1jbGlwLSR7aW5kZXh9YDtcbiAgICAgICAgY29uc3QgY2xpcFBhdGhFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2xpcFBhdGhJZCk7XG4gICAgICAgIGlmIChjbGlwUGF0aEVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCByZWN0RWxlbWVudCA9IGNsaXBQYXRoRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdyZWN0Jyk7XG4gICAgICAgICAgaWYgKHJlY3RFbGVtZW50KSB7XG4gICAgICAgICAgICByZWN0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgdGhpcy5jYW52YXNXaWR0aC50b1N0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIG1vdXNlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBTVkcgY2FudmFzXG4gIHByaXZhdGUgZ2V0TW91c2VQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgLy8gVXNlIGNsaWVudFgvWSBhbmQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgZm9yIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wLFxuICAgIH07XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgbW91c2UgcG9zaXRpb24gZm9yIHZpZXdwb3J0LWJhc2VkIHBvcHVwc1xuICAvLyBUaGlzIGFjY291bnRzIGZvciBjYW52YXMgc2Nyb2xsIHBvc2l0aW9uXG4gIHByaXZhdGUgZ2V0Vmlld3BvcnRQb3NpdGlvbihjYW52YXNYOiBudW1iZXIsIGNhbnZhc1k6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gcGFyZW50RWxlbWVudD8uc2Nyb2xsTGVmdCB8fCAwO1xuICAgIGNvbnN0IHNjcm9sbFRvcCA9IHBhcmVudEVsZW1lbnQ/LnNjcm9sbFRvcCB8fCAwO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGNhbnZhc1ggLSBzY3JvbGxMZWZ0LFxuICAgICAgeTogY2FudmFzWSAtIHNjcm9sbFRvcCxcbiAgICB9O1xuICB9XG5cbiAgc2hvd0Nvbm5lY3Rpb25Qb2ludHMobm9kZUlkOiBzdHJpbmcsIHN3aW1sYW5lSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQgPSBub2RlSWQ7XG4gIH1cblxuICBpc01vdXNlT3Zlck5vZGUoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgbm9kZTogV0ZOb2RlLFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlclxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc3Qgbm9kZUJvdW5kcyA9IHRoaXMuZ2V0Tm9kZUJvdW5kc1dpdGhQYWRkaW5nKG5vZGUsIHN3aW1sYW5lSW5kZXgpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBvc2l0aW9uLnggPj0gbm9kZUJvdW5kcy54ICYmXG4gICAgICBwb3NpdGlvbi54IDw9IG5vZGVCb3VuZHMueCArIG5vZGVCb3VuZHMud2lkdGggJiZcbiAgICAgIHBvc2l0aW9uLnkgPj0gbm9kZUJvdW5kcy55ICYmXG4gICAgICBwb3NpdGlvbi55IDw9IG5vZGVCb3VuZHMueSArIG5vZGVCb3VuZHMuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIC8vIGhlbHBlciBtZXRob2QgdG8gY2FsY3VsYXRlIG5vZGUgYm91bmRzIHdpdGggcGFkZGluZ1xuICBnZXROb2RlQm91bmRzV2l0aFBhZGRpbmcoXG4gICAgbm9kZTogV0ZOb2RlLFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlclxuICApOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBwYWRkaW5nID0gMTA7IC8vIEFkZCAxMHB4IHBhZGRpbmcgYXJvdW5kIG5vZGVzIGZvciBlYXNpZXIgaG92ZXIgZGV0ZWN0aW9uXG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFic29sdXRlIFkgcG9zaXRpb24gaW5jbHVkaW5nIHN3aW1sYW5lIG9mZnNldFxuICAgIGNvbnN0IGFic29sdXRlWSA9IG5vZGUueSArIHN3aW1sYW5lSW5kZXggKiAyNjM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogbm9kZS54IC0gcGFkZGluZyxcbiAgICAgIHk6IGFic29sdXRlWSAtIHBhZGRpbmcsXG4gICAgICB3aWR0aDogbm9kZS53aWR0aCArIHBhZGRpbmcgKiAyLFxuICAgICAgaGVpZ2h0OiBub2RlLmhlaWdodCArIHBhZGRpbmcgKiAyLFxuICAgIH07XG4gIH1cblxuICBoaWRlQ29ubmVjdGlvblBvaW50cyhub2RlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMudmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQgPT09IG5vZGVJZCAmJlxuICAgICAgIXRoaXMuc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKVxuICAgICkge1xuICAgICAgdGhpcy52aXNpYmxlQ29ubmVjdGlvblBvaW50c05vZGVJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgaXNDb25uZWN0aW9uUG9pbnRWaXNpYmxlKG5vZGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQgPT09IG5vZGVJZDtcbiAgfVxuXG4gIHN0YXJ0Q29ubmVjdGlvbkRyYWcoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgcG9pbnQ6IENvbm5lY3Rpb25Qb2ludCxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gZXhpdCBwb2ludCBub2RlXG4gICAgY29uc3Qgbm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChwb2ludC5ub2RlSWQpO1xuICAgIGlmIChcbiAgICAgIG5vZGVJbmZvICYmXG4gICAgICBub2RlSW5mby5ub2RlLnR5cGUgPT09ICdzdGFnZScgJiZcbiAgICAgIG5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhPy5Jc0V4aXRQb2ludFxuICAgICkge1xuICAgICAgLy8gRG9uJ3QgYWxsb3cgY29ubmVjdGlvbnMgZnJvbSBleGl0IHBvaW50c1xuICAgICAgY29uc29sZS5sb2coJ0Nhbm5vdCBjcmVhdGUgY29ubmVjdGlvbnMgZnJvbSBleGl0IHBvaW50cycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICB0aGlzLnN0YXRlLnN0YXJ0Q29ubmVjdGlvbkRyYWcoXG4gICAgICBwb2ludCxcbiAgICAgIHN3aW1sYW5lSW5kZXgsXG4gICAgICBwb3NpdGlvbi54LFxuICAgICAgcG9zaXRpb24ueVxuICAgICk7XG5cbiAgICAvLyBBZGQgbW91c2UgbW92ZSBhbmQgbW91c2UgdXAgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBkb2N1bWVudFxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XG4gIH1cblxuICBoaWdobGlnaHRQb3RlbnRpYWxUYXJnZXRzKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpIHJldHVybjtcblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICBjb25zdCB0YXJnZXRQb2ludEluZm8gPSB0aGlzLmZpbmRDb25uZWN0aW9uUG9pbnRBdFBvc2l0aW9uKFxuICAgICAgcG9zaXRpb24ueCxcbiAgICAgIHBvc2l0aW9uLnlcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0UG9pbnRJbmZvICYmXG4gICAgICB0YXJnZXRQb2ludEluZm8ucG9pbnQuaWQgIT09IHRoaXMucG90ZW50aWFsVGFyZ2V0UG9pbnRJZFxuICAgICkge1xuICAgICAgLy8gV2UgaGF2ZSBhIG5ldyB0YXJnZXQgcG9pbnRcbiAgICAgIHRoaXMucG90ZW50aWFsVGFyZ2V0UG9pbnRJZCA9IHRhcmdldFBvaW50SW5mby5wb2ludC5pZDtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXRQb2ludEluZm8gJiYgdGhpcy5wb3RlbnRpYWxUYXJnZXRQb2ludElkKSB7XG4gICAgICAvLyBXZSdyZSBubyBsb25nZXIgb3ZlciBhIHRhcmdldCBwb2ludFxuICAgICAgdGhpcy5wb3RlbnRpYWxUYXJnZXRQb2ludElkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gTm9kZSBkcmFnIGxvZ2ljXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgZnJvbSB0aGUgdGVtcGxhdGUgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBtb3VzZSBidXR0b24gb24gYSBub2RlLlxuICAgKiBTdGFydHMgdGhlIGRyYWcgaW50ZXJhY3Rpb24gYW5kIHJlZ2lzdGVycyBkb2N1bWVudC1sZXZlbCBsaXN0ZW5lcnMgc28gdGhlXG4gICAqIGRyYWcgY29udGludWVzIGV2ZW4gd2hlbiB0aGUgY3Vyc29yIGxlYXZlcyB0aGUgU1ZHIGNhbnZhcy5cbiAgICovXG4gIG9uTm9kZU1vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgbm9kZTogTm9kZSwgc3dpbWxhbmVJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gRG8gbm90IGludGVyZmVyZSB3aXRoIGNvbm5lY3Rpb24gZHJhZ2dpbmcgb3Igb3BlbiBwb3B1cHNcbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkgfHxcbiAgICAgIHRoaXMucG9wdXBWaXNpYmxlIHx8XG4gICAgICB0aGlzLnNob3dTdGFydE5vZGVGb3JtUG9wdXAgfHxcbiAgICAgIHRoaXMuc2hvd1N1YmZsb3dQb3B1cFxuICAgICkgcmV0dXJuO1xuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFByZXZlbnQgb25DYW52YXNDbGljayBmcm9tIGZpcmluZ1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgLy8gVGVtcGxhdGUgZm9ybXVsYTogYWJzb2x1dGVTVkdZID0gbm9kZS55ICsgc3dpbWxhbmUub3JkZXIgKiAyNjNcbiAgICBjb25zdCBhYnNvbHV0ZU5vZGVZID0gbm9kZS55ICsgc3dpbWxhbmVJbmRleCAqIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG5cbiAgICB0aGlzLmlzRHJhZ2dpbmdOb2RlID0gdHJ1ZTtcbiAgICB0aGlzLmRyYWdnaW5nTm9kZSA9IG5vZGU7XG4gICAgdGhpcy5kcmFnZ2luZ05vZGVTd2ltbGFuZUluZGV4ID0gc3dpbWxhbmVJbmRleDtcbiAgICAvLyBTdG9yZSB0aGUgb2Zmc2V0IGZyb20gdGhlIG5vZGUncyB0b3AtbGVmdCBzbyB0aGUgbm9kZSBkb2Vzbid0IGp1bXBcbiAgICB0aGlzLmRyYWdPZmZzZXRYID0gcG9zaXRpb24ueCAtIG5vZGUueDtcbiAgICB0aGlzLmRyYWdPZmZzZXRZID0gcG9zaXRpb24ueSAtIGFic29sdXRlTm9kZVk7XG5cbiAgICAvLyBTZWVkIHBlbmRpbmcgdmFsdWVzIHdpdGggdGhlIG5vZGUncyBDVVJSRU5UIHBvc2l0aW9uIHNvIHRoYXQgYSBwbGFpblxuICAgIC8vIGNsaWNrIChubyBtb3VzZW1vdmUpIGxlYXZlcyBub2RlLnkgdW5jaGFuZ2VkIGluIG9uTm9kZURyYWdFbmQuXG4gICAgdGhpcy5fcGVuZGluZ0Fic29sdXRlWSA9IGFic29sdXRlTm9kZVk7XG4gICAgdGhpcy5fcGVuZGluZ1RhcmdldFN3aW1sYW5lSW5kZXggPSBzd2ltbGFuZUluZGV4O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk5vZGVEcmFnTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Ob2RlRHJhZ0VuZCk7XG4gIH1cblxuICAvKipcbiAgICogQXJyb3cgZnVuY3Rpb24gKHByZXNlcnZlcyBgdGhpc2ApIOKAlCBydW5zIG9uIGV2ZXJ5IG1vdXNlbW92ZSB3aGlsZSBkcmFnZ2luZ1xuICAgKiBhIG5vZGUuICBVcGRhdGVzIG5vZGUueCAvIG5vZGUueSBpbi1wbGFjZSBzbyBBbmd1bGFyJ3MgY2hhbmdlIGRldGVjdGlvblxuICAgKiBwaWNrcyBpdCB1cCBhbmQgcmVkcmF3cyB0aGUgbm9kZSBhbmQgYWxsIGNvbm5lY3RlZCBwYXRocyBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgb25Ob2RlRHJhZ01vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ05vZGUgfHwgIXRoaXMuZHJhZ2dpbmdOb2RlKSByZXR1cm47XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG5cbiAgICAvLyBSYXcgZGVzaXJlZCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgbm9kZSB0b3AtbGVmdFxuICAgIGNvbnN0IHJhd0Fic29sdXRlWCA9IHBvc2l0aW9uLnggLSB0aGlzLmRyYWdPZmZzZXRYO1xuICAgIGNvbnN0IHJhd0Fic29sdXRlWSA9IHBvc2l0aW9uLnkgLSB0aGlzLmRyYWdPZmZzZXRZO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHN3aW1sYW5lIHRoZSBub2RlIGlzIGJlaW5nIGRyYWdnZWQgaW50byAgKGJ5IGN1cnNvciBZKVxuICAgIGxldCB0YXJnZXRTd2ltbGFuZUluZGV4ID0gTWF0aC5mbG9vcihwb3NpdGlvbi55IC8gdGhpcy5zd2ltbGFuZUhlaWdodCk7XG4gICAgdGFyZ2V0U3dpbWxhbmVJbmRleCA9IE1hdGgubWF4KFxuICAgICAgMCxcbiAgICAgIE1hdGgubWluKHRhcmdldFN3aW1sYW5lSW5kZXgsIHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCAtIDEpXG4gICAgKTtcblxuICAgIGNvbnN0IHN3aW1sYW5lVG9wWSA9IHRhcmdldFN3aW1sYW5lSW5kZXggKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuICAgIGNvbnN0IHN3aW1sYW5lQm90dG9tWSA9IHN3aW1sYW5lVG9wWSArIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG4gICAgY29uc3QgcGFkZGluZyA9IDU7XG5cbiAgICAvLyBYOiBrZWVwIG5vZGUgZnVsbHkgb24gY2FudmFzIChubyBsZWZ0L3JpZ2h0IGJvdW5kYXJ5IG5lZWRlZCBmb3Igc3dpbWxhbmVzKVxuICAgIGNvbnN0IG5ld0Fic29sdXRlWCA9IE1hdGgubWF4KHBhZGRpbmcsIHJhd0Fic29sdXRlWCk7XG5cbiAgICAvLyBZOiBjbGFtcCBzbyB0aGUgbm9kZSBzdGF5cyBpbnNpZGUgdGhlIHRhcmdldGVkIHN3aW1sYW5lXG4gICAgbGV0IG5ld0Fic29sdXRlWSA9IHJhd0Fic29sdXRlWTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5kcmFnZ2luZ05vZGU7XG4gICAgaWYgKG5ld0Fic29sdXRlWSA8IHN3aW1sYW5lVG9wWSArIHBhZGRpbmcpIHtcbiAgICAgIG5ld0Fic29sdXRlWSA9IHN3aW1sYW5lVG9wWSArIHBhZGRpbmc7XG4gICAgfSBlbHNlIGlmIChuZXdBYnNvbHV0ZVkgKyBub2RlLmhlaWdodCA+IHN3aW1sYW5lQm90dG9tWSAtIHBhZGRpbmcpIHtcbiAgICAgIG5ld0Fic29sdXRlWSA9IHN3aW1sYW5lQm90dG9tWSAtIG5vZGUuaGVpZ2h0IC0gcGFkZGluZztcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IGFic29sdXRlIFkgdG8gc3dpbWxhbmUtcmVsYXRpdmUgWSBmb3Igc3RvcmFnZVxuICAgIGNvbnN0IG5ld1JlbGF0aXZlWSA9IG5ld0Fic29sdXRlWSAtIHRhcmdldFN3aW1sYW5lSW5kZXggKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuXG4gICAgLy8gTGl2ZSBwcmV2aWV3OiB1cGRhdGUgcG9zaXRpb24gZGlyZWN0bHkuXG4gICAgLy8gVGVtcGxhdGUgZm9ybXVsYTogYWJzb2x1dGVTVkdZID0gbm9kZS55ICsgc3dpbWxhbmUub3JkZXIgKiAyNjNcbiAgICAvLyA9PiBub2RlLnkgPSBhYnNvbHV0ZVkgLSBzd2ltbGFuZS5vcmRlciAqIDI2MyAgKHN3aW1sYW5lLXJlbGF0aXZlKVxuICAgIC8vIFRoZSBub2RlIGlzIFNUSUxMIGluIHRoZSBzb3VyY2Ugc3dpbWxhbmUncyBhcnJheSBkdXJpbmcgcHJldmlldyxcbiAgICAvLyBzbyBzd2ltbGFuZS5vcmRlciA9IGRyYWdnaW5nTm9kZVN3aW1sYW5lSW5kZXguXG4gICAgbm9kZS54ID0gbmV3QWJzb2x1dGVYO1xuICAgIG5vZGUueSA9IG5ld0Fic29sdXRlWSAtIHRoaXMuZHJhZ2dpbmdOb2RlU3dpbWxhbmVJbmRleCAqIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG5cbiAgICAvLyBTdG9yZSBjb21wdXRlZCB2YWx1ZXMgZm9yIG9uTm9kZURyYWdFbmRcbiAgICB0aGlzLl9wZW5kaW5nVGFyZ2V0U3dpbWxhbmVJbmRleCA9IHRhcmdldFN3aW1sYW5lSW5kZXg7XG4gICAgdGhpcy5fcGVuZGluZ0Fic29sdXRlWSA9IG5ld0Fic29sdXRlWTtcbiAgfTtcblxuICAvKiogU2NyYXRjaCBmaWVsZHMgdXNlZCB0byBwYXNzIGNvbXB1dGVkIHZhbHVlcyBmcm9tIG1vdmUg4oaSIGVuZCBoYW5kbGVycy4gKi9cbiAgcHJpdmF0ZSBfcGVuZGluZ1RhcmdldFN3aW1sYW5lSW5kZXggPSAtMTtcbiAgcHJpdmF0ZSBfcGVuZGluZ0Fic29sdXRlWSA9IDA7XG5cbiAgLyoqXG4gICAqIEFycm93IGZ1bmN0aW9uIChwcmVzZXJ2ZXMgYHRoaXNgKSDigJQgZmlyZXMgb24gbW91c2V1cCBhZnRlciBhIG5vZGUgZHJhZy5cbiAgICogRmluYWxpc2VzIHRoZSBub2RlIHBvc2l0aW9uIGFuZCBwZXJmb3JtcyBzd2ltbGFuZSBtaWdyYXRpb24gaWYgbmVjZXNzYXJ5LlxuICAgKi9cbiAgb25Ob2RlRHJhZ0VuZCA9IChfZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTm9kZURyYWdNb3ZlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk5vZGVEcmFnRW5kKTtcblxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nTm9kZSB8fCAhdGhpcy5kcmFnZ2luZ05vZGUpIHtcbiAgICAgIHRoaXMuaXNEcmFnZ2luZ05vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZHJhZ2dpbmdOb2RlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5kcmFnZ2luZ05vZGU7XG4gICAgY29uc3QgZnJvbUluZGV4ID0gdGhpcy5kcmFnZ2luZ05vZGVTd2ltbGFuZUluZGV4O1xuICAgIGNvbnN0IHRvSW5kZXggPSB0aGlzLl9wZW5kaW5nVGFyZ2V0U3dpbWxhbmVJbmRleCAhPT0gLTFcbiAgICAgID8gdGhpcy5fcGVuZGluZ1RhcmdldFN3aW1sYW5lSW5kZXhcbiAgICAgIDogZnJvbUluZGV4O1xuICAgIGNvbnN0IGFic29sdXRlWSA9IHRoaXMuX3BlbmRpbmdBYnNvbHV0ZVk7XG5cbiAgICBpZiAoZnJvbUluZGV4ICE9PSB0b0luZGV4KSB7XG4gICAgICAvLyBDcm9zcy1zd2ltbGFuZSBkcm9wOiBzdGF0ZSBoZWxwZXIgbW92ZXMgbm9kZSBiZXR3ZWVuIGFycmF5cyxcbiAgICAgIC8vIHVwZGF0ZXMgY29ubmVjdGlvbnMsIGFuZCBzeW5jcyB0YWdzLiBJdCBhbHNvIHNldHMgbm9kZS55IGNvcnJlY3RseS5cbiAgICAgIHRoaXMuc3RhdGUubW92ZU5vZGVUb1N3aW1sYW5lKG5vZGUuaWQsIGZyb21JbmRleCwgdG9JbmRleCwgbm9kZS54LCBhYnNvbHV0ZVkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTYW1lIHN3aW1sYW5lOiBub2RlLnkgPSBhYnNvbHV0ZVkgLSBzd2ltbGFuZS5vcmRlciAqIDI2MyAoc3dpbWxhbmUtcmVsYXRpdmUpXG4gICAgICBub2RlLnkgPSBhYnNvbHV0ZVkgLSBmcm9tSW5kZXggKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGRyYWcgc3RhdGVcbiAgICB0aGlzLmlzRHJhZ2dpbmdOb2RlID0gZmFsc2U7XG4gICAgdGhpcy5kcmFnZ2luZ05vZGUgPSBudWxsO1xuICAgIHRoaXMuZHJhZ2dpbmdOb2RlU3dpbWxhbmVJbmRleCA9IC0xO1xuICAgIHRoaXMuZHJhZ09mZnNldFggPSAwO1xuICAgIHRoaXMuZHJhZ09mZnNldFkgPSAwO1xuICAgIHRoaXMuX3BlbmRpbmdUYXJnZXRTd2ltbGFuZUluZGV4ID0gLTE7XG4gICAgdGhpcy5fcGVuZGluZ0Fic29sdXRlWSA9IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBDU1MgY3Vyc29yIHZhbHVlIGZvciB0aGUgbm9kZSByZW5kZXJpbmcuXG4gICAqIFNob3dzICdncmFiYmluZycgd2hpbGUgdGhlIG5vZGUgaXMgYmVpbmcgZHJhZ2dlZCwgJ2dyYWInIG90aGVyd2lzZS5cbiAgICovXG4gIGdldEN1cnNvckZvck5vZGUobm9kZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlzRHJhZ2dpbmdOb2RlICYmIHRoaXMuZHJhZ2dpbmdOb2RlPy5pZCA9PT0gbm9kZUlkID8gJ2dyYWJiaW5nJyA6ICdncmFiJztcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBDb25uZWN0aW9uIGRyYWcgbG9naWMgKGV4aXN0aW5nKVxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvLyBVc2UgYXJyb3cgZnVuY3Rpb25zIHRvIHByZXNlcnZlICd0aGlzJyBjb250ZXh0XG4gIG9uTW91c2VNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuICAgIHRoaXMudXBkYXRlQ29ubmVjdGlvbkRyYWcocG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG4gICAgdGhpcy5oaWdobGlnaHRQb3RlbnRpYWxUYXJnZXRzKGV2ZW50KTtcbiAgfTtcblxuICB1cGRhdGVDb25uZWN0aW9uRHJhZyhjdXJyZW50WDogbnVtYmVyLCBjdXJyZW50WTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludCkge1xuICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLmN1cnJlbnRYID0gY3VycmVudFg7XG4gICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuY3VycmVudFkgPSBjdXJyZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHdoaWNoIHN3aW1sYW5lIHRoZSBjdXJzb3IgaXMgb3ZlclxuICAgICAgY29uc3Qgc3dpbWxhbmVJbmRleCA9IE1hdGguZmxvb3IoY3VycmVudFkgLyB0aGlzLnN3aW1sYW5lSGVpZ2h0KTtcbiAgICAgIGlmIChzd2ltbGFuZUluZGV4ID49IDAgJiYgc3dpbWxhbmVJbmRleCA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCkge1xuICAgICAgICAvLyBFbnN1cmUgdGhlIHRhcmdldCBzd2ltbGFuZSBpcyBmdWxseSB2aXNpYmxlXG4gICAgICAgIHRoaXMuZW5zdXJlU3dpbWxhbmVJblZpZXcoc3dpbWxhbmVJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Nb3VzZVVwID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwKTtcblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICBjb25zb2xlLmxvZygnTW91c2UgdXAgYXQgcG9zaXRpb246JywgcG9zaXRpb24pO1xuICAgIGNvbnNvbGUubG9nKCdJcyBjb25uZWN0aW9uIGRyYWdnaW5nOicsIHRoaXMuc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKSk7XG5cbiAgICAvLyBPbmx5IHByb2NlZWQgaWYgd2UgYXJlIGRyYWdnaW5nIGEgY29ubmVjdGlvblxuICAgIGlmICghdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgZHJvcHBpbmcgb250byBhIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBjb25zdCB0YXJnZXRQb2ludEluZm8gPSB0aGlzLmZpbmRDb25uZWN0aW9uUG9pbnRBdFBvc2l0aW9uKFxuICAgICAgcG9zaXRpb24ueCxcbiAgICAgIHBvc2l0aW9uLnlcbiAgICApO1xuXG4gICAgaWYgKHRhcmdldFBvaW50SW5mbykge1xuICAgICAgLy8gV2UgZm91bmQgYSB0YXJnZXQgY29ubmVjdGlvbiBwb2ludFxuICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIHRhcmdldCBjb25uZWN0aW9uIHBvaW50OicsIHRhcmdldFBvaW50SW5mbyk7XG5cbiAgICAgIC8vIEdldCB0aGUgc291cmNlIHBvaW50IGFuZCBzd2ltbGFuZSBpbmRleFxuICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQ7XG4gICAgICBjb25zdCBzb3VyY2VTd2ltbGFuZUluZGV4ID1cbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVN3aW1sYW5lSW5kZXg7XG5cbiAgICAgIGlmIChzb3VyY2VQb2ludCAmJiBzb3VyY2VTd2ltbGFuZUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gUHJldmVudCBjb25uZWN0aW5nIGEgbm9kZSB0byBpdHNlbGZcbiAgICAgICAgaWYgKHNvdXJjZVBvaW50Lm5vZGVJZCAhPT0gdGFyZ2V0UG9pbnRJbmZvLm5vZGVJZCkge1xuICAgICAgICAgIC8vIEdldCBzb3VyY2UgYW5kIHRhcmdldCBub2RlIHR5cGVzIHRvIGNoZWNrIGlmIGNvbm5lY3Rpb24gaXMgYWxsb3dlZFxuICAgICAgICAgIGNvbnN0IHNvdXJjZU5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoc291cmNlUG9pbnQubm9kZUlkKTtcbiAgICAgICAgICBjb25zdCB0YXJnZXROb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKFxuICAgICAgICAgICAgdGFyZ2V0UG9pbnRJbmZvLm5vZGVJZFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzb3VyY2VOb2RlSW5mbyAmJlxuICAgICAgICAgICAgdGFyZ2V0Tm9kZUluZm8gJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY2FuQ29ubmVjdChcbiAgICAgICAgICAgICAgc291cmNlTm9kZUluZm8ubm9kZS50eXBlLFxuICAgICAgICAgICAgICB0YXJnZXROb2RlSW5mby5ub2RlLnR5cGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgaWQ6IGBjb25uLSR7RGF0ZS5ub3coKX0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKX1gLFxuICAgICAgICAgICAgICBzb3VyY2VOb2RlSWQ6IHNvdXJjZVBvaW50Lm5vZGVJZCxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlkOiB0YXJnZXRQb2ludEluZm8ubm9kZUlkLFxuICAgICAgICAgICAgICBzb3VyY2VQb2ludElkOiBzb3VyY2VQb2ludC5pZCxcbiAgICAgICAgICAgICAgdGFyZ2V0UG9pbnRJZDogdGFyZ2V0UG9pbnRJbmZvLnBvaW50LmlkLFxuICAgICAgICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiBzb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgICB0YXJnZXRTd2ltbGFuZUluZGV4OiB0YXJnZXRQb2ludEluZm8uc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgICAgICBhY3Rpb246IG51bGwsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBBZGQgdG8gY29ubmVjdGlvbnMgYXJyYXlcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGVkIGRpcmVjdCBjb25uZWN0aW9uIGJldHdlZW4gbm9kZXM6JywgY29ubmVjdGlvbik7XG5cbiAgICAgICAgICAgIC8vIE5vdGlmeSBhYm91dCBjb25uZWN0aW9uIGNyZWF0aW9uXG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdGlvbkNyZWF0ZWQoY29ubmVjdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAnQ2Fubm90IGNvbm5lY3QgdGhlc2Ugbm9kZSB0eXBlczonLFxuICAgICAgICAgICAgICBzb3VyY2VOb2RlSW5mbz8ubm9kZS50eXBlLFxuICAgICAgICAgICAgICAnLT4nLFxuICAgICAgICAgICAgICB0YXJnZXROb2RlSW5mbz8ubm9kZS50eXBlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQ2Fubm90IGNvbm5lY3QgYSBub2RlIHRvIGl0c2VsZicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEVuZCB0aGUgY29ubmVjdGlvbiBkcmFnXG4gICAgICB0aGlzLnN0YXRlLmVuZENvbm5lY3Rpb25EcmFnKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBvc2l0aW9uIGlzIHdpdGhpbiBhbnkgc3dpbWxhbmVcbiAgICBjb25zdCBpc0luc2lkZVN3aW1sYW5lID0gdGhpcy5pc1Bvc2l0aW9uSW5zaWRlU3dpbWxhbmUocG9zaXRpb24ueSk7XG4gICAgY29uc29sZS5sb2coJ0lzIGluc2lkZSBzd2ltbGFuZTonLCBpc0luc2lkZVN3aW1sYW5lKTtcblxuICAgIC8vIE9ubHkgc2hvdyBwb3B1cCBpZiB3aXRoaW4gYSBzd2ltbGFuZVxuICAgIGlmIChpc0luc2lkZVN3aW1sYW5lICYmIHRoaXMuc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKSkge1xuICAgICAgY29uc29sZS5sb2coJ1Nob3dpbmcgY29ubmVjdGlvbiBwb3B1cCcpO1xuICAgICAgdGhpcy5zaG93Q29ubmVjdGlvblBvcHVwKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbmQgdGhlIGNvbm5lY3Rpb24gZHJhZyBpZiBvdXRzaWRlIGEgc3dpbWxhbmVcbiAgICAgIGNvbnNvbGUubG9nKCdFbmRpbmcgY29ubmVjdGlvbiBkcmFnIHdpdGhvdXQgc2hvd2luZyBwb3B1cCcpO1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgIH1cbiAgfTtcblxuICBmaW5kQ29ubmVjdGlvblBvaW50QXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHRvbGVyYW5jZTogbnVtYmVyID0gMTBcbiAgKToge1xuICAgIHBvaW50OiBDb25uZWN0aW9uUG9pbnQ7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyO1xuICB9IHwgbnVsbCB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBzd2ltbGFuZXMgYW5kIG5vZGVzIHRvIGZpbmQgY29ubmVjdGlvbiBwb2ludHNcbiAgICBmb3IgKFxuICAgICAgbGV0IHN3aW1sYW5lSW5kZXggPSAwO1xuICAgICAgc3dpbWxhbmVJbmRleCA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aDtcbiAgICAgIHN3aW1sYW5lSW5kZXgrK1xuICAgICkge1xuICAgICAgY29uc3Qgc3dpbWxhbmUgPSB0aGlzLnN0YXRlLnN3aW1sYW5lc1tzd2ltbGFuZUluZGV4XTtcblxuICAgICAgaWYgKCFzd2ltbGFuZS5ub2RlcykgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBzd2ltbGFuZS5ub2Rlcykge1xuICAgICAgICBpZiAoIW5vZGUuY29ubmVjdGlvblBvaW50cykgY29udGludWU7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgbm9kZSAoaW5jbHVkaW5nIHN3aW1sYW5lIG9mZnNldClcbiAgICAgICAgY29uc3QgYWJzb2x1dGVOb2RlWCA9IG5vZGUueDtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVOb2RlWSA9IG5vZGUueSArIHN3aW1sYW5lSW5kZXggKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuXG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygbm9kZS5jb25uZWN0aW9uUG9pbnRzKSB7XG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBjb25uZWN0aW9uIHBvaW50XG4gICAgICAgICAgY29uc3QgcG9pbnRYID0gYWJzb2x1dGVOb2RlWCArIHBvaW50Lng7XG4gICAgICAgICAgY29uc3QgcG9pbnRZID0gYWJzb2x1dGVOb2RlWSArIHBvaW50Lnk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgd2l0aGluIHRvbGVyYW5jZSBvZiB0aGlzIHBvaW50XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgTWF0aC5hYnMoeCAtIHBvaW50WCkgPD0gdG9sZXJhbmNlICYmXG4gICAgICAgICAgICBNYXRoLmFicyh5IC0gcG9pbnRZKSA8PSB0b2xlcmFuY2VcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgICAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgICAgICBzd2ltbGFuZUluZGV4OiBzd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlzUG9zaXRpb25JbnNpZGVTd2ltbGFuZSh5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB5IHBvc2l0aW9uIGlzIHdpdGhpbiBhbnkgc3dpbWxhbmVcbiAgICBjb25zdCBzd2ltbGFuZUNvdW50ID0gdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoO1xuICAgIGlmIChzd2ltbGFuZUNvdW50ID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBFYWNoIHN3aW1sYW5lIGhhcyBhIGhlaWdodCBvZiAyNjNweFxuICAgIGNvbnN0IHRvdGFsU3dpbWxhbmVIZWlnaHQgPSBzd2ltbGFuZUNvdW50ICogdGhpcy5zd2ltbGFuZUhlaWdodDtcblxuICAgIC8vIENoZWNrIGlmIHkgaXMgd2l0aGluIHRoZSB0b3RhbCBoZWlnaHQgb2YgYWxsIHN3aW1sYW5lc1xuICAgIHJldHVybiB5ID49IDAgJiYgeSA8IHRvdGFsU3dpbWxhbmVIZWlnaHQ7XG4gIH1cblxuICBzaG93Q29ubmVjdGlvblBvcHVwKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1Nob3dpbmcgY29ubmVjdGlvbiBwb3B1cCBhdDonLCB4LCB5KTtcblxuICAgIC8vIENvbnZlcnQgY2FudmFzIGNvb3JkaW5hdGVzIHRvIHZpZXdwb3J0IGNvb3JkaW5hdGVzIGZvciBwb3B1cCBwb3NpdGlvbmluZ1xuICAgIGNvbnN0IHZpZXdwb3J0UG9zID0gdGhpcy5nZXRWaWV3cG9ydFBvc2l0aW9uKHgsIHkpO1xuICAgIHRoaXMucG9wdXBYID0gdmlld3BvcnRQb3MueDtcbiAgICB0aGlzLnBvcHVwWSA9IHZpZXdwb3J0UG9zLnk7XG5cbiAgICAvLyBHZXQgYWxsb3dlZCBub2RlIHR5cGVzIGJhc2VkIG9uIHRoZSBzb3VyY2Ugbm9kZSB0eXBlXG4gICAgdGhpcy5hbGxvd2VkTm9kZVR5cGVzID0gdGhpcy5zdGF0ZS5nZXRBbGxvd2VkVGFyZ2V0Tm9kZVR5cGVzKCk7XG4gICAgY29uc29sZS5sb2coJ0FsbG93ZWQgbm9kZSB0eXBlczonLCB0aGlzLmFsbG93ZWROb2RlVHlwZXMpO1xuXG4gICAgLy8gT25seSBzaG93IHRoZSBwb3B1cCBpZiB3ZSBoYXZlIGFsbG93ZWQgbm9kZSB0eXBlc1xuICAgIGlmICh0aGlzLmFsbG93ZWROb2RlVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5wb3B1cFZpc2libGUgPSB0cnVlO1xuICAgICAgY29uc29sZS5sb2coJ1BvcHVwIHZpc2liaWxpdHkgc2V0IHRvIHRydWUnKTtcblxuICAgICAgLy8gRm9yY2UgdGhlIHBvcHVwIHRvIGJlIHZpc2libGUgaW4gdGhlIG5leHQgdGlja1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdJcyBwb3B1cCB2aXNpYmxlIGluIG5leHQgdGljazonLCB0aGlzLnBvcHVwVmlzaWJsZSk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYWxsb3dlZCBub2RlIHR5cGVzLCBqdXN0IGVuZCB0aGUgZHJhZ1xuICAgICAgY29uc29sZS5sb2coJ05vIGFsbG93ZWQgbm9kZSB0eXBlcywgZW5kaW5nIGRyYWcnKTtcbiAgICAgIHRoaXMuc3RhdGUuZW5kQ29ubmVjdGlvbkRyYWcoKTtcbiAgICB9XG4gIH1cblxuICBoaWRlQ29ubmVjdGlvblBvcHVwKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdDYWxsIHRvIGhpZGUnKTtcbiAgICB0aGlzLnBvcHVwVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUuZW5kQ29ubmVjdGlvbkRyYWcoKTtcbiAgfVxuXG4gIC8vIEFkZCB0aGlzIGhhbmRsZXIgdG8gY2xvc2UgdGhlIHBvcHVwIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxuICAvLyBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIC8vIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAvLyAgIGlmICh0aGlzLnBvcHVwVmlzaWJsZSkge1xuICAvLyAgICAgY29uc3QgcG9wdXBFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmVyYmVuLXBvcC1VcCcpO1xuICAvLyAgICAgaWYgKHBvcHVwRWxlbWVudCAmJiAhcG9wdXBFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAvLyAgICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBjcmVhdGVOb2RlQ29ubmVjdGlvbihub2RlVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGF0aERhdGEgPSB0aGlzLnN0YXRlLmdldENvbm5lY3Rpb25QYXRoRGF0YSgpO1xuICAgIGlmICghcGF0aERhdGEpIHtcbiAgICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSB0eXBlIGlzIGFsbG93ZWQgdG8gYmUgY3JlYXRlZFxuICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IHRoaXMuc3RhdGUuZ2V0QWxsb3dlZFRhcmdldE5vZGVUeXBlcygpO1xuICAgIGlmICghYWxsb3dlZFR5cGVzLmluY2x1ZGVzKG5vZGVUeXBlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYENhbm5vdCBjcmVhdGUgY29ubmVjdGlvbiB0byAke25vZGVUeXBlfSBmcm9tIGN1cnJlbnQgbm9kZSB0eXBlYFxuICAgICAgKTtcbiAgICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZW5kWCwgZW5kWSB9ID0gcGF0aERhdGE7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHRhcmdldCBzd2ltbGFuZSBmcm9tIHRoZSBkcm9wIHBvc2l0aW9uIChOT1QgdGhlIHNvdXJjZVxuICAgIC8vIHN3aW1sYW5lKS4gYGFkZE5vZGVgIGV4cGVjdHMgYW4gYWJzb2x1dGUgY2FudmFzIFkgcGx1cyB0aGUgdGFyZ2V0XG4gICAgLy8gc3dpbWxhbmUgaW5kZXgsIGFuZCBwZXJmb3JtcyB0aGUgc3dpbWxhbmUtcmVsYXRpdmUgY29udmVyc2lvbiBpdHNlbGYuXG4gICAgbGV0IHRhcmdldFN3aW1sYW5lSW5kZXggPSBNYXRoLmZsb29yKGVuZFkgLyB0aGlzLnN3aW1sYW5lSGVpZ2h0KTtcbiAgICB0YXJnZXRTd2ltbGFuZUluZGV4ID0gTWF0aC5tYXgoXG4gICAgICAwLFxuICAgICAgTWF0aC5taW4odGFyZ2V0U3dpbWxhbmVJbmRleCwgdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoIC0gMSlcbiAgICApO1xuXG4gICAgLy8gR2V0IHNvdXJjZSBub2RlIGluZm9cbiAgICBjb25zdCBzb3VyY2VQb2ludCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludDtcbiAgICBpZiAoIXNvdXJjZVBvaW50KSB7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKHNvdXJjZVBvaW50Lm5vZGVJZCk7XG4gICAgaWYgKCFzb3VyY2VOb2RlSW5mbykge1xuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgY29ubmVjdGluZyBmcm9tIGEgZGVjaXNpb24gdG8gYSBzdGFnZSwgc2hvdyBjb25kaXRpb24gcG9wdXAgZmlyc3RcbiAgICBpZiAoc291cmNlTm9kZUluZm8ubm9kZS50eXBlID09PSAnZGVjaXNpb24nICYmIG5vZGVUeXBlID09PSAnc3RhZ2UnKSB7XG4gICAgICAvLyBTdG9yZSBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgc3RhZ2UgY3JlYXRpb25cbiAgICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uQ29ubmVjdGlvbiA9IHtcbiAgICAgICAgZGVjaXNpb25Ob2RlSWQ6IHNvdXJjZU5vZGVJbmZvLm5vZGUuaWQsXG4gICAgICAgIHN3aW1sYW5lSW5kZXg6IHRhcmdldFN3aW1sYW5lSW5kZXgsXG4gICAgICAgIHg6IGVuZFgsXG4gICAgICAgIHk6IGVuZFksXG4gICAgICB9O1xuXG4gICAgICAvLyBDZW50ZXIgdGhlIHBvcHVwIG92ZXIgdGhlIGNvbm5lY3Rpb24gZW5kcG9pbnRcbiAgICAgIHRoaXMuZGVjaXNpb25Db25kaXRpb25Qb3B1cFggPSBlbmRYO1xuICAgICAgdGhpcy5kZWNpc2lvbkNvbmRpdGlvblBvcHVwWSA9IGVuZFkgLSAxNTA7IC8vIFBvc2l0aW9uIGFib3ZlIHRoZSBlbmRwb2ludFxuXG4gICAgICAvLyBTZXQgZGVjaXNpb24gbm9kZSBJRFxuICAgICAgdGhpcy5hY3RpdmVEZWNpc2lvbk5vZGVJZCA9IHNvdXJjZU5vZGVJbmZvLm5vZGUuaWQ7XG4gICAgICB0aGlzLnNob3dEZWNpc2lvbkNvbmRpdGlvbkRpYWxvZyA9IHRydWU7XG5cbiAgICAgIC8vIEVuZCB0aGUgY29ubmVjdGlvbiBkcmFnXG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJlY29uZGl0aW9ucyBiYXNlZCBvbiBub2RlIHR5cGVcbiAgICBpZiAobm9kZVR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgc3RhZ2UgaW4gdGhlIHRhcmdldCBzd2ltbGFuZS4gYGFkZE5vZGVgIGNvbnZlcnRzIHRoZVxuICAgICAgLy8gYWJzb2x1dGUgZW5kWSB0byBhIHN3aW1sYW5lLXJlbGF0aXZlIHBvc2l0aW9uIGludGVybmFsbHkuXG4gICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5zdGF0ZS5hZGROb2RlKFxuICAgICAgICB0YXJnZXRTd2ltbGFuZUluZGV4LFxuICAgICAgICAnc3RhZ2UnLFxuICAgICAgICBlbmRYLFxuICAgICAgICBlbmRZLFxuICAgICAgICB7IE5hbWU6ICdOZXcgU3RhZ2UnIH0gLy8gQWRkIGRlZmF1bHQgcHJvcGVydGllc1xuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBuZXdOb2RlICYmXG4gICAgICAgIG5ld05vZGUuY29ubmVjdGlvblBvaW50cyAmJlxuICAgICAgICBuZXdOb2RlLmNvbm5lY3Rpb25Qb2ludHMubGVuZ3RoID4gMCAmJlxuICAgICAgICBzb3VyY2VQb2ludFxuICAgICAgKSB7XG4gICAgICAgIC8vIEhhbmRsZSBjb25uZWN0aW9uIGNyZWF0aW9uXG4gICAgICAgIGNvbnN0IG9wcG9zaW5nVHlwZSA9IHtcbiAgICAgICAgICByaWdodDogJ2xlZnQnLFxuICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgICAgdG9wOiAnYm90dG9tJyxcbiAgICAgICAgICBib3R0b206ICd0b3AnLFxuICAgICAgICB9W3NvdXJjZVBvaW50LnR5cGVdIGFzICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldFBvaW50ID0gbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzLmZpbmQoXG4gICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gb3Bwb3NpbmdUeXBlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBvaW50KSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuc3RhdGUuY3JlYXRlQ29ubmVjdGlvbihcbiAgICAgICAgICAgIG5ld05vZGUuaWQsXG4gICAgICAgICAgICB0YXJnZXRQb2ludC5pZCxcbiAgICAgICAgICAgIHRhcmdldFN3aW1sYW5lSW5kZXhcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMub25Db25uZWN0aW9uQ3JlYXRlZChjb25uZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChub2RlVHlwZSA9PT0gJ3N1YmZsb3cnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0NyZWF0aW5nIHN1YmZsb3cgZnJvbSBjb25uZWN0aW9uIGF0OicsXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICAgICdzd2ltbGFuZTonLFxuICAgICAgICB0YXJnZXRTd2ltbGFuZUluZGV4XG4gICAgICApO1xuICAgICAgLy8gU2hvdyB3b3JrZmxvdyBzZWxlY3Rpb24gcG9wdXAgYW5kIHN0b3JlIGNvbm5lY3Rpb24gZGF0YSBmb3IgbGF0ZXIgdXNlXG4gICAgICB0aGlzLnNob3dTdWJmbG93U2VsZWN0aW9uUG9wdXAoZW5kWCwgZW5kWSwgdGFyZ2V0U3dpbWxhbmVJbmRleCk7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3Igb3RoZXIgbm9kZXMgQ3JlYXRlIHRoZSBuZXcgbm9kZSBhdCB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgIHRhcmdldFN3aW1sYW5lSW5kZXgsXG4gICAgICBub2RlVHlwZSBhcyBUb29sVHlwZSxcbiAgICAgIGVuZFgsXG4gICAgICBlbmRZXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIG5ld05vZGUgJiZcbiAgICAgIG5ld05vZGUuY29ubmVjdGlvblBvaW50cyAmJlxuICAgICAgbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIC8vIEZpbmQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgY29ubmVjdGlvbiBwb2ludCAoY2xvc2VzdCB0byB0aGUgc291cmNlKVxuICAgICAgaWYgKHNvdXJjZVBvaW50KSB7XG4gICAgICAgIC8vIEZvciBzaW1wbGljaXR5LCB1c2UgdGhlIGZpcnN0IGNvbm5lY3Rpb24gcG9pbnQgb2Ygb3Bwb3NpbmcgdHlwZVxuICAgICAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHlvdSdkIGZpbmQgdGhlIGNsb3Nlc3Qgb3IgbW9zdCBhcHByb3ByaWF0ZSBwb2ludFxuICAgICAgICBsZXQgdGFyZ2V0UG9pbnQ7XG5cbiAgICAgICAgLy8gSWYgc291cmNlIGlzIG9uIHJpZ2h0LCB0YXJnZXQgc2hvdWxkIGJlIG9uIGxlZnQsIGV0Yy5cbiAgICAgICAgY29uc3Qgb3Bwb3NpbmdUeXBlID0ge1xuICAgICAgICAgIHJpZ2h0OiAnbGVmdCcsXG4gICAgICAgICAgbGVmdDogJ3JpZ2h0JyxcbiAgICAgICAgICB0b3A6ICdib3R0b20nLFxuICAgICAgICAgIGJvdHRvbTogJ3RvcCcsXG4gICAgICAgIH1bc291cmNlUG9pbnQudHlwZV0gYXMgJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCc7XG5cbiAgICAgICAgdGFyZ2V0UG9pbnQgPSBuZXdOb2RlLmNvbm5lY3Rpb25Qb2ludHMuZmluZChcbiAgICAgICAgICAocCkgPT4gcC50eXBlID09PSBvcHBvc2luZ1R5cGVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGFyZ2V0UG9pbnQpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5zdGF0ZS5jcmVhdGVDb25uZWN0aW9uKFxuICAgICAgICAgICAgbmV3Tm9kZS5pZCxcbiAgICAgICAgICAgIHRhcmdldFBvaW50LmlkLFxuICAgICAgICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoY29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5vbkNvbm5lY3Rpb25DcmVhdGVkKGNvbm5lY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzb3VyY2VOb2RlSW5mbykge1xuICAgICAgdGhpcy51cGRhdGVOb2RlQ29ubmVjdGlvbnMoc291cmNlTm9kZUluZm8ubm9kZSk7XG4gICAgfVxuXG4gICAgLy8gRW5kIHRoZSBjb25uZWN0aW9uIGRyYWdcbiAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgfVxuXG4gIC8vIE1ldGhvZCB0byBoYW5kbGUgc2F2aW5nIHRoZSBjb25kaXRpb25cbiAgb25EZWNpc2lvbkNvbmRpdGlvblNhdmVkKGV2ZW50OiB7XG4gICAgY29ubmVjdGlvbklkOiBzdHJpbmc7XG4gICAgY29uZGl0aW9uOiBzdHJpbmc7XG4gIH0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0RlY2lzaW9uQ29ubmVjdGlvbikge1xuICAgICAgdGhpcy5zaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2cgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlY2lzaW9uTm9kZUlkLCBzd2ltbGFuZUluZGV4LCB4LCB5IH0gPVxuICAgICAgdGhpcy5wZW5kaW5nRGVjaXNpb25Db25uZWN0aW9uO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBzdGFnZSBkaXJlY3RseSB3aXRoIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXRlLmFkZE5vZGUoXG4gICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgJ3N0YWdlJyxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeyBOYW1lOiAnTmV3IFN0YWdlJyB9IC8vIEFkZCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICApO1xuXG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGNvbnN0IGRlY2lzaW9uTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChkZWNpc2lvbk5vZGVJZCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZGVjaXNpb25Ob2RlSW5mbyAmJlxuICAgICAgICBub2RlLmNvbm5lY3Rpb25Qb2ludHMgJiZcbiAgICAgICAgbm9kZS5jb25uZWN0aW9uUG9pbnRzLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICAvLyBGaW5kIGEgc3VpdGFibGUgY29ubmVjdGlvbiBwb2ludCBmcm9tIHRoZSBkZWNpc2lvbiBub2RlXG4gICAgICAgIGNvbnN0IGRlY2lzaW9uTm9kZSA9IGRlY2lzaW9uTm9kZUluZm8ubm9kZTtcbiAgICAgICAgY29uc3QgZGVjaXNpb25Ob2RlUG9pbnRzID0gZGVjaXNpb25Ob2RlLmNvbm5lY3Rpb25Qb2ludHMgfHwgW107XG4gICAgICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gZGVjaXNpb25Ob2RlUG9pbnRzLmZpbmQoXG4gICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gJ3JpZ2h0JyB8fCBwLnR5cGUgPT09ICdib3R0b20nXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHNvdXJjZVBvaW50KSB7XG4gICAgICAgICAgLy8gRmluZCBvcHBvc2luZyB0eXBlIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIG5ldyBzdGFnZVxuICAgICAgICAgIGNvbnN0IG9wcG9zaW5nVHlwZSA9IHtcbiAgICAgICAgICAgIHJpZ2h0OiAnbGVmdCcsXG4gICAgICAgICAgICBib3R0b206ICd0b3AnLFxuICAgICAgICAgICAgbGVmdDogJ3JpZ2h0JyxcbiAgICAgICAgICAgIHRvcDogJ2JvdHRvbScsXG4gICAgICAgICAgfVtzb3VyY2VQb2ludC50eXBlXSBhcyAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JztcblxuICAgICAgICAgIGNvbnN0IHRhcmdldFBvaW50ID0gbm9kZS5jb25uZWN0aW9uUG9pbnRzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gcC50eXBlID09PSBvcHBvc2luZ1R5cGVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHRhcmdldFBvaW50KSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgY29ubmVjdGlvbiB3aXRoIGNvbmRpdGlvblxuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgaWQ6IGBjb25uLSR7RGF0ZS5ub3coKX0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKX1gLFxuICAgICAgICAgICAgICBzb3VyY2VOb2RlSWQ6IGRlY2lzaW9uTm9kZS5pZCxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgICAgICBzb3VyY2VQb2ludElkOiBzb3VyY2VQb2ludC5pZCxcbiAgICAgICAgICAgICAgdGFyZ2V0UG9pbnRJZDogdGFyZ2V0UG9pbnQuaWQsXG4gICAgICAgICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IGRlY2lzaW9uTm9kZUluZm8uc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBldmVudC5jb25kaXRpb24sXG4gICAgICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICAgICAgYWN0aW9uOiBudWxsLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gQWRkIGNvbm5lY3Rpb24gdG8gdGhlIHN0YXRlXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgJ0NyZWF0ZWQgZGVjaXNpb24gY29ubmVjdGlvbiB3aXRoIGNvbmRpdGlvbjonLFxuICAgICAgICAgICAgICBjb25uZWN0aW9uXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFyIHBlbmRpbmcgZGF0YVxuICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uQ29ubmVjdGlvbiA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb25Db25kaXRpb24gPSAnJztcblxuICAgIC8vIEhpZGUgdGhlIGNvbmRpdGlvbiBwb3B1cFxuICAgIHRoaXMuc2hvd0RlY2lzaW9uQ29uZGl0aW9uRGlhbG9nID0gZmFsc2U7XG4gIH1cblxuICBvbkRlY2lzaW9uQ29uZGl0aW9uQ2FuY2VsbGVkKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RlY2lzaW9uQ29uZGl0aW9uRGlhbG9nID0gZmFsc2U7XG4gICAgLy8gRG9uJ3QgY3JlYXRlIHRoZSBzdGFnZSBvciBjb25uZWN0aW9uXG4gIH1cblxuICBnZXRDb25uZWN0aW9uUGF0aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGhEYXRhID0gdGhpcy5zdGF0ZS5nZXRDb25uZWN0aW9uUGF0aERhdGEoKTtcbiAgICBpZiAoIXBhdGhEYXRhKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCB7IHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZIH0gPSBwYXRoRGF0YTtcbiAgICBjb25zdCBzb3VyY2VQb2ludCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludDtcblxuICAgIGlmICghc291cmNlUG9pbnQpIHJldHVybiAnJztcblxuICAgIHJldHVybiB0aGlzLmdldE9ydGhvZ29uYWxQYXRoKHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBzb3VyY2VQb2ludC50eXBlKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb25QYXRoRm9yU2F2ZWRDb25uZWN0aW9uKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXRoRGF0YSA9IHRoaXMuc3RhdGUuZ2V0Q29ubmVjdGlvbkRhdGEoY29ubmVjdGlvbik7XG4gICAgICBpZiAoIXBhdGhEYXRhKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHBhdGggZGF0YSBmb3IgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZIH0gPSBwYXRoRGF0YTtcblxuICAgICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChjb25uZWN0aW9uLnNvdXJjZU5vZGVJZCk7XG4gICAgICBpZiAoIXNvdXJjZU5vZGVJbmZvKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvdXJjZSBub2RlIG5vdCBmb3VuZCBmb3IgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VOb2RlID0gc291cmNlTm9kZUluZm8ubm9kZTtcbiAgICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gc291cmNlTm9kZS5jb25uZWN0aW9uUG9pbnRzPy5maW5kKFxuICAgICAgICAocCkgPT4gcC5pZCA9PT0gY29ubmVjdGlvbi5zb3VyY2VQb2ludElkXG4gICAgICApO1xuXG4gICAgICBpZiAoIXNvdXJjZVBvaW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvdXJjZSBwb2ludCBub3QgZm91bmQgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3J0aG9nb25hbFBhdGgoXG4gICAgICAgIHN0YXJ0WCxcbiAgICAgICAgc3RhcnRZLFxuICAgICAgICBlbmRYLFxuICAgICAgICBlbmRZLFxuICAgICAgICBzb3VyY2VQb2ludC50eXBlXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZW5lcmF0aW5nIHBhdGggZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbiwgZXJyb3IpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIGdldE9ydGhvZ29uYWxQYXRoKFxuICAgIHN0YXJ0WDogbnVtYmVyLFxuICAgIHN0YXJ0WTogbnVtYmVyLFxuICAgIGVuZFg6IG51bWJlcixcbiAgICBlbmRZOiBudW1iZXIsXG4gICAgcG9pbnRUeXBlOiAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0J1xuICApOiBzdHJpbmcge1xuICAgIC8vIERldGVybWluZSBpbml0aWFsIGRpcmVjdGlvbiBiYXNlZCBvbiBjb25uZWN0aW9uIHBvaW50IHR5cGVcbiAgICBsZXQgcGF0aCA9ICcnO1xuXG4gICAgLy8gRm9yIHNpZGUgcG9pbnRzIChsZWZ0L3JpZ2h0KSwgc3RhcnQgd2l0aCBob3Jpem9udGFsIGxpbmVcbiAgICBpZiAocG9pbnRUeXBlID09PSAnbGVmdCcgfHwgcG9pbnRUeXBlID09PSAncmlnaHQnKSB7XG4gICAgICAvLyBDYWxjdWxhdGUgaG9yaXpvbnRhbCBkaXN0YW5jZVxuICAgICAgY29uc3QgaG9yaXpvbnRhbERpc3QgPSBlbmRYIC0gc3RhcnRYO1xuXG4gICAgICAvLyBJZiB0aGUgZW5kIHBvaW50IGlzIHZlcnkgY2xvc2UgaG9yaXpvbnRhbGx5LCB1c2UgYSBzaW1wbGUgMy1zZWdtZW50IHBhdGhcbiAgICAgIGlmIChNYXRoLmFicyhob3Jpem9udGFsRGlzdCkgPCAzMCkge1xuICAgICAgICBjb25zdCBtaWRZID0gKHN0YXJ0WSArIGVuZFkpIC8gMjtcbiAgICAgICAgcGF0aCA9IGBNICR7c3RhcnRYfSAke3N0YXJ0WX0gSCAke2VuZFh9IFYgJHttaWRZfSBWICR7ZW5kWX1gO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBwYXRoIHdpdGggaG9yaXpvbnRhbCBzZWdtZW50IGZpcnN0LCB0aGVuIHZlcnRpY2FsLCB0aGVuIGhvcml6b250YWxcbiAgICAgIGVsc2Uge1xuICAgICAgICBwYXRoID0gYE0gJHtzdGFydFh9ICR7c3RhcnRZfSBIICR7c3RhcnRYICsgaG9yaXpvbnRhbERpc3QgLyAyXG4gICAgICAgICAgfSBWICR7ZW5kWX0gSCAke2VuZFh9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRm9yIHRvcC9ib3R0b20gcG9pbnRzLCBzdGFydCB3aXRoIHZlcnRpY2FsIGxpbmVcbiAgICBlbHNlIGlmIChwb2ludFR5cGUgPT09ICd0b3AnIHx8IHBvaW50VHlwZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIC8vIENhbGN1bGF0ZSB2ZXJ0aWNhbCBkaXN0YW5jZVxuICAgICAgY29uc3QgdmVydGljYWxEaXN0ID0gZW5kWSAtIHN0YXJ0WTtcblxuICAgICAgLy8gSWYgdGhlIGVuZCBwb2ludCBpcyB2ZXJ5IGNsb3NlIHZlcnRpY2FsbHksIHVzZSBhIHNpbXBsZSAzLXNlZ21lbnQgcGF0aFxuICAgICAgaWYgKE1hdGguYWJzKHZlcnRpY2FsRGlzdCkgPCAzMCkge1xuICAgICAgICBjb25zdCBtaWRYID0gKHN0YXJ0WCArIGVuZFgpIC8gMjtcbiAgICAgICAgcGF0aCA9IGBNICR7c3RhcnRYfSAke3N0YXJ0WX0gViAke2VuZFl9IEggJHttaWRYfSBIICR7ZW5kWH1gO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBwYXRoIHdpdGggdmVydGljYWwgc2VnbWVudCBmaXJzdCwgdGhlbiBob3Jpem9udGFsLCB0aGVuIHZlcnRpY2FsXG4gICAgICBlbHNlIHtcbiAgICAgICAgcGF0aCA9IGBNICR7c3RhcnRYfSAke3N0YXJ0WX0gViAke3N0YXJ0WSArIHZlcnRpY2FsRGlzdCAvIDJcbiAgICAgICAgICB9IEggJHtlbmRYfSBWICR7ZW5kWX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgc2VsZWN0Rm9ybUZvclN0YWdlKGZvcm06IEZvcm0gfCBudWxsLCBub2RlOiBOb2RlKSB7XG4gICAgLy8gSWYgZm9ybSBpcyBudWxsLCB3ZSdyZSBjbGVhcmluZyB0aGUgc2VsZWN0aW9uXG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZS5zdGFnZURhdGEpIHtcbiAgICAgICAgbm9kZS5zdGFnZURhdGEgPSB7fTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgbm9kZS5zdGFnZURhdGEuZm9ybUlkID0gZm9ybS5Db2RlO1xuICAgICAgICBub2RlLnN0YWdlRGF0YS5mb3JtTmFtZSA9IGZvcm0uTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENsZWFyIGZvcm0gc2VsZWN0aW9uXG4gICAgICAgIGRlbGV0ZSBub2RlLnN0YWdlRGF0YS5mb3JtSWQ7XG4gICAgICAgIGRlbGV0ZSBub2RlLnN0YWdlRGF0YS5mb3JtTmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBhbiBldmVudCB0byB1cGRhdGUgdGhlIHN0YWdlIGRhdGFcbiAgICAgIHRoaXMub25TdGFnZVByb3BlcnRpZXNVcGRhdGVkKHtcbiAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICBzdGFnZURhdGE6IG5vZGUuc3RhZ2VEYXRhLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25TdGFnZVByb3BlcnRpZXNVcGRhdGVkKGV2ZW50OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgc3RhZ2VEYXRhOiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+O1xuICB9KTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgbm9kZSBpbiB0aGUgc3dpbWxhbmVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3dpbWxhbmUgPSB0aGlzLnN0YXRlLnN3aW1sYW5lc1tpXTtcbiAgICAgIGNvbnN0IG5vZGVJbmRleCA9IHN3aW1sYW5lLm5vZGVzPy5maW5kSW5kZXgoKG4pID0+IG4uaWQgPT09IGV2ZW50Lm5vZGVJZCk7XG5cbiAgICAgIGlmIChub2RlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBub2RlSW5kZXggPj0gMCkge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHN0YWdlIGRhdGFcbiAgICAgICAgaWYgKHN3aW1sYW5lLm5vZGVzKSB7XG4gICAgICAgICAgc3dpbWxhbmUubm9kZXNbbm9kZUluZGV4XS5zdGFnZURhdGEgPSB7XG4gICAgICAgICAgICAuLi5zd2ltbGFuZS5ub2Rlc1tub2RlSW5kZXhdLnN0YWdlRGF0YSxcbiAgICAgICAgICAgIC4uLmV2ZW50LnN0YWdlRGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgJ1VwZGF0ZWQgc3RhZ2UgZGF0YSBpbiBzd2ltbGFuZTonLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICdub2RlOicsXG4gICAgICAgICAgICBub2RlSW5kZXgsXG4gICAgICAgICAgICAnZGF0YTonLFxuICAgICAgICAgICAgc3dpbWxhbmUubm9kZXNbbm9kZUluZGV4XS5zdGFnZURhdGFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNyZWF0ZWQoY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEFmdGVyIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkLCByZWZyZXNoIHRoZSBzb3VyY2Ugbm9kZSB0byB1cGRhdGUgaXRzIHN0YXRlXG4gICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChjb25uZWN0aW9uLnNvdXJjZU5vZGVJZCk7XG4gICAgaWYgKHNvdXJjZU5vZGVJbmZvICYmIHNvdXJjZU5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ3N0YWdlJykge1xuICAgICAgLy8gUmVmcmVzaCBub2RlIHN0YXRlXG4gICAgICB0aGlzLnVwZGF0ZU5vZGVDb25uZWN0aW9ucyhzb3VyY2VOb2RlSW5mby5ub2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIHVwZGF0ZSBub2RlJ3MgY29ubmVjdGlvbiBzdGF0dXNcbiAgdXBkYXRlTm9kZUNvbm5lY3Rpb25zKG5vZGU6IFdGTm9kZSk6IHZvaWQge1xuICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2Ygb3V0Z29pbmcgY29ubmVjdGlvbnMgdGhhdCBjb25uZWN0IHRvIHN0YWdlc1xuICAgIGNvbnN0IG91dGdvaW5nQ29ubmVjdGlvbnMgPSB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLmZpbHRlcihcbiAgICAgIChjb25uKSA9PiBjb25uLnNvdXJjZU5vZGVJZCA9PT0gbm9kZS5pZFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IG5vZGVzIGFyZSBzdGFnZXNcbiAgICBjb25zdCBjb25uZWN0ZWRTdGFnZU5vZGVzID0gb3V0Z29pbmdDb25uZWN0aW9uc1xuICAgICAgLm1hcCgoY29ubikgPT4gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoY29ubi50YXJnZXROb2RlSWQpKVxuICAgICAgLmZpbHRlcigobm9kZUluZm8pID0+IG5vZGVJbmZvICYmIG5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ3N0YWdlJyk7XG5cbiAgICBub2RlLmhhc011bHRpcGxlQ29ubmVjdGVkU3RhZ2VzID0gY29ubmVjdGVkU3RhZ2VOb2Rlcy5sZW5ndGggPiAxO1xuICAgIG5vZGUuaGFzUGFyYWxsZWxTdGFnZXMgPSBjb25uZWN0ZWRTdGFnZU5vZGVzLmV2ZXJ5KFxuICAgICAgKG5kKSA9PiBuZD8ubm9kZS5zdGFnZURhdGE/LklzUGFyYWxsZWxcbiAgICApO1xuICB9XG5cbiAgb25FZGl0U3dpbWxhbmUoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgc3dpbWxhbmU6IFN3aW1sYW5lSXRlbSxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFByZXZlbnQgdGhlIGNhbnZhcyBjbGljayBldmVudCBmcm9tIGZpcmluZ1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc29sZS5sb2coJ0VkaXQgc3dpbWxhbmUgYnV0dG9uIGNsaWNrZWQgZm9yIHN3aW1sYW5lOicsIHN3aW1sYW5lSW5kZXgpO1xuXG4gICAgLy8gRW1pdCBhIHNwZWNpYWwgZXZlbnQgZm9yIGVkaXRpbmcgYSBzd2ltbGFuZVxuICAgIHRoaXMuY2xpY2tlZFBvc2l0aW9uLmVtaXQoe1xuICAgICAgeDogLTEsIC8vIFNwZWNpYWwgdmFsdWUgdG8gaW5kaWNhdGUgZWRpdCBtb2RlXG4gICAgICB5OiBzd2ltbGFuZUluZGV4LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAvLyAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgLy8gICAvLyBJbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHNpbWlsYXIgdG8gdGhlIHN0YWdlIGZvcm0gcG9wdXBcbiAgLy8gICAvLyBXZSdsbCBuZWVkIHRvIGFkZCBVSSBlbGVtZW50cyBmb3IgdGhpc1xuICAvLyAgIGNvbnNvbGUubG9nKCdTdGFydCBub2RlIGZvcm0gcG9wdXAgcmVxdWVzdGVkJyk7XG5cbiAgLy8gICAvLyBGb3Igbm93LCB0aGlzIGlzIGEgcGxhY2Vob2xkZXJcbiAgLy8gICAvLyBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIHdvdWxkIGxvYWQgZm9ybXMgYW5kIGFkZCB0aGVtIHRvIHRoZSB3b3JrZmxvd1xuICAvLyB9XG5cbiAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIG5vZGVYOiBudW1iZXIsXG4gICAgbm9kZVk6IG51bWJlcixcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXIsXG4gICAgbm9kZT86IE5vZGVcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIFNldCBwb3B1cCBwb3NpdGlvbiAtIGNvbnZlcnQgY2FudmFzIGNvb3JkaW5hdGVzIHRvIHZpZXdwb3J0IGNvb3JkaW5hdGVzXG4gICAgY29uc3Qgc3dpbWxhbmVPZmZzZXQgPSBzd2ltbGFuZUluZGV4ICogMjYzO1xuICAgIGNvbnN0IGNhbnZhc1ggPSBub2RlWCAtICghbm9kZSA/IDMwIDogMCk7XG4gICAgY29uc3QgY2FudmFzWSA9IG5vZGVZICsgc3dpbWxhbmVPZmZzZXQ7XG5cbiAgICBjb25zdCB2aWV3cG9ydFBvcyA9IHRoaXMuZ2V0Vmlld3BvcnRQb3NpdGlvbihjYW52YXNYLCBjYW52YXNZKTtcbiAgICB0aGlzLnN0YXJ0Tm9kZUZvcm1Qb3B1cFggPSB2aWV3cG9ydFBvcy54O1xuICAgIHRoaXMuc3RhcnROb2RlRm9ybVBvcHVwWSA9IHZpZXdwb3J0UG9zLnk7XG5cbiAgICAvLyBJZiB3ZSdyZSBvcGVuaW5nIHRoZSBwb3B1cCwgbG9hZCBmb3Jtc1xuICAgIGlmICghdGhpcy5zaG93U3RhcnROb2RlRm9ybVBvcHVwKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2VcbiAgICAgICAgLmdldEZvcm1zKClcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGFydE5vZGVGb3Jtc0xpc3QgPSByZXNwb25zZS5SZXN1bHQ7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmdTdGFydE5vZGVGb3JtcyA9IGZhbHNlO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBmb3JtczonLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmdTdGFydE5vZGVGb3JtcyA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSkge1xuICAgICAgdGhpcy5hY3RpdmVOb2RlRm9yRm9ybVNlbGVjdGlvbiA9IG5vZGU7XG4gICAgICBjb25zb2xlLmxvZygnQWN0aXZlIG5vZGUgZm9yIGZvcm0gc2VsZWN0aW9uOicsIG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZU5vZGVGb3JGb3JtU2VsZWN0aW9uID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dTdGFydE5vZGVGb3JtUG9wdXAgPSAhdGhpcy5zaG93U3RhcnROb2RlRm9ybVBvcHVwO1xuICB9XG5cbiAgc2VsZWN0U3RhcnROb2RlRm9ybShmb3JtOiBGb3JtIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZU5vZGVGb3JGb3JtU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdEZvcm1Gb3JTdGFnZShmb3JtLCB0aGlzLmFjdGl2ZU5vZGVGb3JGb3JtU2VsZWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0Zvcm0oZm9ybS5Db2RlLCBmb3JtLk5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0Zvcm0obnVsbCwgbnVsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIHBvcHVwXG4gICAgdGhpcy5zaG93U3RhcnROb2RlRm9ybVBvcHVwID0gZmFsc2U7XG4gIH1cblxuICBzaG93U3ViZmxvd1NlbGVjdGlvblBvcHVwKHg6IG51bWJlciwgeTogbnVtYmVyLCBzd2ltbGFuZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IGNhbnZhcyBjb29yZGluYXRlcyB0byB2aWV3cG9ydCBjb29yZGluYXRlcyBmb3IgcG9wdXAgcG9zaXRpb25pbmdcbiAgICBjb25zdCB2aWV3cG9ydFBvcyA9IHRoaXMuZ2V0Vmlld3BvcnRQb3NpdGlvbih4LCB5KTtcbiAgICB0aGlzLnN1YmZsb3dQb3B1cFggPSB2aWV3cG9ydFBvcy54O1xuICAgIHRoaXMuc3ViZmxvd1BvcHVwWSA9IHZpZXdwb3J0UG9zLnk7XG4gICAgdGhpcy5wZW5kaW5nU3ViZmxvd1Bvc2l0aW9uID0geyBzd2ltbGFuZUluZGV4LCB4LCB5IH07XG5cbiAgICAvLyBTdG9yZSBjb25uZWN0aW9uIGRhdGEgaWYgd2UncmUgY3JlYXRpbmcgZnJvbSBhIGNvbm5lY3Rpb25cbiAgICBpZiAodGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKSB7XG4gICAgICAvLyBTdG9yZSB0aGUgc291cmNlIGNvbm5lY3Rpb24gZGF0YVxuICAgICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50ID1cbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50ID8/IG51bGw7XG4gICAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleCA9XG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VTd2ltbGFuZUluZGV4ID8/IG51bGw7XG4gICAgICBjb25zb2xlLmxvZygnU3RvcmVkIGNvbm5lY3Rpb24gZGF0YSBmb3Igc3ViZmxvdzonLCB7XG4gICAgICAgIHNvdXJjZVBvaW50OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQsXG4gICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCB3b3JrZmxvd3NcbiAgICB0aGlzLmlzTG9hZGluZ1dvcmtmbG93cyA9IHRydWU7XG4gICAgdGhpcy5kYXRhU2VydmljZVxuICAgICAgLmdldFdvcmtmbG93cygpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy53b3JrZmxvd3NMaXN0ID0gcmVzcG9uc2UuUmVzdWx0O1xuICAgICAgICB0aGlzLmlzTG9hZGluZ1dvcmtmbG93cyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyB3b3JrZmxvd3M6JywgZXJyb3IpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZ1dvcmtmbG93cyA9IGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnNob3dTdWJmbG93UG9wdXAgPSB0cnVlO1xuICB9XG5cbiAgc2VsZWN0U3ViZmxvd1dvcmtmbG93KHdvcmtmbG93OiBXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTZWxlY3Rpbmcgd29ya2Zsb3cgZm9yIHN1YmZsb3c6Jywgd29ya2Zsb3cuTmFtZSk7XG4gICAgY29uc29sZS5sb2coJ1BlbmRpbmcgY29ubmVjdGlvbiBkYXRhOicsIHtcbiAgICAgIHNvdXJjZVBvaW50OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQsXG4gICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleCxcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb24sXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5wZW5kaW5nU3ViZmxvd1Bvc2l0aW9uKSB7XG4gICAgICBjb25zdCB7IHN3aW1sYW5lSW5kZXgsIHgsIHkgfSA9IHRoaXMucGVuZGluZ1N1YmZsb3dQb3NpdGlvbjtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBzdWJmbG93IG5vZGUgd2l0aCB0aGUgc2VsZWN0ZWQgd29ya2Zsb3cgZGF0YVxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgICAgc3dpbWxhbmVJbmRleCxcbiAgICAgICAgJ3N1YmZsb3cnLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB7IE5hbWU6IHdvcmtmbG93Lk5hbWUgfSwgLy8gSW5pdGlhbGl6ZSBzdGFnZSBuYW1lIGZyb20gd29ya2Zsb3dcbiAgICAgICAgeyBpZDogd29ya2Zsb3cuQ29kZSwgbmFtZTogd29ya2Zsb3cuTmFtZSB9XG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmxvZygnQ3JlYXRlZCBzdWJmbG93IG5vZGU6Jywgbm9kZSk7XG5cbiAgICAgIC8vIElmIHRoaXMgd2FzIGNyZWF0ZWQgZnJvbSBhIGNvbm5lY3Rpb24sIGNyZWF0ZSB0aGUgY29ubmVjdGlvblxuICAgICAgaWYgKG5vZGUgJiYgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGluZyBjb25uZWN0aW9uIHRvIG5ldyBzdWJmbG93IG5vZGUnKTtcblxuICAgICAgICAvLyBGaW5kIGEgc3VpdGFibGUgY29ubmVjdGlvbiBwb2ludCBvbiB0aGUgbmV3IG5vZGVcbiAgICAgICAgaWYgKG5vZGUuY29ubmVjdGlvblBvaW50cyAmJiBub2RlLmNvbm5lY3Rpb25Qb2ludHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50O1xuXG4gICAgICAgICAgLy8gRmluZCBvcHBvc2luZyB0eXBlIGNvbm5lY3Rpb24gcG9pbnRcbiAgICAgICAgICBjb25zdCBvcHBvc2luZ1R5cGUgPSB7XG4gICAgICAgICAgICByaWdodDogJ2xlZnQnLFxuICAgICAgICAgICAgbGVmdDogJ3JpZ2h0JyxcbiAgICAgICAgICAgIHRvcDogJ2JvdHRvbScsXG4gICAgICAgICAgICBib3R0b206ICd0b3AnLFxuICAgICAgICAgIH1bc291cmNlUG9pbnQudHlwZV0gYXMgJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCc7XG5cbiAgICAgICAgICBjb25zdCB0YXJnZXRQb2ludCA9IG5vZGUuY29ubmVjdGlvblBvaW50cy5maW5kKFxuICAgICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gb3Bwb3NpbmdUeXBlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh0YXJnZXRQb2ludCkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgICAgICAgIGlkOiBgY29ubi0ke0RhdGUubm93KCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCl9YCxcbiAgICAgICAgICAgICAgc291cmNlTm9kZUlkOiBzb3VyY2VQb2ludC5ub2RlSWQsXG4gICAgICAgICAgICAgIHRhcmdldE5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICAgICAgc291cmNlUG9pbnRJZDogc291cmNlUG9pbnQuaWQsXG4gICAgICAgICAgICAgIHRhcmdldFBvaW50SWQ6IHRhcmdldFBvaW50LmlkLFxuICAgICAgICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleCEsXG4gICAgICAgICAgICAgIHRhcmdldFN3aW1sYW5lSW5kZXg6IHN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICAgICAgYWN0aW9uOiBudWxsLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gQWRkIGNvbm5lY3Rpb24gZGlyZWN0bHkgdG8gdGhlIHN0YXRlJ3MgY29ubmVjdGlvbnMgYXJyYXlcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZGRlZCBjb25uZWN0aW9uIHRvIHN0YXRlOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Nvbm5lY3Rpb25zIGFmdGVyIGFkZGluZzonLCB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zKTtcbiAgICAgICAgICAgIHRoaXMub25Db25uZWN0aW9uQ3JlYXRlZChjb25uZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCBzZWxlY3Rpb24gdG9vbCBpbiBwYXJlbnQgY29tcG9uZW50XG4gICAgICB0aGlzLnN1YmZsb3dTZWxlY3RlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXBcbiAgICB0aGlzLnNob3dTdWJmbG93UG9wdXAgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb24gPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXggPSBudWxsO1xuICB9XG5cbiAgc2hvd0RlY2lzaW9uQ29uZGl0aW9uc1BvcHVwKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIG5vZGU6IFdGTm9kZSxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIEdldCB0aGUgcG9zaXRpb24gZm9yIHRoZSBwb3B1cFxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcblxuICAgIC8vIENvbnZlcnQgY2FudmFzIGNvb3JkaW5hdGVzIHRvIHZpZXdwb3J0IGNvb3JkaW5hdGVzIGZvciBwb3B1cCBwb3NpdGlvbmluZ1xuICAgIGNvbnN0IHZpZXdwb3J0UG9zID0gdGhpcy5nZXRWaWV3cG9ydFBvc2l0aW9uKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuXG4gICAgLy8gRmluZCBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGlzIGRlY2lzaW9uIG5vZGVcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IHRoaXMuc3RhdGUuY29ubmVjdGlvbnMuZmlsdGVyKFxuICAgICAgKGNvbm4pID0+IGNvbm4uc291cmNlTm9kZUlkID09PSBub2RlLmlkXG4gICAgKTtcblxuICAgIGlmIChjb25uZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIE5vIGNvbm5lY3Rpb25zIHRvIHNob3dcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaG93IHRoZSBkZWNpc2lvbiBjb25kaXRpb25zIHBvcHVwXG4gICAgdGhpcy5hY3RpdmVEZWNpc2lvbk5vZGVJZCA9IG5vZGUuaWQ7XG4gICAgdGhpcy5kZWNpc2lvbkNvbmRpdGlvblBvcHVwWCA9IHZpZXdwb3J0UG9zLng7XG4gICAgdGhpcy5kZWNpc2lvbkNvbmRpdGlvblBvcHVwWSA9IHZpZXdwb3J0UG9zLnk7XG5cbiAgICAvLyBTZXQgdGhlIGNvcnJlY3QgcG9wdXAgdmlzaWJpbGl0eSBmbGFnIC0gdGhpcyBpcyBsaWtlbHkgdGhlIGlzc3VlXG4gICAgdGhpcy5zaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2cgPSB0cnVlO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ1Nob3dpbmcgZGVjaXNpb24gcG9wdXA6Jywge1xuICAgIC8vICAgeTogZ2xvYmFsWSxcbiAgICAvLyAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAvLyAgIGlzVmlzaWJsZTogdGhpcy5zaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2csXG4gICAgLy8gfSk7XG4gIH1cblxuICBlbnN1cmVTd2ltbGFuZUluVmlldyhzd2ltbGFuZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBFbnN1cmUgd2UgaGF2ZSBlbm91Z2ggc3dpbWxhbmVzIHZpc2libGVcbiAgICBjb25zdCByZXF1aXJlZEhlaWdodCA9IChzd2ltbGFuZUluZGV4ICsgMSkgKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuICAgIGlmICh0aGlzLmNhbnZhc0hlaWdodCA8IHJlcXVpcmVkSGVpZ2h0KSB7XG4gICAgICB0aGlzLmNhbnZhc0hlaWdodCA9IHJlcXVpcmVkSGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIGdldExhYmVsUG9zaXRpb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhdGhEYXRhID0gdGhpcy5zdGF0ZS5nZXRDb25uZWN0aW9uRGF0YShjb25uZWN0aW9uKTtcbiAgICAgIGlmICghcGF0aERhdGEpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gcGF0aCBkYXRhIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFkgfSA9IHBhdGhEYXRhO1xuXG4gICAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGNvbm5lY3Rpb24uc291cmNlTm9kZUlkKTtcbiAgICAgIGlmICghc291cmNlTm9kZUluZm8pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU291cmNlIG5vZGUgbm90IGZvdW5kIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBzb3VyY2VOb2RlSW5mby5ub2RlO1xuICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSBzb3VyY2VOb2RlLmNvbm5lY3Rpb25Qb2ludHM/LmZpbmQoXG4gICAgICAgIChwKSA9PiBwLmlkID09PSBjb25uZWN0aW9uLnNvdXJjZVBvaW50SWRcbiAgICAgICk7XG5cbiAgICAgIGlmICghc291cmNlUG9pbnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU291cmNlIHBvaW50IG5vdCBmb3VuZCBmb3IgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgbWlkcG9pbnQgYmFzZWQgb24gdGhlIGNvbm5lY3Rpb24gcG9pbnQgdHlwZVxuICAgICAgaWYgKHNvdXJjZVBvaW50LnR5cGUgPT09ICdsZWZ0JyB8fCBzb3VyY2VQb2ludC50eXBlID09PSAncmlnaHQnKSB7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0ID0gZW5kWCAtIHN0YXJ0WDtcblxuICAgICAgICBpZiAoTWF0aC5hYnMoaG9yaXpvbnRhbERpc3QpIDwgMzApIHtcbiAgICAgICAgICAvLyBGb3Igc2hvcnQgaG9yaXpvbnRhbCBjb25uZWN0aW9uc1xuICAgICAgICAgIGNvbnN0IG1pZFkgPSAoc3RhcnRZICsgZW5kWSkgLyAyO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBzdGFydFggKyAoZW5kWCAtIHN0YXJ0WCkgLyAyLFxuICAgICAgICAgICAgeTogbWlkWSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciByZWd1bGFyIGNvbm5lY3Rpb25zIHN0YXJ0aW5nIGhvcml6b250YWxseVxuICAgICAgICAgIGNvbnN0IG1pZFggPSBzdGFydFggKyBob3Jpem9udGFsRGlzdCAvIDI7XG4gICAgICAgICAgY29uc3QgbWlkWSA9IGVuZFk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IG1pZFgsXG4gICAgICAgICAgICB5OiAoc3RhcnRZICsgZW5kWSkgLyAyLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICd0b3AnIG9yICdib3R0b20nXG4gICAgICAgIGNvbnN0IHZlcnRpY2FsRGlzdCA9IGVuZFkgLSBzdGFydFk7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKHZlcnRpY2FsRGlzdCkgPCAzMCkge1xuICAgICAgICAgIC8vIEZvciBzaG9ydCB2ZXJ0aWNhbCBjb25uZWN0aW9uc1xuICAgICAgICAgIGNvbnN0IG1pZFggPSAoc3RhcnRYICsgZW5kWCkgLyAyO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBtaWRYLFxuICAgICAgICAgICAgeTogc3RhcnRZICsgKGVuZFkgLSBzdGFydFkpIC8gMixcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciByZWd1bGFyIGNvbm5lY3Rpb25zIHN0YXJ0aW5nIHZlcnRpY2FsbHlcbiAgICAgICAgICBjb25zdCBtaWRYID0gZW5kWDtcbiAgICAgICAgICBjb25zdCBtaWRZID0gc3RhcnRZICsgdmVydGljYWxEaXN0IC8gMjtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogKHN0YXJ0WCArIGVuZFgpIC8gMixcbiAgICAgICAgICAgIHk6IG1pZFksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnRXJyb3IgY2FsY3VsYXRpbmcgbGFiZWwgcG9zaXRpb24gZm9yIGNvbm5lY3Rpb246JyxcbiAgICAgICAgY29ubmVjdGlvbixcbiAgICAgICAgZXJyb3JcbiAgICAgICk7XG4gICAgICByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgfVxuICB9XG5cbiAgc2F2ZUNvbm5lY3Rpb25MYWJlbChjb25uZWN0aW9uOiBDb25uZWN0aW9uLCBsYWJlbDogc3RyaW5nKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBjb25uZWN0aW9uIGxhYmVsIGluIHRoZSBzdGF0ZVxuICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMgPSB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLm1hcCgoY29ubikgPT4ge1xuICAgICAgaWYgKGNvbm4uaWQgPT09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb25uLFxuICAgICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25uO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FudmFzLWNvbnRhaW5lclwiPlxuICA8c3ZnICNjYW52YXMgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIiBbYXR0ci5oZWlnaHRdPVwiY2FudmFzSGVpZ2h0XCIgY2xhc3M9XCJkZXNpZ25lci1jYW52YXNcIlxuICAgIChjbGljayk9XCJvbkNhbnZhc0NsaWNrKCRldmVudClcIj5cbiAgICA8ZGVmcz5cbiAgICAgIDwhLS0gR3JpZCBwYXR0ZXJuIGRlZmluaXRpb24gLS0+XG5cbiAgICAgIDxwYXR0ZXJuIGlkPVwiZ3JpZFwiIFthdHRyLndpZHRoXT1cImdyaWRTaXplXCIgW2F0dHIuaGVpZ2h0XT1cImdyaWRTaXplXCIgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cbiAgICAgICAgPHBhdGggZD1cIk0gMjAgMCBMIDAgMCAwIDIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjZTJlOGYwXCIgc3Ryb2tlLXdpZHRoPVwiMC41XCIgLz5cbiAgICAgIDwvcGF0dGVybj5cblxuICAgICAgPCEtLSBBcnJvdyBoZWFkIG1hcmtlciBkZWZpbml0aW9uIC0tPlxuICAgICAgPG1hcmtlciBpZD1cImFycm93aGVhZFwiIG1hcmtlcldpZHRoPVwiMTBcIiBtYXJrZXJIZWlnaHQ9XCI3XCIgcmVmWD1cIjlcIiByZWZZPVwiMy41XCIgb3JpZW50PVwiYXV0b1wiPlxuICAgICAgICA8cG9seWdvbiBwb2ludHM9XCIwIDAsIDEwIDMuNSwgMCA3XCIgZmlsbD1cIiNEMzZDRkZcIiAvPlxuICAgICAgPC9tYXJrZXI+XG5cbiAgICAgIDwhLS0gQ29ubmVjdGlvbiBwb2ludDogb3V0ZXIgdHJhbnNwYXJlbnQgcmluZyBleHBhbmRzIHRoZSBoaXQgdGFyZ2V0IHNvIGFcbiAgICAgICAgICAgY29ubmVjdGlvbiBkcmFnIGNhbiBiZSBzdGFydGVkIHdpdGhvdXQgcGl4ZWwtcHJlY2lzZSBhaW0uIFRoZSB2aXNpYmxlXG4gICAgICAgICAgIGNpcmNsZSBzdGF5cyBhdCByPTUuIFRoZSBoaXQgcmluZyBleHRlbmRzIGlud2FyZCB1cCB0byB0aGUgbm9kZSdzXG4gICAgICAgICAgIGRyYWctaGFuZGxlIGVkZ2Ugc28gY2xpY2tzIG5lYXIgdGhlIGVkZ2UgZmFsbCB0byB0aGUgY29ubmVjdGlvbiBwb2ludFxuICAgICAgICAgICAocmVuZGVyZWQgdG9wbW9zdCkgcmF0aGVyIHRoYW4gdG8gdGhlIGRyYWcgaGFuZGxlIGJlbmVhdGguIC0tPlxuICAgICAgPGcgaWQ9XCJjb25uZWN0aW9uLXBvaW50LXRlbXBsYXRlXCI+XG4gICAgICAgIDxjaXJjbGUgcj1cIjEyXCIgZmlsbD1cInRyYW5zcGFyZW50XCIgLz5cbiAgICAgICAgPGNpcmNsZSByPVwiNVwiIGZpbGw9XCIjRDM2Q0ZGXCIgc3Ryb2tlPVwiI0ZGRkZGRlwiIHN0cm9rZS13aWR0aD1cIjFcIiAvPlxuICAgICAgPC9nPlxuXG4gICAgICA8IS0tIERhc2hlZCBsaW5lIHN0eWxlIGZvciBjb25uZWN0aW9uIHByZXZpZXcgLS0+XG4gICAgICA8cGF0dGVybiBpZD1cImRhc2hlZC1saW5lXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cbiAgICAgICAgPGxpbmUgeDE9XCIwXCIgeTE9XCI1XCIgeDI9XCIxMFwiIHkyPVwiNVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWRhc2hhcnJheT1cIjUsNVwiIC8+XG4gICAgICA8L3BhdHRlcm4+XG5cbiAgICAgIEBmb3IgKHN3aW1sYW5lIG9mIHN0YXRlLnN3aW1sYW5lczsgdHJhY2sgc3dpbWxhbmUub3JkZXIpIHtcbiAgICAgIDxjbGlwUGF0aCBbYXR0ci5pZF09XCInc3dpbWxhbmUtY2xpcC0nICsgc3dpbWxhbmUub3JkZXJcIj5cbiAgICAgICAgPHJlY3QgeD1cIjBcIiB5PVwiMFwiIFthdHRyLndpZHRoXT1cImNhbnZhc1dpZHRoXCIgaGVpZ2h0PVwiMjYzXCIgLz5cbiAgICAgIDwvY2xpcFBhdGg+XG4gICAgICB9XG4gICAgPC9kZWZzPlxuXG4gICAgPCEtLSBCYWNrZ3JvdW5kIGdyaWQgLS0+XG4gICAgPHJlY3Qgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIGZpbGw9XCJ1cmwoI2dyaWQpXCIgLz5cblxuICAgIDwhLS0gRGlzcGxheSBhIG1lc3NhZ2Ugd2hlbiBubyBzd2ltbGFuZXMgZXhpc3QgLS0+XG4gICAgQGlmIChzdGF0ZS5zd2ltbGFuZXMubGVuZ3RoID09PSAwKSB7XG4gICAgPHRleHQgeD1cIjUwJVwiIHk9XCI1MCVcIiBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIiBmb250LXNpemU9XCIxNlwiIGZpbGw9XCIjOTRhM2I4XCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIj5cbiAgICAgIFNlbGVjdCB0aGUgU3dpbWxhbmUgdG9vbCBhbmQgY2xpY2sgb24gdGhlIGNhbnZhcyB0byBhZGQgYSBzd2ltbGFuZVxuICAgIDwvdGV4dD5cbiAgICB9XG5cbiAgICA8IS0tIFRoaXMgaXMgd2hlcmUgd29ya2Zsb3cgZWxlbWVudHMgd2lsbCBiZSBhZGRlZCBsYXRlciAtLT5cbiAgICBAZm9yIChzd2ltbGFuZSBvZiBzdGF0ZS5zd2ltbGFuZXM7IHRyYWNrIHN3aW1sYW5lLm9yZGVyKSB7XG4gICAgPCEtLSA8Z1xuICAgICAgW2F0dHIudHJhbnNmb3JtXT1cIid0cmFuc2xhdGUoMCwnICsgc3dpbWxhbmUub3JkZXIgKiAyNjMgKyAnKSdcIlxuICAgICAgW2F0dHIuY2xpcC1wYXRoXT1cIid1cmwoI3N3aW1sYW5lLWNsaXAtJyArIHN3aW1sYW5lLm9yZGVyICsgJyknXCJcbiAgICA+XG4gICAgICA8cmVjdFxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiMjYzXCJcbiAgICAgICAgZmlsbD1cIiNmZmZmZmZcIlxuICAgICAgICBzdHJva2U9XCIjZTJlOGYwXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICA+PC9yZWN0PlxuXG4gICAgICA8cmVjdFxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIlxuICAgICAgICBoZWlnaHQ9XCI0MFwiXG4gICAgICAgIGZpbGw9XCIjZjhmYWZjXCJcbiAgICAgICAgc3Ryb2tlPVwiI2UyZThmMFwiXG4gICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgPjwvcmVjdD5cblxuICAgICAgPHRleHRcbiAgICAgICAgeD1cIjIwXCJcbiAgICAgICAgeT1cIjI1XCJcbiAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgZm9udC1zaXplPVwiMTRcIlxuICAgICAgICBmaWxsPVwiIzMzMzMzM1wiXG4gICAgICAgIGZvbnQtd2VpZ2h0PVwiYm9sZFwiXG4gICAgICA+XG4gICAgICAgIHt7IHN3aW1sYW5lLmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG5cbiAgICAgIDxnXG4gICAgICAgIGNsYXNzPVwiZWRpdC1zd2ltbGFuZS1idXR0b25cIlxuICAgICAgICBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgxMDAsIDIwKSdcIlxuICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgb25FZGl0U3dpbWxhbmUoJGV2ZW50LCBzd2ltbGFuZSwgc3dpbWxhbmUub3JkZXIpO1xuICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8cmVjdFxuICAgICAgICAgIHg9XCItNVwiXG4gICAgICAgICAgeT1cIi0xNVwiXG4gICAgICAgICAgd2lkdGg9XCI0MFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMjBcIlxuICAgICAgICAgIGZpbGw9XCIjZjNlOGZmXCJcbiAgICAgICAgICByeD1cIjNcIlxuICAgICAgICAgIHJ5PVwiM1wiXG4gICAgICAgICAgc3Ryb2tlPVwiI2Q4YjRmZVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L3JlY3Q+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgeD1cIjE1XCJcbiAgICAgICAgICB5PVwiMFwiXG4gICAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMlwiXG4gICAgICAgICAgZmlsbD1cIiM3ZTIyY2VcIlxuICAgICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIEVkaXRcbiAgICAgICAgPC90ZXh0PlxuICAgICAgPC9nPlxuXG4gICAgICA8ZyBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgyMDAsIDIwKSdcIj5cbiAgICAgICAgQGZvciAodGFnIG9mIHN3aW1sYW5lLnRhZ3Muc2xpY2UoMCwgMyk7IHRyYWNrIHRhZy5OYW1lOyBsZXQgaSA9ICRpbmRleClcbiAgICAgICAge1xuICAgICAgICA8dGV4dFxuICAgICAgICAgIFthdHRyLnhdPVwiaSAqIDEwMFwiXG4gICAgICAgICAgeT1cIjVcIlxuICAgICAgICAgIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiXG4gICAgICAgICAgZm9udC1zaXplPVwiMTJcIlxuICAgICAgICAgIGZpbGw9XCIjNjY2NjY2XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHRhZy5OYW1lIH19XG4gICAgICAgIDwvdGV4dD5cbiAgICAgICAgfSBAaWYgKHN3aW1sYW5lLnRhZ3MubGVuZ3RoID4gMykge1xuICAgICAgICA8dGV4dFxuICAgICAgICAgIFthdHRyLnhdPVwiMyAqIDEwMCArIDEwXCJcbiAgICAgICAgICB5PVwiNVwiXG4gICAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMlwiXG4gICAgICAgICAgZmlsbD1cIiM2NjY2NjZcIlxuICAgICAgICA+XG4gICAgICAgICAgK3t7IHN3aW1sYW5lLnRhZ3MubGVuZ3RoIC0gMyB9fSBtb3JlXG4gICAgICAgIDwvdGV4dD5cbiAgICAgICAgfVxuICAgICAgPC9nPlxuICAgIDwvZz4gLS0+XG5cbiAgICA8ZyBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgwLCcgKyBzd2ltbGFuZS5vcmRlciAqIDI2MyArICcpJ1wiPlxuICAgICAgPCEtLSBTd2ltbGFuZSBjb250YWluZXIgLSByZW1vdmUgc3Ryb2tlIHRvIG1ha2UgaXQgcHVyZWx5IGJhY2tncm91bmQgLS0+XG4gICAgICA8cmVjdCB4PVwiMFwiIHk9XCIwXCIgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIiBbYXR0ci5oZWlnaHRdPVwiMjYzXCJcbiAgICAgICAgW2F0dHIuZmlsbF09XCJzd2ltbGFuZS5vcmRlciAlIDIgPT09IDAgPyAnI0ZDRjNGRicgOiAnI0VDRkZGNSdcIiBzdHJva2U9XCJub25lXCI+PC9yZWN0PlxuXG4gICAgICA8IS0tIFZlcnRpY2FsIHN3aW1sYW5lIGxhYmVsIG9uIHRoZSBsZWZ0IC0tPlxuICAgICAgPGcgY2xhc3M9XCJzd2ltbGFuZS1sYWJlbFwiPlxuICAgICAgICA8IS0tIFB1cnBsZSBiYWNrZ3JvdW5kIGZvciB0aGUgbGFiZWwgLS0+XG4gICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCI0M1wiIGhlaWdodD1cIjIxNVwiIHJ4PVwiMTAuNVwiIGZpbGw9XCJ3aGl0ZVwiIHN0cm9rZT1cIiNEMzZDRkZcIj48L3JlY3Q+XG5cbiAgICAgICAgPCEtLSBQbHVzIGJ1dHRvbiBhdCB0aGUgdG9wIC0tPlxuICAgICAgICA8ZyAoY2xpY2spPVwiXG4gICAgICAgICAgICBvbkVkaXRTd2ltbGFuZSgkZXZlbnQsIHN3aW1sYW5lLCBzd2ltbGFuZS5vcmRlcik7XG4gICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICBcIj5cbiAgICAgICAgICA8cmVjdCB4PVwiMTIuNVwiIHk9XCIxMFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJ0cmFuc3BhcmVudFwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCI+PC9yZWN0PlxuXG4gICAgICAgICAgPHBhdGggZD1cIk0yMi41MiAxMi4xNzRWMTcuMDhIMjcuNDdWMTguNTFIMjIuNTJWMjMuMzk0SDIxLjJWMTguNTFIMTYuMjVWMTcuMDhIMjEuMlYxMi4xNzRIMjIuNTJaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjMDAwMEZGXCIgY2xhc3M9XCJwbHVzLWljb25cIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiPjwvcGF0aD5cbiAgICAgICAgPC9nPlxuXG4gICAgICAgIDwhLS0gU3dpbWxhbmUgbGFiZWwgLS0+XG4gICAgICAgIDx0ZXh0IHg9XCIyMlwiIHk9XCIxMDZcIiBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIiBmb250LXNpemU9XCIxNFwiIGZpbGw9XCIjMzMzMzMzXCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSgtOTAsIDIyLCAxMDApXCI+XG4gICAgICAgICAge3tcbiAgICAgICAgICBzd2ltbGFuZS5sYWJlbC5sZW5ndGggPiAxMlxuICAgICAgICAgID8gc3dpbWxhbmUubGFiZWwuc3Vic3RyaW5nKDAsIDEwKSArIFwiLi4uXCJcbiAgICAgICAgICA6IHN3aW1sYW5lLmxhYmVsXG4gICAgICAgICAgfX1cbiAgICAgICAgPC90ZXh0PlxuXG4gICAgICAgIDwhLS0gVGFnIGNvdW50IGluZGljYXRvciBhdCB0aGUgYm90dG9tIC0tPlxuICAgICAgICA8cmVjdCB4PVwiMTEuNVwiIHk9XCIxODdcIiB3aWR0aD1cIjIxXCIgaGVpZ2h0PVwiMTlcIiByeD1cIjkuNVwiIGZpbGw9XCIjOUU5RTlFXCI+PC9yZWN0PlxuICAgICAgICA8dGV4dCB4PVwiMjRcIiB5PVwiMjA2XCIgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCIgZm9udC1zaXplPVwiMTJcIiBmaWxsPVwiYmxhY2tcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKC05MCwgMjIsIDIwMClcIj5cbiAgICAgICAgICB7eyBzd2ltbGFuZS50YWdzLmxlbmd0aCB9fVxuICAgICAgICA8L3RleHQ+XG4gICAgICA8L2c+XG4gICAgPC9nPlxuXG4gICAgfVxuXG4gICAgPCEtLSBOb2RlcyAtLT5cbiAgICBAZm9yIChzd2ltbGFuZSBvZiBzdGF0ZS5zd2ltbGFuZXM7IHRyYWNrIHN3aW1sYW5lLm9yZGVyKSB7XG4gICAgPCEtLSBSZW5kZXIgbm9kZXMgaW4gdGhpcyBzd2ltbGFuZSAtLT5cbiAgICBAZm9yIChub2RlIG9mIHN3aW1sYW5lLm5vZGVzOyB0cmFjayBub2RlLmlkKSB7XG4gICAgPGcgY2xhc3M9XCJub2RlLWVsZW1lbnRcIiBbYXR0ci50cmFuc2Zvcm1dPVwiXG4gICAgICAgICd0cmFuc2xhdGUoJyArIG5vZGUueCArICcsJyArIChub2RlLnkgKyBzd2ltbGFuZS5vcmRlciAqIDI2MykgKyAnKSdcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwic2hvd0Nvbm5lY3Rpb25Qb2ludHMobm9kZS5pZCwgc3dpbWxhbmUub3JkZXIpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhpZGVDb25uZWN0aW9uUG9pbnRzKG5vZGUuaWQpXCI+XG4gICAgICA8IS0tIFN0YXJ0IG5vZGUgaW5kaWNhdG9yIChjaXJjbGUgYW5kIGFycm93KSBmb3IgdGhlIGZpcnN0IG5vZGUgLS0+XG4gICAgICBAaWYgKG5vZGUuaXNTdGFydE5vZGUpIHtcbiAgICAgIDwhLS0gQ2lyY2xlIC0tPlxuICAgICAgPGNpcmNsZSBjeD1cIi01MFwiIGN5PVwiNTBcIiByPVwiMzBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2Utd2lkdGg9XCIxXCI+PC9jaXJjbGU+XG4gICAgICA8IS0tIEZvcm0gaWNvbiBmb3Igc3RhcnQgbm9kZSAtLT5cbiAgICAgIDxzdmc6ZyAoY2xpY2spPVwiXG4gICAgICAgICAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKCRldmVudCwgbm9kZS54LCBub2RlLnksIHN3aW1sYW5lLm9yZGVyKVxuICAgICAgICBcIiBjbGFzcz1cInN0YWdlLWljb25cIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQ1LCA0MilcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgcG9pbnRlci1ldmVudHM6IGFsbFwiPlxuICAgICAgICA8IS0tIFRyYW5zcGFyZW50IHJlY3RhbmdsZSB0byBjYXB0dXJlIGNsaWNrcyAtLT5cbiAgICAgICAgPHN2ZzpyZWN0IHg9XCItMlwiIHk9XCItMlwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIGZpbGw9XCJ0cmFuc3BhcmVudFwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCIgLz5cbiAgICAgICAgPHN2ZzpwYXRoXG4gICAgICAgICAgZD1cIk0xNi41IDIwLjQ3NVYxNy40NzVIMTMuNVYxNi40NzVIMTYuNVYxMy40NzVIMTcuNVYxNi40NzVIMjAuNVYxNy40NzVIMTcuNVYyMC40NzVIMTYuNVpNMy41IDE3LjVWMTYuNUg0LjVWMTcuNUgzLjVaTTYuNSAxNy41VjE2LjVIMTEuNTE3QzExLjUwNTcgMTYuNjc2NyAxMS41MDQzIDE2Ljg0NSAxMS41MTMgMTcuMDA1QzExLjUyMSAxNy4xNjUgMTEuNTMxIDE3LjMzIDExLjU0MyAxNy41SDYuNVpNMy41IDEzLjVWMTIuNUg0LjVWMTMuNUgzLjVaTTYuNSAxMy41VjEyLjVIMTMuODA0QzEzLjYxMjcgMTIuNjM4NyAxMy40MzMzIDEyLjc5MTMgMTMuMjY2IDEyLjk1OEMxMy4wOTkzIDEzLjEyNDcgMTIuOTM3NyAxMy4zMDUzIDEyLjc4MSAxMy41SDYuNVpNMy41IDkuNVY4LjVINC41VjkuNUgzLjVaTTYuNSA5LjVWOC41SDE4LjVWOS41SDYuNVpNMy41IDUuNVY0LjVINC41VjUuNUgzLjVaTTYuNSA1LjVWNC41SDE4LjVWNS41SDYuNVpcIlxuICAgICAgICAgIFthdHRyLmZpbGxdPVwic3RhdGUud29ya2Zsb3dGb3JtSWQgPyAnI0QzNkNGRicgOiAnYmxhY2snXCIgdHJhbnNmb3JtPVwic2NhbGUoMC43KVwiIC8+XG4gICAgICA8L3N2ZzpnPlxuICAgICAgPCEtLSBBcnJvdyBmcm9tIGNpcmNsZSB0byBub2RlIC0tPlxuICAgICAgPHBhdGggZD1cIk0gLTIwIDUwIEwgMCA1MFwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2Utd2lkdGg9XCIxXCIgbWFya2VyLWVuZD1cInVybCgjYXJyb3doZWFkKVwiPjwvcGF0aD5cbiAgICAgIH1cblxuICAgICAgPCEtLSBFeGl0IHBvaW50IGluZGljYXRvciAoY2lyY2xlIGFuZCBhcnJvdykgLS0+XG4gICAgICBAaWYgKG5vZGUuc3RhZ2VEYXRhPy5Jc0V4aXRQb2ludCkge1xuICAgICAgPCEtLSBBcnJvdyBmcm9tIG5vZGUgdG8gY2lyY2xlIC0tPlxuICAgICAgPHBhdGggW2F0dHIuZF09XCInTSAnICsgbm9kZS53aWR0aCArICcgNTAgTCAnICsgKG5vZGUud2lkdGggKyAyMCkgKyAnIDUwJ1wiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgbWFya2VyLWVuZD1cInVybCgjYXJyb3doZWFkKVwiPjwvcGF0aD5cbiAgICAgIDwhLS0gQ2lyY2xlIC0tPlxuICAgICAgPGNpcmNsZSBbYXR0ci5jeF09XCJub2RlLndpZHRoICsgNTBcIiBjeT1cIjUwXCIgcj1cIjMwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjRDM2Q0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMlwiPjwvY2lyY2xlPlxuICAgICAgfVxuXG4gICAgICA8IS0tIElubmVyIGRyYWctaGFuZGxlOiBpbnNldCAxMnB4IHNvIHRoZSBub2RlIGVkZ2UgcmluZyBzdGF5cyBkcmFnLWZyZWUuXG4gICAgICAgICAgIFJlbmRlcmVkIEJFRk9SRSB0aGUgbm9kZSBzaGFwZXMvaWNvbnMgc28gdGhlIGNsaWNrYWJsZSBpY29ucyBwYWludCBvblxuICAgICAgICAgICB0b3Agb2YgaXQgYW5kIHdpbiBwb2ludGVyIGV2ZW50czsgdGhlIG5vZGUgYm9keSBzdGlsbCBmYWxscyB0aHJvdWdoIHRvXG4gICAgICAgICAgIHRoaXMgaGFuZGxlIGJlY2F1c2UgaXRzIHNoYXBlL2xhYmVsIHVzZSBwb2ludGVyLWV2ZW50czpub25lLlxuICAgICAgICAgICBDb25uZWN0aW9uIHBvaW50IDx1c2U+IGVsZW1lbnRzIGFyZSByZW5kZXJlZCBhZnRlciBldmVyeXRoaW5nIHNvIHRoZXlcbiAgICAgICAgICAgc3RheSB0b3Btb3N0IGFuZCB3aW4gcG9pbnRlciBldmVudHMgYXQgdGhlIG5vZGUgZWRnZXMuIC0tPlxuICAgICAgPHJlY3QgY2xhc3M9XCJub2RlLWRyYWctaGFuZGxlXCJcbiAgICAgICAgW2F0dHIueF09XCIxMlwiIFthdHRyLnldPVwiMTJcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJub2RlLndpZHRoIC0gMjRcIiBbYXR0ci5oZWlnaHRdPVwibm9kZS5oZWlnaHQgLSAyNFwiXG4gICAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiZ2V0Q3Vyc29yRm9yTm9kZShub2RlLmlkKVwiXG4gICAgICAgIChtb3VzZWRvd24pPVwib25Ob2RlTW91c2VEb3duKCRldmVudCwgbm9kZSwgc3dpbWxhbmUub3JkZXIpXCIgLz5cblxuICAgICAgPCEtLSBTdGFnZSBub2RlIC0tPlxuICAgICAgQGlmIChub2RlLnR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgIDwhLS0gPHJlY3RcbiAgICAgICAgICAgICAgICAgIHg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIHk9XCIwXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLndpZHRoXT1cIm5vZGUud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cIm5vZGUuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEMzZDRkZcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgICAgICAgICAgPjwvcmVjdD4gLS0+XG4gICAgICA8c3ZnOmcgbGliLXN0YWdlLW5vZGUgW25vZGVdPVwibm9kZVwiIFtpc1N0YXJ0Tm9kZV09XCJub2RlLmlzU3RhcnROb2RlXCJcbiAgICAgICAgKHN0YWdlUHJvcGVydGllc1VwZGF0ZWQpPVwib25TdGFnZVByb3BlcnRpZXNVcGRhdGVkKCRldmVudClcIiAoc2hvd1NoaWVsZERpYWxvZyk9XCJvblNob3dTaGllbGREaWFsb2coJGV2ZW50KVwiXG4gICAgICAgIChzaG93RXNjYWxhdGlvbkRpYWxvZyk9XCJvblNob3dFc2NhbGF0aW9uRGlhbG9nKCRldmVudClcIiAoc2hvd0Zvcm1EaWFsb2cpPVwiXG4gICAgICAgICAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKCRldmVudCwgbm9kZS54LCBub2RlLnksIHN3aW1sYW5lLm9yZGVyLCBub2RlKVxuICAgICAgICBcIj48L3N2ZzpnPlxuICAgICAgfVxuXG4gICAgICA8IS0tIERlY2lzaW9uIG5vZGUgLS0+XG4gICAgICBAaWYgKG5vZGUudHlwZSA9PT0gJ2RlY2lzaW9uJykge1xuICAgICAgPHBhdGggW2F0dHIuZF09XCJcbiAgICAgICAgICAnTSAwICcgK1xuICAgICAgICAgIG5vZGUuaGVpZ2h0IC8gMiArXG4gICAgICAgICAgJyBMICcgK1xuICAgICAgICAgIG5vZGUud2lkdGggLyAyICtcbiAgICAgICAgICAnIDAnICtcbiAgICAgICAgICAnIEwgJyArXG4gICAgICAgICAgbm9kZS53aWR0aCArXG4gICAgICAgICAgJyAnICtcbiAgICAgICAgICBub2RlLmhlaWdodCAvIDIgK1xuICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICBub2RlLndpZHRoIC8gMiArXG4gICAgICAgICAgJyAnICtcbiAgICAgICAgICBub2RlLmhlaWdodCArXG4gICAgICAgICAgJyBaJ1xuICAgICAgICBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2Utd2lkdGg9XCIxXCIgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZVwiPjwvcGF0aD5cblxuICAgICAgPCEtLSBEZWNpc2lvbiBub2RlIGNvbmRpdGlvbiBpbmRpY2F0b3IgaWNvbiAtLT5cbiAgICAgIDxzdmc6ZyAoY2xpY2spPVwic2hvd0RlY2lzaW9uQ29uZGl0aW9uc1BvcHVwKCRldmVudCwgbm9kZSwgc3dpbWxhbmUub3JkZXIpXCIgY2xhc3M9XCJkZWNpc2lvbi1jb25kaXRpb24taWNvblwiXG4gICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJcbiAgICAgICAgICAndHJhbnNsYXRlKCcgK1xuICAgICAgICAgIChub2RlLndpZHRoIC8gMiAtIDEwKSArXG4gICAgICAgICAgJywnICtcbiAgICAgICAgICAobm9kZS5oZWlnaHQgLyAyIC0gMTApICtcbiAgICAgICAgICAnKSdcbiAgICAgICAgXCI+XG4gICAgICAgIDxzdmc6cmVjdCB4PVwiLTVcIiB5PVwiLTVcIiB3aWR0aD1cIjMwXCIgaGVpZ2h0PVwiMzBcIiBmaWxsPVwidHJhbnNwYXJlbnRcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiIC8+XG4gICAgICAgIDxzdmc6cGF0aCBkPVwiTTEwIDBIMjBWMkgxMFYwWk0xMCA4SDIwVjEwSDEwVjhaTTEwIDRIMjBWNkgxMFY0Wk0wIDBIOFYySDBWMFpNMCA4SDhWMTBIMFY4Wk0wIDRIOFY2SDBWNFpcIlxuICAgICAgICAgIGZpbGw9XCIjRDM2Q0ZGXCIgLz5cbiAgICAgIDwvc3ZnOmc+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gRm9ybSBub2RlIC0tPlxuICAgICAgQGlmIChub2RlLnR5cGUgPT09ICdmb3JtJykge1xuICAgICAgPHBhdGhcbiAgICAgICAgZD1cIk05NS4wNjI1IDUwLjU1OTFWOTUuMDYyNUM5NS4wNjI1IDk3Ljk3MTYgOTMuOTA2OSAxMDAuNzYyIDkxLjg0OTggMTAyLjgxOUM4OS43OTI4IDEwNC44NzYgODcuMDAyOCAxMDYuMDMxIDg0LjA5MzggMTA2LjAzMUgzMi45MDYyQzI5Ljk5NzIgMTA2LjAzMSAyNy4yMDcyIDEwNC44NzYgMjUuMTUwMiAxMDIuODE5QzIzLjA5MzEgMTAwLjc2MiAyMS45Mzc1IDk3Ljk3MTYgMjEuOTM3NSA5NS4wNjI1VjIxLjkzNzVDMjEuOTM3NSAxOS4wMjg0IDIzLjA5MzEgMTYuMjM4NSAyNS4xNTAyIDE0LjE4MTRDMjcuMjA3MiAxMi4xMjQ0IDI5Ljk5NzIgMTAuOTY4OCAzMi45MDYyIDEwLjk2ODhINTUuNDcyMkM1Ny40MTA5IDEwLjk2OSA1OS4yNzAxIDExLjczOTIgNjAuNjQxMiAxMy4xMDk5TDkyLjkyMTMgNDUuMzkwMUM5NC4yOTIgNDYuNzYxMSA5NS4wNjIyIDQ4LjYyMDQgOTUuMDYyNSA1MC41NTkxWlwiXG4gICAgICAgIHRyYW5zZm9ybT1cInNjYWxlKDAuNylcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmVcIiAvPlxuICAgICAgPHBhdGhcbiAgICAgICAgZD1cIk01OC41IDEyLjc5NjlWNDAuMjE4OEM1OC41IDQyLjE1ODEgNTkuMjcwNCA0NC4wMTgxIDYwLjY0MTggNDUuMzg5NUM2Mi4wMTMxIDQ2Ljc2MDggNjMuODczMSA0Ny41MzEyIDY1LjgxMjUgNDcuNTMxMkg5My4yMzQ0XCJcbiAgICAgICAgdHJhbnNmb3JtPVwic2NhbGUoMC43KVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lXCIgLz5cbiAgICAgIDx0ZXh0IHg9XCI1MCVcIiB5PVwiNTAlXCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIiBkb21pbmFudC1iYXNlbGluZT1cIm1pZGRsZVwiIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiIGZvbnQtc2l6ZT1cIjE0XCJcbiAgICAgICAgZmlsbD1cIiNEMzZDRkZcIiBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lXCI+XG4gICAgICAgIEZvcm1cbiAgICAgIDwvdGV4dD5cbiAgICAgIH1cblxuICAgICAgPCEtLSBTdWJmbG93IG5vZGUgLS0+XG4gICAgICBAaWYgKG5vZGUudHlwZSA9PT0gJ3N1YmZsb3cnKSB7XG4gICAgICA8c3ZnOmcgbGliLXN0YWdlLW5vZGUgW25vZGVdPVwibm9kZVwiIFtpc1N0YXJ0Tm9kZV09XCJub2RlLmlzU3RhcnROb2RlXCIgW2lzU3ViZmxvd109XCJ0cnVlXCJcbiAgICAgICAgKHN0YWdlUHJvcGVydGllc1VwZGF0ZWQpPVwib25TdGFnZVByb3BlcnRpZXNVcGRhdGVkKCRldmVudClcIiAoc2hvd1NoaWVsZERpYWxvZyk9XCJvblNob3dTaGllbGREaWFsb2coJGV2ZW50KVwiXG4gICAgICAgIChzaG93RXNjYWxhdGlvbkRpYWxvZyk9XCJvblNob3dFc2NhbGF0aW9uRGlhbG9nKCRldmVudClcIiAoc2hvd0Zvcm1EaWFsb2cpPVwiXG4gICAgICAgICAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKCRldmVudCwgbm9kZS54LCBub2RlLnksIHN3aW1sYW5lLm9yZGVyLCBub2RlKVxuICAgICAgICBcIj48L3N2ZzpnPlxuICAgICAgfVxuXG4gICAgICA8IS0tIENvbm5lY3Rpb24gcG9pbnRzIGZvciB0aGlzIG5vZGUgKHJlbmRlcmVkIGxhc3QgPSB0b3Btb3N0KSAtLT5cbiAgICAgIEBmb3IgKHBvaW50IG9mIG5vZGUuY29ubmVjdGlvblBvaW50cyB8fCBbXTsgdHJhY2sgcG9pbnQuaWQpIHtcbiAgICAgICAgQGlmIChpc0Nvbm5lY3Rpb25Qb2ludFZpc2libGUobm9kZS5pZCkpIHtcbiAgICAgICAgICA8dXNlIGNsYXNzPVwiY29ubmVjdGlvbi1wb2ludFwiIFthdHRyLmhyZWZdPVwiJyNjb25uZWN0aW9uLXBvaW50LXRlbXBsYXRlJ1wiIFthdHRyLnhdPVwicG9pbnQueFwiIFthdHRyLnldPVwicG9pbnQueVwiXG4gICAgICAgICAgICBbYXR0ci5pZF09XCJwb2ludC5pZFwiIChtb3VzZWRvd24pPVwic3RhcnRDb25uZWN0aW9uRHJhZygkZXZlbnQsIHBvaW50LCBzd2ltbGFuZS5vcmRlcilcIiAvPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9nPlxuICAgIDwhLS0gQSB0cmFuc3BhcmVudCBob3ZlciBhcmVhIGZvciBpbXByb3ZlZCBob3ZlciBkZXRlY3Rpb24gLS0+XG4gICAgPHJlY3QgW2F0dHIueF09XCJub2RlLnggLSAxMFwiIFthdHRyLnldPVwibm9kZS55IC0gMTBcIiBbYXR0ci53aWR0aF09XCJub2RlLndpZHRoICsgMjBcIiBbYXR0ci5oZWlnaHRdPVwibm9kZS5oZWlnaHQgKyAyMFwiXG4gICAgICBmaWxsPVwidHJhbnNwYXJlbnRcIiAobW91c2VvdmVyKT1cInNob3dDb25uZWN0aW9uUG9pbnRzKG5vZGUuaWQsIHN3aW1sYW5lLm9yZGVyKVwiXG4gICAgICAobW91c2VvdXQpPVwiaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZS5pZClcIiBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lXCIgLz5cbiAgICB9IH1cblxuICAgIDwhLS0gQ29ubmVjdGlvbnMgLS0+XG4gICAgQGZvciAoY29ubmVjdGlvbiBvZiBzdGF0ZS5jb25uZWN0aW9uczsgdHJhY2sgY29ubmVjdGlvbi5pZCkge1xuICAgIDxnIGNsYXNzPVwiY29ubmVjdGlvbi1lbGVtZW50XCI+XG4gICAgICA8cGF0aCBbYXR0ci5kXT1cImdldENvbm5lY3Rpb25QYXRoRm9yU2F2ZWRDb25uZWN0aW9uKGNvbm5lY3Rpb24pXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjJcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgIG1hcmtlci1lbmQ9XCJ1cmwoI2Fycm93aGVhZClcIj48L3BhdGg+XG5cbiAgICAgIDwhLS0gQ29ubmVjdGlvbiBMYWJlbCAtLT5cbiAgICAgIEBpZiAoY29ubmVjdGlvbi5zb3VyY2VOb2RlSWQgJiYgY29ubmVjdGlvbi50YXJnZXROb2RlSWQpIHtcbiAgICAgIDxmb3JlaWduT2JqZWN0IFthdHRyLnhdPVwiZ2V0TGFiZWxQb3NpdGlvbihjb25uZWN0aW9uKS54XCIgW2F0dHIueV09XCJnZXRMYWJlbFBvc2l0aW9uKGNvbm5lY3Rpb24pLnlcIiB3aWR0aD1cIjE1MFwiXG4gICAgICAgIGhlaWdodD1cIjQwXCIgc3R5bGU9XCJvdmVyZmxvdzogdmlzaWJsZTsgcG9pbnRlci1ldmVudHM6IGFsbDtcIiBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgtNzUsIC0xMCknXCI+XG4gICAgICAgIDx3Zi1sYWJlbC1lZGl0b3IgW2xhYmVsXT1cImNvbm5lY3Rpb24ubGFiZWwgfHwgJ05ldyBBY3Rpb24nXCIgW3hdPVwiMFwiIFt5XT1cIjBcIiBbaXNDb25uZWN0aW9uXT1cInRydWVcIlxuICAgICAgICAgIChsYWJlbENoYW5nZSk9XCJzYXZlQ29ubmVjdGlvbkxhYmVsKGNvbm5lY3Rpb24sICRldmVudClcIiAob3BlbkRpYWxvZyk9XCJvblNob3dBY3Rpb25EaWFsb2coY29ubmVjdGlvbilcIiAvPlxuICAgICAgPC9mb3JlaWduT2JqZWN0PlxuICAgICAgfVxuICAgIDwvZz5cbiAgICB9XG5cbiAgICA8IS0tIENvbm5lY3Rpb24gcHJldmlldyBsaW5lIC0tPlxuICAgIEBpZiAoc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKSkge1xuICAgIDxnPlxuICAgICAgPHBhdGggW2F0dHIuZF09XCJnZXRDb25uZWN0aW9uUGF0aCgpXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtZGFzaGFycmF5PVwiNSw1XCIgZmlsbD1cIm5vbmVcIj48L3BhdGg+XG4gICAgPC9nPlxuICAgIH1cbiAgPC9zdmc+XG5cbiAgPGRpdiAqbmdJZj1cInBvcHVwVmlzaWJsZVwiIFtzdHlsZS5wb3NpdGlvbl09XCInYWJzb2x1dGUnXCIgW3N0eWxlLmxlZnQucHhdPVwicG9wdXBYXCIgW3N0eWxlLnRvcC5weF09XCJwb3B1cFlcIj5cbiAgICA8dmVyYmVuLXBvcC1VcCBbZHJvcGRvd25PcGVuXT1cInRydWVcIiBbY3VzdG9tU3R5bGVzXT1cInsgJ3otaW5kZXgnOiAnOTknIH1cIiBbZW5hYmxlTW91c2VMZWF2ZV09XCJmYWxzZVwiXG4gICAgICAoZHJvcGRvd25PcGVuQ2hhbmdlKT1cIiRldmVudCA/IG51bGwgOiBoaWRlQ29ubmVjdGlvblBvcHVwKClcIj5cbiAgICAgIDxkaXYgZHJvcGRvd24tdHJpZ2dlciBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICAgICAgPCEtLSBIaWRkZW4gdHJpZ2dlciBlbGVtZW50IC0tPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicC0zIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCBzaGFkb3ctbWRcIiBkcm9wZG93bi1jb250ZW50PlxuICAgICAgICA8aDQgY2xhc3M9XCJtYi0yIGZvbnQtbWVkaXVtXCI+Q3JlYXRlIENvbm5lY3Rpb248L2g0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHR5cGUgb2YgYWxsb3dlZE5vZGVUeXBlc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInB4LTMgcHktMiBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQgdGV4dC1zbSBob3ZlcjpiZy1ncmF5LTUwXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZU5vZGVDb25uZWN0aW9uKHR5cGUpXCI+XG4gICAgICAgICAgICAgIENyZWF0ZSB7eyB0eXBlIHwgdGl0bGVjYXNlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImhpZGVDb25uZWN0aW9uUG9wdXAoKVwiPlxuICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC92ZXJiZW4tcG9wLVVwPlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwic2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cFwiIFtzdHlsZS5wb3NpdGlvbl09XCInYWJzb2x1dGUnXCIgW3N0eWxlLmxlZnQucHhdPVwic3RhcnROb2RlRm9ybVBvcHVwWFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJzdGFydE5vZGVGb3JtUG9wdXBZXCI+XG4gICAgPHZlcmJlbi1wb3AtVXAgW2Ryb3Bkb3duT3Blbl09XCJ0cnVlXCIgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzEwMCcgfVwiPlxuICAgICAgPGRpdiBkcm9wZG93bi10cmlnZ2VyIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiPlxuICAgICAgICA8IS0tIEhpZGRlbiB0cmlnZ2VyIGVsZW1lbnQgLS0+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTMgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHNoYWRvdy1tZCB3LTY0XCIgZHJvcGRvd24tY29udGVudFxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB6LWluZGV4OiAxMDAwXCI+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1iLTIgZm9udC1tZWRpdW1cIj5TZWxlY3QgV29ya2Zsb3cgRm9ybTwvaDQ+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdTdGFydE5vZGVGb3Jtc1wiIGNsYXNzPVwidGV4dC1jZW50ZXIgcHktMlwiPlxuICAgICAgICAgIExvYWRpbmcgZm9ybXMuLi5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhaXNMb2FkaW5nU3RhcnROb2RlRm9ybXNcIiBjbGFzcz1cIm1heC1oLTQ4IG92ZXJmbG93LXktYXV0b1wiIHN0eWxlPVwibWF4LWhlaWdodDogMTkycHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLWdyYXktNTAgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHRleHQtc20gaG92ZXI6YmctZ3JheS01MCB0ZXh0LWxlZnRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U3RhcnROb2RlRm9ybShudWxsKVwiPlxuICAgICAgICAgICAgICBDbGVhciBmb3JtIHNlbGVjdGlvblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZm9ybSBvZiBzdGFydE5vZGVGb3Jtc0xpc3RcIiBjbGFzcz1cIm1iLTFcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTAgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnYmctYmx1ZS01MCAhYm9yZGVyLWJsdWUtNTAwICFib3JkZXItMiBmb250LXNlbWlib2xkJzogZm9ybT8uQ29kZSA9PT0gYWN0aXZlTm9kZUZvckZvcm1TZWxlY3Rpb24/LnN0YWdlRGF0YT8uZm9ybUlkfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTdGFydE5vZGVGb3JtKGZvcm0pXCI+XG4gICAgICAgICAgICAgIHt7IGZvcm0uTmFtZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInN0YXJ0Tm9kZUZvcm1zTGlzdC5sZW5ndGggPT09IDBcIiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTIgdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgTm8gZm9ybXMgYXZhaWxhYmxlXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC92ZXJiZW4tcG9wLVVwPlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwic2hvd1N1YmZsb3dQb3B1cFwiIFtzdHlsZS5wb3NpdGlvbl09XCInYWJzb2x1dGUnXCIgW3N0eWxlLmxlZnQucHhdPVwic3ViZmxvd1BvcHVwWFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJzdWJmbG93UG9wdXBZXCI+XG4gICAgPHZlcmJlbi1wb3AtVXAgW2Ryb3Bkb3duT3Blbl09XCJ0cnVlXCIgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzEwMCcgfVwiPlxuICAgICAgPGRpdiBkcm9wZG93bi10cmlnZ2VyIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiPlxuICAgICAgICA8IS0tIEhpZGRlbiB0cmlnZ2VyIGVsZW1lbnQgLS0+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTMgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHNoYWRvdy1tZCB3LTY0XCIgZHJvcGRvd24tY29udGVudFxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB6LWluZGV4OiAxMDAwXCI+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1iLTIgZm9udC1tZWRpdW1cIj5TZWxlY3QgV29ya2Zsb3c8L2g0PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nV29ya2Zsb3dzXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0yXCI+XG4gICAgICAgICAgTG9hZGluZyB3b3JrZmxvd3MuLi5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhaXNMb2FkaW5nV29ya2Zsb3dzXCIgY2xhc3M9XCJtYXgtaC00OCBvdmVyZmxvdy15LWF1dG9cIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDE5MnB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHdvcmtmbG93IG9mIHdvcmtmbG93c0xpc3RcIiBjbGFzcz1cIm1iLTFcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTAgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1YmZsb3dXb3JrZmxvdyh3b3JrZmxvdylcIj5cbiAgICAgICAgICAgICAge3sgd29ya2Zsb3cuTmFtZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIndvcmtmbG93c0xpc3QubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0yIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgIE5vIHdvcmtmbG93cyBhdmFpbGFibGVcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3ZlcmJlbi1wb3AtVXA+XG4gIDwvZGl2PlxuXG4gIDxsaWItY29uZGl0aW9ucy1wb3B1cCBbdmlzaWJsZV09XCJzaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2dcIiBbZGVjaXNpb25Ob2RlSWRdPVwiYWN0aXZlRGVjaXNpb25Ob2RlSWRcIlxuICAgIFtuZXdDb25uZWN0aW9uSWRdPVwiYWN0aXZlQ29ubmVjdGlvbklkXCIgW3BvcHVwWF09XCJkZWNpc2lvbkNvbmRpdGlvblBvcHVwWFwiIFtwb3B1cFldPVwiZGVjaXNpb25Db25kaXRpb25Qb3B1cFlcIlxuICAgIChjbG9zZWQpPVwib25EZWNpc2lvbkNvbmRpdGlvbkNhbmNlbGxlZCgpXCIgKHNhdmVkKT1cIm9uRGVjaXNpb25Db25kaXRpb25TYXZlZCgkZXZlbnQpXCI+PC9saWItY29uZGl0aW9ucy1wb3B1cD5cblxuICA8IS0tIDxsaWItZGVjaXNpb24tcG9wdXBcbiAgICBbdmlzaWJsZV09XCJzaG93Q29uZGl0aW9uc0RpYWxvZ1wiXG4gICAgW2RlY2lzaW9uTm9kZUlkXT1cImFjdGl2ZURlY2lzaW9uTm9kZUlkXCJcbiAgICBbcG9wdXBYXT1cImRlY2lzaW9uQ29uZGl0aW9uUG9wdXBYXCJcbiAgICBbcG9wdXBZXT1cImRlY2lzaW9uQ29uZGl0aW9uUG9wdXBZXCJcbiAgICAoY2xvc2VkKT1cIm9uRGVjaXNpb25Db25kaXRpb25DYW5jZWxsZWQoKVwiXG4gID48L2xpYi1kZWNpc2lvbi1wb3B1cD4gLS0+XG5cbiAgPGxpYi1zdGFnZS1kaWFsb2cgW3Zpc2libGVdPVwic2hvd1N0YWdlRGlhbG9nTG9jYWxcIiBbc3RhZ2VEYXRhXT1cImFjdGl2ZVN0YWdlRGF0YSB8fCB7fVwiXG4gICAgKGNsb3NlZCk9XCJvblN0YWdlRGlhbG9nQ2xvc2VkKClcIiAoc2F2ZWQpPVwib25TdGFnZURpYWxvZ1NhdmVkKCRldmVudClcIj48L2xpYi1zdGFnZS1kaWFsb2c+XG5cbiAgPGxpYi1hY3Rpb24tZGlhbG9nIFt2aXNpYmxlXT1cInNob3dBY3Rpb25EaWFsb2dMb2NhbFwiIFthY3Rpb25EYXRhXT1cImFjdGl2ZUFjdGlvbkRhdGFcIiAoY2xvc2VkKT1cIm9uQWN0aW9uRGlhbG9nQ2xvc2VkKClcIlxuICAgIChzYXZlZCk9XCJvbkFjdGlvbkRpYWxvZ1NhdmVkKCRldmVudClcIiAoZGVsZXRlZCk9XCJvbkFjdGlvbkRpYWxvZ0RlbGV0ZWQoJGV2ZW50KVwiPjwvbGliLWFjdGlvbi1kaWFsb2c+XG5cblxuICA8bGliLWVzY2FsYXRpb24tZGlhbG9nIFt2aXNpYmxlXT1cInNob3dFc2NhbGF0aW9uRGlhbG9nTG9jYWxcIiBbdHlwZV09XCJhY3RpdmVFc2NhbGF0aW9uVHlwZSgpIVwiXG4gICAgW3N0YWdlQ29kZV09XCJhY3RpdmVTdGFnZUNvZGUoKSB8fCAnJ1wiIFt3b3JrZmxvd0NvZGVdPVwic3RhdGUud29ya2Zsb3c/LkNvZGUgfHwgJydcIlxuICAgIChjbG9zZWQpPVwib25Fc2NhbGF0aW9uRGlhbG9nQ2xvc2VkKClcIj48L2xpYi1lc2NhbGF0aW9uLWRpYWxvZz5cbjwvZGl2PlxuIl19