iszolea-ui 1.2.5 → 1.2.6

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.
@@ -2669,6 +2669,7 @@
2669
2669
  var Index_exports3 = {};
2670
2670
  __export(Index_exports3, {
2671
2671
  EventEmitter: () => EventEmitter,
2672
+ createGridExportFunction: () => createGridExportFunction,
2672
2673
  getGeneralUserFriendlyErrorMessage: () => getGeneralUserFriendlyErrorMessage
2673
2674
  });
2674
2675
 
@@ -2720,6 +2721,29 @@
2720
2721
  }
2721
2722
  };
2722
2723
 
2724
+ // src/Scripts/Utils/GridExport.ts
2725
+ var import_file_saver = __toESM(require_FileSaver_min());
2726
+ function createGridExportFunction(reportName) {
2727
+ return (e) => {
2728
+ const workbook = new window.ExcelJS.Workbook();
2729
+ const worksheet = workbook.addWorksheet(reportName);
2730
+ DevExpress.excelExporter.exportDataGrid({
2731
+ worksheet,
2732
+ component: e.component,
2733
+ customizeCell: (options) => {
2734
+ const excelCell = options.excelCell;
2735
+ excelCell.font = { name: "Arial", size: 12 };
2736
+ excelCell.alignment = { horizontal: "left" };
2737
+ }
2738
+ }).then(function() {
2739
+ workbook.xlsx.writeBuffer().then(function(buffer) {
2740
+ (0, import_file_saver.default)(new Blob([buffer], { type: "application/octet-stream" }), `${reportName}.xlsx`);
2741
+ });
2742
+ });
2743
+ e.cancel = true;
2744
+ };
2745
+ }
2746
+
2723
2747
  // src/Scripts/Header/Header.ts
2724
2748
  var HEADER_DATA_CACHE_FIELD = "iszolea-ui|header-data-cache";
2725
2749
  var SHOW_GLOBAL_MENU_KEY = "iszolea-ui|show-global-menu";
@@ -3544,29 +3568,6 @@
3544
3568
  return treeList;
3545
3569
  }
3546
3570
 
3547
- // src/Scripts/Utils/GridExport.ts
3548
- var import_file_saver = __toESM(require_FileSaver_min());
3549
- function CreateGridExportFunction(reportName) {
3550
- return (e) => {
3551
- const workbook = new window.ExcelJS.Workbook();
3552
- const worksheet = workbook.addWorksheet(reportName);
3553
- DevExpress.excelExporter.exportDataGrid({
3554
- worksheet,
3555
- component: e.component,
3556
- customizeCell: (options) => {
3557
- const excelCell = options.excelCell;
3558
- excelCell.font = { name: "Arial", size: 12 };
3559
- excelCell.alignment = { horizontal: "left" };
3560
- }
3561
- }).then(function() {
3562
- workbook.xlsx.writeBuffer().then(function(buffer) {
3563
- (0, import_file_saver.default)(new Blob([buffer], { type: "application/octet-stream" }), `${reportName}.xlsx`);
3564
- });
3565
- });
3566
- e.cancel = true;
3567
- };
3568
- }
3569
-
3570
3571
  // src/Scripts/Widgets/Grid/DefaultGridBase.ts
3571
3572
  var getWidgetName = (widget) => {
3572
3573
  return widget.slice("dx".length).toLowerCase();
@@ -3939,7 +3940,7 @@
3939
3940
  (_c = settings.options) == null ? void 0 : _c.onContextMenuPreparing(e);
3940
3941
  }
3941
3942
  },
3942
- onExporting: !!settings.exportFileName ? CreateGridExportFunction(settings.exportFileName) : void 0
3943
+ onExporting: !!settings.exportFileName ? createGridExportFunction(settings.exportFileName) : void 0
3943
3944
  };
3944
3945
  }
3945
3946
 
@@ -10392,4 +10393,4 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
10392
10393
  var Scripts_default = IszoleaUI;
10393
10394
  window.IszoleaUI = IszoleaUI;
10394
10395
  })();
10395
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY3JvcHByL2Rpc3QvY3JvcHByLmpzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0J1c2luZXNzL0xpY2VuY2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQnVzaW5lc3MvTWVudUl0ZW1UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvTm90aWZ5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvQXBpUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0U3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9Qb3B1cC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9TdHlsaW5nL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRXJyb3JJbmZvUG9wdXAudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9FeGNlcHRpb25UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvRHhEYXRhU291cmNlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0NvcmUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbmZpZy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvVXNlck1lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L01lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L0Jvb3RzdHJhcENvbGxhcHNpbmdNZW51LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9OYXZpZ2F0aW9uTWVudS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db25zdGFudHMvQ2FjaGVLZXlzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9Mb2dvLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9NZW51U3dpdGNoZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL1NlYXJjaC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9FdmVudEVtaXR0ZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL0hlYWRlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcy50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL0J1c2luZXNzL2NkbUltcG9ydEZpbGVNb2RlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvSUdyaWRTdGF0ZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Gb290ZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9BdXRvUmVzaXplLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRnVsbFNjcmVlbi50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1RoZW1lLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlbHBlcnMvVG9vbGJhci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0RlZmF1bHRUb29sYmFyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvUGFuZWxIZWlnaHQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dyaWRFeHBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkQmFzZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1BhZ2VzL0FjY291bnRTZXR0aW5ncy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0NvbmZpcm0udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9MYW5kaW5nLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9DcmVhdGVEZWZhdWx0R3JpZC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9Db250cm9sQ29uZmlndXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL01lbW9pemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZFZpZXdzTWFuYWdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkU3RhdGVNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZEZpbHRlcnNNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWREaXNwbGF5c01hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRTdW1tYXJ5SGVscGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0NvbnRyb2xEaXNwbGF5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0Rpc3BsYXlNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9HcmlkSW5kaWNhdG9yU3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0dyaWRTdGF0ZU1hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL01vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9EYXRhL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HYW5udENoYXJ0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL1NsaWRlc2hvdy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiogRmlsZVNhdmVyLmpzXG4qIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuKlxuKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4qXG4qIExpY2Vuc2UgOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAoTUlUKVxuKiBzb3VyY2UgIDogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qc1xuKi9cblxuLy8gVGhlIG9uZSBhbmQgb25seSB3YXkgb2YgZ2V0dGluZyBnbG9iYWwgc2NvcGUgaW4gYWxsIGVudmlyb25tZW50c1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMyNzcxODIvMTAwODk5OVxudmFyIF9nbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3dcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmXG4gID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbFxuICA/IGdsb2JhbFxuICA6IHRoaXNcblxuZnVuY3Rpb24gYm9tIChibG9iLCBvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIG9wdHMgPSB7IGF1dG9Cb206IGZhbHNlIH1cbiAgZWxzZSBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc29sZS53YXJuKCdEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCcpXG4gICAgb3B0cyA9IHsgYXV0b0JvbTogIW9wdHMgfVxuICB9XG5cbiAgLy8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcbiAgLy8gbm90ZTogeW91ciBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IFVURi0xNiBVK0ZFRkYgdG8gRUYgQkIgQkZcbiAgaWYgKG9wdHMuYXV0b0JvbSAmJiAvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRiksIGJsb2JdLCB7IHR5cGU6IGJsb2IudHlwZSB9KVxuICB9XG4gIHJldHVybiBibG9iXG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkICh1cmwsIG5hbWUsIG9wdHMpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzYXZlQXMoeGhyLnJlc3BvbnNlLCBuYW1lLCBvcHRzKVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvdWxkIG5vdCBkb3dubG9hZCBmaWxlJylcbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIGNvcnNFbmFibGVkICh1cmwpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIC8vIHVzZSBzeW5jIHRvIGF2b2lkIHBvcHVwIGJsb2NrZXJcbiAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKVxuICB0cnkge1xuICAgIHhoci5zZW5kKClcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5XG59XG5cbi8vIGBhLmNsaWNrKClgIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGJyb3dzZXJzICgjNDY1KVxuZnVuY3Rpb24gY2xpY2sgKG5vZGUpIHtcbiAgdHJ5IHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJylcbiAgICBldnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldnQpXG4gIH1cbn1cblxuLy8gRGV0ZWN0IFdlYlZpZXcgaW5zaWRlIGEgbmF0aXZlIG1hY09TIGFwcCBieSBydWxpbmcgb3V0IGFsbCBicm93c2Vyc1xuLy8gV2UganVzdCBuZWVkIHRvIGNoZWNrIGZvciAnU2FmYXJpJyBiZWNhdXNlIGFsbCBvdGhlciBicm93c2VycyAoYmVzaWRlcyBGaXJlZm94KSBpbmNsdWRlIHRoYXQgdG9vXG4vLyBodHRwczovL3d3dy53aGF0aXNteWJyb3dzZXIuY29tL2d1aWRlcy90aGUtbGF0ZXN0LXVzZXItYWdlbnQvbWFjb3NcbnZhciBpc01hY09TV2ViVmlldyA9IF9nbG9iYWwubmF2aWdhdG9yICYmIC9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbnZhciBzYXZlQXMgPSBfZ2xvYmFsLnNhdmVBcyB8fCAoXG4gIC8vIHByb2JhYmx5IGluIHNvbWUgd2ViIHdvcmtlclxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgd2luZG93ICE9PSBfZ2xvYmFsKVxuICAgID8gZnVuY3Rpb24gc2F2ZUFzICgpIHsgLyogbm9vcCAqLyB9XG5cbiAgLy8gVXNlIGRvd25sb2FkIGF0dHJpYnV0ZSBmaXJzdCBpZiBwb3NzaWJsZSAoIzE5MyBMdW1pYSBtb2JpbGUpIHVubGVzcyB0aGlzIGlzIGEgbWFjT1MgV2ViVmlld1xuICA6ICgnZG93bmxvYWQnIGluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSAmJiAhaXNNYWNPU1dlYlZpZXcpXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgYS5kb3dubG9hZCA9IG5hbWVcbiAgICBhLnJlbCA9ICdub29wZW5lcicgLy8gdGFibmFiYmluZ1xuXG4gICAgLy8gVE9ETzogZGV0ZWN0IGNocm9tZSBleHRlbnNpb25zICYgcGFja2FnZWQgYXBwc1xuICAgIC8vIGEudGFyZ2V0ID0gJ19ibGFuaydcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN1cHBvcnQgcmVndWxhciBsaW5rc1xuICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgaWYgKGEub3JpZ2luICE9PSBsb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgY29yc0VuYWJsZWQoYS5ocmVmKVxuICAgICAgICAgID8gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcbiAgICAgICAgICA6IGNsaWNrKGEsIGEudGFyZ2V0ID0gJ19ibGFuaycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGljayhhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXBwb3J0IGJsb2JzXG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpIH0sIDRFNCkgLy8gNDBzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2xpY2soYSkgfSwgMClcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgbXNTYXZlT3JPcGVuQmxvYiBhcyBhIHNlY29uZCBhcHByb2FjaFxuICA6ICdtc1NhdmVPck9wZW5CbG9iJyBpbiBuYXZpZ2F0b3JcbiAgPyBmdW5jdGlvbiBzYXZlQXMgKGJsb2IsIG5hbWUsIG9wdHMpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvcnNFbmFibGVkKGJsb2IpKSB7XG4gICAgICAgIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBibG9iXG4gICAgICAgIGEudGFyZ2V0ID0gJ19ibGFuaydcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJvbShibG9iLCBvcHRzKSwgbmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB1c2luZyBGaWxlUmVhZGVyIGFuZCBhIHBvcHVwXG4gIDogZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzLCBwb3B1cCkge1xuICAgIC8vIE9wZW4gYSBwb3B1cCBpbW1lZGlhdGVseSBkbyBnbyBhcm91bmQgcG9wdXAgYmxvY2tlclxuICAgIC8vIE1vc3RseSBvbmx5IGF2YWlsYWJsZSBvbiB1c2VyIGludGVyYWN0aW9uIGFuZCB0aGUgZmlsZVJlYWRlciBpcyBhc3luYyBzby4uLlxuICAgIHBvcHVwID0gcG9wdXAgfHwgb3BlbignJywgJ19ibGFuaycpXG4gICAgaWYgKHBvcHVwKSB7XG4gICAgICBwb3B1cC5kb2N1bWVudC50aXRsZSA9XG4gICAgICBwb3B1cC5kb2N1bWVudC5ib2R5LmlubmVyVGV4dCA9ICdkb3dubG9hZGluZy4uLidcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSByZXR1cm4gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcblxuICAgIHZhciBmb3JjZSA9IGJsb2IudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB2YXIgaXNTYWZhcmkgPSAvY29uc3RydWN0b3IvaS50ZXN0KF9nbG9iYWwuSFRNTEVsZW1lbnQpIHx8IF9nbG9iYWwuc2FmYXJpXG4gICAgdmFyIGlzQ2hyb21lSU9TID0gL0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgICBpZiAoKGlzQ2hyb21lSU9TIHx8IChmb3JjZSAmJiBpc1NhZmFyaSkgfHwgaXNNYWNPU1dlYlZpZXcpICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgYWxsb3cgZG93bmxvYWRpbmcgb2YgYmxvYiBVUkxzXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgdXJsID0gaXNDaHJvbWVJT1MgPyB1cmwgOiB1cmwucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpXG4gICAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgICBlbHNlIGxvY2F0aW9uID0gdXJsXG4gICAgICAgIHBvcHVwID0gbnVsbCAvLyByZXZlcnNlLXRhYm5hYmJpbmcgIzQ2MFxuICAgICAgfVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgaWYgKHBvcHVwKSBwb3B1cC5sb2NhdGlvbiA9IHVybFxuICAgICAgZWxzZSBsb2NhdGlvbi5ocmVmID0gdXJsXG4gICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkgfSwgNEU0KSAvLyA0MHNcbiAgICB9XG4gIH1cbilcblxuX2dsb2JhbC5zYXZlQXMgPSBzYXZlQXMuc2F2ZUFzID0gc2F2ZUFzXG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn1cbiIsICIvKipcbiAqIENyb3Bwci5qc1xuICogaHR0cHM6Ly9naXRodWIuY29tL2phbWVzc3Nvb2kvQ3JvcHByLmpzXG4gKiBcbiAqIEEgSmF2YVNjcmlwdCBpbWFnZSBjcm9wcGVyIHRoYXQncyBsaWdodHdlaWdodCwgYXdlc29tZSwgYW5kIGhhc1xuICogemVybyBkZXBlbmRlbmNpZXMuXG4gKiBcbiAqIChDKSAyMDE3IEphbWVzIE9vaS4gUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Dcm9wcHIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXN0VGltZSA9IDA7XG4gIHZhciB2ZW5kb3JzID0gWydtcycsICdtb3onLCAnd2Via2l0JywgJ28nXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG4gIH1cbiAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG4gIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICB9O1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICByZXR1cm4gZXZ0O1xuICB9XG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbihmdW5jdGlvbiAod2luZG93KSB7XG4gIHRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KCd0ZXN0Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7fVxuICBmdW5jdGlvbiBNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlIH07XG4gICAgdmFyIG1vdXNlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIG1vdXNlRXZlbnQuaW5pdE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgIHJldHVybiBtb3VzZUV2ZW50O1xuICB9XG4gIE1vdXNlRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlO1xuICB3aW5kb3cuTW91c2VFdmVudCA9IE1vdXNlRXZlbnQ7XG59KSh3aW5kb3cpO1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG52YXIgZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gIGlmIChkZXNjID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG52YXIgc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIEhhbmRsZSA9XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSGFuZGxlIGluc3RhbmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlXG4gKiAgICAgIHdpdGhpbiB0aGUgY3JvcCByZWdpb24uIEFjY2VwdHMgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMSBpbiB0aGUgb3JkZXJcbiAqICAgICAgb2YgW1gsIFldLlxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludHMgRGVmaW5lIHRoZSBzaWRlIG9mIHRoZSBjcm9wIHJlZ2lvbiB0aGF0XG4gKiAgICAgIGlzIHRvIGJlIGFmZmVjdGVkIGJ5IHRoaXMgaGFuZGxlLiBBY2NlcHRzIGEgdmFsdWUgb2YgMCBvciAxIGluIHRoZVxuICogICAgICBvcmRlciBvZiBbVE9QLCBSSUdIVCwgQk9UVE9NLCBMRUZUXS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXJzb3IgVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGV2ZW50QnVzIFRoZSBlbGVtZW50IHRvIGRpc3BhdGNoIGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gSGFuZGxlKHBvc2l0aW9uLCBjb25zdHJhaW50cywgY3Vyc29yLCBldmVudEJ1cykge1xuICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIYW5kbGUpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1oYW5kbGUnO1xuICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVzdGFydCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVtb3ZlJywge1xuICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgfSkpO1xuICB9XG59O1xuXG52YXIgQm94ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCb3ggaW5zdGFuY2UuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGZ1bmN0aW9uIEJveCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQkJDEoKSB7XG4gICAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICB2YXIgeDIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB0aGlzLngxID0geDEgPT0gbnVsbCA/IHRoaXMueDEgOiB4MTtcbiAgICAgIHRoaXMueTEgPSB5MSA9PSBudWxsID8gdGhpcy55MSA6IHkxO1xuICAgICAgdGhpcy54MiA9IHgyID09IG51bGwgPyB0aGlzLngyIDogeDI7XG4gICAgICB0aGlzLnkyID0geTIgPT0gbnVsbCA/IHRoaXMueTIgOiB5MjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYm94LlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICd3aWR0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueDIgLSB0aGlzLngxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBib3guXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2hlaWdodCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnkyIC0gdGhpcy55MSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIGJveCB0byBhIG5ldyBzaXplLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdIZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3JpZ2luXSBUaGUgb3JpZ2luIHBvaW50IHRvIHJlc2l6ZSBmcm9tLlxuICAgICAqICAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogWzAsIDBdO1xuICAgICAgdmFyIGZyb21YID0gdGhpcy54MSArIHRoaXMud2lkdGgoKSAqIG9yaWdpblswXTtcbiAgICAgIHZhciBmcm9tWSA9IHRoaXMueTEgKyB0aGlzLmhlaWdodCgpICogb3JpZ2luWzFdO1xuICAgICAgdGhpcy54MSA9IGZyb21YIC0gbmV3V2lkdGggKiBvcmlnaW5bMF07XG4gICAgICB0aGlzLnkxID0gZnJvbVkgLSBuZXdIZWlnaHQgKiBvcmlnaW5bMV07XG4gICAgICB0aGlzLngyID0gdGhpcy54MSArIG5ld1dpZHRoO1xuICAgICAgdGhpcy55MiA9IHRoaXMueTEgKyBuZXdIZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGJveCBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2FsZShmYWN0b3IpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswLCAwXTtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCgpICogZmFjdG9yO1xuICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuICAgICAgdmFyIHggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgeCA9IHggPT09IG51bGwgPyB0aGlzLngxIDogeDtcbiAgICAgIHkgPSB5ID09PSBudWxsID8gdGhpcy55MSA6IHk7XG4gICAgICB0aGlzLngxID0geDtcbiAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgdGhpcy54MiA9IHggKyB3aWR0aDtcbiAgICAgIHRoaXMueTIgPSB5ICsgaGVpZ2h0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGl2ZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3guXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9pbnQgVGhlIHggYW5kIHkgcmF0aW8gcG9zaXRpb24gd2l0aGluIHRoZSBib3guXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgeCBhbmQgeSBjb29yZGluYXRlcyBbeCwgeV0uXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZWxhdGl2ZVBvaW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb2ludCgpIHtcbiAgICAgIHZhciBwb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWzAsIDBdO1xuICAgICAgdmFyIHggPSB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQoKSAqIHBvaW50WzFdO1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFic29sdXRlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgYSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludCBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIFt4LCB5XS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2dldEFic29sdXRlUG9pbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBYnNvbHV0ZVBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbMCwgMF07XG4gICAgICB2YXIgeCA9IHRoaXMueDEgKyB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy55MSArIHRoaXMuaGVpZ2h0KCkgKiBwb2ludFsxXTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgZml4ZWQgcmF0aW8uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm93XSBUaGUgYXhpcyB0byBncm93IHRvIG1haW50YWluIHRoZSByYXRpby5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gJ2hlaWdodCcuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdjb25zdHJhaW5Ub1JhdGlvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9SYXRpbyhyYXRpbykge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzAsIDBdO1xuICAgICAgdmFyIGdyb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdoZWlnaHQnO1xuICAgICAgaWYgKHJhdGlvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgc3dpdGNoIChncm93KSB7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICAgIHRoaXMucmVzaXplKHRoaXMuaGVpZ2h0KCkgKiAxIC8gcmF0aW8sIHRoaXMuaGVpZ2h0KCksIG9yaWdpbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJhaW4gdGhlIGJveCB3aXRoaW4gYSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYm91bmRhcnlXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBib3VuZGFyeUhlaWdodFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9Cb3VuZGFyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnN0cmFpblRvQm91bmRhcnkoYm91bmRhcnlXaWR0aCwgYm91bmRhcnlIZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFswLCAwXTtcbiAgICAgIHZhciBfZ2V0QWJzb2x1dGVQb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVQb2ludChvcmlnaW4pLFxuICAgICAgICAgIF9nZXRBYnNvbHV0ZVBvaW50MiA9IHNsaWNlZFRvQXJyYXkoX2dldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfZ2V0QWJzb2x1dGVQb2ludDJbMF0sXG4gICAgICAgICAgb3JpZ2luWSA9IF9nZXRBYnNvbHV0ZVBvaW50MlsxXTtcbiAgICAgIHZhciBtYXhJZkxlZnQgPSBvcmlnaW5YO1xuICAgICAgdmFyIG1heElmVG9wID0gb3JpZ2luWTtcbiAgICAgIHZhciBtYXhJZlJpZ2h0ID0gYm91bmRhcnlXaWR0aCAtIG9yaWdpblg7XG4gICAgICB2YXIgbWF4SWZCb3R0b20gPSBib3VuZGFyeUhlaWdodCAtIG9yaWdpblk7XG4gICAgICB2YXIgZGlyZWN0aW9uWCA9IC0yICogb3JpZ2luWzBdICsgMTtcbiAgICAgIHZhciBkaXJlY3Rpb25ZID0gLTIgKiBvcmlnaW5bMV0gKyAxO1xuICAgICAgdmFyIG1heFdpZHRoID0gbnVsbCxcbiAgICAgICAgICBtYXhIZWlnaHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb25YKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbWF4V2lkdGggPSBtYXhJZkxlZnQ7YnJlYWs7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWluKG1heElmTGVmdCwgbWF4SWZSaWdodCkgKiAyO2JyZWFrO1xuICAgICAgICBjYXNlICsxOlxuICAgICAgICAgIG1heFdpZHRoID0gbWF4SWZSaWdodDticmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGlyZWN0aW9uWSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIG1heEhlaWdodCA9IG1heElmVG9wO2JyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SWZUb3AsIG1heElmQm90dG9tKSAqIDI7YnJlYWs7XG4gICAgICAgIGNhc2UgKzE6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SWZCb3R0b207YnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy53aWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgICAgdmFyIGZhY3RvciA9IG1heFdpZHRoIC8gdGhpcy53aWR0aCgpO1xuICAgICAgICB0aGlzLnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhlaWdodCgpID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBfZmFjdG9yID0gbWF4SGVpZ2h0IC8gdGhpcy5oZWlnaHQoKTtcbiAgICAgICAgdGhpcy5zY2FsZShfZmFjdG9yLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgbWF4aW11bS9taW5pbXVtIHNpemUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhXaWR0aF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heEhlaWdodF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21pbldpZHRoXVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbWluSGVpZ2h0XVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmF0aW9dIFJhdGlvIHRvIG1haW50YWluLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9TaXplJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9TaXplKCkge1xuICAgICAgdmFyIG1heFdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdmFyIG1heEhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciBtaW5XaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBtaW5IZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbMCwgMF07XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG4gICAgICBpZiAocmF0aW8pIHtcbiAgICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICAgIG1heFdpZHRoID0gbWF4SGVpZ2h0ICogMSAvIHJhdGlvO1xuICAgICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgIG1heEhlaWdodCA9IG1heFdpZHRoICogcmF0aW87XG4gICAgICAgICAgbWluV2lkdGggPSBtaW5IZWlnaHQgKiAxIC8gcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aCAmJiB0aGlzLndpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBtYXhXaWR0aCxcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHJhdGlvID09PSBudWxsID8gdGhpcy5oZWlnaHQoKSA6IG1heEhlaWdodDtcbiAgICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgdGhpcy5oZWlnaHQoKSA+IG1heEhlaWdodCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtYXhXaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aCwgX25ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaW5XaWR0aCAmJiB0aGlzLndpZHRoKCkgPCBtaW5XaWR0aCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoMiA9IG1pbldpZHRoLFxuICAgICAgICAgICAgX25ld0hlaWdodDIgPSByYXRpbyA9PT0gbnVsbCA/IHRoaXMuaGVpZ2h0KCkgOiBtaW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aDIsIF9uZXdIZWlnaHQyLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgaWYgKG1pbkhlaWdodCAmJiB0aGlzLmhlaWdodCgpIDwgbWluSGVpZ2h0KSB7XG4gICAgICAgIHZhciBfbmV3V2lkdGgzID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtaW5XaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQzID0gbWluSGVpZ2h0O1xuICAgICAgICB0aGlzLnJlc2l6ZShfbmV3V2lkdGgzLCBfbmV3SGVpZ2h0Mywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQm94O1xufSgpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGVsZW1lbnQncyB0b3VjaCBldmVudHMgdG8gYmUgc2ltdWxhdGVkIGFzIG1vdXNlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBlbmFibGVUb3VjaChlbGVtZW50KSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNpbXVsYXRlTW91c2VFdmVudCk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBzaW11bGF0ZU1vdXNlRXZlbnQpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNpbXVsYXRlTW91c2VFdmVudCk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0b3VjaCBldmVudCB0byBhIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZVxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHZhciBldmVudE1hcCA9IHtcbiAgICAndG91Y2hzdGFydCc6ICdtb3VzZWRvd24nLFxuICAgICd0b3VjaG1vdmUnOiAnbW91c2Vtb3ZlJyxcbiAgICAndG91Y2hlbmQnOiAnbW91c2V1cCdcbiAgfTtcbiAgdG91Y2gudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoZXZlbnRNYXBbZS50eXBlXSwge1xuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICB2aWV3OiB3aW5kb3csXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWVxuICB9KSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5fSBwb3NpdGlvbiAtIFRoZSB4IGFuZCB5IHJhdGlvIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgd2l0aGluXG4gKiAgICAgIHRoZSBjcm9wIHJlZ2lvbi4gQWNjZXB0cyBhIHZhbHVlIGJldHdlZW4gMCB0byAxIGluIHRoZSBvcmRlciBvZiBbWCwgWV0uXG4gKiBAcHJvcGVydHkge0FycmF5fSBjb25zdHJhaW50cyAtIERlZmluZSB0aGUgc2lkZSBvZiB0aGUgY3JvcCByZWdpb24gdGhhdCBpcyB0b1xuICogICAgICBiZSBhZmZlY3RlZCBieSB0aGlzIGhhbmRsZS4gQWNjZXB0cyBhIHZhbHVlIG9mIDAgb3IgMSBpbiB0aGUgb3JkZXIgb2ZcbiAqICAgICAgW1RPUCwgUklHSFQsIEJPVFRPTSwgTEVGVF0uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY3Vyc29yIC0gVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKi9cbnZhciBIQU5ETEVTID0gW3sgcG9zaXRpb246IFswLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMCwgMCwgMV0sIGN1cnNvcjogJ253LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMC4wXSwgY29uc3RyYWludHM6IFsxLCAwLCAwLCAwXSwgY3Vyc29yOiAnbi1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMSwgMCwgMF0sIGN1cnNvcjogJ25lLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzEuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAxLCAwLCAwXSwgY3Vyc29yOiAnZS1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMSwgMSwgMF0sIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMS4wXSwgY29uc3RyYWludHM6IFswLCAwLCAxLCAwXSwgY3Vyc29yOiAncy1yZXNpemUnIH0sIHsgcG9zaXRpb246IFswLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMCwgMSwgMV0sIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAwLCAwLCAxXSwgY3Vyc29yOiAndy1yZXNpemUnIH1dO1xudmFyIENyb3BwckNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENyb3BwckNvcmUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHJDb3JlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBDcm9wcHJDb3JlLnBhcnNlT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgICBpZiAoIWVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgdGhyb3cgJ0ltYWdlIHNyYyBub3QgcHJvdmlkZWQuJztcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXN0b3JlID0ge1xuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgfTtcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICBpZiAoZWxlbWVudC53aWR0aCA9PT0gMCB8fCBlbGVtZW50LmhlaWdodCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjcmVhdGVDbGFzcyhDcm9wcHJDb3JlLCBbe1xuICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRE9NKGVsZW1lbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnRUb1BpeGVscyh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuYXR0YWNoUmVnaW9uRXZlbnRzKCk7XG4gICAgICB0aGlzLmF0dGFjaE92ZXJsYXlFdmVudHMoKTtcbiAgICAgIHRoaXMuYm94ID0gdGhpcy5pbml0aWFsaXplQm94KHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluaXRpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjcmVhdGVET00nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVET00odGFyZ2V0RWwpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1jb250YWluZXInO1xuICAgICAgdGhpcy5ldmVudEJ1cyA9IHRoaXMuY29udGFpbmVyRWw7XG4gICAgICBlbmFibGVUb3VjaCh0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5jbGFzc05hbWUgPSAnY3JvcHByJztcbiAgICAgIHRoaXMuaW1hZ2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgdGhpcy5pbWFnZUVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKCdzcmMnKSk7XG4gICAgICB0aGlzLmltYWdlRWwuc2V0QXR0cmlidXRlKCdhbHQnLCB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpKTtcbiAgICAgIHRoaXMuaW1hZ2VFbC5jbGFzc05hbWUgPSAnY3JvcHByLWltYWdlJztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwgPSB0aGlzLmltYWdlRWwuY2xvbmVOb2RlKCk7XG4gICAgICB0aGlzLmltYWdlQ2xpcHBlZEVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaW1hZ2VDbGlwcGVkJztcbiAgICAgIHRoaXMucmVnaW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVnaW9uRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1yZWdpb24nO1xuICAgICAgdGhpcy5vdmVybGF5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMub3ZlcmxheUVsLmNsYXNzTmFtZSA9ICdjcm9wcHItb3ZlcmxheSc7XG4gICAgICB2YXIgaGFuZGxlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhhbmRsZUNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaGFuZGxlQ29udGFpbmVyJztcbiAgICAgIHRoaXMuaGFuZGxlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBIQU5ETEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKEhBTkRMRVNbaV0ucG9zaXRpb24sIEhBTkRMRVNbaV0uY29uc3RyYWludHMsIEhBTkRMRVNbaV0uY3Vyc29yLCB0aGlzLmV2ZW50QnVzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlLmVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbCk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlQ2xpcHBlZEVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMucmVnaW9uRWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5RWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlQ29udGFpbmVyRWwpO1xuICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0YXJnZXRFbC5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLmNvbnRhaW5lckVsLCB0YXJnZXRFbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB0aGlzLmltYWdlRWwub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuYm94ID0gX3RoaXMyLmluaXRpYWxpemVCb3goX3RoaXMyLm9wdGlvbnMpO1xuICAgICAgICBfdGhpczIucmVkcmF3KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZUVsLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwuc3JjID0gc3JjO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlLnBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcy5fcmVzdG9yZS5lbGVtZW50LCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJveCByZWdpb24gd2l0aCBhIHNldCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtCb3h9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdpbml0aWFsaXplQm94JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUJveChvcHRzKSB7XG4gICAgICB2YXIgd2lkdGggPSBvcHRzLnN0YXJ0U2l6ZS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBvcHRzLnN0YXJ0U2l6ZS5oZWlnaHQ7XG4gICAgICB2YXIgYm94ID0gbmV3IEJveCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJveC5jb25zdHJhaW5Ub1JhdGlvKG9wdHMuYXNwZWN0UmF0aW8sIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIG1pbiA9IG9wdHMubWluU2l6ZTtcbiAgICAgIHZhciBtYXggPSBvcHRzLm1heFNpemU7XG4gICAgICBib3guY29uc3RyYWluVG9TaXplKG1heC53aWR0aCwgbWF4LmhlaWdodCwgbWluLndpZHRoLCBtaW4uaGVpZ2h0LCBbMC41LCAwLjVdLCBvcHRzLmFzcGVjdFJhdGlvKTtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldFdpZHRoO1xuICAgICAgdmFyIHBhcmVudEhlaWdodCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodDtcbiAgICAgIGJveC5jb25zdHJhaW5Ub0JvdW5kYXJ5KHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQsIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIHggPSB0aGlzLmNyb3BwZXJFbC5vZmZzZXRXaWR0aCAvIDIgLSBib3gud2lkdGgoKSAvIDI7XG4gICAgICB2YXIgeSA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodCAvIDIgLSBib3guaGVpZ2h0KCkgLyAyO1xuICAgICAgYm94Lm1vdmUoeCwgeSk7XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlZHJhdycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJveC53aWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKSxcbiAgICAgICAgICB4MSA9IE1hdGgucm91bmQodGhpcy5ib3gueDEpLFxuICAgICAgICAgIHkxID0gTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgeDIgPSBNYXRoLnJvdW5kKHRoaXMuYm94LngyKSxcbiAgICAgICAgICB5MiA9IE1hdGgucm91bmQodGhpcy5ib3gueTIpO1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4MSArICdweCwgJyArIHkxICsgJ3B4KSc7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgX3RoaXMzLnJlZ2lvbkVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgIF90aGlzMy5pbWFnZUNsaXBwZWRFbC5zdHlsZS5jbGlwID0gJ3JlY3QoJyArIHkxICsgJ3B4LCAnICsgeDIgKyAncHgsICcgKyB5MiArICdweCwgJyArIHgxICsgJ3B4KSc7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfdGhpczMuYm94LmdldEFic29sdXRlUG9pbnQoWy41LCAuNV0pO1xuICAgICAgICB2YXIgeFNpZ24gPSBjZW50ZXJbMF0gLSBfdGhpczMuY3JvcHBlckVsLm9mZnNldFdpZHRoIC8gMiA+PiAzMTtcbiAgICAgICAgdmFyIHlTaWduID0gY2VudGVyWzFdIC0gX3RoaXMzLmNyb3BwZXJFbC5vZmZzZXRIZWlnaHQgLyAyID4+IDMxO1xuICAgICAgICB2YXIgcXVhZHJhbnQgPSAoeFNpZ24gXiB5U2lnbikgKyB5U2lnbiArIHlTaWduICsgNDtcbiAgICAgICAgdmFyIGZvcmVncm91bmRIYW5kbGVJbmRleCA9IC0yICogcXVhZHJhbnQgKyA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzMy5oYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZSA9IF90aGlzMy5oYW5kbGVzW2ldO1xuICAgICAgICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZS5lbC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlLmVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgbGVmdCA9IHgxICsgd2lkdGggKiBoYW5kbGUucG9zaXRpb25bMF0gLSBoYW5kbGVXaWR0aCAvIDI7XG4gICAgICAgICAgdmFyIHRvcCA9IHkxICsgaGVpZ2h0ICogaGFuZGxlLnBvc2l0aW9uWzFdIC0gaGFuZGxlSGVpZ2h0IC8gMjtcbiAgICAgICAgICBoYW5kbGUuZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgTWF0aC5yb3VuZChsZWZ0KSArICdweCwgJyArIE1hdGgucm91bmQodG9wKSArICdweCknO1xuICAgICAgICAgIGhhbmRsZS5lbC5zdHlsZS56SW5kZXggPSBmb3JlZ3JvdW5kSGFuZGxlSW5kZXggPT0gaSA/IDUgOiA0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hIYW5kbGVyRXZlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoSGFuZGxlckV2ZW50cygpIHtcbiAgICAgIHZhciBldmVudEJ1cyA9IHRoaXMuZXZlbnRCdXM7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVzdGFydCcsIHRoaXMub25IYW5kbGVNb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVtb3ZlJywgdGhpcy5vbkhhbmRsZU1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVlbmQnLCB0aGlzLm9uSGFuZGxlTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hSZWdpb25FdmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hSZWdpb25FdmVudHMoKSB7XG4gICAgICB2YXIgZXZlbnRCdXMgPSB0aGlzLmV2ZW50QnVzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5yZWdpb25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25zdGFydCcsIHRoaXMub25SZWdpb25Nb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25tb3ZlJywgdGhpcy5vblJlZ2lvbk1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25lbmQnLCB0aGlzLm9uUmVnaW9uTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZ2lvbnN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWdpb25tb3ZlJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBldmVudEJ1cy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVnaW9uZW5kJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXR0YWNoT3ZlcmxheUV2ZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaE92ZXJsYXlFdmVudHMoKSB7XG4gICAgICB2YXIgU09VVEhFQVNUX0hBTkRMRV9JRFggPSA0O1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRtcEJveCA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNyb3BwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1vdXNlWCA9IGUuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgICB2YXIgbW91c2VZID0gZS5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgdG1wQm94ID0gc2VsZi5ib3g7XG4gICAgICAgIHNlbGYuYm94ID0gbmV3IEJveChtb3VzZVgsIG1vdXNlWSwgbW91c2VYICsgMSwgbW91c2VZICsgMSk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZXN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYuaGFuZGxlc1tTT1VUSEVBU1RfSEFORExFX0lEWF0gfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZW1vdmUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGlmIChzZWxmLmJveC53aWR0aCgpID09PSAxICYmIHNlbGYuYm94LmhlaWdodCgpID09PSAxKSB7XG4gICAgICAgICAgc2VsZi5ib3ggPSB0bXBCb3g7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgbW91c2VYOiBlLmNsaWVudFgsIG1vdXNlWTogZS5jbGllbnRZIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlU3RhcnQoZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IGUuZGV0YWlsLmhhbmRsZTtcbiAgICAgIHZhciBvcmlnaW5Qb2ludCA9IFsxIC0gaGFuZGxlLnBvc2l0aW9uWzBdLCAxIC0gaGFuZGxlLnBvc2l0aW9uWzFdXTtcbiAgICAgIHZhciBfYm94JGdldEFic29sdXRlUG9pbnQgPSB0aGlzLmJveC5nZXRBYnNvbHV0ZVBvaW50KG9yaWdpblBvaW50KSxcbiAgICAgICAgICBfYm94JGdldEFic29sdXRlUG9pbnQyID0gc2xpY2VkVG9BcnJheShfYm94JGdldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzBdLFxuICAgICAgICAgIG9yaWdpblkgPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzFdO1xuICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgPSB7IGhhbmRsZTogaGFuZGxlLCBvcmlnaW5Qb2ludDogb3JpZ2luUG9pbnQsIG9yaWdpblg6IG9yaWdpblgsIG9yaWdpblk6IG9yaWdpblkgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcFN0YXJ0KHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25IYW5kbGVNb3ZlTW92aW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlTW92aW5nKGUpIHtcbiAgICAgIHZhciBfZSRkZXRhaWwgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbC5tb3VzZVk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICBpZiAobW91c2VYIDwgMCkge1xuICAgICAgICBtb3VzZVggPSAwO1xuICAgICAgfSBlbHNlIGlmIChtb3VzZVggPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgICAgbW91c2VYID0gY29udGFpbmVyLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1vdXNlWSA8IDApIHtcbiAgICAgICAgbW91c2VZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobW91c2VZID4gY29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICBtb3VzZVkgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblBvaW50LnNsaWNlKCk7XG4gICAgICB2YXIgb3JpZ2luWCA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblg7XG4gICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblk7XG4gICAgICB2YXIgaGFuZGxlID0gdGhpcy5hY3RpdmVIYW5kbGUuaGFuZGxlO1xuICAgICAgdmFyIFRPUF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzBdID09PSAxO1xuICAgICAgdmFyIFJJR0hUX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMV0gPT09IDE7XG4gICAgICB2YXIgQk9UVE9NX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMl0gPT09IDE7XG4gICAgICB2YXIgTEVGVF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzNdID09PSAxO1xuICAgICAgdmFyIE1VTFRJX0FYSVMgPSAoTEVGVF9NT1ZBQkxFIHx8IFJJR0hUX01PVkFCTEUpICYmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSk7XG4gICAgICB2YXIgeDEgPSBMRUZUX01PVkFCTEUgfHwgUklHSFRfTU9WQUJMRSA/IG9yaWdpblggOiB0aGlzLmJveC54MTtcbiAgICAgIHZhciB4MiA9IExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFID8gb3JpZ2luWCA6IHRoaXMuYm94LngyO1xuICAgICAgdmFyIHkxID0gVE9QX01PVkFCTEUgfHwgQk9UVE9NX01PVkFCTEUgPyBvcmlnaW5ZIDogdGhpcy5ib3gueTE7XG4gICAgICB2YXIgeTIgPSBUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSA/IG9yaWdpblkgOiB0aGlzLmJveC55MjtcbiAgICAgIHgxID0gTEVGVF9NT1ZBQkxFID8gbW91c2VYIDogeDE7XG4gICAgICB4MiA9IFJJR0hUX01PVkFCTEUgPyBtb3VzZVggOiB4MjtcbiAgICAgIHkxID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgOiB5MTtcbiAgICAgIHkyID0gQk9UVE9NX01PVkFCTEUgPyBtb3VzZVkgOiB5MjtcbiAgICAgIHZhciBpc0ZsaXBwZWRYID0gZmFsc2UsXG4gICAgICAgICAgaXNGbGlwcGVkWSA9IGZhbHNlO1xuICAgICAgaWYgKExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFKSB7XG4gICAgICAgIGlzRmxpcHBlZFggPSBMRUZUX01PVkFCTEUgPyBtb3VzZVggPiBvcmlnaW5YIDogbW91c2VYIDwgb3JpZ2luWDtcbiAgICAgIH1cbiAgICAgIGlmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSkge1xuICAgICAgICBpc0ZsaXBwZWRZID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgPiBvcmlnaW5ZIDogbW91c2VZIDwgb3JpZ2luWTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZsaXBwZWRYKSB7XG4gICAgICAgIHZhciB0bXAgPSB4MTt4MSA9IHgyO3gyID0gdG1wO1xuICAgICAgICBvcmlnaW5bMF0gPSAxIC0gb3JpZ2luWzBdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmxpcHBlZFkpIHtcbiAgICAgICAgdmFyIF90bXAgPSB5MTt5MSA9IHkyO3kyID0gX3RtcDtcbiAgICAgICAgb3JpZ2luWzFdID0gMSAtIG9yaWdpblsxXTtcbiAgICAgIH1cbiAgICAgIHZhciBib3ggPSBuZXcgQm94KHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChNVUxUSV9BWElTKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gbW91c2VZID4gYm94LnkxICsgcmF0aW8gKiBib3gud2lkdGgoKSB8fCBtb3VzZVkgPCBib3gueTIgLSByYXRpbyAqIGJveC53aWR0aCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFRPUF9NT1ZBQkxFIHx8IEJPVFRPTV9NT1ZBQkxFKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmF0aW9Nb2RlID0gaXNWZXJ0aWNhbE1vdmVtZW50ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBib3guY29uc3RyYWluVG9SYXRpbyhyYXRpbywgb3JpZ2luLCByYXRpb01vZGUpO1xuICAgICAgfVxuICAgICAgdmFyIG1pbiA9IHRoaXMub3B0aW9ucy5taW5TaXplO1xuICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICAgICAgYm94LmNvbnN0cmFpblRvU2l6ZShtYXgud2lkdGgsIG1heC5oZWlnaHQsIG1pbi53aWR0aCwgbWluLmhlaWdodCwgb3JpZ2luLCB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgYm94LmNvbnN0cmFpblRvQm91bmRhcnkocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCwgb3JpZ2luKTtcbiAgICAgIHRoaXMuYm94ID0gYm94O1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZUVuZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGFuZGxlTW92ZUVuZChlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25SZWdpb25Nb3ZlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVTdGFydChlKSB7XG4gICAgICB2YXIgX2UkZGV0YWlsMiA9IGUuZGV0YWlsLFxuICAgICAgICAgIG1vdXNlWCA9IF9lJGRldGFpbDIubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbDIubW91c2VZO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY3JvcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbW91c2VYID0gbW91c2VYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgICBtb3VzZVkgPSBtb3VzZVkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5jdXJyZW50TW92ZSA9IHtcbiAgICAgICAgb2Zmc2V0WDogbW91c2VYIC0gdGhpcy5ib3gueDEsXG4gICAgICAgIG9mZnNldFk6IG1vdXNlWSAtIHRoaXMuYm94LnkxXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVNb3ZpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVNb3ZpbmcoZSkge1xuICAgICAgdmFyIF9lJGRldGFpbDMgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwzLm1vdXNlWCxcbiAgICAgICAgICBtb3VzZVkgPSBfZSRkZXRhaWwzLm1vdXNlWTtcbiAgICAgIHZhciBfY3VycmVudE1vdmUgPSB0aGlzLmN1cnJlbnRNb3ZlLFxuICAgICAgICAgIG9mZnNldFggPSBfY3VycmVudE1vdmUub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX2N1cnJlbnRNb3ZlLm9mZnNldFk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICB0aGlzLmJveC5tb3ZlKG1vdXNlWCAtIG9mZnNldFgsIG1vdXNlWSAtIG9mZnNldFkpO1xuICAgICAgaWYgKHRoaXMuYm94LngxIDwgMCkge1xuICAgICAgICB0aGlzLmJveC5tb3ZlKDAsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm94LngyID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUoY29udGFpbmVyLndpZHRoIC0gdGhpcy5ib3gud2lkdGgoKSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTEgPCAwKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTIgPiBjb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgY29udGFpbmVyLmhlaWdodCAtIHRoaXMuYm94LmhlaWdodCgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVFbmQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVFbmQoZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIGlmIChtb2RlID09PSBudWxsKSB7XG4gICAgICAgIG1vZGUgPSB0aGlzLm9wdGlvbnMucmV0dXJuTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlID09ICdyZWFsJykge1xuICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSB0aGlzLmltYWdlRWwubmF0dXJhbFdpZHRoO1xuICAgICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gdGhpcy5pbWFnZUVsLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHZhciBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MgPSB0aGlzLmltYWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgICAgICBlbGVtZW50SGVpZ2h0ID0gX2ltYWdlRWwkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgICAgdmFyIGZhY3RvclggPSBhY3R1YWxXaWR0aCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgdmFyIGZhY3RvclkgPSBhY3R1YWxIZWlnaHQgLyBlbGVtZW50SGVpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQodGhpcy5ib3gueDEgKiBmYWN0b3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYm94LnkxICogZmFjdG9yWSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSAqIGZhY3RvclgpLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAqIGZhY3RvclkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ3JhdGlvJykge1xuICAgICAgICB2YXIgX2ltYWdlRWwkZ2V0Qm91bmRpbmdDMiA9IHRoaXMuaW1hZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIF9lbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLndpZHRoLFxuICAgICAgICAgICAgX2VsZW1lbnRIZWlnaHQgPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiByb3VuZCh0aGlzLmJveC54MSAvIF9lbGVtZW50V2lkdGgsIDMpLFxuICAgICAgICAgIHk6IHJvdW5kKHRoaXMuYm94LnkxIC8gX2VsZW1lbnRIZWlnaHQsIDMpLFxuICAgICAgICAgIHdpZHRoOiByb3VuZCh0aGlzLmJveC53aWR0aCgpIC8gX2VsZW1lbnRXaWR0aCwgMyksXG4gICAgICAgICAgaGVpZ2h0OiByb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAvIF9lbGVtZW50SGVpZ2h0LCAzKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdyYXcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZCh0aGlzLmJveC54MSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAncGFyc2VPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICAgIHZhciBkZWZhdWx0cyQkMSA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IG51bGwsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSxcbiAgICAgICAgc3RhcnRTaXplOiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB1bml0OiAnJScgfSxcbiAgICAgICAgcmV0dXJuTW9kZTogJ3JlYWwnLFxuICAgICAgICBvbkluaXRpYWxpemU6IG51bGwsXG4gICAgICAgIG9uQ3JvcFN0YXJ0OiBudWxsLFxuICAgICAgICBvbkNyb3BNb3ZlOiBudWxsLFxuICAgICAgICBvbkNyb3BFbmQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgYXNwZWN0UmF0aW8gPSBudWxsO1xuICAgICAgaWYgKG9wdHMuYXNwZWN0UmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYXNwZWN0UmF0aW8gPSBvcHRzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdHMuYXNwZWN0UmF0aW8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGFzcGVjdFJhdGlvID0gb3B0cy5hc3BlY3RSYXRpb1sxXSAvIG9wdHMuYXNwZWN0UmF0aW9bMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXhTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgbWF4U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5tYXhTaXplWzBdIHx8IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBvcHRzLm1heFNpemVbMV0gfHwgbnVsbCxcbiAgICAgICAgICB1bml0OiBvcHRzLm1heFNpemVbMl0gfHwgJ3B4J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIG1pblNpemUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMubWluU2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICBtaW5TaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBvcHRzLm1pblNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMubWluU2l6ZVsxXSB8fCBudWxsLFxuICAgICAgICAgIHVuaXQ6IG9wdHMubWluU2l6ZVsyXSB8fCAncHgnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnN0YXJ0U2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuc3RhcnRTaXplICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5zdGFydFNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMuc3RhcnRTaXplWzFdIHx8IG51bGwsXG4gICAgICAgICAgdW5pdDogb3B0cy5zdGFydFNpemVbMl0gfHwgJyUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgb25Jbml0aWFsaXplID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbkluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25Jbml0aWFsaXplID0gb3B0cy5vbkluaXRpYWxpemU7XG4gICAgICB9XG4gICAgICB2YXIgb25Dcm9wU3RhcnQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ3JvcFN0YXJ0ID0gb3B0cy5vbkNyb3BTdGFydDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BFbmQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BFbmQgPSBvcHRzLm9uQ3JvcEVuZDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BNb3ZlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nyb3Bwci5qczogYG9uVXBkYXRlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBgb25Dcm9wTW92ZWAgb3IgYG9uQ3JvcEVuZGAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25Dcm9wTW92ZSA9IG9wdHMub25VcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25Dcm9wTW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BNb3ZlID0gb3B0cy5vbkNyb3BNb3ZlO1xuICAgICAgfVxuICAgICAgdmFyIHJldHVybk1vZGUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMucmV0dXJuTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzID0gb3B0cy5yZXR1cm5Nb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChbJ3JlYWwnLCAncmF0aW8nLCAncmF3J10uaW5kZXhPZihzKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBcIkludmFsaWQgcmV0dXJuIG1vZGUuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuTW9kZSA9IHM7XG4gICAgICB9XG4gICAgICB2YXIgY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24gY29udmVydFRvUGl4ZWxzKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB2YXIgc2l6ZUtleXMgPSBbJ21heFNpemUnLCAnbWluU2l6ZScsICdzdGFydFNpemUnXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBzaXplS2V5c1tpXTtcbiAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpc1trZXldLnVuaXQgPT0gJyUnKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzW2tleV0ud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ud2lkdGggPSB0aGlzW2tleV0ud2lkdGggLyAxMDAgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpc1trZXldLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XS5oZWlnaHQgPSB0aGlzW2tleV0uaGVpZ2h0IC8gMTAwICogaGVpZ2h0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpc1trZXldLnVuaXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2LCBkKSB7XG4gICAgICAgIHJldHVybiB2ICE9PSBudWxsID8gdiA6IGQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXNwZWN0UmF0aW86IGRlZmF1bHRWYWx1ZShhc3BlY3RSYXRpbywgZGVmYXVsdHMkJDEuYXNwZWN0UmF0aW8pLFxuICAgICAgICBtYXhTaXplOiBkZWZhdWx0VmFsdWUobWF4U2l6ZSwgZGVmYXVsdHMkJDEubWF4U2l6ZSksXG4gICAgICAgIG1pblNpemU6IGRlZmF1bHRWYWx1ZShtaW5TaXplLCBkZWZhdWx0cyQkMS5taW5TaXplKSxcbiAgICAgICAgc3RhcnRTaXplOiBkZWZhdWx0VmFsdWUoc3RhcnRTaXplLCBkZWZhdWx0cyQkMS5zdGFydFNpemUpLFxuICAgICAgICByZXR1cm5Nb2RlOiBkZWZhdWx0VmFsdWUocmV0dXJuTW9kZSwgZGVmYXVsdHMkJDEucmV0dXJuTW9kZSksXG4gICAgICAgIG9uSW5pdGlhbGl6ZTogZGVmYXVsdFZhbHVlKG9uSW5pdGlhbGl6ZSwgZGVmYXVsdHMkJDEub25Jbml0aWFsaXplKSxcbiAgICAgICAgb25Dcm9wU3RhcnQ6IGRlZmF1bHRWYWx1ZShvbkNyb3BTdGFydCwgZGVmYXVsdHMkJDEub25Dcm9wU3RhcnQpLFxuICAgICAgICBvbkNyb3BNb3ZlOiBkZWZhdWx0VmFsdWUob25Dcm9wTW92ZSwgZGVmYXVsdHMkJDEub25Dcm9wTW92ZSksXG4gICAgICAgIG9uQ3JvcEVuZDogZGVmYXVsdFZhbHVlKG9uQ3JvcEVuZCwgZGVmYXVsdHMkJDEub25Dcm9wRW5kKSxcbiAgICAgICAgY29udmVydFRvUGl4ZWxzOiBjb252ZXJ0VG9QaXhlbHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDcm9wcHJDb3JlO1xufSgpO1xuZnVuY3Rpb24gcm91bmQodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscyk7XG59XG5cbnZhciBDcm9wcHIkMSA9IGZ1bmN0aW9uIChfQ3JvcHByQ29yZSkge1xuICBpbmhlcml0cyhDcm9wcHIsIF9Dcm9wcHJDb3JlKTtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBDYWxscyB0aGUgQ3JvcHByQ29yZSdzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgZnVuY3Rpb24gQ3JvcHByKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDcm9wcHIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm9wcHIpKS5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMsIF9kZWZlcnJlZCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3JvcCByZWdpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbW9kZV0gV2hpY2ggbW9kZSBvZiBjYWxjdWxhdGlvbiB0byB1c2U6ICdyZWFsJywgJ3JhdGlvJyBvclxuICAgKiAgICAgICdyYXcnLlxuICAgKi9cbiAgY3JlYXRlQ2xhc3MoQ3JvcHByLCBbe1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUobW9kZSkge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdnZXRWYWx1ZScsIHRoaXMpLmNhbGwodGhpcywgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdzZXRJbWFnZScsIHRoaXMpLmNhbGwodGhpcywgc3JjKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHJldHVybiBnZXQoQ3JvcHByLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENyb3Bwci5wcm90b3R5cGUpLCAnZGVzdHJveScsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ21vdmVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICB0aGlzLmJveC5tb3ZlKHgsIHkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wRW5kICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyb3BFbmQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcmlnaW4gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLjUsIDAuNV0gKGNlbnRlcikuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFsuNSwgLjVdO1xuICAgICAgdGhpcy5ib3gucmVzaXplKHdpZHRoLCBoZWlnaHQsIG9yaWdpbik7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjcm9wIHJlZ2lvbiBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3JpZ2luIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgICBEZWZhdWx0cyB0byBbMC41LCAwLjVdIChjZW50ZXIpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGVCeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlQnkoZmFjdG9yKSB7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbLjUsIC41XTtcbiAgICAgIHRoaXMuYm94LnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5ib3ggPSB0aGlzLmluaXRpYWxpemVCb3godGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENyb3Bwcjtcbn0oQ3JvcHByQ29yZSk7XG5cbnJldHVybiBDcm9wcHIkMTtcblxufSkpKTtcbiIsICJleHBvcnQgZW51bSBMaWNlbmNlU3RhdHVzIHtcclxuICBJbnZhbGlkLFxyXG4gIFZhbGlkLFxyXG4gIEV4cGlyZVNvb24sXHJcbiAgRXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMaWNlbmNlIHtcclxuICByZWFkb25seSBTdGF0dXM/OiBMaWNlbmNlU3RhdHVzO1xyXG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBPd25lcjogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEV4cGlyYXRpb25EYXRlOiBEYXRlIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEFwcGxpY2F0aW9uczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IFNvdXJjZUNvbnRlbnQ6IHN0cmluZztcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gTWVudUl0ZW1UeXBlIHtcclxuICBHcmlkVmlldyA9IDAsXHJcbiAgRGFzaGJvYXJkID0gMSxcclxuICBNZW51Tm9kZSA9IDIsXHJcbiAgUmVwb3J0ID0gMyxcclxuICBEaWFncmFtID0gNCxcclxuICBDRE0gPSA1LFxyXG4gIFNsaWRlc2hvdyA9IDYsXHJcbiAgR2FudHRDaGFydCA9IDdcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm90aWZ5KG1zZzogc3RyaW5nLCBzdWNjZWVkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWQgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIGNvbnN0IGRpc3BsYXlUaW1lID0gc3VjY2VlZCA/IDIwMDAgOiA0MDAwO1xyXG5cclxuICBEZXZFeHByZXNzLnVpLm5vdGlmeSh7XHJcbiAgICBtZXNzYWdlOiBtc2csXHJcbiAgICB0eXBlOiBzdGF0dXMsXHJcbiAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZS5lbGVtZW50LmZpbmQoJy5keC10b2FzdC1tZXNzYWdlJyk7XHJcbiAgICAgIG1lc3NhZ2VFbGVtZW50Lmh0bWwoKG1lc3NhZ2VFbGVtZW50Lmh0bWwoKSB8fCAnJykucmVwbGFjZSgnXFxcXG4nLCAnPGJyIC8+JykpO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvYXN0T3B0aW9ucywgc3RhdHVzLCBkaXNwbGF5VGltZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBjb25zdCBpc0Vycm9ySW5mbyA9IChcclxuICByZXNwb25zZURhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBJRXJyb3JJbmZvIHwgSUVycm9ySW5mb1tdIHwgdW5kZWZpbmVkIHwgbnVsbFxyXG4pOiByZXNwb25zZURhdGEgaXMgSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSA9PiB7XHJcbiAgaWYgKCFyZXNwb25zZURhdGEpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YSlcclxuICAgID8gKHJlc3BvbnNlRGF0YVswXS5TdGFja1RyYWNlICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VEYXRhWzBdLkVycm9yICE9PSB1bmRlZmluZWQpXHJcbiAgICA6IChyZXNwb25zZURhdGEuRXJyb3IgIT09IHVuZGVmaW5lZCk7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFcnJvckluZm8ge1xyXG4gIEVycm9yOiBzdHJpbmc7XHJcbiAgU3RhY2tUcmFjZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBcGlSZXNwb25zZTxUPiB7XHJcbiAgRGF0YTogVCB8IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10gfCB1bmRlZmluZWQ7XHJcbiAgTWVzc2FnZTogc3RyaW5nO1xyXG4gIFJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG4gIFN0YXR1c0NvZGU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTG9va3VwRHRvPFQ+IHtcclxuICBWYWx1ZTogVDtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIFJlcXVlc3RTdGF0ZSB7XHJcbiAgQ29tcGxldGVkID0gMSxcclxuICBFcnJvcmVkID0gMlxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuY29uc3QgUE9QVVBfQ09OVEVOVF9DTEFTUyA9ICdwb3B1cC1jb250ZW50JztcclxuY29uc3QgUE9QVVBfRk9PVEVSX0NMQVNTID0gJ3BvcHVwLWZvb3Rlcic7XHJcbmNvbnN0IEJVVFRPTlNfQ0xBU1MgPSAnYnV0dG9ucyc7XHJcbmNvbnN0IE9LX0JUTl9DTEFTUyA9ICdvay1idG4nO1xyXG5jb25zdCBDQU5DRUxfQlROX0NMQVNTID0gJ2NhbmNlbC1idG4nO1xyXG5cclxuaW50ZXJmYWNlIElQb3B1cCB7XHJcbiAgc2hvdzogKCkgPT4gdm9pZDtcclxuICBoaWRlOiAoKSA9PiB2b2lkO1xyXG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUG9wdXBCdXR0b25PcHRpb25zIHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbj86IHN0cmluZztcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgb25DbGljazogKGNsb3NlUG9wdXApID0+IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxheW91dCgkY29udGFpbmVyLCBjb250ZW50Q2xhc3NOYW1lPykge1xyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0NPTlRFTlRfQ0xBU1MpLmFkZENsYXNzKGNvbnRlbnRDbGFzc05hbWUpLmFwcGVuZFRvKCRjb250YWluZXIpLFxyXG4gICAgJGZvb3RlcjogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0ZPT1RFUl9DTEFTUykuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBzaG93blBvcHVwcyA9IFtdO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlUG9wdXAoJGVsOiBKUXVlcnksIGR4UG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcywgdXNlS2V5UHJlc3NCZWhhdmlvcjogYm9vbGVhbiA9IGZhbHNlKTogSVBvcHVwIHtcclxuICBjb25zdCBzYXZlZE9uU2hvd2luZyA9IGR4UG9wdXBPcHRpb25zLm9uU2hvd2luZztcclxuXHJcbiAgZHhQb3B1cE9wdGlvbnMub25TaG93biA9IChlKSA9PiB7XHJcbiAgICBpZiAoc2F2ZWRPblNob3dpbmcpIHtcclxuICAgICAgc2F2ZWRPblNob3dpbmcoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsSW5wdXRzID0gcG9wdXAuY29udGVudCgpLmZpbmQoJ2lucHV0W3R5cGU9dGV4dF0nKTtcclxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBhbGxJbnB1dHMuZXEoMCk7XHJcblxyXG4gICAgZmlyc3RJbnB1dC5mb2N1cygpO1xyXG5cclxuICAgIGNvbnN0IGtleUhhbmRsZXJzID0ge1xyXG4gICAgICBrZXlkb3duOiAoZXY6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzaG93blBvcHVwc1tzaG93blBvcHVwcy5sZW5ndGggLSAxXSAhPT0gcG9wdXApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICAgICAgJChldi5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uS2V5RG93bihldik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVzZUtleVByZXNzQmVoYXZpb3IpIHtcclxuICAgICAgYWxsSW5wdXRzLm9uKGtleUhhbmRsZXJzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpcnN0SW5wdXQub24oa2V5SGFuZGxlcnMpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICBwb3B1cC5jb250ZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTRVMuZHhCdXR0b259LiR7T0tfQlROX0NMQVNTfWApLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcclxuICAgICAgcG9wdXAuY29udGVudCgpLmZpbmQoYC4ke0NTU19DTEFTU0VTLmR4QnV0dG9ufS4ke0NBTkNFTF9CVE5fQ0xBU1N9YCkuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHBvcHVwID0gJGVsXHJcbiAgICAuZHhQb3B1cChkeFBvcHVwT3B0aW9ucylcclxuICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2hvdzogKCkgPT4ge1xyXG4gICAgICBwb3B1cC5zaG93KCk7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKHsga2V5ZG93bjogb25LZXlEb3duIH0pO1xyXG4gICAgICBzaG93blBvcHVwcy5wdXNoKHBvcHVwKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9mZih7IGtleWRvd246IG9uS2V5RG93biB9KTtcclxuICAgICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgICBzaG93blBvcHVwcy5wb3AoKTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6ICgpID0+ICRlbC5yZW1vdmUoKVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdXR0b25zKFxyXG4gIG9rT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuKSB7XHJcbiAgY29uc3QgJHRhYmxlID0gJCgnPHRhYmxlIC8+JykuYWRkQ2xhc3MoQlVUVE9OU19DTEFTUyk7XHJcbiAgY29uc3QgJHRyID0gJCgnPHRyPicpLmFwcGVuZFRvKCR0YWJsZSk7XHJcblxyXG4gIGlmIChva09wdGlvbnMpIHtcclxuICAgICQoJzx0ZCAvPicpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsICc1MCUnKVxyXG4gICAgICAuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keEJ1dHRvbikuYWRkQ2xhc3MoT0tfQlROX0NMQVNTKS5keEJ1dHRvbihva09wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIGlmIChjYW5jZWxPcHRpb25zKSB7XHJcbiAgICAkKCc8dGQgLz4nKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnNTAlJylcclxuICAgICAgLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhCdXR0b24pLmFkZENsYXNzKENBTkNFTF9CVE5fQ0xBU1MpLmR4QnV0dG9uKGNhbmNlbE9wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkdGFibGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtKGxhYmVsOiBzdHJpbmcsICR2YWx1ZTogSlF1ZXJ5KSB7XHJcbiAgcmV0dXJuICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbScpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2Zvcm0tbGFiZWwnKS50ZXh0KGxhYmVsKSxcclxuICAgICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCd2YWx1ZScpLmFwcGVuZCgkdmFsdWUpXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cE9wdGlvbnMge1xyXG4gIHVzZUtleVByZXNzQmVoYXZpb3I6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWFsb2coXHJcbiAgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMsXHJcbiAgJHBvcHVwQ29udGVudDogSlF1ZXJ5LFxyXG4gIG9rQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgYWRkaXRpb25hbE9wdGlvbnM/OiBJUG9wdXBPcHRpb25zXHJcbikge1xyXG4gIGNvbnN0ICRlbCA9ICQoJzxkaXY+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICBsZXQgJGJ1dHRvbnM6IEpRdWVyeSA9IG51bGw7XHJcblxyXG4gIGxldCBwb3B1cDogSVBvcHVwID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdXNlS2V5UHJlc3NCZWhhdmlvciA9IGFkZGl0aW9uYWxPcHRpb25zID8gYWRkaXRpb25hbE9wdGlvbnMudXNlS2V5UHJlc3NCZWhhdmlvciA6IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBjbG9zZVBvcHVwKCkge1xyXG4gICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgcG9wdXAucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkeFBvcHVwT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMgPSB7XHJcbiAgICBjb250ZW50VGVtcGxhdGU6ICgkcG9wdXBDb250YWluZXIpID0+IHtcclxuICAgICAgY29uc3QgeyAkY29udGVudCwgJGZvb3RlciB9ID0gY3JlYXRlTGF5b3V0KCRwb3B1cENvbnRhaW5lcik7XHJcblxyXG4gICAgICAkY29udGVudC5hcHBlbmQoJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgICBpZiAob2tCdG5PcHRpb25zICYmIGNhbmNlbEJ0bk9wdGlvbnMpIHtcclxuICAgICAgICAkYnV0dG9ucyA9IGNyZWF0ZUJ1dHRvbnMoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IG9rQnRuT3B0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICBpY29uOiBva0J0bk9wdGlvbnMuaWNvbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9rQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gb2tCdG5PcHRpb25zLm9uQ2xpY2soY2xvc2VQb3B1cClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IGNhbmNlbEJ0bk9wdGlvbnMudGV4dCxcclxuICAgICAgICAgICAgaWNvbjogY2FuY2VsQnRuT3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogY2FuY2VsQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgb25DbGljazogKGUpID0+IGNhbmNlbEJ0bk9wdGlvbnMub25DbGljayhjbG9zZVBvcHVwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICRmb290ZXIuYXBwZW5kKCRidXR0b25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkZm9vdGVyLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdpc3pvbGVhLWR4LXBvcHVwJyB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcyA9IHt9O1xyXG5cclxuICAkLmV4dGVuZCh0cnVlLCBwb3B1cE9wdGlvbnMsIG9wdGlvbnMsIGR4UG9wdXBPcHRpb25zKTtcclxuXHJcbiAgcG9wdXAgPSBjcmVhdGVQb3B1cCgkZWwsIHBvcHVwT3B0aW9ucywgdXNlS2V5UHJlc3NCZWhhdmlvcik7XHJcblxyXG4gIHBvcHVwLnNob3coKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXRlbXBsYXRlXHJcbiAgICBva0J0bjogJGJ1dHRvbnMgPyAkYnV0dG9ucy5maW5kKGAuJHsgIE9LX0JUTl9DTEFTU31gKS5keEJ1dHRvbignaW5zdGFuY2UnKSA6IG51bGwsXHJcbiAgICBjbG9zZTogKCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IENTU19DTEFTU0VTID0ge1xyXG4gIGR4RGF0YUdyaWQ6ICdpc3pvbGVhLWR4LWRhdGFncmlkJyxcclxuICBkeEJ1dHRvbjogJ2lzem9sZWEtZHgtYnV0dG9uJyxcclxuICBkeFBvcHVwOiAnaXN6b2xlYS1keC1wb3B1cCdcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4vUG9wdXAnO1xyXG5pbXBvcnQgeyBJRXJyb3JJbmZvIH0gZnJvbSAnLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG5jb25zdCBNQUlOX0VMRU1FTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cCc7XHJcbmNvbnN0IFBPUFVQX0NPTlRFTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fY29udGVudCc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX01FU1NBR0VfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItbWVzc2FnZSc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX0RFVEFJTFNfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItZGV0YWlscyc7XHJcblxyXG5jb25zdCBTSE9XX0RFVEFJTFNfVEVYVCA9ICdTaG93IGRldGFpbHMnO1xyXG5jb25zdCBISURFX0RFVEFJTFNfVEVYVCA9ICdIaWRlIGRldGFpbHMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9ySW5mb1BvcHVwKHRpdGxlTWVzc2FnZTogc3RyaW5nLCBlcnJvckluZm86IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10pOiB2b2lkIHtcclxuICBsZXQgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBjb25zdCBpbmZvQXJyYXkgPSBBcnJheS5pc0FycmF5KGVycm9ySW5mbykgPyBlcnJvckluZm8gOiBbZXJyb3JJbmZvXTtcclxuXHJcbiAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcyhQT1BVUF9DT05URU5UX0NMQVNTKTtcclxuXHJcbiAgaW5mb0FycmF5LmZvckVhY2goKGksIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCAkZXJyb3JNZXNzYWdlRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUykudGV4dChpLkVycm9yKTtcclxuICAgIGNvbnN0ICRlcnJvckRldGFpbHNFbGVtZW50ID0gJCgnPHAgLz4nKS5hZGRDbGFzcyhFUlJPUl9QT1BVUF9ERVRBSUxTX0NMQVNTKS50ZXh0KGkuU3RhY2tUcmFjZSk7XHJcbiAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkZXJyb3JNZXNzYWdlRWxlbWVudCwgJGVycm9yRGV0YWlsc0VsZW1lbnQpLmhpZGUoKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPCBpbmZvQXJyYXkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkKCc8aHIgLz4nKSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBvcHVwSW5mbyA9IGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6IHRpdGxlTWVzc2FnZSxcclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgIGFuaW1hdGlvbjoge1xyXG4gICAgICAgIHNob3c6IHsgZGlyZWN0aW9uOiAnYm90dG9tJywgdHlwZTogJ3NsaWRlSW4nIH0sXHJcbiAgICAgICAgaGlkZTogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVPdXQnIH1cclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdib3R0b20nLCBhdDogJ2JvdHRvbScsIG9mZnNldDogeyB5OiAtNTAgfSB9LFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHBvcHVwID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgZS5lbGVtZW50LmFkZENsYXNzKE1BSU5fRUxFTUVOVF9DTEFTUyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAkcG9wdXBDb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBTSE9XX0RFVEFJTFNfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlzRnVsbFNjcmVlblJlcXVpcmVkOiBib29sZWFuID0gIXBvcHVwLm9wdGlvbignZnVsbFNjcmVlbicpO1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW4oaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgICAgIHBvcHVwSW5mby5va0J0bi5vcHRpb24oJ3RleHQnLCBpc0Z1bGxTY3JlZW5SZXF1aXJlZCA/IEhJREVfREVUQUlMU19URVhUIDogU0hPV19ERVRBSUxTX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2xvc2UnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3QgdG9nZ2xlRnVsbFNjcmVlbiA9IChpc0Z1bGxTY3JlZW5SZXF1aXJlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgJHBvcHVwQ29udGVudC50b2dnbGUoaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAub3B0aW9uKCdmdWxsU2NyZWVuJywgaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAucmVwYWludCgpO1xyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIEV4Y2VwdGlvblR5cGUge1xyXG4gIFVuZXhwZWN0ZWRFeGNlcHRpb24gPSAwLFxyXG4gIFNxbEV4Y2VwdGlvbiA9IDEsXHJcbiAgSXN6b2xlYUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gPSAyXHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLic7XHJcblxyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLklzem9sZWFDb25maWd1cmF0aW9uRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1NvbWV0aGluZyB3cm9uZyB3aXRoIGlzem9sZWEgY29uZmlndXJhdGlvbi4gQ2hlY2sgQ2xpZW50SWQvQ2xpZW50U2VjcmV0IGZpZWxkcyBpbiB0aGUgYXBwc2V0dGluZ3MuanNvbiBmaWxlLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCBub3RpZnkgZnJvbSAnLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBJQXBpUmVzcG9uc2UsIGlzRXJyb3JJbmZvIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuaW1wb3J0IHsgY3JlYXRlRXJyb3JJbmZvUG9wdXAgfSBmcm9tICcuLi9XaWRnZXRzL0Vycm9ySW5mb1BvcHVwJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4vRXhjZXB0aW9uVHlwZSc7XHJcbmltcG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9VdGlscy9HZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlJztcclxuXHJcbmNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY29udGFjdCB0byBkZXZlbG9wZXJzLic7XHJcbmNvbnN0IE5PVF9FU1NFTlRJQUxfU1RBVFVTRVMgPSBbNTA0XTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlID0gKCkgPT4gREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MocmVzOiBJQXBpUmVzcG9uc2U8YW55Piwgbm90aWZ5U3VjY2VzcyA9IGZhbHNlKSB7XHJcbiAgaWYgKG5vdGlmeVN1Y2Nlc3MpIHtcclxuICAgIG5vdGlmeShyZXMuTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLkRhdGEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3I8VD4oXHJcbiAgcmVzOiBJQXBpUmVzcG9uc2U8VD4sXHJcbiAgbm90aWZ5RXJyb3I6IGJvb2xlYW4sXHJcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZ1xyXG4pOiB7IG1lc3NhZ2U6IHN0cmluZyB9IHtcclxuICBjb25zdCBtZXNzYWdlID0gcmVzLk1lc3NhZ2U7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHsgbWVzc2FnZSB9O1xyXG5cclxuICBsZXQgbWVzc2FnZVRvU2hvdztcclxuICBjb25zdCBleGNlcHRpb25UeXBlID0gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2UpO1xyXG4gIGlmIChleGNlcHRpb25UeXBlICE9PSBudWxsKSB7XHJcbiAgICBjb25zdCBjdXN0b21FcnJvck1lc3NhZ2UgPSBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPyBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UoZXhjZXB0aW9uVHlwZSkgOiAnJztcclxuICAgIG1lc3NhZ2VUb1Nob3cgPSBjdXN0b21FcnJvck1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtZXNzYWdlVG9TaG93ID0gbWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0U7XHJcbiAgfVxyXG5cclxuICBpZiAobm90aWZ5RXJyb3IpIHtcclxuICAgIGNvbnN0IGVycm9ySW5mbyA9IHJlcy5EYXRhO1xyXG4gICAgaWYgKGlzRXJyb3JJbmZvKGVycm9ySW5mbykpIHtcclxuICAgICAgY29uc3QgaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIGVycm9ySW5mby5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGlzRXJyb3JJbmZvSGFzRGF0YSA9ICFBcnJheS5pc0FycmF5KGVycm9ySW5mbykgJiYgKGVycm9ySW5mby5TdGFja1RyYWNlIHx8IGVycm9ySW5mby5FcnJvcik7XHJcblxyXG4gICAgICBpZiAoaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5IHx8IGlzRXJyb3JJbmZvSGFzRGF0YSkge1xyXG4gICAgICAgIGNyZWF0ZUVycm9ySW5mb1BvcHVwKG1lc3NhZ2VUb1Nob3csIGVycm9ySW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3RpZnkobWVzc2FnZVRvU2hvdywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2U6IHN0cmluZyk6IEV4Y2VwdGlvblR5cGUgfCBudWxsIHtcclxuICByZXR1cm4gKCFpc05hTihtZXNzYWdlIGFzIGFueSkpICYmIEV4Y2VwdGlvblR5cGVbK21lc3NhZ2VdID8gK21lc3NhZ2UgOiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlVXBsb2FkKGU6IHsgcmVxdWVzdDogeyByZXNwb25zZTogc3RyaW5nOyB9IH0pIHtcclxuICBjb25zdCByZXNwb25zZTogSUFwaVJlc3BvbnNlPGFueT4gPSBlLnJlcXVlc3QucmVzcG9uc2UgPyBKU09OLnBhcnNlKGUucmVxdWVzdC5yZXNwb25zZSkgOiB7fTtcclxuXHJcbiAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXNwb25zZSwgdHJ1ZSk7XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVNlbmRSZXF1ZXN0U2V0dGluZ3MgPSBKUXVlcnlBamF4U2V0dGluZ3MgJiB7XHJcbiAgbm90aWZ5RXJyb3I/OiBib29sZWFuO1xyXG4gIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZT86IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKSA9PiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VuZFJlcXVlc3Q8VCA9IGFueT4oXHJcbiAgdXJsOiBzdHJpbmcsXHJcbiAgdHlwZTogc3RyaW5nID0gJ0dFVCcsXHJcbiAgZGF0YSA9IG51bGwsXHJcbiAgbm90aWZ5U3VjY2Vzcz86IGJvb2xlYW4sXHJcbiAgc2V0dGluZ3M/OiBJU2VuZFJlcXVlc3RTZXR0aW5ncyxcclxuKTogSlF1ZXJ5LkRlZmVycmVkPFQ+IHtcclxuICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgY29uc3Qgbm90aWZ5RXJyb3IgPSBzZXR0aW5ncz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBzZXR0aW5ncy5ub3RpZnlFcnJvcjtcclxuXHJcbiAgY29uc3QgbWFuZGF0b3J5T3B0aW9ucyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBhamF4U2V0dGluZ3MgPSAkLmV4dGVuZCh7IHR5cGUsIHVybCwgZGF0YSB9LCBzZXR0aW5ncywgbWFuZGF0b3J5T3B0aW9ucyk7XHJcblxyXG4gICQuYWpheChhamF4U2V0dGluZ3MpXHJcbiAgICAuZG9uZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8YW55PiA9IHJlcztcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlLCBub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLkRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlRXJyb3IocmVzcG9uc2UsIG5vdGlmeUVycm9yLCBzZXR0aW5ncz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlIHx8IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgfSlcclxuICAgIC5mYWlsKChqcVhIUiwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAoIU5PVF9FU1NFTlRJQUxfU1RBVFVTRVMuaW5jbHVkZXMoanFYSFIuc3RhdHVzKSAmJiBub3RpZnlFcnJvcikge1xyXG4gICAgICAgIG5vdGlmeShnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCksIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KHRleHRTdGF0dXMpO1xyXG4gICAgfSk7XHJcblxyXG4gIHJldHVybiBkZWZlcnJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCB0eXBlIElEeERhdGFTb3VyY2VPcHRpb25zID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5PcHRpb25zICYge1xyXG4gIG5vdGlmeVN1Y2Nlc3M/OiBib29sZWFuO1xyXG4gIG5vdGlmeUVycm9yPzogYm9vbGVhbjtcclxuICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2U/OiAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4gc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUR4RGF0YVNvdXJjZShvcHRpb25zOiBJRHhEYXRhU291cmNlT3B0aW9ucykge1xyXG4gIGNvbnN0IHN0b3JlID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5jcmVhdGVTdG9yZSh7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgb25CZWZvcmVTZW5kOiAoanFYaHIsIHNldHRpbmdzKSA9PiB7XHJcbiAgICAgIGlmIChvcHRpb25zLm9uQmVmb3JlU2VuZCkge1xyXG4gICAgICAgIG9wdGlvbnMub25CZWZvcmVTZW5kKGpxWGhyLCBzZXR0aW5ncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5vdGlmeUVycm9yID0gb3B0aW9ucz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9yO1xyXG5cclxuICAgICAgc2V0dGluZ3MuZGF0YUZpbHRlciA9IChyYXdSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHJhd1Jlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcy5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVTdWNjZXNzKHJlcywgb3B0aW9ucy5ub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHNldHRpbmdzLmVycm9yID0gKHhocjogSlF1ZXJ5WEhSKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBJQXBpUmVzcG9uc2U8YW55PiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCB8fCAne30nKTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogZm9yIHVuaGFuZGxlZCBlcnJvcnMgb24gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghcmVzLlJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgaGFuZGxlRXJyb3IocmVzLCBub3RpZnlFcnJvciwgb3B0aW9ucz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdG9yZSBhcyBhbnkpLl9lcnJvckhhbmRsZXIgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgaWYgKGVycm9yICYmICFlcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHN0b3JlO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XHJcblxyXG5jb25zdCBsb2FkUHJvbWlzZXM6IHsgW3VybDogc3RyaW5nXTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB9ID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxUPih1cmw6IHN0cmluZykge1xyXG4gIGlmIChsb2FkUHJvbWlzZXNbdXJsXSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByb21pc2VzW3VybF0gPSBzZW5kUmVxdWVzdDxUPih1cmwpO1xyXG4gIGxvYWRQcm9taXNlc1t1cmxdLmNhdGNoKChlcnIpID0+IHtcclxuICAgIGxvYWRQcm9taXNlc1t1cmxdID0gbnVsbDtcclxuXHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogVCA9IGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG5cclxuICBsb2FkUHJvbWlzZXNbdXJsXSA9IG51bGw7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0LCBoYW5kbGVFcnJvciwgaGFuZGxlU3VjY2VzcywgaGFuZGxlVXBsb2FkIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgKiBhcyBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbi8vIFRPRE86IGV4cG9ydCB0eXBlXHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUVycm9ySW5mbyB9IGZyb20gJy4vQXBpUmVzcG9uc2UnO1xyXG5leHBvcnQgeyBJRHhEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcclxuZXhwb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4vSUxvZ29TZXR0aW5ncyc7XHJcbmV4cG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBzZW5kUmVxdWVzdCxcclxuICBoYW5kbGVFcnJvcixcclxuICBoYW5kbGVTdWNjZXNzLFxyXG4gIGhhbmRsZVVwbG9hZCxcclxuICBjcmVhdGVEeERhdGFTb3VyY2UsXHJcbiAgaXNFcnJvckluZm8sXHJcbiAgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb25cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlcmVkIHtcclxuICByZW5kZXIoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGVzdHJveWFibGUge1xyXG4gIGRlc3Ryb3koKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGVzdHJveWFibGUgPSAob2JqOiBhbnkpOiBvYmogaXMgSURlc3Ryb3lhYmxlID0+IHtcclxuICByZXR1cm4gdHlwZW9mIG9iai5kZXN0cm95ID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHRocm93UmVuZGVyRXJyb3IgPSAoZWxlbWVudE5hbWU/OiBzdHJpbmcpOiBuZXZlciA9PiB7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItdGVtcGxhdGVcclxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1aXJlZCAke2VsZW1lbnROYW1lID8gKGAke2VsZW1lbnROYW1lICB9IGApIDogJyd9IGlzbid0IGNyZWF0ZWRgKTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBSZWFkb25seTxUPiA9IHtcclxuICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IFJlYWRvbmx5QXJyYXk8RGVlcFJlYWRvbmx5PFUxPj4gOiAoXHJcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gUmVhZG9ubHlNYXA8SywgRGVlcFJlYWRvbmx5PFUyPj4gOiAoXHJcbiAgICAgICAgVFtQXSBleHRlbmRzIFNldDxpbmZlciBVMz4gPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZWFkb25seTxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXT86IChcclxuICAgIFRbUF0gZXh0ZW5kcyBBcnJheTxpbmZlciBVMT4gPyBBcnJheTxEZWVwUGFydGlhbDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUGFydGlhbDxVMj4+IDogKFxyXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBQYXJ0aWFsPFUzPj4gOiAoXHJcbiAgICAgICAgICBUW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW1BdIDogKFxyXG4gICAgICAgICAgICBEZWVwUGFydGlhbDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUmVxdWlyZWQ8VD4gPSB7XHJcbiAgW1AgaW4ga2V5b2YgVF0tPzogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IEFycmF5PERlZXBSZXF1aXJlZDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUmVxdWlyZWQ8VTI+PiA6IChcclxuICAgICAgICBUW1BdIGV4dGVuZHMgU2V0PGluZmVyIFUzPiA/IFNldDxEZWVwUmVxdWlyZWQ8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZXF1aXJlZDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uL0hlYWRlci9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCBEZWVwUmVhZG9ubHk8SU5hdmlnYXRpb25NZW51SXRlbU1vZGVsPikge1xyXG4gIGNvbnN0IHsgQXJlYSwgQ29udHJvbGxlciwgQWN0aW9uLCBJc0NsaWNrYWJsZSB9ID0gaXRlbURhdGE7XHJcblxyXG4gIGlmIChJc0NsaWNrYWJsZSAmJiBDb250cm9sbGVyKSB7XHJcbiAgICByZXR1cm4gQXJlYSA/IGVuY29kZVVSSShgLyR7QXJlYX0vJHtDb250cm9sbGVyfS8ke0FjdGlvbn1gKSA6IGVuY29kZVVSSShgLyR7Q29udHJvbGxlcn0vJHtBY3Rpb259YCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgeyBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuZXhwb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuIiwgImltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRCcmVha3BvaW50IHtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbWluV2lkdGg6IG51bWJlcjtcclxuICByZWFkb25seSBtYXhXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB7XHJcbiAgcmVhZG9ubHkgcHJldmlvdXNCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICByZWFkb25seSBjdXJyZW50QnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzID0ge1xyXG4gIHhzOiB7XHJcbiAgICBuYW1lOiAneHMnLFxyXG4gICAgbWluV2lkdGg6IDAsXHJcbiAgICBtYXhXaWR0aDogNTc1XHJcbiAgfSxcclxuICBzbToge1xyXG4gICAgbmFtZTogJ3NtJyxcclxuICAgIG1pbldpZHRoOiA1NzYsXHJcbiAgICBtYXhXaWR0aDogNzY3XHJcbiAgfSxcclxuICBtZDoge1xyXG4gICAgbmFtZTogJ21kJyxcclxuICAgIG1pbldpZHRoOiA3NjgsXHJcbiAgICBtYXhXaWR0aDogOTkxXHJcbiAgfSxcclxuICBsZzoge1xyXG4gICAgbmFtZTogJ2xnJyxcclxuICAgIG1pbldpZHRoOiA5OTIsXHJcbiAgICBtYXhXaWR0aDogMTE5OVxyXG4gIH0sXHJcbiAgeGw6IHtcclxuICAgIG5hbWU6ICd4bCcsXHJcbiAgICBtaW5XaWR0aDogMTIwMCxcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eVxyXG4gIH1cclxufSBhcyBjb25zdDtcclxuXHJcbmNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzTGlzdDogcmVhZG9ubHkgSUxheW91dEJyZWFrcG9pbnRbXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzKVxyXG4gIC5tYXAoKGJyZWFrcG9pbnROYW1lKSA9PiBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c1ticmVha3BvaW50TmFtZV0pO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyIGltcGxlbWVudHMgSURlc3Ryb3lhYmxlIHtcclxuICBwdWJsaWMgY3VycmVudExheW91dEJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25XaW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNpemVEZWxheTogbnVtYmVyO1xyXG4gIC8vIFRPRE86IHVzZSBtdWx0aXBsZSBldmVudCBsaXN0ZW5lclxyXG4gIHByb3RlY3RlZCByZWFkb25seSBvblJlc2l6ZTogKChlOiBVSUV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZDogKChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgbGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIG9uUmVzaXplPzogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgICBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkPzogKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpID0+IHZvaWQsXHJcbiAgICByZXNpemVEZWxheSA9IDEwMCxcclxuICAgIGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdID0gYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHNMaXN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uUmVzaXplID0gb25SZXNpemU7XHJcbiAgICB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQgPSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkO1xyXG4gICAgdGhpcy5yZXNpemVEZWxheSA9IHJlc2l6ZURlbGF5O1xyXG4gICAgdGhpcy5sYXlvdXRCcmVha3BvaW50cyA9IGxheW91dEJyZWFrcG9pbnRzO1xyXG5cclxuICAgIHRoaXMuY3VycmVudExheW91dEJyZWFrcG9pbnQgPSB0aGlzLmdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGV0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGV0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TGF5b3V0QnJlYWtwb2ludEJ5V2luZG93V2lkdGgod2luZG93V2lkdGg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0QnJlYWtwb2ludHMuZmluZCgobGF5b3V0QnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICByZXR1cm4gbGF5b3V0QnJlYWtwb2ludC5taW5XaWR0aCA8PSB3aW5kb3dXaWR0aCAmJiAoIWxheW91dEJyZWFrcG9pbnQubWF4V2lkdGggfHwgbGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB3aW5kb3dXaWR0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZShlOiBVSUV2ZW50KSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0V2luZG93UmVzaXplVGltZW91dElkKTtcclxuICAgIHRoaXMubGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMub25XaW5kb3dSZXNpemVJbnRlcm5hbChlKSwgdGhpcy5yZXNpemVEZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemVJbnRlcm5hbChlOiBVSUV2ZW50KSB7XHJcbiAgICBjb25zdCBsYXlvdXRCcmVha3BvaW50ID0gdGhpcy5nZXRMYXlvdXRCcmVha3BvaW50QnlXaW5kb3dXaWR0aCh3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCAhPT0gbGF5b3V0QnJlYWtwb2ludCkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQgPSB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50O1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50ID0gbGF5b3V0QnJlYWtwb2ludDtcclxuXHJcbiAgICAgIHRoaXMuZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKHtcclxuICAgICAgICBwcmV2aW91c0JyZWFrcG9pbnQ6IHByZXZpb3VzTGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBjdXJyZW50QnJlYWtwb2ludDogdGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFJlc2l6ZUV2ZW50KGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRSZXNpemVFdmVudChlOiBVSUV2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZD8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnIHtcclxuICBpc0xlZ2FjeVJlbmRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb25maWc6IElDb25maWcgPSB7XHJcbiAgaXNMZWdhY3lSZW5kZXI6IGZhbHNlXHJcbn07XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwsIElCYWRnZU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBpbnRlcmZhY2UtbmFtZVxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQge1xyXG4gIHJlYWRvbmx5IGl0ZW06IERlZXBSZWFkb25seTxJVXNlck1lbnVJdGVtTW9kZWw+O1xyXG4gIHJlYWRvbmx5IG9yaWdpbmFsRXZlbnQ6IFVJRXZlbnQ7XHJcbiAgY2FuY2VsPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlck1lbnVPcHRpb25zIHtcclxuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBnZXREaXNwbGF5ZWRVc2VySW5mbz86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgb25JdGVtQ2xpY2s/OiAoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbzogKHVzZXJOYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICh1c2VyTmFtZSkgPT4gYFdlbGNvbWUgJHt1c2VyTmFtZX1gO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5vbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZW1DbGljazogKChlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICAvLyBFbGVtZW50c1xyXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9iaWxlQ29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkZXNrdG9wUm9vdERyb3Bkb3duOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50VHJpZ2dlcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0RpdmlkZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJvb3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XHJcbiAgICB0aGlzLnVzZXJBdmF0YXIgPSBvcHRpb25zLnVzZXJBdmF0YXI7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuICAgIHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8gPSBvcHRpb25zLmdldERpc3BsYXllZFVzZXJJbmZvIHx8IFVzZXJNZW51LmRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbztcclxuICAgIHRoaXMub25JdGVtQ2xpY2sgPSBvcHRpb25zLm9uSXRlbUNsaWNrO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcclxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJNYWluRWxlbWVudHMoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlckluZm8oKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkSXRlbXMoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoaXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnNlcnRJdGVtcyhpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10sIHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCAuLi5pdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmFkZ2UoaXRlbU5hbWU6IHN0cmluZyk6IElCYWRnZU1vZGVsIHwgbnVsbCB7XHJcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5UZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpdGVtTmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIG1lbnVJdGVtPy5CYWRnZSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJhZGdlKGl0ZW1OYW1lOiBzdHJpbmcsIGJhZGdlOiBJQmFkZ2VNb2RlbCkge1xyXG4gICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uVGV4dD8udG9Mb3dlckNhc2UoKSA9PT0gaXRlbU5hbWUpO1xyXG5cclxuICAgIGlmIChtZW51SXRlbSkge1xyXG4gICAgICBtZW51SXRlbS5CYWRnZSA9IGJhZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyTWFpbkVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5fcm9vdC5jbGFzc0xpc3QuYWRkKCd1c2VyLW1lbnUnKTtcclxuXHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC8qJ25hdmJhci1uYXYnLCAqL2BkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tbm9uZWApO1xyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wUm9vdERyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbicsICdidG4nLCAnYnRuLW91dGxpbmUtbGlnaHQnKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnZHJvcGRvd24nKTtcclxuXHJcbiAgICBsZXQgYXZhdGFyO1xyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBpZiAodGhpcy51c2VyQXZhdGFyKSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgYXZhdGFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdoZWFkZXJfX2ljb24tYnV0dG9uLWF2YXRhcicpO1xyXG4gICAgICAgIGF2YXRhci5zcmMgPSB0aGlzLnVzZXJBdmF0YXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICAgIGF2YXRhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnZmFzJywgJ2ZhLXVzZXInKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICBhdmF0YXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbi1pY29uJywgJ2lzb3otaWNvbi11c2VyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51JywgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChhdmF0YXIpO1xyXG5cclxuICAgIGlmICh0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+ICEhaXRlbS5CYWRnZSkpIHtcclxuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9fYmFkZ2UnKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlcik7XHJcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5pdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9faXRlbXMnKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNicpO1xyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mbycsICdoNicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm8nLCAnZHJvcGRvd24taXRlbScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlckluZm9EaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnVzZXJJbmZvRGl2aWRlci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1kaXZpZGVyJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZVZpZXcpIHtcclxuICAgICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0RpdmlkZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pdGVtc0NvbnRhaW5lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9EaXZpZGVyKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLml0ZW1zQ29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lcik7XHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcFJvb3REcm9wZG93bik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyVXNlckluZm8oKSB7XHJcbiAgICBpZiAoIXRoaXMudXNlckluZm9Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3VzZXJJbmZvQ29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBjb25zdCB1c2VySW5mb0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mb19fY29udGVudCcpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmlubmVyVGV4dCA9IHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8odGhpcy51c2VyTmFtZSk7XHJcblxyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJJbmZvQ29udGVudEVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5pbm5lclRleHQgPSB0aGlzLmdldERpc3BsYXllZFVzZXJJbmZvKHRoaXMudXNlck5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLml0ZW1zQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdpdGVtc0NvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJJdGVtc0NvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudChpdGVtLCB0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgICAgIHRoaXMuaXRlbXNDb250YWluZXIhLmFwcGVuZENoaWxkKGl0ZW1FbGVtZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1FbGVtZW50KGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCwgaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbSk7XHJcblxyXG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKGlzTW9iaWxlID8gJ25hdi1saW5rJyA6ICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gaXRlbS5VcmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBsaW5rRWxlbWVudC50ZXh0ID0gaXRlbS5UZXh0O1xyXG4gICAgaWYoaXRlbS5PcGVuSW5OZXdQYWdlKSB7XHJcbiAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGxpbmtFbGVtZW50LCBpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoaXRlbS5CYWRnZSkge1xyXG4gICAgICBjb25zdCBiYWRnZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXNvei1iYWRnZScpO1xyXG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlLS1jaXJjbGUnKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZChgaXNvei1iYWRnZS0tJHtpdGVtLkJhZGdlLlR5cGUgfHwgJ2luZm9ybWF0aW9uJ31gKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuaW5uZXJIVE1MID0gaXRlbS5CYWRnZS5UZXh0O1xyXG5cclxuICAgICAgbGlua0VsZW1lbnQuYXBwZW5kQ2hpbGQoYmFkZ2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbTogSVVzZXJNZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJVXNlck1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMub25NZW51SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN3aXRjaFZpZXcoaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICB0aGlzLmFwcGx5TW9iaWxlVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9yVXNlckluZm8oKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9Db250YWluZXIsIG51bGwpO1xyXG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCkge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy51c2VySW5mb0NvbnRhaW5lciwgbnVsbCk7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbUVsZW1lbnQgb2YgdGhpcy5pdGVtc0NvbnRhaW5lci5jaGlsZHJlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseURlc2t0b3BWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLml0ZW1zQ29udGFpbmVyLCBudWxsKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW1FbGVtZW50IG9mIHRoaXMuaXRlbXNDb250YWluZXIuY2hpbGRyZW4pIHtcclxuICAgICAgaXRlbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYXJJdGVtc0NvbnRhaW5lcigpIHtcclxuICAgIHdoaWxlICh0aGlzLml0ZW1zQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5pdGVtc0NvbnRhaW5lci5maXJzdENoaWxkLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkl0ZW1DbGljaz8uKGUpO1xyXG4gICAgICBlLml0ZW0uT25DbGljaz8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldyh0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLmVtaXRJdGVtQ2xpY2soZSk7XHJcblxyXG4gICAgaWYgKGUuY2FuY2VsKSB7XHJcbiAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZW51SXRlbSB7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgaXRlbXM/OiBJTWVudUl0ZW1bXTtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgaGlkZGVuPzogYm9vbGVhbjtcclxuICBhY3RpdmU/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBtZW51SXRlbUVsPzogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgb3JpZ2luYWxNb2RlbDogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJTWVudUl0ZW07XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudU9wdGlvbnMge1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgaXRlbXM6IElNZW51SXRlbVtdO1xyXG4gIG9uSXRlbUNsaWNrPzogKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lbnUgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBpdGVtczogSU1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uSXRlbUNsaWNrOiAoKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZWxlbWVudHNcclxuICBwcm90ZWN0ZWQgcm9vdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElNZW51T3B0aW9ucykge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5vbkl0ZW1DbGljayA9IG9wdGlvbnMub25JdGVtQ2xpY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKCk6IHZvaWQ7XHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uSXRlbUNsaWNrPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNZW51LCBJTWVudU9wdGlvbnMsIElNZW51SXRlbSB9IGZyb20gJy4vTWVudSc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IgfSBmcm9tICcuLi9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsIGlzSXRlbUFjdGl2ZSB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2xsYXBzaW5nTW9kZSB7XHJcbiAgRGlzYWJsZWQsXHJcbiAgQ29sbGFwc2VkLFxyXG4gIEV4cGFuZGVkLFxyXG4gIEFkYXB0aXZlQ29sbGFwc2luZ1xyXG59XHJcblxyXG50eXBlIEl0ZW1BY3Rpb25Nb2RlID0gJ2hvdmVyJyB8ICdjbGljayc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJvb3RzdHJhcENvbGxhcHNpbmdNZW51T3B0aW9ucyBleHRlbmRzIElNZW51T3B0aW9ucyB7XHJcbiAgaXRlbUFjdGlvbj86IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIGNvbGxhcHNpbmdNb2RlPzogQ29sbGFwc2luZ01vZGU7XHJcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgY29sbGFwc2VJY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgZXh0ZW5kcyBNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIEhPVkVSX01PREVfQ1NTX0NMQVNTID0gJ25hdmJhci1uYXZfaG92ZXItYWN0aW9uJztcclxuICBwcm90ZWN0ZWQgc3RhdGljIGFkYXB0aXZpdHlDb2xsYXBzaW5nRGVsYXkgPSA1MDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbUFjdGlvbk1vZGU6IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsYXBzaW5nTW9kZTogQ29sbGFwc2luZ01vZGU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlSWNvbk5hbWU6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvbldpbmRvd1Jlc2l6ZUV2ZW50SGFuZGxlciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrSGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uVG9nZ2xlRHJvcGRvd25CdXR0b25Nb3VzZUVudGVySGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcclxuICAvLyBlbGVtZW50c1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZVJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZUJ1dHRvbjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJvdGVjdGVkIGNvbGxhcHNlRHJvcGRvd246IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjdXJyZW50T3BlbmluZ1N1Yk1lbnU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQm9vdHN0cmFwQ29sbGFwc2luZ01lbnVPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLml0ZW1BY3Rpb25Nb2RlID0gb3B0aW9ucy5pdGVtQWN0aW9uIHx8ICdob3Zlcic7XHJcbiAgICB0aGlzLmNvbGxhcHNpbmdNb2RlID0gb3B0aW9ucy5jb2xsYXBzaW5nTW9kZSA/PyBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmc7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMuY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG4gICAgdGhpcy5jb2xsYXBzZUljb25OYW1lID0gb3B0aW9ucy5jb2xsYXBzZUljb24gfHwgJ2ZhLWVsbGlwc2lzLXYnO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIoXHJcbiAgICAgIHRoaXMuY29sbGFwc2luZ01vZGUgPT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZyA/IHRoaXMub25XaW5kb3dSZXNpemVFdmVudEhhbmRsZXIgOiB1bmRlZmluZWQsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuYWRhcHRpdml0eUNvbGxhcHNpbmdEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcclxuICAgIHN1cGVyLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgaXNuXFwndCByZW5kZXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLnJvb3QuZmlyc3RDaGlsZCkge1xyXG4gICAgICB0aGlzLnJvb3QuZmlyc3RDaGlsZC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIGlmICh0aGlzLmNvbGxhcHNpbmdNb2RlICE9PSBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmdcclxuICAgICAgfHwgIXRoaXMucm9vdCB8fCAhdGhpcy5pdGVtcy5sZW5ndGggfHwgIXRoaXMuY29sbGFwc2VSb290IHx8ICF0aGlzLmNvbGxhcHNlRHJvcGRvd24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZVJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcblxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1FbGVtZW50ID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAyXTtcclxuICAgICAgICBpZiAoIWxhc3RJdGVtRWxlbWVudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdmVSb290SXRlbXNUb0NvbGxhcHNlRHJvcGRvd24obGFzdEl0ZW1FbGVtZW50KTtcclxuICAgICAgfSB3aGlsZSAodGhpcy5pc05lZWRDb2xsYXBzZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Sb290KHRoaXMuY29sbGFwc2VEcm9wZG93bi5maXJzdEVsZW1lbnRDaGlsZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RJdGVtRWxlbWVudCA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnJvb3QuY2hpbGRyZW4ubGVuZ3RoIC0gMl07XHJcbiAgICAgICAgICBsYXN0SXRlbUVsZW1lbnQgJiYgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5jb2xsYXBzZURyb3Bkb3duLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHRoaXMuaXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9sZEFjdGl2ZVZhbHVlID0gaXRlbS5hY3RpdmU7XHJcbiAgICAgIGl0ZW0uYWN0aXZlID0gaXNJdGVtQWN0aXZlKGl0ZW0ub3JpZ2luYWxNb2RlbCk7XHJcblxyXG4gICAgICBpZiAoaXRlbS5hY3RpdmUgIT09IG9sZEFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbS5tZW51SXRlbUVsLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCBpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VPcGVuZWREcm9wZG93bih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgLy9OT1RFOiBGb3IgY2xvc2luZyBvcGVuZWQgZHJvcGRvd25cclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgICAkKHRhcmdldEVsZW1lbnQpLm9uZSgnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChCb290c3RyYXBDb2xsYXBzaW5nTWVudS5IT1ZFUl9NT0RFX0NTU19DTEFTUyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvckVhY2hNZW51SXRlbVJlY3Vyc2l2ZShyb290SXRlbXM6IElNZW51SXRlbVtdLCBhY3Rpb246IChpdGVtOiBJTWVudUl0ZW0pID0+IHZvaWQpIHtcclxuICAgIHJvb3RJdGVtcy5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGFjdGlvbihpKTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXN0ZWRJdGVtc093bmVySXRlbShpKSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKGkuaXRlbXMsIGFjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ25hdmJhci1uYXYnLCAnbXItYXV0bycpO1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgdGhpcy5yZW5kZXJSb290SXRlbXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggJiYgdGhpcy5jb2xsYXBzaW5nTW9kZSAhPT0gQ29sbGFwc2luZ01vZGUuRGlzYWJsZWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgICB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIHRoaXMucmVuZGVyQ29sbGFwc2VFbGVtZW50cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKTtcclxuICAgICAgICB0aGlzLnJvb3Quc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZWZhdWx0RHJvcGRvd25CZWhhdmlvckZvck5lc3RlZERyb3Bkb3duKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hhbmdlRGVmYXVsdERyb3Bkb3duQmVoYXZpb3JGb3JOZXN0ZWREcm9wZG93bigpIHtcclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bicpKS5vbignaGlkZS5icy5kcm9wZG93bicsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGUudGFyZ2V0ICE9PSB0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSAmJiBlLnRhcmdldC5jb250YWlucyh0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSk7XHJcblxyXG4gICAgICByZXR1cm4gIXJlc3VsdDtcclxuICAgIH0pO1xyXG5cclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1zdWJtZW51JykpLm9uKCdzaG93LmJzLmRyb3Bkb3duJywgKGUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb2xsYXBzZUVsZW1lbnRzKCkge1xyXG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScsICdkcm9wZG93bicsICdjb2xsYXBzaW5nLW1lbnVfX2NvbGxhcHNlLXJvb3QnKTtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24nLCAnYnRuJywgJ2J0bi1vdXRsaW5lLWxpZ2h0Jyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuY29sbGFwc2VCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdmYXMnLCB0aGlzLmNvbGxhcHNlSWNvbk5hbWUpO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScsICdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcclxuICAgIHRoaXMuY29sbGFwc2VSb290LmFwcGVuZENoaWxkKHRoaXMuY29sbGFwc2VCdXR0b24pO1xyXG4gICAgdGhpcy5jb2xsYXBzZVJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZURyb3Bkb3duKTtcclxuXHJcbiAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZVJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3RJdGVtcygpIHtcclxuICAgIGlmICghdGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbVdpdGhOZXN0ZWRJdGVtcyhpdGVtIGFzIElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yb290IS5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtV2l0aE5lc3RlZEl0ZW1zKGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbUVsZW1lbnQoaXRlbSk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Db250ZW50ID0gaXRlbUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1pdGVtJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudC5ocmVmID0gaXRlbS51cmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBpdGVtQ29udGVudC50ZXh0ID0gaXRlbS50ZXh0O1xyXG5cclxuICAgIGNvbnN0IGljb25FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbSk7XHJcbiAgICBpY29uRWxlbWVudCAmJiBpdGVtQ29udGVudC5pbnNlcnRCZWZvcmUoaWNvbkVsZW1lbnQsIGl0ZW1Db250ZW50LmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgIHRoaXMuYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1Db250ZW50LCBpdGVtKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGl0ZW1Db250ZW50LCBpdGVtKTtcclxuXHJcbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtQ29udGVudCk7XHJcblxyXG4gICAgaXRlbS5tZW51SXRlbUVsID0gaXRlbUVsZW1lbnQ7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZFN1Yk1lbnVJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGl0ZW1FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1pdGVtJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZEl0ZW0oaXRlbTogSU1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWl0ZW0nKTtcclxuICAgIGl0ZW1Db250ZW50LmhyZWYgPSBpdGVtLnVybCB8fCAnamF2YXNjcmlwdDp2b2lkKDApJztcclxuICAgIGl0ZW1Db250ZW50LnRleHQgPSBpdGVtLnRleHQ7XHJcblxyXG4gICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtKTtcclxuICAgIGljb25FbGVtZW50ICYmIGl0ZW1Db250ZW50Lmluc2VydEJlZm9yZShpY29uRWxlbWVudCwgaXRlbUNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG4gICAgdGhpcy5hdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG5cclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1Db250ZW50KTtcclxuXHJcbiAgICBpdGVtLm1lbnVJdGVtRWwgPSBpdGVtRWxlbWVudDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRHJvcGRvd25NZW51KGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgZHJvcGRvd25NZW51RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51Jyk7XHJcblxyXG4gICAgaXRlbS5pdGVtcy5mb3JFYWNoKChuZXN0ZWRJdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0obmVzdGVkSXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVOZXN0ZWRTdWJNZW51SXRlbUVsZW1lbnQobmVzdGVkSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udGVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShuZXN0ZWRJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZHJvcGRvd25NZW51RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcm9wZG93bk1lbnVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmICghaXRlbS5pY29uKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgaXRlbUljb24uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2l0ZW0uaWNvbn0pYDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUljb247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXRvZ2dsZScpO1xyXG4gICAgaXRlbUNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXJIYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmIChpdGVtLmFjdGl2ZSkge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmhpZGRlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElNZW51SXRlbSkge1xyXG4gICAgaXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5lbWl0SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbTogSU1lbnVJdGVtKTogaXRlbSBpcyBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9IHtcclxuICAgIHJldHVybiBpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoICYmIGl0ZW0uaXRlbXMuc29tZSgoaSkgPT4gIWkuaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKHJvb3RJdGVtT3JJdGVtczogRWxlbWVudCB8IEl0ZXJhYmxlPEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93bi5hcHBlbmRDaGlsZCh0ZW1wSXRlbUVsZW1lbnRzU3RvcmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb1Jvb3Qocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGlmIChyb290SXRlbU9ySXRlbXMgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLnJvb3QuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAxXSB8fCBudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5RXhwYW5kZWRWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGVtcEl0ZW1FbGVtZW50c1N0b3JlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseUNvbGxhcHNpbmdWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW06IEVsZW1lbnQpIHtcclxuICAgIHJvb3RJdGVtLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvb3RJdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgIGNoaWxkLmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbTogRWxlbWVudCkge1xyXG4gICAgcm9vdEl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnZHJvcGRvd24tc3VibWVudScpO1xyXG5cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdEl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc05lZWRDb2xsYXBzZSgpIHtcclxuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1pbldpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWluV2lkdGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9vdC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcclxuICAgIGNvbnN0IGN1cnJlbnRSb290UmVjdCA9IHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaW5nLW1lbnVfbm9ybWFsLXdoaXRlLXNwYWNlJyk7XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsUm9vdFJlY3QgPSB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2luZy1tZW51X25vcm1hbC13aGl0ZS1zcGFjZScpO1xyXG4gICAgdGhpcy5yb290LnN0eWxlLm1heFdpZHRoID0gJyc7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRSb290UmVjdC53aWR0aCA+IG5vcm1hbFJvb3RSZWN0LndpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHJvcGRvd25SZWN0c0ludGVyc2VjdChkcm9wZG93blJlY3QxOiBDbGllbnRSZWN0LCBkcm9wZG93blJlY3QyOiBDbGllbnRSZWN0LCBkZWx0YSA9IDIpIHtcclxuICAgIHJldHVybiBkcm9wZG93blJlY3QxLmxlZnQgPCAoZHJvcGRvd25SZWN0Mi5yaWdodCAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi5sZWZ0ICsgZGVsdGEpIDwgZHJvcGRvd25SZWN0MS5yaWdodFxyXG4gICAgICAmJiBkcm9wZG93blJlY3QxLnRvcCA8IChkcm9wZG93blJlY3QyLmJvdHRvbSAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi50b3AgKyBkZWx0YSkgPCBkcm9wZG93blJlY3QxLmJvdHRvbTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVNoYWRvd3NGb3JPdmVybGFwaW5nRHJvcGRvd25JZk5lZWRlZChvcGVuZWREcm9wZG93bkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyBSZXNldCB0aGUgc3R5bGUgYmVmb3JlIHRoZSByZWN0IGdldHRpbmcgdG8gZ2V0IHJlYWwgdmFsdWVzXHJcbiAgICBvcGVuZWREcm9wZG93bkVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Bkb3duLW1lbnUtbGVmdC1zaGFkb3dlZCcpO1xyXG4gICAgbGV0IHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAocmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5zdHlsZS5sZWZ0ID0gYC0ke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bkb3duLW1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRyb3Bkb3duRWxlbWVudCBvZiBkcm9wZG93bkVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgPT09IG9wZW5lZERyb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duUmVjdHNJbnRlcnNlY3QoZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByZWN0KSkge1xyXG4gICAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51LWxlZnQtc2hhZG93ZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uV2luZG93UmVzaXplKGU6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMuYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLnRhcmdldC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE9wZW5pbmdTdWJNZW51ID0gZS50YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlcihlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lci5jdXJyZW50TGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5tYXhXaWR0aCAmJlxyXG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XHJcbiAgICAgICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xyXG4gICAgICB0aGlzLmFwcGx5U2hhZG93c0Zvck92ZXJsYXBpbmdEcm9wZG93bklmTmVlZGVkKGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhLCBJTGF5b3V0QnJlYWtwb2ludCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBCb290c3RyYXBDb2xsYXBzaW5nTWVudSB9IGZyb20gJy4uL0NvbXBvbmVudHMvTWVudSc7XHJcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9NZW51L01lbnUnO1xyXG5pbXBvcnQgeyBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vU2VhcmNoJztcclxuXHJcbmNvbnN0IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkgPSAoaXRlbXM6IHJlYWRvbmx5IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdLCBpdGVtTmFtZTogc3RyaW5nKTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIHwgdW5kZWZpbmVkID0+IHtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgIGlmIChpdGVtLk5hbWUgPT09IGl0ZW1OYW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLkl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbmVzdGVkSXRlbSA9IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkoaXRlbS5JdGVtcywgaXRlbU5hbWUpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZEl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gbmVzdGVkSXRlbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEl0ZW1VcmxzUmVjdXJzaXZlbHkgPSAoaXRlbURhdGE6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCBpdGVtcyA9IGl0ZW1EYXRhLkl0ZW1zO1xyXG5cclxuICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IG93blVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhKTtcclxuXHJcbiAgICByZXR1cm4gb3duVXJsID8gW293blVybF0gOiBbXTtcclxuICB9XHJcblxyXG4gIGxldCB1cmxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XHJcbiAgICB1cmxzID0gdXJscy5jb25jYXQoZ2V0SXRlbVVybHNSZWN1cnNpdmVseShjaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVybHM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtQWN0aXZlID0gKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpID0+IHtcclxuICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xyXG4gIGNvbnN0IGl0ZW1VcmxzID0gZ2V0SXRlbVVybHNSZWN1cnNpdmVseShpdGVtRGF0YSk7XHJcblxyXG4gIGZvciAoY29uc3QgdXJsIG9mIGl0ZW1VcmxzKSB7XHJcbiAgICBjb25zdCB1cmxSZSA9IG5ldyBSZWdFeHAoYF4uKiR7dXJsLnJlcGxhY2UoJz8nLCAnXFxcXD8nKX0kYCk7XHJcblxyXG4gICAgaWYgKHVybFJlLnRlc3QoY3VycmVudExvY2F0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbDtcclxuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xyXG4gIGNhbmNlbD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uTWVudSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnU6IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51O1xyXG4gIHByaXZhdGUgaXNHbG9iYWxNZW51OiBib29sZWFuO1xyXG4gIHByaXZhdGUgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sXHJcbiAgICBpc0dsb2JhbE1lbnU6IGJvb2xlYW4sXHJcbiAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50LFxyXG4gICAgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWRcclxuICApIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnUsXHJcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcbiAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2sgPSBvbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrO1xyXG4gICAgdGhpcy5tZW51ID0gbmV3IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51KHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgaXRlbXM6IHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhpdGVtcyksXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgb25JdGVtQ2xpY2s6IHRoaXMub25NZW51SXRlbUNsaWNrSGFuZGxlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGlzR2xvYmFsTWVudTogYm9vbGVhbikge1xyXG4gICAgLyogZXNsaW50IEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnM6IG9mZiAqL1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnU7XHJcbiAgICB0aGlzLm1lbnUudXBkYXRlSXRlbXModGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKHRoaXMuaXRlbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLm1lbnUucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIHRoaXMubWVudS5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMubWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMubWFwTWVudUl0ZW1DbGlja0V2ZW50QXJnc1RvTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudEFyZ3MoZSk7XHJcbiAgICBpZiAoZXZlbnRBcmdzKSB7XHJcbiAgICAgIHRoaXMuZW1pdE5hdmlnYXRpb25NZW51SXRlbUNsaWNrKGV2ZW50QXJncyk7XHJcblxyXG4gICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xyXG4gICAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5tZW51LmNsb3NlT3BlbmVkRHJvcGRvd24odGFyZ2V0RWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgICAgZS5pdGVtLk9uQ2xpY2s/LihlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIHJldHVybiBtZW51SXRlbU1vZGVscy5tYXA8SU1lbnVJdGVtPigobWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbSA9IHtcclxuICAgICAgICB0ZXh0OiBtZW51SXRlbU1vZGVsLk5hbWUsXHJcbiAgICAgICAgaWNvbjogbWVudUl0ZW1Nb2RlbC5JY29uLFxyXG4gICAgICAgIGl0ZW1zOiBtZW51SXRlbU1vZGVsLkl0ZW1zID8gdGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKG1lbnVJdGVtTW9kZWwuSXRlbXMpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHVybDogZ2V0VXJsQnlNZW51SXRlbURhdGEobWVudUl0ZW1Nb2RlbCksXHJcbiAgICAgICAgaGlkZGVuOiBtZW51SXRlbU1vZGVsLlZpc2libGUgPT09IGZhbHNlLFxyXG4gICAgICAgIGFjdGl2ZTogaXNJdGVtQWN0aXZlKG1lbnVJdGVtTW9kZWwpLFxyXG4gICAgICAgIGRpc2FibGVkOiBtZW51SXRlbU1vZGVsLkRpc2FibGVkLFxyXG4gICAgICAgIHRpdGxlOiBtZW51SXRlbU1vZGVsLkRlc2NyaXB0aW9uLFxyXG4gICAgICAgIG9yaWdpbmFsTW9kZWw6IG1lbnVJdGVtTW9kZWxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBtZW51SXRlbTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBNZW51SXRlbUNsaWNrRXZlbnRBcmdzVG9OYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50QXJncyhlOiBNZW51SXRlbUNsaWNrRXZlbnQpOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHwgbnVsbCB7XHJcbiAgICBjb25zdCBpdGVtID0gZmluZEl0ZW1CeU5hbWVSZWN1cnNpdmVseSh0aGlzLml0ZW1zLCBlLml0ZW0udGV4dCk7XHJcblxyXG4gICAgcmV0dXJuICFpdGVtID8gbnVsbCA6IHtcclxuICAgICAgb3JpZ2luYWxFdmVudDogZS5vcmlnaW5hbEV2ZW50LFxyXG4gICAgICBjYW5jZWw6IGZhbHNlLFxyXG4gICAgICBpdGVtOiB7IC4uLml0ZW0sIGlzR2xvYmFsOiB0aGlzLmlzR2xvYmFsTWVudSB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZID0gJ2lzem9sZWEtdWl8bG9nby1zZXR0aW5ncyc7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dvIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSAkaW1hZ2VFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgJHRpdGxlQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0V2lkZ2V0KCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEYXRhKCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRXaWRnZXQoZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgY29uc3QgY2FjaGVkU2V0dGluZ3NSYXcgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ28oSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XHJcblxyXG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVMb2dvKGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTG9nbyhkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB7XHJcbiAgICBpZiAodHlwZW9mIGRhdGFTb3VyY2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGxvZ29TZXR0aW5ncyA9IGRhdGFTb3VyY2UgYXMgSUxvZ29TZXR0aW5ncztcclxuXHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzKTtcclxuXHJcbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZGF0YVNvdXJjZSBhcyBzdHJpbmcsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgPSB7fTtcclxuICAgICAgbG9nb1NldHRpbmdzLmFwcGxpY2F0aW9uTmFtZSA9IGRhdGEuQXBwbGljYXRpb25OYW1lO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lID0gZGF0YS5CdXNpbmVzc05hbWU7XHJcbiAgICAgIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UgPSBkYXRhLkxvZ29JbWFnZTtcclxuICAgICAgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbyA9IGRhdGEuTGFuZGluZ1BhZ2VMb2dvO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb24gPSBkYXRhLkRlc2NyaXB0aW9uO1xyXG5cclxuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGxvZ29TZXR0aW5ncykpO1xyXG5cclxuICAgICAgdGhpcy5fY3JlYXRlTG9nb01hcmt1cChsb2dvU2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVMb2dvTWFya3VwKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncykge1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50ID0gJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd0aXRsZS1jb250YWluZXInKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpKTtcclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2FwcC1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYXBwbGljYXRpb25OYW1lLnRvVXBwZXJDYXNlKCkpKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElEZXN0cm95YWJsZSwgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIElMYXlvdXRCcmVha3BvaW50LCBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudVN3aXRjaGVyT3B0aW9ucyB7XHJcbiAgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBzdGFydFZhbHVlPzogYm9vbGVhbjtcclxuICBvblN3aXRjaD86ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTd2l0Y2hlciBpbXBsZW1lbnRzIElSZW5kZXJlZCwgSURlc3Ryb3lhYmxlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2t0b3BDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblN3aXRjaDogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkTGlzdGVuZXIgPSB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1Jlc2l6ZUxpc3RlbmVyOiBXaW5kb3dSZXNpemVMaXN0ZW5lcjtcclxuICBwcml2YXRlIF92YWx1ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIG1lbnVTd2l0Y2hlcjogRGV2RXhwcmVzcy51aS5keFN3aXRjaCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uVmFsdWVDaGFuZ2VkOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJTWVudVN3aXRjaGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGFpbmVyID0gb3B0aW9ucy5kZXNrdG9wQ29udGFpbmVyO1xyXG4gICAgdGhpcy5tb2JpbGVDb250YWluZXIgPSBvcHRpb25zLm1vYmlsZUNvbnRhaW5lcjtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcbiAgICB0aGlzLm9uU3dpdGNoID0gb3B0aW9ucy5vblN3aXRjaDtcclxuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9ucy5zdGFydFZhbHVlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0YXJ0VmFsdWUgOiB0cnVlO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBjb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZVZpZXcgPyB0aGlzLm1vYmlsZUNvbnRhaW5lciA6IHRoaXMuZGVza3RvcENvbnRhaW5lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZShpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyU3dpdGNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KCk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlcj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIHJvb3Q/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVZhbHVlQ2hhbmdlZChvblZhbHVlQ2hhbmdlZDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb25WYWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclN3aXRjaCgpIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gJCgnPGRpdj4nKS5keFN3aXRjaCh7XHJcbiAgICAgIHN3aXRjaGVkT2ZmVGV4dDogJ1BlcnNvbmFsJyxcclxuICAgICAgc3dpdGNoZWRPblRleHQ6ICdHbG9iYWwnLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgd2lkdGg6ICcxMDBweCcsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vblN3aXRjaCkge1xyXG4gICAgICAgICAgdGhpcy5vblN3aXRjaCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keFN3aXRjaCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KClbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldygpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4nO1xyXG5pbXBvcnQgeyBNZW51SXRlbVR5cGUgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IGJvb2xlYW47XHJcbiAgb25EaW1lbnNpb25zQ2hhbmdlZD86ICgpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbUNsaWNrPzogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbU9wZW5lZD86IChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgZ2xvYWJhbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXTtcclxuICBwZXJzb25hbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlblJlcG9ydEV2ZW50QXJncyB7XHJcbiAgbWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCA9IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCAmIHtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZWQ6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2s6IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25NZW51SXRlbU9wZW5lZDogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHNlYXJjaERyb3BEb3duOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRzVHJlZUxpc3Q6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNlYXJjaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZ2V0TWVudURhdGFTb3VyY2UgPSBvcHRpb25zLmdldE1lbnVEYXRhU291cmNlO1xyXG4gICAgdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93biA9IG9wdGlvbnMuZ2V0SXNHbG9iYWxNZW51U2hvd247XHJcbiAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgPSBvcHRpb25zLm9uRGltZW5zaW9uc0NoYW5nZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgPSBvcHRpb25zLm9uTWVudUl0ZW1PcGVuZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1DbGljayA9IG9wdGlvbnMub25NZW51SXRlbUNsaWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUoaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3ZhbHVlJywgdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkTWVudUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Q/Lm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuZ2V0RGF0YVNvdXJjZUZvclNlYXJjaCh0aGlzLmdldE1lbnVEYXRhU291cmNlKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBmb3JtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgIGZvcm1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0taW5saW5lJyk7XHJcblxyXG4gICAgY29uc3QgJGlucHV0ID0gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCcsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93RHJvcERvd25CdXR0b246IGZhbHNlLFxyXG4gICAgICBhcHBseVZhbHVlTW9kZTogJ2luc3RhbnRseScsXHJcbiAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICBvcGVuT25GaWVsZENsaWNrOiBmYWxzZSxcclxuICAgICAgbW9kZTogJ3NlYXJjaCcsXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgJ3R5cGUnOiAnc2VhcmNoJyxcclxuICAgICAgICAnYXJpYS1sYWJlbCc6ICdTZWFyY2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUsICRlbCkgPT4ge1xyXG4gICAgICAgICRlbC5hZGRDbGFzcygnaGVhZGVyLXNlYXJjaC1yZXN1bHRzLXRyZWUtbGlzdCcpO1xyXG4gICAgICAgIGNvbnN0ICR0cmVlTGlzdCA9ICQoJzxkaXY+JykuZHhUcmVlTGlzdCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmdldERhdGFTb3VyY2VGb3JTZWFyY2godGhpcy5nZXRNZW51RGF0YVNvdXJjZSgpKSxcclxuICAgICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG5vRGF0YVRleHQ6ICdObyByZXN1bHRzIGZvdW5kJyxcclxuICAgICAgICAgIGRhdGFTdHJ1Y3R1cmU6ICd0cmVlJyxcclxuICAgICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgICBpdGVtc0V4cHI6ICdJdGVtcycsXHJcbiAgICAgICAgICBmaWx0ZXJNb2RlOiAnZnVsbEJyYW5jaCcsXHJcbiAgICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogZmFsc2UsXHJcbiAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIG9uQ2VsbENsaWNrOiAoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTWVudUl0ZW0oZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGFyZ3MuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFJvd0tleSA9IHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0Lm9wdGlvbignZm9jdXNlZFJvd0tleScpO1xyXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFJvd0tleSAhPT0gbnVsbCAmJiBmb2N1c2VkUm93S2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Tm9kZUJ5S2V5KGZvY3VzZWRSb3dLZXkpLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01lbnVJdGVtKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5leHBhbmRSb3coZm9jdXNlZFJvd0tleSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmNvbGxhcHNlUm93KGZvY3VzZWRSb3dLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdCA9ICR0cmVlTGlzdC5keFRyZWVMaXN0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICByZXR1cm4gJHRyZWVMaXN0O1xyXG4gICAgICB9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgb2Y6ICcuc2VhcmNoLWRyb3Bkb3duJyxcclxuICAgICAgICAgIG15OiAndG9wJyxcclxuICAgICAgICAgIGF0OiAnYm90dG9tJyxcclxuICAgICAgICAgIG9mZnNldDogeyB4OiAxNDksIHk6IDQgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IDUxOCxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIHNob3c6IHsgZHVyYXRpb246IDAgfSxcclxuICAgICAgICAgIGhpZGU6IHsgZHVyYXRpb246IDAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRm9jdXNJbjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5lbGVtZW50KCkuYWRkQ2xhc3MoJ2ZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgJiYgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KGUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkgYXMgc3RyaW5nKTtcclxuICAgICAgfSxcclxuICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmVsZW1lbnQoKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xyXG4gICAgICAgICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25LZXlVcDogKGUpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gZS5ldmVudCBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZCgnaW5wdXQuZHgtdGV4dGVkaXRvci1pbnB1dCcpLnZhbCgpIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkodmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Quc2VhcmNoQnlUZXh0KHZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IHRyaWdnZXJlZEZvY3VzQnV0dG9ucyA9IFsnVGFiJywgJ0VudGVyJywgJ0Fycm93RG93bicsICdBcnJvd1VwJ107XHJcbiAgICAgICAgICBpZiAodHJpZ2dlcmVkRm9jdXNCdXR0b25zLnNvbWUoKGIpID0+IGIgPT09IGV2ZW50LmtleSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZm9jdXModGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Q2VsbEVsZW1lbnQoMCwgJ05hbWUnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGUuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZVNlYXJjaERyb3BEb3duKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkoZS52YWx1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5hZGRDbGFzcyhbJ2Zvcm0tY29udHJvbCcsICdtci1zbS0yJywgJ3NlYXJjaC1kcm9wZG93biddKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duID0gJGlucHV0LmR4RHJvcERvd25Cb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgZm9ybUVsZW1lbnQuYXBwZW5kQ2hpbGQoJGlucHV0WzBdKTtcclxuICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmQoZm9ybUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvTWVudUl0ZW0obWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShtZW51SXRlbSk7XHJcblxyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICB0aGlzLmNsb3NlU2VhcmNoRHJvcERvd24oKTtcclxuXHJcbiAgICAgIGNvbnN0IGFyZ3M6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgPSB7XHJcbiAgICAgICAgaXRlbTogbWVudUl0ZW0sXHJcbiAgICAgICAgb3JpZ2luYWxFdmVudDogbnVsbCxcclxuICAgICAgICBjYW5jZWw6IGZhbHNlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1DbGljaz8uKGFyZ3MpO1xyXG5cclxuICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgJiYgdGhpcy5vbk1lbnVJdGVtT3BlbmVkKHsgbWVudUl0ZW0gfSk7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZVNlYXJjaERyb3BEb3duKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Qub3B0aW9uKCdmb2N1c2VkUm93S2V5JywgdW5kZWZpbmVkKTtcclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wdGlvbigndmFsdWUnLCAnJyk7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5mb2N1cygpO1xyXG4gICAgdGhpcy5zZWFyY2hEcm9wRG93bj8uYmx1cigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcGVuKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhU291cmNlRm9yU2VhcmNoKGRzOiBJU2VhcmNoRGF0YVNvdXJjZSk6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFkcykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdldFJlZHVjZXIgPSAoaXNHbG9iYWw6IGJvb2xlYW4pID0+IHtcclxuICAgICAgY29uc3QgcmVkdWNlciA9IChyZXM6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGl0ZW06IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLkl0ZW1zICYmIGl0ZW0uSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpdGVtLkl0ZW1zID0gaXRlbS5JdGVtcy5yZWR1Y2UocmVkdWNlciwgW10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gaXRlbS5WaXNpYmxlID09PSB1bmRlZmluZWQgfHwgaXRlbS5WaXNpYmxlID09PSBudWxsIHx8IGl0ZW0uVmlzaWJsZSA9PT0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gaXRlbS5EaXNhYmxlZCA9PT0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzVmlzaWJsZSAmJiAhaXNEaXNhYmxlZCkge1xyXG4gICAgICAgICAgcmVzLnB1c2goeyAuLi5pdGVtLCBpc0dsb2JhbCB9IGFzIElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gcmVkdWNlcjtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGRzLnBlcnNvbmFsSXRlbXMgJiYgZHMucGVyc29uYWxJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZ2xvYmFsTWVudVJvb3QgPSB7XHJcbiAgICAgICAgTmFtZTogJ0dsb2JhbCBNZW51JywgSWQ6IC0xLCBpc0dsb2JhbDogdHJ1ZSwgVHlwZTogTWVudUl0ZW1UeXBlLk1lbnVOb2RlLFxyXG4gICAgICAgIEl0ZW1zOiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcGVyc29uYWxNZW51Um9vdCA9IHtcclxuICAgICAgICBOYW1lOiAnUGVyc29uYWwgTWVudScsIElkOiAtMiwgaXNHbG9iYWw6IGZhbHNlLCBUeXBlOiBNZW51SXRlbVR5cGUuTWVudU5vZGUsXHJcbiAgICAgICAgSXRlbXM6IGRzLnBlcnNvbmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIoZmFsc2UpLCBbXSlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCkgPyBbZ2xvYmFsTWVudVJvb3QsIHBlcnNvbmFsTWVudVJvb3RdIDogW3BlcnNvbmFsTWVudVJvb3QsIGdsb2JhbE1lbnVSb290XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCB7IERldkV4cHJlc3NFdmVudEFyZ3MgfSBmcm9tICcuL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL0V2ZW50RW1pdHRlcic7XHJcbmV4cG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UnO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudExpc3RlbmVyczogYW55W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uKGV2dCwgbGlzdGVuZXIpIHtcclxuICAgIGlmICghdGhpcy5ldmVudExpc3RlbmVyc1tldnRdKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdGVuZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25jZShldnQsIGxpc3RlbmVyKSB7XHJcbiAgICB0aGlzLm9uKGV2dCwgKGUpID0+IHtcclxuICAgICAgbGlzdGVuZXIoZSk7XHJcbiAgICAgIHRoaXMub2ZmKGV2dCwgbGlzdGVuZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdChldnQsIGUgPSBudWxsKSB7XHJcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF07XHJcblxyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRMaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcclxuICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyKSB7XHJcbiAgICAgICAgICBjdXJyZW50TGlzdGVuZXIuY2FsbCh0aGlzLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvZmYoZXZ0LCBsaXN0ZW5lcikge1xyXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldnRdO1xyXG5cclxuICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBbXTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgY3VycmVudExpc3RlbmVyIG9mIGxpc3RlbmVycykge1xyXG4gICAgICAgIGlmIChjdXJyZW50TGlzdGVuZXIgIT09IGxpc3RlbmVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGN1cnJlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0gPSBmaWx0ZXJlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZGRIYW5kbGVyKGV2ZW50OiBzdHJpbmcsIG9yaWdpbkhhbmRsZXIsIGdldEFyZ3VtZW50cykge1xyXG4gICAgY29uc3QgaW50ZXJuYWxIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICBvcmlnaW5IYW5kbGVyKFxyXG4gICAgICAgIGdldEFyZ3VtZW50cygpLFxyXG4gICAgICAgICgpID0+IHRoaXMub2ZmKGV2ZW50LCBpbnRlcm5hbEhhbmRsZXIpXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub24oZXZlbnQsIGludGVybmFsSGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgTXV0YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElMYXlvdXRCcmVha3BvaW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgZ2V0VXJsQnlNZW51SXRlbURhdGEgfSBmcm9tICcuLi9IZWxwZXJzL0luZGV4JztcclxuaW1wb3J0IHsgVXNlck1lbnUsIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQgfSBmcm9tICcuL1VzZXJNZW51JztcclxuaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnUsIE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgfSBmcm9tICcuL05hdmlnYXRpb25NZW51JztcclxuaW1wb3J0IHsgTG9nbyB9IGZyb20gJy4vTG9nbyc7XHJcbmltcG9ydCB7IE1lbnVTd2l0Y2hlciB9IGZyb20gJy4vTWVudVN3aXRjaGVyJztcclxuaW1wb3J0IHsgSVVzZXJNZW51SXRlbU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgSU1lbnVTZXR0aW5ncyB9IGZyb20gJy4vSU1lbnVTZXR0aW5ncyc7XHJcbmltcG9ydCB7IElBcHBNZW51TW9kZWwgfSBmcm9tICcuL0lBcHBNZW51TW9kZWwnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCBTZWFyY2gsIHsgSU9wZW5SZXBvcnRFdmVudEFyZ3MsIElTZWFyY2hEYXRhU291cmNlIH0gZnJvbSAnLi9TZWFyY2gnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9VdGlscy9JbmRleCc7XHJcblxyXG5jb25zdCBIRUFERVJfREFUQV9DQUNIRV9GSUVMRCA9ICdpc3pvbGVhLXVpfGhlYWRlci1kYXRhLWNhY2hlJztcclxuY29uc3QgU0hPV19HTE9CQUxfTUVOVV9LRVkgPSAnaXN6b2xlYS11aXxzaG93LWdsb2JhbC1tZW51JztcclxuXHJcbmNvbnN0IGdldERhdGFTb3VyY2VDYWNoZUZpZWxkID0gKHVzZXJOYW1lPzogc3RyaW5nKSA9PiB7XHJcbiAgcmV0dXJuIGAke0hFQURFUl9EQVRBX0NBQ0hFX0ZJRUxEfSR7dXNlck5hbWUgPyBgfCR7dXNlck5hbWV9YCA6ICcnfWA7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBIZWFkZXJUaGVtZXMgPSAnaXN6b2xlYSc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUhlYWRlck9wdGlvbnMge1xyXG4gICRlbDogSlF1ZXJ5O1xyXG4gIG1lbnVTZXR0aW5ncz86IElNZW51U2V0dGluZ3M7XHJcbiAgbG9nb1NldHRpbmdzPzogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuICBkaXNwbGF5U2VhcmNoPzogYm9vbGVhbjtcclxuICBpbW1lZGlhdGVSZW5kZXI/OiBib29sZWFuO1xyXG4gIHRoZW1lPzogSGVhZGVyVGhlbWVzO1xyXG4gIG9uSW5pdD86ICgpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJSGVhZGVyRWxlbWVudHMge1xyXG4gIHJlYWRvbmx5IHJvb3Q/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBsb2dvQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgY29udGVudENvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IHRvZ2dsZUJ1dHRvbkNvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IHRvZ2dsZUJ1dHRvbj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IG1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBtZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXI/OiBIVE1MRWxlbWVudDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElBamF4UGFnZU1hcmtlciB7XHJcbiAgaXNMb2FkZWRCeUFqYXg6IHRydWU7XHJcbiAgdXJsOiBzdHJpbmc7XHJcbiAgaXNNZW51U3dpdGNoZXJHbG9iYWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUVOVV9TV0lUQ0hFUl9JTklUSUFMSVpFRF9FVkVOVCA9ICdtZW51LXN3aXRjaGVyLWluaXRpYWxpemVkLWV2ZW50JztcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0xPQkFMX1VSTF9SRUdFWCA9IG5ldyBSZWdFeHAoJ14oPzpbYS16XSs6KT8vLycsICdpJyk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRE9DVFlQRV9NQVJLRVJfUkVHRVggPSBuZXcgUmVnRXhwKCchRE9DVFlQRSBodG1sPicsICdpJyk7XHJcblxyXG4gIHB1YmxpYyB1c2VyTWVudTogVXNlck1lbnUgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIG5hdmlnYXRpb25NZW51OiBOYXZpZ2F0aW9uTWVudSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgbWVudVN3aXRjaGVyOiBNZW51U3dpdGNoZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGxvZ286IExvZ28gfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGRhdGE6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGhlbWU6IEhlYWRlclRoZW1lcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnVTZXR0aW5nczogSU1lbnVTZXR0aW5ncyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlTZWFyY2g6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZFBhbmVsOiBEZXZFeHByZXNzLnVpLmR4TG9hZFBhbmVsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXI6IEpRdWVyeSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblBhcnRpYWxWaWV3TG9hZGVkOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBiZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmc6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZEhhbmRsZXIgPSB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtT3BlbmVkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlciA9IHRoaXMub25Vc2VyTWVudUl0ZW1DbGljay5iaW5kKHRoaXMpO1xyXG4gIHByaXZhdGUgc2VhcmNoOiBTZWFyY2ggfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIGVsZW1lbnRzXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkZWw6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRzOiBNdXRhYmxlPElIZWFkZXJFbGVtZW50cz4gPSB7fTtcclxuICBwcml2YXRlICRsb2FkQmFyOiBKUXVlcnkgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElIZWFkZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuJGVsID0gb3B0aW9ucy4kZWw7XHJcbiAgICB0aGlzLm1lbnVTZXR0aW5ncyA9IG9wdGlvbnMubWVudVNldHRpbmdzO1xyXG4gICAgdGhpcy5sb2dvU2V0dGluZ3MgPSBvcHRpb25zLmxvZ29TZXR0aW5ncztcclxuICAgIHRoaXMudGhlbWUgPSBvcHRpb25zLnRoZW1lIHx8ICdpc3pvbGVhJztcclxuICAgIHRoaXMuZGlzcGxheVNlYXJjaCA9IG9wdGlvbnMuZGlzcGxheVNlYXJjaDtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuXHJcbiAgICB0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LnBhcnRpYWxWaWV3UGxhY2VIb2xkZXI7XHJcbiAgICB0aGlzLnVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmcgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8udXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZztcclxuICAgIHRoaXMub25QYXJ0aWFsVmlld0xvYWRlZCA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5vblBhcnRpYWxWaWV3TG9hZGVkO1xyXG4gICAgdGhpcy5iZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmcgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8uYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nO1xyXG5cclxuICAgIHRoaXMubG9hZFBhbmVsID0gdGhpcy5jcmVhdGVMb2FkUGFuZWwoKTtcclxuXHJcbiAgICBpZiAob3B0aW9ucy5pbW1lZGlhdGVSZW5kZXIgPT09IGZhbHNlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBcXCdpbW1lZGlhdGVSZW5kZXIgPT09IGZhbHNlXFwnIG9wdGlvbiBpc25cXCd0IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50LicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vTk9URTogVG8gb3ZlcnJpZGUgYm9vdHN0cmFwIGhlYWRlciB6LWluZGV4IHdoaWNoIGlzIDE2MDBcclxuICAgIERldkV4cHJlc3MudWkuZHhPdmVybGF5LmJhc2VaSW5kZXgoMTcwMCk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgICAgIC50aGVuKCgpID0+IG9wdGlvbnM/Lm9uSW5pdD8uKCkpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlT25IaXN0b3J5UG9wU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEYXRhKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGVhckFwcE1lbnVNb2RlbENhY2hlKCk7XHJcbiAgICB0aGlzLmRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVyZW5kZXJNZW51cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIC8qKlxyXG4gICAgICogPFJvb3Q+XHJcbiAgICAgKiAgPEJyYW5kPlxyXG4gICAgICogICAgPExvZ28gLz5cclxuICAgICAqICA8L0JyYW5kPlxyXG4gICAgICogIDxDb250ZW50VG9nZ2xlciAvPlxyXG4gICAgICogIDxDb250ZW50PlxyXG4gICAgICogICAgPFNlYXJjaCAvPlxyXG4gICAgICogICAgPE5hdmlnYXRpb25NZW51IC8+XHJcbiAgICAgKiAgICA8VXNlck1lbnUgLz5cclxuICAgICAqICA8L0NvbnRlbnQ+XHJcbiAgICAgKiAgPE1lbnVTd2l0Y2hlciAvPlxyXG4gICAgICogPC9Sb290PlxyXG4gICAgICogPExvYWRCYXIgLz5cclxuICAgICAqL1xyXG5cclxuICAgIHRoaXMucmVuZGVyUm9vdCgpO1xyXG4gICAgdGhpcy5yZW5kZXJCcmFuZCgpO1xyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50VG9nZ2xlcigpO1xyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XHJcbiAgICB0aGlzLnJlbmRlckxvYWRCYXIoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVPbkhpc3RvcnlQb3BTdGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyKSB7XHJcbiAgICAgICQod2luZG93KS5iaW5kKCdwb3BzdGF0ZScsIChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBlLm9yaWdpbmFsRXZlbnQgYXMgUG9wU3RhdGVFdmVudDtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IGV2ZW50LnN0YXRlIGFzIElBamF4UGFnZU1hcmtlcjtcclxuICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaXNMb2FkZWRCeUFqYXgpIHtcclxuICAgICAgICAgIHRoaXMubG9hZFBhZ2VWaWFBamF4Q29yZShzdGF0ZS51cmwpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVNZW51U3dpdGNoZXJTdGF0ZShzdGF0ZS5pc01lbnVTd2l0Y2hlckdsb2JhbCk7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25NZW51LnVwZGF0ZUFjdGl2ZUl0ZW1zU3RhdGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTG9hZFBhbmVsKCk6IERldkV4cHJlc3MudWkuZHhMb2FkUGFuZWwge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keExvYWRQYW5lbCh7XHJcbiAgICAgIHNoYWRpbmdDb2xvcjogJ3JnYmEoMCwwLDAsMC40KScsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93SW5kaWNhdG9yOiB0cnVlLFxyXG4gICAgICBzaG93UGFuZTogdHJ1ZSxcclxuICAgICAgc2hhZGluZzogdHJ1ZSxcclxuICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICB9KS5hcHBlbmRUbyh0aGlzLiRlbCkuZHhMb2FkUGFuZWwoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QgPSB0aGlzLiRlbFswXTtcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdC5jbGFzc0xpc3QuYWRkKCdoZWFkZXInLCB0aGlzLnRoZW1lLCAnbmF2YmFyJywgJ25hdmJhci1kYXJrJywgYG5hdmJhci1leHBhbmQtJHt0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5uYW1lfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJCcmFuZCgpIHtcclxuICAgIGlmICh0aGlzLmxvZ28gfHwgIXRoaXMubG9nb1NldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJyYW5kRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGJyYW5kRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2JyYW5kJywgJ25hdmJhci1icmFuZCcpO1xyXG4gICAgYnJhbmRFbGVtZW50LmhyZWYgPSAnLyc7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQoYnJhbmRFbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIgPSBicmFuZEVsZW1lbnQ7XHJcblxyXG4gICAgdGhpcy5sb2dvID0gbmV3IExvZ28oJCh0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIpLCB0aGlzLmxvZ29TZXR0aW5ncyk7XHJcbiAgICB0aGlzLmxvZ28uaW5pdFdpZGdldCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJTZWFyY2goKSB7XHJcbiAgICBpZiAoIXRoaXMuZGlzcGxheVNlYXJjaCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2goe1xyXG4gICAgICAkY29udGFpbmVyOiAkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lciksXHJcbiAgICAgIGdldE1lbnVEYXRhU291cmNlOiAoKSA9PiB0aGlzLmdldFNlYXJjaERhdGFTb3VyY2UodGhpcy5kYXRhKSxcclxuICAgICAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IHRoaXMuZ2V0SXNHbG9iYWxNZW51U2hvd24oKSxcclxuICAgICAgb25EaW1lbnNpb25zQ2hhbmdlZDogKCkgPT4gdGhpcy5uYXZpZ2F0aW9uTWVudT8uYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpLFxyXG4gICAgICBvbk1lbnVJdGVtQ2xpY2s6IHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIsXHJcbiAgICAgIG9uTWVudUl0ZW1PcGVuZWQ6IHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWRIYW5kbGVyLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlYXJjaC5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNHbG9iYWxNZW51U2hvd24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1Nob3dHbG9iYWxNZW51KCkgfHwgIXRoaXMuZGF0YT8uQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWQoZTogSU9wZW5SZXBvcnRFdmVudEFyZ3MpIHtcclxuICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoZS5tZW51SXRlbS5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIudmFsdWUgIT09IGlzR2xvYmFsKSB7XHJcbiAgICAgIHRoaXMubWVudVN3aXRjaGVyLnNldFZhbHVlKGlzR2xvYmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudFRvZ2dsZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCduYXZiYXItdG9nZ2xlcicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdjb2xsYXBzZScpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcsICcuaGVhZGVyX19jb250ZW50Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0U2VhcmNoVGV4dCgnJyk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ25hdmJhci10b2dnbGVyLWljb24nKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX190b2dnbGUtYnV0dG9uLWNvbnRhaW5lcicpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLmFwcGVuZENoaWxkKGljb24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29sbGFwc2UnLCAnbmF2YmFyLWNvbGxhcHNlJywgJ2hlYWRlcl9fY29udGVudCcpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJTZWFyY2goKTtcclxuICAgIHRoaXMucmVuZGVyTmF2aWdhdGlvbk1lbnUoW10pO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlck1lbnUoW10pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYXZpZ2F0aW9uTWVudShtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxNZW51ID0gdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93bigpO1xyXG5cclxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25NZW51KSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlRGF0YShtZW51SXRlbU1vZGVscywgaXNHbG9iYWxNZW51KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUgPSBuZXcgTmF2aWdhdGlvbk1lbnUoXHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLFxyXG4gICAgICAgIG1lbnVJdGVtTW9kZWxzLFxyXG4gICAgICAgIGlzR2xvYmFsTWVudSxcclxuICAgICAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICB0aGlzLm9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm5hdmlnYXRpb25NZW51LnJlbmRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblVzZXJNZW51SXRlbUNsaWNrKGU6IFVzZXJNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIHRoaXMubWVudVNldHRpbmdzLm9uVXNlck1lbnVDbGljaz8uKGUpO1xyXG4gICAgaWYgKGUuY2FuY2VsIHx8IHRoaXMuaXNLZXlQcmVzc2VkKGUub3JpZ2luYWxFdmVudCBhcyBNb3VzZUV2ZW50KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXJsID0gZS5pdGVtLlVybDtcclxuXHJcbiAgICBpZiAoZS5pdGVtLkFsd2F5c1JlbG9hZFBhZ2UpIHtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlLmNhbmNlbCA9IHRoaXMudHJ5RG9QYXJ0aWFsUGFnZUxvYWRpbmcodXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpYWd0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLm1lbnVTZXR0aW5ncy5vbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrPy4oZSk7XHJcbiAgICBpZiAoZS5jYW5jZWwgfHwgdGhpcy5pc0tleVByZXNzZWQoZS5vcmlnaW5hbEV2ZW50IGFzIE1vdXNlRXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGUuaXRlbS5pc0dsb2JhbCk7XHJcblxyXG4gICAgY29uc3QgdXJsID0gZ2V0VXJsQnlNZW51SXRlbURhdGEoZS5pdGVtKTtcclxuICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0tleVByZXNzZWQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudCAmJiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIgJiYgdXJsICYmIHRoaXMuY2hlY2tJc0xvY2FsVXJsKHVybCkpIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZykge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlOiBJQWpheFBhZ2VNYXJrZXIgPSB7XHJcbiAgICAgICAgICBpc0xvYWRlZEJ5QWpheDogdHJ1ZSxcclxuICAgICAgICAgIGlzTWVudVN3aXRjaGVyR2xvYmFsOiAhIXRoaXMubWVudVN3aXRjaGVyPy52YWx1ZSxcclxuICAgICAgICAgIHVybFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgbnVsbCwgdXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2FkUGFnZVZpYUFqYXhDb3JlKHVybCk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpO1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzTG9jYWxVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAhSGVhZGVyLkdMT0JBTF9VUkxfUkVHRVgudGVzdCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGNvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGNvbnRlbnQgJiYgIUhlYWRlci5ET0NUWVBFX01BUktFUl9SRUdFWC50ZXN0KGNvbnRlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkUGFnZVZpYUFqYXhDb3JlKHVybDogc3RyaW5nKSB7XHJcbiAgICB3aW5kb3cuaXNJc296U2VydmVyRXhjZXB0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5sb2FkUGFuZWwuc2hvdygpO1xyXG5cclxuICAgIGNvbnN0IHVybEZvclBhcnRpYWxMb2FkaW5nID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgdXJsKTtcclxuICAgIHVybEZvclBhcnRpYWxMb2FkaW5nLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2lzb3pQYXJ0aWFsTG9hZGluZycsICd0cnVlJyk7XHJcbiAgICBjb25zdCBwYXJ0aWFsVXJsID0gdXJsRm9yUGFydGlhbExvYWRpbmcudG9TdHJpbmcoKTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZz8uKCk7XHJcblxyXG4gICAgJC5hamF4KHBhcnRpYWxVcmwsIHsgZGF0YVR5cGU6ICdodG1sJyB9KS5hbHdheXMoKGRhdGEsIHRleHRTdGF0dXMpID0+IHtcclxuICAgICAgaWYgKHRleHRTdGF0dXMgIT09ICdzdWNjZXNzJyB8fCAhdGhpcy5jaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGRhdGEpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlci5odG1sKGRhdGEpO1xyXG4gICAgICAgIHRoaXMub25QYXJ0aWFsVmlld0xvYWRlZD8uKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkUGFuZWwuaGlkZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVXNlck1lbnUoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzPy51c2VyTmFtZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMudXNlck1lbnUpIHtcclxuICAgICAgY29uc3QgZGl2aWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBkaXZpZGVyLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWRpdmlkZXInKTtcclxuICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGRpdmlkZXIpO1xyXG5cclxuICAgICAgdGhpcy51c2VyTWVudSA9IG5ldyBVc2VyTWVudSh7XHJcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIsXHJcbiAgICAgICAgdXNlck5hbWU6IHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lLFxyXG4gICAgICAgIHVzZXJBdmF0YXI6IHRoaXMubWVudVNldHRpbmdzLnVzZXJBdmF0YXIsXHJcbiAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgY29sbGFwc2VCcmVha3BvaW50OiB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICBvbkl0ZW1DbGljazogdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlcixcclxuICAgICAgICBnZXREaXNwbGF5ZWRVc2VySW5mbzogdGhpcy5tZW51U2V0dGluZ3MuZ2V0RGlzcGxheWVkVXNlckluZm9cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudXNlck1lbnUucmVuZGVyKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZXJNZW51LnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTWVudVN3aXRjaGVyKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGE/LkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIpIHtcclxuICAgICAgaWYgKHRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgICAgdGhpcy5tZW51U3dpdGNoZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXI/LnJlbW92ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCd0b2dnbGVCdXR0b25Db250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtZW51LXN3aXRjaGVyJyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21lbnUtc3dpdGNoZXInKTtcclxuXHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IG5ldyBNZW51U3dpdGNoZXIoe1xyXG4gICAgICBkZXNrdG9wQ29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIsXHJcbiAgICAgIG1vYmlsZUNvbnRhaW5lcjogdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIsXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludDogdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQsXHJcbiAgICAgIHN0YXJ0VmFsdWU6IHRoaXMuaXNTaG93R2xvYmFsTWVudSgpLFxyXG4gICAgICBvblN3aXRjaDogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNIT1dfR0xPQkFMX01FTlVfS0VZLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG5cclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmdldE5hdmlnYXRpb25JdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoPy5zZXRTZWFyY2hUZXh0KCcnKTtcclxuICAgICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJOYXZpZ2F0aW9uTWVudShuYXZpZ2F0aW9uSXRlbXMgfHwgW10pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tZW51U3dpdGNoZXIucmVuZGVyKCk7XHJcbiAgICB0aGlzLmVtaXQoSGVhZGVyLk1FTlVfU1dJVENIRVJfSU5JVElBTElaRURfRVZFTlQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLCB0aGlzLnVzZXJNZW51Py5yb290KTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciwgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMb2FkQmFyKCkge1xyXG4gICAgdGhpcy4kbG9hZEJhciA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9hZC1iYXInKS5oaWRlKCkuYXBwZW5kVG8odGhpcy4kZWwpO1xyXG5cclxuICAgIGNvbnN0ICRsb2FkID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2FkJykuYXBwZW5kVG8odGhpcy4kbG9hZEJhcik7XHJcbiAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2JhcicpLmFwcGVuZFRvKCRsb2FkKTtcclxuXHJcbiAgICBmdW5jdGlvbiByb3RhdGUoc2VsZWN0b3I6IHN0cmluZykge1xyXG4gICAgICAkKHNlbGVjdG9yKS5hbmltYXRlKHsgbGVmdDogJCgnLmxvYWQnKS53aWR0aCgpIH0sIDIwMDAsICgpID0+IHtcclxuICAgICAgICAkKHNlbGVjdG9yKS5jc3MoJ2xlZnQnLCBgJHstJChzZWxlY3Rvcikud2lkdGgoKSF9cHhgKTtcclxuICAgICAgICByb3RhdGUoc2VsZWN0b3IpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByb3RhdGUoJy5iYXInKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVyZW5kZXJNZW51cygpIHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCB1c2VySXRlbXMgPSB0aGlzLmdldFVzZXJJdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgLy8gSWYgaXRlbXMgYXJlIHVuZGVmaW5lZCB3ZSBkb24ndCB1cGRhdGUgbWVudXNcclxuICAgIG5hdmlnYXRpb25JdGVtcyAmJiB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyk7XHJcbiAgICB1c2VySXRlbXMgJiYgdGhpcy5yZW5kZXJVc2VyTWVudSh1c2VySXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyICYmICF0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmF2aWdhdGlvbkl0ZW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uSXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IHVzZXJJdGVtcyA9IHRoaXMuZ2V0VXNlckl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCBpc1Zpc2libGUgPSAobmF2aWdhdGlvbkl0ZW1zICYmIG5hdmlnYXRpb25JdGVtcy5sZW5ndGggPiAwKVxyXG4gICAgICB8fCB0aGlzLm1lbnVTZXR0aW5ncz8udXNlck5hbWVcclxuICAgICAgfHwgKHVzZXJJdGVtcyAmJiB1c2VySXRlbXMubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2g/LnNldFZpc2libGUoISFpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcmVuZGVyTWVudXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZERhdGEoKTogUHJvbWlzZTxJQXBwTWVudU1vZGVsIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGhlYWRlciBkb2VzblxcJ3QgaGF2ZSBtZW51IHNldHRpbmdzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLm1lbnVTZXR0aW5ncy5kYXRhICE9PSAnc3RyaW5nJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5tZW51U2V0dGluZ3MuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0Q2FjaGVkQXBwTWVudU1vZGVsKCk7XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuJGxvYWRCYXI/LnNob3coKTtcclxuICAgICAgZGF0YSA9IGF3YWl0IHNlbmRSZXF1ZXN0PElBcHBNZW51TW9kZWw+KHRoaXMubWVudVNldHRpbmdzLmRhdGEpO1xyXG4gICAgICB0aGlzLmNhY2hlQXBwTWVudU1vZGVsKGRhdGEpO1xyXG4gICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcblxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRWaXNpYmxlKHRydWUpO1xyXG4gICAgICB0aGlzLiRsb2FkQmFyPy5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25JdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2hvd0dsb2JhbE1lbnUgPSB0aGlzLmlzU2hvd0dsb2JhbE1lbnUoKTtcclxuXHJcbiAgICByZXR1cm4gc2hvd0dsb2JhbE1lbnUgfHwgIWFwcE1lbnVNb2RlbC5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyXHJcbiAgICAgID8gYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtc1xyXG4gICAgICA6IGFwcE1lbnVNb2RlbC5QZXJzb25hbE5hdmlnYXRpb25JdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2VhcmNoRGF0YVNvdXJjZShhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpOiBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgICBpZiAoIWFwcE1lbnVNb2RlbCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGdsb2FiYWxJdGVtczogYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtcyxcclxuICAgICAgcGVyc29uYWxJdGVtczogYXBwTWVudU1vZGVsLkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIgPyBhcHBNZW51TW9kZWwuUGVyc29uYWxOYXZpZ2F0aW9uSXRlbXMgOiB1bmRlZmluZWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFVzZXJJdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFwcE1lbnVNb2RlbC5Vc2VySXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENhY2hlZEFwcE1lbnVNb2RlbCgpOiBJQXBwTWVudU1vZGVsIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhd1ZhbHVlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQodGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUpKTtcclxuXHJcbiAgICByZXR1cm4gcmF3VmFsdWUgPT09IG51bGwgPyByYXdWYWx1ZSA6IEpTT04ucGFyc2UocmF3VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWNoZUFwcE1lbnVNb2RlbChkYXRhOiBJQXBwTWVudU1vZGVsKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJBcHBNZW51TW9kZWxDYWNoZSgpIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGdldERhdGFTb3VyY2VDYWNoZUZpZWxkKHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lKSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzU2hvd0dsb2JhbE1lbnUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByYXdJc0dsb2JhbCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTSE9XX0dMT0JBTF9NRU5VX0tFWSk7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHJhd0lzR2xvYmFsID09PSBudWxsID8gcmF3SXNHbG9iYWwgYXMgbnVsbCA6IEpTT04ucGFyc2UocmF3SXNHbG9iYWwpIGFzIGJvb2xlYW47XHJcblxyXG4gICAgcmV0dXJuIGlzR2xvYmFsID09PSBudWxsIHx8IGlzR2xvYmFsO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgZ3JpZENvbHVtblR5cGVzID0gWydkZWZhdWx0JywgJ3N0cmluZycsICdudW1iZXInLCAnZGF0ZScsICdib29sZWFuJywgJ29iamVjdCcsICdkYXRldGltZSddO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ3JpZENvbHVtblR5cGVzO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gQ2RtSW1wb3J0RmlsZU1vZGUge1xyXG4gIE5vbmUgPSAwLFxyXG4gIEFkZE5ld1Jvd3MgPSAxLFxyXG4gIFJlcGxhY2VBbGxSb3dzID0gMixcclxufVxyXG4iLCAiXHVGRUZGXHJcbmV4cG9ydCBlbnVtIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUge1xyXG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXHJcbiAgU3RyaW5nID0gJ3N0cmluZycsXHJcbiAgTnVtYmVyID0gJ251bWJlcicsXHJcbiAgRGF0ZSA9ICdkYXRlJyxcclxuICBCb29sZWFuID0gJ2Jvb2xlYW4nLFxyXG4gIE9iamVjdCA9ICdvYmplY3QnLFxyXG4gIERhdGV0aW1lID0gJ2RhdGV0aW1lJ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQ29sdW1uU3RhdGUge1xyXG4gIGRhdGFGaWVsZDogc3RyaW5nO1xyXG4gIGRhdGFUeXBlOiBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlO1xyXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGdyb3VwSW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydEluZGV4PzogbnVtYmVyO1xyXG4gIHNvcnRPcmRlcj86IG51bWJlcjtcclxuICB2aXNpYmxlPzogYm9vbGVhbjtcclxuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUge1xyXG4gIGNhcHRpb24/OiBzdHJpbmc7XHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUgZXh0ZW5kcyBJR3JpZENvbHVtblN0YXRlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZSB7XHJcbiAgY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW107XHJcbn1cclxuIiwgImNvbnN0IGxvYWRlZFVybHM6IHN0cmluZ1tdID0gW11cclxuXHJcbmZ1bmN0aW9uIHJhbmRvbUludGVnZXIobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93ICgkY29udGFpbmVyOiBKUXVlcnksIGltYWdlVXJsczogc3RyaW5nW10sIGltZ0NoYW5nZUludGVydmFsU2VjOiBudW1iZXIgPSA1LCB0cmFuc2l0aW9uVGltZVNlYzogbnVtYmVyID0gMikge1xyXG4gIC8vIFNodWZmbGUgdXJsc1xyXG4gIGNvbnN0IHNodWZmbGVkVXJscyA9IGltYWdlVXJscy5zb3J0KChhLCBiKSA9PiAwLjUgLSBNYXRoLnJhbmRvbSgpKTtcclxuXHJcbiAgJGNvbnRhaW5lci5hZGRDbGFzcygnaXN6b2xlYS1iYWNrZ3JvdW5kLWltYWdlLXZpZXdlcicpLmNzcyh7XHJcbiAgICAndHJhbnNpdGlvbic6IGBiYWNrZ3JvdW5kLWltYWdlICR7dHJhbnNpdGlvblRpbWVTZWN9cyBlYXNlLWluLW91dCAwc2AsXHJcbiAgfSk7XHJcblxyXG4gIHNodWZmbGVkVXJscy5mb3JFYWNoKCh1cmwsIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcclxuICAgICAgbG9hZGVkVXJscy5wdXNoKHVybCk7XHJcblxyXG4gICAgICBpZihsb2FkZWRVcmxzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGluaXRJbWFnZXNDaGFuZ2luZygkY29udGFpbmVyLCBpbWdDaGFuZ2VJbnRlcnZhbFNlYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaW1nLnNyYyA9IHVybDtcclxuICAgIH0sIGluZGV4ICogMTAwKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TmV4dEluZGV4VG9TaG93IChjdXJyZW50SW5kZXg6IG51bWJlcikge1xyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAyKSB7XHJcbiAgICByZXR1cm4gY3VycmVudEluZGV4ID09PSAwID8gMSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXh0SW5kZXggPSByYW5kb21JbnRlZ2VyKDAsIGxvYWRlZFVybHMubGVuZ3RoIC0gMSk7XHJcblxyXG4gIGlmKG5leHRJbmRleCA9PT0gY3VycmVudEluZGV4KSB7XHJcbiAgICByZXR1cm4gbmV4dEluZGV4ID09PSBsb2FkZWRVcmxzLmxlbmd0aCAtIDEgPyAwIDogbmV4dEluZGV4ICsgMTtcclxuICB9XHJcblxyXG4gIHJldHVybiBuZXh0SW5kZXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRJbWFnZXNDaGFuZ2luZyAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbWdDaGFuZ2VJbnRlcnZhbFNlYzogbnVtYmVyKSB7XHJcbiAgbGV0IGN1cnJlbnRTaG93bkluZGV4ID0gMDtcclxuXHJcbiAgc2hvd0ltYWdlKCRjb250YWluZXIsIGN1cnJlbnRTaG93bkluZGV4KTtcclxuXHJcbiAgd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50U2hvd25JbmRleCA9IGdldE5leHRJbmRleFRvU2hvdyhjdXJyZW50U2hvd25JbmRleCk7XHJcbiAgICBzaG93SW1hZ2UoJGNvbnRhaW5lciwgY3VycmVudFNob3duSW5kZXgpO1xyXG4gIH0sIGltZ0NoYW5nZUludGVydmFsU2VjICogMTAwMCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dJbWFnZSAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgJGNvbnRhaW5lci5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnLCBgdXJsKFwiJHtsb2FkZWRVcmxzW2luZGV4XX1cIilgKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxpY2VuY2UgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcblxyXG5leHBvcnQgZW51bSBGb290ZXJJbmRpY2F0b3JTdGF0dXMge1xyXG4gIFN1Y2Nlc3MsXHJcbiAgV2FybmluZyxcclxuICBFcnJvclxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGb290ZXJJbmRpY2F0b3JWYWx1ZSB7XHJcbiAgc3RhdHVzOiBGb290ZXJJbmRpY2F0b3JTdGF0dXM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3RlckluZGljYXRvck9wdGlvbnMge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZTtcclxuICBnZXRWYWx1ZT86ICgpID0+IFByb21pc2U8SUZvb3RlckluZGljYXRvclZhbHVlPjtcclxuICBnZXRWYWx1ZUludGVydmFsTXM/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3Rlck9wdGlvbnMge1xyXG4gICRyb290OiBKUXVlcnk7XHJcbiAgbmFtZTogc3RyaW5nIHwgZmFsc2U7XHJcbiAgbGljZW5jZTogSUxpY2VuY2UgfCBmYWxzZTtcclxuICB5ZWFyPzogbnVtYmVyIHwgJ2xvY2FsJyB8IGZhbHNlO1xyXG4gIHZlcnNpb24/OiBzdHJpbmc7XHJcbiAgc2VydmVyTmFtZT86IHN0cmluZztcclxuICBkYXRhYmFzZT86IHN0cmluZztcclxuICBpbmRpY2F0b3JzPzogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8SUZvb3Rlck9wdGlvbnM+ID0ge1xyXG4gIHllYXI6ICdsb2NhbCdcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvb3RlciB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q3VycmVudFllYXIoY3VycmVudFllYXI6IG51bWJlciB8ICdsb2NhbCcgfCBmYWxzZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gY3VycmVudFllYXIgPT09ICdsb2NhbCcgfHwgY3VycmVudFllYXIgPT09IGZhbHNlXHJcbiAgICAgID8gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpXHJcbiAgICAgIDogY3VycmVudFllYXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290OiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0ZWRUbzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd05hbWU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaWNlbmNlOiBJTGljZW5jZSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dMaWNlbmNlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgeWVhcjogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd1llYXI6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93Q29ubmVjdGVkVG86IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzT3B0aW9uczogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNCeU5hbWU6IE1hcDxzdHJpbmcsIEpRdWVyeT47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JDbGFzc0J5U3RhdHVzID0gbmV3IE1hcDxGb290ZXJJbmRpY2F0b3JTdGF0dXMsIHN0cmluZz4oW1xyXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5TdWNjZXNzLCAnZm9vdGVyX19pbmRpY2F0b3JfdHlwZV9zdWNjZXNzJ10sXHJcbiAgICBbRm9vdGVySW5kaWNhdG9yU3RhdHVzLldhcm5pbmcsICdmb290ZXJfX2luZGljYXRvcl90eXBlX3dhcm5pbmcnXSxcclxuICAgIFtGb290ZXJJbmRpY2F0b3JTdGF0dXMuRXJyb3IsICdmb290ZXJfX2luZGljYXRvcl90eXBlX2Vycm9yJ11cclxuICBdKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZvb3Rlck9wdGlvbnMpIHtcclxuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLmRlZmF1bHRPcHRpb25zIH0gYXMgUmVxdWlyZWQ8SUZvb3Rlck9wdGlvbnM+O1xyXG5cclxuICAgIHRoaXMuJHJvb3QgPSBtZXJnZWRPcHRpb25zLiRyb290O1xyXG4gICAgdGhpcy5uYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZSA/IG1lcmdlZE9wdGlvbnMubmFtZSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubGljZW5jZSA9IG1lcmdlZE9wdGlvbnMubGljZW5jZSAhPT0gZmFsc2UgPyBtZXJnZWRPcHRpb25zLmxpY2VuY2UgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnllYXIgPSBGb290ZXIuZ2V0Q3VycmVudFllYXIobWVyZ2VkT3B0aW9ucy55ZWFyKTtcclxuICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiB8fCB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5zaG93TmFtZSA9IG1lcmdlZE9wdGlvbnMubmFtZSAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dMaWNlbmNlID0gbWVyZ2VkT3B0aW9ucy5saWNlbmNlICE9PSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1llYXIgPSBtZXJnZWRPcHRpb25zLnllYXIgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gPSAhIW1lcmdlZE9wdGlvbnMuc2VydmVyTmFtZSAmJiAhIW1lcmdlZE9wdGlvbnMuZGF0YWJhc2U7XHJcbiAgICB0aGlzLmluZGljYXRvcnNPcHRpb25zID0gb3B0aW9ucy5pbmRpY2F0b3JzIHx8IFtdO1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIEpRdWVyeT4oKTtcclxuXHJcbiAgICB0aGlzLmNvbm5lY3RlZFRvID0gdGhpcy5zaG93Q29ubmVjdGVkVG8gPyBgJHttZXJnZWRPcHRpb25zLnNlcnZlck5hbWV9IC0gJHttZXJnZWRPcHRpb25zLmRhdGFiYXNlfWAgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMuJHJvb3QuYWRkQ2xhc3MoJ2Zvb3RlcicpO1xyXG5cclxuICAgIHRoaXMucmVuZGVySW5kaWNhdG9ycygpO1xyXG4gICAgdGhpcy5yZW5kZXJDb3B5cmlnaHQoKTtcclxuICAgIHRoaXMuc2hvd1llYXIgJiYgdGhpcy5yZW5kZXJZZWFyKCk7XHJcbiAgICB0aGlzLnNob3dOYW1lICYmIHRoaXMucmVuZGVyTmFtZSgpO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gJiYgdGhpcy5yZW5kZXJDb25uZWN0ZWRUbygpO1xyXG4gICAgdGhpcy5zaG93TGljZW5jZSAmJiB0aGlzLnJlbmRlckxpY2VuY2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbmRpY2F0b3JWYWx1ZShpbmRpY2F0b3JOYW1lOiBzdHJpbmcsIHZhbHVlOiBJRm9vdGVySW5kaWNhdG9yVmFsdWUpIHtcclxuICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9IHRoaXMuaW5kaWNhdG9yc0J5TmFtZS5nZXQoaW5kaWNhdG9yTmFtZSk7XHJcbiAgICBpZiAoJGluZGljYXRvckVsKSB7XHJcbiAgICAgIHRoaXMuc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJJbmRpY2F0b3JzKCkge1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzT3B0aW9ucz8uZm9yRWFjaCgobykgPT4ge1xyXG4gICAgICBpZiAoby50ZXh0KSB7XHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pbmRpY2F0b3ItdGV4dCcpXHJcbiAgICAgICAgICAuaHRtbChgJHtvLnRleHR9OmApXHJcbiAgICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9ICQoJzxzcGFuPicpXHJcbiAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2luZGljYXRvcicpXHJcbiAgICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG5cclxuICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCBvLnZhbHVlKTtcclxuICAgICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lLnNldChvLm5hbWUsICRpbmRpY2F0b3JFbCk7XHJcblxyXG4gICAgICBpZiAoby5nZXRWYWx1ZSAmJiBvLmdldFZhbHVlSW50ZXJ2YWxNcykge1xyXG4gICAgICAgIHNldEludGVydmFsKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgby5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCB2YWx1ZSk7XHJcbiAgICAgICAgfSwgby5nZXRWYWx1ZUludGVydmFsTXMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbDogSlF1ZXJ5LCB2YWx1ZTogSUZvb3RlckluZGljYXRvclZhbHVlKSB7XHJcbiAgICAkaW5kaWNhdG9yRWwuYXR0cigndGl0bGUnLCB2YWx1ZS50aXRsZSk7XHJcbiAgICAkaW5kaWNhdG9yRWwucmVtb3ZlQ2xhc3MoWy4uLnRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy52YWx1ZXMoKV0pO1xyXG4gICAgJGluZGljYXRvckVsLmFkZENsYXNzKHRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy5nZXQodmFsdWUuc3RhdHVzKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvcHlyaWdodCgpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb3B5cmlnaHQnKVxyXG4gICAgICAuaHRtbCgnJmNvcHk7JylcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYW1lKCkge1xyXG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2FwcC1uYW1lJylcclxuICAgICAgLnRleHQodGhpcy5uYW1lICsgKCEhdGhpcy52ZXJzaW9uID8gYDogJHt0aGlzLnZlcnNpb259YCA6ICcnKSlcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb25uZWN0ZWRUbygpIHtcclxuICAgIHRoaXMubmFtZSAmJiAkKCc8c3Bhbj4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faXRlbScpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb25uZWN0ZWQtdG8nKVxyXG4gICAgICAudGV4dChgQ29ubmVjdGVkIHRvOiAke3RoaXMuY29ubmVjdGVkVG99LmApXHJcbiAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyWWVhcigpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2N1cnJlbnQteWVhcicpXHJcbiAgICAgIC50ZXh0KHRoaXMueWVhcilcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMaWNlbmNlKCkge1xyXG4gICAgdGhpcy5saWNlbmNlICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtaW5mbycpXHJcbiAgICAgIC5hcHBlbmQoXHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19saWNlbmNlLW93bmVyJylcclxuICAgICAgICAgIC50ZXh0KGAke3RoaXMuZ2V0TGljZW5jZU93bmVyRGlzcGxheVRleHQodGhpcy5saWNlbmNlKX0uIGApXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtZGF0ZScpXHJcbiAgICAgICAgICAudGV4dCh0aGlzLmdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KHRoaXMubGljZW5jZSkpXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMaWNlbmNlT3duZXJEaXNwbGF5VGV4dChsaWNlbmNlOiBJTGljZW5jZSkge1xyXG4gICAgcmV0dXJuIGBMaWNlbmNlZCB0bzogJHtsaWNlbmNlLk93bmVyfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KGxpY2VuY2U6IElMaWNlbmNlKSB7XHJcbiAgICBjb25zdCBkYXRlID0gdHlwZW9mIGxpY2VuY2UuRXhwaXJhdGlvbkRhdGUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUobGljZW5jZS5FeHBpcmF0aW9uRGF0ZSkgOiBsaWNlbmNlLkV4cGlyYXRpb25EYXRlO1xyXG5cclxuICAgIHJldHVybiBgTGljZW5jZSBFeHBpcnk6ICR7ZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKX1gO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGbGV0IHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuY29uc3QgcmVzaXplSGFuZGxlcnMgPSBbXTtcclxuXHJcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XHJcbiAgaWYgKHJlcGFpbnRUaW1lb3V0KSB7XHJcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHJlcGFpbnRUaW1lb3V0KTtcclxuICB9XHJcblxyXG4gIHJlcGFpbnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgcmVzaXplSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcigpKTtcclxuICAgIHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuICB9LCAxMDApO1xyXG59KTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uUmVzaXplOiAoKSA9PiB2b2lkKSB7XHJcbiAgcmVzaXplSGFuZGxlcnMucHVzaChvblJlc2l6ZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBhdXRvUmVzaXplIGZyb20gJy4vQXV0b1Jlc2l6ZSc7XHJcblxyXG5jb25zdCBDU1MgPSB7XHJcbiAgbWFpbjogJy5tYWluJyxcclxuICBoZWFkZXI6ICcubWFpbiAuaGVhZGVyJyxcclxuICBjb250ZW50OiAnLmNvbnRlbnQtYXJlYScsXHJcbiAgcGFuZWw6ICcucGFuZWwnLFxyXG4gIGZvb3RlcjogJ2Zvb3RlcidcclxufTtcclxuXHJcbmxldCBsYXN0V2luZG93SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RDb250ZW50SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RXaWRnZXRIZWlnaHQgPSBudWxsO1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlSGVpZ2h0KHdpZGdldCkge1xyXG4gIGNvbnN0ICRjb250ZW50ID0gJChDU1MuY29udGVudCk7XHJcblxyXG4gICRjb250ZW50LmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4sIGlnbm9yZVNpYmxpbmdzOiBib29sZWFuID0gZmFsc2UsIGFkZE93blNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gIGNvbnN0ICRtYWluID0gJChDU1MubWFpbik7XHJcbiAgY29uc3QgJGhlYWRlciA9ICQoQ1NTLmhlYWRlcik7XHJcbiAgY29uc3QgJGNvbnRlbnQgPSAkKENTUy5jb250ZW50KTtcclxuICBjb25zdCAkZm9vdGVyID0gJChDU1MuZm9vdGVyKTtcclxuXHJcbiAgY29uc3QgcGFkZGluZ3MgPSAkY29udGVudC5vdXRlckhlaWdodCgpIC0gJGNvbnRlbnQuaGVpZ2h0KCk7XHJcblxyXG4gIGxhc3RDb250ZW50SGVpZ2h0ID0gJG1haW4uaGVpZ2h0KCkgLSAkaGVhZGVyLmhlaWdodCgpIC0gJGZvb3Rlci5vdXRlckhlaWdodCgpIC0gcGFkZGluZ3M7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuXHJcbiAgY29uc3QgJGNvbnRlbnRFbGVtZW50cyA9ICRjb250ZW50LmNoaWxkcmVuKCk7XHJcbiAgbGV0IGNvbnRlbnRFbGVtZW50c0hlaWdodCA9IDA7XHJcblxyXG4gIGlmICghaWdub3JlU2libGluZ3MpIHtcclxuICAgIGNvbnN0ICR3aWRnZXRFbGVtZW50ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICAgICRjb250ZW50RWxlbWVudHMuZWFjaCgoaW5kZXgsIGVsKSA9PiB7XHJcbiAgICAgIGNvbnN0ICRjaGlsZCA9ICQoZWwpO1xyXG5cclxuICAgICAgaWYgKCRjaGlsZC5pcygkd2lkZ2V0RWxlbWVudCkgfHwgJGNoaWxkLmhhcygkd2lkZ2V0RWxlbWVudFswXSkubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb250ZW50RWxlbWVudHNIZWlnaHQgKz0gKCRjaGlsZC5pcygnOnZpc2libGUnKSAmJiAkY2hpbGQuY3NzKCdwb3NpdGlvbicpICE9PSAnYWJzb2x1dGUnKSA/ICRjaGlsZC5vdXRlckhlaWdodCh0cnVlKSA6IDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxhc3RXaWRnZXRIZWlnaHQgPSBsYXN0Q29udGVudEhlaWdodCAtIGNvbnRlbnRFbGVtZW50c0hlaWdodDtcclxuXHJcbiAgaWYgKGFkZE93blNpemUpIHtcclxuICAgIGxhc3RXaWRnZXRIZWlnaHQgKz0gd2lkZ2V0LmVsZW1lbnQoKS5vdXRlckhlaWdodCgpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55Pikge1xyXG4gIGNvbnN0IHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuICBjb25zdCBkaWZmID0gd2luZG93SGVpZ2h0IC0gbGFzdFdpbmRvd0hlaWdodDtcclxuXHJcbiAgbGFzdENvbnRlbnRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2lkZ2V0SGVpZ2h0ICs9IGRpZmY7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9IHdpbmRvd0hlaWdodDtcclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55PiwgaWdub3JlU2libGluZ3M6IGJvb2xlYW4gPSBmYWxzZSwgYWRkT3duU2l6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCwgaWdub3JlU2libGluZ3MsIGFkZE93blNpemUpO1xyXG5cclxuICBhdXRvUmVzaXplKCgpID0+IHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZjb25zdCBESVNBQkxFRF9DTEFTUyA9ICdpc296LWljb24tZGlzYWJsZWQnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRIRU1FX0NMQVNTRVMgPSB7XHJcbiAgbGc6ICdpc3pvbGVhLWxnJyxcclxuICBtZDogJ2lzem9sZWEtbWQnLFxyXG4gIHNtOiAnaXN6b2xlYS1zbSdcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaGVtZUhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50TWlkZGxlU2l6ZShlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KSB7XHJcbiAgICBlbGVtZW50LmFkZENsYXNzKFRIRU1FX0NMQVNTRVMubWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50U21hbGxTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcclxuICAgIGVsZW1lbnQuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5zbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldE1pZGRsZVNpemUoaW5zdGFuY2U6IGFueSkge1xyXG4gICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U2l6ZShpbnN0YW5jZSwgVEhFTUVfQ0xBU1NFUy5tZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldFNtYWxsU2l6ZShpbnN0YW5jZTogYW55KSB7XHJcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLnNtKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SWNvbkNsYXNzKGljb246IHN0cmluZywgZGlzYWJsZWQ/OiBib29sZWFuLCBzaXplOiAxNiB8IDI0ID0gMTYpIHtcclxuICAgIGNvbnN0IGljb25DbGFzcyA9IGBpc296IGlzb3otaWNvbi0ke2ljb259LSR7c2l6ZX1gO1xyXG5cclxuICAgIHJldHVybiAhZGlzYWJsZWRcclxuICAgICAgPyBpY29uQ2xhc3NcclxuICAgICAgOiBgJHtpY29uQ2xhc3N9ICR7RElTQUJMRURfQ0xBU1N9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHNldFdpZGdldFNpemUoaW5zdGFuY2U6IGFueSwgc2l6ZUNsYXNzOiBzdHJpbmcpIHtcclxuICAgIGlmIChpbnN0YW5jZSkge1xyXG4gICAgICBpbnN0YW5jZS5vcHRpb24oJ2VsZW1lbnRBdHRyJywgeyBjbGFzczogc2l6ZUNsYXNzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgQ0xBU1NFUyA9IHtcclxuICB0aXRsZTogJ2lzb3otdGl0bGUnXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgVG9vbGJhckhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBnZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0odGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRlbCA9ICQoYDxzcGFuIGNsYXNzPVwiJHtDTEFTU0VTLnRpdGxlfVwiPiR7dGl0bGV9PC9zcGFuPmApO1xyXG5cclxuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICRlbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdSZXBvcnQgZGV0YWlscycpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAkZWw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBUSEVNRV9DTEFTU0VTIH0gZnJvbSAnLi4vSGVscGVycy9UaGVtZSc7XHJcbmltcG9ydCB7IFRvb2xiYXJIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXJzL1Rvb2xiYXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVG9vbGJhclNldHRpbmcge1xyXG4gIG9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IENMQVNTRVMgPSB7XHJcbiAgdGl0bGU6ICdpc296LXRpdGxlJyxcclxuICBoZWFkZXI6ICdpc296LXRvb2xiYXItaGVhZGVyJyxcclxuICBkcm9wRG93bkJ1dHRvbjogJ2R4LWRyb3Bkb3dubWVudS1idXR0b24nXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcjogc3RyaW5nLCBzZXR0aW5nczogSVRvb2xiYXJTZXR0aW5nID0geyB0aXRsZTogJycsIGRlc2NyaXB0aW9uOiAnJywgb3B0aW9uczoge30gfSk6XHJcbiAgRGV2RXhwcmVzcy51aS5keFRvb2xiYXIge1xyXG4gIGNvbnN0IHtcclxuICAgIHRpdGxlID0gJycsXHJcbiAgICBkZXNjcmlwdGlvbiA9ICcnLFxyXG4gICAgb3B0aW9ucyA9IHt9LFxyXG4gIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCB7XHJcbiAgICBpdGVtcyA9IFtdLFxyXG4gICAgZWxlbWVudEF0dHIgPSB7fVxyXG4gIH0gPSBvcHRpb25zO1xyXG5cclxuICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICBjb25zdCBtaWRsZGVTaXplRWxlbWVudEF0dHIgPSB7IGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kIH07XHJcblxyXG4gICAgaWYgKGl0ZW0ub3B0aW9ucykge1xyXG4gICAgICBsZXQgeyBlZGl0b3JPcHRpb25zIH0gPSBpdGVtLm9wdGlvbnM7XHJcblxyXG4gICAgICBpZiAoIWVkaXRvck9wdGlvbnMpIHtcclxuICAgICAgICBlZGl0b3JPcHRpb25zID0ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGVkaXRvck9wdGlvbnMuZWxlbWVudEF0dHIgPSBtaWRsZGVTaXplRWxlbWVudEF0dHI7XHJcbiAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcclxuICAgICAgaXRlbS5vcHRpb25zLmVkaXRvck90aW9ucyA9IGVkaXRvck9wdGlvbnM7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gKGUpID0+IHtcclxuICAgIGUuZWxlbWVudFxyXG4gICAgICAuZmluZChgLiR7Q0xBU1NFUy5kcm9wRG93bkJ1dHRvbn1gKVxyXG4gICAgICAuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5tZCk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgIG9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuICQoYCR7c2VsZWN0b3J9YClcclxuICAgIC5keFRvb2xiYXIoe1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHRpdGxlLCBkZXNjcmlwdGlvbiksXHJcbiAgICAgICAgLi4uaXRlbXNcclxuICAgICAgXSxcclxuICAgICAgb25Db250ZW50UmVhZHksXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgLi4uZWxlbWVudEF0dHIsXHJcbiAgICAgICAgY2xhc3M6IENMQVNTRVMuaGVhZGVyXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAuZHhUb29sYmFyKCdpbnN0YW5jZScpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgYXV0b1Jlc2l6ZSBmcm9tICcuL0F1dG9SZXNpemUnO1xyXG5cclxuY29uc3QgQ1NTID0ge1xyXG4gIHBhbmVsOiAnLnBhbmVsLWJvZHknXHJcbn07XHJcblxyXG5sZXQgbGFzdFdpbmRvd0hlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0Q29udGVudEhlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0V2lkZ2V0SGVpZ2h0ID0gbnVsbDtcclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUhlaWdodCh3aWRnZXQpIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSAkd2lkZ2V0LnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgJHBhbmVsLmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSB3aWRnZXQuZWxlbWVudCgpLnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgY29uc3QgcGFuZWxUb3AgPSAkcGFuZWwucG9zaXRpb24oKS50b3A7XHJcbiAgY29uc3QgcGFuZWxIZWlnaHQgPSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3QgcGFuZWxQYWRkaW5nID0gJHBhbmVsLm91dGVySGVpZ2h0KCkgLSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3Qgd2lkZ2V0VG9wID0gJHdpZGdldC5wb3NpdGlvbigpLnRvcDtcclxuXHJcbiAgY29uc3Qgd2lkZ2V0SGVpZ2h0ID0gcGFuZWxIZWlnaHQgLSAod2lkZ2V0VG9wIC0gcGFuZWxUb3ApICsgcGFuZWxQYWRkaW5nIC8gMjtcclxuXHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0Jywgd2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gIGNvbnN0IGRpZmYgPSB3aW5kb3dIZWlnaHQgLSBsYXN0V2luZG93SGVpZ2h0O1xyXG5cclxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaWRnZXRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gd2luZG93SGVpZ2h0O1xyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24od2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCk7XHJcblxyXG4gIGF1dG9SZXNpemUoKCkgPT4gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuLi9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHBhbmVsSGVpZ2h0IGZyb20gJy4uL1BhbmVsSGVpZ2h0JztcclxuaW1wb3J0IHsgQ1NTX0NMQVNTRVMgfSBmcm9tICcuLi8uLi9TdHlsaW5nL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB7XHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIGluUGFuZWxHcmlkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZChpZDogSlF1ZXJ5LCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBpc0luUGFuZWxHcmlkID0gZmFsc2UpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGdyaWQgPSBjcmVhdGVEYXRhR3JpZChpZCwgb3B0aW9ucyk7XHJcblxyXG4gIGlmICghb3B0aW9ucy5oZWlnaHQpIHtcclxuICAgIGlmIChpc0luUGFuZWxHcmlkKSB7XHJcbiAgICAgIHBhbmVsSGVpZ2h0KGdyaWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZnVsbFNjcmVlbihncmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0YUdyaWQoZWw6IEpRdWVyeSwgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGVsLmR4RGF0YUdyaWQob3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0KFxyXG4gIGVsOiBzdHJpbmcgfCBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdC5Qcm9wZXJ0aWVzLCBpc0luUGFuZWwgPSBmYWxzZVxyXG4pOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3Qge1xyXG4gIGNvbnN0IHRyZWVMaXN0ID0gKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgPyAkKGVsKSA6IGVsKS5keFRyZWVMaXN0KG9wdGlvbnMpLmR4VHJlZUxpc3QoJ2luc3RhbmNlJyk7XHJcblxyXG4gIHRyZWVMaXN0LmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xyXG4gICAgaWYgKGlzSW5QYW5lbCkge1xyXG4gICAgICBwYW5lbEhlaWdodCh0cmVlTGlzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmdWxsU2NyZWVuKHRyZWVMaXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0cmVlTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0ZXh0LCB0aXRsZSkge1xyXG4gIHJldHVybiAkKCc8c3Bhbj4nKVxyXG4gICAgLmF0dHIoJ3RpdGxlJywgdGl0bGUpXHJcbiAgICAudGV4dCh0ZXh0KTtcclxufVxyXG4iLCAiaW1wb3J0IHNhdmVBcyBmcm9tICdmaWxlLXNhdmVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbihyZXBvcnROYW1lOiBzdHJpbmcpOiAoZTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkV4cG9ydGluZ0V2ZW50KSA9PiB2b2lkIHtcclxuICByZXR1cm4gKGU6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5FeHBvcnRpbmdFdmVudCkgPT4ge1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgKHdpbmRvdyBhcyBhbnkpLkV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldChyZXBvcnROYW1lKTtcclxuXHJcbiAgICBEZXZFeHByZXNzLmV4Y2VsRXhwb3J0ZXIuZXhwb3J0RGF0YUdyaWQoe1xyXG4gICAgICB3b3Jrc2hlZXQsXHJcbiAgICAgIGNvbXBvbmVudDogZS5jb21wb25lbnQsXHJcbiAgICAgIGN1c3RvbWl6ZUNlbGw6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXhjZWxDZWxsID0gb3B0aW9ucy5leGNlbENlbGw7XHJcblxyXG4gICAgICAgIGV4Y2VsQ2VsbC5mb250ID0geyBuYW1lOiAnQXJpYWwnLCBzaXplOiAxMiB9O1xyXG4gICAgICAgIGV4Y2VsQ2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdsZWZ0JyB9O1xyXG4gICAgICB9XHJcbiAgICB9KS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCkudGhlbihmdW5jdGlvbihidWZmZXIpIHtcclxuICAgICAgICBzYXZlQXMobmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSksIGAke3JlcG9ydE5hbWV9Lnhsc3hgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGUuY2FuY2VsID0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFRvb2xiYXJIZWxwZXIgfSBmcm9tICcuLi8uLi9IZWxwZXJzL1Rvb2xiYXInO1xyXG5pbXBvcnQgeyBUaGVtZUhlbHBlciwgVEhFTUVfQ0xBU1NFUyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVGhlbWUnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9Db25maWcvSW5kZXgnO1xyXG5pbXBvcnQgY3JlYXRlR3JpZEV4cG9ydEZuIGZyb20gJy4uLy4uL1V0aWxzL0dyaWRFeHBvcnQnO1xyXG5cclxuaW50ZXJmYWNlIElHcmlkU2V0dGluZ3NCYXNlPFQ+IHtcclxuICBvcHRpb25zPzogVDtcclxuXHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xyXG4gIGlzRnVsbFNjcmVlbj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgc2V0RGVmYXVsdENvbHVtbldpZHRoPzogYm9vbGVhbjtcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgZGlzYWJsZVN1bW1hcnlDb2x1bW5EZXRlY3Rpb24/OiBib29sZWFuO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJJdGVtcz86IGFueVtdO1xyXG4gIGJ1dHRvbnNTaXplPzogJ3NtJyB8ICdtZCc7XHJcbn1cclxuXHJcbmNvbnN0IGdldFdpZGdldE5hbWUgPSAod2lkZ2V0OiBzdHJpbmcpID0+IHtcclxuICByZXR1cm4gd2lkZ2V0XHJcbiAgICAuc2xpY2UoJ2R4Jy5sZW5ndGgpXHJcbiAgICAudG9Mb3dlckNhc2UoKTtcclxufTtcclxuXHJcbmNvbnN0IGdldFNlbGVjdG9ycyA9ICh3aWRnZXQ6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IGdyaWROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2VhcmNoUGFuZWw6IGAuZHgtJHtncmlkTmFtZX0tc2VhcmNoLXBhbmVsYCxcclxuICAgIHRvb2xiYXJFZGl0QnV0dG9uOiBgLmR4LSR7Z3JpZE5hbWV9LXRvb2xiYXItYnV0dG9uLmR4LWVkaXQtYnV0dG9uYCxcclxuICAgIHRvb2xiYXJFeHBvcnRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tZXhwb3J0LWJ1dHRvbiAuZHgtYnV0dG9uYCxcclxuICAgIHNlbGVjdENoZWNrQm94OiAnLmR4LXNlbGVjdC1jaGVja2JveCdcclxuICB9O1xyXG59O1xyXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhR3JpZFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUcmVlTGlzdFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0R3JpZERlZmF1bHRPcHRpb25zKHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncykge1xyXG4gIGNvbnN0IHJlc3VsdDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyBnZXRMZWdhY3lEZWZhdWx0T3B0aW9ucyhzZXR0aW5ncykgOiBnZXREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcblxyXG4gIGlmIChzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4pIHtcclxuICAgIChyZXN1bHQgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMpLnN1bW1hcnkgPSB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4sXHJcbiAgICAgICAgc2hvd0luQ29sdW1uOiBzZXR0aW5ncy5zaG93U3VtbWFyeUluQ29sdW1uIHx8IHNldHRpbmdzLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgfV1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXN1bHQuZXhwb3J0ID0ge1xyXG4gICAgZW5hYmxlZDogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSxcclxuICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlLFxyXG4gIH07XHJcblxyXG4gIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICByZXN1bHQuZ3JvdXBQYW5lbCA9IHsgdmlzaWJsZTogdHJ1ZSB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzKSB7XHJcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xyXG5cclxuICByZXN1bHQuc2VsZWN0aW9uID0geyBtb2RlOiAnbm9uZScgfTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnNcclxuICA8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5ncyk6IFQge1xyXG4gIHJldHVybiB7XHJcbiAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgY2FjaGVFbmFibGVkOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgZmlsdGVyUm93OiB7IHZpc2libGU6IHRydWUsIGFwcGx5RmlsdGVyOiAnb25DbGljaycgfSxcclxuICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogODAgfSxcclxuICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgc2Nyb2xsaW5nOiB7XHJcbiAgICAgIG1vZGU6ICd2aXJ0dWFsJyxcclxuICAgICAgcm93UmVuZGVyaW5nTW9kZTogJ3ZpcnR1YWwnXHJcbiAgICB9LFxyXG4gICAgc2VhcmNoUGFuZWw6IHtcclxuICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDI0MCxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2guLi4nXHJcbiAgICB9LFxyXG4gICAgc2hvd1Jvd0xpbmVzOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBzZWxlY3Rpb246IHsgbW9kZTogJ211bHRpcGxlJyB9LFxyXG4gICAgd29yZFdyYXBFbmFibGVkOiB0cnVlXHJcbiAgfSBhcyBUO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRMZWdhY3lEZWZhdWx0T3B0aW9uc1xyXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdHJ1ZSwgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG5cclxuICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICBwYWdpbmc6IHsgcGFnZVNpemU6IDUwIH0sXHJcbiAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogdHJ1ZSB9LFxyXG4gICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICd2aXJ0dWFsJyB9LFxyXG4gIH0gYXMgVDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJlcGFyZURlZmF1bHRUb29sYmFyQnV0dG9ucyh0b29sYmFyT3B0aW9uczogYW55LCB0b29sYmFyQWNjZW50QnV0dG9uTmFtZT86IHN0cmluZykge1xyXG4gIGNvbnN0IGZpbmRUb29sYmFySXRlbSA9IChpdGVtczogYW55W10sIG5hbWU6IHN0cmluZykgPT4gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcclxuXHJcbiAgaWYgKHRvb2xiYXJPcHRpb25zPy5pdGVtcykge1xyXG4gICAgY29uc3QgeyBpdGVtcyB9ID0gdG9vbGJhck9wdGlvbnM7XHJcblxyXG4gICAgaWYgKHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKSB7XHJcbiAgICAgIGNvbnN0IGFjY2VudEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKTtcclxuICAgICAgaWYgKGFjY2VudEJ1dHRvbkl0ZW0pIHtcclxuICAgICAgICBhY2NlbnRCdXR0b25JdGVtLm9wdGlvbnMudHlwZSA9ICdkZWZhdWx0JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNhdmVCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAnc2F2ZUJ1dHRvbicpO1xyXG4gICAgaWYgKHNhdmVCdXR0b25JdGVtKSB7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdTYXZlJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXZlcnRCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmV2ZXJ0QnV0dG9uJyk7XHJcbiAgICBpZiAocmV2ZXJ0QnV0dG9uSXRlbSkge1xyXG4gICAgICByZXZlcnRCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJldmVydEJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ0Rpc2NhcmQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZnJlc2hCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmVmcmVzaCcpO1xyXG4gICAgaWYgKHJlZnJlc2hCdXR0b25JdGVtKSB7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdSZWZyZXNoJztcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy5oaW50ID0gJ1JlbG9hZCBEYXRhJztcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGFuZGxlcnM8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihcclxuICB3aWRnZXQ6ICdkeERhdGFHcmlkJyB8ICdkeFRyZWVMaXN0JyxcclxuICBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5nc1xyXG4pOiBUIHtcclxuICBjb25zdCBzZWxlY3RvcnMgPSBnZXRTZWxlY3RvcnMod2lkZ2V0KTtcclxuICBsZXQgaXNHcmlkSW5pdGlhbGl6YWVkID0gZmFsc2U7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnaGVhZGVyJykge1xyXG4gICAgICAgICAgZS5jZWxsRWxlbWVudC5jc3MoJ3RleHQtYWxpZ24nLCAnY2VudGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25DZWxsUHJlcGFyZWQpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zPy5vbkNlbGxQcmVwYXJlZChlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgaWYgKCFzZXR0aW5ncy5kaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbikge1xyXG4gICAgICAgIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGRhdGFHcmlkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpc0dyaWRJbml0aWFsaXphZWQpIHtcclxuICAgICAgICBpc0dyaWRJbml0aWFsaXphZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvL3RvIGZpeCBhdXRvc2Nyb2xsXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZGF0YUdyaWQuZ2V0U2Nyb2xsYWJsZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChzY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsVG8oeyB0b3A6IDAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUdyaWQuY29sdW1uQ291bnQoKTsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ2RhdGFUeXBlJyk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy5zZXREZWZhdWx0Q29sdW1uV2lkdGggfHwgc2V0dGluZ3Muc2V0RGVmYXVsdENvbHVtbldpZHRoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGlmICghZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcpKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICc0NXB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTM1cHgnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzE0MHB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScgfHwgZGF0YVR5cGUgPT09ICdkYXRlJykge1xyXG4gICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ2FsaWdubWVudCcsICdyaWdodCcpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ2RkIE1NTSB5eXl5Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ0hIOm1tLCBkZCBNTU0geXl5eScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcclxuICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldFNtYWxsU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0TWlkZGxlU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFRoZW1lSGVscGVyLnNldEVsZW1lbnRTbWFsbFNpemUoZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoc2VsZWN0b3JzLnNlbGVjdENoZWNrQm94KSk7XHJcblxyXG4gICAgICAgIGlmICgkKHNlbGVjdG9ycy50b29sYmFyRXhwb3J0QnV0dG9uKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcclxuICAgICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U21hbGxTaXplKCQoc2VsZWN0b3JzLnRvb2xiYXJFeHBvcnRCdXR0b24pLmR4QnV0dG9uKCdpbnN0YW5jZScpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldE1pZGRsZVNpemUoJChzZWxlY3RvcnMudG9vbGJhckV4cG9ydEJ1dHRvbikuZHhCdXR0b24oJ2luc3RhbmNlJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgY29uc3Qge1xyXG4gICAgICAgIHRvb2xiYXJPcHRpb25zID0ge31cclxuICAgICAgfSA9IGU7XHJcblxyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgY29uc3Qge1xyXG4gICAgICAgIGl0ZW1zID0gW11cclxuICAgICAgfSA9IHRvb2xiYXJPcHRpb25zO1xyXG5cclxuICAgICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy50aXRsZSkge1xyXG4gICAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZSgpIHtcclxuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoc2V0dGluZ3MudGl0bGUpO1xyXG4gICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyRWwuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhcycpLmFkZENsYXNzKCdmYS1pbmZvLWNpcmNsZScpLmFkZENsYXNzKCdyZXBvcnQtZGV0YWlscy1saW5rJykuYXR0cigndGl0bGUnLCAnQ2xpY2sgdG8gc2VlIGZ1cnRoZXIgZGV0YWlscycpKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbS53aWRnZXQgPT09ICdkeEJ1dHRvbicgJiYgaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRpdGxlKSB7XHJcbiAgICAgICAgICBpdGVtcy51bnNoaWZ0KFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHNldHRpbmdzLnRpdGxlLCBzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLndpZGdldCA9PT0gJ2R4QnV0dG9uJykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XHJcbiAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpY29uU2l6ZSA9IHNldHRpbmdzLmJ1dHRvbnNTaXplID09PSAnc20nID8gMTYgOiAyNDtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAnYWRkUm93QnV0dG9uJzpcclxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdwbHVzJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdzYXZlQnV0dG9uJzpcclxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdzYXZlJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdyZXZlcnRCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ2Nsb3NlJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIpIHtcclxuICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIgPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXRlbS5vcHRpb25zLmVsZW1lbnRBdHRyLmNsYXNzID0gc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyBUSEVNRV9DTEFTU0VTLnNtIDogVEhFTUVfQ0xBU1NFUy5tZDtcclxuICAgICAgICAgICAgaXRlbS5zaG93VGV4dCA9ICdhbHdheXMnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwcmVwYXJlRGVmYXVsdFRvb2xiYXJCdXR0b25zKHRvb2xiYXJPcHRpb25zLCBzZXR0aW5ncy50b29sYmFyQWNjZW50QnV0dG9uTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy50b29sYmFySXRlbXMpIHtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goLi4uc2V0dGluZ3MudG9vbGJhckl0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRvb2xiYXJPcHRpb25zLmVsZW1lbnRBdHRyID0ge1xyXG4gICAgICAgICAgY2xhc3M6ICdpc296LXRvb2xiYXItaGVhZGVyJ1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHNhdmVCdXR0b25JbmRleCA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzYXZlQnV0dG9uJyk7XHJcbiAgICAgIGNvbnN0IHNlYXJjaFBhbmVsSW5kZXggPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnc2VhcmNoUGFuZWwnKTtcclxuICAgICAgbGV0IGluZGV4Rm9yVXBkYXRlID0gLTE7XHJcblxyXG4gICAgICBpZiAoc2F2ZUJ1dHRvbkluZGV4ID4gLTEpIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IHNhdmVCdXR0b25JbmRleDtcclxuICAgICAgfSBlbHNlIGlmIChzZWFyY2hQYW5lbEluZGV4ID4gLTEpIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IHNlYXJjaFBhbmVsSW5kZXg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW5kZXhGb3JVcGRhdGUgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmxlbmd0aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy5zcGxpY2UoaW5kZXhGb3JVcGRhdGUsIDAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICBuYW1lOiAncmVmcmVzaCcsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGljb246ICdyZWZyZXNoJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAzMCA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6IGBkeC1kYXRhZ3JpZC10b29sYmFyLWJ1dHRvbiAke3NldHRpbmdzLmJ1dHRvbnNTaXplID09PSAnc20nID8gVEhFTUVfQ0xBU1NFUy5zbSA6IFRIRU1FX0NMQVNTRVMubWR9YCB9LFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kZTogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gJ3RleHQnIDogJ2NvbnRhaW5lZCcsXHJcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGRhdGFHcmlkPy5yZWZyZXNoKCksXHJcbiAgICAgICAgICAgIG9uQ29udGVudFJlYWR5OiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAoY29udGVudFJlYWR5RXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICBjb250ZW50UmVhZHlFdmVudC5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiA2LFxyXG4gICAgICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogNlxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b24uUHJvcGVydGllc1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vblRvb2xiYXJQcmVwYXJpbmcpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucyA9IHtcclxuICAgICAgICAgIC4uLmUuZWRpdG9yT3B0aW9ucyxcclxuICAgICAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgICAgIGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGUuZWRpdG9yTmFtZSA9PT0gJ2R4U2VsZWN0Qm94Jykge1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgLi4uZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyxcclxuICAgICAgICAgICAgb25TaG93aW5nOiAoYXJnczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgd2lkZ2V0TmFtZSA9IGdldFdpZGdldE5hbWUod2lkZ2V0KTtcclxuICAgICAgICAgICAgICBhcmdzLmNvbXBvbmVudC5fJHBvcHVwQ29udGVudC5hZGRDbGFzcyhgaXNvei0ke3dpZGdldE5hbWV9LXNlbGVjdGJveC1wb3B1cGApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGUuZWRpdG9yTmFtZSA9PT0gJ2R4Q2hlY2tCb3gnKSB7XHJcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRFbGVtZW50U21hbGxTaXplKGUuZWRpdG9yRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGUucGFyZW50VHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ2ZpbHRlclJvdyc6XHJcbiAgICAgICAgICBjb25zdCBhcHBseUZpbHRlcjogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5lbGVtZW50ICYmIGUuZWxlbWVudC5maW5kKCcuZHgtYXBwbHktYnV0dG9uJykudHJpZ2dlcignZHhjbGljaycpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5RmlsdGVyO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseUZpbHRlcjtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnc2VhcmNoUGFuZWwnOlxyXG4gICAgICAgICAgY29uc3QgYXBwbHlTZWFyY2g6IERldkV4cHJlc3MudWkuZHhUZXh0RWRpdG9yLlByb3BlcnRpZXNbJ29uRW50ZXJLZXknXSA9IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNlYXJjaEJ5VGV4dChhcmdzLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSAoKSA9PiB7IH07XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5U2VhcmNoO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseVNlYXJjaDtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uRWRpdG9yUHJlcGFyaW5nKSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkVkaXRvclByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGV4dE1lbnVQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSAnY29udGVudCcgJiYgISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkge1xyXG4gICAgICAgICAgaWYgKCFlLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGUuaXRlbXMgPSBbXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBlLml0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IGFsbCBkYXRhJyxcclxuICAgICAgICAgICAgb25JdGVtQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5leHBvcnRUb0V4Y2VsKGZhbHNlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaWNvbjogJ3hsc3hmaWxlJ1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnVJdGVtKTtcclxuXHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucy5zZWxlY3Rpb24/Lm1vZGUgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSBlLmNvbXBvbmVudC5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuXHJcbiAgICAgICAgICAgIGUuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0V4cG9ydCBzZWxlY3RlZCByb3dzJyxcclxuICAgICAgICAgICAgICBvbkl0ZW1DbGljazogKCkgPT4gZS5jb21wb25lbnQuZXhwb3J0VG9FeGNlbCh0cnVlKSxcclxuICAgICAgICAgICAgICBpY29uOiAnZXhwb3J0c2VsZWN0ZWQnLFxyXG4gICAgICAgICAgICAgIGRpc2FibGVkOiAhc2VsZWN0ZWRSb3dzIHx8ICFzZWxlY3RlZFJvd3MubGVuZ3RoXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keENvbnRleHRNZW51SXRlbSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZXh0TWVudVByZXBhcmluZykge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGV4dE1lbnVQcmVwYXJpbmcoZSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkV4cG9ydGluZzogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSA/IGNyZWF0ZUdyaWRFeHBvcnRGbihzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkgOiB2b2lkIDAsXHJcbiAgfSBhcyBUO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBjcmVhdGVEYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcbmltcG9ydCB7IGdldEdyaWREZWZhdWx0T3B0aW9ucywgZ2V0SGFuZGxlcnMsIElEYXRhR3JpZFNldHRpbmdzIH0gZnJvbSAnLi9EZWZhdWx0R3JpZEJhc2UnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWw6IEpRdWVyeSwgc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldEdyaWREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcbiAgbGV0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIHNldHRpbmdzLm9wdGlvbnMpO1xyXG4gIGNvbnN0IGhhbmRsZXJzID0gZ2V0SGFuZGxlcnM8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4oJ2R4RGF0YUdyaWQnLCAkLmV4dGVuZCh0cnVlLCB7fSwgc2V0dGluZ3MsIHsgb3B0aW9uczogbWVyZ2VkT3B0aW9ucyB9KSk7XHJcblxyXG4gIG1lcmdlZE9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgbWVyZ2VkT3B0aW9ucywgaGFuZGxlcnMpO1xyXG5cclxuICBpZiAoc2V0dGluZ3MuaXNGdWxsU2NyZWVuIHx8IHNldHRpbmdzLmlzRnVsbFNjcmVlbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKGVsLCBtZXJnZWRPcHRpb25zLCBzZXR0aW5ncy5pblBhbmVsR3JpZCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBjcmVhdGVEYXRhR3JpZChlbCwgbWVyZ2VkT3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuL0RlZmF1bHRHcmlkJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKFxyXG4gIGlkOiBzdHJpbmcsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZ1xyXG4pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIHJldHVybiBkZWZhdWx0R3JpZCgkKGAjJHtpZH1gKSwge1xyXG4gICAgb3B0aW9uczogZGF0YUdyaWRPcHRpb25zLFxyXG4gICAgZXhwb3J0RmlsZU5hbWU6IGFkZGl0aW9uYWxPcHRpb25zLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgaW5QYW5lbEdyaWQ6IGFkZGl0aW9uYWxPcHRpb25zLmluUGFuZWxHcmlkLFxyXG4gICAgc2hvd1N1bW1hcnlJbkNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc2hvd1N1bW1hcnlJbkNvbHVtbixcclxuICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICBoZWFkZXJEZXNjcmlwdGlvbixcclxuICAgIHRpdGxlOiBoZWFkZXJUZXh0XHJcbiAgfSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElUcmVlTGlzdFNldHRpbmdzLCBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zLCBnZXRIYW5kbGVycyB9IGZyb20gJy4vRGVmYXVsdEdyaWRCYXNlJztcclxuaW1wb3J0IHsgY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0IH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihcclxuICBpZDogc3RyaW5nIHwgSlF1ZXJ5LFxyXG4gIHNldHRpbmdzOiBJVHJlZUxpc3RTZXR0aW5ncyA9IHt9XHJcbik6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB7XHJcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuICBsZXQgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgc2V0dGluZ3Mub3B0aW9ucyk7XHJcbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRIYW5kbGVyczxEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPignZHhUcmVlTGlzdCcsICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgeyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0pKTtcclxuXHJcbiAgbWVyZ2VkT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBtZXJnZWRPcHRpb25zLCBoYW5kbGVycyk7XHJcblxyXG4gIHJldHVybiBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QoaWQsIG1lcmdlZE9wdGlvbnMsIHNldHRpbmdzLmluUGFuZWxHcmlkKTtcclxufVxyXG4iLCAiaW1wb3J0IENyb3BwciBmcm9tICdjcm9wcHInO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi9Qb3B1cCc7XHJcblxyXG5pbXBvcnQgSW5pdGlhbGl6ZWRFdmVudEluZm8gPSBEZXZFeHByZXNzLmV2ZW50cy5Jbml0aWFsaXplZEV2ZW50SW5mbztcclxuXHJcbmNvbnN0IGF2YXRhclNpemUgPSB7XHJcbiAgaGVpZ2h0OiAzMDAsXHJcbiAgd2lkdGg6IDMwMCxcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0SW1hZ2VUb1ByZXZpZXcgKHByZXZpZXc6IEpRdWVyeSwgYmFzZTY0SW1nOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgcHJldmlldy5hdHRyKCdzcmMnLCBiYXNlNjRJbWcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDb250ZW50TWFya3VwIChpbWFnZUJhc2U2NDogc3RyaW5nIHwgbnVsbCkge1xyXG4gIGNvbnN0ICRhdmF0YXJQb3B1cENvbnRlbnQgPSAkKCc8ZGl2PicpXHJcbiAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fZHJvcHpvbmUnKTtcclxuICAvLy5vbignZHJvcCcgLCBldiA9PiBldi5kYXRhVHJhbnNmZXIuZmlsZXMpXHJcblxyXG4gIGNvbnN0ICRjcm9wcGVyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX2Nyb3AtY29udGFpbmVyJylcclxuICAgIC5hcHBlbmRUbygkYXZhdGFyUG9wdXBDb250ZW50KTtcclxuXHJcbiAgY29uc3QgJGNyb3BJbWFnZSA9ICQoJzxpbWcgLz4nKS5wcmVwZW5kVG8oJGNyb3BwZXJDb250YWluZXIpO1xyXG5cclxuICBzZXRJbWFnZVRvUHJldmlldygkY3JvcEltYWdlLCBpbWFnZUJhc2U2NCk7XHJcblxyXG4gIGNvbnN0IGNyb3BwZXIgPSBuZXcgQ3JvcHByKCRjcm9wSW1hZ2VbMF0sIHtcclxuICAgIGFzcGVjdFJhdGlvOiAxLFxyXG4gICAgc3RhcnRTaXplOiBbOTAsIDkwXSxcclxuICB9KTtcclxuXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJGF2YXRhclBvcHVwQ29udGVudCxcclxuICAgIGNyb3BwZXJcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93UG9wdXAgKCRjb250ZW50OiBKUXVlcnksIGNyb3BwZXI6IENyb3Bwciwgb25BdmF0YXJVcGRhdGVkOiAocGhvdG9CYXNlNjQ6IHN0cmluZykgPT4gdm9pZCkge1xyXG4gIGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdVcGRhdGUgcHJvZmlsZSBwaWN0dXJlJyxcclxuICAgICAgc2hvd1RpdGxlOiB0cnVlLFxyXG4gICAgICBkcmFnRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXHJcbiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICBtYXhXaWR0aDogMTAyNCxcclxuICAgICAgb25Jbml0aWFsaXplZDogKGU6IEluaXRpYWxpemVkRXZlbnRJbmZvPERldkV4cHJlc3MudWkuZHhQb3B1cD4pID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudCAmJiBlLmNvbXBvbmVudC5vcHRpb24oJ2Z1bGxTY3JlZW4nLCB3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMDI0KTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgICRjb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnVXBkYXRlJyxcclxuICAgICAgb25DbGljazogKGNsb3NlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY3JvcE9wdGlvbnMgPSBjcm9wcGVyLmdldFZhbHVlKCk7XHJcbiAgICAgICAgY29uc3QgJGNhbnZhczogSlF1ZXJ5PEhUTUxDYW52YXNFbGVtZW50PiA9ICQoJzxjYW52YXM+JykuYXR0cignaGVpZ2h0JywgYXZhdGFyU2l6ZS5oZWlnaHQpLmF0dHIoJ3dpZHRoJywgYXZhdGFyU2l6ZS53aWR0aCkgYXMgSlF1ZXJ5PEhUTUxDYW52YXNFbGVtZW50PjtcclxuICAgICAgICBjb25zdCBjdHggPSAoJGNhbnZhc1swXSBhcyBhbnkpLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgY29uc3QgJGltYWdlID0gJGNvbnRlbnQuZmluZCgnaW1nLmNyb3Bwci1pbWFnZScpWzBdO1xyXG5cclxuICAgICAgICBjdHguZHJhd0ltYWdlKCRpbWFnZSwgY3JvcE9wdGlvbnMueCwgY3JvcE9wdGlvbnMueSwgY3JvcE9wdGlvbnMud2lkdGgsIGNyb3BPcHRpb25zLmhlaWdodCwgMCwgMCwgYXZhdGFyU2l6ZS53aWR0aCwgYXZhdGFyU2l6ZS5oZWlnaHQpO1xyXG5cclxuICAgICAgICBjb25zdCBjcm9wcGVkID0gJGNhbnZhc1swXS50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAwLjkpO1xyXG5cclxuICAgICAgICBvbkF2YXRhclVwZGF0ZWQoY3JvcHBlZCk7XHJcbiAgICAgICAgY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgIG9uQ2xpY2s6IChjbG9zZSkgPT4gY2xvc2UoKVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93IChpbWFnZUJhc2U2NDogc3RyaW5nIHwgbnVsbCwgb25BdmF0YXJVcGRhdGVkOiAocGhvdG9CYXNlNjQ6IHN0cmluZykgPT4gdm9pZCkge1xyXG4gIGNvbnN0IGNvbnRlbnQgPSBjcmVhdGVDb250ZW50TWFya3VwKGltYWdlQmFzZTY0KTtcclxuXHJcbiAgc2hvd1BvcHVwKGNvbnRlbnQuJGNvbnRlbnQsIGNvbnRlbnQuY3JvcHBlciwgb25BdmF0YXJVcGRhdGVkKTtcclxufVxyXG4iLCAiZXhwb3J0IGNvbnN0IGdldEJhc2U2NCA9IChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmlsZVJlYWRlci5yZXN1bHQ7XHJcbiAgICAgICAgcmVzb2x2ZSh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/IHJlc3VsdCA6IG51bGwpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG5cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn07XHJcbiIsICJpbXBvcnQge0lSZW5kZXJlZH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHtEZXZFeHByZXNzRXZlbnRBcmdzfSBmcm9tICcuLi8uLi9VdGlscy9EZXZFeHByZXNzRXZlbnRBcmdzJztcclxuaW1wb3J0IHsgc2hvdyB9IGZyb20gJy4uLy4uL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nJztcclxuaW1wb3J0IHtnZXRCYXNlNjR9IGZyb20gJy4uLy4uL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nL0hlbHBlcnMnO1xyXG5pbXBvcnQgZHhUZXh0Qm94T3B0aW9ucyA9IERldkV4cHJlc3MudWkuZHhUZXh0Qm94T3B0aW9ucztcclxuaW1wb3J0IGR4VGV4dEJveCA9IERldkV4cHJlc3MudWkuZHhUZXh0Qm94O1xyXG5pbXBvcnQgSXN6b2xlYVVJIGZyb20gJy4uLy4uL2luZGV4JztcclxuXHJcbmNvbnN0IG1heEZpbGVNYlNpemUgPSAxMDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjY291bnRTZXR0aW5nc0RhdGEge1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgRmlyc3ROYW1lOiBzdHJpbmc7XHJcbiAgTGFzdE5hbWU6IHN0cmluZztcclxuICBQaG9uZU51bWJlcjogc3RyaW5nO1xyXG4gIEVtYWlsOiBzdHJpbmc7XHJcbiAgT2xkUGFzc3dvcmQ6IHN0cmluZztcclxuICBOZXdQYXNzd29yZDogc3RyaW5nO1xyXG4gIE5ld1Bhc3N3b3JkUmVwZWF0OiBzdHJpbmc7XHJcbiAgQXZhdGFyOiBzdHJpbmc7XHJcbiAgSGFzQ2hhbmdlczogYm9vbGVhbjtcclxuICBFcnJvck1lc3NhZ2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlciB7XHJcbiAgSWQ6IHN0cmluZztcclxuICBVc2VyTmFtZTogc3RyaW5nO1xyXG4gIEZpcnN0TmFtZTogc3RyaW5nO1xyXG4gIExhc3ROYW1lOiBzdHJpbmc7XHJcbiAgVXNlckF2YXRhcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQWNjb3VudFNldHRpbmdzUGFnZSBpbXBsZW1lbnRzIElSZW5kZXJlZCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50VXNlckluZm86IElVc2VyIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyByZWFkb25seSBhY2NvdW50U2V0dGluZ3NEYXRhOiBJQWNjb3VudFNldHRpbmdzRGF0YSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybUFjdGlvbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgYXZhdGFyVXBsb2FkZXI6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBhY2NvdW50U2V0dGluZ3NGb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gZWxlbWVudHNcclxuICBwcml2YXRlIHJlYWRvbmx5IF8kcm9vdEVsZW1lbnQ6IEpRdWVyeTxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgJGNvbnRhaW5lcjogSlF1ZXJ5PEhUTUxEaXZFbGVtZW50PixcclxuICAgIGZvcm1BY3Rpb246IHN0cmluZyxcclxuICAgIGFjY291bnRTZXR0aW5nc0RhdGE6IElBY2NvdW50U2V0dGluZ3NEYXRhIHwgdW5kZWZpbmVkLFxyXG4gICAgdXNlckluZm86IElVc2VyIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICB0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEgPSBhY2NvdW50U2V0dGluZ3NEYXRhO1xyXG4gICAgdGhpcy5jdXJyZW50VXNlckluZm8gPSB1c2VySW5mbztcclxuICAgIHRoaXMuXyRyb290RWxlbWVudCA9ICRjb250YWluZXI7XHJcbiAgICB0aGlzLmZvcm1BY3Rpb24gPSBmb3JtQWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyVXBsb2FkZXIodGhpcy4kcm9vdEVsZW1lbnQpO1xyXG4gICAgdGhpcy5yZW5kZXJBY2NvdW50U2V0dGluZ3NGb3JtKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0ICRyb290RWxlbWVudCgpIHtcclxuICAgIGlmICghdGhpcy5fJHJvb3RFbGVtZW50KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJvb3QgZWxlbWVudCBpcyB1bmRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fJHJvb3RFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJVcGxvYWRlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIHRoaXMuYXZhdGFyVXBsb2FkZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXZhdGFyLXBvcHVwX191cGxvYWRlcicpXHJcbiAgICAgIC5keEZpbGVVcGxvYWRlcih7XHJcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxyXG4gICAgICAgIHVwbG9hZE1vZGU6ICd1c2VGb3JtJyxcclxuICAgICAgICBhY2NlcHQ6ICdpbWFnZS8qJyxcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICBtYXhGaWxlU2l6ZTogbWF4RmlsZU1iU2l6ZSAqIDEwMDAwMDAsXHJcblxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZTogRGV2RXhwcmVzc0V2ZW50QXJnczxEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyT3B0aW9ucywgJ29uVmFsdWVDaGFuZ2VkJz4pID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQgfHwgIWUudmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IGUudmFsdWVbMF07XHJcbiAgICAgICAgICBjb25zdCBtYXhTaXplID0gZS5jb21wb25lbnQub3B0aW9uKCdtYXhGaWxlU2l6ZScpIHx8IG1heEZpbGVNYlNpemU7XHJcblxyXG4gICAgICAgICAgaWYgKCFmaWxlIHx8IGZpbGUuc2l6ZSA+IG1heFNpemUpIHtcclxuICAgICAgICAgICAgRGV2RXhwcmVzcy51aS5ub3RpZnkoYEZpbGUgc2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuICR7bWF4RmlsZU1iU2l6ZX0gTUIuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBmaWxlYCwgJ2Vycm9yJywgNTAwMCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZ2V0QmFzZTY0KGZpbGUpXHJcbiAgICAgICAgICAgIC50aGVuKChpbWFnZUJhc2U2NCkgPT4ge1xyXG4gICAgICAgICAgICAgIHNob3coaW1hZ2VCYXNlNjQsIChuZXdJbWdTb3VyY2UpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8udXBkYXRlRGF0YSgnQXZhdGFyJywgbmV3SW1nU291cmNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8ucmVwYWludCgpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBEZXZFeHByZXNzLnVpLm5vdGlmeShlcnJvciwgJ2Vycm9yJywgMzAwMCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKVxyXG4gICAgICAuZHhGaWxlVXBsb2FkZXIoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckFjY291bnRTZXR0aW5nc0Zvcm0oJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICBpZiAodGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0gPSAkKCc8Zm9ybSAvPicpXHJcbiAgICAgIC5hdHRyKCdhY3Rpb24nLCB0aGlzLmZvcm1BY3Rpb24pXHJcbiAgICAgIC5hdHRyKCdtZXRob2QnLCAncG9zdCcpXHJcbiAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fZm9ybScpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9ybS1jb250ZW50JylcclxuICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpXHJcbiAgICAgIC5keEZvcm0odGhpcy5nZXRGb3JtT3B0aW9ucygpKVxyXG4gICAgICAuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIGlmICh0aGlzLmFjY291bnRTZXR0aW5nc0RhdGE/Lkhhc0NoYW5nZXMgJiYgIXRoaXMuYWNjb3VudFNldHRpbmdzRGF0YS5FcnJvck1lc3NhZ2UpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBJc3pvbGVhVUkud2lkZ2V0cy5ub3RpZnkoJ0NoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkJywgdHJ1ZSksIDUwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcm1PcHRpb25zKCkgOiBEZXZFeHByZXNzLnVpLmR4Rm9ybU9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZm9ybURhdGE6IHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YSxcclxuICAgICAgbWluQ29sV2lkdGg6IDIwMCxcclxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXHJcbiAgICAgIGFsaWduSXRlbUxhYmVsczogdHJ1ZSxcclxuICAgICAgc2hvd1ZhbGlkYXRpb25TdW1tYXJ5OiB0cnVlLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgICAgY29sQ291bnQ6IDE2LFxyXG4gICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDYsXHJcbiAgICAgICAgICAgICAgY2FwdGlvbjogJ1Byb2ZpbGUgUGljdHVyZScsXHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdBdmF0YXInLFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0ICRhdmF0YXJWaWV3Q29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldy1jb250YWluZXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGF2YXRhckNvbnRhaW5lciA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGQoJGF2YXRhclZpZXdDb250YWluZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItYnV0dG9uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdwaG90bycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnVXBsb2FkIG5ldyBpbWFnZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5hdmF0YXJVcGxvYWRlciAmJiB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignZGlhbG9nVHJpZ2dlcicsIGUuZWxlbWVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgKS5hcHBlbmRUbygkYXZhdGFyQ29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXZhdGFyQmFzZTY0ID0gZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlIHx8IHRoaXMuY3VycmVudFVzZXJJbmZvPy5Vc2VyQXZhdGFyO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXZhdGFyQmFzZTY0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkKCc8aW1nPicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyLXZpZXcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignc3JjJywgYXZhdGFyQmFzZTY0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGF2YXRhclZpZXdDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlucHV0PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItaW5wdXQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ3RleHQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ0F2YXRhcicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJDb250YWluZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbChkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkKCc8aT4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoWydhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldy1kZWZhdWx0JywgJ2ZhcycsICdmYS11c2VyJ10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkYXZhdGFyVmlld0NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZih0aGlzLmF2YXRhclVwbG9hZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignZHJvcFpvbmUnLCAkYXZhdGFyQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdvbkRyb3Bab25lRW50ZXInLCAoKSA9PiAkYXZhdGFyQ29udGFpbmVyLmFkZENsYXNzKCdkcm9wJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5hdmF0YXJVcGxvYWRlci5vcHRpb24oJ29uRHJvcFpvbmVMZWF2ZScsICgpID0+ICRhdmF0YXJDb250YWluZXIucmVtb3ZlQ2xhc3MoJ2Ryb3AnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGF2YXRhckNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGl0ZW1UeXBlOiAnZW1wdHknLFxyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDFcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDksXHJcbiAgICAgICAgICAgICAgY2FwdGlvbjogJ0FjY291bnQgRGV0YWlscycsXHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdFcnJvck1lc3NhZ2UnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGRhdGEgJiYgZGF0YS5lZGl0b3JPcHRpb25zICYmIGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZSAmJiAkKCc8ZGl2IC8+JykudGV4dChlcnJvck1lc3NhZ2UpLmFkZENsYXNzKCdlcnJvci1tZXNzYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgLy8gICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAvLyAgIGRhdGFGaWVsZDogJ0hhc0NoYW5nZXMnLFxyXG4gICAgICAgICAgICAgICAgLy8gICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyAgIHZpc2libGU6IHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YT8uSGFzQ2hhbmdlcyAmJiAhdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLkVycm9yTWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIC8vICAgdGVtcGxhdGU6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm4gJCgnPGRpdiAvPicpLnRleHQoJ0NoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkJykuYWRkQ2xhc3MoJ3N1Y2Nlc3MtbWVzc2FnZScpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB9LFxyXG4gICAgICAgICAgICAgICAgLy8gfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdVc2VyTmFtZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1VzZXJuYW1lJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdVc2VybmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgICAgIGNvbENvdW50OiAyLFxyXG4gICAgICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0ZpcnN0TmFtZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnRmlyc3QgTmFtZSdcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnRmlyc3QgTmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0xhc3ROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdMYXN0IE5hbWUnXHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ0xhc3QgTmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnUGhvbmVOdW1iZXInLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdQaG9uZSBOdW1iZXInXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnRW1haWwnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdFbWFpbCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnRW1haWwgaXMgcmVxdWlyZWQnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZW1haWwnLCBtZXNzYWdlOiAnUGxlYXNlIHVzZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBjc3NDbGFzczogJ2FjY291bnQtc2V0dGluZ3NfX3Bhc3N3b3JkLWFyZWEnLFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4gJCgnPGRpdiAvPicpLmNzcygnZm9udC13ZWlnaHQnLCAnYm9sZCcpLnRleHQoJ0NoYW5nZSBQYXNzd29yZCcpXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ09sZFBhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ3VycmVudCBwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6ICdwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgICByZWV2YWx1YXRlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEhdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy5nZXRFZGl0b3IoJ05ld1Bhc3N3b3JkJyk/Lm9wdGlvbigndmFsdWUnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXBhcmFtcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ09sZCBwYXNzd29yZCBpcyByZXF1aXJlZCdcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ05ld1Bhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnTmV3IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgICBpbnB1dEF0dHI6IHsgYXV0b2NvbXBsZXRlOiAnbmV3LXBhc3N3b3JkJyB9XHJcbiAgICAgICAgICAgICAgICAgIH0gYXMgZHhUZXh0Qm94T3B0aW9uczxkeFRleHRCb3g+LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdOZXdQYXNzd29yZFJlcGVhdCcsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0NvbmZpcm0gbmV3IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlZXZhbHVhdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LmdldEVkaXRvcignTmV3UGFzc3dvcmQnKT8ub3B0aW9uKCd2YWx1ZScpIHx8ICcnKSA9PT0gcGFyYW1zLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQYXNzd29yZCBtaXNtYXRjaCcsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdidXR0b24nLFxyXG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICBjc3NDbGFzczogJ2FjY291bnQtc2V0dGluZ3NfX3N1Ym1pdC1idG4nLFxyXG4gICAgICAgICAgICAgICAgICBidXR0b25PcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1NhdmUgQ2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZVN1Ym1pdEJlaGF2aW9yOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29uZmlybSh0ZXh0OiBzdHJpbmcpOiBKUXVlcnlEZWZlcnJlZDxib29sZWFuPiB7XHJcbiAgICBjb25zdCAkZGVmZmVyZWQ6IEpRdWVyeURlZmVycmVkPGJvb2xlYW4+ID0gJC5EZWZlcnJlZCgpO1xyXG4gICAgY29uc3QgJGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5hcHBlbmRUbyh3aW5kb3cuZG9jdW1lbnQuYm9keSk7XHJcblxyXG4gICAgY29uc3QgcG9wdXAgPSAkZWxlbWVudC5keFBvcHVwKHtcclxuICAgICAgICBzaG93VGl0bGU6IGZhbHNlLFxyXG4gICAgICAgIGhlaWdodDogMTQwLFxyXG4gICAgICAgIHdpZHRoOiAzNzAsXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoJGNvbnRlbnQpID0+IHtcclxuICAgICAgICAgICAgJGNvbnRlbnQuYWRkQ2xhc3MoJ2lzem9sZWEtZHgtY29uZmlybScpO1xyXG5cclxuICAgICAgICAgICAgJCgnPGIvPicpLmFkZENsYXNzKCdtZXNzYWdlJykudGV4dCh0ZXh0KS5hcHBlbmRUbygkY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCAkYnV0dG9uc1NlY3Rpb24gPSAkKCc8ZGl2Lz4nKS5hZGRDbGFzcygnYnV0dG9ucycpLmFwcGVuZFRvKCRjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgICQoJzxkaXYvPicpLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhbmdlcicsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnNTZWN0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICQoJzxkaXYvPicpLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJGRlZmZlcmVkLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9uc1NlY3Rpb24pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIG9uSGlkZGVuOiAoKSA9PiB7XHJcbiAgICAgICAgcG9wdXAuZGlzcG9zZSgpO1xyXG4gICAgICAgIHBvcHVwLmVsZW1lbnQoKS5yZW1vdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICBwb3B1cC5zaG93KCk7XHJcblxyXG4gICAgcmV0dXJuICRkZWZmZXJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEnO1xyXG5pbXBvcnQgeyBMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSB9IGZyb20gJy4uL0NvbnN0YW50cy9DYWNoZUtleXMnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uL0NvbmZpZy9JbmRleCc7XHJcbmltcG9ydCB7IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEvSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzJztcclxuaW1wb3J0IHsgc2hvdyBhcyBzaG93SW1hZ2VWaWV3ZXIgfSBmcm9tICcuLi9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlcic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGFuZGluZygkY29udGFpbmVyOiBKUXVlcnksIGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZywgc2hvd1NpZ25JbkJ1dHRvbjogYm9vbGVhbiwgcGhvdG9HYWxsZXJ5U2V0dGluZ3M6IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncyA9IHsgZW5hYmxlZDogZmFsc2UgfSkge1xyXG4gIGdldExvZ29TZXR0aW5ncyhsb2dvU2V0dGluZ3MpLnRoZW4oKHNldHRpbmdzKSA9PiB7XHJcbiAgICBjcmVhdGVMYW5kaW5nTWFya3VwKCRjb250YWluZXIsIHNldHRpbmdzLCBzaG93U2lnbkluQnV0dG9uLCBwaG90b0dhbGxlcnlTZXR0aW5ncyk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldExvZ29TZXR0aW5ncyhsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgfCBzdHJpbmcpOiBKUXVlcnlEZWZlcnJlZDxJTG9nb1NldHRpbmdzPiB7XHJcbiAgY29uc3QgJGRlZmZlcmVkOiBKUXVlcnlEZWZlcnJlZDxJTG9nb1NldHRpbmdzPiA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgaWYgKHR5cGVvZiBsb2dvU2V0dGluZ3MgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBjb25zdCBjYWNoZWRTZXR0aW5nc1JhdyA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKExPR09fU0VUVElOR1NfQ0FDSEVfS0VZKTtcclxuICAgIGlmIChjYWNoZWRTZXR0aW5nc1Jhdykge1xyXG4gICAgICAkZGVmZmVyZWQucmVzb2x2ZShKU09OLnBhcnNlKGNhY2hlZFNldHRpbmdzUmF3KSBhcyBJTG9nb1NldHRpbmdzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbmRSZXF1ZXN0KGxvZ29TZXR0aW5ncywgJ3Bvc3QnKS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgYXBwbGljYXRpb25OYW1lOiBkYXRhLkFwcGxpY2F0aW9uTmFtZSxcclxuICAgICAgICAgIGJ1c2luZXNzTmFtZTogZGF0YS5CdXNpbmVzc05hbWUsXHJcbiAgICAgICAgICBsYW5kaW5nUGFnZUxvZ286IGRhdGEuTGFuZGluZ1BhZ2VMb2dvLFxyXG4gICAgICAgICAgbG9nb0ltYWdlOiBkYXRhLkxvZ29JbWFnZSxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLkRlc2NyaXB0aW9uXHJcbiAgICAgICAgfSBhcyBJTG9nb1NldHRpbmdzO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKExPR09fU0VUVElOR1NfQ0FDSEVfS0VZLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcclxuICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgJGRlZmZlcmVkLnJlc29sdmUobG9nb1NldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkZGVmZmVyZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxhbmRpbmdNYXJrdXAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MsIHNob3dTaWduSW5CdXR0b246IGJvb2xlYW4sIHBob3RvR2FsbGVyeVNldHRpbmdzOiBJQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MpIHtcclxuICBjb25zdCAkbGFuZGluZ1BhZ2UgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2lzem9sZWEtbGFuZGluZy1wYWdlJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgbGV0ICRsYW5kaW5nQ29udGFpbmVyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsYW5kaW5nLWNvbnRhaW5lcicpLmFwcGVuZFRvKCRsYW5kaW5nUGFnZSk7XHJcblxyXG4gIGlmKHBob3RvR2FsbGVyeVNldHRpbmdzLmVuYWJsZWQpIHtcclxuICAgICRsYW5kaW5nUGFnZS5hZGRDbGFzcygncGhvdG8tZ2FsbGVyeS1tb2RlJyk7XHJcbiAgfSBlbHNlIHtcclxuICAgICRsYW5kaW5nUGFnZS5hZGRDbGFzcygnZGVmYXVsdC1tb2RlJyk7XHJcbiAgICAkbGFuZGluZ0NvbnRhaW5lciA9ICRsYW5kaW5nUGFnZTtcclxuICB9XHJcblxyXG4gICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9nby1jb250YWluZXInKVxyXG4gICAgLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKVxyXG4gICAgLmFwcGVuZChcclxuICAgICAgJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sYW5kaW5nUGFnZUxvZ28pLmFkZENsYXNzKCdsb2dvLWxhcmdlJykuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpLFxyXG4gICAgICAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdidXNpbmVzcy1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcilcclxuICApO1xyXG5cclxuICAkKCc8aDIgLz4nKS50ZXh0KGBXZWxjb21lIHRvICR7bG9nb1NldHRpbmdzLmRlc2NyaXB0aW9ufWApLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKTtcclxuXHJcbiAgaWYgKHNob3dTaWduSW5CdXR0b24pIHtcclxuICAgICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnc2lnbi1pbi1idXR0b24nKS5hcHBlbmQoJCgnPGRpdiAvPicpLmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogJ1NpZ24gSW4nLFxyXG4gICAgICB3aWR0aDogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gdW5kZWZpbmVkIDogJzIwMHB4JyxcclxuICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLmNsZWFyKCk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgL0hvbWUvTG9naW4/cmV0dXJuVXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmLnRvU3RyaW5nKCkpfWA7XHJcbiAgICAgIH1cclxuICAgIH0pKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBpZihwaG90b0dhbGxlcnlTZXR0aW5ncy5lbmFibGVkKSB7XHJcbiAgICBzaG93SW1hZ2VWaWV3ZXIoXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLiRjb250YWluZXIgfHwgJGxhbmRpbmdQYWdlLFxyXG4gICAgICBwaG90b0dhbGxlcnlTZXR0aW5ncy5pbWFnZVVybHMgfHwgW10sXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLmltZ0NoYW5nZUludGVydmFsU2VjIHx8IDgsXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLnRyYW5zaXRpb25UaW1lU2VjIHx8IDJcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gY3JlYXRlQWNjZXNzRGVuaWVkVG9SZXBvcnQoJGNvbnRhaW5lcjogSlF1ZXJ5LCBhbGxvd2VkUmVwb3J0Um9sZXM6IHN0cmluZ1tdLCBhbGxvd2VkQ29ubmVjdGlvblJvbGVzOiBzdHJpbmdbXSkge1xyXG4gIGNvbnN0ICRpc3pvbGVhQ29udGFpbmVyID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnYWNjZXNzLWRlbmllZC10by1yZXBvcnQtcGFnZScpLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICQoJzxoMj4nKS5hZGRDbGFzcygnZXJyb3ItdGV4dCcpLnRleHQoJ0FjY2VzcyBkZW5pZWQgdG8gdGhlIHJlcG9ydCcpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuXHJcbiAgaWYgKGFsbG93ZWRSZXBvcnRSb2xlcyAmJiBhbGxvd2VkUmVwb3J0Um9sZXMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCByZXBvcnRSb2xlcyA9IGFsbG93ZWRSZXBvcnRSb2xlcy5tYXAoKHIpID0+ICQoJzxzcGFuPicpLmFkZENsYXNzKCdyb2xlJykudGV4dChyKSk7XHJcbiAgICAkKCc8cD4nKS50ZXh0KCdSZXF1aXJlZCByb2xlcyBmb3IgcmVwb3J0OiAnKS5hcHBlbmQocmVwb3J0Um9sZXMpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIGlmIChhbGxvd2VkQ29ubmVjdGlvblJvbGVzICYmIGFsbG93ZWRDb25uZWN0aW9uUm9sZXMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBjb25uZWN0aW9uc1JvbGVzID0gYWxsb3dlZENvbm5lY3Rpb25Sb2xlcy5tYXAoKHIpID0+ICQoJzxzcGFuPicpLmFkZENsYXNzKCdyb2xlJykudGV4dChyKSk7XHJcbiAgICAkKCc8cD4nKS50ZXh0KCdSZXF1aXJlZCByb2xlcyBmb3IgZGIgY29ubmVjdGlvbjogJykuYXBwZW5kKGNvbm5lY3Rpb25zUm9sZXMpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvRnVsbFNjcmVlbic7XHJcbmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElDZG1SZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgQ29udHJvbENvbmZpZ3VyYXRvciwgSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIH0gZnJvbSAnLi9Db250cm9sQ29uZmlndXJhdG9yJztcclxuaW1wb3J0IHsgQ29udHJvbERpc3BsYXksIElDb250cm9sRGlzcGxheU9wdGlvbnMgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5JztcclxuaW1wb3J0IHsgRGlzcGxheU1hbmFnZXIsIElEaXNwbGF5TWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0Rpc3BsYXlNYW5hZ2VyJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNETVJlcG9ydFBhZ2VPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zO1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGNkbVJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0RNUmVwb3J0UGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIFNldHRpbmdzJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGlzcGxheSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTVE9SQUdFX01PREVfS0VZID0gJ0NETV9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcm9vdEVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sQ29uZmlndXJhdG9yT3B0aW9uczogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheU1hbmFnZXJPcHRpb25zOiBJRGlzcGxheU1hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbERpc3BsYXlPcHRpb25zOiBJQ29udHJvbERpc3BsYXlPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgbXVsdGlWaWV3OiBEZXZFeHByZXNzLnVpLmR4TXVsdGlWaWV3O1xyXG4gIHByaXZhdGUgdGFiUGFuZWw6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbDtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyO1xyXG5cclxuICBwcml2YXRlIG1vZGU6IE1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDRE1SZXBvcnRQYWdlT3B0aW9ucykge1xyXG4gICAgY29uc3QgYmFzZVVybCA9IGAvJHtvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmx9LyR7b3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YDtcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50ID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zID0gdGhpcy5nZXRDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyhiYXNlVXJsLCBvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmwpO1xyXG4gICAgdGhpcy5kaXNwbGF5TWFuYWdlck9wdGlvbnMgPSB0aGlzLmdldERpc3BsYXlNYW5hZ2VyT3B0aW9ucyhiYXNlVXJsKTtcclxuICAgIHRoaXMuY29udHJvbERpc3BsYXlPcHRpb25zID0gdGhpcy5nZXRDb250cm9sRGlzcGxheU9wdGlvbnMoYmFzZVVybCwgb3B0aW9ucy51c2VyTmFtZSwgb3B0aW9ucy5yZXBvcnRQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLm11bHRpVmlldz8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy50YWJQYW5lbD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJEaXNwbGF5KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlclRhYlBhbmVsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zKGJhc2VVcmw6IHN0cmluZywgY2RtUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKTogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICRjb250YWluZXI6IG51bGwsXHJcbiAgICAgIGlzU3RhbmRhbG9uZVBhZ2U6IGZhbHNlLFxyXG4gICAgICBwYWdlVGl0bGU6ICcnLFxyXG4gICAgICBhdmFpbGFibGVSb2xlc1VybDogYC8ke2NkbVJlcG9ydENvbnRyb2xsZXJVcmx9L0F2YWlsYWJsZVJvbGVzYCxcclxuICAgICAgZ3JvdXBGaWVsZHNVcmw6IGAke2Jhc2VVcmx9L0FsbENvbnRyb2xGaWVsZHNgLFxyXG4gICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vQ29uZmlndXJhdG9yRGF0YWAsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbmZpZ3VyYXRvckRhdGFgXHJcbiAgICB9IGFzIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGlzcGxheU1hbmFnZXJPcHRpb25zKGJhc2VVcmw6IHN0cmluZyk6IElEaXNwbGF5TWFuYWdlck9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJGNvbnRhaW5lcjogbnVsbCxcclxuICAgICAgaXNTdGFuZGFsb25lUGFnZTogZmFsc2UsXHJcbiAgICAgIHBhZ2VUaXRsZTogJycsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheVVzZXJBc3NpZ25tZW50c2AsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5VXNlckFzc2lnbm1lbnRzYFxyXG4gICAgfSBhcyBJRGlzcGxheU1hbmFnZXJPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb250cm9sRGlzcGxheU9wdGlvbnMoXHJcbiAgICBiYXNlVXJsOiBzdHJpbmcsXHJcbiAgICB1c2VyTmFtZTogc3RyaW5nLFxyXG4gICAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zXHJcbiAgKTogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkY29udGFpbmVyOiBudWxsLFxyXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcclxuICAgICAgcGFnZVRpdGxlOiAnJyxcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHJlcG9ydFBhcmFtcy5OYW1lLFxyXG4gICAgICB1c2VyQ29uZmlnVXJsOiBgJHtiYXNlVXJsfS9GaWVsZHNQZXJtaXNzaW9uc2AsXHJcbiAgICAgIGNvbnRyb2xMb2dzVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sTG9nc2AsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheURhdGFgLFxyXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheURhdGFgLFxyXG4gICAgICB1c2VyTmFtZSxcclxuICAgICAgaW1wb3J0RmlsZU9wdGlvbnM6IHJlcG9ydFBhcmFtcy5BbGxvd0ltcG9ydGluZyA/IHtcclxuICAgICAgICBtb2RlOiByZXBvcnRQYXJhbXMuSW1wb3J0RmlsZU1vZGUsXHJcbiAgICAgICAgY3JlYXRlVGFibGVVcmw6IGAke2Jhc2VVcmx9L2NyZWF0ZS10YWJsZWAsXHJcbiAgICAgICAgYWRkUm93c1VybDogYCR7YmFzZVVybH0vYWRkLXJvd3NgLFxyXG4gICAgICAgIGZpbGVVcGxvYWRVcmw6IGAke2Jhc2VVcmx9L2dldC1jb2x1bW5zYCxcclxuICAgICAgICBwcmVkZWZpbmVkVGFibGU6IHJlcG9ydFBhcmFtcy5GaWxlSW1wb3J0ZXJUYWJsZUluZm9cclxuICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRmlsdGVyc2AsXHJcbiAgICAgICAgaW5zZXJ0RGF0YVVybDogYCR7YmFzZVVybH0vQWRkQ29udHJvbEZpbHRlcmAsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbEZpbHRlcmAsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbEZpbHRlcmBcclxuICAgICAgfSxcclxuICAgICAgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbFZpZXdzYCxcclxuICAgICAgICBpbnNlcnREYXRhVXJsOiBgJHtiYXNlVXJsfS9BZGRDb250cm9sVmlld2AsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbFZpZXdgLFxyXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xWaWV3YFxyXG4gICAgICB9LFxyXG4gICAgICBncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRGlzcGxheXNgLFxyXG4gICAgICAgIGluc2VydERhdGFVcmw6IGAke2Jhc2VVcmx9L0FkZENvbnRyb2xEaXNwbGF5YCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheWAsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbERpc3BsYXlgXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzYCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc2AsXHJcbiAgICAgIH1cclxuICAgIH0gYXMgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEaXNwbGF5KCkge1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XHJcbiAgICBjb25zdCAkdmlldyA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy5tdWx0aVZpZXcgPSAkdmlldy5keE11bHRpVmlldyh7XHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbnRyb2xEaXNwbGF5KHsgLi4udGhpcy5jb250cm9sRGlzcGxheU9wdGlvbnMsICRjb250YWluZXI6ICQoJzxkaXYgLz4nKSB9KTtcclxuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC4kY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2NkbS1yZXBvcnRfX2Rpc3BseS1ncmlkJykuZHhNdWx0aVZpZXcoJ2luc3RhbmNlJyk7XHJcbiAgICBmdWxsU2NyZWVuKHRoaXMubXVsdGlWaWV3LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRhYlBhbmVsKCkge1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XHJcblxyXG4gICAgY29uc3QgJG1haW5UYWJQYW5lbCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy50YWJQYW5lbCA9IHRoaXMuY3JlYXRlVGFiUGFuZWwoJG1haW5UYWJQYW5lbCk7XHJcbiAgICBmdWxsU2NyZWVuKHRoaXMudGFiUGFuZWwsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVGFiUGFuZWwoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbCB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5keFRhYlBhbmVsKHtcclxuICAgICAgc3dpcGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgc2hvd05hdkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgIGZvY3VzU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgYWN0aXZlU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5yZXBhaW50KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0b3InLFxyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbnRyb2xDb25maWd1cmF0b3IoeyAuLi50aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAnRGlzcGxheSBNYW5hZ2VyJyxcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBEaXNwbGF5TWFuYWdlcih7IC4uLnRoaXMuZGlzcGxheU1hbmFnZXJPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICBdXHJcbiAgICB9KS5hZGRDbGFzcygnY2RtLXJlcG9ydF9fY29uZmlndXJhdGlvbi10YWItcGFuZWwnKVxyXG4gICAgICAuZHhUYWJQYW5lbCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGZ1bmN0aW9uIGluaXRQb3BvdmVyKGxpbms6IHN0cmluZywgZGV0YWlsczogc3RyaW5nKTogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIge1xyXG4gIGNvbnN0IGh0bWwgPSAkKCc8cC8+JykuaHRtbChkZXRhaWxzKS50ZXh0KCk7XHJcblxyXG4gIGNvbnN0IHBvcG92ZXIgPSAkKCc8ZGl2PicsIHsgY2xhc3M6ICdyZXBvcnQtZGV0YWlscy1wb3BvdmVyJyB9KVxyXG4gICAgLmh0bWwoaHRtbClcclxuICAgIC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcclxuXHJcbiAgcmV0dXJuICQocG9wb3ZlcikuZHhQb3BvdmVyKHtcclxuICAgIHRhcmdldDogbGluayxcclxuICAgIHNob3dFdmVudDogJ2R4Y2xpY2snLFxyXG4gICAgcG9zaXRpb246ICdib3R0b20nLFxyXG4gICAgd2lkdGg6IDUwMFxyXG4gIH0pLmR4UG9wb3ZlcignaW5zdGFuY2UnKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHtDU1NfQ0xBU1NFU30gZnJvbSAnLi4vLi4vLi4vU3R5bGluZy9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbE9wdGlvbnMge1xyXG4gIGV4cG9ydEZpbGVOYW1lPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgc2hvd1N1bW1hcnlJbkNvbHVtbj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRhR3JpZChcclxuICAkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zOiBJR3JpZEFkZGl0aW9uYWxPcHRpb25zID0ge30sXHJcbiAgaGVhZGVyVGV4dD86IHN0cmluZywgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsIGRlZmF1bHRDb2x1bW5XaWR0aCA9IGZhbHNlXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgbGV0IGlzR3JpZEluaXRpYWxpemFlZCA9IGZhbHNlO1xyXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0ge1xyXG4gICAgZXhwb3J0OiB7XHJcbiAgICAgIGVuYWJsZWQ6ICEhYWRkaXRpb25hbE9wdGlvbnMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlXHJcbiAgICB9LFxyXG4gICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuXHJcbiAgICBzZWxlY3Rpb246IHttb2RlOiAnbXVsdGlwbGUnfSxcclxuICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge2VuYWJsZWQ6IGZhbHNlfSxcclxuICAgIHBhZ2luZzoge3BhZ2VTaXplOiA1MH0sXHJcbiAgICBzZWFyY2hQYW5lbDoge3Zpc2libGU6IHRydWV9LFxyXG4gICAgZmlsdGVyUm93OiB7dmlzaWJsZTogdHJ1ZX0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHt2aXNpYmxlOiB0cnVlfSxcclxuICAgIHNjcm9sbGluZzoge21vZGU6ICd2aXJ0dWFsJ30sXHJcbiAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZS5jb21wb25lbnQpO1xyXG5cclxuICAgICAgaWYgKGlzR3JpZEluaXRpYWxpemFlZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaXNHcmlkSW5pdGlhbGl6YWVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICghZGVmYXVsdENvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmNvbXBvbmVudC5jb2x1bW5Db3VudCgpOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICdkYXRhVHlwZScpO1xyXG5cclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcpKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxMDBweCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTUwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy90byBmaXggYXV0b3Njcm9sbFxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZS5jb21wb25lbnQuZ2V0U2Nyb2xsYWJsZSgpO1xyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsYWJsZSkge1xyXG4gICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7dG9wOiAwfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmIChoZWFkZXJUZXh0KSB7XHJcbiAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICAgIHRlbXBsYXRlKCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoaGVhZGVyVGV4dCk7XHJcbiAgICAgICAgICAgIGlmIChoZWFkZXJEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgIGhlYWRlckVsLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYXMnKS5hZGRDbGFzcygnZmEtaW5mby1jaXJjbGUnKS5hZGRDbGFzcygncmVwb3J0LWRldGFpbHMtbGluaycpLmF0dHIoJ3RpdGxlJywgJ0NsaWNrIHRvIHNlZSBmdXJ0aGVyIGRldGFpbHMnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gZGF0YUdyaWRPcHRpb25zLm9uQ29udGVudFJlYWR5XHJcbiAgICA/IChlKSA9PiB7XHJcbiAgICAgIGRlZmF1bHRPcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgICBkYXRhR3JpZE9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgICA6IGRlZmF1bHRPcHRpb25zLm9uQ29udGVudFJlYWR5O1xyXG5cclxuICB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIGRhdGFHcmlkT3B0aW9ucywge29uQ29udGVudFJlYWR5fSk7XHJcblxyXG4gIGNvbnN0IGdyaWQgPSAkdGFyZ2V0LmR4RGF0YUdyaWQobWVyZ2VkT3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucykge1xyXG4gIGlmIChkYXRhR3JpZE9wdGlvbnM/LnN1bW1hcnk/LnRvdGFsSXRlbXM/LnNvbWUoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBsZXQgc3VtbWFyeUNvbHVtbiA9IGFkZGl0aW9uYWxPcHRpb25zPy5zdW1tYXJ5Q29sdW1uO1xyXG4gIGlmICghc3VtbWFyeUNvbHVtbiAmJiBkYXRhR3JpZE9wdGlvbnM/LmNvbHVtbnM/Lmxlbmd0aCkge1xyXG4gICAgc3VtbWFyeUNvbHVtbiA9IHR5cGVvZiBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXSA9PT0gJ3N0cmluZydcclxuICAgICAgPyBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXVxyXG4gICAgICA6IGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdLmRhdGFGaWVsZDtcclxuICB9XHJcblxyXG4gIGlmIChzdW1tYXJ5Q29sdW1uKSB7XHJcbiAgICBpZiAoIWRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5KSB7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zKSB7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zLnB1c2goe1xyXG4gICAgICBjb2x1bW46IHN1bW1hcnlDb2x1bW4sXHJcbiAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKFxyXG4gICR0YXJnZXQsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZywgZGVmYXVsdENvbHVtbldpZHRoID0gZmFsc2UsIHNraXBGdWxsU2NyZWVuID0gZmFsc2VcclxuKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBncmlkID0gY3JlYXRlRGVmYXVsdERhdGFHcmlkKCR0YXJnZXQsIGRhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMsIGhlYWRlclRleHQsIGhlYWRlckRlc2NyaXB0aW9uLCBkZWZhdWx0Q29sdW1uV2lkdGgpO1xyXG5cclxuICBpZiAoIXNraXBGdWxsU2NyZWVuKSB7XHJcbiAgICBmdWxsU2NyZWVuKGdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUodGV4dCwgdGl0bGUpIHtcclxuICByZXR1cm4gJCgnPHNwYW4+JylcclxuICAgIC5hdHRyKCd0aXRsZScsIHRpdGxlKVxyXG4gICAgLnRleHQodGV4dCk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQsIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHtJTG9va3VwRHRvfSBmcm9tICcuLi8uLi8uLi9EYXRhL0FwaVJlc3BvbnNlJztcclxuXHJcbi8vIE5PVEU6IGNvbnN0IGRlZmF1bHRTaG93ZWRSb2xlcyA9IFsnUHJvZHVjdGlvbicsICdTYWxlcycsICdGbG9vciddO1xyXG5jb25zdCByb2xlc09yZGVyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIERpc3BsYXlUeXBlIHtcclxuICBJY29ucyA9IDEsXHJcbiAgUHJlZGVmaW5lZFZhbHVlcyA9IDIsXHJcbiAgUmFiYml0QWN0aW9uID0gM1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElJY29uc0NvbHVtbkVkaXRvckl0ZW0ge1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBpbWFnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbSB7XHJcbiAgdmFsdWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSB7XHJcbiAgYWN0aW9uVHlwZTogc3RyaW5nO1xyXG4gIGZpZWxkczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElEaXNwbGF5VHlwZVNldHRpbmdzID0gSURpc3BsYXlJY29uc1R5cGVTZXR0aW5ncyB8IElEaXNwbGF5SVByZWRlZmluZWRWYWx1ZXNUeXBlU2V0dGluZ3MgfCBJRGlzcGxheUlSYWJiaXRBY3Rpb25UeXBlU2V0dGluZ3M7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SWNvbnNUeXBlU2V0dGluZ3Mge1xyXG4gIHR5cGU6IERpc3BsYXlUeXBlLkljb25zO1xyXG4gIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheUlQcmVkZWZpbmVkVmFsdWVzVHlwZVNldHRpbmdzIHtcclxuICB0eXBlOiBEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzO1xyXG4gIGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SVJhYmJpdEFjdGlvblR5cGVTZXR0aW5ncyB7XHJcbiAgdHlwZTogRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uO1xyXG4gIGRhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgYXZhaWxhYmxlUm9sZXNVcmw6IHN0cmluZztcclxuICBncm91cEZpZWxkc1VybDogc3RyaW5nO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhIHtcclxuICBmaWVsZHM6IElMb29rdXBEdG88c3RyaW5nPltdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbENvbmZpZ3VyYXRvciB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGF2YWlsYWJsZVJvbGVzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncm91cEZpZWxkc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5VHlwZXM6IGFueVtdID0gW1xyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLkljb25zLCB2YWx1ZTogJ0ljb25zJyB9LFxyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMsIHZhbHVlOiAnUHJlZGVmaW5lZFZhbHVlcycgfSxcclxuICAgIHsga2V5OiBEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb24sIHZhbHVlOiAnUmFiYml0QWN0aW9uJyB9XHJcbiAgXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnMgPSB7XHJcbiAgICBbRGlzcGxheVR5cGUuSWNvbnNdOiBJY29uc0NvbHVtbkVkaXRvcixcclxuICAgIFtEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzXTogUHJlZGVmaW5lZFZhbHVlc0NvbHVtbkVkaXRvcixcclxuICAgIFtEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb25dOiBSYWJiaXRBY3Rpb25Db2x1bW5FZGl0b3IsXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnNJbml0RGF0YSA6IHtbaWQ6IG51bWJlcl0gOiBvYmplY3Q7fSA9IHt9O1xyXG4gIHByaXZhdGUgcm9sZXM6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBmaWVsZHM6IElMb29rdXBEdG88c3RyaW5nPltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5hdmFpbGFibGVSb2xlc1VybCA9IG9wdGlvbnMuYXZhaWxhYmxlUm9sZXNVcmw7XHJcbiAgICB0aGlzLmdyb3VwRmllbGRzVXJsID0gb3B0aW9ucy5ncm91cEZpZWxkc1VybDtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoJ2Fwcy1ncmlkJyk7XHJcblxyXG4gICAgUHJvbWlzZS5hbGwoW1xyXG4gICAgICB0aGlzLmdldEF2YWlsYWJsZVJvbGVzKCksXHJcbiAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlRmllbGRzKClcclxuICAgIF0pLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLnJvbGVzID0gcmVzdWx0WzBdO1xyXG4gICAgICB0aGlzLmZpZWxkcyA9IHJlc3VsdFsxXTtcclxuICAgICAgdGhpcy5lZGl0b3JzSW5pdERhdGFbRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uXSA9IHsgZmllbGRzOiB0aGlzLmZpZWxkcyB9O1xyXG4gICAgICB0aGlzLmNyZWF0ZU1haW5HcmlkKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlUm9sZXMoKSB7XHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3Q8QXJyYXk8eyBOYW1lOiBzdHJpbmcgfT4+KHRoaXMuYXZhaWxhYmxlUm9sZXNVcmwpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5tYXAoKHIpID0+IHIuTmFtZSkuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFPcmRlciA9IHJvbGVzT3JkZXIuZ2V0KGEpIHx8IDk5OTk7XHJcbiAgICAgICAgY29uc3QgYk9yZGVyID0gcm9sZXNPcmRlci5nZXQoYikgfHwgOTk5OTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRBdmFpbGFibGVGaWVsZHMoKTogUHJvbWlzZTxJTG9va3VwRHRvPHN0cmluZz5bXT4ge1xyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZ3JvdXBGaWVsZHNVcmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5VHlwZUVkaXRvcigkY29udGFpbmVyLCB0eXBlLCBkYXRhKSB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcnNbdHlwZV07XHJcbiAgICBjb25zdCBpbml0RGF0YSA9IHRoaXMuZWRpdG9yc0luaXREYXRhW3R5cGVdO1xyXG5cclxuICAgIHJldHVybiBlZGl0b3JcclxuICAgICAgPyBuZXcgZWRpdG9yKCRjb250YWluZXIsIGRhdGEsIGluaXREYXRhKVxyXG4gICAgICA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkKCkge1xyXG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuXHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoKSxcclxuICAgICAgY29sdW1uQ2hvb3Nlcjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgYWxsb3dTZWFyY2g6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ3NlbGVjdCdcclxuICAgICAgfSxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICByZWZyZXNoTW9kZTogJ3JlcGFpbnQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlcGFpbnRDaGFuZ2VzT25seTogdHJ1ZSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczoge1xyXG4gICAgICAgIHN1bW1hcnk6IHRydWUsXHJcbiAgICAgICAgcGFnaW5nOiB0cnVlLFxyXG4gICAgICAgIGdyb3VwaW5nOiBmYWxzZSxcclxuICAgICAgICBzb3J0aW5nOiBmYWxzZSxcclxuICAgICAgICBmaWx0ZXJpbmc6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7XHJcbiAgICAgICAgYWxsb3dDb2xsYXBzaW5nOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ211bHRpcGxlJ1xyXG4gICAgICB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IGZhbHNlLFxyXG4gICAgICBjb2x1bW5IaWRpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvbHVtbkF1dG9XaWR0aDogZmFsc2UsXHJcbiAgICAgIHJvd0FsdGVybmF0aW9uRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1uTWluV2lkdGg6IDgwLFxyXG4gICAgICBvblJvd1VwZGF0aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5uZXdEYXRhIHx8ICFlLm9sZERhdGEpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGUuY29tcG9uZW50LmJlZ2luQ3VzdG9tTG9hZGluZygnVXBkYXRpbmcnKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFJvbGVzID0gZS5uZXdEYXRhLlJvbGVzO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSb2xlcyA9IGUub2xkRGF0YS5Sb2xlcztcclxuXHJcbiAgICAgICAgY29uc3QgYWRkT2xkRGF0YVRvTmV3RGF0YSA9IChmaWVsZE5hbWU6IHN0cmluZywgbmV3RGF0YVNlY3Rpb24gPSBlLm5ld0RhdGEsIG9sZERhdGFTZWN0aW9uID0gZS5vbGREYXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIW5ld0RhdGFTZWN0aW9uLmhhc093blByb3BlcnR5KGZpZWxkTmFtZSkpIHtcclxuICAgICAgICAgICAgbmV3RGF0YVNlY3Rpb25bZmllbGROYW1lXSA9IG9sZERhdGFTZWN0aW9uW2ZpZWxkTmFtZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHVwZGF0ZWRSb2xlcyAmJiBjdXJyZW50Um9sZXMpIHtcclxuICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHVwZGF0ZWRSb2xlcylcclxuICAgICAgICAgICAgLmZvckVhY2goKHJvbGVOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZFJvbGUgPSB1cGRhdGVkUm9sZXNbcm9sZU5hbWVdO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSb2xlID0gY3VycmVudFJvbGVzW3JvbGVOYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgdXBkYXRlZFJvbGUuSWQgPSBjdXJyZW50Um9sZS5JZDtcclxuXHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVDcmVhdGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZVJlYWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlVXBkYXRlZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVEZWxldGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdMYWJlbCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ09yZGVyJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnVG9vbFRpcCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzRGVmYXVsdFZpZXdGaWVsZCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzS2V5Q29sdW1uJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnR3JvdXBGaWVsZCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0Rpc3BsYXlUeXBlJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnRGF0YU93bmVyJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnWExTU2NoZWR1bGVMYWJlbCcpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblJvd1VwZGF0ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlcGFpbnQoKTtcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogdGhpcy5wcmVwYXJlTWFpbkdyaWRDb2x1bW5zKFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgIGNhcHRpb246ICdGaWVsZCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgZml4ZWQ6IHRydWUsXHJcbiAgICAgICAgICBmaXhlZFBvc2l0aW9uOiAnbGVmdCcsXHJcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxyXG4gICAgICAgICAgd2lkdGg6IDE4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0dyb3VwRmllbGQnLFxyXG4gICAgICAgICAgY2FwdGlvbjogJ0dyb3VwJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgICBlZGl0Q2VsbFRlbXBsYXRlOiAoXywgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxJbmZvLnZhbHVlLFxyXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U6IFsuLi5uZXcgU2V0KGdyaWQuZ2V0RGF0YVNvdXJjZSgpLml0ZW1zKCkuZmlsdGVyKChpKSA9PiBpLkdyb3VwRmllbGQpLm1hcCgoaSkgPT4gaS5Hcm91cEZpZWxkKS5zb3J0KCkpXSxcclxuICAgICAgICAgICAgICBhY2NlcHRDdXN0b21WYWx1ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnTGFiZWwnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1R5cGUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0RhdGFPd25lcicsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRE8nLCAnRGF0YSBPd25lcicpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdYTFNTY2hlZHVsZUxhYmVsJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdYTFMnLCAnWExTIFNjaGVkdWxlIExhYmVsJylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0Rpc3BsYXlUeXBlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxNjAsXHJcbiAgICAgICAgICBjdXN0b21pemVUZXh0OiAoY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjZWxsSW5mby52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoY2VsbEluZm8udmFsdWUgYXMgc3RyaW5nKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGlzcGxheVR5cGVzXHJcbiAgICAgICAgICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBzZXR0aW5ncy50eXBlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZWRpdENlbGxUZW1wbGF0ZTogKF8sIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShjZWxsSW5mby52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzZXR0aW5ncyA/IHNldHRpbmdzLnR5cGUgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXRhIDogW107XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICAgICAgICAgIGRyb3BEb3duT3B0aW9uczogeyB3aWR0aDogNDAwIH0sXHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5kaXNwbGF5VHlwZXMsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAna2V5JyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcclxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaXRlciA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RvciA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRib2R5ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbjogOHB4IDA7XCIgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRidXR0b25zID0gJCgnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O1wiIC8+JykuYXBwZW5kVG8oJGNvbnRhaXRlcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkc2F2ZUJ1dHRvbiA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDtcIiAvPicpLmFwcGVuZFRvKCRidXR0b25zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRjYW5jZWxCdXR0b24gPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7XCIgLz4nKS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGVkaXRvciA9IHR5cGVcclxuICAgICAgICAgICAgICAgICAgPyB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCB0eXBlLCBkYXRhKVxyXG4gICAgICAgICAgICAgICAgICA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAkYm9keS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yLnJlbmRlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICRzZWxlY3Rvci5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiB0aGlzLmRpc3BsYXlUeXBlcyxcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2tleScsXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCBlLnZhbHVlLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAkYm9keS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IucmVuZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oJ2luc3RhbmNlJykub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFlZGl0b3IsXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhID0gZWRpdG9yLmdldERhdGEoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlZGl0b3JEYXRhID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAkc2VsZWN0b3IuZHhTZWxlY3RCb3goJ2luc3RhbmNlJykub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YTogZWRpdG9yRGF0YVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNsb3NlRWRpdENlbGwoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICRjYW5jZWxCdXR0b24uZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLmNvbXBvbmVudC5jbG9zZUVkaXRDZWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkY29udGFpdGVyLmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaXRlcjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSXNEZWZhdWx0Vmlld0ZpZWxkJyxcclxuICAgICAgICAgIGNhcHRpb246ICdEaXNwbGF5IGluIGRlZmF1bHQgdmlldycsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTAwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSXNLZXlDb2x1bW4nLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE1MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ09yZGVyJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDAsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ09yZGVyIGNhblxcJ3QgYmUgbmVnYXRpdmUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdXaWR0aCcsXHJcbiAgICAgICAgICBkYXRhVHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnV2lkdGgnLCAnV2lkdGggKGluIHBpeGVscyknKSxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDEsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ1dpZHRoIGNhblxcJ3QgYmUgbGVzcyB0aGVuIDFweCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0hpZGluZ09yZGVyJyxcclxuICAgICAgICAgIGRhdGFUeXBlOiAnbnVtYmVyJyxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdIaWRlJywgJ0hpZGluZyBPcmRlcicpLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxyXG4gICAgICAgICAgICAgIG1pbjogMSxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAnSGlkaW5nIG9yZGVyIGNhblxcJ3QgYmUgbGVzcyB0aGVuIDEnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogNzAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdUb29sVGlwJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1pbldpZHRoOiAxODBcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdSb2xlcycsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0hpZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxyXG4gICAgICAgICAgY29sdW1uczogdGhpcy5jcmVhdGVSb2xlc0NvbHVtbnModGhpcy5yb2xlcylcclxuICAgICAgICB9XHJcbiAgICAgIF0pLFxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zO1xyXG5cclxuICAgIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnTmFtZSdcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTdGFuZGFsb25lUGFnZSkge1xyXG4gICAgICBncmlkID0gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKHRoaXMuJGNvbnRhaW5lciwgZ3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCB0aGlzLnBhZ2VUaXRsZSwgJycsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxyXG4gICAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlTWFpbkdyaWRDb2x1bW5zKGNvbHVtbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLmFsbG93SGlkaW5nID09PSB1bmRlZmluZWQgfHwgY29sdW1uLmFsbG93SGlkaW5nID09PSBudWxsKSB7XHJcbiAgICAgICAgY29sdW1uLmFsbG93SGlkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb2x1bW4uc2hvd0luQ29sdW1uQ2hvb3NlciA9PT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID09PSBudWxsKSB7XHJcbiAgICAgICAgY29sdW1uLnNob3dJbkNvbHVtbkNob29zZXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJvbGVzQ29sdW1ucyhyb2xlczogc3RyaW5nW10pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gcm9sZXNcclxuICAgICAgLm1hcCgocm9sZSkgPT4gKHtcclxuICAgICAgICBuYW1lOiByb2xlLFxyXG4gICAgICAgIGNhcHRpb246IHJvbGUsXHJcbiAgICAgICAgYWxsb3dIaWRpbmc6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlUm9sZXNQZXJtaXNzaW9uQ29sdW1uKHJvbGUsICdDYW5CZVJlYWQnLCB7XHJcbiAgICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdSZWFkJywgJ1JlYWQnKVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihyb2xlLCAnQ2FuQmVVcGRhdGVkJywge1xyXG4gICAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRWRpdCcsICdFZGl0JylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihcclxuICAgIHJvbGU6IHN0cmluZywgcGVybWlzc2lvbk5hbWU6IHN0cmluZywgYmFzZUNvbHVtbk9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5cclxuICApOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uYmFzZUNvbHVtbk9wdGlvbnMsXHJcbiAgICAgIG5hbWU6IGAke3JvbGV9XyR7cGVybWlzc2lvbk5hbWV9YCxcclxuICAgICAgZGF0YUZpZWxkOiBgUm9sZXMuJHtyb2xlfS4ke3Blcm1pc3Npb25OYW1lfWAsXHJcbiAgICAgIGFsbG93SGlkaW5nOiBmYWxzZSxcclxuICAgICAgc2hvd0luQ29sdW1uQ2hvb3NlcjogZmFsc2UsXHJcbiAgICAgIGFsbG93SGVhZGVyRmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgYWxsb3dGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICBtaW5XaWR0aDogNjBcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZSgpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgbG9hZFVybDogdGhpcy5sb2FkRGF0YVVybCxcclxuICAgICAgICB1cGRhdGVVcmw6IHRoaXMudXBkYXRlRGF0YVVybCxcclxuICAgICAgICBrZXk6ICdOYW1lJyxcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBJY29uc0NvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgcHJpdmF0ZSBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5kYXRhLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ3JvdycsXHJcbiAgICAgICAgYWxsb3dBZGRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIHVzZUljb25zOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBncm91cGluZzogeyBjb250ZXh0TWVudUVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZmlsdGVyUm93OiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3RpdGxlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2ltYWdlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogKGNvbnRhaW5lciwgY2VsbERhdGEpID0+IHtcclxuICAgICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjZWxsRGF0YS5kYXRhLmltYWdlIH0pKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBjZWxsSW5mby52YWx1ZSB8fCAnJztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIiAvPicpO1xyXG4gICAgICAgICAgICBjb25zdCAkaW1nID0gJChgPGltZyBzcmM9XCIke2ltZ31cIiAvPmApO1xyXG4gICAgICAgICAgICBjb25zdCAkbGluayA9ICQoJzxhIGNsYXNzPVwiZHgtbGluayBkeC1pY29uLXVwbG9hZFwiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyByaWdodDogOHB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTogMThweDtcIiAvPicpO1xyXG4gICAgICAgICAgICBjb25zdCAkZmlsZUlucHV0ID0gJCgnPGlucHV0IHR5cGU9XCJmaWxlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgLz4nKTtcclxuXHJcbiAgICAgICAgICAgICRsaW5rLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgICAkZmlsZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJGZpbGVJbnB1dC5vbignY2hhbmdlJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0IGFzIGFueSkuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgJGltZy5hdHRyKCdzcmMnLCAocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpKTtcclxuICAgICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSAoZS50YXJnZXQgYXMgYW55KS5maWxlc1swXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICRpbWcuYXR0cignc3JjJywgJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkaW1nLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICAgICAgICAgICAkbGluay5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICAgICAgJGZpbGVJbnB1dC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICdlZGl0JyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGhpbnQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgIGljb246ICd0cmFzaCcsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgKHJvd3MgYXMgYW55W10pLnNwbGljZShlLnJvdy5yb3dJbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgcm93cyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0ICRncmlkID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5ncmlkID0gY3JlYXRlRGVmYXVsdEdyaWQoXHJcbiAgICAgICRncmlkLFxyXG4gICAgICB7XHJcbiAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKSBhcyBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBQcmVkZWZpbmVkVmFsdWVzQ29sdW1uRWRpdG9yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xyXG4gIHByaXZhdGUgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG5cclxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuZGF0YSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICB1c2VJY29uczogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgY29udGV4dE1lbnVFbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgd2lkdGg6IDEwMCxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgJ2VkaXQnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGludDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAocm93cyBhcyBhbnlbXSkuc3BsaWNlKGUucm93LnJvd0luZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCByb3dzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgJGdyaWQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCgkZ3JpZCwge1xyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCk6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpIGFzIElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFJhYmJpdEFjdGlvbkNvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluaXREYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9ySW5pdERhdGE7XHJcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSwgaW5pdERhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JJbml0RGF0YSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLmluaXREYXRhID0gaW5pdERhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5mb3JtID0gJCgnPGRpdiAvPicpLmR4Rm9ybSh7XHJcbiAgICAgIGZvcm1EYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2FjdGlvblR5cGUnLFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnZmllbGRzJyxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiAoZS52YWx1ZSBhcyBhbnkpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXF1aXJlZCdcclxuICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgZWRpdG9yVHlwZTogJ2R4VGFnQm94JyxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5pbml0RGF0YS5maWVsZHMsXHJcbiAgICAgICAgICAgIGRpc3BsYXlFeHByOiAnVGV4dCcsXHJcbiAgICAgICAgICAgIHZhbHVlRXhwcjogJ1ZhbHVlJyxcclxuICAgICAgICAgICAgc2VhcmNoRW5hYmxlZDogdHJ1ZVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGFnQm94T3B0aW9uc1xyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSkuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5mb3JtLnZhbGlkYXRlKCk7XHJcblxyXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFjdGlvblR5cGUgPSB0aGlzLmZvcm0uZ2V0RWRpdG9yKCdhY3Rpb25UeXBlJykub3B0aW9uKCd2YWx1ZScpIGFzIHN0cmluZztcclxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZm9ybS5nZXRFZGl0b3IoJ2ZpZWxkcycpLm9wdGlvbigndmFsdWUnKSBhcyBzdHJpbmdbXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICBmaWVsZHNcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4oRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIGFzIGFueSkucmVnaXN0ZXJNb2R1bGUoJ2NvbHVtbkNob29zZXJTb3J0aW5nJywge1xyXG4gIGV4dGVuZGVyczoge1xyXG4gICAgY29udHJvbGxlcnM6IHtcclxuICAgICAgY29sdW1uczoge1xyXG4gICAgICAgIGdldENob29zZXJDb2x1bW5zKGxvYWRBbGxDb2x1bW5zKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSAodGhpcyBhcyBhbnkpLmNhbGxCYXNlKGxvYWRBbGxDb2x1bW5zKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKGNvbHVtbjEsIGNvbHVtbjIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwdGlvbjEgPSBjb2x1bW4xPy5jYXB0aW9uIHx8ICcnO1xyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uMiA9IGNvbHVtbjI/LmNhcHRpb24gfHwgJyc7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2FwdGlvbjEubG9jYWxlQ29tcGFyZShjYXB0aW9uMik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iLCAiXHVGRUZGY29uc3QgYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwgPSAocHJldjogYW55W10gfCBudWxsLCBuZXh0OiBhbnlbXSB8IG51bGwpID0+IHtcclxuICBpZiAocHJldiA9PT0gbnVsbCB8fCBuZXh0ID09PSBudWxsIHx8IHByZXYubGVuZ3RoICE9PSBuZXh0Lmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICBpZiAocHJldltpXSAhPT0gbmV4dFtpXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBtZW1vaXplID0gPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4oZnVuYzogVCk6IFQgPT4ge1xyXG4gIGxldCBsYXN0QXJnczogYW55W10gfCBudWxsID0gbnVsbDtcclxuICBsZXQgbGFzdFJlc3VsdDogdW5rbm93biB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG9ubHktYXJyb3ctZnVuY3Rpb25zXHJcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgIGlmICghYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwobGFzdEFyZ3MsIGFyZ3MpKSB7XHJcbiAgICAgIGxhc3RSZXN1bHQgPSBmdW5jKC4uLmFyZ3MgYXMgYW55KTtcclxuICAgIH1cclxuXHJcbiAgICBsYXN0QXJncyA9IGFyZ3M7XHJcblxyXG4gICAgcmV0dXJuIGxhc3RSZXN1bHQ7XHJcbiAgfSBhcyBUO1xyXG59O1xyXG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xyXG5pbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi9HcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9NZW1vaXplJztcclxuaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlWaWV3IHtcclxuICByZWFkb25seSBpZDogbnVtYmVyO1xyXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xyXG4gIGlzR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5Vmlld0R0byB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgR3JpZFN0YXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gIElzR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgLy8gcmVhZG9ubHkgZGVmYXVsdE9wZW5lZFZpZXdJZDogbnVtYmVyO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbnR5cGUgQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcyA9IFBhcnRpYWw8UGljazxJQ29udHJvbERpc3BsYXlWaWV3LCAnbmFtZScgfCAnZ3JpZFN0YXRlJyB8ICdpc0dsb2JhbCc+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NNYW5hZ2VyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRDb250cm9sRGlzcGxheVZpZXc6IElDb250cm9sRGlzcGxheVZpZXcgPSB7XHJcbiAgICBpZDogMCxcclxuICAgIG5hbWU6ICdEZWZhdWx0JyxcclxuICAgIGdyaWRTdGF0ZTogbnVsbCxcclxuICAgIGlzR2xvYmFsOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRWaWV3cyA9IFtHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXddO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9jdXJyZW50Vmlld0lkOiBudW1iZXIgPSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQ7XHJcbiAgcHJpdmF0ZSB2aWV3czogSUNvbnRyb2xEaXNwbGF5Vmlld1tdID0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Vmlld3M7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdldFZpZXdCeUlkSW50ZXJuYWwgPSAodmlld0lkOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdzICYmIHRoaXMudmlld3MuZmluZCgodikgPT4gdi5pZCA9PT0gdmlld0lkKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRWaWV3QnlJZCA9IG1lbW9pemUodGhpcy5nZXRWaWV3QnlJZEludGVybmFsKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRWaWV3QnlJZCh0aGlzLl9jdXJyZW50Vmlld0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXdJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Vmlld0lkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50Vmlld0lkKGlkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRWaWV3SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3cygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVZpZXdbXT4ge1xyXG4gICAgaWYgKHRoaXMudmlld3MgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdFZpZXdzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudmlld3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudFZpZXcodmlld1VwZGF0ZXM6IENvbnRyb2xEaXNwbGF5Vmlld1VwZGF0ZXMpIHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVZpZXcodGhpcy5jdXJyZW50Vmlldy5pZCwgdmlld1VwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld1ZpZXcodmlld05hbWU6IHN0cmluZywgZ3JpZFN0YXRlOiBJR3JpZFN0YXRlLCBpc0dsb2JhbCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5Vmlldz4ge1xyXG4gICAgbGV0IG5ld1ZpZXdEdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8gPSB0aGlzLm1hcFZpZXdNb2RlbFRvRHRvKHtcclxuICAgICAgaWQ6IC0xLFxyXG4gICAgICBuYW1lOiB2aWV3TmFtZSxcclxuICAgICAgZ3JpZFN0YXRlLFxyXG4gICAgICBpc0dsb2JhbFxyXG4gICAgfSk7XHJcblxyXG4gICAgbmV3Vmlld0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVZpZXdEdG8+KHRoaXMuaW5zZXJ0RGF0YVVybCwgJ1BPU1QnLCBuZXdWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWFwVmlld0R0b1RvTW9kZWwobmV3Vmlld0R0byk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVmlldyh2aWV3SWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkVmlldzogSUNvbnRyb2xEaXNwbGF5VmlldyA9IHtcclxuICAgICAgLi4udmlldyxcclxuICAgICAgLi4udXBkYXRlc1xyXG4gICAgfTtcclxuICAgIGxldCB1cGRhdGVkVmlld0R0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byA9IHRoaXMubWFwVmlld01vZGVsVG9EdG8odXBkYXRlZFZpZXcpO1xyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICB1cGRhdGVkVmlld0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVZpZXdEdG8+KHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsIHVwZGF0ZWRWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlVmlldyh2aWV3SWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IHZpZXdJZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRWaWV3cygpIHtcclxuICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5Vmlld0R0b1tdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuXHJcbiAgICB0aGlzLnZpZXdzID0gdmlld3MubWFwKChkdG8pID0+IHRoaXMubWFwVmlld0R0b1RvTW9kZWwoZHRvKSk7XHJcbiAgICB0aGlzLnZpZXdzLnVuc2hpZnQoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3KTtcclxuICAgIC8vIE5PVEU6IHJlc2V0IG1lbW9pemVcclxuICAgIHRoaXMucmVzZXRDYWNoZWRSZXN1bHRPZkdldFZpZXdCeUlkRnVuY3Rpb24oKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy52aWV3cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwVmlld01vZGVsVG9EdG8obW9kZWw6IElDb250cm9sRGlzcGxheVZpZXcpOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIElkOiBtb2RlbC5pZCxcclxuICAgICAgTmFtZTogbW9kZWwubmFtZSxcclxuICAgICAgR3JpZFN0YXRlOiBKU09OLnN0cmluZ2lmeShtb2RlbC5ncmlkU3RhdGUpLFxyXG4gICAgICBJc0dsb2JhbDogbW9kZWwuaXNHbG9iYWxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcFZpZXdEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byk6IElDb250cm9sRGlzcGxheVZpZXcge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IGR0by5JZCxcclxuICAgICAgbmFtZTogZHRvLk5hbWUsXHJcbiAgICAgIGdyaWRTdGF0ZTogSlNPTi5wYXJzZShkdG8uR3JpZFN0YXRlKSxcclxuICAgICAgaXNHbG9iYWw6IGR0by5Jc0dsb2JhbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDYWNoZWRSZXN1bHRPZkdldFZpZXdCeUlkRnVuY3Rpb24oKSB7XHJcbiAgICB0aGlzLmdldFZpZXdCeUlkID0gbWVtb2l6ZSh0aGlzLmdldFZpZXdCeUlkSW50ZXJuYWwpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gJy4vR3JpZFN0YXRlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBpbml0aWFsU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIge1xyXG4gIHB1YmxpYyBjdXJyZW50U2F2ZWRHcmlkU3RhdGU6IElHcmlkU3RhdGU7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlID0gb3B0aW9ucy5pbml0aWFsU3RhdGU7XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3RhdGVTdG9yaW5nJywge1xyXG4gICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgY3VzdG9tTG9hZDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKVxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdGF0ZVN0b3JpbmcnXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICAvLyBUT0RPOiB1c2UgZGVlcCBlcXVhbFxyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlICE9PSBudWxsICYmIEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudFVuc2F2ZWRHcmlkU3RhdGUpICE9PSBKU09OLnN0cmluZ2lmeShcclxuICAgICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50VW5zYXZlZEdyaWRTdGF0ZSgpOiBJR3JpZFN0YXRlIHtcclxuICAgIHJldHVybiB0aGlzLnByZXBhcmVVbnNhdmVkR3JpZFN0YXRlKHRoaXMub3B0aW9ucy5vd25lci5zdGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhcHBseShncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsLCByZXNldEZpbHRlciA9IHRydWUpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXIgPSByZXNldEZpbHRlciA/IHVuZGVmaW5lZCA6IHRoaXMub3B0aW9ucy5vd25lci5maWx0ZXIoKTtcclxuXHJcbiAgICAgIC8qIE5PVEU6IFNvbWV0aW1lcyBhIGdyaWQgY2FuIHJldHVybiBhIG5ldyBzdGF0ZSB3aXRoIG9sZCBmaWx0ZXJWYWx1ZSxcclxuICAgICAgICBzbyB3ZSBzaG91bGQgcmVzZXQgdGhlIGZpbHRlclZhbHVlIGJlZm9yZSBzdGF0ZSBhcHBseWluZ1xyXG4gICAgICAgIGlmIHRoaXMgYnVnIHdpbGwgYmUgZml4ZWQgb24gdGhlIERldkV4dHJlbWUgc2lkZSB3ZSBjYW4gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZVxyXG4gICAgICAqL1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuYmVnaW5VcGRhdGUoKTtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmNsZWFyRmlsdGVyKCdmaWx0ZXJWYWx1ZScpO1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKGdyaWRTdGF0ZSk7XHJcblxyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMub3B0aW9ucy5vd25lci5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbHRlcigoYykgPT4gIWMudHlwZSk7XHJcblxyXG4gICAgICBpZiAodmlzaWJsZUNvbHVtbnNbMF0gJiYgdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3VtbWFyeScsIHtcclxuICAgICAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgICAgIGNvbHVtbjogdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkLFxyXG4gICAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3VycmVudEZpbHRlciAmJiB0aGlzLm9wdGlvbnMub3duZXIuZmlsdGVyKGN1cnJlbnRGaWx0ZXIpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuZW5kVXBkYXRlKCk7XHJcblxyXG4gICAgICBjb25zdCBvbkNvbnRlbnRSZWFkeSA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9mZignY29udGVudFJlYWR5Jywgb25Db250ZW50UmVhZHkpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9uKCdjb250ZW50UmVhZHknLCBvbkNvbnRlbnRSZWFkeSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUgPSB0aGlzLmN1cnJlbnRVbnNhdmVkR3JpZFN0YXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZVVuc2F2ZWRHcmlkU3RhdGUodW5zYXZlZEdyaWRTdGF0ZTogSUdyaWRTdGF0ZSk6IElHcmlkU3RhdGUge1xyXG4gICAgaWYgKHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1ucykge1xyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSk7XHJcbiAgICAgIGNvbnN0IGxhc3RDb2x1bW4gPSB2aXNpYmxlQ29sdW1uc1t2aXNpYmxlQ29sdW1ucy5sZW5ndGggLSAxXTtcclxuICAgICAgbGFzdENvbHVtbi53aWR0aCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5zYXZlZEdyaWRTdGF0ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIsIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkU3RhdGVNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvTm90aWZ5JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlTWFuYWdlcjogT25lVGltZUdyaWRTdGF0ZU1hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQ/OiAodmlld0lkOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgb25WaWV3RGVsZXRlZD86ICh2aWV3SWQ6IG51bWJlcikgPT4gdm9pZDtcclxuICByZWFkb25seSBjYW5DcmVhdGVHbG9iYWxWaWV3czogYm9vbGVhbjtcclxuICByZWFkb25seSB2aXNpYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIHJlYWRvbmx5IGdyaWRTdGF0ZU1hbmFnZXI6IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMsIGtleW9mIElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PiAmXHJcbiAgTXV0YWJsZTxQYXJ0aWFsPElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zO1xyXG4gIC8vIHRvb2xiYXIgaXRlbXNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfdmlld3NUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICAvLyB0b29sYmFyIHdpZGdldHNcclxuICBwcml2YXRlIHZpZXdzRHJvcGRvd25Cb3g6IERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB2aWV3c0RhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50Vmlld1RpdGxlOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVWaWV3QnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZVZpZXdBc0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGNvbHVtbkNob29zZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGdyaWRTdGF0ZU1hbmFnZXI6IG9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlciA/IG9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlciA6IG5ldyBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlcih7XHJcbiAgICAgICAgb3duZXI6IG9wdGlvbnMub3duZXIsXHJcbiAgICAgICAgaW5pdGlhbFN0YXRlOiBudWxsXHJcbiAgICAgIH0pLFxyXG4gICAgICBncmlkVmlld3NNYW5hZ2VyOiBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgPyBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgOiBuZXcgR3JpZFZpZXdzTWFuYWdlcihvcHRpb25zLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdHJ5QXBwbHlWaWV3KHZpZXdJZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBpc0NhbkJlVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpO1xyXG5cclxuICAgIGlmIChpc0NhbkJlVmlld0FwcGxpZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodmlld0lkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNDYW5CZVZpZXdBcHBsaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5Vmlldyh2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5iZWdpblZpZXdBcHBseWluZ0xvYWRpbmcoKTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID0gdmlld0lkO1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuYXBwbHkodGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcuZ3JpZFN0YXRlLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5lbmRWaWV3QXBwbHlpbmdMb2FkaW5nKCk7XHJcbiAgICB0aGlzLnN5bmNVSVdpdGhDdXJyZW50VmlldygpO1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkKHZpZXdJZCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhclByZXBhcmluZyA9IGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnKTtcclxuXHJcbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBjdXJyZW50VG9vbGJhclByZXBhcmluZyAmJiBjdXJyZW50VG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMgJiYgZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbW92ZURlZmF1bHRDb2x1bW5DaG9vc2VyQnV0dG9uKHRvb2xiYXJJdGVtcyk7XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxyXG4gICAgICB0aGlzLnZpZXdzVG9vbGJhckl0ZW0sXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVEZWZhdWx0Q29sdW1uQ2hvb3NlckJ1dHRvbih0b29sYmFySXRlbXM6IEFycmF5PHsgbmFtZT86IHN0cmluZyB9Pikge1xyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSh0b29sYmFySXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdjb2x1bW5DaG9vc2VyQnV0dG9uJyksIDEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgdmlld3NUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fdmlld3NUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl92aWV3c1Rvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVWaWV3c1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdzVG9vbGJhckl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBpc0RlZmF1bHRWaWV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VmlldyA9IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3O1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRWaWV3VGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpICE9PSBjdXJyZW50Vmlldy5uYW1lIHx8IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmhhc0NoYW5nZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVZpZXdzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdWaWV3cycsXHJcbiAgICAgIHZpc2libGU6IHRoaXMub3B0aW9ucy52aXNpYmxlLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy12aWV3c19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgICAgaXRlbXM6IFtHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXddLFxyXG4gICAgICAgIHZhbHVlOiBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQsXHJcbiAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZScsXHJcbiAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICAgIHdpZHRoOiA1NTBcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgIHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUudmFsdWUgPT09IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgfHwgIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5VmlldyhlLnZhbHVlKTtcclxuICAgICAgICAgIGlmIChpc1ZpZXdBcHBsaWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc3luY1VJV2l0aEN1cnJlbnRWaWV3KHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy52aWV3c0RhdGFHcmlkID0gdGhpcy5jcmVhdGVWaWV3c0RhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSA9IHRoaXMuY3JlYXRlQ3VycmVudFZpZXdUaXRsZShlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLnNhdmVWaWV3QnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0J1dHRvbigpO1xyXG4gICAgICAgICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk7XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbkNob29zZXJCdXR0b24gPSB0aGlzLmNyZWF0ZUNvbHVtbkNob29zZXJCdXR0b24oKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX2hlYWRlcicpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5jdXJyZW50Vmlld1RpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVWaWV3QnV0dG9uLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVWaWV3QXNCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY29sdW1uQ2hvb3NlckJ1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuaGVpZ2h0KCcxMDAlJylcclxuICAgICAgICAgICAgLmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy52aWV3c0RhdGFHcmlkLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGRyb3Bkb3duQ29udGVudDtcclxuICAgICAgICB9LFxyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVZpZXdzRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB2aWV3PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdvcmRXcmFwRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBsb2FkUGFuZWw6IHtcclxuICAgICAgICAgIHNoYWRpbmc6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzR2xvYmFsJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIEdsb2JhbCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgICAgIHdpZHRoOiA3MFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAoZSkgPT4gZS5yb3cgJiYgZS5yb3cua2V5ICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgc2hvd0NvbHVtbkxpbmVzOiBmYWxzZSxcclxuICAgICAgICBzZWxlY3Rpb246IHsgbW9kZTogJ3NpbmdsZScgfSxcclxuICAgICAgICBoZWlnaHQ6ICdjYWxjKDEwMCUgLSA1MXB4KScsXHJcbiAgICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICdzdGFuZGFyZCcgfSxcclxuICAgICAgICBwYWdpbmc6IHsgZW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gdmlld3MnLFxyXG4gICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgIGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd2YWx1ZScsIGUuc2VsZWN0ZWRSb3dLZXlzICYmIGUuc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA/IGUuc2VsZWN0ZWRSb3dLZXlzWzBdIDogMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmRhdGFGaWVsZCA9PT0gJ2lzR2xvYmFsJykge1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMudmlzaWJsZSA9IGUucm93LmRhdGEuaWQgIT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VkID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSBhc3luYyAob3B0KSA9PiB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuYmVnaW5DdXN0b21Mb2FkaW5nKCdVcGRhdGluZycpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLnVwZGF0ZVZpZXcoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBlbmFibGVkID0gIWUuZGF0YS5pc0dsb2JhbFxyXG4gICAgICAgICAgICB8fCAoZS5kYXRhLmlzR2xvYmFsICYmIHRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cyk7XHJcblxyXG4gICAgICAgICAgaWYgKCFlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIEFycmF5LmZyb20oZS5jZWxsRWxlbWVudC5jaGlsZHJlbigpKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgJChjKS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjZGRkICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcclxuICAgICAgICAgICAgICB9KS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dSZW1vdmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZGVsZXRlVmlldyhlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudFZpZXdUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19jdXJyZW50LXZpZXcgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLmlzRGVmYXVsdFZpZXdcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19zYXZlLXZpZXcgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIGRpc2FibGVkOiB0aGlzLmlzRGVmYXVsdFZpZXcsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5zYXZlLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiA4N1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19zYXZlLXZpZXctYXMgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY3JlYXRlU2F2ZUFzRGlhbG9nLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxMThcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb2x1bW5DaG9vc2VyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fY29sdW1uLWNob29zZXIgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgb25DbGljazogdGhpcy5vcGVuQ29sdW1uQ2hvb3Nlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdjb2x1bW4tY2hvb3NlcidcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlQXNEaWFsb2coKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnRFbGVtZW50ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgcGxhY2Vob2xkZXI6ICdWaWV3IE5hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICB9KS5keFZhbGlkYXRvcih7XHJcbiAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveCA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveFZhbGlkYXRvciA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VmFsaWRhdG9yKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHZpZXdOYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgY29uc3Qgdmlld0lzR2xvYmFsQ2hlY2tib3ggPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiIC8+JylcclxuICAgICAgLmR4Q2hlY2tCb3goe1xyXG4gICAgICAgIHRleHQ6ICdHbG9iYWwgdmlldycsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3NcclxuICAgICAgfSlcclxuICAgICAgLmR4Q2hlY2tCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdmlld0lzR2xvYmFsQ2hlY2tib3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEaWFsb2coXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgVmlldycsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzMwMHB4JyxcclxuICAgICAgfSxcclxuICAgICAgJHBvcHVwQ29udGVudCxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdPaycsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcclxuICAgICAgICAgIGlmICghdmlld05hbWVUZXh0Qm94VmFsaWRhdG9yLnZhbGlkYXRlKCkuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zYXZlQXModmlld05hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKSwgdmlld0lzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpKTtcclxuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgb25DbGljazogKGNsb3NlUG9wdXApID0+IGNsb3NlUG9wdXAoKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkNvbHVtbkNob29zZXIoKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMub3duZXIuc2hvd0NvbHVtbkNob29zZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZFZpZXdEcm9wZG93bkJveERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMudmlld3NEcm9wZG93bkJveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgdmlld3MgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5nZXRWaWV3cygpO1xyXG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgIGtleTogJ2lkJyxcclxuICAgICAgZGF0YTogdmlld3NcclxuICAgIH0pO1xyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcclxuICAgIHRoaXMudmlld3NEYXRhR3JpZCAmJiB0aGlzLnZpZXdzRGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmUoKSB7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIudXBkYXRlQ3VycmVudFZpZXcoe1xyXG4gICAgICBuYW1lOiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICBncmlkU3RhdGU6IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbm90aWZ5KCdTYXZlZCcsIHRydWUpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUFzKHZpZXdOYW1lOiBzdHJpbmcsIGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5zYXZlKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVmlldyA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmNyZWF0ZU5ld1ZpZXcoXHJcbiAgICAgIHZpZXdOYW1lLFxyXG4gICAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGUsXHJcbiAgICAgIGlzR2xvYmFsXHJcbiAgICApO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodXBkYXRlZFZpZXcuaWQpO1xyXG5cclxuICAgIG5vdGlmeSgnVmlldyBpcyBjcmVhdGVkJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZVZpZXcodmlld0lkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmRlbGV0ZVZpZXcodmlld0lkKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCh2aWV3SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVnaW5WaWV3QXBwbHlpbmdMb2FkaW5nKCkge1xyXG4gICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlICYmIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3JlYWRPbmx5JywgdHJ1ZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRydWUpO1xyXG4gICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICB0aGlzLnZpZXdzRGF0YUdyaWQgJiYgdGhpcy52aWV3c0RhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnQXBwbHlpbmcuLi4nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5kVmlld0FwcGx5aW5nTG9hZGluZygpIHtcclxuICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCdyZWFkT25seScsIGZhbHNlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gJiYgdGhpcy5zYXZlVmlld0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgdGhpcy52aWV3c0RhdGFHcmlkICYmIHRoaXMudmlld3NEYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNVSVdpdGhDdXJyZW50VmlldyhpZ25vcmVDdXJyZW50Vmlld1RpdGxlID0gZmFsc2UpIHtcclxuICAgIGlmICghaWdub3JlQ3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlldy5uYW1lKTtcclxuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCB0aGlzLmlzRGVmYXVsdFZpZXcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudmlld3NEYXRhR3JpZCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzQnlJbmRleGVzKFswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzKFt0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxWaWV3ID0gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcuaXNHbG9iYWxcclxuICAgICAgJiYgIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cztcclxuXHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRoaXMuaXNEZWZhdWx0VmlldyB8fCBpc0dsb2JhbFZpZXcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXHJcbiAgICAgICdVbnNhdmVkIGNoYW5nZXMnXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL01lbW9pemUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlGaWx0ZXIge1xyXG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGlzRGVmYXVsdDogYm9vbGVhbjtcclxuICByZWFkb25seSBpc0dsb2JhbDogYm9vbGVhbjtcclxuICByZWFkb25seSBmaWx0ZXJTdGF0ZTogYW55IHwgbnVsbDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheUZpbHRlckR0byB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgSXNEZWZhdWx0OiBib29sZWFuO1xyXG4gIElzR2xvYmFsOiBib29sZWFuO1xyXG4gIEZpbHRlclN0YXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zIHtcclxuICAvLyByZWFkb25seSBkZWZhdWx0T3BlbmVkRmlsdGVySWQ6IG51bWJlcjtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIENvbnRyb2xEaXNwbGF5RmlsdGVyVXBkYXRlcyA9IFBhcnRpYWw8UGljazxJQ29udHJvbERpc3BsYXlGaWx0ZXIsICduYW1lJyB8ICdmaWx0ZXJTdGF0ZScgfCAnaXNHbG9iYWwnPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZEZpbHRlcnNNYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2N1cnJlbnRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyczogSUNvbnRyb2xEaXNwbGF5RmlsdGVyW10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RmlsdGVyQnlJZEludGVybmFsID0gKGZpbHRlcklkOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnMgJiYgdGhpcy5maWx0ZXJzLmZpbmQoKHYpID0+IHYuaWQgPT09IGZpbHRlcklkKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJCeUlkID0gbWVtb2l6ZSh0aGlzLmdldEZpbHRlckJ5SWRJbnRlcm5hbCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEZpbHRlcigpIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZpbHRlckJ5SWQodGhpcy5fY3VycmVudEZpbHRlcklkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEZpbHRlcklkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudEZpbHRlcklkKGlkOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEZpbHRlcnMoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlGaWx0ZXJbXT4ge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudEZpbHRlcihmaWx0ZXJVcGRhdGVzOiBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMpIHtcclxuICAgIHJldHVybiAhIXRoaXMuY3VycmVudEZpbHRlciAmJiB0aGlzLnVwZGF0ZUZpbHRlcih0aGlzLmN1cnJlbnRGaWx0ZXIuaWQsIGZpbHRlclVwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld0ZpbHRlcihmaWx0ZXJOYW1lOiBzdHJpbmcsIGZpbHRlclN0YXRlOiBhbnksIGlzRGVmYXVsdDogYm9vbGVhbiwgaXNHbG9iYWw6IGJvb2xlYW4pXHJcbiAgICA6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5RmlsdGVyPiB7XHJcbiAgICBsZXQgbmV3RmlsdGVyRHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8gPSB0aGlzLm1hcEZpbHRlck1vZGVsVG9EdG8oe1xyXG4gICAgICBpZDogLTEsXHJcbiAgICAgIG5hbWU6IGZpbHRlck5hbWUsXHJcbiAgICAgIGlzRGVmYXVsdCxcclxuICAgICAgaXNHbG9iYWwsXHJcbiAgICAgIGZpbHRlclN0YXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXdGaWx0ZXJEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8+KHRoaXMuaW5zZXJ0RGF0YVVybCxcclxuICAgICAgJ1BPU1QnLCBuZXdGaWx0ZXJEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hcEZpbHRlckR0b1RvTW9kZWwobmV3RmlsdGVyRHRvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlGaWx0ZXJVcGRhdGVzKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEZpbHRlckJ5SWQoZmlsdGVySWQpO1xyXG4gICAgaWYgKCFmaWx0ZXIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRGaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlciA9IHtcclxuICAgICAgLi4uZmlsdGVyLFxyXG4gICAgICAuLi51cGRhdGVzXHJcbiAgICB9O1xyXG4gICAgbGV0IHVwZGF0ZWRGaWx0ZXJEdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byA9IHRoaXMubWFwRmlsdGVyTW9kZWxUb0R0byh1cGRhdGVkRmlsdGVyKTtcclxuXHJcbiAgICB1cGRhdGVkRmlsdGVyRHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvPih0aGlzLnVwZGF0ZURhdGFVcmwsXHJcbiAgICAgICdQVVQnLCB1cGRhdGVkRmlsdGVyRHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJCeUlkKGZpbHRlcklkKTtcclxuICAgIGlmICghZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IGZpbHRlcklkIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmlsdGVycygpIHtcclxuICAgIGNvbnN0IGZpbHRlcnMgPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG9bXT4odGhpcy5sb2FkRGF0YVVybCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycy5tYXAoKGR0bykgPT4gdGhpcy5tYXBGaWx0ZXJEdG9Ub01vZGVsKGR0bykpO1xyXG4gICAgLy8gTk9URTogcmVzZXQgbWVtb2l6ZVxyXG4gICAgdGhpcy5yZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyTW9kZWxUb0R0byhtb2RlbDogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKTogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIElkOiBtb2RlbC5pZCxcclxuICAgICAgTmFtZTogbW9kZWwubmFtZSxcclxuICAgICAgSXNEZWZhdWx0OiBtb2RlbC5pc0RlZmF1bHQsXHJcbiAgICAgIElzR2xvYmFsOiBtb2RlbC5pc0dsb2JhbCxcclxuICAgICAgRmlsdGVyU3RhdGU6IEpTT04uc3RyaW5naWZ5KG1vZGVsLmZpbHRlclN0YXRlKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyRHRvVG9Nb2RlbChkdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byk6IElDb250cm9sRGlzcGxheUZpbHRlciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogZHRvLklkLFxyXG4gICAgICBuYW1lOiBkdG8uTmFtZSxcclxuICAgICAgaXNEZWZhdWx0OiBkdG8uSXNEZWZhdWx0IHx8IGZhbHNlLFxyXG4gICAgICBpc0dsb2JhbDogZHRvLklzR2xvYmFsIHx8IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJTdGF0ZTogSlNPTi5wYXJzZShkdG8uRmlsdGVyU3RhdGUpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCkge1xyXG4gICAgdGhpcy5nZXRGaWx0ZXJCeUlkID0gbWVtb2l6ZSh0aGlzLmdldEZpbHRlckJ5SWRJbnRlcm5hbCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIsIElDb250cm9sRGlzcGxheUZpbHRlciwgSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRGaWx0ZXJzTWFuYWdlcic7XHJcbmltcG9ydCB7IENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB9IGZyb20gJy4vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjogQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxuICByZWFkb25seSBvbkZpbHRlckFwcGxpZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcclxuICByZWFkb25seSBvbkZpbHRlckRlbGV0ZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcclxuICByZWFkb25seSBjYW5DcmVhdGVHbG9iYWxGaWx0ZXJzOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IHZpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxudHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucywga2V5b2YgSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucztcclxuICAvLyB0b29sYmFyIGl0ZW1zXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2ZpbHRlcnNUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICAvLyB0b29sYmFyIHdpZGdldHNcclxuICBwcml2YXRlIGZpbHRlcnNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyc0RhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RmlsdGVyVGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbmV3RmlsdGVyQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHdpZGdldHNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZmlsdGVyUG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlck5hbWVUZXh0Qm94OiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlckJ1aWxkZXI6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3I6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyO1xyXG4gIHByaXZhdGUgZmlsdGVySXNHbG9iYWxDaGVja2JveDogRGV2RXhwcmVzcy51aS5keENoZWNrQm94IHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgaXNJbkZpbHRlckFwcGx5aW5nID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlclxyXG4gICAgICAgID8gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJcclxuICAgICAgICA6IG5ldyBHcmlkRmlsdGVyc01hbmFnZXIob3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgICB0aGlzLmZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoe1xyXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHRyeUFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGlzQ2FuQmVGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKTtcclxuXHJcbiAgICBpZiAoaXNDYW5CZUZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzQ2FuQmVGaWx0ZXJBcHBsaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmVycmVkTG9hZGluZyA9IGZhbHNlKSB7XHJcbiAgICAvLyBOT1RFOiBJZiB3ZSBjaGFuZ2UgdGhlIGZpbHRlciwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZCBpbiB0aGUgZmlsdGVyc0Ryb3Bkb3duQm94Lm9uVmFsdWVDaGFuZ2VkXHJcbiAgICAvLyBjb25zdCBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQgIT09IGZpbHRlcklkO1xyXG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQgPSBmaWx0ZXJJZDtcclxuICAgIHRoaXMudXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuXHJcbiAgICBsZXQgZ3JpZERhdGFTb3VyY2UgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0RGF0YVNvdXJjZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgLy8gTk9URTogbmVlZCB0byBwcm9jZXNzIGZpbHRlciB2YWx1ZSBieSB0aGUgZ2V0RmlsdGVyRXhwcmVzc2lvbiBtZXRob2RcclxuICAgICAgLy8gdG8gYmUgc3VyZSBpdCB3aWxsIHdvcmsgaW4gZGF0YXNvdXJjZSAoZm9yIGV4YW1wbGUsIHRoZSAnYmV0d2VlbicgY29uZGl0aW9uKVxyXG4gICAgICAvLyB3aWxsIGJlIG1vZGlmaWVkIHRvIFwiPj0gYW5kIDw9XCIgYmVjYXVzZSBkYXRhIHNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgJ2JldHdlZW4nLlxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvci5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmZpbHRlclN0YXRlKTtcclxuICAgICAgY29uc3QgdmFsID0gdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvci5nZXRGaWx0ZXJFeHByZXNzaW9uKCk7XHJcblxyXG4gICAgICBpZiAoZ3JpZERhdGFTb3VyY2UuaXNMb2FkaW5nKCkpIHtcclxuICAgICAgICBjb25zdCBhcHBseVZhbHVlID0gKCkgPT4ge1xyXG4gICAgICAgICAgZ3JpZERhdGFTb3VyY2Uub2ZmKCdsb2FkaW5nQ2hhbmdlZCcsIGFwcGx5VmFsdWUpO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGdyaWREYXRhU291cmNlID0gdGhpcy5vcHRpb25zLm93bmVyLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgICAgICAgZ3JpZERhdGFTb3VyY2UuZmlsdGVyKHZhbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBncmlkRGF0YVNvdXJjZS5vbignbG9hZGluZ0NoYW5nZWQnLCBhcHBseVZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIodmFsKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWREYXRhU291cmNlLmZpbHRlcihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAoIWZpbHRlckNoYW5nZWQpIHtcclxuICAgIGlmICghZGVmZXJyZWRMb2FkaW5nKSB7XHJcbiAgICAgIGF3YWl0IGdyaWREYXRhU291cmNlLmxvYWQoKTtcclxuICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMub25GaWx0ZXJBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vbkZpbHRlckFwcGxpZWQoZmlsdGVySWQpO1xyXG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxyXG4gICAgICB0aGlzLmZpbHRlcnNUb29sYmFySXRlbVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbHRlcnNUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fZmlsdGVyc1Rvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRmlsdGVyc1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbHRlclBvcHVwKCkge1xyXG4gICAgaWYgKCF0aGlzLl9maWx0ZXJQb3B1cCkge1xyXG4gICAgICB0aGlzLl9maWx0ZXJQb3B1cCA9IHRoaXMuY3JlYXRlRmlsdGVyUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyUG9wdXA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBoYXNDaGFuZ2VzKCkge1xyXG4gICAgY29uc3QgY3VycmVudEZpbHRlciA9IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcjtcclxuXHJcbiAgICBjb25zdCBuZXdOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveCAmJiB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZE5hbWUgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIubmFtZTtcclxuXHJcbiAgICBjb25zdCBuZXdGaWx0ZXIgPSB0aGlzLmZpbHRlckJ1aWxkZXIgJiYgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZEZpbHRlciA9IGN1cnJlbnRGaWx0ZXIgJiYgY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZTtcclxuXHJcbiAgICBjb25zdCBuZXdJc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCAmJiB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3Qgb2xkSXNHbG9iYWwgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIuaXNHbG9iYWw7XHJcblxyXG4gICAgcmV0dXJuIG5ld05hbWUgIT09IG9sZE5hbWUgfHwgbmV3RmlsdGVyICE9PSBvbGRGaWx0ZXIgfHwgbmV3SXNHbG9iYWwgIT09IG9sZElzR2xvYmFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdEYXRhIFNldHMnLFxyXG4gICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbnMudmlzaWJsZSxcclxuICAgICAgY3NzQ2xhc3M6ICdhcHMtZmlsdGVyc19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgICAgdmFsdWU6IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxyXG4gICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgICB3aWR0aDogNTAwXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgIGNvbnN0IFssIHVzZXJTZXR0aW5nc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICAgIHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLmdldFVzZXJTZXR0aW5ncygpXHJcbiAgICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgICB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkICYmIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkZpbHRlckFwcGx5aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCB2YWx1ZSA9IGUudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFsdWUgPSBlLnByZXZpb3VzVmFsdWU7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgJiYgdGhpcy5maWx0ZXJzRGF0YUdyaWQuc2VsZWN0Um93cyh2YWx1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUgJiYgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUub3B0aW9uKCd2YWx1ZScsXHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndGV4dCcpIHx8IGUuY29tcG9uZW50Lm9wdGlvbigncGxhY2Vob2xkZXInKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbk9wZW5lZDogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLnNlbGVjdFJvd3MoZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpLCBmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCA9IHRoaXMuY3JlYXRlRmlsdGVyc0RhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEZpbHRlclRpdGxlID0gdGhpcy5jcmVhdGVDdXJyZW50RmlsdGVyVGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5uZXdGaWx0ZXJCdXR0b24gPSB0aGlzLmNyZWF0ZU5ld0ZpbHRlckJ1dHRvbigpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudEhlYWRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19oZWFkZXInKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY3VycmVudEZpbHRlclRpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLm5ld0ZpbHRlckJ1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKS5jc3MoJ2hlaWdodCcsICcxMDAlJylcclxuICAgICAgICAgICAgLmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5maWx0ZXJzRGF0YUdyaWQuZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyc0RhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICAgIHVzZUljb25zOiB0cnVlLFxyXG4gICAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgICAgY29uZmlybURlbGV0ZU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGF0YSBzZXQ/J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzRGVmYXVsdCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdJcyBEZWZhdWx0JyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNHbG9iYWwnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnSXMgR2xvYmFsJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDcwXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpY29uOiAnZWRpdCcsXHJcbiAgICAgICAgICAgICAgICBoaW50OiAnRWRpdCcsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIWUucm93IHx8ICFlLnJvdy5rZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlGaWx0ZXIoZS5yb3cua2V5KTtcclxuICAgICAgICAgICAgICAgICAgaXNGaWx0ZXJBcHBsaWVkICYmICF0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndmlzaWJsZScpXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5vcGVuRWRpdEZpbHRlclBvcHVwKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAnZGVsZXRlJ1xyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtcclxuICAgICAgICAgIGVkaXRPbktleVByZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBmb2N1c2VkUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0JvcmRlcnM6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDb2x1bW5MaW5lczogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdzaW5nbGUnIH0sXHJcbiAgICAgICAgaGVpZ2h0OiAnY2FsYygxMDAlIC0gNTFweCknLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIGRhdGEgc2V0cycsXHJcbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5zZWxlY3RlZFJvd0tleXMgPyBlLnNlbGVjdGVkUm93S2V5c1swXSA6IG51bGwpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5kYXRhRmllbGQgPT09ICdpc0dsb2JhbCcpIHtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRpc2FibGVkID0gIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb25WYWx1ZUNoYW5nZWQgPSBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IGFzeW5jIChvcHQpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci51cGRhdGVGaWx0ZXIoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlLmNvbHVtbi50eXBlID09PSAnYnV0dG9ucycpIHtcclxuICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9ICFlLmRhdGEuaXNHbG9iYWxcclxuICAgICAgICAgICAgICB8fCAoZS5kYXRhLmlzR2xvYmFsICYmIHRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgIEFycmF5LmZyb20oZS5jZWxsRWxlbWVudC5jaGlsZHJlbigpKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAkKGMpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2RkZCAhaW1wb3J0YW50JyxcclxuICAgICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcclxuICAgICAgICAgICAgICAgIH0pLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dVcGRhdGluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkgfHwgZS5uZXdEYXRhLmlzRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gZS5jb21wb25lbnQuZ2V0RGF0YVNvdXJjZSgpLml0ZW1zKCkuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIuaXNEZWZhdWx0KTtcclxuICAgICAgICAgIGlmIChkZWZhdWx0RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIuaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51cGRhdGVVc2VyU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICBkZWZhdWx0RmlsdGVySWQ6IGUubmV3RGF0YS5pc0RlZmF1bHQgPyBlLmtleSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1JlbW92aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kZWxldGVGaWx0ZXIoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUN1cnJlbnRGaWx0ZXJUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWZpbHRlcnNfX2N1cnJlbnQtZmlsdGVyJylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgdmFsdWU6IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd0ZXh0JykgfHwgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3BsYWNlaG9sZGVyJyksXHJcbiAgICAgICAgcmVhZE9ubHk6IHRydWVcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTmV3RmlsdGVyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19hZGQtbmV3LWZpbHRlciBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnTmV3IERhdGEgU2V0JyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5OZXdGaWx0ZXJQb3B1cCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3BsdXMnXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCAkcG9wdXBSb290ID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKCdib2R5Jyk7XHJcbiAgICBsZXQgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiAkcG9wdXBSb290LmR4UG9wdXAoe1xyXG4gICAgICBjb250YWluZXI6IHRoaXMub3B0aW9ucy5vd25lci5lbGVtZW50KCksXHJcbiAgICAgIHNoYWRpbmc6IGZhbHNlLFxyXG4gICAgICByZXNpemVFbmFibGVkOiB0cnVlLFxyXG4gICAgICB3aWR0aDogNjUwLFxyXG4gICAgICBoZWlnaHQ6IDUwMCxcclxuICAgICAgb25TaG93aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94LmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uSGlkaW5nOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzIHx8IGlzUG9wdXBIaWRpbmdDb25maXJtZWQpIHtcclxuICAgICAgICAgIGlzUG9wdXBIaWRpbmdDb25maXJtZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLmNhbmNlbCA9IHRydWU7XHJcbiAgICAgICAgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKCk7XHJcbiAgICAgICAgaWYgKGlzUG9wdXBIaWRpbmdDb25maXJtZWQpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pLmR4UG9wdXAoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlck5hbWVUZXh0Qm94KCkge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ0VudGVyIERhdGEgU2V0IE5hbWUuLi4nLFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJJc0dsb2JhbENoZWNrYm94KCkge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhDaGVja0JveCh7XHJcbiAgICAgICAgdGV4dDogJ0dsb2JhbCBkYXRhIHNldCcsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keENoZWNrQm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1ucywgLi4ucmVzdCkge1xyXG4gICAgbGV0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIHNvdXJjZUNvbHVtbnMpIHtcclxuICAgICAgaWYgKHNvdXJjZUNvbHVtbi5jb2x1bW5zICYmIHNvdXJjZUNvbHVtbi5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBuZXN0ZWRDb2x1bW5zID0gdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1uLmNvbHVtbnMpO1xyXG5cclxuICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KG5lc3RlZENvbHVtbnMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9ICQuZXh0ZW5kKHt9LCBzb3VyY2VDb2x1bW4pO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZScgfHwgY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICBjb25zdCBpc0RhdGVUaW1lID0gY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9ICdkZCBNTU0geXknO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZVRpbWVGb3JtYXQgPSAnaGg6bW0sIGRkIE1NTSB5eSc7XHJcbiAgICAgICAgICBjb25zdCBkaXNwbGF5Rm9ybWF0ID0gaXNEYXRlVGltZSA/IGRhdGVUaW1lRm9ybWF0IDogZGF0ZUZvcm1hdDtcclxuXHJcbiAgICAgICAgICBjb25zdCBwYXJzZURhdGVUaW1lID0gKGRhdGVTdHI6IHN0cmluZyk6IERhdGUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZVBhcnRzID0gZGF0ZVN0ci5zcGxpdCgnLCAnKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShkYXRlVGltZVBhcnRzWzFdLCBkYXRlRm9ybWF0KSB8fCBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0aW1lUGFydHMgPSBkYXRlVGltZVBhcnRzWzBdLnNwbGl0KCc6Jyk7XHJcblxyXG4gICAgICAgICAgICAgIGRhdGUuc2V0SG91cnMocGFyc2VJbnQodGltZVBhcnRzWzBdKSk7XHJcbiAgICAgICAgICAgICAgZGF0ZS5zZXRNaW51dGVzKHBhcnNlSW50KHRpbWVQYXJ0c1sxXSkpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBjb2x1bW4uZm9ybWF0ID0gZGlzcGxheUZvcm1hdDtcclxuICAgICAgICAgIGNvbHVtbi5lZGl0b3JUZW1wbGF0ZSA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhEYXRlQm94KHtcclxuICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0LFxyXG4gICAgICAgICAgICAgIHR5cGU6IGlzRGF0ZVRpbWUgPyAnZGF0ZXRpbWUnIDogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgIHdpZHRoOiAxNTAsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUoRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24uZm9ybWF0RGF0ZSh2YWx1ZSwgZGlzcGxheUZvcm1hdCkpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgdmFsdWU6IChpc0RhdGVUaW1lID8gcGFyc2VEYXRlVGltZShlLnZhbHVlKSA6IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShlLnZhbHVlLCBkaXNwbGF5Rm9ybWF0KSlcclxuICAgICAgICAgICAgICAgIHx8IG51bGxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgY29sdW1uLmZpbHRlck9wZXJhdGlvbnMgPSBbJz0nLCAnPD4nLCAnPCcsICc+JywgJzw9JywgJz49JywgJ2lzYmxhbmsnLCAnaXNub3RibGFuayddO1xyXG4gICAgICAgICAgY29sdW1uLmNhbGN1bGF0ZUZpbHRlckV4cHJlc3Npb24gPSBmdW5jdGlvbihmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gW3NvdXJjZUNvbHVtbnMsIC4uLnJlc3RdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3NbMF0pIHtcclxuICAgICAgICAgICAgICBpZiAoaXNEYXRlVGltZSkge1xyXG4gICAgICAgICAgICAgICAgYXJnc1swXSA9IHBhcnNlRGF0ZVRpbWUoYXJnc1swXSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5wYXJzZURhdGUoZmlsdGVyVmFsdWUsIGRpc3BsYXlGb3JtYXQpIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0Q2FsY3VsYXRlRmlsdGVyRXhwcmVzc2lvbiguLi5hcmdzKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KChjb2wxLCBjb2wyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhcHRpb24xID0gKGNvbDEuY2FwdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgY2FwdGlvbjIgPSAoY29sMi5jYXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgaWYgKGNhcHRpb24xIDwgY2FwdGlvbjIpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjYXB0aW9uMSA+IGNhcHRpb24yKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlckJ1aWxkZXIoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoe1xyXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHJldHVybiBmaWx0ZXJCdWlsZGVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgIGNvbnN0ICRuYW1lQ29udGFpbmVyID0gJCgnPGRpdiBjbGFzcz1cImFwcy1maWx0ZXJzX19uYW1lLWNvbnRhaW5lclwiIC8+JykuaGVpZ2h0KCczNnB4Jyk7XHJcblxyXG4gICAgLy8gTk9URTogUmVjcmVhdGUgd2lkZ2V0c1xyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveCA9IHRoaXMuY3JlYXRlRmlsdGVyTmFtZVRleHRCb3goKTtcclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlciA9IHRoaXMuY3JlYXRlRmlsdGVyQnVpbGRlcigpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94ID0gdGhpcy5jcmVhdGVGaWx0ZXJJc0dsb2JhbENoZWNrYm94KCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJywgZmlsdGVyICYmIGZpbHRlci5uYW1lKTtcclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRuYW1lQ29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScsIGZpbHRlciAmJiBmaWx0ZXIuaXNHbG9iYWwpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94LmVsZW1lbnQoKS5hcHBlbmRUbygkbmFtZUNvbnRhaW5lcik7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsRmlsdGVycyk7XHJcblxyXG4gICAgJG5hbWVDb250YWluZXIuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnLCBmaWx0ZXIgJiYgZmlsdGVyLmZpbHRlclN0YXRlKTtcclxuXHJcbiAgICBjb25zdCAkZmlsdGVyQnVpbGRlckNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJ2NhbGMoMTAwJSAtIDM2cHgpJykuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLmVsZW1lbnQoKS5hcHBlbmRUbygkZmlsdGVyQnVpbGRlckNvbnRhaW5lcik7XHJcblxyXG4gICAgJGZpbHRlckJ1aWxkZXJDb250YWluZXIuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgc2Nyb2xsQnlDb250ZW50OiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gJHBvcHVwQ29udGVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbXMoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtW10ge1xyXG4gICAgcmV0dXJuIGZpbHRlciA/IFtcclxuICAgICAgdGhpcy5jcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCksXHJcbiAgICAgIHRoaXMuY3JlYXRlU2F2ZUZpbHRlckFzTmV3UG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZVJlc2V0RmlsdGVyUG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZURlbGV0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKVxyXG4gICAgXSA6IFt0aGlzLmNyZWF0ZVNhdmVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ0FwcGx5IGFuZCBTYXZlJyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnQXBwbHkgYW5kIFVwZGF0ZScsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAnc2F2ZSdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUZpbHRlckFzTmV3UG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMgTmV3JyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZXNldEZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdSZXNldCcsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgICAgICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVzZXQgdW5zYXZlZCBjaGFuZ2VzPycsXHJcbiAgICAgICAgICAgICdSZXNldCB0aGUgZGF0YSBzZXQnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKCFpc0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZXNldENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICd1bmRvJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEZWxldGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnRGVsZXRlIERhdGEgU2V0JyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAgICAgICBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgXCIke3RoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5uYW1lfVwiIGRhdGEgc2V0P2AsXHJcbiAgICAgICAgICAgICdEZWxldGUgdGhlIGRhdGEgc2V0J1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmICghaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyUG9wdXAuaGlkZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3RyYXNoJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVuTmV3RmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKHVuZGVmaW5lZCk7XHJcbiAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQoKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAuc2hvdygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuRWRpdEZpbHRlclBvcHVwKGZpbHRlcjogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXIpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5zaG93KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRBbmltYXRpb24gPSB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignYW5pbWF0aW9uJyk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndGl0bGUnLCBmaWx0ZXIgPyBgRWRpdCB0aGUgXCIke2ZpbHRlci5uYW1lfVwiIGRhdGEgc2V0YCA6ICdDcmVhdGUgYSBuZXcgZGF0YSBzZXQnKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdjb250ZW50VGVtcGxhdGUnLCAoKSA9PiB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXIpKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd0b29sYmFySXRlbXMnLCB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW1zKGZpbHRlcikpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5yZXBhaW50KCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIGN1cnJlbnRBbmltYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdGaWx0ZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyTmFtZVRleHRCb3ggfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyU3RhdGUgPSB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250cm9sRGlzcGxheUZpbHRlciA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3JlYXRlTmV3RmlsdGVyKFxyXG4gICAgICBmaWx0ZXJOYW1lLCBmaWx0ZXJCdWlsZGVyU3RhdGUsIGlzRGVmYXVsdCwgaXNHbG9iYWxcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIoY29udHJvbERpc3BsYXlGaWx0ZXIuaWQpO1xyXG5cclxuICAgIG5vdGlmeSgnQ3JlYXRlZCcsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVyOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJOYW1lVGV4dEJveCB8fCAhdGhpcy5maWx0ZXJCdWlsZGVyIHx8ICF0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbHRlck5hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGZpbHRlclN0YXRlID0gdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICBpZiAoIWZpbHRlck5hbWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlzVXBkYXRlZCA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIudXBkYXRlRmlsdGVyKGZpbHRlci5pZCwge1xyXG4gICAgICBuYW1lOiBmaWx0ZXJOYW1lLFxyXG4gICAgICBmaWx0ZXJTdGF0ZSxcclxuICAgICAgaXNHbG9iYWxcclxuICAgIH0pO1xyXG4gICAgaWYgKCFpc1VwZGF0ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHVwZGF0ZSB0aXRsZVxyXG4gICAgbm90aWZ5KCdVcGRhdGVkJywgdHJ1ZSk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5pZCk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuZGVsZXRlRmlsdGVyKGZpbHRlcklkKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMub25GaWx0ZXJEZWxldGVkKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vbkZpbHRlckRlbGV0ZWQoZmlsdGVySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIodW5kZWZpbmVkKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENoYW5nZXMoKSB7XHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIubmFtZSk7XHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZSk7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBbdXNlclNldHRpbmdzLCBmaWx0ZXJzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci5nZXRVc2VyU2V0dGluZ3MoKSxcclxuICAgICAgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5nZXRGaWx0ZXJzKClcclxuICAgIF0pO1xyXG5cclxuICAgIGlmICh1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKSB7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBmaWx0ZXJzLmZpbmQoKGYpID0+IGYuaWQgPT09IHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpO1xyXG4gICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgIChkZWZhdWx0RmlsdGVyIGFzIGFueSkuaXNEZWZhdWx0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xyXG4gICAgICBrZXk6ICdpZCcsXHJcbiAgICAgIGRhdGE6IGZpbHRlcnNcclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCAmJiB0aGlzLmZpbHRlcnNEYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gTk9URTogRGVsYXkgZm9yIHBvcHVwIHZpc2liaWxpdHkgY2hlY2tpbmdcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMCkpO1xyXG4gICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgIXRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd2aXNpYmxlJykpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElBcGlSZXNwb25zZSwgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi4vLi4vRGF0YSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlVXBsb2FkZXJPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgbWF4RmlsZVNpemU6IG51bWJlcjtcclxuICBhY2NlcHRlZEZpbGVUeXBlczogc3RyaW5nO1xyXG4gIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgb25WYWx1ZUNoYW5nZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5WYWx1ZUNoYW5nZWRFdmVudCkgPT4gdm9pZDtcclxuICBvblVwbG9hZFN0YXJ0ZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRTdGFydGVkRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25VcGxvYWRlZD86IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZGVkRXZlbnQpID0+IHZvaWQ7XHJcbiAgc2VsZWN0QnV0dG9uVGV4dD86IHN0cmluZztcclxuICBjc3NDbGFzcz86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhGaWxlU2l6ZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWNjZXB0ZWRGaWxlVHlwZXM6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblZhbHVlQ2hhbmdlZDogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVmFsdWVDaGFuZ2VkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwbG9hZFN0YXJ0ZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZFN0YXJ0ZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXBsb2FkZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZGVkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjc3NDbGFzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0QnV0dG9uVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGZpbGVVcGxvYWRlcjogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlcjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZpbGVVcGxvYWRlck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuY3NzQ2xhc3MgPSBvcHRpb25zLmNzc0NsYXNzO1xyXG4gICAgdGhpcy5tYXhGaWxlU2l6ZSA9IG9wdGlvbnMubWF4RmlsZVNpemU7XHJcbiAgICB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID0gb3B0aW9ucy5hY2NlcHRlZEZpbGVUeXBlcztcclxuICAgIHRoaXMuc2VsZWN0QnV0dG9uVGV4dCA9IG9wdGlvbnMuc2VsZWN0QnV0dG9uVGV4dDtcclxuICAgIHRoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zID0gb3B0aW9ucy5hbGxvd2VkRmlsZUV4dGVuc2lvbnM7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgIHRoaXMub25VcGxvYWRTdGFydGVkID0gb3B0aW9ucy5vblVwbG9hZFN0YXJ0ZWQ7XHJcbiAgICB0aGlzLm9uVXBsb2FkZWQgPSBvcHRpb25zLm9uVXBsb2FkZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3QgJGZpbGVVcGxvYWRlciA9ICQoJzxkaXYgLz4nKTtcclxuICAgIGlmICh0aGlzLmNzc0NsYXNzKSB7XHJcbiAgICAgICRmaWxlVXBsb2FkZXIuYWRkQ2xhc3ModGhpcy5jc3NDbGFzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIgPSAkZmlsZVVwbG9hZGVyLmR4RmlsZVVwbG9hZGVyKHtcclxuICAgICAgc2VsZWN0QnV0dG9uVGV4dDogdGhpcy5zZWxlY3RCdXR0b25UZXh0LFxyXG4gICAgICBsYWJlbFRleHQ6ICcnLFxyXG4gICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHRoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zLFxyXG4gICAgICBhY2NlcHQ6IHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMsXHJcbiAgICAgIHVwbG9hZE1vZGU6ICd1c2VGb3JtJyxcclxuICAgICAgbWF4RmlsZVNpemU6IHRoaXMubWF4RmlsZVNpemUsXHJcbiAgICAgIHNob3dGaWxlTGlzdDogZmFsc2UsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbignbGFiZWxUZXh0JywgZS52YWx1ZVswXSA/IGUudmFsdWVbMF0ubmFtZSA6ICcnKTtcclxuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBsb2FkU3RhcnRlZDogKGUpID0+IHtcclxuICAgICAgICBlLmVsZW1lbnQuZmluZCgnLmR4LWZpbGV1cGxvYWRlci11cGxvYWQtYnV0dG9uJykuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMub25VcGxvYWRTdGFydGVkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBsb2FkZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vblVwbG9hZGVkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keEZpbGVVcGxvYWRlcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLiRjb250YWluZXIuYXBwZW5kKHRoaXMuZmlsZVVwbG9hZGVyLmVsZW1lbnQoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBsb2FkPFQ+KHVwbG9hZFVybDogc3RyaW5nLCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPFQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSAodGhpcy5maWxlVXBsb2FkZXIuZWxlbWVudCgpLmZpbmQoJ2lucHV0JylbMF0gYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXNbMF07XHJcblxyXG4gICAgICBmZC5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcclxuXHJcbiAgICAgIC8qIGVzbGludCBndWFyZC1mb3ItaW46IG9mZiAqL1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGZvcmluXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYXJhbXMpIHtcclxuICAgICAgICBmZC5hcHBlbmQocHJvcCwgcGFyYW1zW3Byb3BdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJC5hamF4KHtcclxuICAgICAgICB1cmw6IHVwbG9hZFVybCxcclxuICAgICAgICB0eXBlOiAncG9zdCcsXHJcbiAgICAgICAgZGF0YTogZmQsXHJcbiAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxyXG4gICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcclxuICAgICAgICBzdWNjZXNzOiAocmVzcG9uc2U6IElBcGlSZXNwb25zZTxUPikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLkRhdGEgYXMgYW55KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlamVjdChyZXNwb25zZS5NZXNzYWdlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZSkgPT4gcmVqZWN0KCdVbmtub3duIGVycm9yJylcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gJy4uL0ZpbGVVcGxvYWRlci9JbmRleCc7XHJcbmltcG9ydCB7IElGaWxlSW1wb3J0ZXJDb2x1bW5JbmZvLCBJRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YSB9IGZyb20gJy4vSUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGEnO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXZlbnRFbWl0dGVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB7XHJcbiAgc2NoZW1hOiBzdHJpbmc7XHJcbiAgdGFibGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZUltcG9ydGVyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgZmlsZVVwbG9hZFVybDogc3RyaW5nO1xyXG4gIGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XHJcbiAgYWRkUm93c1VybDogc3RyaW5nO1xyXG4gIGdldFRhYmxlc0xpc3RVcmw/OiBzdHJpbmc7XHJcbiAgcHJlZGVmaW5lZFRhYmxlPzogSUZpbGVJbXBvcnRlclRhYmxlSW5mbztcclxuICBwcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGU/OiBJbXBvcnRGaWxlTW9kZTtcclxuICBjcmVhdGVUYWJsZUJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgdXBkYXRlVGFibGVCdXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIGNyZWF0ZVRhYmxlTW9kZVRleHQ/OiBzdHJpbmc7XHJcbiAgdXBkYXRlVGFibGVNb2RlVGV4dD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gSW1wb3J0RmlsZU1vZGUge1xyXG4gIENyZWF0ZU5ld1RhYmxlID0gMCxcclxuICBBZGROZXdSb3dzID0gMVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZUltcG9ydGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRBQkxFX1VQREFURURfRVZFTlQgPSAnZmlsZS1pbXBvcnRlci10YWJsZS11cGRhdGVkLWV2ZW50JztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHByZWRlZmluZWRUYWJsZTogSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdldFRhYmxlc0xpc3RVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNhbkNoYW5nZU1vZGU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZUJ1dHRvblRleHQ6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVRhYmxlQnV0dG9uVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHBvcHVwOiBEZXZFeHByZXNzLnVpLmR4UG9wdXA7XHJcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcclxuICBwcml2YXRlIGZpbGVVcGxvYWRlcjogRmlsZVVwbG9hZGVyO1xyXG4gIHByaXZhdGUgZGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICBwcml2YXRlIGFjdGlvbkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIHJvd3NDb3VudGVyQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByb3dzQ291bnRlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgbW9kZTogSW1wb3J0RmlsZU1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkVXJsID0gb3B0aW9ucy5maWxlVXBsb2FkVXJsO1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy50aXRsZSA9IG9wdGlvbnMudGl0bGU7XHJcbiAgICB0aGlzLmdldFRhYmxlc0xpc3RVcmwgPSBvcHRpb25zLmdldFRhYmxlc0xpc3RVcmw7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlVXJsID0gb3B0aW9ucy5jcmVhdGVUYWJsZVVybDtcclxuICAgIHRoaXMuYWRkUm93c1VybCA9IG9wdGlvbnMuYWRkUm93c1VybDtcclxuICAgIHRoaXMucHJlZGVmaW5lZFRhYmxlID0gb3B0aW9ucy5wcmVkZWZpbmVkVGFibGU7XHJcbiAgICB0aGlzLmNhbkNoYW5nZU1vZGUgPSBvcHRpb25zLnByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5tb2RlID0gb3B0aW9ucy5wcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlIDogSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVCdXR0b25UZXh0IHx8ICdDcmVhdGUgVGFibGUnO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZUJ1dHRvblRleHQgPSBvcHRpb25zLnVwZGF0ZVRhYmxlQnV0dG9uVGV4dCB8fCAnQWRkIE5ldyBSb3dzJztcclxuICAgIHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVNb2RlVGV4dCB8fCAnQ3JlYXRlIFRhYmxlJztcclxuICAgIHRoaXMudXBkYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMudXBkYXRlVGFibGVNb2RlVGV4dCB8fCAnQWRkIE5ldyBSb3dzJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93KCkge1xyXG4gICAgdGhpcy5wb3B1cCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpXHJcbiAgICAgIC5keFBvcHVwKHtcclxuICAgICAgICBzaG93VGl0bGU6IHRydWUsXHJcbiAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICBmdWxsU2NyZWVuOiB0cnVlLFxyXG4gICAgICAgIG1heFdpZHRoOiAxMzAwLFxyXG4gICAgICAgIG1heEhlaWdodDogODAwLFxyXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIGNvbnN0ICRzY3JvbGxWaWV3ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgICAgJHNjcm9sbFZpZXcuYXBwZW5kKHRoaXMuZm9ybS5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgICRzY3JvbGxWaWV3LmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgICAgICB9KS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvb2xiYXJJdGVtczogW3tcclxuICAgICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0QWN0aW9uQnV0dG9uVGV4dCgpLFxyXG4gICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b24gPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUm93c1RvVGFibGUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5wb3B1cC5oaWRlKClcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICB9XVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLnBvcHVwLnNob3coKTtcclxuICAgIHRoaXMub25Nb2RlU3dpdGNoaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIGlmICh0aGlzLnBvcHVwKSB7XHJcbiAgICAgIHRoaXMucG9wdXAuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCk6IERldkV4cHJlc3MudWkuZHhGb3JtIHtcclxuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2PicpLmR4Rm9ybSh7XHJcbiAgICAgIHNob3dDb2xvbkFmdGVyTGFiZWw6IHRydWUsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBjb2xDb3VudEJ5U2NyZWVuOiB7IG1kOiA0LCBzbTogMSB9LFxyXG4gICAgICBzY3JlZW5CeVdpZHRoOiAod2lkdGgpID0+IHdpZHRoIDwgMTI1NiA/ICdzbScgOiAnbWQnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdNb2RlJyxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU2NoZW1hJyxcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZVxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUYWJsZScsXHJcbiAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmNhbkNoYW5nZU1vZGVcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXMsXHJcbiAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcclxuICAgICAgICB9XVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVGFibGVTZWxlY3RvcicsXHJcbiAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgIHRleHQ6ICdUYWJsZSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgY29sU3BhbjogMixcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICBsb2FkVXJsOiB0aGlzLmdldFRhYmxlc0xpc3RVcmwsXHJcbiAgICAgICAgICAgICAgbG9hZFBhcmFtczogeyBjb250ZXh0TmFtZTogJycsIHRhYmxlc09ubHk6IHRydWUsIGlzV2FyZWhvdXNlQ29udGV4dDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgIGxvYWRNZXRob2Q6ICdwb3N0JyxcclxuICAgICAgICAgICAgICBub3RpZnlFcnJvcjogZmFsc2VcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHBhZ2luYXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgc29ydDogJ3RoaXMnLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBzZWFyY2hFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTb3VyY2UgRmlsZScsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRmlsZXNVcGxvYWRlcigkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdDb2x1bW5zIFNlbGVjdG9yJyxcclxuICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbFNwYW46IDQsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRGF0YUdyaWQoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XVxyXG4gICAgfSkuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHJldHVybiBmb3JtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICAkKCc8ZGl2IC8+JykuZHhCdXR0b25Hcm91cCh7XHJcbiAgICAgIGl0ZW1zOiBbe1xyXG4gICAgICAgIHRleHQ6IHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCxcclxuICAgICAgICBpY29uOiAnaW5zZXJ0dGFibGUnLFxyXG4gICAgICAgIHZhbHVlOiBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgdGV4dDogdGhpcy51cGRhdGVUYWJsZU1vZGVUZXh0LFxyXG4gICAgICAgIGljb246ICdpbnNlcnRyb3diZWxvdycsXHJcbiAgICAgICAgdmFsdWU6IEltcG9ydEZpbGVNb2RlLkFkZE5ld1Jvd3NcclxuICAgICAgfV0gYXMgYW55LFxyXG4gICAgICBrZXlFeHByOiAndmFsdWUnLFxyXG4gICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZSxcclxuICAgICAgc3R5bGluZ01vZGU6ICdvdXRsaW5lZCcsXHJcbiAgICAgIHNlbGVjdGlvbk1vZGU6ICdzaW5nbGUnLFxyXG4gICAgICBzZWxlY3RlZEl0ZW1LZXlzOiBbdGhpcy5tb2RlXSxcclxuICAgICAgb25JdGVtQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gZS5pdGVtRGF0YS52YWx1ZTtcclxuICAgICAgICB0aGlzLm9uTW9kZVN3aXRjaGluZygpO1xyXG4gICAgICB9LFxyXG4gICAgfSkuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbGVzVXBsb2FkZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoe1xyXG4gICAgICAkY29udGFpbmVyLFxyXG4gICAgICBjc3NDbGFzczogJ3RhYmxlLWNyZWF0b3JfX3VwbG9hZCcsXHJcbiAgICAgIG1heEZpbGVTaXplOiAxMCAqIDEwMDAwMDAsXHJcbiAgICAgIGFjY2VwdGVkRmlsZVR5cGVzOiAnLnhscywgLnhsc3gnLFxyXG4gICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IFsnLnhscycsICcueGxzeCddLFxyXG4gICAgICBzZWxlY3RCdXR0b25UZXh0OiAnU2VsZWN0IEV4Y2VsIGZpbGUnLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdQYXJzaW5nIHNlbGVjdGVkIGZpbGUuLi4nKTtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8SUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGE+KHRoaXMuZmlsZVVwbG9hZFVybCkudGhlbigodGFibGVNZXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGFibGVNZXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Um93c0NvdW50KHRhYmxlTWV0YS5Sb3dzQ291bnQpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICBzdG9yZToge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcclxuICAgICAgICAgICAgICAgIGtleTogJ0lkJyxcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRhYmxlTWV0YS5Db2x1bW5zXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwYWdpbmF0ZTogZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBub3RpZnkoYFBhcnNpbmcgRXJyb3IgOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIG5vRGF0YVRleHQ6ICdTZWxlY3QgRXhjZWwgRmlsZScsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICBzZWFyY2hQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgZmlsdGVyUm93OiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgc29ydGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBwYWdpbmc6IHtcclxuICAgICAgICBwYWdlU2l6ZTogMTAwMDAsXHJcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFt7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSWQnLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU2VsZWN0ZWQnLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNLZXlDb2x1bW4nLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgY2FwdGlvbjogJ0NvbHVtbiBOYW1lJ1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVHlwZScsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNOdWxsYWJsZScsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlICYmIHRoaXMuY2FuQ2hhbmdlTW9kZSxcclxuICAgICAgICBzZXRDZWxsVmFsdWU6IChuZXdEYXRhLCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgbmV3RGF0YS5Jc051bGxhYmxlID0gdmFsdWU7XHJcbiAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgbmV3RGF0YS5Jc0tleUNvbHVtbiA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgICAgICB0b29sYmFySXRlbXMucHVzaCh7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JylcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygndGFibGUtY3JlYXRvcl9fdGFibGUtaGVhZGVyJylcclxuICAgICAgICAgICAgICAgIC50ZXh0KCdQYXJzZWQgRmlsZSBNZXRhZGF0YScpLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlciA9ICQoJzxzcGFuPicpLnRleHQoJzEwMDAnKTtcclxuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lciA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuPicpLnRleHQoJ1Jvd3MgQ291bnQ6ICcpLCB0aGlzLnJvd3NDb3VudGVyKS5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lcjtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnZGF0YVJvdycgJiYgZS5kYXRhRmllbGQgPT09ICdJc0tleUNvbHVtbicpIHtcclxuICAgICAgICAgIGNvbnN0IGVkaXRvck9wdGlvbnMgPSBlLmVkaXRvck9wdGlvbnMgYXMgRGV2RXhwcmVzcy51aS5keENoZWNrQm94T3B0aW9ucztcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSBlLnJvdy5kYXRhLklzTnVsbGFibGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZGF0YUdyaWQgPSBkZWZhdWx0R3JpZCgkKCc8ZGl2IC8+JyksIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdOYW1lJyxcclxuICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgc2V0RGVmYXVsdENvbHVtbldpZHRoOiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgJGNvbnRhaW5lci5hcHBlbmQodGhpcy5kYXRhR3JpZC5lbGVtZW50KCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVUYWJsZSgpIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLmZvcm0udmFsaWRhdGUoKTtcclxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgY29uc3QgZHMgPSB0aGlzLmRhdGFHcmlkLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgaWYgKCFkcykge1xyXG4gICAgICAgIG5vdGlmeSgnU2VsZWN0IGZpbGUgd2l0aCBkYXRhJywgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkcy5pdGVtcygpO1xyXG4gICAgICBpZiAoIXRoaXMuYXJlQ29sdW1uc1ZhbGlkKGNvbHVtbnMpKSB7XHJcbiAgICAgICAgbm90aWZ5KCdBdCBsZWFzdCAxIGtleSBjb2x1bW4gbXVzdCBiZSBzZXQnLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgc2NoZW1hOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlNjaGVtYSxcclxuICAgICAgICAgIHRhYmxlOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlRhYmxlLFxyXG4gICAgICAgICAgY29sdW1uczogSlNPTi5zdHJpbmdpZnkoY29sdW1ucylcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdDcmVhdGluZyBhbmQgZmlsbGluZyBEQiB0YWJsZS4uLicpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxib29sZWFuPih0aGlzLmNyZWF0ZVRhYmxlVXJsLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5wb3B1cC5oaWRlKCk7XHJcbiAgICAgICAgICAgIG5vdGlmeShgVGhlIHRhYmxlIFske3BhcmFtcy5zY2hlbWF9XS5bJHtwYXJhbXMudGFibGV9XSBoYXMgYmVlbiBjcmVhdGVkYCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub3RpZnkoJ1RoZSB0YWJsZSBoYXMgbm90IGJlZW4gY3JlYXRlZCcsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgbm90aWZ5KGBUYWJsZSBjcmVhdGluZyBlcnJvcjogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFJvd3NUb1RhYmxlKCkge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuZm9ybS52YWxpZGF0ZSgpO1xyXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICBjb25zdCBkcyA9IHRoaXMuZGF0YUdyaWQuZ2V0RGF0YVNvdXJjZSgpO1xyXG4gICAgICBpZiAoIWRzKSB7XHJcbiAgICAgICAgbm90aWZ5KCdTZWxlY3QgZmlsZSB3aXRoIGRhdGEnLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29sdW1ucyA9IGRzLml0ZW1zKCk7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICB0YWJsZTogdGhpcy5mb3JtLm9wdGlvbignZm9ybURhdGEnKS5UYWJsZVNlbGVjdG9yLFxyXG4gICAgICAgIGNvbHVtbnM6IEpTT04uc3RyaW5naWZ5KGNvbHVtbnMpXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdBZGRpbmcgcm93cyB0byBEQiB0YWJsZS4uLicpO1xyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8Ym9vbGVhbj4odGhpcy5hZGRSb3dzVXJsLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLnBvcHVwLmhpZGUoKTtcclxuICAgICAgICAgIG5vdGlmeShgVGhlIHRhYmxlICR7cGFyYW1zLnRhYmxlfSBoYXMgYmVlbiB1cGRhdGVkYCwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLmVtaXQoRmlsZUltcG9ydGVyLlRBQkxFX1VQREFURURfRVZFTlQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBub3RpZnkoJ1RoZSB0YWJsZSBoYXMgbm90IGJlZW4gdXBkYXRlZCcsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgbm90aWZ5KGBUYWJsZSB1cGRhdGluZyBlcnJvcjogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vZGVTd2l0Y2hpbmcoKSB7XHJcbiAgICBjb25zdCBpc0NyZWF0ZVRhYmxlTW9kZSA9IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KCkpO1xyXG4gICAgdGhpcy5kYXRhR3JpZC5jb2x1bW5PcHRpb24oJ0lzS2V5Q29sdW1uJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICB0aGlzLmRhdGFHcmlkLmNvbHVtbk9wdGlvbignSXNOdWxsYWJsZScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG5cclxuICAgIGlmICghdGhpcy5jYW5DaGFuZ2VNb2RlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdTY2hlbWEnLCAndmlzaWJsZScsIHRydWUpO1xyXG4gICAgICB0aGlzLmZvcm0udXBkYXRlRGF0YSgnU2NoZW1hJywgdGhpcy5wcmVkZWZpbmVkVGFibGUuc2NoZW1hKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZScsICd2aXNpYmxlJywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZm9ybS51cGRhdGVEYXRhKCdUYWJsZScsIHRoaXMucHJlZGVmaW5lZFRhYmxlLnRhYmxlKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZVNlbGVjdG9yJywgJ3Zpc2libGUnLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignU2NoZW1hJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGVTZWxlY3RvcicsICd2aXNpYmxlJywgIWlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWN0aW9uQnV0dG9uVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUgPyB0aGlzLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCA6IHRoaXMudXBkYXRlVGFibGVCdXR0b25UZXh0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcmVDb2x1bW5zVmFsaWQoY29sdW1uczogSUZpbGVJbXBvcnRlckNvbHVtbkluZm9bXSkge1xyXG4gICAgcmV0dXJuIGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLlNlbGVjdGVkKS5zb21lKChzKSA9PiBzLklzS2V5Q29sdW1uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Um93c0NvdW50KGNvdW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucm93c0NvdW50ZXJDb250YWluZXIuc2hvdygpO1xyXG4gICAgdGhpcy5yb3dzQ291bnRlci50ZXh0KGNvdW50KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWREaXNwbGF5c01hbmFnZXIgfSBmcm9tICcuL0dyaWREaXNwbGF5c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkRmlsdGVyc01hbmFnZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IEZpbGVJbXBvcnRlciwgSUZpbGVJbXBvcnRlclRhYmxlSW5mbywgSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlSW1wb3J0ZXJPcHRpb25zIHtcclxuICBtb2RlOiBDZG1JbXBvcnRGaWxlTW9kZTtcclxuICBjcmVhdGVUYWJsZVVybDogc3RyaW5nO1xyXG4gIGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgcHJlZGVmaW5lZFRhYmxlOiBJRmlsZUltcG9ydGVyVGFibGVJbmZvO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGVkaXRNb2RlOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXI6IEdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9ucz86IElGaWxlSW1wb3J0ZXJPcHRpb25zO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50O1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXI6IEdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZGlzcGxheXNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGN1cnJlbnREaXNwbGF5VGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZUJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVBc0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWxlSW1wb3J0ZXI6IEZpbGVJbXBvcnRlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2Rpc3BsYXlzVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9pbXBvcnRGaWxlVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIgPSBvcHRpb25zLmdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXIgPSBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXI7XHJcbiAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gICAgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucyA9IG9wdGlvbnMuaW1wb3J0RmlsZU9wdGlvbnM7XHJcblxyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxhaXNMb2FkZWQgPSAoZGlzcGxheXMpID0+IHtcclxuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgICAga2V5OiAnSWQnLFxyXG4gICAgICAgIGRhdGE6IGRpc3BsYXlzXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94ICYmIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YUdyaWQgJiYgdGhpcy5kYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICAgICAgdGhpcy5kYXRhR3JpZCAmJiB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxheUNoYW5nZWQgPSAoZGlzcGxheSkgPT4ge1xyXG4gICAgICB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3ggJiYgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCBkaXNwbGF5ID8gZGlzcGxheS5JZCA6IG51bGwpO1xyXG4gICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgJiYgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLm9wdGlvbigndmFsdWUnLCBkaXNwbGF5ID8gZGlzcGxheS5OYW1lIDogbnVsbCk7XHJcbiAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSAmJiB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuICAgICAgdGhpcy5zYXZlQXNCdXR0b24gJiYgdGhpcy5zYXZlQXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuICAgICAgdGhpcy5zYXZlQnV0dG9uICYmIHRoaXMuc2F2ZUJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGF0YUdyaWQpIHtcclxuICAgICAgICBkaXNwbGF5XHJcbiAgICAgICAgICA/IHRoaXMuZGF0YUdyaWQuc2VsZWN0Um93cyhbZGlzcGxheS5JZF0sIGZhbHNlKVxyXG4gICAgICAgICAgOiB0aGlzLmRhdGFHcmlkLmRlc2VsZWN0QWxsKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3SXRlbXMgPSBbdGhpcy5kaXNwbGF5c1Rvb2xiYXJJdGVtXTtcclxuXHJcbiAgICBpZiAodGhpcy5pbXBvcnRGaWxlT3B0aW9ucyAmJiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLm1vZGUgIT09IENkbUltcG9ydEZpbGVNb2RlLk5vbmUpIHtcclxuICAgICAgbmV3SXRlbXMucHVzaCh0aGlzLmltcG9ydEZpbGVUb29sYmFySXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLCAuLi5uZXdJdGVtcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93RGVsZXRpbmc6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSxcclxuICAgICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkaXNwbGF5PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGxvYWRQYW5lbDoge1xyXG4gICAgICAgICAgc2hhZGluZzogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdEaXNwbGF5J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnRmlsdGVySWQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnRGF0YSBTZXQnLFxyXG4gICAgICAgICAgICBsb29rdXA6IHtcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdWaWV3SWQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnVmlldycsXHJcbiAgICAgICAgICAgIGxvb2t1cDoge1xyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyAnY2FsYygxMDAlIC0gNTFweCknIDogJzEwMCUnLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIGRpc3BsYXlzJyxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVycyA9IGF3YWl0IHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmdldEZpbHRlcnMoKTtcclxuICAgICAgICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmdldFZpZXdzKCk7XHJcblxyXG4gICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKCdGaWx0ZXJJZCcsICdsb29rdXAuZGF0YVNvdXJjZScsIGZpbHRlcnMpO1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKCdWaWV3SWQnLCAnbG9va3VwLmRhdGFTb3VyY2UnLCB2aWV3cyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNlbGxDbGljazogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLnJvd1R5cGUgIT09ICdkYXRhJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5kYXRhLklkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93UmVtb3Zpbmc6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmRlbGV0ZURpc3BsYXkoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURpc3BsYXlzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGNvbnN0IGJhc2ljT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzIHwgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94LlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIHZhbHVlRXhwcjogJ0lkJyxcclxuICAgICAgZGlzcGxheUV4cHI6ICdOYW1lJyxcclxuICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxyXG4gICAgICB3aWR0aDogMjAwLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5nZXREaXNwbGF5cygpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICBjb25zdCBkaXNwbGF5ID0gdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5O1xyXG5cclxuICAgICAgICBjb25zdCBmaWx0ZXJDaGFuZ2VkID0gZGlzcGxheSAmJiBkaXNwbGF5LkZpbHRlcklkICE9PSB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQ7XHJcbiAgICAgICAgY29uc3Qgdmlld0NoYW5nZWQgPSBkaXNwbGF5ICYmIGRpc3BsYXkuVmlld0lkICE9PSB0aGlzLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZDtcclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgKGZpbHRlckNoYW5nZWQgfHwgdmlld0NoYW5nZWRcclxuICAgICAgICAgID8gdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKVxyXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodHJ1ZSkpO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlybWVkKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXlJZCA9IGUudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGRyb3BEb3duQm94T3B0aW9uczogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9ucyA9IHtcclxuICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfSxcclxuICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgd2lkdGg6IDgwMFxyXG4gICAgICB9LFxyXG4gICAgICBjb250ZW50VGVtcGxhdGU6ICF0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyB2b2lkIDAgOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQgPSB0aGlzLmNyZWF0ZURhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgPSB0aGlzLmNyZWF0ZUN1cnJlbnREaXNwbGF5VGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTtcclxuICAgICAgICB0aGlzLnNhdmVBc0J1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpO1xyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19oZWFkZXInKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUuZWxlbWVudCgpKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVBc0J1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuaGVpZ2h0KCcxMDAlJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWRpdE1vZGUpIHtcclxuICAgICAgICAgIGRyb3Bkb3duQ29udGVudC5hcHBlbmQoZHJvcGRvd25Db250ZW50SGVhZGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRyb3Bkb3duQ29udGVudC5hcHBlbmQodGhpcy5kYXRhR3JpZC5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICB9LFxyXG4gICAgICBvbk9wZW5lZDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2ZUFzQnV0dG9uICYmIHRoaXMuc2F2ZUFzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuICAgICAgICB0aGlzLnNhdmVCdXR0b24gJiYgdGhpcy5zYXZlQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWRnZXQ6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSA/ICgnZHhEcm9wRG93bkJveCcgYXMgYW55KSA6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB0ZXh0OiAnRGlzcGxheXMnLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy1kaXNwbGF5c19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gJC5leHRlbmQoYmFzaWNPcHRpb25zLCBkcm9wRG93bkJveE9wdGlvbnMpIDogYmFzaWNPcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVJbXBvcnRGaWxlVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBpY29uOiAndXBsb2FkJyxcclxuICAgICAgICBoaW50OiAnSW1wb3J0IGZpbGUnLFxyXG4gICAgICAgIGhlaWdodDogMzAsXHJcbiAgICAgICAgc3R5bGluZ01vZGU6ICd0ZXh0JyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5maWxlSW1wb3J0ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyID0gbmV3IEZpbGVJbXBvcnRlcih7XHJcbiAgICAgICAgICAgICRjb250YWluZXI6IHRoaXMub3B0aW9ucy5vd25lci5lbGVtZW50KCkucGFyZW50KCksXHJcbiAgICAgICAgICAgIHRpdGxlOiAnSW1wb3J0IEZpbGUgdG8gQ0RNJyxcclxuICAgICAgICAgICAgY3JlYXRlVGFibGVVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuY3JlYXRlVGFibGVVcmwsXHJcbiAgICAgICAgICAgIGFkZFJvd3NVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuYWRkUm93c1VybCxcclxuICAgICAgICAgICAgZmlsZVVwbG9hZFVybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5maWxlVXBsb2FkVXJsLFxyXG4gICAgICAgICAgICBwcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGU6IHRoaXMuZ2V0UHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlKHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMubW9kZSksXHJcbiAgICAgICAgICAgIHByZWRlZmluZWRUYWJsZTogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5wcmVkZWZpbmVkVGFibGUsXHJcbiAgICAgICAgICAgIGNyZWF0ZVRhYmxlQnV0dG9uVGV4dDogJ1JlcGxhY2UgQWxsIFJvd3MnLFxyXG4gICAgICAgICAgICBjcmVhdGVUYWJsZU1vZGVUZXh0OiAnUmVwbGFjZSBSb3dzJyxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLm9uKEZpbGVJbXBvcnRlci5UQUJMRV9VUERBVEVEX0VWRU5ULCAoKSA9PiB0aGlzLm9wdGlvbnMub3duZXIucmVmcmVzaCgpKTtcclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLnNob3coKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgZS5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XHJcbiAgICAgICAgICAgIHBhZGRpbmdUb3A6IDUsXHJcbiAgICAgICAgICAgIHBhZGRpbmdCb3R0b206IDVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlKG1vZGU6IENkbUltcG9ydEZpbGVNb2RlKTogSW1wb3J0RmlsZU1vZGUge1xyXG4gICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2RtSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93czpcclxuICAgICAgICByZXR1cm4gSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93cztcclxuXHJcbiAgICAgIGNhc2UgQ2RtSW1wb3J0RmlsZU1vZGUuUmVwbGFjZUFsbFJvd3M6XHJcbiAgICAgICAgcmV0dXJuIEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG1vZGUnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudERpc3BsYXlUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19jdXJyZW50LWRpc3BsYXkgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5LFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX3NhdmUtZGlzcGxheSBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXksXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIudXBkYXRlQ3VycmVudERpc3BsYXkoXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDEyNVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlfX3NhdmUtZGlzcGxheS1hcyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZSBBcycsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4gKFxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVTYXZlQXNEaWFsb2coKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxNjBcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlQXNEaWFsb2coKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnRFbGVtZW50ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgcGxhY2Vob2xkZXI6ICdEaXNwbGF5IE5hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICB9KS5keFZhbGlkYXRvcih7XHJcbiAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IG5hbWVUZXh0Qm94ID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gICAgY29uc3QgdmFsaWRhdG9yID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhWYWxpZGF0b3IoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgbmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEaWFsb2coXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgRGlzcGxheScsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzMwMHB4JyxcclxuICAgICAgfSxcclxuICAgICAgJHBvcHVwQ29udGVudCxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdPaycsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcclxuICAgICAgICAgIGlmICghdmFsaWRhdG9yLnZhbGlkYXRlKCkuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3JlYXRlTmV3RGlzcGxheShcclxuICAgICAgICAgICAgbmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgb25DbGljazogKGNsb3NlUG9wdXApID0+IGNsb3NlUG9wdXAoKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGRpc3BsYXlzVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2Rpc3BsYXlzVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5fZGlzcGxheXNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRGlzcGxheXNUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5c1Rvb2xiYXJJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaW1wb3J0RmlsZVRvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVJbXBvcnRGaWxlVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXkge1xyXG4gIHJlYWRvbmx5IElkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgTmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEZpbHRlcklkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgVmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRGlzcGxheXNNYW5hZ2VyIHtcclxuICBwcml2YXRlIGRpc3BsYXlzOiBJQ29udHJvbERpc3BsYXlbXSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcnM6IHtcclxuICAgIGNoYW5nZWQ6IEFycmF5PChkaXNwbGF5OiBJQ29udHJvbERpc3BsYXkpID0+IHZvaWQ+LFxyXG4gICAgbG9hZGVkOiBBcnJheTwoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkPlxyXG4gIH07XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfY3VycmVudERpc3BsYXlJZDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy5pbnNlcnREYXRhVXJsID0gb3B0aW9ucy5pbnNlcnREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5kZWxldGVEYXRhVXJsID0gb3B0aW9ucy5kZWxldGVEYXRhVXJsO1xyXG5cclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycyA9IHtcclxuICAgICAgY2hhbmdlZDogW10sXHJcbiAgICAgIGxvYWRlZDogW11cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZERpc3BsYXlzKCkge1xyXG4gICAgdGhpcy5kaXNwbGF5cyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVtdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuICAgIHRoaXMub25EaXNwbGFpc0xvYWRlZFByaXZhdGUoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREaXNwbGF5cygpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzIHx8IGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGlzcGxheUJ5SWQgPSAoaWQ6IG51bWJlcikgPT4ge1xyXG4gICAgaWYgKCFpZCB8fCAhdGhpcy5kaXNwbGF5cykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cy5maW5kKCh2KSA9PiB2LklkID09PSBpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmV3RGlzcGxheShuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBuZXdWaWV3RHRvID0ge1xyXG4gICAgICBJZDogMCxcclxuICAgICAgTmFtZTogbmFtZSxcclxuICAgICAgRmlsdGVySWQ6IGZpbHRlcklkLFxyXG4gICAgICBWaWV3SWQ6IHZpZXdJZFxyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmluc2VydERhdGFVcmwsICdQT1NUJywgbmV3Vmlld0R0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZURpc3BsYXkoaWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kZWxldGVEYXRhVXJsLCAnREVMRVRFJywgeyBpZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudERpc3BsYXkobmFtZTogc3RyaW5nLCBmaWx0ZXJJZDogbnVtYmVyLCB2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlRGlzcGxheSh0aGlzLmN1cnJlbnREaXNwbGF5LklkLCBuYW1lLCBmaWx0ZXJJZCwgdmlld0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEaXNwbGF5KGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgZmlsdGVySWQ6IG51bWJlciwgdmlld0lkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsIHtcclxuICAgICAgaWQsIG5hbWUsIGZpbHRlcklkLCB2aWV3SWRcclxuICAgIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EaXNwbGF5Q2hhbmdlZFByaXZhdGUoKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuY2hhbmdlZC5mb3JFYWNoKChoYW5kbGVycykgPT4gKFxyXG4gICAgICBoYW5kbGVycyh0aGlzLmN1cnJlbnREaXNwbGF5KVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRGlzcGxhaXNMb2FkZWRQcml2YXRlKCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmxvYWRlZC5mb3JFYWNoKChoYW5kbGVycykgPT4gKFxyXG4gICAgICBoYW5kbGVycyh0aGlzLmRpc3BsYXlzKVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnREaXNwbGF5SWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudERpc3BsYXlJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudERpc3BsYXlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50RGlzcGxheUlkID0gaWQ7XHJcbiAgICB0aGlzLm9uRGlzcGxheUNoYW5nZWRQcml2YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnREaXNwbGF5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheUJ5SWQodGhpcy5fY3VycmVudERpc3BsYXlJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9uRGlzcGxheUNoYW5nZWQoaGFuZGxlcjogKGRpc3BsYXk6IElDb250cm9sRGlzcGxheSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmNoYW5nZWQucHVzaChoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb25EaXNwbGFpc0xvYWRlZChoYW5kbGVyOiAoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMubG9hZGVkLnB1c2goaGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zLCBrZXlvZiBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luRGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBhdXRvSW50ZWdyYXRpb246IChvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSBudWxsKVxyXG4gICAgICAgID8gb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gJiYgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicsIHtcclxuICAgICAgbW9kZTogJ211bHRpcGxlJ1xyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzZWxlY3Rpb24nXSk7XHJcbiAgICBncmlkLm9uKCdlZGl0b3JQcmVwYXJpbmcnLCB0aGlzLm9uR3JpZEVkaXRvclByZXBhcmluZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZEVkaXRvclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25FZGl0b3JQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBpZiAoIWUuY29tcG9uZW50IHx8ICFlLmVkaXRvck9wdGlvbnMgfHwgZS5wYXJlbnRUeXBlICE9PSAnZGF0YVJvdycgfHwgIWUuZGF0YUZpZWxkIHx8ICFlLnJvdyB8fCAhZS5yb3cua2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhRmllbGQgPSBlLmRhdGFGaWVsZDtcclxuICAgIGNvbnN0IGVkaXRvcktleSA9IGUucm93LmtleTtcclxuICAgIGNvbnN0IGRlZmF1bHRMaXN0ZW5lciA9IGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IChldmVudDogeyB2YWx1ZTogYW55IH0pID0+IHtcclxuICAgICAgZGVmYXVsdExpc3RlbmVyKGV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlTXVsdGlwbGVSb3dzKGRhdGFGaWVsZCwgZWRpdG9yS2V5LCBldmVudC52YWx1ZSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVNdWx0aXBsZVJvd3M8VD4oZGF0YUZpZWxkOiBzdHJpbmcsIGVkaXRvcktleTogc3RyaW5nLCB2YWx1ZTogVCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dLZXlzOiBzdHJpbmdbXSA9IGF3YWl0IHRoaXMub3B0aW9ucy5vd25lci5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuICAgIGlmICghc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkUm93S2V5cy5maW5kSW5kZXgoKGspID0+IGsgPT09IGVkaXRvcktleSk7XHJcbiAgICBpZiAoZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCA8IDAgfHwgc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0ZWRSb3dLZXlzLnNwbGljZShlZGl0b3JLZXlTZWxlY3RlZEluZGV4LCAxKTtcclxuICAgIHNlbGVjdGVkUm93S2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmNlbGxWYWx1ZSh0aGlzLm9wdGlvbnMub3duZXIuZ2V0Um93SW5kZXhCeUtleShrZXkpLCBkYXRhRmllbGQsIHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IE11dGFibGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcclxuICByZWFkb25seSBkZWZhdWx0RmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICByZWFkb25seSBkZWZhdWx0Vmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8ge1xyXG4gIERlZmF1bHRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIERlZmF1bHRWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgdXNlcklkOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbG9hZGVkVXNlclNldHRpbmdzPzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWVtcHR5LWludGVyZmFjZVxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zIHtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQVBTQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBNdXRhYmxlPE9taXQ8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMsIGtleW9mIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJEZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zPj47XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnM7XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgPSB7XHJcbiAgICBkZWZhdWx0RmlsdGVySWQ6IHVuZGVmaW5lZCxcclxuICAgIGRlZmF1bHRWaWV3SWQ6IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZFxyXG4gIH07XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJvdGVjdGVkIF9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBhdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFQU0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkZWRVc2VyU2V0dGluZ3MpIHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSB0aGlzLm9wdGlvbnMubG9hZGVkVXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3ModmFsdWU6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncykge1xyXG4gICAgdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gdmFsdWU7XHJcbiAgICB0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgaWYgKCF0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmxvYWRVc2VyU2V0dGluZ3MoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3ModXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy51cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz47XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+O1xyXG5cclxuICBwcm90ZWN0ZWQgc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcclxuICAgIHRoaXMuYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkID0gdHJ1ZTtcclxuICAgIH0sIDUwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0b3BBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcclxuICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgZXh0ZW5kcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgdXNlclNldHRpbmdzU3RvcmFnZUtleSA9ICdhcHM6Y29udHJvbC1kaXNwbGF5OnVzZXItc2V0dGluZ3MnO1xyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgcmF3VXNlclNldHRpbmdzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSk7XHJcbiAgICBpZiAoIXJhd1VzZXJTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVzZXJTZXR0aW5nczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzID0gSlNPTi5wYXJzZShyYXdVc2VyU2V0dGluZ3MpO1xyXG5cclxuICAgIHJldHVybiB1c2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgY3VycmVudFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzID0geyAuLi5jdXJyZW50VXNlclNldHRpbmdzLCAuLi51cGRhdGVzIH07XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkodXBkYXRlZFVzZXJTZXR0aW5ncykpO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMge1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XHJcbiAgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMgJiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcblxyXG5leHBvcnQgY2xhc3MgUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIGV4dGVuZHMgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCB1c2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KHRoaXMubG9hZERhdGFVcmwpO1xyXG5cclxuICAgIHJldHVybiB1c2VyU2V0dGluZ3NEdG8gPyB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvVG9Nb2RlbCh1c2VyU2V0dGluZ3NEdG8pIDogdGhpcy5kZWZhdWx0VXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xyXG4gICAgY29uc3QgdXBkYXRlZFVzZXJTZXR0aW5ncyA9IHsgLi4uY3VycmVudFVzZXJTZXR0aW5ncywgLi4udXBkYXRlcyB9O1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KFxyXG4gICAgICB0aGlzLnVwZGF0ZURhdGFVcmwsICdQVVQnLFxyXG4gICAgICB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTW9kZWxUb0R0byh1cGRhdGVkVXNlclNldHRpbmdzKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0b1RvTW9kZWwodXBkYXRlZFVzZXJTZXR0aW5nc0R0byk7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNb2RlbFRvRHRvKG1vZGVsOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgRGVmYXVsdEZpbHRlcklkOiBtb2RlbC5kZWZhdWx0RmlsdGVySWQsXHJcbiAgICAgIERlZmF1bHRWaWV3SWQ6IG1vZGVsLmRlZmF1bHRWaWV3SWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvKTogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRlZmF1bHRGaWx0ZXJJZDogZHRvLkRlZmF1bHRGaWx0ZXJJZCxcclxuICAgICAgZGVmYXVsdFZpZXdJZDogZHRvLkRlZmF1bHRWaWV3SWRcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gZ2V0U3VtbWFyeUNvbHVtbihjb2x1bW5zOiBBcnJheTx7IHZpc2libGVJbmRleDogbnVtYmVyLCB2aXNpYmxlOiBib29sZWFuLCBkYXRhRmllbGQ6IHN0cmluZyB9PiB8XHJcbiAgUmVhZG9ubHlBcnJheTxQaWNrPERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiwgJ3Zpc2libGVJbmRleCcgfCAndmlzaWJsZScgfCAnZGF0YUZpZWxkJz4+KSB7XHJcbiAgbGV0IGNvbHVtbkZvclN1bW1hcnkgPSAnJztcclxuXHJcbiAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKTtcclxuICBjb25zdCBjb2x1bW5zV2l0aEluZGV4ID0gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGVJbmRleCAhPT0gbnVsbCAmJiBjLnZpc2libGVJbmRleCAhPT0gdm9pZCAwKTtcclxuXHJcbiAgaWYgKCEhY29sdW1uc1dpdGhJbmRleC5sZW5ndGgpIHtcclxuICAgIGNvbHVtbkZvclN1bW1hcnkgPSBjb2x1bW5zV2l0aEluZGV4LnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpWzBdLmRhdGFGaWVsZDtcclxuICB9IGVsc2Uge1xyXG4gICAgY29sdW1uRm9yU3VtbWFyeSA9ICh2aXNpYmxlQ29sdW1uc1swXSAmJiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQpIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNvbHVtbkZvclN1bW1hcnk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQsIElGaWxlSW1wb3J0ZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZERpc3BsYXlzTWFuYWdlciwgSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciwgSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyLCBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZEZpbHRlcnNNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4gfSBmcm9tICcuL011bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luJztcclxuaW1wb3J0IHsgSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLCBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcic7XHJcbmltcG9ydCB7IERpc3BsYXlUeXBlLCBJRGlzcGxheVR5cGVTZXR0aW5ncywgSUljb25zQ29sdW1uRWRpdG9ySXRlbSB9IGZyb20gJy4vQ29udHJvbENvbmZpZ3VyYXRvcic7XHJcbmltcG9ydCB7IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSwgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGdldFN1bW1hcnlDb2x1bW4gfSBmcm9tICcuL0dyaWRTdW1tYXJ5SGVscGVyJztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi9CdXNpbmVzcyc7XHJcblxyXG5pbnRlcmZhY2UgSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb24ge1xyXG4gIFBlcm1pc3Npb25zOiBDb250cm9sUm9sZVBlcm1pc3Npb25zO1xyXG4gIE5hbWU6IHN0cmluZztcclxuICBUeXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nIHwgJ29iamVjdCcgfCAnZGF0ZScgfCAnZGF0ZXRpbWUnO1xyXG4gIExhYmVsOiBzdHJpbmc7XHJcbiAgT3JkZXI6IG51bWJlcjtcclxuICBUb29sVGlwOiBzdHJpbmc7XHJcbiAgSXNEZWZhdWx0Vmlld0ZpZWxkOiBib29sZWFuO1xyXG4gIElzS2V5Q29sdW1uOiBib29sZWFuO1xyXG4gIEdyb3VwRmllbGQ6IHN0cmluZztcclxuICBEaXNwbGF5VHlwZTogc3RyaW5nO1xyXG4gIFdpZHRoPzogbnVtYmVyO1xyXG4gIEhpZGluZ09yZGVyPzogbnVtYmVyO1xyXG4gIENvbHVtbnM/OiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVVzZXJDb25maWd1cmF0aW9uUmVzcG9uc2Uge1xyXG4gIEZpZWxkc0NvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW107XHJcbiAgQ2FuQ3JlYXRlR2xvYmFsVmlld3M6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVGaWx0ZXJzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZVZpZXdzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZURpc3BsYXlzOiBib29sZWFuO1xyXG4gIENhbkFwcGxheURpc3BsYXlzOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogb2ZmICovXHJcbi8qIHRzbGludDpkaXNhYmxlOiBuby1iaXR3aXNlICovXHJcbmNvbnN0IGVudW0gQ29udHJvbFJvbGVQZXJtaXNzaW9ucyB7XHJcbiAgTm9uZSA9IDAsXHJcbiAgUmVhZCA9IDEgPDwgMCxcclxuICBDcmVhdGUgPSAxIDw8IDEsXHJcbiAgVXBkYXRlID0gMSA8PCAyLFxyXG4gIERlbGV0ZSA9IDEgPDwgMyxcclxufVxyXG4vKiB0c2xpbnQ6ZW5hYmxlOiBuby1iaXR3aXNlICovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIGV4cG9ydEZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgdXNlck5hbWU6IHN0cmluZztcclxuICB1c2VyQ29uZmlnVXJsOiBzdHJpbmc7XHJcbiAgY29udHJvbExvZ3NVcmw6IHN0cmluZztcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgcmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuICBpbXBvcnRGaWxlT3B0aW9ucz86IElGaWxlSW1wb3J0ZXJPcHRpb25zO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbERpc3BsYXkge1xyXG4gIHB1YmxpYyByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZXhwb3J0RmlsZU5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyQ29uZmlnVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sTG9nc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1wb3J0RmlsZU9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIG1haW5HcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudDogR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQ6IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50OiBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIG11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luOiBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICAgIHRoaXMuZXhwb3J0RmlsZU5hbWUgPSBvcHRpb25zLmV4cG9ydEZpbGVOYW1lO1xyXG4gICAgdGhpcy51c2VyTmFtZSA9IG9wdGlvbnMudXNlck5hbWU7XHJcbiAgICB0aGlzLnVzZXJDb25maWdVcmwgPSBvcHRpb25zLnVzZXJDb25maWdVcmw7XHJcbiAgICB0aGlzLmNvbnRyb2xMb2dzVXJsID0gb3B0aW9ucy5jb250cm9sTG9nc1VybDtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyA9IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICAgIHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMgPSBvcHRpb25zLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gICAgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucyA9IG9wdGlvbnMuaW1wb3J0RmlsZU9wdGlvbnM7XHJcblxyXG4gICAgdGhpcy4kY29udGFpbmVyLmFkZENsYXNzKFsnYXBzLWdyaWQnLCAnY29udHJvbC1kaXNwbGF5LWdyaWQnXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgc2VuZFJlcXVlc3Q8SVVzZXJDb25maWd1cmF0aW9uUmVzcG9uc2U+KHRoaXMudXNlckNvbmZpZ1VybClcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyaWRGaWx0ZXJzTWFuYWdlciA9IG5ldyBHcmlkRmlsdGVyc01hbmFnZXIodGhpcy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBncmlkVmlld3NNYW5hZ2VyID0gbmV3IEdyaWRWaWV3c01hbmFnZXIodGhpcy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgZ3JpZERpc3BsYXlzTWFuYWdlciA9IG5ldyBHcmlkRGlzcGxheXNNYW5hZ2VyKHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLm1haW5HcmlkID0gdGhpcy5jcmVhdGVNYWluR3JpZChyZXMuRmllbGRzQ29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbkNyZWF0ZURpc3BsYXlzID0gcmVzLkNhbkNyZWF0ZURpc3BsYXlzICYmIHJlcy5DYW5DcmVhdGVWaWV3cyAmJiByZXMuQ2FuQ3JlYXRlRmlsdGVycztcclxuXHJcbiAgICAgICAgaWYgKGNhbkNyZWF0ZURpc3BsYXlzIHx8IHJlcy5DYW5BcHBsYXlEaXNwbGF5cykge1xyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQoe1xyXG4gICAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZCxcclxuICAgICAgICAgICAgZWRpdE1vZGU6IGNhbkNyZWF0ZURpc3BsYXlzLFxyXG4gICAgICAgICAgICBncmlkRmlsdGVyc01hbmFnZXIsXHJcbiAgICAgICAgICAgIGdyaWRWaWV3c01hbmFnZXIsXHJcbiAgICAgICAgICAgIGdyaWREaXNwbGF5c01hbmFnZXIsXHJcbiAgICAgICAgICAgIGltcG9ydEZpbGVPcHRpb25zOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCA9IG5ldyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50KHtcclxuICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkLFxyXG4gICAgICAgICAgb25WaWV3QXBwbGllZDogdGhpcy5vblZpZXdBcHBsaWVkLFxyXG4gICAgICAgICAgb25WaWV3RGVsZXRlZDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBncmlkRGlzcGxheXNNYW5hZ2VyLmxvYWREaXNwbGF5cygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGF1dG9JbnRlZ3JhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGdyaWRWaWV3c01hbmFnZXIsXHJcbiAgICAgICAgICBjYW5DcmVhdGVHbG9iYWxWaWV3czogcmVzLkNhbkNyZWF0ZUdsb2JhbFZpZXdzLFxyXG4gICAgICAgICAgdmlzaWJsZTogcmVzLkNhbkNyZWF0ZVZpZXdzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCh7XHJcbiAgICAgICAgICBhcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXI6IG5ldyBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIoe1xyXG4gICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlck5hbWUsXHJcbiAgICAgICAgICAgIGxvYWREYXRhVXJsOiB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLmxvYWREYXRhVXJsLFxyXG4gICAgICAgICAgICB1cGRhdGVEYXRhVXJsOiB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLnVwZGF0ZURhdGFVcmxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWQsXHJcbiAgICAgICAgICBvbkZpbHRlckRlbGV0ZWQ6IGFzeW5jIChmaWx0ZXJJZCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBncmlkRGlzcGxheXNNYW5hZ2VyLmxvYWREaXNwbGF5cygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGF1dG9JbnRlZ3JhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlcixcclxuICAgICAgICAgIGNhbkNyZWF0ZUdsb2JhbEZpbHRlcnM6IHJlcy5DYW5DcmVhdGVHbG9iYWxGaWx0ZXJzLFxyXG4gICAgICAgICAgdmlzaWJsZTogcmVzLkNhbkNyZWF0ZUZpbHRlcnNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiA9IG5ldyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbih7XHJcbiAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxheUNoYW5nZWQgPSBhc3luYyAoZGlzcGxheSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRpc3BsYXkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQuYXBwbHlGaWx0ZXIoZGlzcGxheS5GaWx0ZXJJZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5hcHBseVZpZXcoZGlzcGxheS5WaWV3SWQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQuYXBwbHlGaWx0ZXIodm9pZCAwLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50LmFwcGx5VmlldyhHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyogdHNsaW50OmRpc2FibGU6IG5vLWJpdHdpc2UgKi9cclxuICBwcml2YXRlIGhhc1Blcm1pc3NvbihydWxlcywgcGVybWlzc29uKSB7XHJcbiAgICByZXR1cm4gcnVsZXMgJiBwZXJtaXNzb247XHJcbiAgfVxyXG4gIC8qIHRzbGludDplbmFibGU6IG5vLWJpdHdpc2UgKi9cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFRyZWUoY29sdW1ucykge1xyXG4gICAgY29uc3QgZ3JvdXBQcmVmaXggPSAnX19HUk9VUF9fJztcclxuXHJcbiAgICBsZXQgY29sdW1uc01hcCA9IGNvbHVtbnMucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xyXG4gICAgICBjb2x1bW4uQ29sdW1ucyA9IFtdO1xyXG4gICAgICBjb2x1bW4uR3JvdXBGaWVsZCA9IGNvbHVtbi5Hcm91cEZpZWxkXHJcbiAgICAgICAgPyBgJHtncm91cFByZWZpeH0ke2NvbHVtbi5Hcm91cEZpZWxkfWBcclxuICAgICAgICA6IG51bGw7XHJcbiAgICAgIGFjY1tjb2x1bW4uTmFtZV0gPSBjb2x1bW47XHJcblxyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwge30pO1xyXG5cclxuICAgIGNvbHVtbnNNYXAgPSBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLkdyb3VwRmllbGQpXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLkdyb3VwRmllbGQpXHJcbiAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXHJcbiAgICAgIC5yZWR1Y2UoKGFjYywgZ3JvdXBGaWVsZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBncm91cEZpZWxkLnJlcGxhY2UoZ3JvdXBQcmVmaXgsICcnKTtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDb2x1bW4gPSB7XHJcbiAgICAgICAgICBOYW1lOiBncm91cEZpZWxkLFxyXG4gICAgICAgICAgTGFiZWw6IGNvbHVtbk5hbWUsXHJcbiAgICAgICAgICBDb2x1bW5zOiBbXSxcclxuICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlOiBtYXgtbGluZS1sZW5ndGggKi9cclxuICAgICAgICAgIEdyb3VwRmllbGQ6IGNvbHVtbnNNYXBbY29sdW1uTmFtZV0gJiYgY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkICYmIGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZCAhPT0gZ3JvdXBGaWVsZFxyXG4gICAgICAgICAgICA/IGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZFxyXG4gICAgICAgICAgICA6IG51bGxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBhY2NbZ3JvdXBGaWVsZF0gPSBncm91cENvbHVtbjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgfSwgY29sdW1uc01hcCk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIGluIGNvbHVtbnNNYXApIHtcclxuICAgICAgaWYgKGNvbHVtbnNNYXAuaGFzT3duUHJvcGVydHkoY29sdW1uTmFtZSkpIHtcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLkdyb3VwRmllbGQpIHtcclxuICAgICAgICAgIGNvbHVtbnNNYXBbY29sdW1uLkdyb3VwRmllbGRdLkNvbHVtbnMucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckRpc3BsYXlUeXBlKHNldHRpbmdzOiBJRGlzcGxheVR5cGVTZXR0aW5ncywgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4sIHBlcm1pc3Npb25zOiBDb250cm9sUm9sZVBlcm1pc3Npb25zKSB7XHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuSWNvbnMpIHtcclxuICAgICAgY29sdW1uLmNlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyhvcHRpb25zLnZhbHVlKTtcclxuICAgICAgICBjb25zdCBjZWxsU2V0dGluZ3MgPSBzZXR0aW5ncy5kYXRhLmZpbmQoKGl0ZW0pID0+IFN0cmluZyhpdGVtLnZhbHVlKSA9PT0gc3RyaW5nVmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoY2VsbFNldHRpbmdzKSB7XHJcbiAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIGNlbGxTZXR0aW5ncy50aXRsZSlcclxuICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjZWxsU2V0dGluZ3MuaW1hZ2UgfSkpXHJcbiAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgLnRleHQob3B0aW9ucy52YWx1ZSlcclxuICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZXR0aW5ncy5kYXRhLFxyXG4gICAgICAgICAgZGlzcGxheVZhbHVlOiAndGl0bGUnLFxyXG4gICAgICAgICAgaXRlbVRlbXBsYXRlOiAoZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBkYXRhLnRpdGxlKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogZGF0YS5pbWFnZSB9KSlcclxuICAgICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgZmllbGRUZW1wbGF0ZTogKGRhdGEsIGVsKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gc2V0dGluZ3MuZGF0YS5maW5kKChpdGVtKSA9PiBwYXJzZUludChpdGVtLnZhbHVlKSA9PT0gY2VsbEluZm8udmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCAkaXRlbU5hbWUgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2l0ZW0tbmFtZScpO1xyXG4gICAgICAgICAgICBjb25zdCAkcmVzdWx0ID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtaWNvbi1lZGl0b3JfX2N1c3RvbS1pdGVtJylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGN1cnJlbnRJdGVtID8gY3VycmVudEl0ZW0uaW1hZ2UgOiAnJyB9KS5hdHRyKCd0aXRsZScsIGN1cnJlbnRJdGVtID8gY3VycmVudEl0ZW0udGl0bGUgOiAnJykpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkaXRlbU5hbWUpO1xyXG5cclxuICAgICAgICAgICAgJGl0ZW1OYW1lXHJcbiAgICAgICAgICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogJycsXHJcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZWwuYXBwZW5kKCRyZXN1bHQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSwgY29tcG9uZW50IH0pID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUocGFyc2VJbnQodmFsdWUudmFsdWUpKTtcclxuICAgICAgICAgICAgY29tcG9uZW50LmJsdXIoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWx1ZTogKGNlbGxJbmZvLnZhbHVlICE9PSBudWxsICYmIGNlbGxJbmZvICE9PSB2b2lkIDApICYmIGNlbGxJbmZvLnZhbHVlLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBzZWxlY3RlZEl0ZW06IHNldHRpbmdzLmRhdGEuZmluZCgoaXRlbSkgPT4gcGFyc2VJbnQoaXRlbS52YWx1ZSkgPT09IGNlbGxJbmZvLnZhbHVlKVxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4uYWxsb3dTZWFyY2ggPSBmYWxzZTtcclxuICAgICAgY29sdW1uLmFsbG93RmlsdGVyaW5nID0gZmFsc2U7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0hlYWRlckZpbHRlcmluZyA9IHRydWU7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0dyb3VwaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMpIHtcclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZXR0aW5ncy5kYXRhLm1hcCgoaSkgPT4gaS52YWx1ZSkuc29ydCgpLFxyXG4gICAgICAgICAgYWNjZXB0Q3VzdG9tVmFsdWU6IHRydWUsXHJcbiAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUsIGNvbXBvbmVudCB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKHZhbHVlIHx8ICcnKTtcclxuICAgICAgICAgICAgY29tcG9uZW50LmJsdXIoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUsXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uKSB7XHJcbiAgICAgIGNvbHVtbi5lZGl0Q2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAkKCc8ZGl2IC8+JykuZHhDaGVja0JveCh7XHJcbiAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUgfHwgZmFsc2UsXHJcbiAgICAgICAgICByZWFkT25seTogIXRoaXMuaGFzUGVybWlzc29uKHBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSksXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNlbGxWYWx1ZShjZWxsSW5mby5yb3dJbmRleCwgY2VsbEluZm8uY29sdW1uLmRhdGFGaWVsZCwgZS52YWx1ZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpZ3VyZUNvbHVtbihjb2x1bW5Db25maWc6IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uIHtcclxuICAgIGNvbnN0IHRpdGxlID0gY29sdW1uQ29uZmlnLkxhYmVsIHx8IGNvbHVtbkNvbmZpZy5OYW1lO1xyXG4gICAgY29uc3QgdG9vbHRpcCA9IGNvbHVtbkNvbmZpZy5Ub29sVGlwIHx8IHRpdGxlO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uID0gIWNvbHVtbkNvbmZpZy5Db2x1bW5zLmxlbmd0aFxyXG4gICAgICA/IHtcclxuICAgICAgICBkYXRhRmllbGQ6IGNvbHVtbkNvbmZpZy5OYW1lLFxyXG4gICAgICAgIGRhdGFUeXBlOiBjb2x1bW5Db25maWcuVHlwZSxcclxuICAgICAgICBjYXB0aW9uOiB0aXRsZSxcclxuICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0aXRsZSwgdG9vbHRpcCksXHJcbiAgICAgICAgdmlzaWJsZTogY29sdW1uQ29uZmlnLklzRGVmYXVsdFZpZXdGaWVsZCxcclxuICAgICAgICB2aXNpYmxlSW5kZXg6IGNvbHVtbkNvbmZpZy5PcmRlcixcclxuICAgICAgICBhbGxvd0ZpeGluZzogZmFsc2UsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiAhIXRoaXMuaGFzUGVybWlzc29uKGNvbHVtbkNvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpLFxyXG4gICAgICAgIHdpZHRoOiBjb2x1bW5Db25maWcuV2lkdGgsXHJcbiAgICAgICAgaGlkaW5nUHJpb3JpdHk6IGNvbHVtbkNvbmZpZy5IaWRpbmdPcmRlclxyXG4gICAgICB9IDoge1xyXG4gICAgICAgIGNhcHRpb246IHRpdGxlLFxyXG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbkNvbmZpZy5Db2x1bW5zLm1hcCgoYykgPT4gdGhpcy5jb25maWd1cmVDb2x1bW4oYykpXHJcbiAgICAgIH07XHJcblxyXG4gICAgaWYgKGNvbHVtbkNvbmZpZy5EaXNwbGF5VHlwZSkge1xyXG4gICAgICBjb25zdCBkaXNwbGF5U2V0dGluZ3M6IElEaXNwbGF5VHlwZVNldHRpbmdzID0gSlNPTi5wYXJzZShjb2x1bW5Db25maWcuRGlzcGxheVR5cGUpO1xyXG5cclxuICAgICAgaWYgKGRpc3BsYXlTZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5JY29ucykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZGlzcGxheVNldHRpbmdzLmRhdGEubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICAgICAgdGV4dDogaXRlbS50aXRsZSxcclxuICAgICAgICAgIHZhbHVlOiBpdGVtLnZhbHVlXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBpdGVtcy5zcGxpY2UoMCwgMCwge1xyXG4gICAgICAgICAgdGV4dDogJ0JsYW5rJyxcclxuICAgICAgICAgIHZhbHVlOiBudWxsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIChjb2x1bW4gYXMgYW55KS5oZWFkZXJGaWx0ZXIgPSB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBpdGVtc1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucmVuZGVyRGlzcGxheVR5cGUoZGlzcGxheVNldHRpbmdzLCBjb2x1bW4sIGNvbHVtbkNvbmZpZy5QZXJtaXNzaW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uZmlndXJlQ29sdW1ucyhjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5maWx0ZXIoXHJcbiAgICAgIChjKSA9PiB0aGlzLmhhc1Blcm1pc3NvbihjLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlJlYWQpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbmZpZ3VyYXRpb24gPSB0aGlzLmJ1aWxkVHJlZShjb25maWd1cmF0aW9uKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSBjb25maWd1cmF0aW9uLm1hcCgoYykgPT4gdGhpcy5jb25maWd1cmVDb2x1bW4oYykpO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZChjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICBjb25zdCBoYXNLZXlzID0gY29uZmlndXJhdGlvbi5zb21lKChjKSA9PiBjLklzS2V5Q29sdW1uKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbmZpZ3VyZUNvbHVtbnMoY29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgY29uc3QgY29sdW1uRm9yU3VtbWFyeSA9IGdldFN1bW1hcnlDb2x1bW4oY29sdW1ucyk7XHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoY29uZmlndXJhdGlvbiksXHJcbiAgICAgIGNvbHVtblJlc2l6aW5nTW9kZTogJ3dpZGdldCcsXHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiBoYXNLZXlzLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICBhbGxvd0RlbGV0aW5nOiBmYWxzZSxcclxuICAgICAgICBtb2RlOiAnYmF0Y2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAndmlydHVhbCcsIHByZWxvYWRFbmFibGVkOiB0cnVlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGhlaWdodDogdGhpcy5pc1N0YW5kYWxvbmVQYWdlID8gdW5kZWZpbmVkIDogJzEwMCUnLFxyXG4gICAgICBjb2x1bW5DaG9vc2VyOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBtb2RlOiAnZHJhZ0FuZERyb3AnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbkZpeGluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZmlsdGVyUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICBjcmVhdGVGaWx0ZXI6ICdOb25lJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHN1bW1hcnk6IHtcclxuICAgICAgICB0b3RhbEl0ZW1zOiBbeyBzdW1tYXJ5VHlwZTogJ2NvdW50JywgY29sdW1uOiBjb2x1bW5Gb3JTdW1tYXJ5IH1dXHJcbiAgICAgIH0sXHJcbiAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgIGNvbHVtbkhpZGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1ucyxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiB0cnVlLFxyXG4gICAgICBncm91cGluZzoge1xyXG4gICAgICAgIGNvbnRleHRNZW51RW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBtYXN0ZXJEZXRhaWw6ICFoYXNLZXlzID8gdW5kZWZpbmVkIDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdGVtcGxhdGU6IChjb250YWluZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGtleXMgPSB7fTtcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZmlsdGVyKChjKSA9PiBjLklzS2V5Q29sdW1uKS5mb3JFYWNoKChjKSA9PiBrZXlzW2MuTmFtZV0gPSBvcHRpb25zLmRhdGFbYy5OYW1lXSk7XHJcblxyXG4gICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZToge1xyXG4gICAgICAgICAgICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICAgICAgICAgIGxvYWRVcmw6IGAke3RoaXMuY29udHJvbExvZ3NVcmx9P2tleT0ke0pTT04uc3RyaW5naWZ5KGtleXMpfWAsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICAgICAgICAgICAgY29sdW1uczogW3tcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1VzZXInLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMFxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0NyZWF0ZWRBdCcsXHJcbiAgICAgICAgICAgICAgICBjYXB0aW9uOiAnRGF0ZScsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiAnc2hvcnREYXRlU2hvcnRUaW1lJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAyMDBcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdDaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogKGMsIG8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IG8uZGF0YS5DaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcclxuICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGA8ZGl2IGNsYXNzPSdhcHMtY29udHJvbC1sb2cnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2Fwcy1jb250cm9sLWxvZ19fZmllbGQnPiR7aXRlbS5GaWVsZH08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nX19vbGQtdmFsdWUnPiR7aXRlbS5PbGRWYWx1ZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTIxOTJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdhcHMtY29udHJvbC1sb2dfX25ldy12YWx1ZSc+JHtpdGVtLk5ld1ZhbHVlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICQoYDxkaXYgY2xhc3M9J2Fwcy1jb250cm9sLWxvZ3MnPiR7Y29udGVudH08L2Rpdj5gKS5hcHBlbmRUbyhjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XSxcclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJlcGFyZUZpbHRlclBhbmVsKGUuY29tcG9uZW50KTtcclxuICAgICAgfSxcclxuICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSAhPT0gJ2RhdGFSb3cnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IGNvbmZpZ3VyYXRpb24uZmluZCgoYykgPT4gYy5OYW1lID09PSBlLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgIGlmICghZmllbGRDb25maWcpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpc2FibGVFZGl0aW5nID0gIXRoaXMuaGFzUGVybWlzc29uKGZpZWxkQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSk7XHJcblxyXG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucy5yZWFkT25seSA9IGRpc2FibGVFZGl0aW5nO1xyXG5cclxuICAgICAgICBpZiAoIWRpc2FibGVFZGl0aW5nICYmIGZpZWxkQ29uZmlnLlR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlU2V0VmFsdWUgPSBlLnNldFZhbHVlO1xyXG5cclxuICAgICAgICAgIChlIGFzIGFueSkuc2V0VmFsdWUgPSAobmV3VmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBiYXNlU2V0VmFsdWUobmV3VmFsdWUudHJpbSgpKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnZGF0YScpIHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gY29uZmlndXJhdGlvbi5maW5kKChjKSA9PiBjLk5hbWUgPT09IGUuY29sdW1uLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkQ29uZmlnICYmICF0aGlzLmhhc1Blcm1pc3NvbihmaWVsZENvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpKSB7XHJcbiAgICAgICAgICAgICQoZS5jZWxsRWxlbWVudCkuYWRkQ2xhc3MoJ2Fwcy1ncmlkX19kaXNhYmxlZC1jZWxsJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblJvd0V4cGFuZGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbFJvd0luZGV4ID0gZS5jb21wb25lbnQuZ2V0Um93SW5kZXhCeUtleShlLmtleSkgKyAxO1xyXG4gICAgICAgIGNvbnN0ICRkZXRhaWxDZWxsID0gZS5jb21wb25lbnQuZ2V0Q2VsbEVsZW1lbnQoZGV0YWlsUm93SW5kZXgsIDApLnBhcmVudCgpLmZpbmQoJy5keC1tYXN0ZXItZGV0YWlsLWNlbGwnKTtcclxuICAgICAgICBjb25zdCBkYXRhR3JpZCA9ICRkZXRhaWxDZWxsLmZpbmQoJy5keC1kYXRhZ3JpZCcpLmZpcnN0KCkucGFyZW50KCkuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgICAgZGF0YUdyaWQucmVmcmVzaCgpO1xyXG4gICAgICB9LFxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc1N0YW5kYWxvbmVQYWdlLFxyXG4gICAgICBzZXREZWZhdWx0Q29sdW1uV2lkdGg6IHRydWUsXHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiB0aGlzLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXHJcbiAgICAgIGRpc2FibGVTdW1tYXJ5Q29sdW1uRGV0ZWN0aW9uOiB0cnVlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAga2V5OiBjb25maWd1cmF0aW9uLmZpbHRlcigoYykgPT4gYy5Jc0tleUNvbHVtbikubWFwKChjKSA9PiBjLk5hbWUpLFxyXG4gICAgICAgIGxvYWRVcmw6IHRoaXMubG9hZERhdGFVcmwsXHJcbiAgICAgICAgdXBkYXRlVXJsOiB0aGlzLnVwZGF0ZURhdGFVcmxcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQgPSAodmlld0lkOiBudW1iZXIpID0+IHtcclxuICAgIHRoaXMuY2xlYXJGaWx0ZXJSb3dBZnRlclZpZXdTd2l0Y2hpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUZpbHRlclBhbmVsKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgJGZpbHRlclBhbmVsRWxlbWVudCA9IGdyaWQuZWxlbWVudCgpXHJcbiAgICAgIC5maW5kKCcuZHgtZGF0YWdyaWQtZmlsdGVyLXBhbmVsJyk7XHJcbiAgICBjb25zdCAkZmlsdGVySWNvbkZpbHRlciA9ICRmaWx0ZXJQYW5lbEVsZW1lbnQuZmluZCgnLmR4LWljb24tZmlsdGVyJyk7XHJcbiAgICBjb25zdCAkZmlsdGVyUGFuZWxUZXh0ID0gJGZpbHRlclBhbmVsRWxlbWVudC5maW5kKCcuZHgtZGF0YWdyaWQtZmlsdGVyLXBhbmVsLXRleHQnKTtcclxuXHJcbiAgICAkZmlsdGVySWNvbkZpbHRlci5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkZmlsdGVyUGFuZWxUZXh0Lm9mZignY2xpY2snKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFJvd3NDb3VudFN1bW1hcnkoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBmaXJzdFZpc2libGVEYXRhQ29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmQoKGMpID0+ICEhYy5kYXRhRmllbGQpO1xyXG4gICAgaWYgKCFmaXJzdFZpc2libGVEYXRhQ29sdW1uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByb3dzQ291bnRTdW1tYXJ5TmFtZSA9ICdSb3dzQ291bnQnO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0IHRvdGFsSXRlbXM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXSA9IChncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXNbJ3N1bW1hcnknXVsndG90YWxJdGVtcyddICkgfHwgW107XHJcbiAgICBjb25zdCByb3dzQ291bnRTdW1tYXJ5SXRlbSA9IHRvdGFsSXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtLm5hbWUgPT09IHJvd3NDb3VudFN1bW1hcnlOYW1lKTtcclxuICAgIGlmIChyb3dzQ291bnRTdW1tYXJ5SXRlbSAmJiByb3dzQ291bnRTdW1tYXJ5SXRlbS5jb2x1bW4gPT09IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4uZGF0YUZpZWxkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm93c0NvdW50U3VtbWFyeUl0ZW0pIHtcclxuICAgICAgcm93c0NvdW50U3VtbWFyeUl0ZW0uY29sdW1uID0gZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0b3RhbEl0ZW1zLnB1c2goe1xyXG4gICAgICAgIG5hbWU6IHJvd3NDb3VudFN1bW1hcnlOYW1lLFxyXG4gICAgICAgIGNvbHVtbjogZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQsXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCcsXHJcbiAgICAgICAgYWxpZ25tZW50OiAnbGVmdCcsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFpbkdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnLCB0b3RhbEl0ZW1zKTtcclxuICB9XHJcblxyXG4gIC8vIE5PVEU6IFdvcmthcm91bmQuIFRoZSBncmlkIGNhbid0IGNsZWFyIHRoZSBmaWx0ZXIgcm93LCBzbyB3ZSBjbGVhciB0aGF0IG1hbnVhbGx5XHJcbiAgcHJpdmF0ZSBjbGVhckZpbHRlclJvd0FmdGVyVmlld1N3aXRjaGluZygpIHtcclxuICAgIGNvbnN0IGNsZWFySGVhZGVyID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzOiB7IFt2aXNpYmxlSW5kZXg6IG51bWJlcl06IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiB9ID0ge307XHJcblxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50Lm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGUuY29sdW1uc1xyXG4gICAgICAgIHx8IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Db2x1bW5bXTtcclxuXHJcbiAgICAgIGNvbHVtbnNcclxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnZpc2libGVJbmRleCAmJiAoYy5maWx0ZXJWYWx1ZSB8fCBjLmZpbHRlclZhbHVlcykpXHJcbiAgICAgICAgLmZvckVhY2goKGMpID0+IGNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXNbYy52aXNpYmxlSW5kZXhdID0gYyk7XHJcblxyXG4gICAgICAkKCd0ZCBbYXJpYS1sYWJlbCo9XCJGaWx0ZXIgY2VsbFwiXScpXHJcbiAgICAgICAgLmZpbHRlcigoaW5kZXgpID0+ICFjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzW2luZGV4XSlcclxuICAgICAgICAudmFsKCcnKTtcclxuICAgICAgdGhpcy5tYWluR3JpZC5vZmYoJ2NvbnRlbnRSZWFkeScsIGNsZWFySGVhZGVyKTtcclxuICAgIH07XHJcbiAgICB0aGlzLm1haW5HcmlkLm9uKCdjb250ZW50UmVhZHknLCBjbGVhckhlYWRlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHREYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkLCBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5cclxuaW50ZXJmYWNlIElBcHBVc2VyIHtcclxuICBJZDogc3RyaW5nO1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJRGlzcGxheSB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlzVXNlckFzc2lnbm1lbnQge1xyXG4gIERpc3BsYXlJZDogbnVtYmVyO1xyXG4gIFVzZXJJZDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRDb2x1bW4ge1xyXG4gIElkOiBzdHJpbmc7XHJcbiAgQ2FwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUFQU0NvbnRyb2xEaXNwbGF5QXNzaWdubWVudHNEYXRhIHtcclxuICBVc2VyczogSUFwcFVzZXJbXTtcclxuICBEaXNwbGF5czogSURpc3BsYXlbXTtcclxuICBBc3NpZ25tZW50czogSUNvbnRyb2xEaXNwbGF5c1VzZXJBc3NpZ25tZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEaXNwbGF5TWFuYWdlciB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEaXNwbGF5TWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXNTdGFuZGFsb25lUGFnZSA9IG9wdGlvbnMuaXNTdGFuZGFsb25lUGFnZTtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBsZXQgY29sdW1uczogSUdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0IGxvYWREYXRhUHJvbWlzZSA9IHNlbmRSZXF1ZXN0PElBUFNDb250cm9sRGlzcGxheUFzc2lnbm1lbnRzRGF0YT4odGhpcy5sb2FkRGF0YVVybCwgJ2dldCcpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBjb2x1bW5zID0gcmVzLkRpc3BsYXlzLm1hcCgoZCkgPT4gKHsgSWQ6IGQuSWQudG9TdHJpbmcoKSwgQ2FwdGlvbjogZC5OYW1lIH0pKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHVzZXIgb2YgcmVzLlVzZXJzKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtID0geyBVc2VyTmFtZTogdXNlci5Vc2VyTmFtZSwgVXNlcklkOiB1c2VyLklkIH07XHJcbiAgICAgICAgICBjb25zdCB1c2VyQXNzaWdubWVudHMgPSByZXMuQXNzaWdubWVudHMuZmlsdGVyKChhKSA9PiBhLlVzZXJJZCA9PT0gdXNlci5JZCk7XHJcblxyXG4gICAgICAgICAgdXNlckFzc2lnbm1lbnRzLmZvckVhY2goKGFzc2lnbm1lbnQpID0+IHtcclxuICAgICAgICAgICAgaXRlbVthc3NpZ25tZW50LkRpc3BsYXlJZF0gPSB0cnVlO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgZGF0YS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSBbXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1VzZXJOYW1lJywgd2lkdGg6IDMwMCwgZml4ZWQ6IHRydWUsIGZpeGVkUG9zaXRpb246ICdsZWZ0JywgYWxsb3dFZGl0aW5nOiBmYWxzZSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdVc2VySWQnLCB2aXNpYmxlOiBmYWxzZSB9XHJcbiAgICAgICAgXSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuQ29sdW1uW107XHJcblxyXG4gICAgICAgIGdyaWQub3B0aW9uKCdjb2x1bW5zJywgZ3JpZENvbHVtbnMuY29uY2F0KGNvbHVtbnMubWFwKChjb2wpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogY29sLklkLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiBjb2wuQ2FwdGlvbixcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgY2FsY3VsYXRlQ2VsbFZhbHVlOiAocm93RGF0YSkgPT4gISFyb3dEYXRhW2NvbC5JZF1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSkpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGxldCB1cGRhdGluZ0lzSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdhcHMtZGlzcGxheS1tYW5hZ2VyJ30sXHJcbiAgICAgIGRhdGFTb3VyY2U6IHtcclxuICAgICAgICBzdG9yZTogbmV3IERldkV4cHJlc3MuZGF0YS5DdXN0b21TdG9yZSh7XHJcbiAgICAgICAgICBrZXk6ICdVc2VySWQnLFxyXG4gICAgICAgICAgbG9hZE1vZGU6ICdyYXcnLFxyXG4gICAgICAgICAgbG9hZDogKCkgPT4gbG9hZERhdGFQcm9taXNlLFxyXG4gICAgICAgICAgdXBkYXRlOiAoa2V5LCB2YWx1ZXM6IHsgW2Rpc3BsYXlJZDogbnVtYmVyXTogYm9vbGVhbiB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvUmVtb3ZlOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCB0b0FkZDogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgdGhlcmVJc0N1cnJlbnRVcGRhdGluZyA9IHVwZGF0aW5nSXNJblByb2dyZXNzO1xyXG5cclxuICAgICAgICAgICAgdXBkYXRpbmdJc0luUHJvZ3Jlc3MgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGlzcGxheUlkcyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XHJcblxyXG4gICAgICAgICAgICBkaXNwbGF5SWRzLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2gocGFyc2VJbnQoaWQpKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdG9SZW1vdmUucHVzaChwYXJzZUludChpZCkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBOT1RFOiBub3RpZnkgYWJvdXQgc3VjY2Vzc2Z1bCByZXF1ZXN0IG9ubHkgZm9yIHRoZSBmaXJzdCByZXF1ZXN0IGluIHRoZSBxdWV1ZVxyXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7IHVwZGF0aW5nSXNJblByb2dyZXNzID0gZmFsc2U7IH0sIDApO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMudXBkYXRlRGF0YVVybCwgJ3B1dCcsIHtcclxuICAgICAgICAgICAgICB1c2VySWQ6IGtleSxcclxuICAgICAgICAgICAgICBkaXNwbGF5c1RvUmVtb3ZlOiB0b1JlbW92ZSxcclxuICAgICAgICAgICAgICBkaXNwbGF5c1RvQWRkOiB0b0FkZFxyXG4gICAgICAgICAgICB9LCAhdGhlcmVJc0N1cnJlbnRVcGRhdGluZykucHJvbWlzZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgZ3JvdXBpbmc6IHtcclxuICAgICAgICBjb250ZXh0TWVudUVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICByZWZyZXNoTW9kZTogJ3JlcGFpbnQnXHJcbiAgICAgIH1cclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXM7XHJcblxyXG4gICAgY29uc3QgYWRkaXRpb25hbE9wdGlvbnMgPSB7XHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiAnRGlzcGxheU1hbmFnZW1lbnQnLFxyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnVXNlck5hbWUnXHJcbiAgICB9IGFzIElHcmlkQWRkaXRpb25hbE9wdGlvbnM7XHJcblxyXG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICAgIGlmICh0aGlzLmlzU3RhbmRhbG9uZVBhZ2UpIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCh0aGlzLiRjb250YWluZXIsIGdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucywgdGhpcy5wYWdlVGl0bGUsICcnLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgICBzdW1tYXJ5Q29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zdW1tYXJ5Q29sdW1uLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVBpbmdSZXN1bHQge1xyXG4gIGlzQXV0aGVudGljYXRlZDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucyB7XHJcbiAgc2Vzc2lvbkV4cGlyZVRpbWVNczogbnVtYmVyO1xyXG4gIGRpc3BsYXlEdXJhdGlvbk1zOiBudW1iZXI7XHJcbiAgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcclxuICBsb2dvdXRVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RpZmllciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uRXhwaXJlVGltZU1zOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5RHVyYXRpb25NczogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ291dFVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHdhdGluZ1RpbWVvdXRJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgY291bnRlckludGVydmFsSWQ6IG51bWJlcjtcclxuICBwcml2YXRlIHBpbmdJbnRlcnZhbElkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBleHBpcmF0aW9uVGltZTogRGF0ZTtcclxuICBwcml2YXRlICR0ZXh0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSBjb250aW51ZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSBva0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIGxvZ291dEJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuXHJcbiAgcHJpdmF0ZSBfcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBwcml2YXRlIGdldCBwb3B1cCgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAge1xyXG4gICAgaWYgKCF0aGlzLl9wb3B1cCkge1xyXG4gICAgICB0aGlzLl9wb3B1cCA9IHRoaXMuY3JlYXRlUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fcG9wdXA7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zID0gb3B0aW9ucy5zZXNzaW9uRXhwaXJlVGltZU1zO1xyXG4gICAgdGhpcy5kaXNwbGF5RHVyYXRpb25NcyA9IG9wdGlvbnMuZGlzcGxheUR1cmF0aW9uTXM7XHJcbiAgICB0aGlzLnNlc3Npb25QaW5nVXJsID0gb3B0aW9ucy5zZXNzaW9uUGluZ1VybDtcclxuICAgIHRoaXMubG9nb3V0VXJsID0gb3B0aW9ucy5sb2dvdXRVcmw7XHJcblxyXG4gICAgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUgPSB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZS5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcblxyXG4gICAgdGhpcy5wb3B1cD8uaGlkZSgpO1xyXG5cclxuICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSB0aGlzLmdldEV4cGlyYXRpb25UaW1lKCk7XHJcblxyXG4gICAgdGhpcy53YXRpbmdUaW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbigpO1xyXG4gICAgfSwgTWF0aC5tYXgodGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zIC0gdGhpcy5kaXNwbGF5RHVyYXRpb25NcywgMCkpO1xyXG5cclxuICAgIHRoaXMucGluZ0ludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSgpO1xyXG4gICAgfSwgNjAgKiAxMDAwKTtcclxuXHJcbiAgICAkKGRvY3VtZW50KS5vbigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dOb3RpZmljYXRpb24oKSB7XHJcbiAgICB0aGlzLnBvcHVwPy5zaG93KCk7XHJcblxyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVQb3B1cENvbnRlbnQoKTtcclxuICAgIHRoaXMuY291bnRlckludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBvcHVwQ29udGVudCgpO1xyXG4gICAgfSwgMTAwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKSB7XHJcbiAgICBpZiAodGhpcy53YXRpbmdUaW1lb3V0SWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2F0aW5nVGltZW91dElkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvdW50ZXJJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb3VudGVySW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5waW5nSW50ZXJ2YWxJZCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ0ludGVydmFsSWQpO1xyXG4gICAgfVxyXG5cclxuICAgICQoZG9jdW1lbnQpLm9mZigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RXhwaXJhdGlvblRpbWUoKTogRGF0ZSB7XHJcbiAgICBjb25zdCBleHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBleHBpcmF0aW9uVGltZS5zZXRNaWxsaXNlY29uZHMoZXhwaXJhdGlvblRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgKyB0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMpO1xyXG5cclxuICAgIHJldHVybiBleHBpcmF0aW9uVGltZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUG9wdXAoKTogRGV2RXhwcmVzcy51aS5keFBvcHVwIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhQb3B1cCh7XHJcbiAgICAgIHRpdGxlOiAnU2Vzc2lvbiBFeHBpcmluZycsXHJcbiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICByZXNpemVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgc2hvd0Nsb3NlQnV0dG9uOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBtYXhIZWlnaHQ6IDE5MCxcclxuICAgICAgbWF4V2lkdGg6IDM3MCxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuJHRleHRDb250YWluZXIgPSAkKCc8c3BhbiAvPicpO1xyXG4gICAgICAgIHRoaXMuJHRleHRDb250YWluZXIuYXBwZW5kKHRoaXMuZ2V0Q291bnRlclRleHQoKSk7XHJcbiAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5hcHBlbmQodGhpcy4kdGV4dENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICB9LFxyXG4gICAgICB0b29sYmFySXRlbXM6IFt7XHJcbiAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgICAgICB0ZXh0OiAnQ29udGludWUgc2Vzc2lvbicsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5jb250aW51ZXJCdXR0b24gPSBlLmNvbXBvbmVudCxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2Vzc2lvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgIH0sIHtcclxuICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgIHRleHQ6ICdSZWxvYWQgcGFnZScsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5va0J1dHRvbiA9IGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICB0ZXh0OiAnTG9nIE91dCcsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5sb2dvdXRCdXR0b24gPSBlLmNvbXBvbmVudCxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dPdXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1dLFxyXG4gICAgfSkuYXBwZW5kVG8oJChkb2N1bWVudC5ib2R5KSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q291bnRlclRleHQoKTogSlF1ZXJ5IHtcclxuICAgIGNvbnN0IHJlbWFpbmVkU2Vjb25kcyA9IE1hdGgubWF4KHRoaXMuZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpLCAwKTtcclxuICAgIGlmIChyZW1haW5lZFNlY29uZHMgPT09IDApIHtcclxuICAgICAgcmV0dXJuICQoJzxzcGFuIC8+JykudGV4dCgnWW91ciBzZXNzaW9uIGhhcyBiZWVuIGV4cGlyZWQnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0ICRzdGFydFRleHQgPSAkKCc8c3BhbiAvPicpLnRleHQoJ1lvdXIgc2Vzc2lvbiB3aWxsIGV4cGlyZSBpbiAnKTtcclxuICAgICAgY29uc3QgJGNvdW50ZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdzZXNzaW9uLW5vdGlmaWVyX19jb3VudGVyJykudGV4dChyZW1haW5lZFNlY29uZHMudG9GaXhlZCgwKSk7XHJcbiAgICAgIGNvbnN0ICRmaW5pc2hUZXh0ID0gJCgnPHNwYW4gLz4nKS50ZXh0KCcgc2Vjb25kcycpO1xyXG5cclxuICAgICAgcmV0dXJuICQoJzxzcGFuIC8+JykuYXBwZW5kKCRzdGFydFRleHQsICRjb3VudGVyLCAkZmluaXNoVGV4dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlY29uZHNUb0V4cGlyYXRpb24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5leHBpcmF0aW9uVGltZS5nZXRUaW1lKCkgLSBuZXcgRGF0ZSgpLmdldFRpbWUoKSkgLyAxMDAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoU2Vzc2lvbigpIHtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuXHJcbiAgICBzZW5kUmVxdWVzdDxJUGluZ1Jlc3VsdD4odGhpcy5zZXNzaW9uUGluZ1VybCwgJ0dFVCcsIG51bGwsIGZhbHNlLCB7IG5vdGlmeUVycm9yOiBmYWxzZSB9KS50aGVuKChyZXMpID0+IHtcclxuICAgICAgaWYgKCFyZXMuaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwaW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUoKSB7XHJcbiAgICBpZiAoZG9jdW1lbnQuaGlkZGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzZW5kUmVxdWVzdDxJUGluZ1Jlc3VsdD4odGhpcy5zZXNzaW9uUGluZ1VybCwgJ0dFVCcsIG51bGwsIGZhbHNlLCB7IG5vdGlmeUVycm9yOiBmYWxzZSB9KS50aGVuKChyZXMpID0+IHtcclxuICAgICAgaWYgKCFyZXMuaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRFeHBpcmVkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRFeHBpcmVkKCkge1xyXG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oKTtcclxuICAgIGlmICh0aGlzLnBpbmdJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5waW5nSW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvZ091dCgpIHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5sb2dvdXRVcmw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBvcHVwQ29udGVudCgpIHtcclxuICAgIGNvbnN0IGlzQWxyZWFkeUV4cGlyZWQgPSB0aGlzLmdldFNlY29uZHNUb0V4cGlyYXRpb24oKSA8PSAwO1xyXG5cclxuICAgIHRoaXMuJHRleHRDb250YWluZXI/Lmh0bWwoJycpLmFwcGVuZCh0aGlzLmdldENvdW50ZXJUZXh0KCkpO1xyXG4gICAgdGhpcy5va0J1dHRvbi5vcHRpb24oJ3Zpc2libGUnLCBpc0FscmVhZHlFeHBpcmVkKTtcclxuICAgIHRoaXMuY29udGludWVyQnV0dG9uLm9wdGlvbigndmlzaWJsZScsICFpc0FscmVhZHlFeHBpcmVkKTtcclxuICAgIHRoaXMubG9nb3V0QnV0dG9uLm9wdGlvbigndmlzaWJsZScsICFpc0FscmVhZHlFeHBpcmVkKTtcclxuICB9XHJcbn1cclxuIiwgImNvbnN0IEdSSURfSU5ESUNBVE9SX1NUQVRFID0ge1xyXG4gIGVkaXQ6ICdlZGl0JyxcclxuICBzYXZpbmc6ICdzYXZpbmcnLFxyXG4gIHNhdmVkOiAnc2F2ZWQnXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHUklEX0lORElDQVRPUl9TVEFURTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkRGF0YUxheWVyIH0gZnJvbSAnLi4vLi4vRGF0YS9JbmRleCc7XHJcbmltcG9ydCB7IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlLCBJR3JpZFN0YXRlLCBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUsIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9JbmRleCc7XHJcblxyXG5pbnRlcmZhY2UgSUxvYWRlZENvbHVtbnMgeyBbZGF0YUZpZWxkOiBzdHJpbmddOiBib29sZWFuOyB9XHJcbmludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TZXR0aW5ncyB7IFtkYXRhRmllbGQ6IHN0cmluZ106IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlOyB9XHJcbmludGVyZmFjZSBJQ29sdW1uV2lkdGhzIHsgW3Zpc2libGVJbmRleDogbnVtYmVyXTogbnVtYmVyIHwgc3RyaW5nOyB9XHJcblxyXG5pbnRlcmZhY2UgSUNvbHVtbkNhcHRpb24ge1xyXG4gIGRhdGFGaWVsZDogc3RyaW5nO1xyXG4gIGNhcHRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3JpZFN0YXRlTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHVibGljIE9VVERBVEVfQ09MVU1OU19GT1VORF9FVkVOVCA9ICdvdXRkYXRlZC1jb2x1bW5zLWZvdW5kLWV2ZW50JztcclxuICBwcml2YXRlIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRGF0YUxheWVyOiBJR3JpZERhdGFMYXllcjtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0ZUxvYWRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9hZGVkQ29sdW1uczogSUxvYWRlZENvbHVtbnMgPSB7fTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblNldHRpbmdzID0ge307XHJcblxyXG4gIHByaXZhdGUgbGFzdENvbHVtblNldHRpbmdzU3RyOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGdyaWRJZDogbnVtYmVyLCBncmlkRGF0YUxheWVyOiBJR3JpZERhdGFMYXllcikge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICB0aGlzLmlkID0gZ3JpZElkO1xyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyID0gZ3JpZERhdGFMYXllcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkKGNoZWNrT3V0ZGF0ZWRDb2x1bW5zOiBib29sZWFuLCBvdXRkYXRlZENvbHVtbnNDYWxsYmFjazogKGNvbHVtbnMpID0+IHZvaWQpOiBKUXVlcnlQcm9taXNlPElHcmlkU3RhdGU+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWREYXRhTGF5ZXIuZ2V0R3JpZFZpZXdTZXR0aW5ncyh0aGlzLmlkKVxyXG4gICAgICAudGhlbigoZGF0YTogSUdyaWRTdGF0ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMub25EYXRhTG9hZGVkKGRhdGEpO1xyXG5cclxuICAgICAgICBpZiAoY2hlY2tPdXRkYXRlZENvbHVtbnMpIHtcclxuICAgICAgICAgIHRoaXMuY2hlY2tDb2x1bW5zUmVsZXZhbmNlKGRhdGEuY29sdW1ucywgb3V0ZGF0ZWRDb2x1bW5zQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoc3RhdGU6IElHcmlkU3RhdGUsIHNhdmluZ0NhbGxiYWNrPzogKCkgPT4gdm9pZCwgc2F2ZWRDYWxsYmFjaz86ICgpID0+IHZvaWQpOiBJQ29sdW1uV2lkdGhzIHtcclxuICAgIGNvbnN0IGNvbHVtbldpZHRoczogSUNvbHVtbldpZHRocyA9IHt9O1xyXG5cclxuICAgIGlmICghc3RhdGUuY29sdW1ucykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGUuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgY29uc3QgYWRkU2V0dGluZ3MgPSB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbY29sdW1uLmRhdGFGaWVsZF07XHJcblxyXG4gICAgICBpZiAoYWRkU2V0dGluZ3MpIHtcclxuICAgICAgICBjb2x1bW4uY2FwdGlvbiA9IGFkZFNldHRpbmdzLmNhcHRpb247XHJcbiAgICAgICAgY29sdW1uLnRvb2x0aXAgPSBhZGRTZXR0aW5ncy50b29sdGlwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL05PVEU6IGlmIERCIHRhYmxlIGhhcyBubyBkYXRhIGluIGEgY29sdW1uLCBkYXRhIGdyaWQgY2FuJ3QgaW5mZXIgZGF0YSB0eXBlIGFuZCBkb2Vzbid0IHNldCB0aGUgZGF0YVR5cGUgZmllbGRcclxuICAgICAgaWYgKCFjb2x1bW4uZGF0YVR5cGUpIHtcclxuICAgICAgICBjb2x1bW4uZGF0YVR5cGUgPSBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLkRlZmF1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghIWNvbHVtbi53aWR0aCAmJiBjb2x1bW4udmlzaWJsZSkge1xyXG4gICAgICAgIGNvbHVtbldpZHRoc1tjb2x1bW4udmlzaWJsZUluZGV4XSA9IGNvbHVtbi53aWR0aDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29sdW1uU2V0dGluZ3NTdHIgPSBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb2x1bW5zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuc3RhdGVMb2FkZWQgfHwgY29sdW1uU2V0dGluZ3NTdHIgPT09IHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyID0gY29sdW1uU2V0dGluZ3NTdHI7XHJcblxyXG4gICAgaWYgKHNhdmluZ0NhbGxiYWNrKSB7XHJcbiAgICAgIHNhdmluZ0NhbGxiYWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyLnVwZGF0ZUdyaWRWaWV3U2V0dGluZ3ModGhpcy5pZCwgc3RhdGUpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICBpZiAoc2F2ZWRDYWxsYmFjaykge1xyXG4gICAgICAgICAgc2F2ZWRDYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbldpZHRocztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja05ld0NvbHVtbnMoc3RhdGU6IElHcmlkU3RhdGUpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBuZXdDb2x1bW5GaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgaWYgKHN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgY29uc3QgbmV3Q29sdW1ucyA9IHN0YXRlLmNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+ICF0aGlzLmxvYWRlZENvbHVtbnNbY29sdW1uLmRhdGFGaWVsZF0gJiYgY29sdW1uLnZpc2libGUpO1xyXG5cclxuICAgICAgaWYgKG5ld0NvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgbmV3Q29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgIG5ld0NvbHVtbkZpZWxkcy5wdXNoKGNvbHVtbi5kYXRhRmllbGQpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zW2NvbHVtbi5kYXRhRmllbGRdID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXdDb2x1bW5GaWVsZHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q29sdW1uQ2FwdGlvbnMoKTogSUNvbHVtbkNhcHRpb25bXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzKS5tYXAoKGRhdGFGaWVsZCkgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGFGaWVsZCxcclxuICAgICAgICBjYXB0aW9uOiB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXS5jYXB0aW9uXHJcbiAgICAgIH0gYXMgSUNvbHVtbkNhcHRpb247XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDb2x1bW5DYXB0aW9uKGRhdGFGaWVsZDogc3RyaW5nLCBjYXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0pIHtcclxuICAgICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0gPSB7IGNhcHRpb246ICcnLCB0b29sdGlwOiAnJyB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdLmNhcHRpb24gPSBjYXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENvbHVtbkFkZGl0aW9uYWxTZXR0aW5ncyhkYXRhRmllbGQ6IHN0cmluZyk6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlIHtcclxuICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja0NvbHVtbnNSZWxldmFuY2UoY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW10sIGNhbGxiYWNrOiAob3V0ZGF0ZWRDb2x1bW5zOiBzdHJpbmdbXSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyLmdldENvbHVtbnNCeVJlcG9ydElkKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsQ29sdW1ucyA9IHt9O1xyXG5cclxuICAgICAgICBkYXRhLmZvckVhY2goKGMpID0+IGFjdHVhbENvbHVtbnNbYy5OYW1lXSA9IHRydWUpO1xyXG5cclxuICAgICAgICBjb25zdCBvdXRkYXRlZENvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gIWFjdHVhbENvbHVtbnNbYy5kYXRhRmllbGRdKS5tYXAoKGMpID0+IGMuZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgaWYgKG91dGRhdGVkQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oYEdyaWQgc2V0dGluZ3MgY29udGFpbiBzb21lIGNvbHVubXMgd2hpY2ggZG9uJ3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFueW1vcmU6XHJcblxyXG4gICAgICAgICAgJyR7b3V0ZGF0ZWRDb2x1bW5zLmpvaW4oJywgJyl9Jy5cclxuXHJcbiAgICAgICAgICBEbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlc2UgY29sdW1ucyBmcm9tIGdyaWQgc2V0dGluZ3M/XHJcbiAgICAgICAgICBgLCAnUmVtb3ZlIHJlZHVuZGFudCBjb2x1bW5zPycpXHJcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXJlcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY2FsbGJhY2sob3V0ZGF0ZWRDb2x1bW5zKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldFNldHRpbmdzKCk6IEpRdWVyeVByb21pc2U8SUdyaWRTdGF0ZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFMYXllci5yZXNldFNldHRpbmdzKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbkRhdGFMb2FkZWQoZGF0YSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EYXRhTG9hZGVkKGRhdGE6IElHcmlkU3RhdGUpIHtcclxuICAgIGNvbnN0IGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMgPSBkYXRhICYmIGRhdGEuY29sdW1ucztcclxuICAgIGxldCB2aXNpYmxlSW5kZXhDb3VudGVyID0gMDtcclxuXHJcbiAgICB0aGlzLnN0YXRlTG9hZGVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAobG9hZGVkR3JpZFN0YXRlQ29sdW1ucykge1xyXG4gICAgICB0aGlzLmxvYWRlZENvbHVtbnMgPSB7fTtcclxuXHJcbiAgICAgIGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zW2NvbHVtbi5kYXRhRmllbGRdID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogc2V0IHZpc2libGUgaW5kZXhlcyBpZiB0aGV5IGhhdmUgbm90IGJlZW4gc2V0LiBJdCdzIHJlcXVpcmVkIGZvciBwcm9wZXIgZHhEYXRhR3JpZCBhcHBlYXJhbmNlLlxyXG4gICAgICAgIGlmIChjb2x1bW4udmlzaWJsZSAmJiBjb2x1bW4udmlzaWJsZUluZGV4ID09PSBudWxsKSB7XHJcbiAgICAgICAgICBjb2x1bW4udmlzaWJsZUluZGV4ID0gdmlzaWJsZUluZGV4Q291bnRlcisrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTk9URTogcmVtb3ZlIGVtcHR5IHZhbHVlcyBiZWNhdXNlIHRoZXkgbGVhZCB0byB3cm9uZyBkeERhdGFHcmlkIGJlaGF2aW9yXHJcbiAgICAgICAgT2JqZWN0LmtleXMoY29sdW1uKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgIGlmIChjb2x1bW5ba2V5XSA9PT0gbnVsbCB8fCBjb2x1bW5ba2V5XSA9PT0gdm9pZCAwIHx8IGNvbHVtbltrZXldID09PSAnJykge1xyXG4gICAgICAgICAgICBkZWxldGUgY29sdW1uW2tleV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxTZXR0aW5ncyA9IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXTtcclxuXHJcbiAgICAgICAgaWYgKCFhZGRpdGlvbmFsU2V0dGluZ3MpIHtcclxuICAgICAgICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHtcclxuICAgICAgICAgICAgY2FwdGlvbjogY29sdW1uLmNhcHRpb24sXHJcbiAgICAgICAgICAgIHRvb2x0aXA6IGNvbHVtbi50b29sdGlwXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MuY2FwdGlvbiA9IGNvbHVtbi5jYXB0aW9uO1xyXG4gICAgICAgICAgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAgPSBjb2x1bW4udG9vbHRpcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5PVEU6IHJlbW92ZSBjb2x1bW5zIHdoaWNoIGR4RGF0YUdyaWQgZG9lc24ndCBleHBlY3QuXHJcbiAgICAgICAgZGVsZXRlIGNvbHVtbi5jYXB0aW9uO1xyXG4gICAgICAgIGRlbGV0ZSBjb2x1bW4udG9vbHRpcDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIgPSBKU09OLnN0cmluZ2lmeShkYXRhLmNvbHVtbnMpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZW51bSBHcmlkTW9kZSB7XHJcbiAgVmlldyA9IDEsXHJcbiAgRWRpdCA9IDJcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgR3JpZE1vZGU7XHJcbiIsICJcdUZFRkZpbXBvcnQgR3JpZE1vZGUgZnJvbSAnLi4vUGFnZXMvR3JpZC9Nb2RlJztcclxuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcyB9IGZyb20gJy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgSUNvbHVtbk1ldGFEYXRhIH0gZnJvbSAnLi4vQ29sdW1uTWV0YURhdGEnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4uLy4uL0RhdGEvRXhjZXB0aW9uVHlwZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGF0YUxheWVyIHtcclxuICBnZXRDb2x1bW5zQnlSZXBvcnRJZChyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUNvbHVtbk1ldGFEYXRhW10+O1xyXG4gIGdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcywgZ3JpZE1vZGU6IEdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdDogYm9vbGVhbik6IERldkV4cHJlc3MuZGF0YS5DdXN0b21TdG9yZTxhbnksIGFueT47XHJcbiAgcmVzZXRTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUdyaWRTdGF0ZT47XHJcbiAgdXBkYXRlR3JpZFZpZXdTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyLCBzdGF0ZTogSUdyaWRTdGF0ZSk6IEpRdWVyeURlZmVycmVkPGFueT47XHJcbiAgZ2V0R3JpZFZpZXdTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUdyaWRTdGF0ZT47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVHcmlkRGF0YUxheWVyOiAoZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZykgPT4gSUdyaWREYXRhTGF5ZXIgPSAoZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHVybHMgPSB7XHJcbiAgICBncmlkUmVzdWx0OiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR3JpZFZpZXdSZXN1bHRgLFxyXG4gICAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQ6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXREYlRhYmxlRmllbGRzYCxcclxuICAgIHJlc2V0R3JpZFNldHRpbmdzOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vUmVzZXRHcmlkVmlld1NldHRpbmdzYCxcclxuICAgIHVwZGF0ZUdyaWRWaWV3U2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9VcGRhdGVHcmlkVmlld1NldHRpbmdzYCxcclxuICAgIGdldEdyaWRWaWV3U2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHcmlkVmlld1NldHRpbmdzYFxyXG4gIH07XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXMsIGdyaWRNb2RlOiBHcmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXQpIHtcclxuICAgICAgcmV0dXJuIGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgbG9hZFBhcmFtczoge1xyXG4gICAgICAgICAgaWQ6IHJlcG9ydFBhcmFtcy5SZXBvcnRJZCxcclxuICAgICAgICAgIGFwcE5hbWU6IHJlcG9ydFBhcmFtcy5BcHBOYW1lLFxyXG4gICAgICAgICAgZ3JpZE1vZGUsXHJcbiAgICAgICAgICByb3dzTGltaXQ6IGdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0ICYmICFzaG93QWxsRGF0YUluRWRpdCA/IDE1IDogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbG9hZFVybDogdXJscy5ncmlkUmVzdWx0LFxyXG4gICAgICAgIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZVxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQ6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLmdldENvbHVtbnNCeVJlcG9ydElkLCAncG9zdCcsIHsgaWQ6IHJlcG9ydElkIH0sIGZhbHNlLCB7XHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgcmVzZXRTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMucmVzZXRHcmlkU2V0dGluZ3MsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHsgZGF0YVR5cGU6ICdqc29uJyB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgdXBkYXRlR3JpZFZpZXdTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIsIHN0YXRlOiBJR3JpZFN0YXRlKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLnVwZGF0ZUdyaWRWaWV3U2V0dGluZ3MsICdwb3N0Jywge1xyXG4gICAgICAgIGlkOiByZXBvcnRJZCwgY29sdW1uc1NldHRpbmdzOiBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb2x1bW5zKVxyXG4gICAgICB9LCBmYWxzZSwge1xyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEdyaWRWaWV3U2V0dGluZ3M6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLmdldEdyaWRWaWV3U2V0dGluZ3MsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcbn07XHJcblxyXG5jb25zdCBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSk6IHN0cmluZyA9PiB7XHJcbiAgc3dpdGNoIChleGNlcHRpb25UeXBlKSB7XHJcbiAgICBjYXNlIEV4Y2VwdGlvblR5cGUuU3FsRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1dlIGF0dGVtcHRlZCB0byBleGVjdXRlIHRoZSBkYXRhIHF1ZXJ5IGhvd2V2ZXIgaXQgYXBwZWFycyB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgZGF0YSBzb3VyY2UuIFBsZWFzZSBjb250YWN0IHRoZSByZXBvcnQgYXV0aG9yIHRvIGNvbmZpcm0gdGhlIGRhdGEgcmVxdWlyZW1lbnRzLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlZnJlc2hPcHRpb25zIHtcclxuICBjYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICBlbGFwc2VkQ2FsbGJhY2s6ICh0aW1lOiBudW1iZXIpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmNvbnN0IHVwZGF0ZVRpbWVvdXQgPSAxMDA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWZyZXNoVGltZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbGFwc2VkQ2FsbGJhY2s6ICh0aW1lOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSBhY3RpdmVUaW1lcklkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgY3VycmVudEludGVydmFsOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgbGFzdFN0YXRlQ2hlY2tlZDogRGF0ZTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVJlZnJlc2hPcHRpb25zKSB7XHJcbiAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayA9IG9wdGlvbnMuZWxhcHNlZENhbGxiYWNrO1xyXG4gICAgdGhpcy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnQoaW50ZXJ2YWw6IG51bWJlcikge1xyXG4gICAgaWYgKGludGVydmFsIDw9IDApIHtcclxuICAgICAgdGhpcy5jYWxsYmFjaygpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGFzdFN0YXRlQ2hlY2tlZCA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRJbnRlcnZhbCA9IGludGVydmFsO1xyXG5cclxuICAgIGNvbnN0IHRpbWVySWQgPSB0aGlzLmFjdGl2ZVRpbWVySWQgPSBNYXRoLnJhbmRvbSgpO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEludGVydmFsIDwgMCkge1xyXG4gICAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayh0aGlzLmN1cnJlbnRJbnRlcnZhbCk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50aWNrVGltZXJGdW5jdGlvbih0aW1lcklkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmlnZ2VyQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuY2FsbGJhY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgLy9DaGFuZ2UgdGltZXJJZCBmb3IgYnJlYWtpbmcgcmVmcmVzaCBwcm9jZXNzIGluIG5leHQgc2V0VGltZW91dCBjYWxsLiBka2xpbWFub3ZcclxuICAgIHRoaXMuYWN0aXZlVGltZXJJZC0tO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0aWNrVGltZXJGdW5jdGlvbih0aW1lcklkOiBudW1iZXIpIHtcclxuICAgIGlmICh0aW1lcklkICE9PSB0aGlzLmFjdGl2ZVRpbWVySWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIGxldCB0aW1lVG9VcGRhdGU6IG51bWJlciA9IHRoaXMuY3VycmVudEludGVydmFsIC0gKG5ldyBEYXRlKCkgLSB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQpO1xyXG4gICAgaWYgKHRpbWVUb1VwZGF0ZSA8PSAwKSB7XHJcbiAgICAgIHRpbWVUb1VwZGF0ZSA9IHRoaXMuY3VycmVudEludGVydmFsICsgOTk5O1xyXG4gICAgICB0aGlzLmNhbGxiYWNrKCk7XHJcbiAgICAgIHRoaXMubGFzdFN0YXRlQ2hlY2tlZCA9IG5ldyBEYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGFwc2VkQ2FsbGJhY2sodGltZVRvVXBkYXRlKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGlja1RpbWVyRnVuY3Rpb24odGltZXJJZCksIHVwZGF0ZVRpbWVvdXQpO1xyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IFJlZnJlc2hDb21wb25lbnQgZnJvbSAnLi9JbmRleCc7XHJcblxyXG5jb25zdCBkZWZhdWx0UmVmcmVzaEVudHJpZXM6IElSZWZyZXNoRW50cnlbXSA9IFt7XHJcbiAgdGltZW91dDogMCxcclxuICB0ZXh0OiAncmVmcmVzaCBub3cnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJycsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAxNSAqIDEwMDAsXHJcbiAgdGV4dDogJzE1IHNlYycsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDMwICogMTAwMCxcclxuICB0ZXh0OiAnMzAgc2VjJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogNjAgKiAxMDAwLFxyXG4gIHRleHQ6ICcxIG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDE4MCAqIDEwMDAsXHJcbiAgdGV4dDogJzMgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogMzAwICogMTAwMCxcclxuICB0ZXh0OiAnNSBtaW4nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiA2MDAgKiAxMDAwLFxyXG4gIHRleHQ6ICcxMCBtaW4nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAtMSxcclxuICB0ZXh0OiAnb2ZmJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZTogb2ZmJyxcclxuICBpc0RlZmF1bHQ6IHRydWVcclxufV07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZWZyZXNoRW50cnkge1xyXG4gIHRpbWVvdXQ6IG51bWJlcixcclxuICB0ZXh0OiBzdHJpbmcsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiBzdHJpbmcsXHJcbiAgaXNEZWZhdWx0PzogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWZyZXNoQnV0dG9uIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRyb3BEb3duQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dE1lbnU6IERldkV4cHJlc3MudWkuZHhDb250ZXh0TWVudTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hDb21wb25lbnQ6IFJlZnJlc2hDb21wb25lbnQ7XHJcbiAgcHJpdmF0ZSBtZW51SXNPcGVuZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHNlbGVjdGVkRW50cnk6IElSZWZyZXNoRW50cnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCR0YXJnZXQ6IEpRdWVyeSwgY2FsbGJhY2s6ICgpID0+IHZvaWQsIHJlZnJlc2hFbnRyaWVzOiBJUmVmcmVzaEVudHJ5W10gfCBudWxsID0gZGVmYXVsdFJlZnJlc2hFbnRyaWVzKSB7XHJcbiAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQgPSBuZXcgUmVmcmVzaENvbXBvbmVudCh7IGNhbGxiYWNrLCBlbGFwc2VkQ2FsbGJhY2s6IChlKSA9PiB0aGlzLmVsYXBzZWRDYWxsYmFjayhlKSB9KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRFbnRyeSA9IHJlZnJlc2hFbnRyaWVzLmZpbmQoKGUpID0+IGUuaXNEZWZhdWx0KSB8fCByZWZyZXNoRW50cmllcy5maWx0ZXIoKGUpID0+ICEhZS50aW1lb3V0KVswXTtcclxuXHJcbiAgICB0aGlzLmNvbnRleHRNZW51ID0gJCgnPGRpdiAvPicpLmR4Q29udGV4dE1lbnUoe1xyXG4gICAgICBkYXRhU291cmNlOiByZWZyZXNoRW50cmllcyxcclxuICAgICAgdGFyZ2V0OiAkdGFyZ2V0LFxyXG4gICAgICBwb3NpdGlvbjogeyBteTogJ3JpZ2h0IHRvcCcsIGF0OiAncmlnaHQgYm90dG9tJyB9LFxyXG4gICAgICBvbkl0ZW1DbGljazogKGUpID0+IHtcclxuICAgICAgICBpZighKGUuaXRlbURhdGEgYXMgYW55KS50aW1lb3V0KSB7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEVudHJ5ID0gZS5pdGVtRGF0YSBhcyBJUmVmcmVzaEVudHJ5O1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuc2VsZWN0SXRlbSh0aGlzLnNlbGVjdGVkRW50cnkgYXMgYW55KTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaENvbXBvbmVudC5zdGFydCgoZS5pdGVtRGF0YSBhcyBhbnkpLnRpbWVvdXQpO1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25IaWRkZW46ICgpID0+IHtcclxuICAgICAgICB0aGlzLm1lbnVJc09wZW5lZCA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBvblNob3duOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubWVudUlzT3BlbmVkID0gdHJ1ZTtcclxuICAgICAgICAoZS5jb21wb25lbnQgYXMgYW55KS5pdGVtc0NvbnRhaW5lcigpWzBdLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXN6b2xlYS10aGVtZScpO1xyXG4gICAgICB9LFxyXG4gICAgICBpdGVtVGVtcGxhdGU6IChlbnRyeSkgPT4gZW50cnkudGV4dCxcclxuXHJcbiAgICAgIGNzc0NsYXNzOiAnaXN6b2xlYS10aGVtZSdcclxuICAgIH0pLmFwcGVuZFRvKCdib2R5JykuZHhDb250ZXh0TWVudSgnaW5zdGFuY2UnKTtcclxuICAgIHRoaXMuY29udGV4dE1lbnUuc2VsZWN0SXRlbSh0aGlzLnNlbGVjdGVkRW50cnkgYXMgYW55KTtcclxuXHJcbiAgICB0aGlzLmRyb3BEb3duQnV0dG9uID0gJHRhcmdldC5keEJ1dHRvbih7XHJcbiAgICAgIHRleHQ6IHRoaXMuc2VsZWN0ZWRFbnRyeS50ZXh0LFxyXG4gICAgICB0ZW1wbGF0ZTogKGJ1dHRvbkRhdGEsIGNvbnRlbnQpID0+IHtcclxuICAgICAgICAkKCc8aSAvPicpLmFkZENsYXNzKCdkeC1pY29uIGR4LWljb24tcmVmcmVzaCcpLmFwcGVuZFRvKGNvbnRlbnQpO1xyXG4gICAgICAgICQoJzxzcGFuPicpLmFkZENsYXNzKCdidXR0b24td2l0aC1leHBhbmQtdGV4dCcpLnRleHQoYnV0dG9uRGF0YS50ZXh0KS5hcHBlbmRUbyhjb250ZW50KTtcclxuICAgICAgICAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnYnV0dG9uLXdpdGgtZXhwYW5kLWljb24gaXNvei1pY29uLTE2IGlzb3otaWNvbi1hcnJvdy1kb3duLTE2JykuYXBwZW5kVG8oY29udGVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb250ZW50O1xyXG4gICAgICB9LFxyXG4gICAgICBlbGVtZW50QXR0cjoge1xyXG4gICAgICAgIGNsYXNzOiAnaXN6b2xlYS1tZCBidXR0b24td2l0aC1leHBhbmQnXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBvbkNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuZWxlbWVudCgpLndpZHRoKCR0YXJnZXQub3V0ZXJXaWR0aCgpKTtcclxuICAgICAgICBpZiAodGhpcy5tZW51SXNPcGVuZWQpIHtcclxuICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuaGlkZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG5cclxuICAgICh0aGlzLnNlbGVjdGVkRW50cnkudGltZW91dCA+IDApICYmIHRoaXMucmVmcmVzaENvbXBvbmVudC5zdGFydCh0aGlzLnNlbGVjdGVkRW50cnkudGltZW91dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVmcmVzaENvbXBvbmVudC50cmlnZ2VyQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVsYXBzZWRDYWxsYmFjayh0aW1lVG9VcGRhdGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5kcm9wRG93bkJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLnNlbGVjdGVkRW50cnkucmVmcmVzaFRlbXBsYXRlLnJlcGxhY2UoJyUnLCBNYXRoLmZsb29yKHRpbWVUb1VwZGF0ZSAvIDEwMDApLnRvU3RyaW5nKCkpKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBncmlkQ29sdW1uVHlwZXMgZnJvbSAnLi4vLi4vQnVzaW5lc3MvR3JpZENvbHVtblR5cGVzJztcclxuaW1wb3J0IHtpbml0UG9wb3Zlcn0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7SUdyaWRSZXBvcnRQYXJhbXMsIElSZXBvcnRQYXJhbXN9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgR1JJRF9JTkRJQ0FUT1JfU1RBVEUgZnJvbSAnLi9HcmlkSW5kaWNhdG9yU3RhdGUnO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IEdyaWRTdGF0ZU1hbmFnZXIgZnJvbSAnLi9HcmlkU3RhdGVNYW5hZ2VyJztcclxuaW1wb3J0IEdyaWRNb2RlIGZyb20gJy4vTW9kZSc7XHJcbmltcG9ydCB7Y3JlYXRlR3JpZERhdGFMYXllciwgSUdyaWREYXRhTGF5ZXJ9IGZyb20gJy4uLy4uL0RhdGEvSW5kZXgnO1xyXG5pbXBvcnQge0dyaWREYXRhQ29sdW1uRGF0YVR5cGUsIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlLCBJR3JpZFN0YXRlfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xyXG5cclxuY29uc3QgUkVTRVRfU0FWRURfSU5ESUNBVE9SX1RJTUVPVVQgPSAzMDAwO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZE9wdGlvbnMge1xyXG4gIGdyaWRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSUdyaWRSZXBvcnRQYXJhbXM7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcbiAgZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBzaG93SGVhZGVyPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3JpZCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZXBvcnRQYXJhbXM6IElHcmlkUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dIZWFkZXI6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG5cclxuICBwcml2YXRlIGN1cnJlbnRHcmlkTW9kZTogR3JpZE1vZGUgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHNob3dBbGxEYXRhSW5FZGl0ID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsb2FkaW5nVGltZW91dCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdyaWRTdGF0ZU1hbmFnZXI6IEdyaWRTdGF0ZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRncmlkU3RhdGVJbmRpY2F0b3I6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJGdyaWRFcnJvclBsYWNlaG9sZGVyOiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRncmlkVGFyZ2V0RWxlbWVudDogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudDogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGRhdGFMYXllcjogSUdyaWREYXRhTGF5ZXI7XHJcbiAgcHJpdmF0ZSBlZGl0V2lkdGhFZGl0Qm94ZXM6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94W10gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkUmVwYWludFF1ZXVlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgY29sdW1uTmFtZXNVcGRhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkT3B0aW9ucykge1xyXG4gICAgdGhpcy5ncmlkUG9zaXRpb25NYXJrZXIgPSBvcHRpb25zLmdyaWRQb3NpdGlvbk1hcmtlcjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uID0gb3B0aW9ucy5hZGRSZWZyZXNoQnV0dG9uO1xyXG4gICAgdGhpcy5ncmlkUmVwb3J0Q29udHJvbGxlclVybCA9IG9wdGlvbnMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw7XHJcbiAgICB0aGlzLnNob3dIZWFkZXIgPSBvcHRpb25zLnNob3dIZWFkZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jdXJyZW50R3JpZE1vZGUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50R3JpZE1vZGUgPSBHcmlkTW9kZS5WaWV3O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5pdEludGVybmFsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZD8ucmVmcmVzaCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuZ3JpZCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50R3JpZE1vZGUgPSBudWxsO1xyXG4gICAgdGhpcy4kcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcblxyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0SW50ZXJuYWwoKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHRoaXMuZGF0YUxheWVyID0gY3JlYXRlR3JpZERhdGFMYXllcih0aGlzLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsKTtcclxuXHJcbiAgICBpZiAodGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQgPSAkKCc8ZGl2IC8+JykuaW5zZXJ0QWZ0ZXIodGhpcy5ncmlkUG9zaXRpb25NYXJrZXIpO1xyXG5cclxuICAgIHRoaXMuZ3JpZFN0YXRlTWFuYWdlciA9IG5ldyBHcmlkU3RhdGVNYW5hZ2VyKHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLCB0aGlzLmRhdGFMYXllcik7XHJcblxyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIgPSAkKCc8ZGl2IC8+JykudGV4dCgnRGF0YSBsb2FkaW5nIGZhaWxlZC4nKS5hZGRDbGFzcygnZHgtZGF0YWdyaWQtbm9kYXRhJykuY3NzKHsgekluZGV4OiAxIH0pO1xyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuYXBwZW5kVG8odGhpcy5ncmlkUG9zaXRpb25NYXJrZXIpO1xyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuaGlkZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIC8vIFRPRE86IGVsZW1lbnQgc2VsZWN0b3IgYXMgYSBwYXJhbVxyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlcyA9IFtdO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpLFxyXG4gICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgPyAnZWRpdC1tb2RlJyA6ICd2aWV3LW1vZGUnIH0sXHJcbiAgICAgIHJlcGFpbnRDaGFuZ2VzT25seTogdHJ1ZSxcclxuICAgICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3ICYmIHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgICAgICBjb25zdCBzZWFyY2hQYW5lbCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnc2VhcmNoUGFuZWwnKVswXTtcclxuICAgICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsSW5kZXggPSBpdGVtcy5pbmRleE9mKHNlYXJjaFBhbmVsKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzd2l0Y2hUb0VkaXRCdG4gPSB7XHJcbiAgICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnU3dpdGNoIHRvIEVkaXQgTW9kZScsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zd2l0Y2hUb01vZGUoR3JpZE1vZGUuRWRpdCksXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3N3aXRjaC10by1lZGl0LW1vZGUnLFxyXG4gICAgICAgICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ31cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKHNlYXJjaFBhbmVsSW5kZXgsIDEpO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChzd2l0Y2hUb0VkaXRCdG4pO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChzZWFyY2hQYW5lbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbkNob29zZXJCdG4gPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ2NvbHVtbkNob29zZXJCdXR0b24nKVswXTtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbnRDaG9vc2VyQnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKGNvbHVtbkNob29zZXJCdG4pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHNob3dEYXRhSXRlbSA9IHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCAjZTBlMGUwIHNvbGlkJyxcclxuICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzNweCA2cHgnLFxyXG4gICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxyXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnd2hpdGUnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxzcGFuIC8+JylcclxuICAgICAgICAgICAgICAgIC5jc3MoeyBtYXJnaW46ICcwIDVweCAwIDAnLCB3aWR0aDogJzU0cHgnIH0pXHJcbiAgICAgICAgICAgICAgICAuZHhTd2l0Y2goe1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5zaG93QWxsRGF0YUluRWRpdCxcclxuICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBbGxEYXRhSW5FZGl0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAkKCc8c3BhbiAvPicpLnRleHQoJ1Nob3cgYWxsIGRhdGEgJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0ICRoaW50VGFyZ2V0ID0gJCgnPGEgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7IHRleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJywgY29sb3I6ICdibHVlJyB9KVxyXG4gICAgICAgICAgICAgICAgLnRleHQoJyg/KScpXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLnRleHQoYElmIHRoZSB0YWJsZSBjb250YWlucyBhIGxvdCBvZiBjb2x1bW5zIHNob3dpbmcgYWxsIGRhdGEgY2FuIGxlYWQgdG8gc2xvdyBwYWdlIHBlcmZvcm1hbmNlIHdoZW4geW91J3JlIGVkaXRpbmcgdGhlIGdyaWQuXHJcbkJ5IGRlZmF1bHQgZ3JpZCBzaG93cyBvbmx5IGZpcnN0IDEwIHJvd3MgaW4gdGhlIEVkaXQgbW9kZS5gKVxyXG4gICAgICAgICAgICAgICAgLmR4UG9wb3Zlcih7XHJcbiAgICAgICAgICAgICAgICAgIHRhcmdldDogJGhpbnRUYXJnZXQsXHJcbiAgICAgICAgICAgICAgICAgIHNob3dFdmVudDogJ21vdXNlZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICBoaWRlRXZlbnQ6ICdtb3VzZWxlYXZlJyxcclxuICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICB3aWR0aDogNTAwXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgY29uc3Qgc3dpdGNoVG9WaWV3QnRuID0ge1xyXG4gICAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1N3aXRjaCB0byBWaWV3IE1vZGUnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMuc3dpdGNoVG9Nb2RlKEdyaWRNb2RlLlZpZXcpLFxyXG4gICAgICAgICAgICAgIGljb246ICdzd2l0Y2gtdG8tdmlldy1tb2RlJyxcclxuICAgICAgICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9XHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShjb2x1bW50Q2hvb3NlckJ0bkluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBleHBvcnRCdG4gPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ2V4cG9ydEJ1dHRvbicpWzBdO1xyXG4gICAgICAgICAgY29uc3QgZXhwb3J0QnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKGV4cG9ydEJ0bik7XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGV4cG9ydEJ0bkluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHNob3dEYXRhSXRlbSk7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHN3aXRjaFRvVmlld0J0bik7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKGNvbHVtbkNob29zZXJCdG4pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGVkaXRTdGF0dXMgPSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZWRpdC1ncmlkLXN0YXRlJyk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLmVkaXQpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBpdGVtcy51bnNoaWZ0KGVkaXRTdGF0dXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWRkUmVmcmVzaEJ1dHRvbikge1xyXG4gICAgICAgICAgY29uc3QgcmVmcmVzaEJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAncmVmcmVzaCcpWzBdO1xyXG4gICAgICAgICAgY29uc3QgcmVmcmVzaEJ0bkluZGV4ID0gaXRlbXMuaW5kZXhPZihyZWZyZXNoQnRuKTtcclxuXHJcbiAgICAgICAgICBpdGVtc1tyZWZyZXNoQnRuSW5kZXhdID0ge1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVmcmVzaEJ1dHRvbiA9IG5ldyBSZWZyZXNoQnV0dG9uKCRjb250YWluZXIsICgpID0+IHRoaXMucmVmcmVzaCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25DZWxsUHJlcGFyZWQ6ICh7IHJvd1R5cGUsIGNvbHVtbiwgY2VsbEVsZW1lbnQgfSkgPT4ge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgaWYgKHJvd1R5cGUgPT09ICdoZWFkZXInICYmICFjb2x1bW4uY29tbWFuZCkge1xyXG4gICAgICAgICAgY29uc3QgZGF0YUZpZWxkID0gY29sdW1uLmRhdGFGaWVsZDtcclxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxTZXR0aW5ncyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5nZXRDb2x1bW5BZGRpdGlvbmFsU2V0dGluZ3MoZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmluaXRHcmlkSGVhZGVyQ2VsbChjZWxsRWxlbWVudCwgYWRkaXRpb25hbFNldHRpbmdzKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0R3JpZEhlYWRlckNlbGxFZGl0UGFuZWwoY29sdW1uLCBjZWxsRWxlbWVudCwgYWRkaXRpb25hbFNldHRpbmdzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBjdXJyZW50R3JpZCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZTogSUdyaWRTdGF0ZSA9IGN1cnJlbnRHcmlkLnN0YXRlKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtaW5nKGN1cnJlbnRTdGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIE5PVEU6IGNvbHVtbiBuYW1lIHVwZGF0aW5nIHRyaWdnZXJzIG9uQ29udGVudFJlYWR5IGV2ZW50IHJhaXNpbmcgYWdhaW4uXHJcbiAgICAgICAgICAvLyBXZSBuZWVkIG5vdCB0byBleGV1Y3V0ZSB0aGUgc2FtZSBvbmUgbW9yZSB0aW1lLlxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gY3VycmVudEdyaWQuZW5kQ3VzdG9tTG9hZGluZygpKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlICE9PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXdDb2x1bW5zID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmNoZWNrTmV3Q29sdW1ucyhjdXJyZW50U3RhdGUpO1xyXG5cclxuICAgICAgICBuZXdDb2x1bW5zLmZvckVhY2goKGNvbHVtbk5hbWUpID0+IGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihjb2x1bW5OYW1lLCAndmlzaWJsZScsIGZhbHNlKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbHVtbkNhcHRpb25zID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmdldENvbHVtbkNhcHRpb25zKCk7XHJcblxyXG4gICAgICAgIGNvbHVtbkNhcHRpb25zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgIGlmIChjLmNhcHRpb24gJiYgY3VycmVudEdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FwdGlvbicpICE9PSBjLmNhcHRpb24pIHtcclxuICAgICAgICAgICAgY3VycmVudEdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FwdGlvbicsIGMuY2FwdGlvbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YXRlU3RvcmluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgY3VzdG9tTG9hZDogKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5sb2FkKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0LCAob3V0ZGF0ZWRDb2x1bW5zKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ncmlkLnN0YXRlKCk7XHJcblxyXG4gICAgICAgICAgICBzdGF0ZS5jb2x1bW5zID0gKHN0YXRlLmNvbHVtbnMgYXMgYW55W10pLmZpbHRlcigoY29sdW1uKSA9PiBvdXRkYXRlZENvbHVtbnMuaW5kZXhPZihjb2x1bW4uZGF0YUZpZWxkKSA8IDApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5ncmlkLnN0YXRlKHN0YXRlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY3VzdG9tU2F2ZTogKHN0YXRlKSA9PiB0aGlzLnNhdmVHcmlkU3RhdGUoc3RhdGUpXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcsIGFwcGx5RmlsdGVyOiAnb25DbGljaycgfSxcclxuICAgICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3IH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3IH0sXHJcbiAgICAgIGVycm9yUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgIHNvcnRpbmc6IHsgbW9kZTogJ211bHRpcGxlJyB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IHRydWUgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgYXV0b0V4cGFuZEFsbDogZmFsc2UgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCxcclxuICAgICAgY29sdW1uQ2hvb3NlcjogeyBlbmFibGVkOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCB9LFxyXG4gICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7ZW5hYmxlZDogZmFsc2V9LFxyXG5cclxuICAgICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogNTAsIGVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuXHJcbiAgICAgIHN1bW1hcnk6IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtbiA/IHtcclxuICAgICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgICAgY29sdW1uOiB0aGlzLnJlcG9ydFBhcmFtcy5Ub3RhbFN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICAgIH1dXHJcbiAgICAgIH0gOiB1bmRlZmluZWQsXHJcblxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZyhlKSB7XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSA9PT0gJ2ZpbHRlclJvdycpIHtcclxuICAgICAgICAgIGNvbnN0IGFwcGx5ID0gKCkgPT4gZS5lbGVtZW50LmZpbmQoJy5keC1hcHBseS1idXR0b24nKS50cmlnZ2VyKCdkeGNsaWNrJyk7XHJcblxyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRW50ZXJLZXkgPSBhcHBseTtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgPT09ICdzZWFyY2hQYW5lbCcpIHtcclxuICAgICAgICAgIGNvbnN0IGFwcGx5U2VhcmNoOiBEZXZFeHByZXNzLnVpLmR4VGV4dEVkaXRvci5Qcm9wZXJ0aWVzWydvbkVudGVyS2V5J10gPSAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBlLmNvbXBvbmVudC5zZWFyY2hCeVRleHQoYXJncy5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpKTtcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRW50ZXJLZXkgPSBhcHBseVNlYXJjaDtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHlTZWFyY2g7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ3JpZCA9IGRlZmF1bHRHcmlkKHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50LCB7XHJcbiAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICBleHBvcnRGaWxlTmFtZTogdGhpcy5yZXBvcnRQYXJhbXMuTmFtZSxcclxuICAgICAgdGl0bGU6IHRoaXMuc2hvd0hlYWRlciA/IHRoaXMucmVwb3J0UGFyYW1zLk5hbWUgOiBudWxsLFxyXG4gICAgICBoZWFkZXJEZXNjcmlwdGlvbjogdGhpcy5zaG93SGVhZGVyID8gdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyA6IG51bGxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ/LnJlbW92ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICB0aGlzLiRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50ID0gJCgnPHNwYW4gLz4nKVxyXG4gICAgICAgIC5jc3Moe1xyXG4gICAgICAgICAgZmxvYXQ6ICdyaWdodCcsXHJcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcclxuICAgICAgICAgIGJvdHRvbTogJzhweCdcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5hZGRDbGFzcygnaXN6b2xlYS1tZCcpXHJcbiAgICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICAgIHRleHQ6ICdSZXNldCBzZXR0aW5ncycsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnJlc2V0U2V0dGluZ3MoKSxcclxuICAgICAgICAgIGljb246ICdyZXNldC1ncmlkLXNldHRpbmdzJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmFwcGVuZFRvKCdmb290ZXInKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5ncmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3Ioc3RhdGU6IHN0cmluZykge1xyXG4gICAgT2JqZWN0LmtleXMoR1JJRF9JTkRJQ0FUT1JfU1RBVEUpLmZvckVhY2goKHMpID0+IHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5yZW1vdmVDbGFzcyhHUklEX0lORElDQVRPUl9TVEFURVtzXSkpO1xyXG5cclxuICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5hZGRDbGFzcyhzdGF0ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZCkge1xyXG4gICAgICB0aGlzLmdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdCk7XHJcbiAgICAgIH0sIFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGl0bGUgPSAnJztcclxuXHJcbiAgICBzd2l0Y2ggKHN0YXRlKSB7XHJcbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdDpcclxuICAgICAgICB0aXRsZSA9ICdFZGl0IG1vZGUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZDpcclxuICAgICAgICB0aXRsZSA9ICdTYXZlZCc7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmluZzpcclxuICAgICAgICB0aXRsZSA9ICdTYXZpbmcnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5hdHRyKCd0aXRsZScsIHRpdGxlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uTmFtaW5nKHN0YXRlOiBJR3JpZFN0YXRlKSB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcclxuICAgIC8vIEhBQ0s6IERldkV4dHJlbWUgZ3JpZCBkb2Vzbid0IHNob3cgY29sdW1ucyBkYXRhIGlmIGEgZGF0YUZpZWxkIGhhcyBzcGVjaWFsIHN5bWJvbHMuXHJcbiAgICAvLyBTZWUgaHR0cHM6Ly93d3cuZGV2ZXhwcmVzcy5jb20vU3VwcG9ydC9DZW50ZXIvUXVlc3Rpb24vRGV0YWlscy9UNjIxODM4L2R4ZGF0YWdyaWQtYS1jb2x1bW4taXMtZW1wdHktaWYtZGF0YWZpZWxkLWNvbnRhaW5zLXNwZWNpYWwtY2hhcmFjdGVyc1xyXG4gICAgLy8gdHNsaW50OmVuYWJsZTptYXgtbGluZS1sZW5ndGhcclxuICAgIGlmIChzdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIHN0YXRlLmNvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgIGlmICgvW15hLXpBLVowLTlfXS8udGVzdChjLmRhdGFGaWVsZCkpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYWxjdWxhdGVDZWxsVmFsdWUnLCAocm93RGF0YSkgPT4gcm93RGF0YVtjLmRhdGFGaWVsZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZShyZXBvcnRQYXJhbXNEYXRhU291cmNlOiBJUmVwb3J0UGFyYW1zLCBncmlkTW9kZTogR3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0RGF0YVNvdXJjZTogYm9vbGVhbikge1xyXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmRhdGFMYXllci5nZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXNEYXRhU291cmNlLCBncmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXREYXRhU291cmNlKTtcclxuICAgIGNvbnN0IGRzID0gbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgc3RvcmUsXHJcbiAgICAgIG9uQ2hhbmdlZDogZ3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgPyB2b2lkIDAgOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgb25Mb2FkRXJyb3I6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFkcy5pc0xvYWRlZCgpKSB7XHJcbiAgICAgICAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5zaG93KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkxvYWRpbmdDaGFuZ2VkOiAoaXNMb2FkaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICAgICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1BsZWFzZSB3YWl0LCBkYXRhIGxvYWRpbmcgaW4gcHJvZ3Jlc3MuJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIDEwMDAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRoaXMubG9hZGluZ1RpbWVvdXQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1RpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdUaW1lb3V0ID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZ3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0U2V0dGluZ3MoKSB7XHJcbiAgICBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKCdSZXNldCBncmlkIHNldHRpbmdzIHRvIGRlZmF1bHQgdmFsdWVzPycsICdSZXNldCB0byBkZWZhdWx0PycpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcbiAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXJcclxuICAgICAgICAgICAgLnJlc2V0U2V0dGluZ3MoKVxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5zdGF0ZShkYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCkpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN3aXRjaFRvTW9kZShtb2RlOiBHcmlkTW9kZSkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBtb2RlIHx8IG1vZGUgPT09IEdyaWRNb2RlLkVkaXQgJiYgIXRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IG1vZGU7XHJcblxyXG4gICAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0aGlzLmdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXNbMF0uY29sdW1uJykgYXMgc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0IG5ld1JlcG9ydFBhcmFtcyA9IHtcclxuICAgICAgLi4udGhpcy5yZXBvcnRQYXJhbXMsXHJcbiAgICAgIFRvdGFsU3VtbWFyeUNvbHVtbjogY3VycmVudFN1bW1hcnlDb2x1bW4gPyBjdXJyZW50U3VtbWFyeUNvbHVtbiA6IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtblxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG5ld1JlcG9ydFBhcmFtcztcclxuXHJcbiAgICB0aGlzLmdyaWQuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB0aGlzLmdyaWQgPSB0aGlzLmluaXRJbnRlcm5hbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlR3JpZFN0YXRlKHN0YXRlKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgIT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29sdW1uTmFtZXNVcGRhdGVkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3Qgd2lkdGhzID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLnNhdmUoc3RhdGUsXHJcbiAgICAgICgpID0+IHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmluZyksXHJcbiAgICAgICgpID0+IHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmVkKSk7XHJcblxyXG4gICAgaWYgKHdpZHRocykge1xyXG4gICAgICBPYmplY3Qua2V5cyh3aWR0aHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVkaXRXaWR0aEJveCA9IHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzW2tleV07XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gd2lkdGhzW2tleV0gPT09ICdpbmhlcml0JyA/ICcnIDogd2lkdGhzW2tleV07XHJcblxyXG4gICAgICAgIGlmIChlZGl0V2lkdGhCb3ggJiYgZWRpdFdpZHRoQm94Lm9wdGlvbigndmFsdWUnKSAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgIGVkaXRXaWR0aEJveC5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRHcmlkSGVhZGVyQ2VsbEVkaXRQYW5lbChcclxuICAgIGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uLFxyXG4gICAgJGNlbGw6IEpRdWVyeSxcclxuICAgIGFkZGl0aW9uYWxTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGVcclxuICApIHtcclxuICAgIGNvbnN0IGRhdGFGaWVsZCA9IGNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICBjb25zdCAkY29sdW1uQ2FwdGlvbkVsID0gJGNlbGwuZmluZCgnLmR4LWRhdGFncmlkLXRleHQtY29udGVudCcpO1xyXG4gICAgY29uc3QgJGVkaXRvckFyZWEgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdjb2x1bW4tZWRpdG9yLWFyZWEnKS5pbnNlcnRBZnRlcigkY29sdW1uQ2FwdGlvbkVsKTtcclxuXHJcbiAgICAkY29sdW1uQ2FwdGlvbkVsLmNzcygnbWF4V2lkdGgnLCAnNTUlJyk7XHJcblxyXG4gICAgY29uc3QgJGVkaXRUeXBlUGFuZWwgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdlZGl0LXR5cGUtcGFuZWwnKVxyXG4gICAgICAud2lkdGgoJzEwMCUnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNlbGwpO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0V2lkdGhQYW5lbCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2VkaXQtd2lkdGgtcGFuZWwnKVxyXG4gICAgICAud2lkdGgoJzEwMCUnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNlbGwpO1xyXG5cclxuICAgICRlZGl0VHlwZVBhbmVsWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgY29uc3Qgc2VsZWN0Qm94ID0gJGVkaXRUeXBlQm94LmR4U2VsZWN0Qm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdEJveC5vcHRpb24oJ29wZW5lZCcpKSB7XHJcbiAgICAgICAgc2VsZWN0Qm94LmNsb3NlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0Qm94Lm9wZW4oKTtcclxuICAgICAgfVxyXG4gICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgbGV0IGxhc3RDYXB0aW9uVmFsdWUgPSBjb2x1bW4uY2FwdGlvbjtcclxuXHJcbiAgICBjb25zdCAkZWRpdENhcHRpb25CdG4gPSAkKCc8c3BhbiAvPicpLmR4QnV0dG9uKHtcclxuICAgICAgaGludDogJ0VkaXQgY29sdW1uIGNhcHRpb24nLFxyXG4gICAgICB0ZW1wbGF0ZTogKGRhdGEsICRjb250ZW50KSA9PiAkY29udGVudC5hcHBlbmQoJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnZWRpdC1jYXB0aW9uLWJ0bicpKSxcclxuICAgICAgb25DbGljazogKHsgZXZlbnQgfSkgPT4ge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICRjb2x1bW5DYXB0aW9uRWwuaGlkZSgpO1xyXG4gICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRUb29sdGlwQnRuLmhpZGUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJGVkaXQgPSAkKCc8c3BhbiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICB2YWx1ZTogbGFzdENhcHRpb25WYWx1ZSxcclxuICAgICAgICAgIGVsZW1lbnRBdHRyOiB7IGNsYXNzOiAnY2FwdGlvbi1lZGl0b3InIH0sXHJcbiAgICAgICAgICBvbkVudGVyS2V5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlZGl0QnRuLmJsdXIoKTtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbktleURvd246IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBlZGl0QnRuLm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgICAgICAgICRlZGl0LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLnRleHQobmV3VmFsdWUpLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRDYXB0aW9uQnRuLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRUb29sdGlwQnRuLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgIGxhc3RDYXB0aW9uVmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLnNldENvbHVtbkNhcHRpb24oZGF0YUZpZWxkLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUdyaWRTdGF0ZSh0aGlzLmdyaWQuc3RhdGUoKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKVxyXG4gICAgICAgICAgLmFwcGVuZFRvKCRlZGl0b3JBcmVhKVxyXG4gICAgICAgICAgLm9uKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBlZGl0QnRuID0gJGVkaXQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICBlZGl0QnRuLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmluc2VydEFmdGVyKCRjb2x1bW5DYXB0aW9uRWwpO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0VG9vbHRpcEJ0biA9ICQoJzxzcGFuIC8+JykuZHhCdXR0b24oe1xyXG4gICAgICBoaW50OiAnRWRpdCBjb2x1bW4gdG9vbHRpcCcsXHJcbiAgICAgIHRlbXBsYXRlOiAoZGF0YSwgJGNvbnRlbnQpID0+ICRjb250ZW50LmFwcGVuZCgkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdlZGl0LXRvb2x0aXAtYnRuJykpLFxyXG4gICAgICBvbkNsaWNrOiAoeyBldmVudCB9KSA9PiB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRDYXB0aW9uQnRuLmhpZGUoKTtcclxuICAgICAgICAkZWRpdFRvb2x0aXBCdG4uaGlkZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkZWRpdCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgICAgIHZhbHVlOiBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAsXHJcbiAgICAgICAgICB0ZXh0OiBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAsXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0VudGVyIGNvbHVtbiB0b29sdGlwLi4uJyxcclxuICAgICAgICAgIG9uRW50ZXJLZXk6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGVkaXRCdG4uYmx1cigpO1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbkZvY3VzT3V0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWRpdEJ0bi5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgICAgICAgICAkZWRpdC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0VG9vbHRpcEJ0bi5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICAkY2VsbC5hdHRyKCd0aXRsZScsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zYXZlR3JpZFN0YXRlKHRoaXMuZ3JpZC5zdGF0ZSgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgICAgICAuYXBwZW5kVG8oJGVkaXRvckFyZWEpXHJcbiAgICAgICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRCdG4gPSAkZWRpdC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICAgIGVkaXRCdG4uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSkuaW5zZXJ0QWZ0ZXIoJGVkaXRDYXB0aW9uQnRuKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFR5cGVCb3ggPSAkKCc8c3BhbiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgZGF0YVNvdXJjZTogZ3JpZENvbHVtblR5cGVzLFxyXG4gICAgICB2YWx1ZTogY29sdW1uLmRhdGFUeXBlIHx8IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUuRGVmYXVsdCxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgY29sdW1uIHR5cGUuLi4nLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oZGF0YUZpZWxkLCAnZGF0YVR5cGUnLCB2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJykuYXBwZW5kVG8oJGVkaXRUeXBlUGFuZWwpO1xyXG5cclxuICAgIGxldCBwcmV2VmFsdWUgPSAhIWNvbHVtbi53aWR0aCA/IGNvbHVtbi53aWR0aC50b1N0cmluZygpIDogJyc7XHJcblxyXG4gICAgY29uc3Qgb25XaWR0aFZhbHVlQ2hhbmdlZCA9IChlKSA9PiB7XHJcbiAgICAgIGxldCBuZXdWYWx1ZSA9IGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgIGlmICghbmV3VmFsdWUgfHwgbmV3VmFsdWUgPT09ICdpbmhlcml0Jykge1xyXG4gICAgICAgIG5ld1ZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghcHJldlZhbHVlIHx8IHByZXZWYWx1ZSA9PT0gJ2luaGVyaXQnKSB7XHJcbiAgICAgICAgcHJldlZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gcHJldlZhbHVlKSB7XHJcbiAgICAgICAgcHJldlZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk9wdGlvbihkYXRhRmllbGQsICd3aWR0aCcsIG5ld1ZhbHVlIHx8ICdpbmhlcml0Jyk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5ncmlkUmVwYWludFF1ZXVlZCkge1xyXG4gICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdyaWQucmVwYWludCgpO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRSZXBhaW50UXVldWVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgdGhpcy5ncmlkUmVwYWludFF1ZXVlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgJGVkaXRXaWR0aEJveCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgdGV4dDogcHJldlZhbHVlID09PSAnaW5oZXJpdCcgPyAnJyA6IHByZXZWYWx1ZSxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZXQgd2lkdGguLi4nLFxyXG4gICAgICBvbkVudGVyS2V5OiAoKSA9PiAkZWRpdFdpZHRoQm94LmR4VGV4dEJveCgnaW5zdGFuY2UnKS5ibHVyKCksXHJcbiAgICAgIG9uRm9jdXNPdXQ6IG9uV2lkdGhWYWx1ZUNoYW5nZWQsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiBvbldpZHRoVmFsdWVDaGFuZ2VkXHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgIC5hcHBlbmRUbygkZWRpdFdpZHRoUGFuZWwpXHJcbiAgICAgIC5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlc1tjb2x1bW4udmlzaWJsZUluZGV4XSA9ICRlZGl0V2lkdGhCb3guZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0R3JpZEhlYWRlckNlbGwoJGNlbGxFbDogSlF1ZXJ5LCBhZGRpdGlvbmFsU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlKSB7XHJcbiAgICBjb25zdCAkY29sdW1uQ2FwdGlvbkVsID0gJGNlbGxFbC5maW5kKCcuZHgtZGF0YWdyaWQtdGV4dC1jb250ZW50Jyk7XHJcbiAgICBjb25zdCB0b29sdGlwID0gYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwO1xyXG4gICAgY29uc3QgY2FwdGlvbiA9IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MuY2FwdGlvbjtcclxuXHJcbiAgICAkY2VsbEVsLmF0dHIoJ3RpdGxlJywgdG9vbHRpcCB8fCB2b2lkIDApO1xyXG5cclxuICAgIGlmIChjYXB0aW9uKSB7XHJcbiAgICAgICRjb2x1bW5DYXB0aW9uRWwudGV4dChjYXB0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmludGVyZmFjZSBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zIHtcclxuICBzdWJ2YWx1ZXM6IElTdWJ2YWx1ZU9wdGlvbnNbXTtcclxuICB0eXBlOiBzdHJpbmc7XHJcbiAgd2lkdGg6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElTdWJ2YWx1ZU9wdGlvbnMge1xyXG4gIGtleTogbnVtYmVyO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpc0JvdW5kOiBib29sZWFuO1xyXG4gIG1lYXN1cmVJZDogc3RyaW5nO1xyXG4gIHZhbHVlOiBudW1iZXI7XHJcbiAgY29sb3I6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XHJcbiAgc3VidmFsdWVzOiBbXSxcclxuICB0eXBlOiAndHJpYW5nbGVNYXJrZXInLFxyXG4gIGNvbG9yOiAnIzg3OThhNScsXHJcbiAgc2Vjb25kQ29sb3I6ICcjZTE4ZTkyJyxcclxuICB3aWR0aDogMTAsXHJcbiAgaXNDdXN0b21QYWxldHRlOiBmYWxzZSxcclxuICBwYWxldHRlOiBudWxsLFxyXG4gIGN1c3RvbVBhbGV0dGU6IFsnIzYxYTU5NScsICdHcmV5JywgJ3JnYigxNTMsIDEwMiwgMjU1KScsICdOYXZ5J11cclxufSBhcyBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zO1xyXG5cclxuY29uc3QgQ1NTX0NMQVNTID0gJ2lzb3otc3VidmFsdWVFZGl0b3JGb3JtR3JvdXAnO1xyXG5jb25zdCBOQU1FX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fbmFtZWA7XHJcbmNvbnN0IElTX0JPVU5EX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9faXMtYm91bmRgO1xyXG5jb25zdCBWQUxVRV9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX3ZhbHVlYDtcclxuY29uc3QgTUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX21lYXN1cmUtaWRgO1xyXG5jb25zdCBDT0xPUl9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX2NvbG9yYDtcclxuXHJcbmNvbnN0IENJUkNMVUFSX0lORElDQVRPUl9UWVBFUyA9IFsncmVjdGFuZ2xlTmVlZGxlJywgJ3RyaWFuZ2xlTmVlZGxlJywgJ3JhbmdlQmFyJywgJ3RyaWFuZ2xlTWFya2VyJywgJ3RleHRDbG91ZCddO1xyXG5jb25zdCBMSU5FQVJfSU5ESUNBVE9SX1RZUEVTID0gWydyZWN0YW5nbGUnLCAnY2lyY2xlJywgJ3Job21idXMnLCAncmFuZ2VCYXInLCAndHJpYW5nbGVNYXJrZXInLCAndGV4dENsb3VkJ107XHJcblxyXG5jb25zdCBDSVJDVUxBUl9WSUVXX1RZUEVTOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZVZpZXdUeXBlW10gPSBbJ0NpcmN1bGFyRnVsbCcsICdDaXJjdWxhckhhbGYnLCAnQ2lyY3VsYXJRdWFydGVyTGVmdCcsICdDaXJjdWxhclF1YXJ0ZXJSaWdodCcsICdDaXJjdWxhclRocmVlRm91cnRoJ107XHJcbmNvbnN0IExJTkVBUl9WSUVXX1RZUEVTOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZVZpZXdUeXBlW10gPSBbJ0xpbmVhckhvcml6b250YWwnLCAnTGluZWFyVmVydGljYWwnXTtcclxuXHJcbmNvbnN0IERFRkFVTFRfUEFMRVRURSA9IFsnIzFkYjJmNScsICcjZjU1NjRhJywgJyM5N2M5NWMnLCAnI2ZmYzcyMCcsICcjZWIzNTczJywgJyNhNjNkYjgnLCAnIzY1OTNiYycsICcjZmFhMzM1JywgJyNmZjg4N2MnXTtcclxuXHJcbmNvbnN0IFBSRURFRklORURfUEFMRVRURVMgPSBbJ0JyaWdodCcsICdIYXJtb255IExpZ2h0JywgJ09jZWFuJywgJ1Bhc3RlbCcsICdTb2Z0JywgJ1NvZnQgUGFzdGVsJywgJ1ZpbnRhZ2UnLFxyXG4gICdWaW9sZXQnLCAnQ2FybWluZScsICdEYXJrIE1vb24nLCAnRGFyayBWaW9sZXQnLCAnR3JlZW4gTWlzdCcsICdTb2Z0IEJsdWUnLCAnTWF0ZXJpYWwnLCAnT2ZmaWNlJ107XHJcblxyXG4vLyAxLiBNb2RlbFxyXG5jb25zdCBwcm9wZXJ0eSA9IHtcclxuICBvd25lclR5cGU6IERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSxcclxuICBwcm9wZXJ0eU5hbWU6ICdHYXVnZVN1YnZhbHVlc1NldHRpbmdzJyxcclxuICBkZWZhdWx0VmFsdWU6IEpTT04uc3RyaW5naWZ5KGRlZmF1bHRPcHRpb25zKSxcclxuICB2YWx1ZVR5cGU6ICdzdHJpbmcnXHJcbn0gYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuQ3VzdG9tUHJvcGVydHlNZXRhZGF0YTtcclxuXHJcbkRldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LnJlZ2lzdGVyQ3VzdG9tUHJvcGVydHkocHJvcGVydHkpO1xyXG5cclxuLy8gMi4gVmlld2VyXHJcbmZ1bmN0aW9uIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZChhcmdzOiBEZXZFeHByZXNzLkRhc2hib2FyZC5JdGVtV2lkZ2V0T3B0aW9uRXZlbnRBcmdzKSB7XHJcbiAgaWYgKGFyZ3MuZGFzaGJvYXJkSXRlbSBpbnN0YW5jZW9mIERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSkge1xyXG4gICAgY29uc3Qgc3RvcmVkT3B0aW9ucyA9IGdldE9wdGlvbnMoYXJncy5kYXNoYm9hcmRJdGVtKTtcclxuXHJcbiAgICBjb25zdCBnYXVnZU9wdGlvbnMgPSBhcmdzLm9wdGlvbnMgYXMgRGV2RXhwcmVzcy52aXouZHhMaW5lYXJHYXVnZU9wdGlvbnMgfCBEZXZFeHByZXNzLnZpei5keENpcmN1bGFyR2F1Z2VPcHRpb25zO1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlcyA9IGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZXMgfHwgW107XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IgPSBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IgfHwge307XHJcblxyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLnR5cGUgPSBzdG9yZWRPcHRpb25zLnR5cGUgYXMgYW55O1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLndpZHRoID0gc3RvcmVkT3B0aW9ucy53aWR0aDtcclxuXHJcbiAgICBjb25zdCBoYXNUYXJnZXRWYWx1ZSA9ICEhYXJncy5kYXNoYm9hcmRJdGVtLmdhdWdlcygpWzBdPy50YXJnZXRWYWx1ZSgpO1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLnBhbGV0dGUgPSBzdG9yZWRPcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKHMpID0+IGhhc1RhcmdldFZhbHVlIHx8IHMua2V5ID4gLTEpLm1hcCgocykgPT4gcy5jb2xvcik7XHJcblxyXG4gICAgc3RvcmVkT3B0aW9ucy5zdWJ2YWx1ZXMuZm9yRWFjaCgoc3VidmFsdWUpID0+IHtcclxuICAgICAgaWYgKHN1YnZhbHVlLmtleSA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHZhbHVlID0gc3VidmFsdWUuaXNCb3VuZCA/IGFyZ3MuaXRlbURhdGEuZ2V0TWVhc3VyZVZhbHVlKHN1YnZhbHVlLm1lYXN1cmVJZCkuZ2V0VmFsdWUoKSA6IHN1YnZhbHVlLnZhbHVlO1xyXG4gICAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVzLnB1c2godmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyAzLiBEZXNpZ25lclxyXG5mdW5jdGlvbiBvbkN1c3RvbWl6ZVNlY3Rpb25zKGFyZ3M6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLkN1c3RvbWl6ZVNlY3Rpb25zRXZlbnRBcmdzKSB7XHJcbiAgY29uc3QgZ2F1Z2VJdGVtID0gYXJncy5kYXNoYm9hcmRJdGVtO1xyXG4gIGlmIChnYXVnZUl0ZW0gaW5zdGFuY2VvZiBEZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5HYXVnZUl0ZW0pIHtcclxuICAgIGFyZ3MuYWRkU2VjdGlvbih7XHJcbiAgICAgIHRpdGxlOiAnU3VidmFsdWVzJyxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6IHByb3BlcnR5LnByb3BlcnR5TmFtZSxcclxuICAgICAgICAgIHRlbXBsYXRlKGEsIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIG5ldyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdFZGl0IGluIFdpemFyZCcsXHJcbiAgICAgICAgICAgICAgb25DbGljaygpIHtcclxuICAgICAgICAgICAgICAgIHNob3dQb3B1cChnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uQ29udGFpbmVyO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93UG9wdXAoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pIHtcclxuICBjb25zdCBwb3B1cENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocG9wdXBDb250YWluZXIpO1xyXG4gIGNvbnN0IHBvcHVwT3B0aW9ucyA9IHtcclxuICAgIHdpZHRoOiAnODAwcHgnLFxyXG4gICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICBtYXhIZWlnaHQ6ICcxMDAlJyxcclxuICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgY29udGVudFRlbXBsYXRlKHRoaXM6IGFueSwgY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICBjb25zdCBzdWJ2YWx1ZXNGb3JtQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnN0IHN1YnZhbHVlc2Zvcm1PcHRpb25zID0gZ2V0U3VidmFsdWVGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICB0aGlzLl9zdWJ2YWx1ZXNGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIHN1YnZhbHVlc2Zvcm1PcHRpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGluZGljYXRvckZvcm1Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29uc3QgaW5kaWNhdG9yZm9ybU9wdGlvbnMgPSBnZXRJbmRpY2F0b3JGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICB0aGlzLl9pbmRpY2F0b3JGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKGluZGljYXRvckZvcm1Db250YWluZXIsIGluZGljYXRvcmZvcm1PcHRpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIGluZGljYXRvckZvcm1Db250YWluZXIpO1xyXG5cclxuICAgICAgY29uc3Qgc2Nyb2xsVmlldyA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgc2Nyb2xsVmlldy5hcHBlbmQoY29udGVudCk7XHJcbiAgICAgIHNjcm9sbFZpZXcuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIHNjcm9sbFZpZXc7XHJcbiAgICB9LFxyXG4gICAgb25IaWRkZW4oKSB7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocG9wdXBDb250YWluZXIpO1xyXG4gICAgfSxcclxuICAgIHRpdGxlOiAnU3VidmFsdWVzIFdpemFyZCcsXHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcztcclxuICBjb25zdCBwb3B1cCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4UG9wdXAocG9wdXBDb250YWluZXIsIHBvcHVwT3B0aW9ucyk7XHJcbiAgcG9wdXAuc2hvdygpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRPcHRpb25zKGdhZ3VlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogSUdhdWdlU3VidmFsdWVzT3B0aW9ucyB7XHJcbiAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZ2FndWVJdGVtLmN1c3RvbVByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydHkucHJvcGVydHlOYW1lKSBhcyBzdHJpbmcpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcbiAgY29uc3QgaGFzVGFyZ2V0VmFsdWUgPSAhIWdhZ3VlSXRlbS5nYXVnZXMoKVswXT8udGFyZ2V0VmFsdWUoKTtcclxuXHJcbiAgaWYgKGhhc1RhcmdldFZhbHVlICYmICghZGF0YS5zdWJ2YWx1ZXMgfHwgIWRhdGEuc3VidmFsdWVzLnNvbWUoKHMpID0+IHMua2V5ID09PSAtMSkpKSB7XHJcbiAgICBkYXRhLnN1YnZhbHVlcy5zcGxpY2UoMCwgMCwge1xyXG4gICAgICBrZXk6IC0xLFxyXG4gICAgICBuYW1lOiAnVGFyZ2V0IFZhbHVlJyxcclxuICAgICAgaXNCb3VuZDogZmFsc2UsXHJcbiAgICAgIG1lYXN1cmVJZDogJycsXHJcbiAgICAgIHZhbHVlOiAwLFxyXG4gICAgICBjb2xvcjogREVGQVVMVF9QQUxFVFRFWyhkYXRhLnN1YnZhbHVlcz8ubGVuZ3RoIHx8IDApICUgKERFRkFVTFRfUEFMRVRURS5sZW5ndGggLSAxKV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkYXRhO1xyXG59XHJcbmZ1bmN0aW9uIHNldE9wdGlvbnMoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0sIHZhbHVlOiBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zKSB7XHJcbiAgcmV0dXJuIGdhdWdlSXRlbS5jdXN0b21Qcm9wZXJ0aWVzLnNldFZhbHVlKHByb3BlcnR5LnByb3BlcnR5TmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxufVxyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuZnVuY3Rpb24gY3JlYXRlTGlzdEFuZFRvb2xiYXIoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0sIGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogW0pRdWVyeSwgRGV2RXhwcmVzcy51aS5keExpc3QsIERldkV4cHJlc3MudWkuZHhUb29sYmFyXSB7XHJcbiAgY29uc3QgJGVsZW1lbnQgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgY29uc3QgJHRvb2xiYXJDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgJGVsZW1lbnQuYXBwZW5kKCR0b29sYmFyQ29udGFpbmVyKTtcclxuICBjb25zdCBlZGl0QnV0dG9uID0gbnVsbDtcclxuICBsZXQgbGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgPSBudWxsO1xyXG5cclxuICBjb25zdCB0b29sYmFyT3B0aW9ucyA9IHtcclxuICAgIGl0ZW1zOiBbe1xyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGljb246ICdhZGQnLFxyXG4gICAgICAgIHN0eWxpbmdNb2RlOiAndGV4dCcsXHJcbiAgICAgICAgb25DbGljayhlKSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5zdWJ2YWx1ZXMucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyA8IGl0ZW0ua2V5ID8gaXRlbS5rZXkgOiBhY2MsIDApICsgMTtcclxuICAgICAgICAgIGNvbnN0IG5ld1N1YnZhbHVlOiBJU3VidmFsdWVPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIG5hbWU6IGBTdWJ2YWx1ZSAke2tleX1gLFxyXG4gICAgICAgICAgICBpc0JvdW5kOiBmYWxzZSxcclxuICAgICAgICAgICAgbWVhc3VyZUlkOiAnJyxcclxuICAgICAgICAgICAgdmFsdWU6IDAsXHJcbiAgICAgICAgICAgIGNvbG9yOiBERUZBVUxUX1BBTEVUVEVbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoICUgKERFRkFVTFRfUEFMRVRURS5sZW5ndGggLSAxKV0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJywgbmV3U3VidmFsdWUpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGl0ZW1JbkRhdGFTb3VyY2UgPSBvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBuZXdTdWJ2YWx1ZS5rZXkpWzBdO1xyXG4gICAgICAgICAgaWYgKCFpdGVtSW5EYXRhU291cmNlKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuc3VidmFsdWVzLnB1c2gobmV3U3VidmFsdWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKGl0ZW1JbkRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgICBvcHRpb25zW2luZGV4XSA9IG5ld1N1YnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuICAgICAgICAgIGxpc3QucmVsb2FkKCk7XHJcbiAgICAgICAgICBsaXN0Lm9wdGlvbignc2VsZWN0ZWRJdGVtJywgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH1cclxuICAgIH1dXHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcblxyXG4gIGNvbnN0IHVwZGF0ZVRvb2xiYXJTdGF0ZSA9IChoYXNTZWxlY3RlZEl0ZW06IGJvb2xlYW4pID0+IHtcclxuICAgIGVkaXRCdXR0b24gJiYgZWRpdEJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWhhc1NlbGVjdGVkSXRlbSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdG9vbGJhciA9IG5ldyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhcigkdG9vbGJhckNvbnRhaW5lciwgdG9vbGJhck9wdGlvbnMpO1xyXG4gIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cclxuICBjb25zdCBsaXN0T3B0aW9ucyA9IHtcclxuICAgIGRhdGFTb3VyY2U6IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgIGxvYWQ6ICgpID0+IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKS5zdWJ2YWx1ZXMsXHJcbiAgICAgIHJlbW92ZTogKCkgPT4geyB9XHJcbiAgICB9IGFzIGFueSksXHJcbiAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgaGVpZ2h0OiAnMjAwcHgnLFxyXG4gICAga2V5RXhwcjogJ2tleScsXHJcbiAgICBub0RhdGFUZXh0OiAnQWRkIGEgU3VidmFsdWUnLFxyXG4gICAgYWxsb3dJdGVtRGVsZXRpbmc6IHRydWUsXHJcbiAgICBpdGVtRGVsZXRlTW9kZTogJ3N0YXRpYycsXHJcbiAgICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyxcclxuICAgIG9uQ29udGVudFJlYWR5KGUpIHsgdXBkYXRlVG9vbGJhclN0YXRlKCEhZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKSk7IH0sXHJcbiAgICBvbkl0ZW1SZW5kZXJlZChlKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1EYXRhID0gZS5pdGVtRGF0YSBhcyBJU3VidmFsdWVPcHRpb25zO1xyXG4gICAgICBpZiAoaXRlbURhdGEua2V5ID09PSAtMSkge1xyXG4gICAgICAgIGNvbnN0IGRlbGV0ZUVsZW1lbnQgPSBlLml0ZW1FbGVtZW50WzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2R4LWxpc3Qtc3RhdGljLWRlbGV0ZS1idXR0b24tY29udGFpbmVyJylbMF0gYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAgICAgZGVsZXRlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25TZWxlY3Rpb25DaGFuZ2VkKGUpIHtcclxuICAgICAgdXBkYXRlVG9vbGJhclN0YXRlKCEhZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKSk7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJdGVtJyk7XHJcbiAgICAgIGZvcm0ub3B0aW9uKCdmb3JtRGF0YScsIHNlbGVjdGVkSXRlbSk7XHJcbiAgICAgIGNvbnN0IHdhc2Zvcm1WaXNpYmxlID0gZm9ybS5lbGVtZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScpID09PSAnYmxvY2snO1xyXG4gICAgICBjb25zdCBzaG91bGRGb3JtQmVWaXNpYmxlID0gISFzZWxlY3RlZEl0ZW07XHJcbiAgICAgIGlmICghd2FzZm9ybVZpc2libGUgJiYgc2hvdWxkRm9ybUJlVmlzaWJsZSB8fCB3YXNmb3JtVmlzaWJsZSAmJiAhc2hvdWxkRm9ybUJlVmlzaWJsZSkge1xyXG4gICAgICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCBzaG91bGRGb3JtQmVWaXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkl0ZW1EZWxldGVkOiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICBjb25zdCBrZXkgPSBlLml0ZW1EYXRhLmtleTtcclxuICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKG9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigoc3VidmFsdWUpID0+IHN1YnZhbHVlLmtleSA9PT0ga2V5KVswXSk7XHJcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgICAgbGlzdC5yZWxvYWQoKTtcclxuICAgICAgbGlzdC5vcHRpb24oJ3NlbGVjdGVkSXRlbScsIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmxlbmd0aCAtIDFdKTtcclxuICAgIH1cclxuICB9IGFzIERldkV4cHJlc3MudWkuZHhMaXN0T3B0aW9ucztcclxuXHJcbiAgY29uc3QgJGxpc3RDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgJGVsZW1lbnQuYXBwZW5kKCRsaXN0Q29udGFpbmVyKTtcclxuXHJcbiAgbGlzdCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4TGlzdCgkbGlzdENvbnRhaW5lciwgbGlzdE9wdGlvbnMpO1xyXG5cclxuICByZXR1cm4gWyRlbGVtZW50LCBsaXN0LCB0b29sYmFyXTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U3VidmFsdWVGb3JtT3B0aW9ucyhnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgbGV0IGl0ZW1zTGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgfCBudWxsID0gbnVsbDtcclxuICBjb25zdCB1cGRhdGVGb3JtU3RhdGUgPSAoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0pID0+IHtcclxuICAgIGNvbnN0IHZhbHVlRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBtZWFzdXJlSWRFZGl0b3IgPSBmb3JtLmdldEVkaXRvcignbWVhc3VyZUlkJyk7XHJcbiAgICBjb25zdCBuYW1lRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ25hbWUnKTtcclxuICAgIGNvbnN0IGlzQm91bmQgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKS5pc0JvdW5kO1xyXG4gICAgY29uc3QgaXNUYXJnZXRWYWx1ZSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLmtleSA9PT0gLTE7XHJcblxyXG4gICAgdmFsdWVFZGl0b3IgJiYgdmFsdWVFZGl0b3Iub3B0aW9uKCdkaXNhYmxlZCcsIGlzQm91bmQpO1xyXG4gICAgbWVhc3VyZUlkRWRpdG9yICYmIG1lYXN1cmVJZEVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgIWlzQm91bmQpO1xyXG5cclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0lTX0JPVU5EX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke1ZBTFVFX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke01FQVNVUkVfSURfSVRFTV9DU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgIWlzVGFyZ2V0VmFsdWUgPyAnZmxleCcgOiAnbm9uZScpO1xyXG5cclxuICAgIG5hbWVFZGl0b3IgJiYgbmFtZUVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgaXNUYXJnZXRWYWx1ZSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGZvcm1EYXRhOiBudWxsLFxyXG4gICAgY29sQ291bnQ6IDIsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgY2FwdGlvbjogJ1N1YnZhbHVlcyBpdGVtcycsXHJcbiAgICAgICAgdGVtcGxhdGU6IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBbJGNvbnRhaW5lciwgbGlzdF0gPSBjcmVhdGVMaXN0QW5kVG9vbGJhcihhcmdzLmNvbXBvbmVudCwgZ2F1Z2VJdGVtKTtcclxuICAgICAgICAgIGl0ZW1zTGlzdCA9IGxpc3Q7XHJcblxyXG4gICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdzdWJ2YWx1ZUVkaXRvcicsXHJcbiAgICAgICAgY3NzQ2xhc3M6IENTU19DTEFTUyxcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBjYXB0aW9uOiAnSXRlbSBvcHRpb25zJyxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IE5BTUVfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFRleHRCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VFdmVudDogJ2tleXVwJ1xyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzQm91bmQnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogSVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFJhZGlvR3JvdXAnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgbGF5b3V0OiAnaG9yaXpvbnRhbCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFt7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnVW5ib3VuZCcsIHZhbHVlOiBmYWxzZVxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdCb3VuZCcsIHZhbHVlOiB0cnVlXHJcbiAgICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UmFkaW9Hcm91cC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdUeXBlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IFZBTFVFX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdWYWx1ZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keE51bWJlckJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdtZWFzdXJlSWQnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogTUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnSGlkZGVuIG1lYXN1cmVzJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBnYXVnZUl0ZW0uaGlkZGVuTWVhc3VyZXMoKS5tYXAoKG1lYXN1cmUpID0+ICh7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBnZXRNZWFzdXJlRGlzYXBsYXlUZXh0KG1lYXN1cmUpLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IG1lYXN1cmUudW5pcXVlTmFtZSgpXHJcbiAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2NvbG9yJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IENPTE9SX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdjb2xvcicsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeENvbG9yQm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnQ29sb3InLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIG9uQ29udGVudFJlYWR5KGUpIHsgdXBkYXRlRm9ybVN0YXRlKGUuY29tcG9uZW50KTsgfSxcclxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElTdWJ2YWx1ZU9wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIGNvbnN0IGVkaXRlZFN1YnZhbHVlID0gb3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzdWJ2YWx1ZSkgPT4gc3VidmFsdWUua2V5ID09PSBmb3JtRGF0YS5rZXkpWzBdO1xyXG5cclxuICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMuaW5kZXhPZihlZGl0ZWRTdWJ2YWx1ZSldID0gZm9ybURhdGE7XHJcbiAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuXHJcbiAgICAgIGlmIChlZGl0ZWRTdWJ2YWx1ZSAmJiBlZGl0ZWRTdWJ2YWx1ZS5uYW1lICE9PSBmb3JtRGF0YS5uYW1lICYmIGl0ZW1zTGlzdCkge1xyXG4gICAgICAgIGl0ZW1zTGlzdC5yZXBhaW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgdXBkYXRlRm9ybVN0YXRlKGUuY29tcG9uZW50KTtcclxuICAgIH0sXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TWVhc3VyZURpc2FwbGF5VGV4dChtZWFzdXJlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5NZWFzdXJlKTogc3RyaW5nIHtcclxuICBpZiAobWVhc3VyZS5uYW1lKCkpIHtcclxuICAgIHJldHVybiBtZWFzdXJlLm5hbWUoKTtcclxuICB9XHJcblxyXG4gIGxldCByZXN1bHQgPSBtZWFzdXJlLmRhdGFNZW1iZXIoKTtcclxuICBpZiAobWVhc3VyZS5zdW1tYXJ5VHlwZSAmJiBtZWFzdXJlLnN1bW1hcnlUeXBlKCkpIHtcclxuICAgIHJlc3VsdCArPSBgICgke21lYXN1cmUuc3VtbWFyeVR5cGUoKX0pYDtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEluZGljYXRvckZvcm1PcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogRGV2RXhwcmVzcy51aS5keEZvcm1PcHRpb25zIHtcclxuICBjb25zdCBjdXJyZW50Vmlld1R5cGUgPSBnYXVnZUl0ZW0udmlld1R5cGUoKTtcclxuICBjb25zdCBpbmRpY2F0b3JUeXBlcyA9IExJTkVBUl9WSUVXX1RZUEVTLnNvbWUoKHQpID0+IHQgPT09IGN1cnJlbnRWaWV3VHlwZSlcclxuICAgID8gTElORUFSX0lORElDQVRPUl9UWVBFU1xyXG4gICAgOiBDSVJDTFVBUl9JTkRJQ0FUT1JfVFlQRVM7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBmb3JtRGF0YTogZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pIHx8IG51bGwsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgY2FwdGlvbjogJ0luZGljYXRvciBvcHRpb25zJyxcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd0eXBlJyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVHlwZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICBpdGVtczogaW5kaWNhdG9yVHlwZXMubWFwKCh0KSA9PiAoeyB0ZXh0OiB0LCB2YWx1ZTogdCB9KSksXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd3aWR0aCcsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keE51bWJlckJveE9wdGlvbnMsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1dpZHRoJyxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcblxyXG4gICAgICBvcHRpb25zLndpZHRoID0gZm9ybURhdGEud2lkdGg7XHJcbiAgICAgIG9wdGlvbnMudHlwZSA9IGZvcm1EYXRhLnR5cGU7XHJcblxyXG4gICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuLy8gNC4gRXZlbnQgU3Vic2NyaXB0aW9uXHJcbmV4cG9ydCBmdW5jdGlvbiBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbih0aGlzOiBhbnksIGRhc2hib2FyZENvbnRyb2w6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wpIHtcclxuICB0aGlzLm5hbWUgPSAnR2F1Z2VTdWJ2YWx1ZXMnO1xyXG4gIHRoaXMuc3RhcnQgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB2aWV3ZXJBcGlFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ3ZpZXdlci1hcGknKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5WaWV3ZXJBcGlFeHRlbnNpb247XHJcbiAgICBpZiAodmlld2VyQXBpRXh0ZW5zaW9uKSB7XHJcbiAgICAgIHZpZXdlckFwaUV4dGVuc2lvbi5vbignaXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCcsIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcHRpb25zUGFuZWxFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ2l0ZW0tb3B0aW9ucy1wYW5lbCcpIGFzIGFueTtcclxuICAgIGlmIChvcHRpb25zUGFuZWxFeHRlbnNpb24pIHtcclxuICAgICAgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uLm9uKCdjdXN0b21pemVTZWN0aW9ucycsIG9uQ3VzdG9taXplU2VjdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgdGhpcy5zdG9wID0gKCkgPT4ge1xyXG4gICAgY29uc3Qgdmlld2VyQXBpRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCd2aWV3ZXItYXBpJykgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuVmlld2VyQXBpRXh0ZW5zaW9uO1xyXG4gICAgaWYgKHZpZXdlckFwaUV4dGVuc2lvbikge1xyXG4gICAgICB2aWV3ZXJBcGlFeHRlbnNpb24ub2ZmKCdpdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkJywgb25JdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9wdGlvbnNQYW5lbEV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbignaXRlbS1vcHRpb25zLXBhbmVsJykgYXMgYW55O1xyXG4gICAgaWYgKG9wdGlvbnNQYW5lbEV4dGVuc2lvbikge1xyXG4gICAgICBvcHRpb25zUGFuZWxFeHRlbnNpb24ub2ZmKCdjdXN0b21pemVTZWN0aW9ucycsIG9uQ3VzdG9taXplU2VjdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElEYXNoYm9hcmRQZXJtaXNzaW9ucywgSURhc2hib2FyZFVybHMsIElSZXBvcnRQYXJhbXMgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24gfSBmcm9tICcuL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24nO1xyXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuY29uc3QgREFTSEJPQVJEX01PREVfS0VZID0gJ0RBU0hCT0FSRF9NT0RFX0tFWSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEYXNoYm9hcmRPcHRpb25zIHtcclxuICAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHBlcm1pc3Npb25zOiBJRGFzaGJvYXJkUGVybWlzc2lvbnM7XHJcbiAgdXJsczogSURhc2hib2FyZFVybHM7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uczogSURhc2hib2FyZFBlcm1pc3Npb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsczogSURhc2hib2FyZFVybHM7XHJcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZGFzaGJvYXJkOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEYXNoYm9hcmRPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRkYXNoYm9hcmRDb250YWluZXIgPSBvcHRpb25zLiRkYXNoYm9hcmRDb250YWluZXI7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5yZXBvcnRJZCA9IG9wdGlvbnMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IG9wdGlvbnMucGVybWlzc2lvbnM7XHJcbiAgICB0aGlzLnVybHMgPSBvcHRpb25zLnVybHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCByZXBvcnRJZFN0ciA9IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkICYmIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgRGV2RXhwcmVzcy5EYXNoYm9hcmQuUmVzb3VyY2VNYW5hZ2VyLmVtYmVkQnVuZGxlZFJlc291cmNlcygpO1xyXG5cclxuICAgIGxldCBtb2RlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Xb3JraW5nTW9kZSA9IHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nXHJcbiAgICAgID8gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLldvcmtpbmdNb2RlIHx8ICdWaWV3ZXInXHJcbiAgICAgIDogJ1ZpZXdlcic7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTk9URTogRGFzaGJvYXJkIDE4LjEgZG9lc24ndCBzdXBwb3J0IGV4cG9ydC4gV2UgaGlkZSB0aGUgZXhwb3J0IGJ1dHRvbiB2aWEgc3R5bGVzXHJcbiAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKHRoaXMuJGRhc2hib2FyZENvbnRhaW5lclswXSwge1xyXG4gICAgICB3b3JraW5nTW9kZTogbW9kZSxcclxuICAgICAgaW5pdGlhbERhc2hib2FyZElkOiByZXBvcnRJZFN0cixcclxuICAgICAgZW5kcG9pbnQ6IHRoaXMudXJscy5FbmRQb2ludCxcclxuICAgICAgYWpheFJlbW90ZVNlcnZpY2U6IHtcclxuICAgICAgICBoZWFkZXJzOiAhdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW4gPyB1bmRlZmluZWQgOiB7XHJcbiAgICAgICAgICB0b2tlbjogdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW5cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRGFzaGJvYXJkSW5pdGlhbGl6aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlZ2lzdGVyRXh0ZW5zaW9uKG5ldyBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbihlLmNvbXBvbmVudCkpO1xyXG5cclxuICAgICAgICBpZiAocmVwb3J0SWRTdHIgIT09IGUuZGFzaGJvYXJkSWQpIHtcclxuICAgICAgICAgIHJlcG9ydElkU3RyID0gZS5kYXNoYm9hcmRJZDtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZW5jb2RlVVJJKHRoaXMudXJscy5QcmV2aWV3VXJsICsgZS5kYXNoYm9hcmRJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkJlZm9yZVJlbmRlcjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5yZWdpc3RlckV4dGVuc2lvbihuZXcgRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuVGV4dEJveEl0ZW1FZGl0b3JFeHRlbnNpb24oZS5jb21wb25lbnQpKTtcclxuICAgICAgfSxcclxuICAgICAgZXh0ZW5zaW9uczoge1xyXG4gICAgICAgICdkYXRhLXNvdXJjZS13aXphcmQnOiB7XHJcbiAgICAgICAgICBlbmFibGVDdXN0b21TcWw6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgICdkYXNoYm9hcmQtZXhwb3J0Jzoge1xyXG4gICAgICAgICAgYWxsb3dFeHBvcnREYXNoYm9hcmRJdGVtczogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2RhdGEtaW5zcGVjdG9yJzoge1xyXG4gICAgICAgICAgYWxsb3dJbnNwZWN0QWdncmVnYXRlZERhdGE6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0luc3BlY3RSYXdEYXRhOiB0cnVlLFxyXG4gICAgICAgICAgb25HcmlkSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBlLmNvbXBvbmVudCBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgICAgICAgICAgIGdyaWQub3B0aW9uKCdleHBvcnQuZW5hYmxlZCcsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kYXNoYm9hcmQucmVuZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gJ1ZpZXdlcicgPyAnU3dpdGNoIHRvIERlc2lnbmVyJyA6ICdTd2l0Y2ggdG8gVmlld2VyJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RlID0gbW9kZSA9PT0gJ1ZpZXdlcicgPyAnRGVzaWduZXInIDogJ1ZpZXdlcic7XHJcblxyXG4gICAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIG1vZGUpO1xyXG5cclxuICAgICAgICAgIGlmIChtb2RlID09PSAnVmlld2VyJykge1xyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZC5zd2l0Y2hUb1ZpZXdlcigpO1xyXG4gICAgICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgJ1N3aXRjaCB0byBEZXNpZ25lcicpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmQuc3dpdGNoVG9EZXNpZ25lcigpO1xyXG4gICAgICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgJ1N3aXRjaCB0byBWaWV3ZXInKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICByZW1vdmVSZWR1bmRhbnRUb29sYm94SXRlbXModGhpcy5kYXNoYm9hcmQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiAmJiAodGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhc2hib2FyZD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBudWxsO1xyXG5cclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIERBU0hCT0FSRF9NT0RFX0tFWSArIHRoaXMucmVwb3J0SWQ7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXNoYm9hcmQ/LnJlZnJlc2goKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZVJlZHVuZGFudFRvb2xib3hJdGVtcyhjb250cm9sOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKSB7XHJcbiAgY29uc3QgaXRlbXNUb1JlbW92ZSA9IFsnY3JlYXRlLWRhc2hib2FyZCcsICdvcGVuLWRhc2hib2FyZCddO1xyXG4gIGNvbnN0IHRvb2xib3ggPSBjb250cm9sLmZpbmRFeHRlbnNpb24oJ3Rvb2xib3gnKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5EZXNpZ25lci5Ub29sYm94RXh0ZW5zaW9uO1xyXG4gIGl0ZW1zVG9SZW1vdmUuZm9yRWFjaCgoaXRlbUlkKSA9PiB7XHJcbiAgICBjb25zdCBpdGVtID0gdG9vbGJveC5tZW51SXRlbXMoKS5maWx0ZXIoKGkpID0+IGkuaWQgPT09IGl0ZW1JZClbMF07XHJcblxyXG4gICAgaWYgKGl0ZW0pIHtcclxuICAgICAgdG9vbGJveC5yZW1vdmVNZW51SXRlbShpdGVtSWQpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJUmVwb3J0UGFyYW1zLCBNb2RlIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IElSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdhbnR0Q2hhcnRPcHRpb25zIHtcclxuICBjaGFydFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIGdhbnR0UmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHNob3dIZWFkZXI6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRUYXNrIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIFBhcmVudElkOiBudW1iZXI7XHJcbiAgVGl0bGU6IHN0cmluZztcclxuICBTdGFydDogRGF0ZTtcclxuICBFbmQ6IERhdGU7XHJcbiAgUHJvZ3Jlc3M6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dERlcGVuZGVuY3lcclxue1xyXG4gIElkOiBudW1iZXI7XHJcbiAgUHJlZGVjZXNzb3JJZDogbnVtYmVyO1xyXG4gIFN1Y2Nlc3NvcklkOiBudW1iZXI7XHJcbiAgVHlwZTogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0UmVzb3VyY2Uge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgVGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0UmVzb3VyY2VBc3NpZ25tZW50IHtcclxuICBJZDogbnVtYmVyO1xyXG4gIFRhc2tJZDogbnVtYmVyO1xyXG4gIFJlc291cmNlSWQ6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dENoYXJ0RGF0YU1vZGVsIHtcclxuICBUYXNrczogSUdhbnR0VGFza1tdO1xyXG4gIERlcGVuZGVuY2llczogSUdhbnR0RGVwZW5kZW5jeVtdO1xyXG4gIFJlc291cmNlczogSUdhbnR0UmVzb3VyY2VbXTtcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRzOiBJR2FudHRSZXNvdXJjZUFzc2lnbm1lbnRbXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dENvbHVtblN0YXRlIHtcclxuICBkYXRhRmllbGQ/OiBzdHJpbmc7XHJcbiAgZGF0YVR5cGU/OiBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlO1xyXG4gIHdpZHRoPzogc3RyaW5nO1xyXG4gIHNvcnRJbmRleD86IG51bWJlcjtcclxuICBzb3J0T3JkZXI/OiBzdHJpbmc7XHJcbiAgY2FwdGlvbj86IHN0cmluZztcclxuICB2aXNpYmxlPzogYm9vbGVhbjtcclxuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XHJcbiAgdGFza0NvbHVtblR5cGU6IEdhbnR0VGFza3NDb2x1bW5UeXBlO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0U2V0dGluZ3Mge1xyXG4gIFRhc2tDb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdLFxyXG4gIERiQ29ubmVjdGlvbk5hbWU6IHN0cmluZyxcclxuICBUYWJsZU5hbWU6IHN0cmluZyxcclxuICBSZXNvdXJjZXNUYWJsZU5hbWU6IHN0cmluZyxcclxuICBSZXNvdXJjZXNLZXlGaWVsZDogc3RyaW5nLFxyXG4gIFJlc291cmNlc1RleHRGaWVsZDogc3RyaW5nLFxyXG4gIFJlc291cmNlQXNzaWdubWVudFRhYmxlTmFtZTogc3RyaW5nO1xyXG4gIFJlc291cmNlQXNzaWdubWVudEtleUZpZWxkOiBzdHJpbmc7XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGQ6IHN0cmluZztcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQ6IHN0cmluZztcclxuICBEZXBlbmRlbmNpZXNUYWJsZU5hbWU6IHN0cmluZztcclxuICBEZXBlbmRlbmNpZXNLZXlGaWVsZDogc3RyaW5nO1xyXG4gIERlcGVuZGVuY2llc1ByZWRlY2Vzc29ySWRGaWVsZDogc3RyaW5nO1xyXG4gIERlcGVuZGVuY2llc1N1Y2Nlc3NvcklkRmllbGQ6IHN0cmluZztcclxuICBEZXBlbmRlbmNpZXNUeXBlRmllbGQ6IHN0cmluZztcclxuXHJcbiAgVGFza1RpdGxlUG9zaXRpb246IERldkV4cHJlc3MudWkuZHhHYW50dC5HYW50dFRhc2tUaXRsZVBvc2l0aW9uO1xyXG4gIFNjYWxlVHlwZTogRGV2RXhwcmVzcy51aS5keEdhbnR0LkdhbnR0U2NhbGVUeXBlO1xyXG4gIFN0YXJ0RGF0ZVJhbmdlOiBzdHJpbmc7XHJcbiAgRW5kRGF0ZVJhbmdlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmVudW0gR2FudHRUYXNrc0NvbHVtblR5cGVcclxue1xyXG4gIEtleSA9IDEsXHJcbiAgVGl0bGUgPSAyLFxyXG4gIFN0YXJ0ID0gMyxcclxuICBFbmQgPSA0LFxyXG4gIFBhcmVudElkID0gNSxcclxuICBQcm9ncmVzcyA9IDZcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FubnRDaGFydCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIERlc2lnbmVyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IENIQVJUX1NUT1JBR0VfTU9ERV9LRVkgPSAnQ0hBUlRfU1RPUkFHRV9NT0RFX0tFWSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdhbnR0UmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0hlYWRlcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9kZTogTW9kZTtcclxuICBwcml2YXRlIGhhc0Zvcm0gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBjaGFydDogRGV2RXhwcmVzcy51aS5keEdhbnR0IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHYW50dENoYXJ0T3B0aW9ucykge1xyXG4gICAgdGhpcy5jaGFydFBvc2l0aW9uTWFya2VyID0gb3B0aW9ucy5jaGFydFBvc2l0aW9uTWFya2VyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybCA9IG9wdGlvbnMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsO1xyXG4gICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyO1xyXG4gICAgdGhpcy5tb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCBnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncyA9IHtcclxuICAgICAgRGJDb25uZWN0aW9uTmFtZTogJycsIFRhYmxlTmFtZTogJycsIFRhc2tDb2x1bW5zOiBbXSxcclxuICAgICAgUmVzb3VyY2VzVGFibGVOYW1lOiAnJywgUmVzb3VyY2VzVGV4dEZpZWxkOiAnJywgUmVzb3VyY2VzS2V5RmllbGQ6ICcnLFxyXG4gICAgICBSZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudEtleUZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50VGFibGVOYW1lOiAnJyxcclxuICAgICAgRGVwZW5kZW5jaWVzS2V5RmllbGQ6ICcnLCBEZXBlbmRlbmNpZXNQcmVkZWNlc3NvcklkRmllbGQ6ICcnLCBEZXBlbmRlbmNpZXNTdWNjZXNzb3JJZEZpZWxkOiAnJywgRGVwZW5kZW5jaWVzVGFibGVOYW1lOiAnJywgRGVwZW5kZW5jaWVzVHlwZUZpZWxkOiAnJyxcclxuICAgICAgRW5kRGF0ZVJhbmdlOiB2b2lkIDAsIFN0YXJ0RGF0ZVJhbmdlOiB2b2lkIDAsIFRhc2tUaXRsZVBvc2l0aW9uOiAnb3V0c2lkZScsIFNjYWxlVHlwZTogJ2F1dG8nXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbnM6IElHYW50dENvbHVtblN0YXRlW10gPSBbXTtcclxuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gICAgc2VuZFJlcXVlc3QoYCR7dGhpcy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldEdhbnR0Q2hhcnRTZXR0aW5nc2AsICdwb3N0JywgeyBpZDogdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgfSwgZmFsc2UsIHsgZGF0YVR5cGU6ICdqc29uJyB9KVxyXG4gICAgICAudGhlbigoZGF0YTogSUdhbnR0U2V0dGluZ3MpID0+IHtcclxuICAgICAgICBnYW50dFNldHRpbmdzID0gZGF0YTtcclxuXHJcbiAgICAgICAgaWYoIWdhbnR0U2V0dGluZ3MuRGJDb25uZWN0aW9uTmFtZSB8fCAhZ2FudHRTZXR0aW5ncy5UYWJsZU5hbWUgfHwgIWdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMgfHwgIWdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zID0gW107XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSA9IDA7IGl0ZW0gPCA2OyBpdGVtKyspIHtcclxuICAgICAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucy5wdXNoKHsgdGFza0NvbHVtblR5cGU6IEdhbnR0VGFza3NDb2x1bW5UeXBlW0dhbnR0VGFza3NDb2x1bW5UeXBlW2l0ZW0rMV1dIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3MsIHRydWUpO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGEuVGFza0NvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgY29sdW1uc1tjLnRhc2tDb2x1bW5UeXBlLTFdID0gYztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyA9IGNvbHVtbnM7XHJcblxyXG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaERhdGEoKTtcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKGRhdGE6IHsgRGF0YTogSUdhbnR0Q2hhcnREYXRhTW9kZWwgfSkgPT4ge1xyXG4gICAgICAgIGlmKCFpc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLm1vZGUgPT09IE1vZGUuRGVzaWduZXIpIHtcclxuICAgICAgICAgIHRoaXMuc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3MsICFpc0luaXRpYWxpemVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dXBDaGFydChjb2x1bW5zLCBnYW50dFNldHRpbmdzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YS5EYXRhKTtcclxuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3MsIHRydWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHRoaXMuaW5pdFN3aXRjaE1vZGVCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLmRpYWdyYW0tZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZldGNoRGF0YSgpIHtcclxuICAgIHJldHVybiBzZW5kUmVxdWVzdChgJHt0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybH0vR2V0R2FudHRDaGFydERhdGFgLCAncG9zdCcsIHsgaWQ6IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkIH0sIGZhbHNlLCB7XHJcbiAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3dpdGNoTW9kZUJ1dHRvbigpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgIHRleHQ6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCB0aGlzLm1vZGUpO1xyXG4gICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwRm9ybShnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncywgaW5pdGlhbFNldHVwOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmhhc0Zvcm0gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IGZvcm1JdGVtczogRGV2RXhwcmVzcy51aS5keEZvcm0uSXRlbVtdID0gW1xyXG4gICAgICB7IGRhdGFGaWVsZDogJ0RiQ29ubmVjdGlvbk5hbWUnLCBjYXB0aW9uOiAnQ29ubmVjdGlvbiBOYW1lJyB9LFxyXG4gICAgICB7IGRhdGFGaWVsZDogJ1RhYmxlTmFtZScsIGNhcHRpb246ICdUYWJsZScgfSxcclxuICAgIF07XHJcblxyXG4gICAgZm9yIChsZXQgaXRlbSA9IDE7IGl0ZW0gPCA3OyBpdGVtKyspIHtcclxuICAgICAgZm9ybUl0ZW1zLnB1c2goeyBpdGVtVHlwZTogJ2dyb3VwJywgY29sQ291bnQ6IDgsIGl0ZW1zOiBbXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0udGFza0NvbHVtblR5cGVgLCB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLmRhdGFGaWVsZGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogYCR7R2FudHRUYXNrc0NvbHVtblR5cGVbaXRlbV19IERhdGEgRmllbGRgIH0gfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5jYXB0aW9uYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnQ2FwdGlvbicgfSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLmRhdGFUeXBlYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnRGF0YVR5cGUnIH0gfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS53aWR0aGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1dpZHRoJyB9LCBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uc29ydEluZGV4YCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnU29ydEluZGV4JyB9LCBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uc29ydE9yZGVyYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnU29ydE9yZGVyJyB9LCBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLCBlZGl0b3JPcHRpb25zOiB7IGl0ZW1zOiBbJ2FzYycsICdkZXNjJ10sIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllcyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnZpc2libGVgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdWaXNpYmxlJyB9LCBlZGl0b3JUeXBlOiAnZHhDaGVja0JveCcgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS52aXNpYmxlSW5kZXhgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdWaXNpYmxlSW5kZXgnIH0gfSxcclxuICAgICAgICBdXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKHtcclxuICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgIGNhcHRpb246ICdSZXNvdXJjZXMnLFxyXG4gICAgICBjb2xDb3VudDogNCxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlc1RhYmxlTmFtZScsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyAsdGV4dDogJ1RhYmxlJyB9LCBjb2xTcGFuOiAyIH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZXNLZXlGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0tleSBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VzVGV4dEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGV4dCBGaWVsZCcgfSB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICBjYXB0aW9uOiAnUmVzb3VyY2UgQXNzaWdubWVudHMnLFxyXG4gICAgICBjb2xDb3VudDogNSxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudFRhYmxlTmFtZScsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1RhYmxlJyB9LCBjb2xTcGFuOiAyIH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0tleSBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYXNrIElkIEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdSZXNvdXJjZSBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICBjYXB0aW9uOiAnRGVwZW5kZW5jaWVzJyxcclxuICAgICAgY29sQ291bnQ6IDYsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdEZXBlbmRlbmNpZXNUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnRGVwZW5kZW5jaWVzS2V5RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdLZXkgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ0RlcGVuZGVuY2llc1ByZWRlY2Vzc29ySWRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1ByZWRlY2Vzc29yIElkIEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdEZXBlbmRlbmNpZXNTdWNjZXNzb3JJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnU3VjY2Vzc29yIElkIEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdEZXBlbmRlbmNpZXNUeXBlRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdEZXBlbmRlbmN5IFR5cGUgRmllbGQnIH0gfVxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnYnV0dG9uJyxcclxuICAgICAgYnV0dG9uT3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdTYXZlJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnNhdmVGb3JtRGF0YShmb3JtKS50aGVuKCgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goXHJcbiAgICAgIHtcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBjYXB0aW9uOiAnQXBwZWFyYW5jZScsXHJcbiAgICAgICAgY29sQ291bnQ6IDUsXHJcbiAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnVGFza1RpdGxlUG9zaXRpb24nLFxyXG4gICAgICAgICAgICBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgfSxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGl0ZW1zOiBbJ2luc2lkZScsICdvdXRzaWRlJywgJ25vbmUnXVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnU2NhbGVUeXBlJyxcclxuICAgICAgICAgICAgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnIH0sXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBpdGVtczogWydhdXRvJywgJ21pbnV0ZXMnLCAnaG91cnMnLCAnZGF5cycsICd3ZWVrcycsICdtb250aHMnLCAncXVhcnRlcnMnLCAneWVhcnMnXVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnU3RhcnREYXRlUmFuZ2UnLFxyXG4gICAgICAgICAgICBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgfSxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4RGF0ZUJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgc2hvd0NsZWFyQnV0dG9uOiB0cnVlIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGVCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnRW5kRGF0ZVJhbmdlJyxcclxuICAgICAgICAgICAgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnIH0sXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeERhdGVCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IHNob3dDbGVhckJ1dHRvbjogdHJ1ZSB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRlQm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW1UeXBlOiAnYnV0dG9uJyxcclxuICAgICAgICAgICAgYnV0dG9uT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdVcGRhdGUnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCF0aGlzLmNoYXJ0KSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0LmJlZ2luVXBkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Lm9wdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgIHNjYWxlVHlwZTogZGF0YS5TY2FsZVR5cGUsXHJcbiAgICAgICAgICAgICAgICAgIHRhc2tUaXRsZVBvc2l0aW9uOiBkYXRhLlRhc2tUaXRsZVBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICBzdGFydERhdGVSYW5nZTogZGF0YS5TdGFydERhdGVSYW5nZSA/IG5ldyBEYXRlKGRhdGEuU3RhcnREYXRlUmFuZ2UpIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgZW5kRGF0ZVJhbmdlOiBkYXRhLkVuZERhdGVSYW5nZSA/IG5ldyBEYXRlKGRhdGEuRW5kRGF0ZVJhbmdlKSA6IG51bGxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnQuZW5kVXBkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0LnJlcGFpbnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtRGF0YShmb3JtKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZm9ybSA9ICQoJzxkaXYgLz4nKS5jc3MoJ3BhZGRpbmcnLCAyMCkuaW5zZXJ0QWZ0ZXIodGhpcy5jaGFydFBvc2l0aW9uTWFya2VyKS5keEZvcm0oe1xyXG4gICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICBoZWlnaHQ6IGluaXRpYWxTZXR1cCA/ICdjYWxjKDEwMCUgLSA1MHB4KScgOiAnY2FsYyg1MCUgLSA1MHB4KScsXHJcbiAgICAgIGZvcm1EYXRhOiBnYW50dFNldHRpbmdzLFxyXG4gICAgICBzY3JvbGxpbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgICBpdGVtczogZm9ybUl0ZW1zXHJcbiAgICB9KS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNhdmVGb3JtRGF0YShmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSkge1xyXG4gICAgY29uc3QgZGF0YSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpIGFzIElHYW50dFNldHRpbmdzO1xyXG5cclxuICAgIGlmIChkYXRhLlRhc2tDb2x1bW5zKSB7XHJcbiAgICAgIGRhdGEuVGFza0NvbHVtbnMgPSBkYXRhLlRhc2tDb2x1bW5zLmZpbHRlcigoYykgPT4gISFjLmRhdGFGaWVsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9VcGRhdGVHYW50dENoYXJ0U2V0dGluZ3NgLCAncG9zdCcsIHtcclxuICAgICAgaWQ6IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLFxyXG4gICAgICBzZXR0aW5nczogSlNPTi5zdHJpbmdpZnkoZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykpXHJcbiAgICB9LCB0cnVlLCB7IGRhdGFUeXBlOiAnanNvbicgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwQ2hhcnQgKGNvbHVtbnM6IElHYW50dENvbHVtblN0YXRlW10sIGdhbnR0U2V0dGluZ3M6IElHYW50dFNldHRpbmdzKSB7XHJcbiAgICBsZXQgdG90YWxXaWR0aCA9IDA7XHJcbiAgICBsZXQgdXNlQXV0b1dpZHRoID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgY29sdW1uc01hcHBpbmcgPSB7fTtcclxuXHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgaWYgKGMudGFza0NvbHVtblR5cGUpIHtcclxuICAgICAgICBjb2x1bW5zTWFwcGluZ1tjLnRhc2tDb2x1bW5UeXBlXSA9IGMuZGF0YUZpZWxkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgIGNvbnN0IHcgPSBwYXJzZUludChjLndpZHRoKTtcclxuXHJcbiAgICAgIGlmKCFpc05hTih3KSkge1xyXG4gICAgICAgIHRvdGFsV2lkdGggKz0gdztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1c2VBdXRvV2lkdGggPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNoYXJ0ID0gdGhpcy5jaGFydFBvc2l0aW9uTWFya2VyLmR4R2FudHQoe1xyXG4gICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuaGFzRm9ybSA/ICc1MCUnIDogJ2NhbGMoMTAwJSAtIDYwcHgpJyxcclxuICAgICAgZmlyc3REYXlPZldlZWs6IDYsXHJcbiAgICAgIHRhc2tMaXN0V2lkdGg6ICghdXNlQXV0b1dpZHRoICYmIHRvdGFsV2lkdGggPiAwKSA/IHRvdGFsV2lkdGggOiB2b2lkIDAsXHJcbiAgICAgIHRvb2xiYXI6IHtcclxuICAgICAgICBpdGVtczogWyd6b29tSW4nLCAnem9vbU91dCcsICdzZXBhcmF0b3InLCAndGFza0RldGFpbHMnXVxyXG4gICAgICB9LFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBzdGFydERhdGVSYW5nZTogZ2FudHRTZXR0aW5ncy5TdGFydERhdGVSYW5nZSA/IG5ldyBEYXRlKGdhbnR0U2V0dGluZ3MuU3RhcnREYXRlUmFuZ2UpIDogdm9pZCAwLFxyXG4gICAgICBlbmREYXRlUmFuZ2U6IGdhbnR0U2V0dGluZ3MuRW5kRGF0ZVJhbmdlID8gbmV3IERhdGUoZ2FudHRTZXR0aW5ncy5FbmREYXRlUmFuZ2UpIDogdm9pZCAwLFxyXG4gICAgICBzY2FsZVR5cGU6IGdhbnR0U2V0dGluZ3MuU2NhbGVUeXBlLFxyXG4gICAgICB0YXNrVGl0bGVQb3NpdGlvbjogZ2FudHRTZXR0aW5ncy5UYXNrVGl0bGVQb3NpdGlvbixcclxuICAgICAgY29sdW1uczogY29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogYy5kYXRhRmllbGQsXHJcbiAgICAgICAgICBkYXRhVHlwZTogYy5kYXRhVHlwZSxcclxuICAgICAgICAgIHdpZHRoOiBjLndpZHRoLFxyXG4gICAgICAgICAgdmlzaWJsZUluZGV4OiBjLnZpc2libGVJbmRleCxcclxuICAgICAgICAgIHNvcnRJbmRleDogYy5zb3J0SW5kZXgsXHJcbiAgICAgICAgICBzb3J0T3JkZXI6IGMuc29ydE9yZGVyICYmIChjLnNvcnRPcmRlciA9PT0gJ2FzYycgPyAnYXNjJyA6ICdkZXNjJyksXHJcbiAgICAgICAgICBjYXB0aW9uOiBjLmNhcHRpb24gfHwgdm9pZCAwXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RDb2x1bW5cclxuICAgICAgfSksXHJcbiAgICAgIHRhc2tzOiB7XHJcbiAgICAgICAga2V5RXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuS2V5XSxcclxuICAgICAgICBzdGFydEV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlN0YXJ0XSxcclxuICAgICAgICBlbmRFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5FbmRdLFxyXG4gICAgICAgIHBhcmVudElkRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuUGFyZW50SWRdLFxyXG4gICAgICAgIHByb2dyZXNzRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuUHJvZ3Jlc3NdLFxyXG4gICAgICAgIHRpdGxlRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuVGl0bGVdXHJcbiAgICAgIH0sXHJcbiAgICAgIGRlcGVuZGVuY2llczoge1xyXG4gICAgICAgIGtleUV4cHI6IGdhbnR0U2V0dGluZ3MuRGVwZW5kZW5jaWVzS2V5RmllbGQsXHJcbiAgICAgICAgcHJlZGVjZXNzb3JJZEV4cHI6IGdhbnR0U2V0dGluZ3MuRGVwZW5kZW5jaWVzUHJlZGVjZXNzb3JJZEZpZWxkLFxyXG4gICAgICAgIHN1Y2Nlc3NvcklkRXhwcjogZ2FudHRTZXR0aW5ncy5EZXBlbmRlbmNpZXNTdWNjZXNzb3JJZEZpZWxkLFxyXG4gICAgICAgIHR5cGVFeHByOiBnYW50dFNldHRpbmdzLkRlcGVuZGVuY2llc1R5cGVGaWVsZFxyXG4gICAgICB9LFxyXG4gICAgICByZXNvdXJjZXM6IHtcclxuICAgICAgICBrZXlFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlc0tleUZpZWxkLFxyXG4gICAgICAgIHRleHRFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlc1RleHRGaWVsZFxyXG4gICAgICB9LFxyXG4gICAgICByZXNvdXJjZUFzc2lnbm1lbnRzOiB7XHJcbiAgICAgICAga2V5RXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZCxcclxuICAgICAgICByZXNvdXJjZUlkRXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQsXHJcbiAgICAgICAgdGFza0lkRXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZFxyXG4gICAgICB9LFxyXG4gICAgfSkuZHhHYW50dCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gJiYgbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZURhdGEoZGF0YTogSUdhbnR0Q2hhcnREYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgIGlmKCF0aGlzLmNoYXJ0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNoYXJ0Lm9wdGlvbigndGFza3MuZGF0YVNvdXJjZScsIGRhdGEuVGFza3MpO1xyXG4gICAgdGhpcy5jaGFydC5vcHRpb24oJ2RlcGVuZGVuY2llcy5kYXRhU291cmNlJywgZGF0YS5EZXBlbmRlbmNpZXMpO1xyXG4gICAgdGhpcy5jaGFydC5vcHRpb24oJ3Jlc291cmNlcy5kYXRhU291cmNlJywgZGF0YS5SZXNvdXJjZXMpO1xyXG4gICAgdGhpcy5jaGFydC5vcHRpb24oJ3Jlc291cmNlQXNzaWdubWVudHMuZGF0YVNvdXJjZScsIGRhdGEuUmVzb3VyY2VBc3NpZ25tZW50cyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZmV0Y2hEYXRhKCkudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YS5EYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoYXJ0Py5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmNoYXJ0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuQ0hBUlRfU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuY29uc3QgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIERlc2lnbmVyJztcclxuY29uc3QgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBWaWV3ZXInO1xyXG5jb25zdCBTRVNTSU9OX1NUT1JBR0VfTU9ERV9LRVkgPSAncmVwb3J0TW9kZSc7XHJcbmNvbnN0IENVUlJFTlRfVVJMX0tFWSA9ICdjdXN0b21DdXJyZW50VXJsJztcclxuXHJcbmRlY2xhcmUgY29uc3QgZHhSZXBvcnREZXNpZ25lcjogYW55O1xyXG5jb25zdCBrbyA9ICh3aW5kb3cgYXMgYW55KS5rbztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJlcG9ydE9wdGlvbnMge1xyXG4gICRyZXBvcnRDb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGRlc2lnbmVyTW9kZWxVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0IGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcmVwb3J0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRJZDogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVJlcG9ydE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJHJlcG9ydENvbnRhaW5lciA9IG9wdGlvbnMuJHJlcG9ydENvbnRhaW5lcjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xyXG4gICAgdGhpcy5kZXNpZ25lck1vZGVsVXJsID0gb3B0aW9ucy5kZXNpZ25lck1vZGVsVXJsO1xyXG4gICAgdGhpcy5yZXBvcnRJZCA9IG9wdGlvbnMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxuXHJcbiAgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCBtb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcbiAgICBsZXQgYnV0dG9uID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiBtb2RlID09PSBNb2RlLlZpZXdlciA/IFNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIG1vZGUgPSBtb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCBtb2RlKTtcclxuICAgICAgICAgIHRoaXMuc3dpdGNoTW9kZShtb2RlLCBidXR0b24pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNyZWF0ZVJlcG9ydERlc2lnbmVyKHRoaXMuJHJlcG9ydENvbnRhaW5lciwgdGhpcy5kZXNpZ25lck1vZGVsVXJsLCAnZHhSZXBvcnREZXNpZ25lcicsIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLnRvU3RyaW5nKCksIChzKSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU3dpdGNoTW9kZUJ1dHRvbihtb2RlLCBidXR0b24pO1xyXG4gICAgICB9KTtcclxuICAgIH0sIG1vZGUgPT09IE1vZGUuVmlld2VyKTtcclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKGUpID0+IHtcclxuICAgICAgY29uc3QgaXNOb3RTYXZlZFJlcG9ydCA9IGR4UmVwb3J0RGVzaWduZXIgJiYgZHhSZXBvcnREZXNpZ25lci5HZXREZXNpZ25lck1vZGVsKCkgJiYgZHhSZXBvcnREZXNpZ25lci5HZXREZXNpZ25lck1vZGVsKCkuaXNEaXJ0eTtcclxuXHJcbiAgICAgIGlmIChpc05vdFNhdmVkUmVwb3J0KSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUucmV0dXJuVmFsdWUgPSAnVGhlIHJlcG9ydCBkb2N1bWVudCBpcyBub3Qgc2F2ZWQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsZWF2ZSB0aGUgcGFnZT8nO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3ZlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplUHJldmlldyhkZXNpZ25lcikge1xyXG4gICAgY29uc3QgcmVwb3J0UHJldmlldyA9IGRlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXc7XHJcbiAgICBjb25zdCBSZXBvcnRQcmV2aWV3U2VydmljZSA9IChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLkRlc2lnbmVyLkludGVybmFsLlJlcG9ydFByZXZpZXdTZXJ2aWNlO1xyXG5cclxuICAgIHJlcG9ydFByZXZpZXcuaW5pdGlhbGl6ZShSZXBvcnRQcmV2aWV3U2VydmljZS5pbml0aWFsaXplUHJldmlldyhkZXNpZ25lci5kZXNpZ25lck1vZGVsLm1vZGVsKCkpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3dpdGNoTW9kZShtb2RlOiBNb2RlLCBidXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24pIHtcclxuICAgIGlmIChtb2RlID09PSBNb2RlLlZpZXdlcikge1xyXG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcucHJldmlld1Zpc2libGUgPSB0cnVlO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVQcmV2aWV3KGR4UmVwb3J0RGVzaWduZXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZHhSZXBvcnREZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgIGR4UmVwb3J0RGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5kZWFjdGl2YXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGUsIGJ1dHRvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVN3aXRjaE1vZGVCdXR0b24obW9kZTogTW9kZSwgYnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKSB7XHJcbiAgICBpZiAoYnV0dG9uKSB7XHJcbiAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCBtb2RlID09PSBNb2RlLlZpZXdlciA/IFNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUmVwb3J0RGVzaWduZXIoXHJcbiAgICAkcmVwb3J0Q29udGFpbmVyOiBKUXVlcnksXHJcbiAgICBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmcsXHJcbiAgICBnbG9iYWxOYW1lOiBzdHJpbmcsXHJcbiAgICByZXBvcnRJZFN0cjogc3RyaW5nLFxyXG4gICAgb25Jbml0SGFuZGxlcjogKHNlbmRlcjogYW55KSA9PiB2b2lkLFxyXG4gICAgaXNQcmV2aWV3TW9kZTogYm9vbGVhblxyXG4gICk6IEpRdWVyeTxIVE1MRWxlbWVudD4ge1xyXG4gICAgY29uc3QgZGVzaWduZXIgPSAkcmVwb3J0Q29udGFpbmVyXHJcbiAgICAgIC5hdHRyKCdkYXRhLWJpbmQnLCAnZHhSZXBvcnREZXNpZ25lcjogZGVzaWduZXJPcHRpb25zJylcclxuICAgICAgLmFkZENsYXNzKCdyZXBvcnQtZGVzaWduZXInKTtcclxuXHJcbiAgICBjb25zdCBkZXNpZ25lck9wdGlvbnMgPSB7XHJcbiAgICAgIHJlcG9ydFVybDogcmVwb3J0SWRTdHIsXHJcbiAgICAgIHJlcXVlc3RPcHRpb25zOiB7XHJcbiAgICAgICAgZ2V0RGVzaWduZXJNb2RlbEFjdGlvbjogZGVzaWduZXJNb2RlbFVybFxyXG4gICAgICB9LFxyXG4gICAgICBjYWxsYmFja3M6IHtcclxuICAgICAgICBCZWZvcmVSZW5kZXI6IChzKSA9PiB7XHJcbiAgICAgICAgICAod2luZG93IGFzIGFueSlbZ2xvYmFsTmFtZV0gPSBzO1xyXG5cclxuICAgICAgICAgIGlmIChpc1ByZXZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHMuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5wcmV2aWV3VmlzaWJsZSA9IHRydWUgO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIG9uSW5pdEhhbmRsZXIocyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBDdXN0b21pemVNZW51QWN0aW9uczogdGhpcy5DdXN0b21pemVNZW51QWN0aW9ucyxcclxuICAgICAgICBQcmV2aWV3Q3VzdG9taXplTWVudUFjdGlvbnM6IHRoaXMuUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zLFxyXG4gICAgICAgIFJlcG9ydE9wZW5lZDogKHMsIGUpID0+IHtcclxuICAgICAgICAgIGlmIChpc1ByZXZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVByZXZpZXcocyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5SZXBvcnRPcGVuZWQocywgZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBSZXBvcnRUYWJDbG9zZWQ6IHRoaXMuUmVwb3J0VGFiQ2xvc2VkXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAga28uYXBwbHlCaW5kaW5ncyh7IGRlc2lnbmVyT3B0aW9ucyB9LCBkZXNpZ25lclswXSk7XHJcblxyXG4gICAgcmV0dXJuIGRlc2lnbmVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBQcmV2aWV3Q3VzdG9taXplTWVudUFjdGlvbnMocywgZSkge1xyXG4gICAgY29uc3Qgc2hvd0Rlc2lnbmVySXRlbSA9IGUuR2V0QnlJZCgoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5WaWV3ZXIuQWN0aW9uSWQuRGVzaWduKTtcclxuXHJcbiAgICBpZiAoc2hvd0Rlc2lnbmVySXRlbSkge1xyXG4gICAgICBzaG93RGVzaWduZXJJdGVtLnZpc2libGUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgQ3VzdG9taXplTWVudUFjdGlvbnMocywgZSkge1xyXG4gICAgY29uc3QgQWN0aW9uSWQgPSAoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5EZXNpZ25lci5BY3Rpb25zLkFjdGlvbklkO1xyXG4gICAgY29uc3QgYWN0aW9uSWRzVG9Nb3ZlSW5Ub29sYmFyOiBzdHJpbmdbXSA9IFtBY3Rpb25JZC5TYXZlXTtcclxuICAgIGNvbnN0IGFjdGlvbklkc1RvSGlkZTogc3RyaW5nW10gPSBbQWN0aW9uSWQuTmV3UmVwb3J0LCBBY3Rpb25JZC5OZXdSZXBvcnRWaWFXaXphcmQsIEFjdGlvbklkLk9wZW5SZXBvcnQsXHJcbiAgICAgIEFjdGlvbklkLlByZXZpZXcsIEFjdGlvbklkLlNhdmVBcywgQWN0aW9uSWQuRXhpdF07XHJcblxyXG4gICAgYWN0aW9uSWRzVG9Nb3ZlSW5Ub29sYmFyLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSBlLkdldEJ5SWQoaWQpO1xyXG5cclxuICAgICAgaWYgKGl0ZW0gJiYgKGl0ZW0uY29udGFpbmVyID09PSAnbWVudScpKSB7XHJcbiAgICAgICAgaXRlbS5jb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGFjdGlvbklkc1RvSGlkZS5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gZS5HZXRCeUlkKGlkKTtcclxuXHJcbiAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgaXRlbS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHNhdmVBY3Rpb24gPSBlLkdldEJ5SWQoKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuQWN0aW9ucy5BY3Rpb25JZC5TYXZlKTtcclxuICAgIGNvbnN0IG9yaWdDbGlja0FjdGlvbiA9IHNhdmVBY3Rpb24uY2xpY2tBY3Rpb247XHJcbiAgICBzYXZlQWN0aW9uLmNsaWNrQWN0aW9uID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCB0YWIgPSBzLkdldEN1cnJlbnRUYWIoKTtcclxuICAgICAgdGFiLnVybChrby51bndyYXAoc1tDVVJSRU5UX1VSTF9LRVldKSk7XHJcbiAgICAgIG9yaWdDbGlja0FjdGlvbigpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUmVwb3J0T3BlbmVkKHMsIGUpIHtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXSA9IHNbQ1VSUkVOVF9VUkxfS0VZXSB8fCBrby5vYnNlcnZhYmxlKCk7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0oZS5VcmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBSZXBvcnRUYWJDbG9zZWQocywgZSkge1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldID0gc1tDVVJSRU5UX1VSTF9LRVldIHx8IGtvLm9ic2VydmFibGUoKTtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXShudWxsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFNFU1NJT05fU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQgeyBJUmVwb3J0UGFyYW1zLCBNb2RlIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpYWdyYW1QYWdlT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgZGlhZ3JhbUNvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWFncmFtUGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBEZXNpZ25lcic7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fVklFV0VSX1RFWFQgPSAnU3dpdGNoIHRvIFZpZXdlcic7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBESUFHUkFNX1NUT1JBR0VfTU9ERV9LRVkgPSAnRElBR1JBTV9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaWFncmFtQ29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBtb2RlOiBNb2RlO1xyXG4gIHByaXZhdGUgZGlhZ3JhbTogRGV2RXhwcmVzcy51aS5keERpYWdyYW07XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlZnJlc2hCdXR0b246IFJlZnJlc2hCdXR0b247XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEaWFncmFtUGFnZU9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uID0gb3B0aW9ucy5hZGRSZWZyZXNoQnV0dG9uO1xyXG4gICAgdGhpcy5kaWFncmFtQ29udHJvbGxlclVybCA9IG9wdGlvbnMuZGlhZ3JhbUNvbnRyb2xsZXJVcmw7XHJcblxyXG4gICAgdGhpcy5tb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMuY3JlYXRlRGlhZ3JhbUNvbnRyb2woKTtcclxuICAgIHRoaXMuaW5pdERpYWdyYW0oKTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcuZGlhZ3JhbS1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5kaWFncmFtLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5kaWFncmFtID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpYWdyYW0gJiYgc2VuZFJlcXVlc3QoYCR7dGhpcy5kaWFncmFtQ29udHJvbGxlclVybH0/aWQ9JHt0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZH1gLCAnZ2V0JykudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRpYWdyYW0uaW1wb3J0KEpTT04uc3RyaW5naWZ5KGRhdGEpLCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnLCBmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGlhZ3JhbUNvbnRyb2woKSB7XHJcbiAgICB0aGlzLmRpYWdyYW0gPSB0aGlzLiRjb250YWluZXIuZHhEaWFncmFtKHtcclxuICAgICAgaGlzdG9yeVRvb2xiYXI6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbW1hbmRzOiBbJ3NlcGFyYXRvcicsICd1bmRvJywgJ3JlZG8nLCAnc2VwYXJhdG9yJywgeyBuYW1lOiAnc2F2ZScsIHRleHQ6ICdTYXZlJywgaWNvbjogJ3NhdmUnIH1dIGFzIGFueVxyXG4gICAgICB9LFxyXG4gICAgICBvbkN1c3RvbUNvbW1hbmQ6IChlKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChlLm5hbWUpIHtcclxuICAgICAgICAgIGNhc2UgJ3NhdmUnOlxyXG4gICAgICAgICAgICB0aGlzLnNhdmVSZXBvcnQoZS5jb21wb25lbnQuZXhwb3J0KCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGZ1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICByZWFkT25seTogdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlclxyXG4gICAgfSkuZHhEaWFncmFtKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0RGlhZ3JhbSgpIHtcclxuICAgIHNlbmRSZXF1ZXN0KGAke3RoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmx9P2lkPSR7dGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YCwgJ2dldCcpLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5kaWFncmFtLmltcG9ydChKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnLCBmYWxzZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5hZGRSZWZyZXNoQnV0dG9uKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaEJ1dHRvbiA9IG5ldyBSZWZyZXNoQnV0dG9uKCQoJy5yZXBvcnQtcmVmcmVzaC1idXR0b24nKSwgKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoZSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycpKSB7XHJcbiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9ICdUaGUgZG9jdW1lbnQgaXMgbm90IHNhdmVkLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbGVhdmUgdGhlIHBhZ2U/JztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTd2l0Y2hNb2RlQnV0dG9uKCkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kZSA9IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIHRoaXMubW9kZSk7XHJcbiAgICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbigncmVhZE9ubHknLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmVSZXBvcnQoc291cmNlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsLCAncG9zdCcsIHsgaWQsIHNvdXJjZSB9LCB0cnVlKTtcclxuICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkRJQUdSQU1fU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IHtNZW51SXRlbVR5cGV9IGZyb20gJy4uLy4uLy4uL0J1c2luZXNzJztcclxuaW1wb3J0IHtJQ2RtUmVwb3J0UGFyYW1zLCBJR3JpZFJlcG9ydFBhcmFtcywgSVJlcG9ydFBhcmFtc30gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCBSZWZyZXNoVGltZXIgZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgnO1xyXG5pbXBvcnQgRGFzaGJvYXJkUmVwb3J0UGFnZSBmcm9tICcuLi9EYXNoYm9hcmQvSW5kZXgnO1xyXG5pbXBvcnQgR2FudHRDaGFydCBmcm9tICcuLi9HYW5udENoYXJ0L0luZGV4JztcclxuaW1wb3J0IEdyaWRSZXBvcnRQYWdlIGZyb20gJy4uL0dyaWQvSW5kZXgnO1xyXG5pbXBvcnQgQ0RNUmVwb3J0UGFnZSBmcm9tICcuLi9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgRFhSZXBvcnRQYWdlIGZyb20gJy4uL1JlcG9ydC9JbmRleCc7XHJcbmltcG9ydCBEaWFncmFtUmVwb3J0UGFnZSBmcm9tICcuLi9EaWFncmFtL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU5lc3RlZFJlcG9ydCBleHRlbmRzIElSZXBvcnRQYXJhbXMge1xyXG4gIFR5cGU6IE1lbnVJdGVtVHlwZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2xpZGVzaG93UmVwb3J0UGFyYW1zIGV4dGVuZHMgSVJlcG9ydFBhcmFtcyB7XHJcbiAgUmVwb3J0czogSU5lc3RlZFJlcG9ydFtdO1xyXG4gIERlbGF5U2VjOiBudW1iZXI7XHJcbiAgUmVmcmVzaFNlYzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTbGlkZXNob3dSZXBvcnRQYWdlT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSVNsaWRlc2hvd1JlcG9ydFBhcmFtcztcclxuICBkZWZhdWx0UmVwb3J0U2V0dGluZ3M6IHsgW2tleSBpbiBNZW51SXRlbVR5cGVdOiBhbnk7IH07XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNsaWRlc2hvd1JlcG9ydFBhZ2UgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IElTbGlkZXNob3dSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcm9vdEVsZW1lbnQ6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRSZXBvcnRTZXR0aW5nczogeyBba2V5IGluIE1lbnVJdGVtVHlwZV06IGFueTsgfTtcclxuICBwcml2YXRlIHJlcG9ydHM6IElSZXBvcnRDb21wb25lbnRbXSA9IFtdO1xyXG4gIHByaXZhdGUgZHhHYWxsZXJ5OiBEZXZFeHByZXNzLnVpLmR4R2FsbGVyeTtcclxuICBwcml2YXRlIHJlZnJlc2hUaW1lcjogUmVmcmVzaFRpbWVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2xpZGVzaG93UmVwb3J0UGFnZU9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5ncyA9IG9wdGlvbnMuZGVmYXVsdFJlcG9ydFNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgaWYgKCEhdGhpcy5yZXBvcnRzKSB7XHJcbiAgICAgIHRoaXMucmVwb3J0cy5mb3JFYWNoKChyZXBvcnQpID0+IHtcclxuICAgICAgICByZXBvcnQuZGlzcG9zZSgpO1xyXG4gICAgICB9KTtcclxuICAgICAgd2hpbGUgKHRoaXMucmVwb3J0cy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnJlcG9ydHMucG9wKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZXBvcnRzID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICghIXRoaXMucmVmcmVzaFRpbWVyKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyLmRpc3Bvc2UoKTtcclxuICAgICAgdGhpcy5yZWZyZXNoVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlcG9ydHMgJiYgdGhpcy5yZXBvcnRzLmZvckVhY2goKHJlcG9ydCkgPT4ge1xyXG4gICAgICByZXBvcnQucmVmcmVzaCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvbnRlbnQoKSB7XHJcbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcclxuICAgIGxldCBjdXJyZW50VGltZW91dCA9IG51bGw7XHJcbiAgICBjb25zdCBtYXhJbmRleCA9IHRoaXMub3B0aW9ucy5SZXBvcnRzLmxlbmd0aDtcclxuXHJcbiAgICBjb25zdCBzZXR1cE5leHRJdGVtU2VsZWN0ID0gKCkgPT4ge1xyXG4gICAgICBjdXJyZW50VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBsZXQgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcclxuXHJcbiAgICAgICAgaWYobmV4dEluZGV4ID49IG1heEluZGV4KSB7XHJcbiAgICAgICAgICBuZXh0SW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5keEdhbGxlcnkuZ29Ub0l0ZW0obmV4dEluZGV4LCB0cnVlKTtcclxuICAgICAgfSwgdGhpcy5vcHRpb25zLkRlbGF5U2VjICogMTAwMCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0ICR2aWV3ID0gJCgnPGRpdiAvPicpLmF0dHIoeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnQnIH0pLmFwcGVuZFRvKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuICAgIGNvbnN0ICRnYWxsZXJ5ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19nYWxsZXJ5JyB9KS5keEdhbGxlcnkoe1xyXG4gICAgICBsb29wOiBmYWxzZSxcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5vcHRpb25zLlJlcG9ydHMsXHJcbiAgICAgIHNsaWRlc2hvd0RlbGF5OiAwLFxyXG4gICAgICBzaG93TmF2QnV0dG9uczogZmFsc2UsXHJcbiAgICAgIHNob3dJbmRpY2F0b3I6IHRydWUsXHJcbiAgICAgIHN0cmV0Y2hJbWFnZXM6IHRydWUsXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoKSA9PiBzZXR1cE5leHRJdGVtU2VsZWN0KCksXHJcbiAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICBjdXJyZW50SW5kZXggPSBlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSW5kZXgnKTtcclxuXHJcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChjdXJyZW50VGltZW91dCk7XHJcbiAgICAgICAgc2V0dXBOZXh0SXRlbVNlbGVjdCgpO1xyXG4gICAgICB9LFxyXG4gICAgICBpdGVtVGVtcGxhdGU6IChyZXBvcnRQYXJhbXM6IElOZXN0ZWRSZXBvcnQsIGluZGV4LCBpdGVtRWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGl0ZW1FbGVtZW50LmF0dHIoeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dhbGxlcnktaXRlbScgfSkuaGVpZ2h0KCcxMDAlJyk7XHJcblxyXG4gICAgICAgIGNvbnN0ICRzbGlkZUVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX3NsaWRlLWNvbnRlbnQnIH0pLmhlaWdodCgnMTAwJScpO1xyXG4gICAgICAgIGxldCByZXBvcnRTbGlkZTogSVJlcG9ydENvbXBvbmVudDtcclxuXHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgc3dpdGNoIChyZXBvcnRQYXJhbXMuVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5EYXNoYm9hcmQ6XHJcbiAgICAgICAgICAgICAgY29uc3QgJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAncmVwb3J0LXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkZGFzaGJvYXJkUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEYXNoYm9hcmRSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuRGFzaGJvYXJkXSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkZGFzaGJvYXJkQ29udGFpbmVyOiAkZGFzaGJvYXJkUG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtc1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmZpbmQoJ2Rhc2hib2FyZC10aXRsZScpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmZpbmQoJy5keC1kYXNoYm9hcmQtbGF5b3V0LWNvbnRhaW5lcicpLmNzcyh7IHRvcDogMCB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkdyaWRWaWV3OlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRncmlkUG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19ncmlkLXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmFkZENsYXNzKCdpc3pvbGVhLXRoZW1lJykuYWRkQ2xhc3MoJ3BhbmVsLWJvZHknKTtcclxuXHJcbiAgICAgICAgICAgICAgJGdyaWRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgR3JpZFJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5HcmlkVmlld10gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgZ3JpZFBvc2l0aW9uTWFya2VyOiAkZ3JpZFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIGFueSBhcyBJR3JpZFJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuQ0RNOlxyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IENETVJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5DRE1dIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRjb250YWluZXI6ICRzbGlkZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUNkbVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuUmVwb3J0OlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRyZXBvcnRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3JlcG9ydC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJHJlcG9ydFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEWFJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5SZXBvcnRdIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRyZXBvcnRDb250YWluZXI6ICRyZXBvcnRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5EaWFncmFtOlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRkaWFncmFtUG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRkaWFncmFtUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IERpYWdyYW1SZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuRGlhZ3JhbV0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJGNvbnRhaW5lcjogJGRpYWdyYW1Qb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5HYW50dENoYXJ0OlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRnYW50dFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ3JpZC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5hZGRDbGFzcygnaXN6b2xlYS10aGVtZScpLmFkZENsYXNzKCdwYW5lbC1ib2R5Jyk7XHJcblxyXG4gICAgICAgICAgICAgICRnYW50dFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBHYW50dENoYXJ0KHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuR2FudHRDaGFydF0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgY2hhcnRQb3NpdGlvbk1hcmtlcjogJGdhbnR0UG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgYW55IGFzIElHcmlkUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5NZW51Tm9kZTpcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuU2xpZGVzaG93OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChyZXBvcnRTbGlkZSkge1xyXG4gICAgICAgICAgICByZXBvcnRTbGlkZS5pbml0KCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0cy5wdXNoKHJlcG9ydFNsaWRlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCA1MDApO1xyXG5cclxuICAgICAgICAkc2xpZGVFbGVtZW50LmFwcGVuZFRvKGl0ZW1FbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5keEdhbGxlcnkgPSAkZ2FsbGVyeS5keEdhbGxlcnkoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgJGdhbGxlcnkuYXBwZW5kVG8oJHZpZXcpO1xyXG5cclxuICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbmV3IFJlZnJlc2hUaW1lcih7Y2FsbGJhY2s6ICgpID0+IHRoaXMucmVmcmVzaCgpLCBlbGFwc2VkQ2FsbGJhY2s6IChlKSA9PiB7fX0pO1xyXG4gICAgdGhpcy5yZWZyZXNoVGltZXIuc3RhcnQodGhpcy5vcHRpb25zLlJlZnJlc2hTZWMgKiAxMDAwKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9WZW5kb3IvRGV2RXh0cmVtZS9keC5hbGwuZC50c1wiIC8+XHJcblxyXG5leHBvcnQgeyBJTGljZW5jZSwgTWVudUl0ZW1UeXBlLCBMaWNlbmNlU3RhdHVzIH0gZnJvbSAnLi9CdXNpbmVzcyc7XHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUR4RGF0YVNvdXJjZU9wdGlvbnMsIElFcnJvckluZm8sIElMb2dvU2V0dGluZ3MsIFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vRGF0YSc7XHJcbmV4cG9ydCB7XHJcbiAgSGVhZGVyLCBOYXZpZ2F0aW9uTWVudSwgVXNlck1lbnUsIE1lbnVTd2l0Y2hlcixcclxuICBIZWFkZXJUaGVtZXMsIElIZWFkZXJPcHRpb25zLCBJQXBwTWVudU1vZGVsLCBJTWVudVNldHRpbmdzLCBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsXHJcbiAgSVVzZXJNZW51SXRlbSwgSVVzZXJNZW51SXRlbU1vZGVsLFxyXG59IGZyb20gJy4vSGVhZGVyJztcclxuZXhwb3J0IHsgSUhpZXJhcmNoaWNhbCwgSVJlcG9ydEJhc2UsIElBcHBNZW51SXRlbUJhc2VNb2RlbCwgZ3JpZENvbHVtblR5cGVzIH0gZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzJztcclxuZXhwb3J0IHtcclxuICBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUsIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUsIElHcmlkU3RhdGUsXHJcbiAgSUdyaWRDb2x1bW5TdGF0ZSwgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGVcclxufSBmcm9tICcuL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmV4cG9ydCB7IElHcmlkRGF0YSwgSVYyR3JpZENvbHVtblN0YXRlIH0gZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dyaWQvSUdyaWREYXRhJztcclxuZXhwb3J0IHsgSUNvbHVtbk1ldGFEYXRhIH0gZnJvbSAnLi9SZXBvcnRzL0NvbHVtbk1ldGFEYXRhJztcclxuZXhwb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MnO1xyXG5cclxuaW1wb3J0IHsgc2hvdyBhcyBiYWNrZ3JvdW5kSW1hZ2VWaWV3ZXIgfSBmcm9tICcuL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyJztcclxuaW1wb3J0IHsgTGljZW5jZVN0YXR1cywgTWVudUl0ZW1UeXBlIH0gZnJvbSAnLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCBkYXRhIGZyb20gJy4vRGF0YSc7XHJcbmltcG9ydCBGb290ZXIsIHsgRm9vdGVySW5kaWNhdG9yU3RhdHVzIH0gZnJvbSAnLi9Gb290ZXIvSW5kZXgnO1xyXG5pbXBvcnQge1xyXG4gIEhlYWRlcixcclxuICBOYXZpZ2F0aW9uTWVudSxcclxuICBVc2VyTWVudSxcclxuICBNZW51U3dpdGNoZXJcclxufSBmcm9tICcuL0hlYWRlcic7XHJcblxyXG5leHBvcnQge1xyXG4gIEZvb3RlcixcclxufTtcclxuXHJcbmltcG9ydCBub3RpZnkgZnJvbSAnLi9XaWRnZXRzL05vdGlmeSc7XHJcbmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IGRlZmF1bHRUb29sYmFyIGZyb20gJy4vV2lkZ2V0cy9EZWZhdWx0VG9vbGJhcic7XHJcbmltcG9ydCBkZWZhdWx0R3JpZE9ic29sZXRlIGZyb20gJy4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUnO1xyXG5pbXBvcnQgZGVmYXVsdFRyZWVMaXN0IGZyb20gJy4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdCc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCAqIGFzIGltYWdlQ3JvcERpYWxvZyBmcm9tICcuL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nJztcclxuaW1wb3J0IHsgQWNjb3VudFNldHRpbmdzUGFnZSB9IGZyb20gJy4vUGFnZXMvQWNjb3VudFNldHRpbmdzJztcclxuaW1wb3J0ICogYXMgc3R5bGluZyBmcm9tICcuL1N0eWxpbmcvSW5kZXgnO1xyXG5pbXBvcnQgKiBhcyBwb3B1cCBmcm9tICcuL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgKiBhcyBjb25maXJtIGZyb20gJy4vV2lkZ2V0cy9Db25maXJtJztcclxuaW1wb3J0ICogYXMgbGFuZGluZyBmcm9tICcuL1dpZGdldHMvTGFuZGluZyc7XHJcbmltcG9ydCAqIGFzIGhlbHBlcnMgZnJvbSAnLi9IZWxwZXJzL0luZGV4JztcclxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9VdGlscy9JbmRleCc7XHJcbmltcG9ydCAqIGFzIGFjY2Vzc0RlbmllZCBmcm9tICcuL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQnO1xyXG5pbXBvcnQgZ3JpZENvbHVtblR5cGVzIGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcy9HcmlkQ29sdW1uVHlwZXMnO1xyXG5pbXBvcnQgKiBhcyBDRE0gZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0NETS9JbmRleCc7XHJcbmltcG9ydCB7IFNlc3Npb25Ob3RpZmllciB9IGZyb20gJy4vQ29tcG9uZW50cy9TZXNzaW9uTm90aWZpZXInO1xyXG5pbXBvcnQgeyBGaWxlSW1wb3J0ZXIgfSBmcm9tICcuL0NvbXBvbmVudHMvRmlsZUltcG9ydGVyL0luZGV4JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyIH0gZnJvbSAnLi9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleCc7XHJcbmltcG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzJztcclxuXHJcbmltcG9ydCBHcmlkUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvR3JpZC9JbmRleCc7XHJcbmltcG9ydCBTbGlkZXNob3dSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9TbGlkZXNob3cvSW5kZXgnO1xyXG5pbXBvcnQgRGFzaGJvYXJkUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0luZGV4JztcclxuaW1wb3J0IERYUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4JztcclxuaW1wb3J0IERpYWdyYW1SZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9EaWFncmFtL0luZGV4JztcclxuaW1wb3J0IENETVJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0NETS9JbmRleCc7XHJcbmltcG9ydCBHYW50dENoYXJ0UmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvR2FubnRDaGFydC9JbmRleCc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vQ29uZmlnL0luZGV4JztcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG5jb25zdCBJc3pvbGVhVUkgPSB7XHJcbiAgY29uZmlnLFxyXG5cclxuICBIZWFkZXIsXHJcbiAgRm9vdGVyLFxyXG4gIE5hdmlnYXRpb25NZW51LFxyXG4gIFVzZXJNZW51LFxyXG4gIE1lbnVTd2l0Y2hlcixcclxuXHJcbiAgZGF0YSxcclxuXHJcbiAgd2lkZ2V0czoge1xyXG4gICAgbm90aWZ5LFxyXG4gICAgZnVsbFNjcmVlbixcclxuICAgIHBvcHVwLFxyXG4gICAgY29uZmlybSxcclxuICAgIGxhbmRpbmcsXHJcbiAgICBhY2Nlc3NEZW5pZWQsXHJcbiAgICBkZWZhdWx0R3JpZE9ic29sZXRlLFxyXG4gICAgZGVmYXVsdFRyZWVMaXN0LFxyXG4gICAgZGVmYXVsdEdyaWQsXHJcbiAgICBkZWZhdWx0VG9vbGJhcixcclxuICAgIGJhY2tncm91bmRJbWFnZVZpZXdlcixcclxuICAgIGltYWdlQ3JvcERpYWxvZ1xyXG4gIH0sXHJcbiAgcGFnZXM6IHtcclxuICAgIEFjY291bnRTZXR0aW5nc1BhZ2VcclxuICB9LFxyXG4gIGNvbXBvbmVudHM6IHtcclxuICAgIENETSxcclxuICAgIFNlc3Npb25Ob3RpZmllcixcclxuICAgIEZpbGVJbXBvcnRlcixcclxuICAgIEZpbGVVcGxvYWRlcixcclxuICB9LFxyXG5cclxuICBzdHlsaW5nLFxyXG4gIGhlbHBlcnMsXHJcbiAgdXRpbHMsXHJcblxyXG4gIHJlcG9ydHM6IHtcclxuICAgIENETVJlcG9ydFBhZ2UsXHJcbiAgICBEaWFncmFtUmVwb3J0UGFnZSxcclxuICAgIEdyaWRSZXBvcnRQYWdlLFxyXG4gICAgRGFzaGJvYXJkUmVwb3J0UGFnZSxcclxuICAgIERYUmVwb3J0UGFnZSxcclxuICAgIFNsaWRlc2hvd1JlcG9ydFBhZ2UsXHJcbiAgICBHYW50dENoYXJ0UmVwb3J0UGFnZSxcclxuICAgIGdyaWRDb2x1bW5UeXBlcyxcclxuICB9LFxyXG4gIGJ1c2luZXNzOiB7XHJcbiAgICBMaWNlbmNlU3RhdHVzLFxyXG4gICAgTWVudUl0ZW1UeXBlLFxyXG4gICAgQ2RtSW1wb3J0RmlsZU1vZGUsXHJcbiAgICBGb290ZXJJbmRpY2F0b3JTdGF0dXMsXHJcbiAgICBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlXHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgSXN6b2xlYVVJO1xyXG5cclxuKHdpbmRvdyBhcyBhbnkpLklzem9sZWFVSSA9IElzem9sZWFVSTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxtQkFBYyxJQUFNLElBQU07QUFBQSxpQkFDSixBQUFoQixPQUFPLE1BQVMsY0FBYSxLQUFPLEVBQUUsU0FBTyxVQUN4QixBQUFoQixPQUFPLE1BQVMsWUFDdkIsU0FBUSxLQUFLLHVEQUNiLEtBQU8sRUFBRSxTQUFTLENBQUMsT0FLakIsR0FBSyxXQUFXLDZFQUE2RSxLQUFLLEdBQUssUUFDbEcsSUFBSSxLQUFLLENBQUEsVUFBOEIsS0FBTyxFQUFFLE1BQU0sR0FBSyxVQUU3RDs7QUFHVCxtQkFBbUIsSUFBSyxJQUFNLElBQU07QUFDbEMsY0FBSSxLQUFNLElBQUk7QUFDZCxhQUFJLEtBQUssT0FBTyxLQUNoQixHQUFJLGVBQWUsUUFDbkIsR0FBSSxTQUFTLFdBQVk7QUFD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
10396
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY3JvcHByL2Rpc3QvY3JvcHByLmpzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0J1c2luZXNzL0xpY2VuY2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQnVzaW5lc3MvTWVudUl0ZW1UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvTm90aWZ5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvQXBpUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0U3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9Qb3B1cC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9TdHlsaW5nL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRXJyb3JJbmZvUG9wdXAudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9FeGNlcHRpb25UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvRHhEYXRhU291cmNlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0NvcmUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbmZpZy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvVXNlck1lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L01lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L0Jvb3RzdHJhcENvbGxhcHNpbmdNZW51LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9OYXZpZ2F0aW9uTWVudS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db25zdGFudHMvQ2FjaGVLZXlzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9Mb2dvLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9NZW51U3dpdGNoZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL1NlYXJjaC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9FdmVudEVtaXR0ZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvVXRpbHMvR3JpZEV4cG9ydC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvSGVhZGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQnVzaW5lc3MvR3JpZENvbHVtblR5cGVzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQnVzaW5lc3MvY2RtSW1wb3J0RmlsZU1vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9JR3JpZFN0YXRlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0Zvb3Rlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0F1dG9SZXNpemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9GdWxsU2NyZWVuLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlbHBlcnMvVGhlbWUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9Ub29sYmFyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRGVmYXVsdFRvb2xiYXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9QYW5lbEhlaWdodC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvQ3JlYXRlRnVsbFNjcmVlbkdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkQmFzZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1BhZ2VzL0FjY291bnRTZXR0aW5ncy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0NvbmZpcm0udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9MYW5kaW5nLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9DcmVhdGVEZWZhdWx0R3JpZC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9Db250cm9sQ29uZmlndXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL01lbW9pemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZFZpZXdzTWFuYWdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkU3RhdGVNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZEZpbHRlcnNNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWREaXNwbGF5c01hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRTdW1tYXJ5SGVscGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0NvbnRyb2xEaXNwbGF5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0Rpc3BsYXlNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9HcmlkSW5kaWNhdG9yU3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0dyaWRTdGF0ZU1hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL01vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9EYXRhL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HYW5udENoYXJ0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL1NsaWRlc2hvdy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiogRmlsZVNhdmVyLmpzXG4qIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuKlxuKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4qXG4qIExpY2Vuc2UgOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAoTUlUKVxuKiBzb3VyY2UgIDogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qc1xuKi9cblxuLy8gVGhlIG9uZSBhbmQgb25seSB3YXkgb2YgZ2V0dGluZyBnbG9iYWwgc2NvcGUgaW4gYWxsIGVudmlyb25tZW50c1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMyNzcxODIvMTAwODk5OVxudmFyIF9nbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3dcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmXG4gID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbFxuICA/IGdsb2JhbFxuICA6IHRoaXNcblxuZnVuY3Rpb24gYm9tIChibG9iLCBvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIG9wdHMgPSB7IGF1dG9Cb206IGZhbHNlIH1cbiAgZWxzZSBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc29sZS53YXJuKCdEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCcpXG4gICAgb3B0cyA9IHsgYXV0b0JvbTogIW9wdHMgfVxuICB9XG5cbiAgLy8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcbiAgLy8gbm90ZTogeW91ciBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IFVURi0xNiBVK0ZFRkYgdG8gRUYgQkIgQkZcbiAgaWYgKG9wdHMuYXV0b0JvbSAmJiAvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRiksIGJsb2JdLCB7IHR5cGU6IGJsb2IudHlwZSB9KVxuICB9XG4gIHJldHVybiBibG9iXG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkICh1cmwsIG5hbWUsIG9wdHMpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzYXZlQXMoeGhyLnJlc3BvbnNlLCBuYW1lLCBvcHRzKVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvdWxkIG5vdCBkb3dubG9hZCBmaWxlJylcbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIGNvcnNFbmFibGVkICh1cmwpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIC8vIHVzZSBzeW5jIHRvIGF2b2lkIHBvcHVwIGJsb2NrZXJcbiAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKVxuICB0cnkge1xuICAgIHhoci5zZW5kKClcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5XG59XG5cbi8vIGBhLmNsaWNrKClgIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGJyb3dzZXJzICgjNDY1KVxuZnVuY3Rpb24gY2xpY2sgKG5vZGUpIHtcbiAgdHJ5IHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJylcbiAgICBldnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldnQpXG4gIH1cbn1cblxuLy8gRGV0ZWN0IFdlYlZpZXcgaW5zaWRlIGEgbmF0aXZlIG1hY09TIGFwcCBieSBydWxpbmcgb3V0IGFsbCBicm93c2Vyc1xuLy8gV2UganVzdCBuZWVkIHRvIGNoZWNrIGZvciAnU2FmYXJpJyBiZWNhdXNlIGFsbCBvdGhlciBicm93c2VycyAoYmVzaWRlcyBGaXJlZm94KSBpbmNsdWRlIHRoYXQgdG9vXG4vLyBodHRwczovL3d3dy53aGF0aXNteWJyb3dzZXIuY29tL2d1aWRlcy90aGUtbGF0ZXN0LXVzZXItYWdlbnQvbWFjb3NcbnZhciBpc01hY09TV2ViVmlldyA9IF9nbG9iYWwubmF2aWdhdG9yICYmIC9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbnZhciBzYXZlQXMgPSBfZ2xvYmFsLnNhdmVBcyB8fCAoXG4gIC8vIHByb2JhYmx5IGluIHNvbWUgd2ViIHdvcmtlclxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgd2luZG93ICE9PSBfZ2xvYmFsKVxuICAgID8gZnVuY3Rpb24gc2F2ZUFzICgpIHsgLyogbm9vcCAqLyB9XG5cbiAgLy8gVXNlIGRvd25sb2FkIGF0dHJpYnV0ZSBmaXJzdCBpZiBwb3NzaWJsZSAoIzE5MyBMdW1pYSBtb2JpbGUpIHVubGVzcyB0aGlzIGlzIGEgbWFjT1MgV2ViVmlld1xuICA6ICgnZG93bmxvYWQnIGluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSAmJiAhaXNNYWNPU1dlYlZpZXcpXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgYS5kb3dubG9hZCA9IG5hbWVcbiAgICBhLnJlbCA9ICdub29wZW5lcicgLy8gdGFibmFiYmluZ1xuXG4gICAgLy8gVE9ETzogZGV0ZWN0IGNocm9tZSBleHRlbnNpb25zICYgcGFja2FnZWQgYXBwc1xuICAgIC8vIGEudGFyZ2V0ID0gJ19ibGFuaydcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN1cHBvcnQgcmVndWxhciBsaW5rc1xuICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgaWYgKGEub3JpZ2luICE9PSBsb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgY29yc0VuYWJsZWQoYS5ocmVmKVxuICAgICAgICAgID8gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcbiAgICAgICAgICA6IGNsaWNrKGEsIGEudGFyZ2V0ID0gJ19ibGFuaycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGljayhhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXBwb3J0IGJsb2JzXG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpIH0sIDRFNCkgLy8gNDBzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2xpY2soYSkgfSwgMClcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgbXNTYXZlT3JPcGVuQmxvYiBhcyBhIHNlY29uZCBhcHByb2FjaFxuICA6ICdtc1NhdmVPck9wZW5CbG9iJyBpbiBuYXZpZ2F0b3JcbiAgPyBmdW5jdGlvbiBzYXZlQXMgKGJsb2IsIG5hbWUsIG9wdHMpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvcnNFbmFibGVkKGJsb2IpKSB7XG4gICAgICAgIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBibG9iXG4gICAgICAgIGEudGFyZ2V0ID0gJ19ibGFuaydcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJvbShibG9iLCBvcHRzKSwgbmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB1c2luZyBGaWxlUmVhZGVyIGFuZCBhIHBvcHVwXG4gIDogZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzLCBwb3B1cCkge1xuICAgIC8vIE9wZW4gYSBwb3B1cCBpbW1lZGlhdGVseSBkbyBnbyBhcm91bmQgcG9wdXAgYmxvY2tlclxuICAgIC8vIE1vc3RseSBvbmx5IGF2YWlsYWJsZSBvbiB1c2VyIGludGVyYWN0aW9uIGFuZCB0aGUgZmlsZVJlYWRlciBpcyBhc3luYyBzby4uLlxuICAgIHBvcHVwID0gcG9wdXAgfHwgb3BlbignJywgJ19ibGFuaycpXG4gICAgaWYgKHBvcHVwKSB7XG4gICAgICBwb3B1cC5kb2N1bWVudC50aXRsZSA9XG4gICAgICBwb3B1cC5kb2N1bWVudC5ib2R5LmlubmVyVGV4dCA9ICdkb3dubG9hZGluZy4uLidcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSByZXR1cm4gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcblxuICAgIHZhciBmb3JjZSA9IGJsb2IudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB2YXIgaXNTYWZhcmkgPSAvY29uc3RydWN0b3IvaS50ZXN0KF9nbG9iYWwuSFRNTEVsZW1lbnQpIHx8IF9nbG9iYWwuc2FmYXJpXG4gICAgdmFyIGlzQ2hyb21lSU9TID0gL0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgICBpZiAoKGlzQ2hyb21lSU9TIHx8IChmb3JjZSAmJiBpc1NhZmFyaSkgfHwgaXNNYWNPU1dlYlZpZXcpICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgYWxsb3cgZG93bmxvYWRpbmcgb2YgYmxvYiBVUkxzXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgdXJsID0gaXNDaHJvbWVJT1MgPyB1cmwgOiB1cmwucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpXG4gICAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgICBlbHNlIGxvY2F0aW9uID0gdXJsXG4gICAgICAgIHBvcHVwID0gbnVsbCAvLyByZXZlcnNlLXRhYm5hYmJpbmcgIzQ2MFxuICAgICAgfVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgaWYgKHBvcHVwKSBwb3B1cC5sb2NhdGlvbiA9IHVybFxuICAgICAgZWxzZSBsb2NhdGlvbi5ocmVmID0gdXJsXG4gICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkgfSwgNEU0KSAvLyA0MHNcbiAgICB9XG4gIH1cbilcblxuX2dsb2JhbC5zYXZlQXMgPSBzYXZlQXMuc2F2ZUFzID0gc2F2ZUFzXG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn1cbiIsICIvKipcbiAqIENyb3Bwci5qc1xuICogaHR0cHM6Ly9naXRodWIuY29tL2phbWVzc3Nvb2kvQ3JvcHByLmpzXG4gKiBcbiAqIEEgSmF2YVNjcmlwdCBpbWFnZSBjcm9wcGVyIHRoYXQncyBsaWdodHdlaWdodCwgYXdlc29tZSwgYW5kIGhhc1xuICogemVybyBkZXBlbmRlbmNpZXMuXG4gKiBcbiAqIChDKSAyMDE3IEphbWVzIE9vaS4gUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Dcm9wcHIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXN0VGltZSA9IDA7XG4gIHZhciB2ZW5kb3JzID0gWydtcycsICdtb3onLCAnd2Via2l0JywgJ28nXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG4gIH1cbiAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG4gIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICB9O1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICByZXR1cm4gZXZ0O1xuICB9XG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbihmdW5jdGlvbiAod2luZG93KSB7XG4gIHRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KCd0ZXN0Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7fVxuICBmdW5jdGlvbiBNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlIH07XG4gICAgdmFyIG1vdXNlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIG1vdXNlRXZlbnQuaW5pdE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgIHJldHVybiBtb3VzZUV2ZW50O1xuICB9XG4gIE1vdXNlRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlO1xuICB3aW5kb3cuTW91c2VFdmVudCA9IE1vdXNlRXZlbnQ7XG59KSh3aW5kb3cpO1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG52YXIgZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gIGlmIChkZXNjID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG52YXIgc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIEhhbmRsZSA9XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSGFuZGxlIGluc3RhbmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlXG4gKiAgICAgIHdpdGhpbiB0aGUgY3JvcCByZWdpb24uIEFjY2VwdHMgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMSBpbiB0aGUgb3JkZXJcbiAqICAgICAgb2YgW1gsIFldLlxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludHMgRGVmaW5lIHRoZSBzaWRlIG9mIHRoZSBjcm9wIHJlZ2lvbiB0aGF0XG4gKiAgICAgIGlzIHRvIGJlIGFmZmVjdGVkIGJ5IHRoaXMgaGFuZGxlLiBBY2NlcHRzIGEgdmFsdWUgb2YgMCBvciAxIGluIHRoZVxuICogICAgICBvcmRlciBvZiBbVE9QLCBSSUdIVCwgQk9UVE9NLCBMRUZUXS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXJzb3IgVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGV2ZW50QnVzIFRoZSBlbGVtZW50IHRvIGRpc3BhdGNoIGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gSGFuZGxlKHBvc2l0aW9uLCBjb25zdHJhaW50cywgY3Vyc29yLCBldmVudEJ1cykge1xuICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIYW5kbGUpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1oYW5kbGUnO1xuICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVzdGFydCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVtb3ZlJywge1xuICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgfSkpO1xuICB9XG59O1xuXG52YXIgQm94ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCb3ggaW5zdGFuY2UuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGZ1bmN0aW9uIEJveCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQkJDEoKSB7XG4gICAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICB2YXIgeDIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB0aGlzLngxID0geDEgPT0gbnVsbCA/IHRoaXMueDEgOiB4MTtcbiAgICAgIHRoaXMueTEgPSB5MSA9PSBudWxsID8gdGhpcy55MSA6IHkxO1xuICAgICAgdGhpcy54MiA9IHgyID09IG51bGwgPyB0aGlzLngyIDogeDI7XG4gICAgICB0aGlzLnkyID0geTIgPT0gbnVsbCA/IHRoaXMueTIgOiB5MjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYm94LlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICd3aWR0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueDIgLSB0aGlzLngxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBib3guXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2hlaWdodCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnkyIC0gdGhpcy55MSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIGJveCB0byBhIG5ldyBzaXplLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdIZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3JpZ2luXSBUaGUgb3JpZ2luIHBvaW50IHRvIHJlc2l6ZSBmcm9tLlxuICAgICAqICAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogWzAsIDBdO1xuICAgICAgdmFyIGZyb21YID0gdGhpcy54MSArIHRoaXMud2lkdGgoKSAqIG9yaWdpblswXTtcbiAgICAgIHZhciBmcm9tWSA9IHRoaXMueTEgKyB0aGlzLmhlaWdodCgpICogb3JpZ2luWzFdO1xuICAgICAgdGhpcy54MSA9IGZyb21YIC0gbmV3V2lkdGggKiBvcmlnaW5bMF07XG4gICAgICB0aGlzLnkxID0gZnJvbVkgLSBuZXdIZWlnaHQgKiBvcmlnaW5bMV07XG4gICAgICB0aGlzLngyID0gdGhpcy54MSArIG5ld1dpZHRoO1xuICAgICAgdGhpcy55MiA9IHRoaXMueTEgKyBuZXdIZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGJveCBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2FsZShmYWN0b3IpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswLCAwXTtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCgpICogZmFjdG9yO1xuICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuICAgICAgdmFyIHggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgeCA9IHggPT09IG51bGwgPyB0aGlzLngxIDogeDtcbiAgICAgIHkgPSB5ID09PSBudWxsID8gdGhpcy55MSA6IHk7XG4gICAgICB0aGlzLngxID0geDtcbiAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgdGhpcy54MiA9IHggKyB3aWR0aDtcbiAgICAgIHRoaXMueTIgPSB5ICsgaGVpZ2h0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGl2ZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3guXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9pbnQgVGhlIHggYW5kIHkgcmF0aW8gcG9zaXRpb24gd2l0aGluIHRoZSBib3guXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgeCBhbmQgeSBjb29yZGluYXRlcyBbeCwgeV0uXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZWxhdGl2ZVBvaW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb2ludCgpIHtcbiAgICAgIHZhciBwb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWzAsIDBdO1xuICAgICAgdmFyIHggPSB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQoKSAqIHBvaW50WzFdO1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFic29sdXRlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgYSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludCBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIFt4LCB5XS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2dldEFic29sdXRlUG9pbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBYnNvbHV0ZVBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbMCwgMF07XG4gICAgICB2YXIgeCA9IHRoaXMueDEgKyB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy55MSArIHRoaXMuaGVpZ2h0KCkgKiBwb2ludFsxXTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgZml4ZWQgcmF0aW8uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm93XSBUaGUgYXhpcyB0byBncm93IHRvIG1haW50YWluIHRoZSByYXRpby5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gJ2hlaWdodCcuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdjb25zdHJhaW5Ub1JhdGlvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9SYXRpbyhyYXRpbykge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzAsIDBdO1xuICAgICAgdmFyIGdyb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdoZWlnaHQnO1xuICAgICAgaWYgKHJhdGlvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgc3dpdGNoIChncm93KSB7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICAgIHRoaXMucmVzaXplKHRoaXMuaGVpZ2h0KCkgKiAxIC8gcmF0aW8sIHRoaXMuaGVpZ2h0KCksIG9yaWdpbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJhaW4gdGhlIGJveCB3aXRoaW4gYSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYm91bmRhcnlXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBib3VuZGFyeUhlaWdodFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9Cb3VuZGFyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnN0cmFpblRvQm91bmRhcnkoYm91bmRhcnlXaWR0aCwgYm91bmRhcnlIZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFswLCAwXTtcbiAgICAgIHZhciBfZ2V0QWJzb2x1dGVQb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVQb2ludChvcmlnaW4pLFxuICAgICAgICAgIF9nZXRBYnNvbHV0ZVBvaW50MiA9IHNsaWNlZFRvQXJyYXkoX2dldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfZ2V0QWJzb2x1dGVQb2ludDJbMF0sXG4gICAgICAgICAgb3JpZ2luWSA9IF9nZXRBYnNvbHV0ZVBvaW50MlsxXTtcbiAgICAgIHZhciBtYXhJZkxlZnQgPSBvcmlnaW5YO1xuICAgICAgdmFyIG1heElmVG9wID0gb3JpZ2luWTtcbiAgICAgIHZhciBtYXhJZlJpZ2h0ID0gYm91bmRhcnlXaWR0aCAtIG9yaWdpblg7XG4gICAgICB2YXIgbWF4SWZCb3R0b20gPSBib3VuZGFyeUhlaWdodCAtIG9yaWdpblk7XG4gICAgICB2YXIgZGlyZWN0aW9uWCA9IC0yICogb3JpZ2luWzBdICsgMTtcbiAgICAgIHZhciBkaXJlY3Rpb25ZID0gLTIgKiBvcmlnaW5bMV0gKyAxO1xuICAgICAgdmFyIG1heFdpZHRoID0gbnVsbCxcbiAgICAgICAgICBtYXhIZWlnaHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb25YKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbWF4V2lkdGggPSBtYXhJZkxlZnQ7YnJlYWs7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWluKG1heElmTGVmdCwgbWF4SWZSaWdodCkgKiAyO2JyZWFrO1xuICAgICAgICBjYXNlICsxOlxuICAgICAgICAgIG1heFdpZHRoID0gbWF4SWZSaWdodDticmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGlyZWN0aW9uWSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIG1heEhlaWdodCA9IG1heElmVG9wO2JyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SWZUb3AsIG1heElmQm90dG9tKSAqIDI7YnJlYWs7XG4gICAgICAgIGNhc2UgKzE6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SWZCb3R0b207YnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy53aWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgICAgdmFyIGZhY3RvciA9IG1heFdpZHRoIC8gdGhpcy53aWR0aCgpO1xuICAgICAgICB0aGlzLnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhlaWdodCgpID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBfZmFjdG9yID0gbWF4SGVpZ2h0IC8gdGhpcy5oZWlnaHQoKTtcbiAgICAgICAgdGhpcy5zY2FsZShfZmFjdG9yLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgbWF4aW11bS9taW5pbXVtIHNpemUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhXaWR0aF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heEhlaWdodF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21pbldpZHRoXVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbWluSGVpZ2h0XVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmF0aW9dIFJhdGlvIHRvIG1haW50YWluLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9TaXplJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9TaXplKCkge1xuICAgICAgdmFyIG1heFdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdmFyIG1heEhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciBtaW5XaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBtaW5IZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbMCwgMF07XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG4gICAgICBpZiAocmF0aW8pIHtcbiAgICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICAgIG1heFdpZHRoID0gbWF4SGVpZ2h0ICogMSAvIHJhdGlvO1xuICAgICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgIG1heEhlaWdodCA9IG1heFdpZHRoICogcmF0aW87XG4gICAgICAgICAgbWluV2lkdGggPSBtaW5IZWlnaHQgKiAxIC8gcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aCAmJiB0aGlzLndpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBtYXhXaWR0aCxcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHJhdGlvID09PSBudWxsID8gdGhpcy5oZWlnaHQoKSA6IG1heEhlaWdodDtcbiAgICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgdGhpcy5oZWlnaHQoKSA+IG1heEhlaWdodCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtYXhXaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aCwgX25ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaW5XaWR0aCAmJiB0aGlzLndpZHRoKCkgPCBtaW5XaWR0aCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoMiA9IG1pbldpZHRoLFxuICAgICAgICAgICAgX25ld0hlaWdodDIgPSByYXRpbyA9PT0gbnVsbCA/IHRoaXMuaGVpZ2h0KCkgOiBtaW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aDIsIF9uZXdIZWlnaHQyLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgaWYgKG1pbkhlaWdodCAmJiB0aGlzLmhlaWdodCgpIDwgbWluSGVpZ2h0KSB7XG4gICAgICAgIHZhciBfbmV3V2lkdGgzID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtaW5XaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQzID0gbWluSGVpZ2h0O1xuICAgICAgICB0aGlzLnJlc2l6ZShfbmV3V2lkdGgzLCBfbmV3SGVpZ2h0Mywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQm94O1xufSgpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGVsZW1lbnQncyB0b3VjaCBldmVudHMgdG8gYmUgc2ltdWxhdGVkIGFzIG1vdXNlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBlbmFibGVUb3VjaChlbGVtZW50KSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNpbXVsYXRlTW91c2VFdmVudCk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBzaW11bGF0ZU1vdXNlRXZlbnQpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNpbXVsYXRlTW91c2VFdmVudCk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0b3VjaCBldmVudCB0byBhIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZVxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHZhciBldmVudE1hcCA9IHtcbiAgICAndG91Y2hzdGFydCc6ICdtb3VzZWRvd24nLFxuICAgICd0b3VjaG1vdmUnOiAnbW91c2Vtb3ZlJyxcbiAgICAndG91Y2hlbmQnOiAnbW91c2V1cCdcbiAgfTtcbiAgdG91Y2gudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoZXZlbnRNYXBbZS50eXBlXSwge1xuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICB2aWV3OiB3aW5kb3csXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWVxuICB9KSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5fSBwb3NpdGlvbiAtIFRoZSB4IGFuZCB5IHJhdGlvIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgd2l0aGluXG4gKiAgICAgIHRoZSBjcm9wIHJlZ2lvbi4gQWNjZXB0cyBhIHZhbHVlIGJldHdlZW4gMCB0byAxIGluIHRoZSBvcmRlciBvZiBbWCwgWV0uXG4gKiBAcHJvcGVydHkge0FycmF5fSBjb25zdHJhaW50cyAtIERlZmluZSB0aGUgc2lkZSBvZiB0aGUgY3JvcCByZWdpb24gdGhhdCBpcyB0b1xuICogICAgICBiZSBhZmZlY3RlZCBieSB0aGlzIGhhbmRsZS4gQWNjZXB0cyBhIHZhbHVlIG9mIDAgb3IgMSBpbiB0aGUgb3JkZXIgb2ZcbiAqICAgICAgW1RPUCwgUklHSFQsIEJPVFRPTSwgTEVGVF0uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY3Vyc29yIC0gVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKi9cbnZhciBIQU5ETEVTID0gW3sgcG9zaXRpb246IFswLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMCwgMCwgMV0sIGN1cnNvcjogJ253LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMC4wXSwgY29uc3RyYWludHM6IFsxLCAwLCAwLCAwXSwgY3Vyc29yOiAnbi1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMSwgMCwgMF0sIGN1cnNvcjogJ25lLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzEuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAxLCAwLCAwXSwgY3Vyc29yOiAnZS1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMSwgMSwgMF0sIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMS4wXSwgY29uc3RyYWludHM6IFswLCAwLCAxLCAwXSwgY3Vyc29yOiAncy1yZXNpemUnIH0sIHsgcG9zaXRpb246IFswLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMCwgMSwgMV0sIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAwLCAwLCAxXSwgY3Vyc29yOiAndy1yZXNpemUnIH1dO1xudmFyIENyb3BwckNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENyb3BwckNvcmUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHJDb3JlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBDcm9wcHJDb3JlLnBhcnNlT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgICBpZiAoIWVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgdGhyb3cgJ0ltYWdlIHNyYyBub3QgcHJvdmlkZWQuJztcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXN0b3JlID0ge1xuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgfTtcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICBpZiAoZWxlbWVudC53aWR0aCA9PT0gMCB8fCBlbGVtZW50LmhlaWdodCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjcmVhdGVDbGFzcyhDcm9wcHJDb3JlLCBbe1xuICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRE9NKGVsZW1lbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnRUb1BpeGVscyh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuYXR0YWNoUmVnaW9uRXZlbnRzKCk7XG4gICAgICB0aGlzLmF0dGFjaE92ZXJsYXlFdmVudHMoKTtcbiAgICAgIHRoaXMuYm94ID0gdGhpcy5pbml0aWFsaXplQm94KHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluaXRpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjcmVhdGVET00nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVET00odGFyZ2V0RWwpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1jb250YWluZXInO1xuICAgICAgdGhpcy5ldmVudEJ1cyA9IHRoaXMuY29udGFpbmVyRWw7XG4gICAgICBlbmFibGVUb3VjaCh0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5jbGFzc05hbWUgPSAnY3JvcHByJztcbiAgICAgIHRoaXMuaW1hZ2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgdGhpcy5pbWFnZUVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKCdzcmMnKSk7XG4gICAgICB0aGlzLmltYWdlRWwuc2V0QXR0cmlidXRlKCdhbHQnLCB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpKTtcbiAgICAgIHRoaXMuaW1hZ2VFbC5jbGFzc05hbWUgPSAnY3JvcHByLWltYWdlJztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwgPSB0aGlzLmltYWdlRWwuY2xvbmVOb2RlKCk7XG4gICAgICB0aGlzLmltYWdlQ2xpcHBlZEVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaW1hZ2VDbGlwcGVkJztcbiAgICAgIHRoaXMucmVnaW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVnaW9uRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1yZWdpb24nO1xuICAgICAgdGhpcy5vdmVybGF5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMub3ZlcmxheUVsLmNsYXNzTmFtZSA9ICdjcm9wcHItb3ZlcmxheSc7XG4gICAgICB2YXIgaGFuZGxlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhhbmRsZUNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaGFuZGxlQ29udGFpbmVyJztcbiAgICAgIHRoaXMuaGFuZGxlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBIQU5ETEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKEhBTkRMRVNbaV0ucG9zaXRpb24sIEhBTkRMRVNbaV0uY29uc3RyYWludHMsIEhBTkRMRVNbaV0uY3Vyc29yLCB0aGlzLmV2ZW50QnVzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlLmVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbCk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlQ2xpcHBlZEVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMucmVnaW9uRWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5RWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlQ29udGFpbmVyRWwpO1xuICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0YXJnZXRFbC5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLmNvbnRhaW5lckVsLCB0YXJnZXRFbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB0aGlzLmltYWdlRWwub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuYm94ID0gX3RoaXMyLmluaXRpYWxpemVCb3goX3RoaXMyLm9wdGlvbnMpO1xuICAgICAgICBfdGhpczIucmVkcmF3KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZUVsLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwuc3JjID0gc3JjO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlLnBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcy5fcmVzdG9yZS5lbGVtZW50LCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJveCByZWdpb24gd2l0aCBhIHNldCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtCb3h9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdpbml0aWFsaXplQm94JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUJveChvcHRzKSB7XG4gICAgICB2YXIgd2lkdGggPSBvcHRzLnN0YXJ0U2l6ZS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBvcHRzLnN0YXJ0U2l6ZS5oZWlnaHQ7XG4gICAgICB2YXIgYm94ID0gbmV3IEJveCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJveC5jb25zdHJhaW5Ub1JhdGlvKG9wdHMuYXNwZWN0UmF0aW8sIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIG1pbiA9IG9wdHMubWluU2l6ZTtcbiAgICAgIHZhciBtYXggPSBvcHRzLm1heFNpemU7XG4gICAgICBib3guY29uc3RyYWluVG9TaXplKG1heC53aWR0aCwgbWF4LmhlaWdodCwgbWluLndpZHRoLCBtaW4uaGVpZ2h0LCBbMC41LCAwLjVdLCBvcHRzLmFzcGVjdFJhdGlvKTtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldFdpZHRoO1xuICAgICAgdmFyIHBhcmVudEhlaWdodCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodDtcbiAgICAgIGJveC5jb25zdHJhaW5Ub0JvdW5kYXJ5KHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQsIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIHggPSB0aGlzLmNyb3BwZXJFbC5vZmZzZXRXaWR0aCAvIDIgLSBib3gud2lkdGgoKSAvIDI7XG4gICAgICB2YXIgeSA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodCAvIDIgLSBib3guaGVpZ2h0KCkgLyAyO1xuICAgICAgYm94Lm1vdmUoeCwgeSk7XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlZHJhdycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJveC53aWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKSxcbiAgICAgICAgICB4MSA9IE1hdGgucm91bmQodGhpcy5ib3gueDEpLFxuICAgICAgICAgIHkxID0gTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgeDIgPSBNYXRoLnJvdW5kKHRoaXMuYm94LngyKSxcbiAgICAgICAgICB5MiA9IE1hdGgucm91bmQodGhpcy5ib3gueTIpO1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4MSArICdweCwgJyArIHkxICsgJ3B4KSc7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgX3RoaXMzLnJlZ2lvbkVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgIF90aGlzMy5pbWFnZUNsaXBwZWRFbC5zdHlsZS5jbGlwID0gJ3JlY3QoJyArIHkxICsgJ3B4LCAnICsgeDIgKyAncHgsICcgKyB5MiArICdweCwgJyArIHgxICsgJ3B4KSc7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfdGhpczMuYm94LmdldEFic29sdXRlUG9pbnQoWy41LCAuNV0pO1xuICAgICAgICB2YXIgeFNpZ24gPSBjZW50ZXJbMF0gLSBfdGhpczMuY3JvcHBlckVsLm9mZnNldFdpZHRoIC8gMiA+PiAzMTtcbiAgICAgICAgdmFyIHlTaWduID0gY2VudGVyWzFdIC0gX3RoaXMzLmNyb3BwZXJFbC5vZmZzZXRIZWlnaHQgLyAyID4+IDMxO1xuICAgICAgICB2YXIgcXVhZHJhbnQgPSAoeFNpZ24gXiB5U2lnbikgKyB5U2lnbiArIHlTaWduICsgNDtcbiAgICAgICAgdmFyIGZvcmVncm91bmRIYW5kbGVJbmRleCA9IC0yICogcXVhZHJhbnQgKyA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzMy5oYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZSA9IF90aGlzMy5oYW5kbGVzW2ldO1xuICAgICAgICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZS5lbC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlLmVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgbGVmdCA9IHgxICsgd2lkdGggKiBoYW5kbGUucG9zaXRpb25bMF0gLSBoYW5kbGVXaWR0aCAvIDI7XG4gICAgICAgICAgdmFyIHRvcCA9IHkxICsgaGVpZ2h0ICogaGFuZGxlLnBvc2l0aW9uWzFdIC0gaGFuZGxlSGVpZ2h0IC8gMjtcbiAgICAgICAgICBoYW5kbGUuZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgTWF0aC5yb3VuZChsZWZ0KSArICdweCwgJyArIE1hdGgucm91bmQodG9wKSArICdweCknO1xuICAgICAgICAgIGhhbmRsZS5lbC5zdHlsZS56SW5kZXggPSBmb3JlZ3JvdW5kSGFuZGxlSW5kZXggPT0gaSA/IDUgOiA0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hIYW5kbGVyRXZlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoSGFuZGxlckV2ZW50cygpIHtcbiAgICAgIHZhciBldmVudEJ1cyA9IHRoaXMuZXZlbnRCdXM7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVzdGFydCcsIHRoaXMub25IYW5kbGVNb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVtb3ZlJywgdGhpcy5vbkhhbmRsZU1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVlbmQnLCB0aGlzLm9uSGFuZGxlTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hSZWdpb25FdmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hSZWdpb25FdmVudHMoKSB7XG4gICAgICB2YXIgZXZlbnRCdXMgPSB0aGlzLmV2ZW50QnVzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5yZWdpb25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25zdGFydCcsIHRoaXMub25SZWdpb25Nb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25tb3ZlJywgdGhpcy5vblJlZ2lvbk1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25lbmQnLCB0aGlzLm9uUmVnaW9uTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZ2lvbnN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWdpb25tb3ZlJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBldmVudEJ1cy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVnaW9uZW5kJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXR0YWNoT3ZlcmxheUV2ZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaE92ZXJsYXlFdmVudHMoKSB7XG4gICAgICB2YXIgU09VVEhFQVNUX0hBTkRMRV9JRFggPSA0O1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRtcEJveCA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNyb3BwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1vdXNlWCA9IGUuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgICB2YXIgbW91c2VZID0gZS5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgdG1wQm94ID0gc2VsZi5ib3g7XG4gICAgICAgIHNlbGYuYm94ID0gbmV3IEJveChtb3VzZVgsIG1vdXNlWSwgbW91c2VYICsgMSwgbW91c2VZICsgMSk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZXN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYuaGFuZGxlc1tTT1VUSEVBU1RfSEFORExFX0lEWF0gfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZW1vdmUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGlmIChzZWxmLmJveC53aWR0aCgpID09PSAxICYmIHNlbGYuYm94LmhlaWdodCgpID09PSAxKSB7XG4gICAgICAgICAgc2VsZi5ib3ggPSB0bXBCb3g7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgbW91c2VYOiBlLmNsaWVudFgsIG1vdXNlWTogZS5jbGllbnRZIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlU3RhcnQoZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IGUuZGV0YWlsLmhhbmRsZTtcbiAgICAgIHZhciBvcmlnaW5Qb2ludCA9IFsxIC0gaGFuZGxlLnBvc2l0aW9uWzBdLCAxIC0gaGFuZGxlLnBvc2l0aW9uWzFdXTtcbiAgICAgIHZhciBfYm94JGdldEFic29sdXRlUG9pbnQgPSB0aGlzLmJveC5nZXRBYnNvbHV0ZVBvaW50KG9yaWdpblBvaW50KSxcbiAgICAgICAgICBfYm94JGdldEFic29sdXRlUG9pbnQyID0gc2xpY2VkVG9BcnJheShfYm94JGdldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzBdLFxuICAgICAgICAgIG9yaWdpblkgPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzFdO1xuICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgPSB7IGhhbmRsZTogaGFuZGxlLCBvcmlnaW5Qb2ludDogb3JpZ2luUG9pbnQsIG9yaWdpblg6IG9yaWdpblgsIG9yaWdpblk6IG9yaWdpblkgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcFN0YXJ0KHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25IYW5kbGVNb3ZlTW92aW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlTW92aW5nKGUpIHtcbiAgICAgIHZhciBfZSRkZXRhaWwgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbC5tb3VzZVk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICBpZiAobW91c2VYIDwgMCkge1xuICAgICAgICBtb3VzZVggPSAwO1xuICAgICAgfSBlbHNlIGlmIChtb3VzZVggPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgICAgbW91c2VYID0gY29udGFpbmVyLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1vdXNlWSA8IDApIHtcbiAgICAgICAgbW91c2VZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobW91c2VZID4gY29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICBtb3VzZVkgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblBvaW50LnNsaWNlKCk7XG4gICAgICB2YXIgb3JpZ2luWCA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblg7XG4gICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblk7XG4gICAgICB2YXIgaGFuZGxlID0gdGhpcy5hY3RpdmVIYW5kbGUuaGFuZGxlO1xuICAgICAgdmFyIFRPUF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzBdID09PSAxO1xuICAgICAgdmFyIFJJR0hUX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMV0gPT09IDE7XG4gICAgICB2YXIgQk9UVE9NX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMl0gPT09IDE7XG4gICAgICB2YXIgTEVGVF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzNdID09PSAxO1xuICAgICAgdmFyIE1VTFRJX0FYSVMgPSAoTEVGVF9NT1ZBQkxFIHx8IFJJR0hUX01PVkFCTEUpICYmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSk7XG4gICAgICB2YXIgeDEgPSBMRUZUX01PVkFCTEUgfHwgUklHSFRfTU9WQUJMRSA/IG9yaWdpblggOiB0aGlzLmJveC54MTtcbiAgICAgIHZhciB4MiA9IExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFID8gb3JpZ2luWCA6IHRoaXMuYm94LngyO1xuICAgICAgdmFyIHkxID0gVE9QX01PVkFCTEUgfHwgQk9UVE9NX01PVkFCTEUgPyBvcmlnaW5ZIDogdGhpcy5ib3gueTE7XG4gICAgICB2YXIgeTIgPSBUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSA/IG9yaWdpblkgOiB0aGlzLmJveC55MjtcbiAgICAgIHgxID0gTEVGVF9NT1ZBQkxFID8gbW91c2VYIDogeDE7XG4gICAgICB4MiA9IFJJR0hUX01PVkFCTEUgPyBtb3VzZVggOiB4MjtcbiAgICAgIHkxID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgOiB5MTtcbiAgICAgIHkyID0gQk9UVE9NX01PVkFCTEUgPyBtb3VzZVkgOiB5MjtcbiAgICAgIHZhciBpc0ZsaXBwZWRYID0gZmFsc2UsXG4gICAgICAgICAgaXNGbGlwcGVkWSA9IGZhbHNlO1xuICAgICAgaWYgKExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFKSB7XG4gICAgICAgIGlzRmxpcHBlZFggPSBMRUZUX01PVkFCTEUgPyBtb3VzZVggPiBvcmlnaW5YIDogbW91c2VYIDwgb3JpZ2luWDtcbiAgICAgIH1cbiAgICAgIGlmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSkge1xuICAgICAgICBpc0ZsaXBwZWRZID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgPiBvcmlnaW5ZIDogbW91c2VZIDwgb3JpZ2luWTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZsaXBwZWRYKSB7XG4gICAgICAgIHZhciB0bXAgPSB4MTt4MSA9IHgyO3gyID0gdG1wO1xuICAgICAgICBvcmlnaW5bMF0gPSAxIC0gb3JpZ2luWzBdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmxpcHBlZFkpIHtcbiAgICAgICAgdmFyIF90bXAgPSB5MTt5MSA9IHkyO3kyID0gX3RtcDtcbiAgICAgICAgb3JpZ2luWzFdID0gMSAtIG9yaWdpblsxXTtcbiAgICAgIH1cbiAgICAgIHZhciBib3ggPSBuZXcgQm94KHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChNVUxUSV9BWElTKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gbW91c2VZID4gYm94LnkxICsgcmF0aW8gKiBib3gud2lkdGgoKSB8fCBtb3VzZVkgPCBib3gueTIgLSByYXRpbyAqIGJveC53aWR0aCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFRPUF9NT1ZBQkxFIHx8IEJPVFRPTV9NT1ZBQkxFKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmF0aW9Nb2RlID0gaXNWZXJ0aWNhbE1vdmVtZW50ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBib3guY29uc3RyYWluVG9SYXRpbyhyYXRpbywgb3JpZ2luLCByYXRpb01vZGUpO1xuICAgICAgfVxuICAgICAgdmFyIG1pbiA9IHRoaXMub3B0aW9ucy5taW5TaXplO1xuICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICAgICAgYm94LmNvbnN0cmFpblRvU2l6ZShtYXgud2lkdGgsIG1heC5oZWlnaHQsIG1pbi53aWR0aCwgbWluLmhlaWdodCwgb3JpZ2luLCB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgYm94LmNvbnN0cmFpblRvQm91bmRhcnkocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCwgb3JpZ2luKTtcbiAgICAgIHRoaXMuYm94ID0gYm94O1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZUVuZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGFuZGxlTW92ZUVuZChlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25SZWdpb25Nb3ZlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVTdGFydChlKSB7XG4gICAgICB2YXIgX2UkZGV0YWlsMiA9IGUuZGV0YWlsLFxuICAgICAgICAgIG1vdXNlWCA9IF9lJGRldGFpbDIubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbDIubW91c2VZO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY3JvcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbW91c2VYID0gbW91c2VYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgICBtb3VzZVkgPSBtb3VzZVkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5jdXJyZW50TW92ZSA9IHtcbiAgICAgICAgb2Zmc2V0WDogbW91c2VYIC0gdGhpcy5ib3gueDEsXG4gICAgICAgIG9mZnNldFk6IG1vdXNlWSAtIHRoaXMuYm94LnkxXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVNb3ZpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVNb3ZpbmcoZSkge1xuICAgICAgdmFyIF9lJGRldGFpbDMgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwzLm1vdXNlWCxcbiAgICAgICAgICBtb3VzZVkgPSBfZSRkZXRhaWwzLm1vdXNlWTtcbiAgICAgIHZhciBfY3VycmVudE1vdmUgPSB0aGlzLmN1cnJlbnRNb3ZlLFxuICAgICAgICAgIG9mZnNldFggPSBfY3VycmVudE1vdmUub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX2N1cnJlbnRNb3ZlLm9mZnNldFk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICB0aGlzLmJveC5tb3ZlKG1vdXNlWCAtIG9mZnNldFgsIG1vdXNlWSAtIG9mZnNldFkpO1xuICAgICAgaWYgKHRoaXMuYm94LngxIDwgMCkge1xuICAgICAgICB0aGlzLmJveC5tb3ZlKDAsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm94LngyID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUoY29udGFpbmVyLndpZHRoIC0gdGhpcy5ib3gud2lkdGgoKSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTEgPCAwKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTIgPiBjb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgY29udGFpbmVyLmhlaWdodCAtIHRoaXMuYm94LmhlaWdodCgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVFbmQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVFbmQoZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIGlmIChtb2RlID09PSBudWxsKSB7XG4gICAgICAgIG1vZGUgPSB0aGlzLm9wdGlvbnMucmV0dXJuTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlID09ICdyZWFsJykge1xuICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSB0aGlzLmltYWdlRWwubmF0dXJhbFdpZHRoO1xuICAgICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gdGhpcy5pbWFnZUVsLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHZhciBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MgPSB0aGlzLmltYWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgICAgICBlbGVtZW50SGVpZ2h0ID0gX2ltYWdlRWwkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgICAgdmFyIGZhY3RvclggPSBhY3R1YWxXaWR0aCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgdmFyIGZhY3RvclkgPSBhY3R1YWxIZWlnaHQgLyBlbGVtZW50SGVpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQodGhpcy5ib3gueDEgKiBmYWN0b3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYm94LnkxICogZmFjdG9yWSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSAqIGZhY3RvclgpLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAqIGZhY3RvclkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ3JhdGlvJykge1xuICAgICAgICB2YXIgX2ltYWdlRWwkZ2V0Qm91bmRpbmdDMiA9IHRoaXMuaW1hZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIF9lbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLndpZHRoLFxuICAgICAgICAgICAgX2VsZW1lbnRIZWlnaHQgPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiByb3VuZCh0aGlzLmJveC54MSAvIF9lbGVtZW50V2lkdGgsIDMpLFxuICAgICAgICAgIHk6IHJvdW5kKHRoaXMuYm94LnkxIC8gX2VsZW1lbnRIZWlnaHQsIDMpLFxuICAgICAgICAgIHdpZHRoOiByb3VuZCh0aGlzLmJveC53aWR0aCgpIC8gX2VsZW1lbnRXaWR0aCwgMyksXG4gICAgICAgICAgaGVpZ2h0OiByb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAvIF9lbGVtZW50SGVpZ2h0LCAzKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdyYXcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZCh0aGlzLmJveC54MSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAncGFyc2VPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICAgIHZhciBkZWZhdWx0cyQkMSA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IG51bGwsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSxcbiAgICAgICAgc3RhcnRTaXplOiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB1bml0OiAnJScgfSxcbiAgICAgICAgcmV0dXJuTW9kZTogJ3JlYWwnLFxuICAgICAgICBvbkluaXRpYWxpemU6IG51bGwsXG4gICAgICAgIG9uQ3JvcFN0YXJ0OiBudWxsLFxuICAgICAgICBvbkNyb3BNb3ZlOiBudWxsLFxuICAgICAgICBvbkNyb3BFbmQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgYXNwZWN0UmF0aW8gPSBudWxsO1xuICAgICAgaWYgKG9wdHMuYXNwZWN0UmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYXNwZWN0UmF0aW8gPSBvcHRzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdHMuYXNwZWN0UmF0aW8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGFzcGVjdFJhdGlvID0gb3B0cy5hc3BlY3RSYXRpb1sxXSAvIG9wdHMuYXNwZWN0UmF0aW9bMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXhTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgbWF4U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5tYXhTaXplWzBdIHx8IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBvcHRzLm1heFNpemVbMV0gfHwgbnVsbCxcbiAgICAgICAgICB1bml0OiBvcHRzLm1heFNpemVbMl0gfHwgJ3B4J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIG1pblNpemUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMubWluU2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICBtaW5TaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBvcHRzLm1pblNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMubWluU2l6ZVsxXSB8fCBudWxsLFxuICAgICAgICAgIHVuaXQ6IG9wdHMubWluU2l6ZVsyXSB8fCAncHgnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnN0YXJ0U2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuc3RhcnRTaXplICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5zdGFydFNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMuc3RhcnRTaXplWzFdIHx8IG51bGwsXG4gICAgICAgICAgdW5pdDogb3B0cy5zdGFydFNpemVbMl0gfHwgJyUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgb25Jbml0aWFsaXplID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbkluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25Jbml0aWFsaXplID0gb3B0cy5vbkluaXRpYWxpemU7XG4gICAgICB9XG4gICAgICB2YXIgb25Dcm9wU3RhcnQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ3JvcFN0YXJ0ID0gb3B0cy5vbkNyb3BTdGFydDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BFbmQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BFbmQgPSBvcHRzLm9uQ3JvcEVuZDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BNb3ZlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nyb3Bwci5qczogYG9uVXBkYXRlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBgb25Dcm9wTW92ZWAgb3IgYG9uQ3JvcEVuZGAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25Dcm9wTW92ZSA9IG9wdHMub25VcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25Dcm9wTW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BNb3ZlID0gb3B0cy5vbkNyb3BNb3ZlO1xuICAgICAgfVxuICAgICAgdmFyIHJldHVybk1vZGUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMucmV0dXJuTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzID0gb3B0cy5yZXR1cm5Nb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChbJ3JlYWwnLCAncmF0aW8nLCAncmF3J10uaW5kZXhPZihzKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBcIkludmFsaWQgcmV0dXJuIG1vZGUuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuTW9kZSA9IHM7XG4gICAgICB9XG4gICAgICB2YXIgY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24gY29udmVydFRvUGl4ZWxzKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB2YXIgc2l6ZUtleXMgPSBbJ21heFNpemUnLCAnbWluU2l6ZScsICdzdGFydFNpemUnXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBzaXplS2V5c1tpXTtcbiAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpc1trZXldLnVuaXQgPT0gJyUnKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzW2tleV0ud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ud2lkdGggPSB0aGlzW2tleV0ud2lkdGggLyAxMDAgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpc1trZXldLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XS5oZWlnaHQgPSB0aGlzW2tleV0uaGVpZ2h0IC8gMTAwICogaGVpZ2h0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpc1trZXldLnVuaXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2LCBkKSB7XG4gICAgICAgIHJldHVybiB2ICE9PSBudWxsID8gdiA6IGQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXNwZWN0UmF0aW86IGRlZmF1bHRWYWx1ZShhc3BlY3RSYXRpbywgZGVmYXVsdHMkJDEuYXNwZWN0UmF0aW8pLFxuICAgICAgICBtYXhTaXplOiBkZWZhdWx0VmFsdWUobWF4U2l6ZSwgZGVmYXVsdHMkJDEubWF4U2l6ZSksXG4gICAgICAgIG1pblNpemU6IGRlZmF1bHRWYWx1ZShtaW5TaXplLCBkZWZhdWx0cyQkMS5taW5TaXplKSxcbiAgICAgICAgc3RhcnRTaXplOiBkZWZhdWx0VmFsdWUoc3RhcnRTaXplLCBkZWZhdWx0cyQkMS5zdGFydFNpemUpLFxuICAgICAgICByZXR1cm5Nb2RlOiBkZWZhdWx0VmFsdWUocmV0dXJuTW9kZSwgZGVmYXVsdHMkJDEucmV0dXJuTW9kZSksXG4gICAgICAgIG9uSW5pdGlhbGl6ZTogZGVmYXVsdFZhbHVlKG9uSW5pdGlhbGl6ZSwgZGVmYXVsdHMkJDEub25Jbml0aWFsaXplKSxcbiAgICAgICAgb25Dcm9wU3RhcnQ6IGRlZmF1bHRWYWx1ZShvbkNyb3BTdGFydCwgZGVmYXVsdHMkJDEub25Dcm9wU3RhcnQpLFxuICAgICAgICBvbkNyb3BNb3ZlOiBkZWZhdWx0VmFsdWUob25Dcm9wTW92ZSwgZGVmYXVsdHMkJDEub25Dcm9wTW92ZSksXG4gICAgICAgIG9uQ3JvcEVuZDogZGVmYXVsdFZhbHVlKG9uQ3JvcEVuZCwgZGVmYXVsdHMkJDEub25Dcm9wRW5kKSxcbiAgICAgICAgY29udmVydFRvUGl4ZWxzOiBjb252ZXJ0VG9QaXhlbHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDcm9wcHJDb3JlO1xufSgpO1xuZnVuY3Rpb24gcm91bmQodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscyk7XG59XG5cbnZhciBDcm9wcHIkMSA9IGZ1bmN0aW9uIChfQ3JvcHByQ29yZSkge1xuICBpbmhlcml0cyhDcm9wcHIsIF9Dcm9wcHJDb3JlKTtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBDYWxscyB0aGUgQ3JvcHByQ29yZSdzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgZnVuY3Rpb24gQ3JvcHByKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDcm9wcHIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm9wcHIpKS5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMsIF9kZWZlcnJlZCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3JvcCByZWdpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbW9kZV0gV2hpY2ggbW9kZSBvZiBjYWxjdWxhdGlvbiB0byB1c2U6ICdyZWFsJywgJ3JhdGlvJyBvclxuICAgKiAgICAgICdyYXcnLlxuICAgKi9cbiAgY3JlYXRlQ2xhc3MoQ3JvcHByLCBbe1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUobW9kZSkge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdnZXRWYWx1ZScsIHRoaXMpLmNhbGwodGhpcywgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdzZXRJbWFnZScsIHRoaXMpLmNhbGwodGhpcywgc3JjKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHJldHVybiBnZXQoQ3JvcHByLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENyb3Bwci5wcm90b3R5cGUpLCAnZGVzdHJveScsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ21vdmVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICB0aGlzLmJveC5tb3ZlKHgsIHkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wRW5kICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyb3BFbmQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcmlnaW4gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLjUsIDAuNV0gKGNlbnRlcikuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFsuNSwgLjVdO1xuICAgICAgdGhpcy5ib3gucmVzaXplKHdpZHRoLCBoZWlnaHQsIG9yaWdpbik7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjcm9wIHJlZ2lvbiBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3JpZ2luIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgICBEZWZhdWx0cyB0byBbMC41LCAwLjVdIChjZW50ZXIpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGVCeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlQnkoZmFjdG9yKSB7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbLjUsIC41XTtcbiAgICAgIHRoaXMuYm94LnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5ib3ggPSB0aGlzLmluaXRpYWxpemVCb3godGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENyb3Bwcjtcbn0oQ3JvcHByQ29yZSk7XG5cbnJldHVybiBDcm9wcHIkMTtcblxufSkpKTtcbiIsICJleHBvcnQgZW51bSBMaWNlbmNlU3RhdHVzIHtcclxuICBJbnZhbGlkLFxyXG4gIFZhbGlkLFxyXG4gIEV4cGlyZVNvb24sXHJcbiAgRXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMaWNlbmNlIHtcclxuICByZWFkb25seSBTdGF0dXM/OiBMaWNlbmNlU3RhdHVzO1xyXG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBPd25lcjogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEV4cGlyYXRpb25EYXRlOiBEYXRlIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEFwcGxpY2F0aW9uczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IFNvdXJjZUNvbnRlbnQ6IHN0cmluZztcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gTWVudUl0ZW1UeXBlIHtcclxuICBHcmlkVmlldyA9IDAsXHJcbiAgRGFzaGJvYXJkID0gMSxcclxuICBNZW51Tm9kZSA9IDIsXHJcbiAgUmVwb3J0ID0gMyxcclxuICBEaWFncmFtID0gNCxcclxuICBDRE0gPSA1LFxyXG4gIFNsaWRlc2hvdyA9IDYsXHJcbiAgR2FudHRDaGFydCA9IDdcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm90aWZ5KG1zZzogc3RyaW5nLCBzdWNjZWVkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWQgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIGNvbnN0IGRpc3BsYXlUaW1lID0gc3VjY2VlZCA/IDIwMDAgOiA0MDAwO1xyXG5cclxuICBEZXZFeHByZXNzLnVpLm5vdGlmeSh7XHJcbiAgICBtZXNzYWdlOiBtc2csXHJcbiAgICB0eXBlOiBzdGF0dXMsXHJcbiAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZS5lbGVtZW50LmZpbmQoJy5keC10b2FzdC1tZXNzYWdlJyk7XHJcbiAgICAgIG1lc3NhZ2VFbGVtZW50Lmh0bWwoKG1lc3NhZ2VFbGVtZW50Lmh0bWwoKSB8fCAnJykucmVwbGFjZSgnXFxcXG4nLCAnPGJyIC8+JykpO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvYXN0T3B0aW9ucywgc3RhdHVzLCBkaXNwbGF5VGltZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBjb25zdCBpc0Vycm9ySW5mbyA9IChcclxuICByZXNwb25zZURhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBJRXJyb3JJbmZvIHwgSUVycm9ySW5mb1tdIHwgdW5kZWZpbmVkIHwgbnVsbFxyXG4pOiByZXNwb25zZURhdGEgaXMgSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSA9PiB7XHJcbiAgaWYgKCFyZXNwb25zZURhdGEpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YSlcclxuICAgID8gKHJlc3BvbnNlRGF0YVswXS5TdGFja1RyYWNlICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VEYXRhWzBdLkVycm9yICE9PSB1bmRlZmluZWQpXHJcbiAgICA6IChyZXNwb25zZURhdGEuRXJyb3IgIT09IHVuZGVmaW5lZCk7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFcnJvckluZm8ge1xyXG4gIEVycm9yOiBzdHJpbmc7XHJcbiAgU3RhY2tUcmFjZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBcGlSZXNwb25zZTxUPiB7XHJcbiAgRGF0YTogVCB8IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10gfCB1bmRlZmluZWQ7XHJcbiAgTWVzc2FnZTogc3RyaW5nO1xyXG4gIFJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG4gIFN0YXR1c0NvZGU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTG9va3VwRHRvPFQ+IHtcclxuICBWYWx1ZTogVDtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIFJlcXVlc3RTdGF0ZSB7XHJcbiAgQ29tcGxldGVkID0gMSxcclxuICBFcnJvcmVkID0gMlxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuY29uc3QgUE9QVVBfQ09OVEVOVF9DTEFTUyA9ICdwb3B1cC1jb250ZW50JztcclxuY29uc3QgUE9QVVBfRk9PVEVSX0NMQVNTID0gJ3BvcHVwLWZvb3Rlcic7XHJcbmNvbnN0IEJVVFRPTlNfQ0xBU1MgPSAnYnV0dG9ucyc7XHJcbmNvbnN0IE9LX0JUTl9DTEFTUyA9ICdvay1idG4nO1xyXG5jb25zdCBDQU5DRUxfQlROX0NMQVNTID0gJ2NhbmNlbC1idG4nO1xyXG5cclxuaW50ZXJmYWNlIElQb3B1cCB7XHJcbiAgc2hvdzogKCkgPT4gdm9pZDtcclxuICBoaWRlOiAoKSA9PiB2b2lkO1xyXG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUG9wdXBCdXR0b25PcHRpb25zIHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbj86IHN0cmluZztcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgb25DbGljazogKGNsb3NlUG9wdXApID0+IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxheW91dCgkY29udGFpbmVyLCBjb250ZW50Q2xhc3NOYW1lPykge1xyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0NPTlRFTlRfQ0xBU1MpLmFkZENsYXNzKGNvbnRlbnRDbGFzc05hbWUpLmFwcGVuZFRvKCRjb250YWluZXIpLFxyXG4gICAgJGZvb3RlcjogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0ZPT1RFUl9DTEFTUykuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBzaG93blBvcHVwcyA9IFtdO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlUG9wdXAoJGVsOiBKUXVlcnksIGR4UG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcywgdXNlS2V5UHJlc3NCZWhhdmlvcjogYm9vbGVhbiA9IGZhbHNlKTogSVBvcHVwIHtcclxuICBjb25zdCBzYXZlZE9uU2hvd2luZyA9IGR4UG9wdXBPcHRpb25zLm9uU2hvd2luZztcclxuXHJcbiAgZHhQb3B1cE9wdGlvbnMub25TaG93biA9IChlKSA9PiB7XHJcbiAgICBpZiAoc2F2ZWRPblNob3dpbmcpIHtcclxuICAgICAgc2F2ZWRPblNob3dpbmcoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsSW5wdXRzID0gcG9wdXAuY29udGVudCgpLmZpbmQoJ2lucHV0W3R5cGU9dGV4dF0nKTtcclxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBhbGxJbnB1dHMuZXEoMCk7XHJcblxyXG4gICAgZmlyc3RJbnB1dC5mb2N1cygpO1xyXG5cclxuICAgIGNvbnN0IGtleUhhbmRsZXJzID0ge1xyXG4gICAgICBrZXlkb3duOiAoZXY6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzaG93blBvcHVwc1tzaG93blBvcHVwcy5sZW5ndGggLSAxXSAhPT0gcG9wdXApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICAgICAgJChldi5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uS2V5RG93bihldik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVzZUtleVByZXNzQmVoYXZpb3IpIHtcclxuICAgICAgYWxsSW5wdXRzLm9uKGtleUhhbmRsZXJzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpcnN0SW5wdXQub24oa2V5SGFuZGxlcnMpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICBwb3B1cC5jb250ZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTRVMuZHhCdXR0b259LiR7T0tfQlROX0NMQVNTfWApLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcclxuICAgICAgcG9wdXAuY29udGVudCgpLmZpbmQoYC4ke0NTU19DTEFTU0VTLmR4QnV0dG9ufS4ke0NBTkNFTF9CVE5fQ0xBU1N9YCkuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHBvcHVwID0gJGVsXHJcbiAgICAuZHhQb3B1cChkeFBvcHVwT3B0aW9ucylcclxuICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2hvdzogKCkgPT4ge1xyXG4gICAgICBwb3B1cC5zaG93KCk7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKHsga2V5ZG93bjogb25LZXlEb3duIH0pO1xyXG4gICAgICBzaG93blBvcHVwcy5wdXNoKHBvcHVwKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9mZih7IGtleWRvd246IG9uS2V5RG93biB9KTtcclxuICAgICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgICBzaG93blBvcHVwcy5wb3AoKTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6ICgpID0+ICRlbC5yZW1vdmUoKVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdXR0b25zKFxyXG4gIG9rT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuKSB7XHJcbiAgY29uc3QgJHRhYmxlID0gJCgnPHRhYmxlIC8+JykuYWRkQ2xhc3MoQlVUVE9OU19DTEFTUyk7XHJcbiAgY29uc3QgJHRyID0gJCgnPHRyPicpLmFwcGVuZFRvKCR0YWJsZSk7XHJcblxyXG4gIGlmIChva09wdGlvbnMpIHtcclxuICAgICQoJzx0ZCAvPicpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsICc1MCUnKVxyXG4gICAgICAuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keEJ1dHRvbikuYWRkQ2xhc3MoT0tfQlROX0NMQVNTKS5keEJ1dHRvbihva09wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIGlmIChjYW5jZWxPcHRpb25zKSB7XHJcbiAgICAkKCc8dGQgLz4nKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnNTAlJylcclxuICAgICAgLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhCdXR0b24pLmFkZENsYXNzKENBTkNFTF9CVE5fQ0xBU1MpLmR4QnV0dG9uKGNhbmNlbE9wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkdGFibGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtKGxhYmVsOiBzdHJpbmcsICR2YWx1ZTogSlF1ZXJ5KSB7XHJcbiAgcmV0dXJuICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbScpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2Zvcm0tbGFiZWwnKS50ZXh0KGxhYmVsKSxcclxuICAgICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCd2YWx1ZScpLmFwcGVuZCgkdmFsdWUpXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cE9wdGlvbnMge1xyXG4gIHVzZUtleVByZXNzQmVoYXZpb3I6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWFsb2coXHJcbiAgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMsXHJcbiAgJHBvcHVwQ29udGVudDogSlF1ZXJ5LFxyXG4gIG9rQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgYWRkaXRpb25hbE9wdGlvbnM/OiBJUG9wdXBPcHRpb25zXHJcbikge1xyXG4gIGNvbnN0ICRlbCA9ICQoJzxkaXY+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICBsZXQgJGJ1dHRvbnM6IEpRdWVyeSA9IG51bGw7XHJcblxyXG4gIGxldCBwb3B1cDogSVBvcHVwID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdXNlS2V5UHJlc3NCZWhhdmlvciA9IGFkZGl0aW9uYWxPcHRpb25zID8gYWRkaXRpb25hbE9wdGlvbnMudXNlS2V5UHJlc3NCZWhhdmlvciA6IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBjbG9zZVBvcHVwKCkge1xyXG4gICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgcG9wdXAucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkeFBvcHVwT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMgPSB7XHJcbiAgICBjb250ZW50VGVtcGxhdGU6ICgkcG9wdXBDb250YWluZXIpID0+IHtcclxuICAgICAgY29uc3QgeyAkY29udGVudCwgJGZvb3RlciB9ID0gY3JlYXRlTGF5b3V0KCRwb3B1cENvbnRhaW5lcik7XHJcblxyXG4gICAgICAkY29udGVudC5hcHBlbmQoJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgICBpZiAob2tCdG5PcHRpb25zICYmIGNhbmNlbEJ0bk9wdGlvbnMpIHtcclxuICAgICAgICAkYnV0dG9ucyA9IGNyZWF0ZUJ1dHRvbnMoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IG9rQnRuT3B0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICBpY29uOiBva0J0bk9wdGlvbnMuaWNvbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9rQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gb2tCdG5PcHRpb25zLm9uQ2xpY2soY2xvc2VQb3B1cClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IGNhbmNlbEJ0bk9wdGlvbnMudGV4dCxcclxuICAgICAgICAgICAgaWNvbjogY2FuY2VsQnRuT3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogY2FuY2VsQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgb25DbGljazogKGUpID0+IGNhbmNlbEJ0bk9wdGlvbnMub25DbGljayhjbG9zZVBvcHVwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICRmb290ZXIuYXBwZW5kKCRidXR0b25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkZm9vdGVyLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdpc3pvbGVhLWR4LXBvcHVwJyB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcyA9IHt9O1xyXG5cclxuICAkLmV4dGVuZCh0cnVlLCBwb3B1cE9wdGlvbnMsIG9wdGlvbnMsIGR4UG9wdXBPcHRpb25zKTtcclxuXHJcbiAgcG9wdXAgPSBjcmVhdGVQb3B1cCgkZWwsIHBvcHVwT3B0aW9ucywgdXNlS2V5UHJlc3NCZWhhdmlvcik7XHJcblxyXG4gIHBvcHVwLnNob3coKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXRlbXBsYXRlXHJcbiAgICBva0J0bjogJGJ1dHRvbnMgPyAkYnV0dG9ucy5maW5kKGAuJHsgIE9LX0JUTl9DTEFTU31gKS5keEJ1dHRvbignaW5zdGFuY2UnKSA6IG51bGwsXHJcbiAgICBjbG9zZTogKCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IENTU19DTEFTU0VTID0ge1xyXG4gIGR4RGF0YUdyaWQ6ICdpc3pvbGVhLWR4LWRhdGFncmlkJyxcclxuICBkeEJ1dHRvbjogJ2lzem9sZWEtZHgtYnV0dG9uJyxcclxuICBkeFBvcHVwOiAnaXN6b2xlYS1keC1wb3B1cCdcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4vUG9wdXAnO1xyXG5pbXBvcnQgeyBJRXJyb3JJbmZvIH0gZnJvbSAnLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG5jb25zdCBNQUlOX0VMRU1FTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cCc7XHJcbmNvbnN0IFBPUFVQX0NPTlRFTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fY29udGVudCc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX01FU1NBR0VfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItbWVzc2FnZSc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX0RFVEFJTFNfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItZGV0YWlscyc7XHJcblxyXG5jb25zdCBTSE9XX0RFVEFJTFNfVEVYVCA9ICdTaG93IGRldGFpbHMnO1xyXG5jb25zdCBISURFX0RFVEFJTFNfVEVYVCA9ICdIaWRlIGRldGFpbHMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9ySW5mb1BvcHVwKHRpdGxlTWVzc2FnZTogc3RyaW5nLCBlcnJvckluZm86IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10pOiB2b2lkIHtcclxuICBsZXQgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBjb25zdCBpbmZvQXJyYXkgPSBBcnJheS5pc0FycmF5KGVycm9ySW5mbykgPyBlcnJvckluZm8gOiBbZXJyb3JJbmZvXTtcclxuXHJcbiAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcyhQT1BVUF9DT05URU5UX0NMQVNTKTtcclxuXHJcbiAgaW5mb0FycmF5LmZvckVhY2goKGksIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCAkZXJyb3JNZXNzYWdlRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUykudGV4dChpLkVycm9yKTtcclxuICAgIGNvbnN0ICRlcnJvckRldGFpbHNFbGVtZW50ID0gJCgnPHAgLz4nKS5hZGRDbGFzcyhFUlJPUl9QT1BVUF9ERVRBSUxTX0NMQVNTKS50ZXh0KGkuU3RhY2tUcmFjZSk7XHJcbiAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkZXJyb3JNZXNzYWdlRWxlbWVudCwgJGVycm9yRGV0YWlsc0VsZW1lbnQpLmhpZGUoKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPCBpbmZvQXJyYXkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkKCc8aHIgLz4nKSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBvcHVwSW5mbyA9IGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6IHRpdGxlTWVzc2FnZSxcclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgIGFuaW1hdGlvbjoge1xyXG4gICAgICAgIHNob3c6IHsgZGlyZWN0aW9uOiAnYm90dG9tJywgdHlwZTogJ3NsaWRlSW4nIH0sXHJcbiAgICAgICAgaGlkZTogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVPdXQnIH1cclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdib3R0b20nLCBhdDogJ2JvdHRvbScsIG9mZnNldDogeyB5OiAtNTAgfSB9LFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHBvcHVwID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgZS5lbGVtZW50LmFkZENsYXNzKE1BSU5fRUxFTUVOVF9DTEFTUyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAkcG9wdXBDb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBTSE9XX0RFVEFJTFNfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlzRnVsbFNjcmVlblJlcXVpcmVkOiBib29sZWFuID0gIXBvcHVwLm9wdGlvbignZnVsbFNjcmVlbicpO1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW4oaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgICAgIHBvcHVwSW5mby5va0J0bi5vcHRpb24oJ3RleHQnLCBpc0Z1bGxTY3JlZW5SZXF1aXJlZCA/IEhJREVfREVUQUlMU19URVhUIDogU0hPV19ERVRBSUxTX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2xvc2UnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3QgdG9nZ2xlRnVsbFNjcmVlbiA9IChpc0Z1bGxTY3JlZW5SZXF1aXJlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgJHBvcHVwQ29udGVudC50b2dnbGUoaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAub3B0aW9uKCdmdWxsU2NyZWVuJywgaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAucmVwYWludCgpO1xyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIEV4Y2VwdGlvblR5cGUge1xyXG4gIFVuZXhwZWN0ZWRFeGNlcHRpb24gPSAwLFxyXG4gIFNxbEV4Y2VwdGlvbiA9IDEsXHJcbiAgSXN6b2xlYUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gPSAyXHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLic7XHJcblxyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLklzem9sZWFDb25maWd1cmF0aW9uRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1NvbWV0aGluZyB3cm9uZyB3aXRoIGlzem9sZWEgY29uZmlndXJhdGlvbi4gQ2hlY2sgQ2xpZW50SWQvQ2xpZW50U2VjcmV0IGZpZWxkcyBpbiB0aGUgYXBwc2V0dGluZ3MuanNvbiBmaWxlLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCBub3RpZnkgZnJvbSAnLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBJQXBpUmVzcG9uc2UsIGlzRXJyb3JJbmZvIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuaW1wb3J0IHsgY3JlYXRlRXJyb3JJbmZvUG9wdXAgfSBmcm9tICcuLi9XaWRnZXRzL0Vycm9ySW5mb1BvcHVwJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4vRXhjZXB0aW9uVHlwZSc7XHJcbmltcG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9VdGlscy9HZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlJztcclxuXHJcbmNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY29udGFjdCB0byBkZXZlbG9wZXJzLic7XHJcbmNvbnN0IE5PVF9FU1NFTlRJQUxfU1RBVFVTRVMgPSBbNTA0XTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlID0gKCkgPT4gREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MocmVzOiBJQXBpUmVzcG9uc2U8YW55Piwgbm90aWZ5U3VjY2VzcyA9IGZhbHNlKSB7XHJcbiAgaWYgKG5vdGlmeVN1Y2Nlc3MpIHtcclxuICAgIG5vdGlmeShyZXMuTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLkRhdGEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3I8VD4oXHJcbiAgcmVzOiBJQXBpUmVzcG9uc2U8VD4sXHJcbiAgbm90aWZ5RXJyb3I6IGJvb2xlYW4sXHJcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZ1xyXG4pOiB7IG1lc3NhZ2U6IHN0cmluZyB9IHtcclxuICBjb25zdCBtZXNzYWdlID0gcmVzLk1lc3NhZ2U7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHsgbWVzc2FnZSB9O1xyXG5cclxuICBsZXQgbWVzc2FnZVRvU2hvdztcclxuICBjb25zdCBleGNlcHRpb25UeXBlID0gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2UpO1xyXG4gIGlmIChleGNlcHRpb25UeXBlICE9PSBudWxsKSB7XHJcbiAgICBjb25zdCBjdXN0b21FcnJvck1lc3NhZ2UgPSBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPyBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UoZXhjZXB0aW9uVHlwZSkgOiAnJztcclxuICAgIG1lc3NhZ2VUb1Nob3cgPSBjdXN0b21FcnJvck1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtZXNzYWdlVG9TaG93ID0gbWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0U7XHJcbiAgfVxyXG5cclxuICBpZiAobm90aWZ5RXJyb3IpIHtcclxuICAgIGNvbnN0IGVycm9ySW5mbyA9IHJlcy5EYXRhO1xyXG4gICAgaWYgKGlzRXJyb3JJbmZvKGVycm9ySW5mbykpIHtcclxuICAgICAgY29uc3QgaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIGVycm9ySW5mby5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGlzRXJyb3JJbmZvSGFzRGF0YSA9ICFBcnJheS5pc0FycmF5KGVycm9ySW5mbykgJiYgKGVycm9ySW5mby5TdGFja1RyYWNlIHx8IGVycm9ySW5mby5FcnJvcik7XHJcblxyXG4gICAgICBpZiAoaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5IHx8IGlzRXJyb3JJbmZvSGFzRGF0YSkge1xyXG4gICAgICAgIGNyZWF0ZUVycm9ySW5mb1BvcHVwKG1lc3NhZ2VUb1Nob3csIGVycm9ySW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3RpZnkobWVzc2FnZVRvU2hvdywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2U6IHN0cmluZyk6IEV4Y2VwdGlvblR5cGUgfCBudWxsIHtcclxuICByZXR1cm4gKCFpc05hTihtZXNzYWdlIGFzIGFueSkpICYmIEV4Y2VwdGlvblR5cGVbK21lc3NhZ2VdID8gK21lc3NhZ2UgOiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlVXBsb2FkKGU6IHsgcmVxdWVzdDogeyByZXNwb25zZTogc3RyaW5nOyB9IH0pIHtcclxuICBjb25zdCByZXNwb25zZTogSUFwaVJlc3BvbnNlPGFueT4gPSBlLnJlcXVlc3QucmVzcG9uc2UgPyBKU09OLnBhcnNlKGUucmVxdWVzdC5yZXNwb25zZSkgOiB7fTtcclxuXHJcbiAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXNwb25zZSwgdHJ1ZSk7XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVNlbmRSZXF1ZXN0U2V0dGluZ3MgPSBKUXVlcnlBamF4U2V0dGluZ3MgJiB7XHJcbiAgbm90aWZ5RXJyb3I/OiBib29sZWFuO1xyXG4gIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZT86IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKSA9PiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VuZFJlcXVlc3Q8VCA9IGFueT4oXHJcbiAgdXJsOiBzdHJpbmcsXHJcbiAgdHlwZTogc3RyaW5nID0gJ0dFVCcsXHJcbiAgZGF0YSA9IG51bGwsXHJcbiAgbm90aWZ5U3VjY2Vzcz86IGJvb2xlYW4sXHJcbiAgc2V0dGluZ3M/OiBJU2VuZFJlcXVlc3RTZXR0aW5ncyxcclxuKTogSlF1ZXJ5LkRlZmVycmVkPFQ+IHtcclxuICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgY29uc3Qgbm90aWZ5RXJyb3IgPSBzZXR0aW5ncz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBzZXR0aW5ncy5ub3RpZnlFcnJvcjtcclxuXHJcbiAgY29uc3QgbWFuZGF0b3J5T3B0aW9ucyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBhamF4U2V0dGluZ3MgPSAkLmV4dGVuZCh7IHR5cGUsIHVybCwgZGF0YSB9LCBzZXR0aW5ncywgbWFuZGF0b3J5T3B0aW9ucyk7XHJcblxyXG4gICQuYWpheChhamF4U2V0dGluZ3MpXHJcbiAgICAuZG9uZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8YW55PiA9IHJlcztcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlLCBub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLkRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlRXJyb3IocmVzcG9uc2UsIG5vdGlmeUVycm9yLCBzZXR0aW5ncz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlIHx8IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgfSlcclxuICAgIC5mYWlsKChqcVhIUiwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAoIU5PVF9FU1NFTlRJQUxfU1RBVFVTRVMuaW5jbHVkZXMoanFYSFIuc3RhdHVzKSAmJiBub3RpZnlFcnJvcikge1xyXG4gICAgICAgIG5vdGlmeShnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCksIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KHRleHRTdGF0dXMpO1xyXG4gICAgfSk7XHJcblxyXG4gIHJldHVybiBkZWZlcnJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCB0eXBlIElEeERhdGFTb3VyY2VPcHRpb25zID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5PcHRpb25zICYge1xyXG4gIG5vdGlmeVN1Y2Nlc3M/OiBib29sZWFuO1xyXG4gIG5vdGlmeUVycm9yPzogYm9vbGVhbjtcclxuICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2U/OiAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4gc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUR4RGF0YVNvdXJjZShvcHRpb25zOiBJRHhEYXRhU291cmNlT3B0aW9ucykge1xyXG4gIGNvbnN0IHN0b3JlID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5jcmVhdGVTdG9yZSh7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgb25CZWZvcmVTZW5kOiAoanFYaHIsIHNldHRpbmdzKSA9PiB7XHJcbiAgICAgIGlmIChvcHRpb25zLm9uQmVmb3JlU2VuZCkge1xyXG4gICAgICAgIG9wdGlvbnMub25CZWZvcmVTZW5kKGpxWGhyLCBzZXR0aW5ncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5vdGlmeUVycm9yID0gb3B0aW9ucz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9yO1xyXG5cclxuICAgICAgc2V0dGluZ3MuZGF0YUZpbHRlciA9IChyYXdSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHJhd1Jlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcy5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVTdWNjZXNzKHJlcywgb3B0aW9ucy5ub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHNldHRpbmdzLmVycm9yID0gKHhocjogSlF1ZXJ5WEhSKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBJQXBpUmVzcG9uc2U8YW55PiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCB8fCAne30nKTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogZm9yIHVuaGFuZGxlZCBlcnJvcnMgb24gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghcmVzLlJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgaGFuZGxlRXJyb3IocmVzLCBub3RpZnlFcnJvciwgb3B0aW9ucz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdG9yZSBhcyBhbnkpLl9lcnJvckhhbmRsZXIgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgaWYgKGVycm9yICYmICFlcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHN0b3JlO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XHJcblxyXG5jb25zdCBsb2FkUHJvbWlzZXM6IHsgW3VybDogc3RyaW5nXTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB9ID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxUPih1cmw6IHN0cmluZykge1xyXG4gIGlmIChsb2FkUHJvbWlzZXNbdXJsXSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByb21pc2VzW3VybF0gPSBzZW5kUmVxdWVzdDxUPih1cmwpO1xyXG4gIGxvYWRQcm9taXNlc1t1cmxdLmNhdGNoKChlcnIpID0+IHtcclxuICAgIGxvYWRQcm9taXNlc1t1cmxdID0gbnVsbDtcclxuXHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogVCA9IGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG5cclxuICBsb2FkUHJvbWlzZXNbdXJsXSA9IG51bGw7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0LCBoYW5kbGVFcnJvciwgaGFuZGxlU3VjY2VzcywgaGFuZGxlVXBsb2FkIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgKiBhcyBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbi8vIFRPRE86IGV4cG9ydCB0eXBlXHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUVycm9ySW5mbyB9IGZyb20gJy4vQXBpUmVzcG9uc2UnO1xyXG5leHBvcnQgeyBJRHhEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcclxuZXhwb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4vSUxvZ29TZXR0aW5ncyc7XHJcbmV4cG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBzZW5kUmVxdWVzdCxcclxuICBoYW5kbGVFcnJvcixcclxuICBoYW5kbGVTdWNjZXNzLFxyXG4gIGhhbmRsZVVwbG9hZCxcclxuICBjcmVhdGVEeERhdGFTb3VyY2UsXHJcbiAgaXNFcnJvckluZm8sXHJcbiAgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb25cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlcmVkIHtcclxuICByZW5kZXIoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGVzdHJveWFibGUge1xyXG4gIGRlc3Ryb3koKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGVzdHJveWFibGUgPSAob2JqOiBhbnkpOiBvYmogaXMgSURlc3Ryb3lhYmxlID0+IHtcclxuICByZXR1cm4gdHlwZW9mIG9iai5kZXN0cm95ID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHRocm93UmVuZGVyRXJyb3IgPSAoZWxlbWVudE5hbWU/OiBzdHJpbmcpOiBuZXZlciA9PiB7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItdGVtcGxhdGVcclxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1aXJlZCAke2VsZW1lbnROYW1lID8gKGAke2VsZW1lbnROYW1lICB9IGApIDogJyd9IGlzbid0IGNyZWF0ZWRgKTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBSZWFkb25seTxUPiA9IHtcclxuICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IFJlYWRvbmx5QXJyYXk8RGVlcFJlYWRvbmx5PFUxPj4gOiAoXHJcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gUmVhZG9ubHlNYXA8SywgRGVlcFJlYWRvbmx5PFUyPj4gOiAoXHJcbiAgICAgICAgVFtQXSBleHRlbmRzIFNldDxpbmZlciBVMz4gPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZWFkb25seTxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXT86IChcclxuICAgIFRbUF0gZXh0ZW5kcyBBcnJheTxpbmZlciBVMT4gPyBBcnJheTxEZWVwUGFydGlhbDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUGFydGlhbDxVMj4+IDogKFxyXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBQYXJ0aWFsPFUzPj4gOiAoXHJcbiAgICAgICAgICBUW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW1BdIDogKFxyXG4gICAgICAgICAgICBEZWVwUGFydGlhbDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUmVxdWlyZWQ8VD4gPSB7XHJcbiAgW1AgaW4ga2V5b2YgVF0tPzogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IEFycmF5PERlZXBSZXF1aXJlZDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUmVxdWlyZWQ8VTI+PiA6IChcclxuICAgICAgICBUW1BdIGV4dGVuZHMgU2V0PGluZmVyIFUzPiA/IFNldDxEZWVwUmVxdWlyZWQ8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZXF1aXJlZDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uL0hlYWRlci9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCBEZWVwUmVhZG9ubHk8SU5hdmlnYXRpb25NZW51SXRlbU1vZGVsPikge1xyXG4gIGNvbnN0IHsgQXJlYSwgQ29udHJvbGxlciwgQWN0aW9uLCBJc0NsaWNrYWJsZSB9ID0gaXRlbURhdGE7XHJcblxyXG4gIGlmIChJc0NsaWNrYWJsZSAmJiBDb250cm9sbGVyKSB7XHJcbiAgICByZXR1cm4gQXJlYSA/IGVuY29kZVVSSShgLyR7QXJlYX0vJHtDb250cm9sbGVyfS8ke0FjdGlvbn1gKSA6IGVuY29kZVVSSShgLyR7Q29udHJvbGxlcn0vJHtBY3Rpb259YCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgeyBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuZXhwb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuIiwgImltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRCcmVha3BvaW50IHtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbWluV2lkdGg6IG51bWJlcjtcclxuICByZWFkb25seSBtYXhXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB7XHJcbiAgcmVhZG9ubHkgcHJldmlvdXNCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICByZWFkb25seSBjdXJyZW50QnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzID0ge1xyXG4gIHhzOiB7XHJcbiAgICBuYW1lOiAneHMnLFxyXG4gICAgbWluV2lkdGg6IDAsXHJcbiAgICBtYXhXaWR0aDogNTc1XHJcbiAgfSxcclxuICBzbToge1xyXG4gICAgbmFtZTogJ3NtJyxcclxuICAgIG1pbldpZHRoOiA1NzYsXHJcbiAgICBtYXhXaWR0aDogNzY3XHJcbiAgfSxcclxuICBtZDoge1xyXG4gICAgbmFtZTogJ21kJyxcclxuICAgIG1pbldpZHRoOiA3NjgsXHJcbiAgICBtYXhXaWR0aDogOTkxXHJcbiAgfSxcclxuICBsZzoge1xyXG4gICAgbmFtZTogJ2xnJyxcclxuICAgIG1pbldpZHRoOiA5OTIsXHJcbiAgICBtYXhXaWR0aDogMTE5OVxyXG4gIH0sXHJcbiAgeGw6IHtcclxuICAgIG5hbWU6ICd4bCcsXHJcbiAgICBtaW5XaWR0aDogMTIwMCxcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eVxyXG4gIH1cclxufSBhcyBjb25zdDtcclxuXHJcbmNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzTGlzdDogcmVhZG9ubHkgSUxheW91dEJyZWFrcG9pbnRbXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzKVxyXG4gIC5tYXAoKGJyZWFrcG9pbnROYW1lKSA9PiBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c1ticmVha3BvaW50TmFtZV0pO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyIGltcGxlbWVudHMgSURlc3Ryb3lhYmxlIHtcclxuICBwdWJsaWMgY3VycmVudExheW91dEJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25XaW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNpemVEZWxheTogbnVtYmVyO1xyXG4gIC8vIFRPRE86IHVzZSBtdWx0aXBsZSBldmVudCBsaXN0ZW5lclxyXG4gIHByb3RlY3RlZCByZWFkb25seSBvblJlc2l6ZTogKChlOiBVSUV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZDogKChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgbGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIG9uUmVzaXplPzogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgICBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkPzogKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpID0+IHZvaWQsXHJcbiAgICByZXNpemVEZWxheSA9IDEwMCxcclxuICAgIGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdID0gYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHNMaXN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uUmVzaXplID0gb25SZXNpemU7XHJcbiAgICB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQgPSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkO1xyXG4gICAgdGhpcy5yZXNpemVEZWxheSA9IHJlc2l6ZURlbGF5O1xyXG4gICAgdGhpcy5sYXlvdXRCcmVha3BvaW50cyA9IGxheW91dEJyZWFrcG9pbnRzO1xyXG5cclxuICAgIHRoaXMuY3VycmVudExheW91dEJyZWFrcG9pbnQgPSB0aGlzLmdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGV0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGV0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TGF5b3V0QnJlYWtwb2ludEJ5V2luZG93V2lkdGgod2luZG93V2lkdGg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0QnJlYWtwb2ludHMuZmluZCgobGF5b3V0QnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICByZXR1cm4gbGF5b3V0QnJlYWtwb2ludC5taW5XaWR0aCA8PSB3aW5kb3dXaWR0aCAmJiAoIWxheW91dEJyZWFrcG9pbnQubWF4V2lkdGggfHwgbGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB3aW5kb3dXaWR0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZShlOiBVSUV2ZW50KSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0V2luZG93UmVzaXplVGltZW91dElkKTtcclxuICAgIHRoaXMubGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMub25XaW5kb3dSZXNpemVJbnRlcm5hbChlKSwgdGhpcy5yZXNpemVEZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemVJbnRlcm5hbChlOiBVSUV2ZW50KSB7XHJcbiAgICBjb25zdCBsYXlvdXRCcmVha3BvaW50ID0gdGhpcy5nZXRMYXlvdXRCcmVha3BvaW50QnlXaW5kb3dXaWR0aCh3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCAhPT0gbGF5b3V0QnJlYWtwb2ludCkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQgPSB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50O1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50ID0gbGF5b3V0QnJlYWtwb2ludDtcclxuXHJcbiAgICAgIHRoaXMuZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKHtcclxuICAgICAgICBwcmV2aW91c0JyZWFrcG9pbnQ6IHByZXZpb3VzTGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBjdXJyZW50QnJlYWtwb2ludDogdGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFJlc2l6ZUV2ZW50KGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRSZXNpemVFdmVudChlOiBVSUV2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZD8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnIHtcclxuICBpc0xlZ2FjeVJlbmRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb25maWc6IElDb25maWcgPSB7XHJcbiAgaXNMZWdhY3lSZW5kZXI6IGZhbHNlXHJcbn07XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwsIElCYWRnZU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBpbnRlcmZhY2UtbmFtZVxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQge1xyXG4gIHJlYWRvbmx5IGl0ZW06IERlZXBSZWFkb25seTxJVXNlck1lbnVJdGVtTW9kZWw+O1xyXG4gIHJlYWRvbmx5IG9yaWdpbmFsRXZlbnQ6IFVJRXZlbnQ7XHJcbiAgY2FuY2VsPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlck1lbnVPcHRpb25zIHtcclxuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBnZXREaXNwbGF5ZWRVc2VySW5mbz86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgb25JdGVtQ2xpY2s/OiAoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbzogKHVzZXJOYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICh1c2VyTmFtZSkgPT4gYFdlbGNvbWUgJHt1c2VyTmFtZX1gO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5vbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZW1DbGljazogKChlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICAvLyBFbGVtZW50c1xyXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9iaWxlQ29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkZXNrdG9wUm9vdERyb3Bkb3duOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50VHJpZ2dlcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0RpdmlkZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJvb3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XHJcbiAgICB0aGlzLnVzZXJBdmF0YXIgPSBvcHRpb25zLnVzZXJBdmF0YXI7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuICAgIHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8gPSBvcHRpb25zLmdldERpc3BsYXllZFVzZXJJbmZvIHx8IFVzZXJNZW51LmRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbztcclxuICAgIHRoaXMub25JdGVtQ2xpY2sgPSBvcHRpb25zLm9uSXRlbUNsaWNrO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcclxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJNYWluRWxlbWVudHMoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlckluZm8oKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkSXRlbXMoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoaXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnNlcnRJdGVtcyhpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10sIHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCAuLi5pdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmFkZ2UoaXRlbU5hbWU6IHN0cmluZyk6IElCYWRnZU1vZGVsIHwgbnVsbCB7XHJcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5UZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpdGVtTmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIG1lbnVJdGVtPy5CYWRnZSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJhZGdlKGl0ZW1OYW1lOiBzdHJpbmcsIGJhZGdlOiBJQmFkZ2VNb2RlbCkge1xyXG4gICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uVGV4dD8udG9Mb3dlckNhc2UoKSA9PT0gaXRlbU5hbWUpO1xyXG5cclxuICAgIGlmIChtZW51SXRlbSkge1xyXG4gICAgICBtZW51SXRlbS5CYWRnZSA9IGJhZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyTWFpbkVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5fcm9vdC5jbGFzc0xpc3QuYWRkKCd1c2VyLW1lbnUnKTtcclxuXHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC8qJ25hdmJhci1uYXYnLCAqL2BkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tbm9uZWApO1xyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wUm9vdERyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbicsICdidG4nLCAnYnRuLW91dGxpbmUtbGlnaHQnKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnZHJvcGRvd24nKTtcclxuXHJcbiAgICBsZXQgYXZhdGFyO1xyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBpZiAodGhpcy51c2VyQXZhdGFyKSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgYXZhdGFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdoZWFkZXJfX2ljb24tYnV0dG9uLWF2YXRhcicpO1xyXG4gICAgICAgIGF2YXRhci5zcmMgPSB0aGlzLnVzZXJBdmF0YXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICAgIGF2YXRhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnZmFzJywgJ2ZhLXVzZXInKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICBhdmF0YXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbi1pY29uJywgJ2lzb3otaWNvbi11c2VyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51JywgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChhdmF0YXIpO1xyXG5cclxuICAgIGlmICh0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+ICEhaXRlbS5CYWRnZSkpIHtcclxuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9fYmFkZ2UnKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlcik7XHJcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5pdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9faXRlbXMnKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNicpO1xyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mbycsICdoNicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm8nLCAnZHJvcGRvd24taXRlbScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlckluZm9EaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnVzZXJJbmZvRGl2aWRlci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1kaXZpZGVyJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZVZpZXcpIHtcclxuICAgICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0RpdmlkZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pdGVtc0NvbnRhaW5lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9EaXZpZGVyKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLml0ZW1zQ29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lcik7XHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcFJvb3REcm9wZG93bik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyVXNlckluZm8oKSB7XHJcbiAgICBpZiAoIXRoaXMudXNlckluZm9Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3VzZXJJbmZvQ29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBjb25zdCB1c2VySW5mb0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mb19fY29udGVudCcpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmlubmVyVGV4dCA9IHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8odGhpcy51c2VyTmFtZSk7XHJcblxyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJJbmZvQ29udGVudEVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5pbm5lclRleHQgPSB0aGlzLmdldERpc3BsYXllZFVzZXJJbmZvKHRoaXMudXNlck5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLml0ZW1zQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdpdGVtc0NvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJJdGVtc0NvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudChpdGVtLCB0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgICAgIHRoaXMuaXRlbXNDb250YWluZXIhLmFwcGVuZENoaWxkKGl0ZW1FbGVtZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1FbGVtZW50KGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCwgaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbSk7XHJcblxyXG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKGlzTW9iaWxlID8gJ25hdi1saW5rJyA6ICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gaXRlbS5VcmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBsaW5rRWxlbWVudC50ZXh0ID0gaXRlbS5UZXh0O1xyXG4gICAgaWYoaXRlbS5PcGVuSW5OZXdQYWdlKSB7XHJcbiAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGxpbmtFbGVtZW50LCBpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoaXRlbS5CYWRnZSkge1xyXG4gICAgICBjb25zdCBiYWRnZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXNvei1iYWRnZScpO1xyXG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlLS1jaXJjbGUnKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZChgaXNvei1iYWRnZS0tJHtpdGVtLkJhZGdlLlR5cGUgfHwgJ2luZm9ybWF0aW9uJ31gKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuaW5uZXJIVE1MID0gaXRlbS5CYWRnZS5UZXh0O1xyXG5cclxuICAgICAgbGlua0VsZW1lbnQuYXBwZW5kQ2hpbGQoYmFkZ2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbTogSVVzZXJNZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJVXNlck1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMub25NZW51SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN3aXRjaFZpZXcoaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICB0aGlzLmFwcGx5TW9iaWxlVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9yVXNlckluZm8oKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9Db250YWluZXIsIG51bGwpO1xyXG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCkge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy51c2VySW5mb0NvbnRhaW5lciwgbnVsbCk7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbUVsZW1lbnQgb2YgdGhpcy5pdGVtc0NvbnRhaW5lci5jaGlsZHJlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseURlc2t0b3BWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLml0ZW1zQ29udGFpbmVyLCBudWxsKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW1FbGVtZW50IG9mIHRoaXMuaXRlbXNDb250YWluZXIuY2hpbGRyZW4pIHtcclxuICAgICAgaXRlbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYXJJdGVtc0NvbnRhaW5lcigpIHtcclxuICAgIHdoaWxlICh0aGlzLml0ZW1zQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5pdGVtc0NvbnRhaW5lci5maXJzdENoaWxkLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkl0ZW1DbGljaz8uKGUpO1xyXG4gICAgICBlLml0ZW0uT25DbGljaz8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldyh0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLmVtaXRJdGVtQ2xpY2soZSk7XHJcblxyXG4gICAgaWYgKGUuY2FuY2VsKSB7XHJcbiAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZW51SXRlbSB7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgaXRlbXM/OiBJTWVudUl0ZW1bXTtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgaGlkZGVuPzogYm9vbGVhbjtcclxuICBhY3RpdmU/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBtZW51SXRlbUVsPzogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgb3JpZ2luYWxNb2RlbDogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJTWVudUl0ZW07XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudU9wdGlvbnMge1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgaXRlbXM6IElNZW51SXRlbVtdO1xyXG4gIG9uSXRlbUNsaWNrPzogKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lbnUgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBpdGVtczogSU1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uSXRlbUNsaWNrOiAoKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZWxlbWVudHNcclxuICBwcm90ZWN0ZWQgcm9vdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElNZW51T3B0aW9ucykge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5vbkl0ZW1DbGljayA9IG9wdGlvbnMub25JdGVtQ2xpY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKCk6IHZvaWQ7XHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uSXRlbUNsaWNrPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNZW51LCBJTWVudU9wdGlvbnMsIElNZW51SXRlbSB9IGZyb20gJy4vTWVudSc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IgfSBmcm9tICcuLi9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsIGlzSXRlbUFjdGl2ZSB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2xsYXBzaW5nTW9kZSB7XHJcbiAgRGlzYWJsZWQsXHJcbiAgQ29sbGFwc2VkLFxyXG4gIEV4cGFuZGVkLFxyXG4gIEFkYXB0aXZlQ29sbGFwc2luZ1xyXG59XHJcblxyXG50eXBlIEl0ZW1BY3Rpb25Nb2RlID0gJ2hvdmVyJyB8ICdjbGljayc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJvb3RzdHJhcENvbGxhcHNpbmdNZW51T3B0aW9ucyBleHRlbmRzIElNZW51T3B0aW9ucyB7XHJcbiAgaXRlbUFjdGlvbj86IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIGNvbGxhcHNpbmdNb2RlPzogQ29sbGFwc2luZ01vZGU7XHJcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgY29sbGFwc2VJY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgZXh0ZW5kcyBNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIEhPVkVSX01PREVfQ1NTX0NMQVNTID0gJ25hdmJhci1uYXZfaG92ZXItYWN0aW9uJztcclxuICBwcm90ZWN0ZWQgc3RhdGljIGFkYXB0aXZpdHlDb2xsYXBzaW5nRGVsYXkgPSA1MDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbUFjdGlvbk1vZGU6IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsYXBzaW5nTW9kZTogQ29sbGFwc2luZ01vZGU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlSWNvbk5hbWU6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvbldpbmRvd1Jlc2l6ZUV2ZW50SGFuZGxlciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrSGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uVG9nZ2xlRHJvcGRvd25CdXR0b25Nb3VzZUVudGVySGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcclxuICAvLyBlbGVtZW50c1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZVJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZUJ1dHRvbjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJvdGVjdGVkIGNvbGxhcHNlRHJvcGRvd246IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjdXJyZW50T3BlbmluZ1N1Yk1lbnU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQm9vdHN0cmFwQ29sbGFwc2luZ01lbnVPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLml0ZW1BY3Rpb25Nb2RlID0gb3B0aW9ucy5pdGVtQWN0aW9uIHx8ICdob3Zlcic7XHJcbiAgICB0aGlzLmNvbGxhcHNpbmdNb2RlID0gb3B0aW9ucy5jb2xsYXBzaW5nTW9kZSA/PyBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmc7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMuY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG4gICAgdGhpcy5jb2xsYXBzZUljb25OYW1lID0gb3B0aW9ucy5jb2xsYXBzZUljb24gfHwgJ2ZhLWVsbGlwc2lzLXYnO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIoXHJcbiAgICAgIHRoaXMuY29sbGFwc2luZ01vZGUgPT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZyA/IHRoaXMub25XaW5kb3dSZXNpemVFdmVudEhhbmRsZXIgOiB1bmRlZmluZWQsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuYWRhcHRpdml0eUNvbGxhcHNpbmdEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcclxuICAgIHN1cGVyLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgaXNuXFwndCByZW5kZXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLnJvb3QuZmlyc3RDaGlsZCkge1xyXG4gICAgICB0aGlzLnJvb3QuZmlyc3RDaGlsZC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIGlmICh0aGlzLmNvbGxhcHNpbmdNb2RlICE9PSBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmdcclxuICAgICAgfHwgIXRoaXMucm9vdCB8fCAhdGhpcy5pdGVtcy5sZW5ndGggfHwgIXRoaXMuY29sbGFwc2VSb290IHx8ICF0aGlzLmNvbGxhcHNlRHJvcGRvd24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZVJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcblxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1FbGVtZW50ID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAyXTtcclxuICAgICAgICBpZiAoIWxhc3RJdGVtRWxlbWVudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdmVSb290SXRlbXNUb0NvbGxhcHNlRHJvcGRvd24obGFzdEl0ZW1FbGVtZW50KTtcclxuICAgICAgfSB3aGlsZSAodGhpcy5pc05lZWRDb2xsYXBzZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Sb290KHRoaXMuY29sbGFwc2VEcm9wZG93bi5maXJzdEVsZW1lbnRDaGlsZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RJdGVtRWxlbWVudCA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnJvb3QuY2hpbGRyZW4ubGVuZ3RoIC0gMl07XHJcbiAgICAgICAgICBsYXN0SXRlbUVsZW1lbnQgJiYgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5jb2xsYXBzZURyb3Bkb3duLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHRoaXMuaXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9sZEFjdGl2ZVZhbHVlID0gaXRlbS5hY3RpdmU7XHJcbiAgICAgIGl0ZW0uYWN0aXZlID0gaXNJdGVtQWN0aXZlKGl0ZW0ub3JpZ2luYWxNb2RlbCk7XHJcblxyXG4gICAgICBpZiAoaXRlbS5hY3RpdmUgIT09IG9sZEFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbS5tZW51SXRlbUVsLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCBpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VPcGVuZWREcm9wZG93bih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgLy9OT1RFOiBGb3IgY2xvc2luZyBvcGVuZWQgZHJvcGRvd25cclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgICAkKHRhcmdldEVsZW1lbnQpLm9uZSgnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChCb290c3RyYXBDb2xsYXBzaW5nTWVudS5IT1ZFUl9NT0RFX0NTU19DTEFTUyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvckVhY2hNZW51SXRlbVJlY3Vyc2l2ZShyb290SXRlbXM6IElNZW51SXRlbVtdLCBhY3Rpb246IChpdGVtOiBJTWVudUl0ZW0pID0+IHZvaWQpIHtcclxuICAgIHJvb3RJdGVtcy5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGFjdGlvbihpKTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXN0ZWRJdGVtc093bmVySXRlbShpKSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKGkuaXRlbXMsIGFjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ25hdmJhci1uYXYnLCAnbXItYXV0bycpO1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgdGhpcy5yZW5kZXJSb290SXRlbXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggJiYgdGhpcy5jb2xsYXBzaW5nTW9kZSAhPT0gQ29sbGFwc2luZ01vZGUuRGlzYWJsZWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgICB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIHRoaXMucmVuZGVyQ29sbGFwc2VFbGVtZW50cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKTtcclxuICAgICAgICB0aGlzLnJvb3Quc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZWZhdWx0RHJvcGRvd25CZWhhdmlvckZvck5lc3RlZERyb3Bkb3duKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hhbmdlRGVmYXVsdERyb3Bkb3duQmVoYXZpb3JGb3JOZXN0ZWREcm9wZG93bigpIHtcclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bicpKS5vbignaGlkZS5icy5kcm9wZG93bicsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGUudGFyZ2V0ICE9PSB0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSAmJiBlLnRhcmdldC5jb250YWlucyh0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSk7XHJcblxyXG4gICAgICByZXR1cm4gIXJlc3VsdDtcclxuICAgIH0pO1xyXG5cclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1zdWJtZW51JykpLm9uKCdzaG93LmJzLmRyb3Bkb3duJywgKGUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb2xsYXBzZUVsZW1lbnRzKCkge1xyXG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScsICdkcm9wZG93bicsICdjb2xsYXBzaW5nLW1lbnVfX2NvbGxhcHNlLXJvb3QnKTtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24nLCAnYnRuJywgJ2J0bi1vdXRsaW5lLWxpZ2h0Jyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuY29sbGFwc2VCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdmYXMnLCB0aGlzLmNvbGxhcHNlSWNvbk5hbWUpO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScsICdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcclxuICAgIHRoaXMuY29sbGFwc2VSb290LmFwcGVuZENoaWxkKHRoaXMuY29sbGFwc2VCdXR0b24pO1xyXG4gICAgdGhpcy5jb2xsYXBzZVJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZURyb3Bkb3duKTtcclxuXHJcbiAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZVJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3RJdGVtcygpIHtcclxuICAgIGlmICghdGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbVdpdGhOZXN0ZWRJdGVtcyhpdGVtIGFzIElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yb290IS5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtV2l0aE5lc3RlZEl0ZW1zKGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbUVsZW1lbnQoaXRlbSk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Db250ZW50ID0gaXRlbUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1pdGVtJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudC5ocmVmID0gaXRlbS51cmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBpdGVtQ29udGVudC50ZXh0ID0gaXRlbS50ZXh0O1xyXG5cclxuICAgIGNvbnN0IGljb25FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbSk7XHJcbiAgICBpY29uRWxlbWVudCAmJiBpdGVtQ29udGVudC5pbnNlcnRCZWZvcmUoaWNvbkVsZW1lbnQsIGl0ZW1Db250ZW50LmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgIHRoaXMuYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1Db250ZW50LCBpdGVtKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGl0ZW1Db250ZW50LCBpdGVtKTtcclxuXHJcbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtQ29udGVudCk7XHJcblxyXG4gICAgaXRlbS5tZW51SXRlbUVsID0gaXRlbUVsZW1lbnQ7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZFN1Yk1lbnVJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGl0ZW1FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1pdGVtJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZEl0ZW0oaXRlbTogSU1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWl0ZW0nKTtcclxuICAgIGl0ZW1Db250ZW50LmhyZWYgPSBpdGVtLnVybCB8fCAnamF2YXNjcmlwdDp2b2lkKDApJztcclxuICAgIGl0ZW1Db250ZW50LnRleHQgPSBpdGVtLnRleHQ7XHJcblxyXG4gICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtKTtcclxuICAgIGljb25FbGVtZW50ICYmIGl0ZW1Db250ZW50Lmluc2VydEJlZm9yZShpY29uRWxlbWVudCwgaXRlbUNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG4gICAgdGhpcy5hdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG5cclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1Db250ZW50KTtcclxuXHJcbiAgICBpdGVtLm1lbnVJdGVtRWwgPSBpdGVtRWxlbWVudDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRHJvcGRvd25NZW51KGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgZHJvcGRvd25NZW51RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51Jyk7XHJcblxyXG4gICAgaXRlbS5pdGVtcy5mb3JFYWNoKChuZXN0ZWRJdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0obmVzdGVkSXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVOZXN0ZWRTdWJNZW51SXRlbUVsZW1lbnQobmVzdGVkSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udGVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShuZXN0ZWRJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZHJvcGRvd25NZW51RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcm9wZG93bk1lbnVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmICghaXRlbS5pY29uKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgaXRlbUljb24uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2l0ZW0uaWNvbn0pYDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUljb247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXRvZ2dsZScpO1xyXG4gICAgaXRlbUNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXJIYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmIChpdGVtLmFjdGl2ZSkge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmhpZGRlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElNZW51SXRlbSkge1xyXG4gICAgaXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5lbWl0SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbTogSU1lbnVJdGVtKTogaXRlbSBpcyBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9IHtcclxuICAgIHJldHVybiBpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoICYmIGl0ZW0uaXRlbXMuc29tZSgoaSkgPT4gIWkuaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKHJvb3RJdGVtT3JJdGVtczogRWxlbWVudCB8IEl0ZXJhYmxlPEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93bi5hcHBlbmRDaGlsZCh0ZW1wSXRlbUVsZW1lbnRzU3RvcmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb1Jvb3Qocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGlmIChyb290SXRlbU9ySXRlbXMgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLnJvb3QuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAxXSB8fCBudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5RXhwYW5kZWRWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGVtcEl0ZW1FbGVtZW50c1N0b3JlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseUNvbGxhcHNpbmdWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW06IEVsZW1lbnQpIHtcclxuICAgIHJvb3RJdGVtLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvb3RJdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgIGNoaWxkLmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbTogRWxlbWVudCkge1xyXG4gICAgcm9vdEl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnZHJvcGRvd24tc3VibWVudScpO1xyXG5cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdEl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc05lZWRDb2xsYXBzZSgpIHtcclxuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1pbldpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWluV2lkdGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9vdC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcclxuICAgIGNvbnN0IGN1cnJlbnRSb290UmVjdCA9IHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaW5nLW1lbnVfbm9ybWFsLXdoaXRlLXNwYWNlJyk7XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsUm9vdFJlY3QgPSB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2luZy1tZW51X25vcm1hbC13aGl0ZS1zcGFjZScpO1xyXG4gICAgdGhpcy5yb290LnN0eWxlLm1heFdpZHRoID0gJyc7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRSb290UmVjdC53aWR0aCA+IG5vcm1hbFJvb3RSZWN0LndpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHJvcGRvd25SZWN0c0ludGVyc2VjdChkcm9wZG93blJlY3QxOiBDbGllbnRSZWN0LCBkcm9wZG93blJlY3QyOiBDbGllbnRSZWN0LCBkZWx0YSA9IDIpIHtcclxuICAgIHJldHVybiBkcm9wZG93blJlY3QxLmxlZnQgPCAoZHJvcGRvd25SZWN0Mi5yaWdodCAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi5sZWZ0ICsgZGVsdGEpIDwgZHJvcGRvd25SZWN0MS5yaWdodFxyXG4gICAgICAmJiBkcm9wZG93blJlY3QxLnRvcCA8IChkcm9wZG93blJlY3QyLmJvdHRvbSAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi50b3AgKyBkZWx0YSkgPCBkcm9wZG93blJlY3QxLmJvdHRvbTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVNoYWRvd3NGb3JPdmVybGFwaW5nRHJvcGRvd25JZk5lZWRlZChvcGVuZWREcm9wZG93bkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyBSZXNldCB0aGUgc3R5bGUgYmVmb3JlIHRoZSByZWN0IGdldHRpbmcgdG8gZ2V0IHJlYWwgdmFsdWVzXHJcbiAgICBvcGVuZWREcm9wZG93bkVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Bkb3duLW1lbnUtbGVmdC1zaGFkb3dlZCcpO1xyXG4gICAgbGV0IHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAocmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5zdHlsZS5sZWZ0ID0gYC0ke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bkb3duLW1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRyb3Bkb3duRWxlbWVudCBvZiBkcm9wZG93bkVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgPT09IG9wZW5lZERyb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duUmVjdHNJbnRlcnNlY3QoZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByZWN0KSkge1xyXG4gICAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51LWxlZnQtc2hhZG93ZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uV2luZG93UmVzaXplKGU6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMuYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLnRhcmdldC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE9wZW5pbmdTdWJNZW51ID0gZS50YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlcihlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lci5jdXJyZW50TGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5tYXhXaWR0aCAmJlxyXG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XHJcbiAgICAgICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xyXG4gICAgICB0aGlzLmFwcGx5U2hhZG93c0Zvck92ZXJsYXBpbmdEcm9wZG93bklmTmVlZGVkKGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhLCBJTGF5b3V0QnJlYWtwb2ludCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBCb290c3RyYXBDb2xsYXBzaW5nTWVudSB9IGZyb20gJy4uL0NvbXBvbmVudHMvTWVudSc7XHJcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9NZW51L01lbnUnO1xyXG5pbXBvcnQgeyBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vU2VhcmNoJztcclxuXHJcbmNvbnN0IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkgPSAoaXRlbXM6IHJlYWRvbmx5IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdLCBpdGVtTmFtZTogc3RyaW5nKTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIHwgdW5kZWZpbmVkID0+IHtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgIGlmIChpdGVtLk5hbWUgPT09IGl0ZW1OYW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLkl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbmVzdGVkSXRlbSA9IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkoaXRlbS5JdGVtcywgaXRlbU5hbWUpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZEl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gbmVzdGVkSXRlbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEl0ZW1VcmxzUmVjdXJzaXZlbHkgPSAoaXRlbURhdGE6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCBpdGVtcyA9IGl0ZW1EYXRhLkl0ZW1zO1xyXG5cclxuICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IG93blVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhKTtcclxuXHJcbiAgICByZXR1cm4gb3duVXJsID8gW293blVybF0gOiBbXTtcclxuICB9XHJcblxyXG4gIGxldCB1cmxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XHJcbiAgICB1cmxzID0gdXJscy5jb25jYXQoZ2V0SXRlbVVybHNSZWN1cnNpdmVseShjaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVybHM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtQWN0aXZlID0gKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpID0+IHtcclxuICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xyXG4gIGNvbnN0IGl0ZW1VcmxzID0gZ2V0SXRlbVVybHNSZWN1cnNpdmVseShpdGVtRGF0YSk7XHJcblxyXG4gIGZvciAoY29uc3QgdXJsIG9mIGl0ZW1VcmxzKSB7XHJcbiAgICBjb25zdCB1cmxSZSA9IG5ldyBSZWdFeHAoYF4uKiR7dXJsLnJlcGxhY2UoJz8nLCAnXFxcXD8nKX0kYCk7XHJcblxyXG4gICAgaWYgKHVybFJlLnRlc3QoY3VycmVudExvY2F0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbDtcclxuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xyXG4gIGNhbmNlbD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uTWVudSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnU6IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51O1xyXG4gIHByaXZhdGUgaXNHbG9iYWxNZW51OiBib29sZWFuO1xyXG4gIHByaXZhdGUgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sXHJcbiAgICBpc0dsb2JhbE1lbnU6IGJvb2xlYW4sXHJcbiAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50LFxyXG4gICAgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWRcclxuICApIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnUsXHJcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcbiAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2sgPSBvbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrO1xyXG4gICAgdGhpcy5tZW51ID0gbmV3IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51KHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgaXRlbXM6IHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhpdGVtcyksXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgb25JdGVtQ2xpY2s6IHRoaXMub25NZW51SXRlbUNsaWNrSGFuZGxlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGlzR2xvYmFsTWVudTogYm9vbGVhbikge1xyXG4gICAgLyogZXNsaW50IEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnM6IG9mZiAqL1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnU7XHJcbiAgICB0aGlzLm1lbnUudXBkYXRlSXRlbXModGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKHRoaXMuaXRlbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLm1lbnUucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIHRoaXMubWVudS5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMubWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMubWFwTWVudUl0ZW1DbGlja0V2ZW50QXJnc1RvTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudEFyZ3MoZSk7XHJcbiAgICBpZiAoZXZlbnRBcmdzKSB7XHJcbiAgICAgIHRoaXMuZW1pdE5hdmlnYXRpb25NZW51SXRlbUNsaWNrKGV2ZW50QXJncyk7XHJcblxyXG4gICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xyXG4gICAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5tZW51LmNsb3NlT3BlbmVkRHJvcGRvd24odGFyZ2V0RWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgICAgZS5pdGVtLk9uQ2xpY2s/LihlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIHJldHVybiBtZW51SXRlbU1vZGVscy5tYXA8SU1lbnVJdGVtPigobWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbSA9IHtcclxuICAgICAgICB0ZXh0OiBtZW51SXRlbU1vZGVsLk5hbWUsXHJcbiAgICAgICAgaWNvbjogbWVudUl0ZW1Nb2RlbC5JY29uLFxyXG4gICAgICAgIGl0ZW1zOiBtZW51SXRlbU1vZGVsLkl0ZW1zID8gdGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKG1lbnVJdGVtTW9kZWwuSXRlbXMpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHVybDogZ2V0VXJsQnlNZW51SXRlbURhdGEobWVudUl0ZW1Nb2RlbCksXHJcbiAgICAgICAgaGlkZGVuOiBtZW51SXRlbU1vZGVsLlZpc2libGUgPT09IGZhbHNlLFxyXG4gICAgICAgIGFjdGl2ZTogaXNJdGVtQWN0aXZlKG1lbnVJdGVtTW9kZWwpLFxyXG4gICAgICAgIGRpc2FibGVkOiBtZW51SXRlbU1vZGVsLkRpc2FibGVkLFxyXG4gICAgICAgIHRpdGxlOiBtZW51SXRlbU1vZGVsLkRlc2NyaXB0aW9uLFxyXG4gICAgICAgIG9yaWdpbmFsTW9kZWw6IG1lbnVJdGVtTW9kZWxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBtZW51SXRlbTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBNZW51SXRlbUNsaWNrRXZlbnRBcmdzVG9OYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50QXJncyhlOiBNZW51SXRlbUNsaWNrRXZlbnQpOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHwgbnVsbCB7XHJcbiAgICBjb25zdCBpdGVtID0gZmluZEl0ZW1CeU5hbWVSZWN1cnNpdmVseSh0aGlzLml0ZW1zLCBlLml0ZW0udGV4dCk7XHJcblxyXG4gICAgcmV0dXJuICFpdGVtID8gbnVsbCA6IHtcclxuICAgICAgb3JpZ2luYWxFdmVudDogZS5vcmlnaW5hbEV2ZW50LFxyXG4gICAgICBjYW5jZWw6IGZhbHNlLFxyXG4gICAgICBpdGVtOiB7IC4uLml0ZW0sIGlzR2xvYmFsOiB0aGlzLmlzR2xvYmFsTWVudSB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZID0gJ2lzem9sZWEtdWl8bG9nby1zZXR0aW5ncyc7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dvIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSAkaW1hZ2VFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgJHRpdGxlQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0V2lkZ2V0KCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEYXRhKCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRXaWRnZXQoZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgY29uc3QgY2FjaGVkU2V0dGluZ3NSYXcgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ28oSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XHJcblxyXG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVMb2dvKGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTG9nbyhkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB7XHJcbiAgICBpZiAodHlwZW9mIGRhdGFTb3VyY2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGxvZ29TZXR0aW5ncyA9IGRhdGFTb3VyY2UgYXMgSUxvZ29TZXR0aW5ncztcclxuXHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzKTtcclxuXHJcbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZGF0YVNvdXJjZSBhcyBzdHJpbmcsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgPSB7fTtcclxuICAgICAgbG9nb1NldHRpbmdzLmFwcGxpY2F0aW9uTmFtZSA9IGRhdGEuQXBwbGljYXRpb25OYW1lO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lID0gZGF0YS5CdXNpbmVzc05hbWU7XHJcbiAgICAgIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UgPSBkYXRhLkxvZ29JbWFnZTtcclxuICAgICAgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbyA9IGRhdGEuTGFuZGluZ1BhZ2VMb2dvO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb24gPSBkYXRhLkRlc2NyaXB0aW9uO1xyXG5cclxuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGxvZ29TZXR0aW5ncykpO1xyXG5cclxuICAgICAgdGhpcy5fY3JlYXRlTG9nb01hcmt1cChsb2dvU2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVMb2dvTWFya3VwKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncykge1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50ID0gJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd0aXRsZS1jb250YWluZXInKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpKTtcclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2FwcC1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYXBwbGljYXRpb25OYW1lLnRvVXBwZXJDYXNlKCkpKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElEZXN0cm95YWJsZSwgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIElMYXlvdXRCcmVha3BvaW50LCBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudVN3aXRjaGVyT3B0aW9ucyB7XHJcbiAgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBzdGFydFZhbHVlPzogYm9vbGVhbjtcclxuICBvblN3aXRjaD86ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTd2l0Y2hlciBpbXBsZW1lbnRzIElSZW5kZXJlZCwgSURlc3Ryb3lhYmxlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2t0b3BDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblN3aXRjaDogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkTGlzdGVuZXIgPSB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1Jlc2l6ZUxpc3RlbmVyOiBXaW5kb3dSZXNpemVMaXN0ZW5lcjtcclxuICBwcml2YXRlIF92YWx1ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIG1lbnVTd2l0Y2hlcjogRGV2RXhwcmVzcy51aS5keFN3aXRjaCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uVmFsdWVDaGFuZ2VkOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJTWVudVN3aXRjaGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGFpbmVyID0gb3B0aW9ucy5kZXNrdG9wQ29udGFpbmVyO1xyXG4gICAgdGhpcy5tb2JpbGVDb250YWluZXIgPSBvcHRpb25zLm1vYmlsZUNvbnRhaW5lcjtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcbiAgICB0aGlzLm9uU3dpdGNoID0gb3B0aW9ucy5vblN3aXRjaDtcclxuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9ucy5zdGFydFZhbHVlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0YXJ0VmFsdWUgOiB0cnVlO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBjb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZVZpZXcgPyB0aGlzLm1vYmlsZUNvbnRhaW5lciA6IHRoaXMuZGVza3RvcENvbnRhaW5lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZShpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyU3dpdGNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KCk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlcj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIHJvb3Q/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVZhbHVlQ2hhbmdlZChvblZhbHVlQ2hhbmdlZDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb25WYWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclN3aXRjaCgpIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gJCgnPGRpdj4nKS5keFN3aXRjaCh7XHJcbiAgICAgIHN3aXRjaGVkT2ZmVGV4dDogJ1BlcnNvbmFsJyxcclxuICAgICAgc3dpdGNoZWRPblRleHQ6ICdHbG9iYWwnLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgd2lkdGg6ICcxMDBweCcsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vblN3aXRjaCkge1xyXG4gICAgICAgICAgdGhpcy5vblN3aXRjaCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keFN3aXRjaCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KClbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldygpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4nO1xyXG5pbXBvcnQgeyBNZW51SXRlbVR5cGUgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IGJvb2xlYW47XHJcbiAgb25EaW1lbnNpb25zQ2hhbmdlZD86ICgpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbUNsaWNrPzogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbU9wZW5lZD86IChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgZ2xvYWJhbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXTtcclxuICBwZXJzb25hbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlblJlcG9ydEV2ZW50QXJncyB7XHJcbiAgbWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCA9IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCAmIHtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZWQ6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2s6IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25NZW51SXRlbU9wZW5lZDogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHNlYXJjaERyb3BEb3duOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRzVHJlZUxpc3Q6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNlYXJjaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZ2V0TWVudURhdGFTb3VyY2UgPSBvcHRpb25zLmdldE1lbnVEYXRhU291cmNlO1xyXG4gICAgdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93biA9IG9wdGlvbnMuZ2V0SXNHbG9iYWxNZW51U2hvd247XHJcbiAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgPSBvcHRpb25zLm9uRGltZW5zaW9uc0NoYW5nZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgPSBvcHRpb25zLm9uTWVudUl0ZW1PcGVuZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1DbGljayA9IG9wdGlvbnMub25NZW51SXRlbUNsaWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUoaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3ZhbHVlJywgdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkTWVudUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Q/Lm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuZ2V0RGF0YVNvdXJjZUZvclNlYXJjaCh0aGlzLmdldE1lbnVEYXRhU291cmNlKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBmb3JtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgIGZvcm1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0taW5saW5lJyk7XHJcblxyXG4gICAgY29uc3QgJGlucHV0ID0gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCcsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93RHJvcERvd25CdXR0b246IGZhbHNlLFxyXG4gICAgICBhcHBseVZhbHVlTW9kZTogJ2luc3RhbnRseScsXHJcbiAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICBvcGVuT25GaWVsZENsaWNrOiBmYWxzZSxcclxuICAgICAgbW9kZTogJ3NlYXJjaCcsXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgJ3R5cGUnOiAnc2VhcmNoJyxcclxuICAgICAgICAnYXJpYS1sYWJlbCc6ICdTZWFyY2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUsICRlbCkgPT4ge1xyXG4gICAgICAgICRlbC5hZGRDbGFzcygnaGVhZGVyLXNlYXJjaC1yZXN1bHRzLXRyZWUtbGlzdCcpO1xyXG4gICAgICAgIGNvbnN0ICR0cmVlTGlzdCA9ICQoJzxkaXY+JykuZHhUcmVlTGlzdCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmdldERhdGFTb3VyY2VGb3JTZWFyY2godGhpcy5nZXRNZW51RGF0YVNvdXJjZSgpKSxcclxuICAgICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG5vRGF0YVRleHQ6ICdObyByZXN1bHRzIGZvdW5kJyxcclxuICAgICAgICAgIGRhdGFTdHJ1Y3R1cmU6ICd0cmVlJyxcclxuICAgICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgICBpdGVtc0V4cHI6ICdJdGVtcycsXHJcbiAgICAgICAgICBmaWx0ZXJNb2RlOiAnZnVsbEJyYW5jaCcsXHJcbiAgICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogZmFsc2UsXHJcbiAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIG9uQ2VsbENsaWNrOiAoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTWVudUl0ZW0oZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGFyZ3MuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFJvd0tleSA9IHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0Lm9wdGlvbignZm9jdXNlZFJvd0tleScpO1xyXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFJvd0tleSAhPT0gbnVsbCAmJiBmb2N1c2VkUm93S2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Tm9kZUJ5S2V5KGZvY3VzZWRSb3dLZXkpLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01lbnVJdGVtKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5leHBhbmRSb3coZm9jdXNlZFJvd0tleSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmNvbGxhcHNlUm93KGZvY3VzZWRSb3dLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdCA9ICR0cmVlTGlzdC5keFRyZWVMaXN0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICByZXR1cm4gJHRyZWVMaXN0O1xyXG4gICAgICB9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgb2Y6ICcuc2VhcmNoLWRyb3Bkb3duJyxcclxuICAgICAgICAgIG15OiAndG9wJyxcclxuICAgICAgICAgIGF0OiAnYm90dG9tJyxcclxuICAgICAgICAgIG9mZnNldDogeyB4OiAxNDksIHk6IDQgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IDUxOCxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIHNob3c6IHsgZHVyYXRpb246IDAgfSxcclxuICAgICAgICAgIGhpZGU6IHsgZHVyYXRpb246IDAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRm9jdXNJbjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5lbGVtZW50KCkuYWRkQ2xhc3MoJ2ZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgJiYgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KGUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkgYXMgc3RyaW5nKTtcclxuICAgICAgfSxcclxuICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmVsZW1lbnQoKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xyXG4gICAgICAgICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25LZXlVcDogKGUpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gZS5ldmVudCBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZCgnaW5wdXQuZHgtdGV4dGVkaXRvci1pbnB1dCcpLnZhbCgpIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkodmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Quc2VhcmNoQnlUZXh0KHZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IHRyaWdnZXJlZEZvY3VzQnV0dG9ucyA9IFsnVGFiJywgJ0VudGVyJywgJ0Fycm93RG93bicsICdBcnJvd1VwJ107XHJcbiAgICAgICAgICBpZiAodHJpZ2dlcmVkRm9jdXNCdXR0b25zLnNvbWUoKGIpID0+IGIgPT09IGV2ZW50LmtleSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZm9jdXModGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Q2VsbEVsZW1lbnQoMCwgJ05hbWUnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGUuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZVNlYXJjaERyb3BEb3duKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkoZS52YWx1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5hZGRDbGFzcyhbJ2Zvcm0tY29udHJvbCcsICdtci1zbS0yJywgJ3NlYXJjaC1kcm9wZG93biddKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duID0gJGlucHV0LmR4RHJvcERvd25Cb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgZm9ybUVsZW1lbnQuYXBwZW5kQ2hpbGQoJGlucHV0WzBdKTtcclxuICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmQoZm9ybUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvTWVudUl0ZW0obWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShtZW51SXRlbSk7XHJcblxyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICB0aGlzLmNsb3NlU2VhcmNoRHJvcERvd24oKTtcclxuXHJcbiAgICAgIGNvbnN0IGFyZ3M6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgPSB7XHJcbiAgICAgICAgaXRlbTogbWVudUl0ZW0sXHJcbiAgICAgICAgb3JpZ2luYWxFdmVudDogbnVsbCxcclxuICAgICAgICBjYW5jZWw6IGZhbHNlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1DbGljaz8uKGFyZ3MpO1xyXG5cclxuICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgJiYgdGhpcy5vbk1lbnVJdGVtT3BlbmVkKHsgbWVudUl0ZW0gfSk7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZVNlYXJjaERyb3BEb3duKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Qub3B0aW9uKCdmb2N1c2VkUm93S2V5JywgdW5kZWZpbmVkKTtcclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wdGlvbigndmFsdWUnLCAnJyk7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5mb2N1cygpO1xyXG4gICAgdGhpcy5zZWFyY2hEcm9wRG93bj8uYmx1cigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcGVuKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhU291cmNlRm9yU2VhcmNoKGRzOiBJU2VhcmNoRGF0YVNvdXJjZSk6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFkcykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdldFJlZHVjZXIgPSAoaXNHbG9iYWw6IGJvb2xlYW4pID0+IHtcclxuICAgICAgY29uc3QgcmVkdWNlciA9IChyZXM6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGl0ZW06IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLkl0ZW1zICYmIGl0ZW0uSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpdGVtLkl0ZW1zID0gaXRlbS5JdGVtcy5yZWR1Y2UocmVkdWNlciwgW10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gaXRlbS5WaXNpYmxlID09PSB1bmRlZmluZWQgfHwgaXRlbS5WaXNpYmxlID09PSBudWxsIHx8IGl0ZW0uVmlzaWJsZSA9PT0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gaXRlbS5EaXNhYmxlZCA9PT0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzVmlzaWJsZSAmJiAhaXNEaXNhYmxlZCkge1xyXG4gICAgICAgICAgcmVzLnB1c2goeyAuLi5pdGVtLCBpc0dsb2JhbCB9IGFzIElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gcmVkdWNlcjtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGRzLnBlcnNvbmFsSXRlbXMgJiYgZHMucGVyc29uYWxJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZ2xvYmFsTWVudVJvb3QgPSB7XHJcbiAgICAgICAgTmFtZTogJ0dsb2JhbCBNZW51JywgSWQ6IC0xLCBpc0dsb2JhbDogdHJ1ZSwgVHlwZTogTWVudUl0ZW1UeXBlLk1lbnVOb2RlLFxyXG4gICAgICAgIEl0ZW1zOiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcGVyc29uYWxNZW51Um9vdCA9IHtcclxuICAgICAgICBOYW1lOiAnUGVyc29uYWwgTWVudScsIElkOiAtMiwgaXNHbG9iYWw6IGZhbHNlLCBUeXBlOiBNZW51SXRlbVR5cGUuTWVudU5vZGUsXHJcbiAgICAgICAgSXRlbXM6IGRzLnBlcnNvbmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIoZmFsc2UpLCBbXSlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCkgPyBbZ2xvYmFsTWVudVJvb3QsIHBlcnNvbmFsTWVudVJvb3RdIDogW3BlcnNvbmFsTWVudVJvb3QsIGdsb2JhbE1lbnVSb290XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCB7IERldkV4cHJlc3NFdmVudEFyZ3MgfSBmcm9tICcuL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL0V2ZW50RW1pdHRlcic7XHJcbmV4cG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UnO1xyXG5leHBvcnQgeyBjcmVhdGVHcmlkRXhwb3J0RnVuY3Rpb24gfSBmcm9tICcuL0dyaWRFeHBvcnQnO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudExpc3RlbmVyczogYW55W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uKGV2dCwgbGlzdGVuZXIpIHtcclxuICAgIGlmICghdGhpcy5ldmVudExpc3RlbmVyc1tldnRdKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdGVuZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25jZShldnQsIGxpc3RlbmVyKSB7XHJcbiAgICB0aGlzLm9uKGV2dCwgKGUpID0+IHtcclxuICAgICAgbGlzdGVuZXIoZSk7XHJcbiAgICAgIHRoaXMub2ZmKGV2dCwgbGlzdGVuZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdChldnQsIGUgPSBudWxsKSB7XHJcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF07XHJcblxyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRMaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcclxuICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyKSB7XHJcbiAgICAgICAgICBjdXJyZW50TGlzdGVuZXIuY2FsbCh0aGlzLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvZmYoZXZ0LCBsaXN0ZW5lcikge1xyXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldnRdO1xyXG5cclxuICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBbXTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgY3VycmVudExpc3RlbmVyIG9mIGxpc3RlbmVycykge1xyXG4gICAgICAgIGlmIChjdXJyZW50TGlzdGVuZXIgIT09IGxpc3RlbmVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGN1cnJlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0gPSBmaWx0ZXJlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZGRIYW5kbGVyKGV2ZW50OiBzdHJpbmcsIG9yaWdpbkhhbmRsZXIsIGdldEFyZ3VtZW50cykge1xyXG4gICAgY29uc3QgaW50ZXJuYWxIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICBvcmlnaW5IYW5kbGVyKFxyXG4gICAgICAgIGdldEFyZ3VtZW50cygpLFxyXG4gICAgICAgICgpID0+IHRoaXMub2ZmKGV2ZW50LCBpbnRlcm5hbEhhbmRsZXIpXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub24oZXZlbnQsIGludGVybmFsSGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgc2F2ZUFzIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbihyZXBvcnROYW1lOiBzdHJpbmcpOiAoZTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkV4cG9ydGluZ0V2ZW50KSA9PiB2b2lkIHtcclxuICByZXR1cm4gKGU6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5FeHBvcnRpbmdFdmVudCkgPT4ge1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgKHdpbmRvdyBhcyBhbnkpLkV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldChyZXBvcnROYW1lKTtcclxuXHJcbiAgICBEZXZFeHByZXNzLmV4Y2VsRXhwb3J0ZXIuZXhwb3J0RGF0YUdyaWQoe1xyXG4gICAgICB3b3Jrc2hlZXQsXHJcbiAgICAgIGNvbXBvbmVudDogZS5jb21wb25lbnQsXHJcbiAgICAgIGN1c3RvbWl6ZUNlbGw6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXhjZWxDZWxsID0gb3B0aW9ucy5leGNlbENlbGw7XHJcblxyXG4gICAgICAgIGV4Y2VsQ2VsbC5mb250ID0geyBuYW1lOiAnQXJpYWwnLCBzaXplOiAxMiB9O1xyXG4gICAgICAgIGV4Y2VsQ2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdsZWZ0JyB9O1xyXG4gICAgICB9XHJcbiAgICB9KS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCkudGhlbihmdW5jdGlvbihidWZmZXIpIHtcclxuICAgICAgICBzYXZlQXMobmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSksIGAke3JlcG9ydE5hbWV9Lnhsc3hgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGUuY2FuY2VsID0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElMb2dvU2V0dGluZ3MgfSBmcm9tICcuLi9EYXRhJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyB0aHJvd1JlbmRlckVycm9yLCBNdXRhYmxlIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLCBnZXRVcmxCeU1lbnVJdGVtRGF0YSB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBVc2VyTWVudSwgVXNlck1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4vVXNlck1lbnUnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uTWVudSwgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4vTmF2aWdhdGlvbk1lbnUnO1xyXG5pbXBvcnQgeyBMb2dvIH0gZnJvbSAnLi9Mb2dvJztcclxuaW1wb3J0IHsgTWVudVN3aXRjaGVyIH0gZnJvbSAnLi9NZW51U3dpdGNoZXInO1xyXG5pbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lVc2VyTWVudUl0ZW0nO1xyXG5pbXBvcnQgeyBJTWVudVNldHRpbmdzIH0gZnJvbSAnLi9JTWVudVNldHRpbmdzJztcclxuaW1wb3J0IHsgSUFwcE1lbnVNb2RlbCB9IGZyb20gJy4vSUFwcE1lbnVNb2RlbCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuaW1wb3J0IFNlYXJjaCwgeyBJT3BlblJlcG9ydEV2ZW50QXJncywgSVNlYXJjaERhdGFTb3VyY2UgfSBmcm9tICcuL1NlYXJjaCc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL1V0aWxzL0luZGV4JztcclxuXHJcbmNvbnN0IEhFQURFUl9EQVRBX0NBQ0hFX0ZJRUxEID0gJ2lzem9sZWEtdWl8aGVhZGVyLWRhdGEtY2FjaGUnO1xyXG5jb25zdCBTSE9XX0dMT0JBTF9NRU5VX0tFWSA9ICdpc3pvbGVhLXVpfHNob3ctZ2xvYmFsLW1lbnUnO1xyXG5cclxuY29uc3QgZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQgPSAodXNlck5hbWU/OiBzdHJpbmcpID0+IHtcclxuICByZXR1cm4gYCR7SEVBREVSX0RBVEFfQ0FDSEVfRklFTER9JHt1c2VyTmFtZSA/IGB8JHt1c2VyTmFtZX1gIDogJyd9YDtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEhlYWRlclRoZW1lcyA9ICdpc3pvbGVhJztcclxuZXhwb3J0IGludGVyZmFjZSBJSGVhZGVyT3B0aW9ucyB7XHJcbiAgJGVsOiBKUXVlcnk7XHJcbiAgbWVudVNldHRpbmdzPzogSU1lbnVTZXR0aW5ncztcclxuICBsb2dvU2V0dGluZ3M/OiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nO1xyXG4gIGRpc3BsYXlTZWFyY2g/OiBib29sZWFuO1xyXG4gIGltbWVkaWF0ZVJlbmRlcj86IGJvb2xlYW47XHJcbiAgdGhlbWU/OiBIZWFkZXJUaGVtZXM7XHJcbiAgb25Jbml0PzogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElIZWFkZXJFbGVtZW50cyB7XHJcbiAgcmVhZG9ubHkgcm9vdD86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IGxvZ29Db250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBjb250ZW50Q29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgdG9nZ2xlQnV0dG9uQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgdG9nZ2xlQnV0dG9uPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgbWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IG1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUFqYXhQYWdlTWFya2VyIHtcclxuICBpc0xvYWRlZEJ5QWpheDogdHJ1ZTtcclxuICB1cmw6IHN0cmluZztcclxuICBpc01lbnVTd2l0Y2hlckdsb2JhbDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEhlYWRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNRU5VX1NXSVRDSEVSX0lOSVRJQUxJWkVEX0VWRU5UID0gJ21lbnUtc3dpdGNoZXItaW5pdGlhbGl6ZWQtZXZlbnQnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHTE9CQUxfVVJMX1JFR0VYID0gbmV3IFJlZ0V4cCgnXig/OlthLXpdKzopPy8vJywgJ2knKTtcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBET0NUWVBFX01BUktFUl9SRUdFWCA9IG5ldyBSZWdFeHAoJyFET0NUWVBFIGh0bWw+JywgJ2knKTtcclxuXHJcbiAgcHVibGljIHVzZXJNZW51OiBVc2VyTWVudSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgbmF2aWdhdGlvbk1lbnU6IE5hdmlnYXRpb25NZW51IHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBtZW51U3dpdGNoZXI6IE1lbnVTd2l0Y2hlciB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgbG9nbzogTG9nbyB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZGF0YTogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSB0aGVtZTogSGVhZGVyVGhlbWVzO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWVudVNldHRpbmdzOiBJTWVudVNldHRpbmdzIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheVNlYXJjaDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkUGFuZWw6IERldkV4cHJlc3MudWkuZHhMb2FkUGFuZWw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcGFydGlhbFZpZXdQbGFjZUhvbGRlcjogSlF1ZXJ5IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uUGFydGlhbFZpZXdMb2FkZWQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIgPSB0aGlzLm9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uTmF2aWdhdGlvbk1lbnVJdGVtT3BlbmVkSGFuZGxlciA9IHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXNlck1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSBzZWFyY2g6IFNlYXJjaCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gZWxlbWVudHNcclxuICBwcml2YXRlIHJlYWRvbmx5ICRlbDogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudHM6IE11dGFibGU8SUhlYWRlckVsZW1lbnRzPiA9IHt9O1xyXG4gIHByaXZhdGUgJGxvYWRCYXI6IEpRdWVyeSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUhlYWRlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgdGhpcy4kZWwgPSBvcHRpb25zLiRlbDtcclxuICAgIHRoaXMubWVudVNldHRpbmdzID0gb3B0aW9ucy5tZW51U2V0dGluZ3M7XHJcbiAgICB0aGlzLmxvZ29TZXR0aW5ncyA9IG9wdGlvbnMubG9nb1NldHRpbmdzO1xyXG4gICAgdGhpcy50aGVtZSA9IG9wdGlvbnMudGhlbWUgfHwgJ2lzem9sZWEnO1xyXG4gICAgdGhpcy5kaXNwbGF5U2VhcmNoID0gb3B0aW9ucy5kaXNwbGF5U2VhcmNoO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8uY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG5cclxuICAgIHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8ucGFydGlhbFZpZXdQbGFjZUhvbGRlcjtcclxuICAgIHRoaXMudXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZyA9IG9wdGlvbnMubWVudVNldHRpbmdzPy51cGRhdGVVcmxBZnRlclBhcnRpYWxMb2FkaW5nO1xyXG4gICAgdGhpcy5vblBhcnRpYWxWaWV3TG9hZGVkID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/Lm9uUGFydGlhbFZpZXdMb2FkZWQ7XHJcbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZyA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5iZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmc7XHJcblxyXG4gICAgdGhpcy5sb2FkUGFuZWwgPSB0aGlzLmNyZWF0ZUxvYWRQYW5lbCgpO1xyXG5cclxuICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZVJlbmRlciA9PT0gZmFsc2UpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUud2FybignVGhlIFxcJ2ltbWVkaWF0ZVJlbmRlciA9PT0gZmFsc2VcXCcgb3B0aW9uIGlzblxcJ3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9OT1RFOiBUbyBvdmVycmlkZSBib290c3RyYXAgaGVhZGVyIHotaW5kZXggd2hpY2ggaXMgMTYwMFxyXG4gICAgRGV2RXhwcmVzcy51aS5keE92ZXJsYXkuYmFzZVpJbmRleCgxNzAwKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gICAgdGhpcy5pbml0KClcclxuICAgICAgLnRoZW4oKCkgPT4gb3B0aW9ucz8ub25Jbml0Py4oKSk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmVPbkhpc3RvcnlQb3BTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZURhdGEoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsZWFyQXBwTWVudU1vZGVsQ2FjaGUoKTtcclxuICAgIHRoaXMuZGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXJlbmRlck1lbnVzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiA8Um9vdD5cclxuICAgICAqICA8QnJhbmQ+XHJcbiAgICAgKiAgICA8TG9nbyAvPlxyXG4gICAgICogIDwvQnJhbmQ+XHJcbiAgICAgKiAgPENvbnRlbnRUb2dnbGVyIC8+XHJcbiAgICAgKiAgPENvbnRlbnQ+XHJcbiAgICAgKiAgICA8U2VhcmNoIC8+XHJcbiAgICAgKiAgICA8TmF2aWdhdGlvbk1lbnUgLz5cclxuICAgICAqICAgIDxVc2VyTWVudSAvPlxyXG4gICAgICogIDwvQ29udGVudD5cclxuICAgICAqICA8TWVudVN3aXRjaGVyIC8+XHJcbiAgICAgKiA8L1Jvb3Q+XHJcbiAgICAgKiA8TG9hZEJhciAvPlxyXG4gICAgICovXHJcblxyXG4gICAgdGhpcy5yZW5kZXJSb290KCk7XHJcbiAgICB0aGlzLnJlbmRlckJyYW5kKCk7XHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnRUb2dnbGVyKCk7XHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICAgIHRoaXMucmVuZGVyTG9hZEJhcigpO1xyXG5cclxuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU9uSGlzdG9yeVBvcFN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIpIHtcclxuICAgICAgJCh3aW5kb3cpLmJpbmQoJ3BvcHN0YXRlJywgKGUpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudCA9IGUub3JpZ2luYWxFdmVudCBhcyBQb3BTdGF0ZUV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHN0YXRlID0gZXZlbnQuc3RhdGUgYXMgSUFqYXhQYWdlTWFya2VyO1xyXG4gICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS5pc0xvYWRlZEJ5QWpheCkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkUGFnZVZpYUFqYXhDb3JlKHN0YXRlLnVybCk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKHN0YXRlLmlzTWVudVN3aXRjaGVyR2xvYmFsKTtcclxuICAgICAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVMb2FkUGFuZWwoKTogRGV2RXhwcmVzcy51aS5keExvYWRQYW5lbCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4TG9hZFBhbmVsKHtcclxuICAgICAgc2hhZGluZ0NvbG9yOiAncmdiYSgwLDAsMCwwLjQpJyxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNob3dJbmRpY2F0b3I6IHRydWUsXHJcbiAgICAgIHNob3dQYW5lOiB0cnVlLFxyXG4gICAgICBzaGFkaW5nOiB0cnVlLFxyXG4gICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgIH0pLmFwcGVuZFRvKHRoaXMuJGVsKS5keExvYWRQYW5lbCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyUm9vdCgpIHtcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdCA9IHRoaXMuJGVsWzBdO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmNsYXNzTGlzdC5hZGQoJ2hlYWRlcicsIHRoaXMudGhlbWUsICduYXZiYXInLCAnbmF2YmFyLWRhcmsnLCBgbmF2YmFyLWV4cGFuZC0ke3RoaXMuY29sbGFwc2VCcmVha3BvaW50Lm5hbWV9YCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckJyYW5kKCkge1xyXG4gICAgaWYgKHRoaXMubG9nbyB8fCAhdGhpcy5sb2dvU2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYnJhbmRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYnJhbmRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9fYnJhbmQnLCAnbmF2YmFyLWJyYW5kJyk7XHJcbiAgICBicmFuZEVsZW1lbnQuaHJlZiA9ICcvJztcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdC5hcHBlbmRDaGlsZChicmFuZEVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMubG9nb0NvbnRhaW5lciA9IGJyYW5kRWxlbWVudDtcclxuXHJcbiAgICB0aGlzLmxvZ28gPSBuZXcgTG9nbygkKHRoaXMuZWxlbWVudHMubG9nb0NvbnRhaW5lciksIHRoaXMubG9nb1NldHRpbmdzKTtcclxuICAgIHRoaXMubG9nby5pbml0V2lkZ2V0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclNlYXJjaCgpIHtcclxuICAgIGlmICghdGhpcy5kaXNwbGF5U2VhcmNoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcignY29udGVudENvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VhcmNoID0gbmV3IFNlYXJjaCh7XHJcbiAgICAgICRjb250YWluZXI6ICQodGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSxcclxuICAgICAgZ2V0TWVudURhdGFTb3VyY2U6ICgpID0+IHRoaXMuZ2V0U2VhcmNoRGF0YVNvdXJjZSh0aGlzLmRhdGEpLFxyXG4gICAgICBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93bigpLFxyXG4gICAgICBvbkRpbWVuc2lvbnNDaGFuZ2VkOiAoKSA9PiB0aGlzLm5hdmlnYXRpb25NZW51Py5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCksXHJcbiAgICAgIG9uTWVudUl0ZW1DbGljazogdGhpcy5vbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrSGFuZGxlcixcclxuICAgICAgb25NZW51SXRlbU9wZW5lZDogdGhpcy5vbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZEhhbmRsZXIsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VhcmNoLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJc0dsb2JhbE1lbnVTaG93bigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzU2hvd0dsb2JhbE1lbnUoKSB8fCAhdGhpcy5kYXRhPy5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykge1xyXG4gICAgdGhpcy51cGRhdGVNZW51U3dpdGNoZXJTdGF0ZShlLm1lbnVJdGVtLmlzR2xvYmFsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoaXNHbG9iYWw6IGJvb2xlYW4pIHtcclxuICAgIGlmICghdGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1lbnVTd2l0Y2hlci52YWx1ZSAhPT0gaXNHbG9iYWwpIHtcclxuICAgICAgdGhpcy5tZW51U3dpdGNoZXIuc2V0VmFsdWUoaXNHbG9iYWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50VG9nZ2xlcigpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ25hdmJhci10b2dnbGVyJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdG9nZ2xlJywgJ2NvbGxhcHNlJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0JywgJy5oZWFkZXJfX2NvbnRlbnQnKTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRTZWFyY2hUZXh0KCcnKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgIGljb24uY2xhc3NMaXN0LmFkZCgnbmF2YmFyLXRvZ2dsZXItaWNvbicpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX3RvZ2dsZS1idXR0b24tY29udGFpbmVyJyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uYXBwZW5kQ2hpbGQoaWNvbik7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbik7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzZScsICduYXZiYXItY29sbGFwc2UnLCAnaGVhZGVyX19jb250ZW50Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlclNlYXJjaCgpO1xyXG4gICAgdGhpcy5yZW5kZXJOYXZpZ2F0aW9uTWVudShbXSk7XHJcbiAgICB0aGlzLnJlbmRlck1lbnVTd2l0Y2hlcigpO1xyXG4gICAgdGhpcy5yZW5kZXJVc2VyTWVudShbXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlck5hdmlnYXRpb25NZW51KG1lbnVJdGVtTW9kZWxzOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0dsb2JhbE1lbnUgPSB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCk7XHJcblxyXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvbk1lbnUpIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVEYXRhKG1lbnVJdGVtTW9kZWxzLCBpc0dsb2JhbE1lbnUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudSA9IG5ldyBOYXZpZ2F0aW9uTWVudShcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIsXHJcbiAgICAgICAgbWVudUl0ZW1Nb2RlbHMsXHJcbiAgICAgICAgaXNHbG9iYWxNZW51LFxyXG4gICAgICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50LFxyXG4gICAgICAgIHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIsXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUucmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uVXNlck1lbnVJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdGhpcy5tZW51U2V0dGluZ3Mub25Vc2VyTWVudUNsaWNrPy4oZSk7XHJcbiAgICBpZiAoZS5jYW5jZWwgfHwgdGhpcy5pc0tleVByZXNzZWQoZS5vcmlnaW5hbEV2ZW50IGFzIE1vdXNlRXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cmwgPSBlLml0ZW0uVXJsO1xyXG5cclxuICAgIGlmIChlLml0ZW0uQWx3YXlzUmVsb2FkUGFnZSkge1xyXG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIHRoaXMubWVudVNldHRpbmdzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgIGlmIChlLmNhbmNlbCB8fCB0aGlzLmlzS2V5UHJlc3NlZChlLm9yaWdpbmFsRXZlbnQgYXMgTW91c2VFdmVudCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoZS5pdGVtLmlzR2xvYmFsKTtcclxuXHJcbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShlLml0ZW0pO1xyXG4gICAgZS5jYW5jZWwgPSB0aGlzLnRyeURvUGFydGlhbFBhZ2VMb2FkaW5nKHVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzS2V5UHJlc3NlZChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgcmV0dXJuIGV2ZW50ICYmIChldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyeURvUGFydGlhbFBhZ2VMb2FkaW5nKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlciAmJiB1cmwgJiYgdGhpcy5jaGVja0lzTG9jYWxVcmwodXJsKSkge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVVcmxBZnRlclBhcnRpYWxMb2FkaW5nKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhdGU6IElBamF4UGFnZU1hcmtlciA9IHtcclxuICAgICAgICAgIGlzTG9hZGVkQnlBamF4OiB0cnVlLFxyXG4gICAgICAgICAgaXNNZW51U3dpdGNoZXJHbG9iYWw6ICEhdGhpcy5tZW51U3dpdGNoZXI/LnZhbHVlLFxyXG4gICAgICAgICAgdXJsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHN0YXRlLCBudWxsLCB1cmwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvYWRQYWdlVmlhQWpheENvcmUodXJsKTtcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrSXNMb2NhbFVybCh1cmw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuICFIZWFkZXIuR0xPQkFMX1VSTF9SRUdFWC50ZXN0KHVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrSXNQYXJ0aWFsUGFnZUNvbnRlbnQoY29udGVudDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gY29udGVudCAmJiAhSGVhZGVyLkRPQ1RZUEVfTUFSS0VSX1JFR0VYLnRlc3QoY29udGVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRQYWdlVmlhQWpheENvcmUodXJsOiBzdHJpbmcpIHtcclxuICAgIHdpbmRvdy5pc0lzb3pTZXJ2ZXJFeGNlcHRpb24gPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmxvYWRQYW5lbC5zaG93KCk7XHJcblxyXG4gICAgY29uc3QgdXJsRm9yUGFydGlhbExvYWRpbmcgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB1cmwpO1xyXG4gICAgdXJsRm9yUGFydGlhbExvYWRpbmcuc2VhcmNoUGFyYW1zLmFwcGVuZCgnaXNvelBhcnRpYWxMb2FkaW5nJywgJ3RydWUnKTtcclxuICAgIGNvbnN0IHBhcnRpYWxVcmwgPSB1cmxGb3JQYXJ0aWFsTG9hZGluZy50b1N0cmluZygpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nPy4oKTtcclxuXHJcbiAgICAkLmFqYXgocGFydGlhbFVybCwgeyBkYXRhVHlwZTogJ2h0bWwnIH0pLmFsd2F5cygoZGF0YSwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAodGV4dFN0YXR1cyAhPT0gJ3N1Y2Nlc3MnIHx8ICF0aGlzLmNoZWNrSXNQYXJ0aWFsUGFnZUNvbnRlbnQoZGF0YSkpIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyLmh0bWwoZGF0YSk7XHJcbiAgICAgICAgdGhpcy5vblBhcnRpYWxWaWV3TG9hZGVkPy4oKTtcclxuICAgICAgICB0aGlzLmxvYWRQYW5lbC5oaWRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJVc2VyTWVudShpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10pIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3M/LnVzZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcignY29udGVudENvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy51c2VyTWVudSkge1xyXG4gICAgICBjb25zdCBkaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGRpdmlkZXIuY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tZGl2aWRlcicpO1xyXG4gICAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2aWRlcik7XHJcblxyXG4gICAgICB0aGlzLnVzZXJNZW51ID0gbmV3IFVzZXJNZW51KHtcclxuICAgICAgICBjb250YWluZXI6IHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcixcclxuICAgICAgICB1c2VyTmFtZTogdGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUsXHJcbiAgICAgICAgdXNlckF2YXRhcjogdGhpcy5tZW51U2V0dGluZ3MudXNlckF2YXRhcixcclxuICAgICAgICBpdGVtcyxcclxuICAgICAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IHRoaXMuY29sbGFwc2VCcmVha3BvaW50LFxyXG4gICAgICAgIG9uSXRlbUNsaWNrOiB0aGlzLm9uVXNlck1lbnVJdGVtQ2xpY2tIYW5kbGVyLFxyXG4gICAgICAgIGdldERpc3BsYXllZFVzZXJJbmZvOiB0aGlzLm1lbnVTZXR0aW5ncy5nZXREaXNwbGF5ZWRVc2VySW5mb1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy51c2VyTWVudS5yZW5kZXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXNlck1lbnUudXBkYXRlSXRlbXMoaXRlbXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJNZW51U3dpdGNoZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YT8uQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlcikge1xyXG4gICAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgICB0aGlzLm1lbnVTd2l0Y2hlci5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyPy5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcj8ucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgIHRoaXMubWVudVN3aXRjaGVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm1lbnVTd2l0Y2hlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3RvZ2dsZUJ1dHRvbkNvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21lbnUtc3dpdGNoZXInKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWVudS1zd2l0Y2hlcicpO1xyXG5cclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gbmV3IE1lbnVTd2l0Y2hlcih7XHJcbiAgICAgIGRlc2t0b3BDb250YWluZXI6IHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcixcclxuICAgICAgbW9iaWxlQ29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcixcclxuICAgICAgY29sbGFwc2VCcmVha3BvaW50OiB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgc3RhcnRWYWx1ZTogdGhpcy5pc1Nob3dHbG9iYWxNZW51KCksXHJcbiAgICAgIG9uU3dpdGNoOiAodmFsdWUpID0+IHtcclxuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU0hPV19HTE9CQUxfTUVOVV9LRVksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2g/LnNldFNlYXJjaFRleHQoJycpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoPy5yZWxvYWRNZW51SXRlbXMoKTtcclxuICAgICAgICB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyB8fCBbXSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDb250ZW50QW5kVG9nZ2xlclZpc2libGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5yZW5kZXIoKTtcclxuICAgIHRoaXMuZW1pdChIZWFkZXIuTUVOVV9TV0lUQ0hFUl9JTklUSUFMSVpFRF9FVkVOVCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIsIHRoaXMudXNlck1lbnU/LnJvb3QpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyLCB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxvYWRCYXIoKSB7XHJcbiAgICB0aGlzLiRsb2FkQmFyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2FkLWJhcicpLmhpZGUoKS5hcHBlbmRUbyh0aGlzLiRlbCk7XHJcblxyXG4gICAgY29uc3QgJGxvYWQgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2xvYWQnKS5hcHBlbmRUbyh0aGlzLiRsb2FkQmFyKTtcclxuICAgICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnYmFyJykuYXBwZW5kVG8oJGxvYWQpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJvdGF0ZShzZWxlY3Rvcjogc3RyaW5nKSB7XHJcbiAgICAgICQoc2VsZWN0b3IpLmFuaW1hdGUoeyBsZWZ0OiAkKCcubG9hZCcpLndpZHRoKCkgfSwgMjAwMCwgKCkgPT4ge1xyXG4gICAgICAgICQoc2VsZWN0b3IpLmNzcygnbGVmdCcsIGAkey0kKHNlbGVjdG9yKS53aWR0aCgpIX1weGApO1xyXG4gICAgICAgIHJvdGF0ZShzZWxlY3Rvcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJvdGF0ZSgnLmJhcicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXJlbmRlck1lbnVzKCkge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvbkl0ZW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uSXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IHVzZXJJdGVtcyA9IHRoaXMuZ2V0VXNlckl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICAvLyBJZiBpdGVtcyBhcmUgdW5kZWZpbmVkIHdlIGRvbid0IHVwZGF0ZSBtZW51c1xyXG4gICAgbmF2aWdhdGlvbkl0ZW1zICYmIHRoaXMucmVuZGVyTmF2aWdhdGlvbk1lbnUobmF2aWdhdGlvbkl0ZW1zKTtcclxuICAgIHVzZXJJdGVtcyAmJiB0aGlzLnJlbmRlclVzZXJNZW51KHVzZXJJdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlck1lbnVTd2l0Y2hlcigpO1xyXG4gICAgdGhpcy51cGRhdGVDb250ZW50QW5kVG9nZ2xlclZpc2libGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIgJiYgIXRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmdldE5hdmlnYXRpb25JdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgY29uc3QgdXNlckl0ZW1zID0gdGhpcy5nZXRVc2VySXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IGlzVmlzaWJsZSA9IChuYXZpZ2F0aW9uSXRlbXMgJiYgbmF2aWdhdGlvbkl0ZW1zLmxlbmd0aCA+IDApXHJcbiAgICAgIHx8IHRoaXMubWVudVNldHRpbmdzPy51c2VyTmFtZVxyXG4gICAgICB8fCAodXNlckl0ZW1zICYmIHVzZXJJdGVtcy5sZW5ndGggPiAwKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnLCAhaXNWaXNpYmxlKTtcclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnLCAhaXNWaXNpYmxlKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaD8uc2V0VmlzaWJsZSghIWlzVmlzaWJsZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVyZW5kZXJNZW51cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkRGF0YSgpOiBQcm9taXNlPElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQ+IHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgaGVhZGVyIGRvZXNuXFwndCBoYXZlIG1lbnUgc2V0dGluZ3MnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHRoaXMubWVudVNldHRpbmdzLmRhdGEgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1lbnVTZXR0aW5ncy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkYXRhID0gdGhpcy5nZXRDYWNoZWRBcHBNZW51TW9kZWwoKTtcclxuICAgIGlmIChkYXRhKSB7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgdGhpcy4kbG9hZEJhcj8uc2hvdygpO1xyXG4gICAgICBkYXRhID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUFwcE1lbnVNb2RlbD4odGhpcy5tZW51U2V0dGluZ3MuZGF0YSk7XHJcbiAgICAgIHRoaXMuY2FjaGVBcHBNZW51TW9kZWwoZGF0YSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5yZWxvYWRNZW51SXRlbXMoKTtcclxuXHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5zZWFyY2g/LnNldFZpc2libGUodHJ1ZSk7XHJcbiAgICAgIHRoaXMuJGxvYWRCYXI/LmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkl0ZW1zKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCFhcHBNZW51TW9kZWwpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzaG93R2xvYmFsTWVudSA9IHRoaXMuaXNTaG93R2xvYmFsTWVudSgpO1xyXG5cclxuICAgIHJldHVybiBzaG93R2xvYmFsTWVudSB8fCAhYXBwTWVudU1vZGVsLkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXJcclxuICAgICAgPyBhcHBNZW51TW9kZWwuTmF2aWdhdGlvbkl0ZW1zXHJcbiAgICAgIDogYXBwTWVudU1vZGVsLlBlcnNvbmFsTmF2aWdhdGlvbkl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWFyY2hEYXRhU291cmNlKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCk6IElTZWFyY2hEYXRhU291cmNlIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZ2xvYWJhbEl0ZW1zOiBhcHBNZW51TW9kZWwuTmF2aWdhdGlvbkl0ZW1zLFxyXG4gICAgICBwZXJzb25hbEl0ZW1zOiBhcHBNZW51TW9kZWwuQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlciA/IGFwcE1lbnVNb2RlbC5QZXJzb25hbE5hdmlnYXRpb25JdGVtcyA6IHVuZGVmaW5lZFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VXNlckl0ZW1zKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCFhcHBNZW51TW9kZWwpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXBwTWVudU1vZGVsLlVzZXJJdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q2FjaGVkQXBwTWVudU1vZGVsKCk6IElBcHBNZW51TW9kZWwgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmF3VmFsdWUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSkpO1xyXG5cclxuICAgIHJldHVybiByYXdWYWx1ZSA9PT0gbnVsbCA/IHJhd1ZhbHVlIDogSlNPTi5wYXJzZShyYXdWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhY2hlQXBwTWVudU1vZGVsKGRhdGE6IElBcHBNZW51TW9kZWwpIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGdldERhdGFTb3VyY2VDYWNoZUZpZWxkKHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lKSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckFwcE1lbnVNb2RlbENhY2hlKCkge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQodGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUpKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTaG93R2xvYmFsTWVudSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJhd0lzR2xvYmFsID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNIT1dfR0xPQkFMX01FTlVfS0VZKTtcclxuICAgIGNvbnN0IGlzR2xvYmFsID0gcmF3SXNHbG9iYWwgPT09IG51bGwgPyByYXdJc0dsb2JhbCBhcyBudWxsIDogSlNPTi5wYXJzZShyYXdJc0dsb2JhbCkgYXMgYm9vbGVhbjtcclxuXHJcbiAgICByZXR1cm4gaXNHbG9iYWwgPT09IG51bGwgfHwgaXNHbG9iYWw7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZjb25zdCBncmlkQ29sdW1uVHlwZXMgPSBbJ2RlZmF1bHQnLCAnc3RyaW5nJywgJ251bWJlcicsICdkYXRlJywgJ2Jvb2xlYW4nLCAnb2JqZWN0JywgJ2RhdGV0aW1lJ107XHJcblxyXG5leHBvcnQgZGVmYXVsdCBncmlkQ29sdW1uVHlwZXM7XHJcbiIsICJcdUZFRkZleHBvcnQgZW51bSBDZG1JbXBvcnRGaWxlTW9kZSB7XHJcbiAgTm9uZSA9IDAsXHJcbiAgQWRkTmV3Um93cyA9IDEsXHJcbiAgUmVwbGFjZUFsbFJvd3MgPSAyLFxyXG59XHJcbiIsICJcdUZFRkZcclxuZXhwb3J0IGVudW0gR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB7XHJcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcclxuICBTdHJpbmcgPSAnc3RyaW5nJyxcclxuICBOdW1iZXIgPSAnbnVtYmVyJyxcclxuICBEYXRlID0gJ2RhdGUnLFxyXG4gIEJvb2xlYW4gPSAnYm9vbGVhbicsXHJcbiAgT2JqZWN0ID0gJ29iamVjdCcsXHJcbiAgRGF0ZXRpbWUgPSAnZGF0ZXRpbWUnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRDb2x1bW5TdGF0ZSB7XHJcbiAgZGF0YUZpZWxkOiBzdHJpbmc7XHJcbiAgZGF0YVR5cGU6IEdyaWREYXRhQ29sdW1uRGF0YVR5cGU7XHJcbiAgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7XHJcbiAgZ3JvdXBJbmRleD86IG51bWJlcjtcclxuICBzb3J0SW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydE9yZGVyPzogbnVtYmVyO1xyXG4gIHZpc2libGU/OiBib29sZWFuO1xyXG4gIHZpc2libGVJbmRleD86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbiAgY2FwdGlvbj86IHN0cmluZztcclxuICB0b29sdGlwPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZSBleHRlbmRzIElHcmlkQ29sdW1uU3RhdGUsIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlIHtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFN0YXRlIHtcclxuICBjb2x1bW5zOiBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGVbXTtcclxufVxyXG4iLCAiY29uc3QgbG9hZGVkVXJsczogc3RyaW5nW10gPSBbXVxyXG5cclxuZnVuY3Rpb24gcmFuZG9tSW50ZWdlcihtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcclxuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNob3cgKCRjb250YWluZXI6IEpRdWVyeSwgaW1hZ2VVcmxzOiBzdHJpbmdbXSwgaW1nQ2hhbmdlSW50ZXJ2YWxTZWM6IG51bWJlciA9IDUsIHRyYW5zaXRpb25UaW1lU2VjOiBudW1iZXIgPSAyKSB7XHJcbiAgLy8gU2h1ZmZsZSB1cmxzXHJcbiAgY29uc3Qgc2h1ZmZsZWRVcmxzID0gaW1hZ2VVcmxzLnNvcnQoKGEsIGIpID0+IDAuNSAtIE1hdGgucmFuZG9tKCkpO1xyXG5cclxuICAkY29udGFpbmVyLmFkZENsYXNzKCdpc3pvbGVhLWJhY2tncm91bmQtaW1hZ2Utdmlld2VyJykuY3NzKHtcclxuICAgICd0cmFuc2l0aW9uJzogYGJhY2tncm91bmQtaW1hZ2UgJHt0cmFuc2l0aW9uVGltZVNlY31zIGVhc2UtaW4tb3V0IDBzYCxcclxuICB9KTtcclxuXHJcbiAgc2h1ZmZsZWRVcmxzLmZvckVhY2goKHVybCwgaW5kZXgpID0+IHtcclxuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG5cclxuICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xyXG4gICAgICBsb2FkZWRVcmxzLnB1c2godXJsKTtcclxuXHJcbiAgICAgIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgaW5pdEltYWdlc0NoYW5naW5nKCRjb250YWluZXIsIGltZ0NoYW5nZUludGVydmFsU2VjKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpbWcuc3JjID0gdXJsO1xyXG4gICAgfSwgaW5kZXggKiAxMDApO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXROZXh0SW5kZXhUb1Nob3cgKGN1cnJlbnRJbmRleDogbnVtYmVyKSB7XHJcbiAgaWYobG9hZGVkVXJscy5sZW5ndGggPT09IDEpIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgaWYobG9hZGVkVXJscy5sZW5ndGggPT09IDIpIHtcclxuICAgIHJldHVybiBjdXJyZW50SW5kZXggPT09IDAgPyAxIDogMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5leHRJbmRleCA9IHJhbmRvbUludGVnZXIoMCwgbG9hZGVkVXJscy5sZW5ndGggLSAxKTtcclxuXHJcbiAgaWYobmV4dEluZGV4ID09PSBjdXJyZW50SW5kZXgpIHtcclxuICAgIHJldHVybiBuZXh0SW5kZXggPT09IGxvYWRlZFVybHMubGVuZ3RoIC0gMSA/IDAgOiBuZXh0SW5kZXggKyAxO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG5leHRJbmRleDtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEltYWdlc0NoYW5naW5nICgkY29udGFpbmVyOiBKUXVlcnksIGltZ0NoYW5nZUludGVydmFsU2VjOiBudW1iZXIpIHtcclxuICBsZXQgY3VycmVudFNob3duSW5kZXggPSAwO1xyXG5cclxuICBzaG93SW1hZ2UoJGNvbnRhaW5lciwgY3VycmVudFNob3duSW5kZXgpO1xyXG5cclxuICB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgaWYobG9hZGVkVXJscy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGN1cnJlbnRTaG93bkluZGV4ID0gZ2V0TmV4dEluZGV4VG9TaG93KGN1cnJlbnRTaG93bkluZGV4KTtcclxuICAgIHNob3dJbWFnZSgkY29udGFpbmVyLCBjdXJyZW50U2hvd25JbmRleCk7XHJcbiAgfSwgaW1nQ2hhbmdlSW50ZXJ2YWxTZWMgKiAxMDAwKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0ltYWdlICgkY29udGFpbmVyOiBKUXVlcnksIGluZGV4OiBudW1iZXIpIHtcclxuICAkY29udGFpbmVyLmNzcygnYmFja2dyb3VuZC1pbWFnZScsIGB1cmwoXCIke2xvYWRlZFVybHNbaW5kZXhdfVwiKWApO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTGljZW5jZSB9IGZyb20gJy4uL0J1c2luZXNzJztcclxuXHJcbmV4cG9ydCBlbnVtIEZvb3RlckluZGljYXRvclN0YXR1cyB7XHJcbiAgU3VjY2VzcyxcclxuICBXYXJuaW5nLFxyXG4gIEVycm9yXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3RlckluZGljYXRvclZhbHVlIHtcclxuICBzdGF0dXM6IEZvb3RlckluZGljYXRvclN0YXR1cztcclxuICB0aXRsZT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRm9vdGVySW5kaWNhdG9yT3B0aW9ucyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHRleHQ6IHN0cmluZztcclxuICB2YWx1ZTogSUZvb3RlckluZGljYXRvclZhbHVlO1xyXG4gIGdldFZhbHVlPzogKCkgPT4gUHJvbWlzZTxJRm9vdGVySW5kaWNhdG9yVmFsdWU+O1xyXG4gIGdldFZhbHVlSW50ZXJ2YWxNcz86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRm9vdGVyT3B0aW9ucyB7XHJcbiAgJHJvb3Q6IEpRdWVyeTtcclxuICBuYW1lOiBzdHJpbmcgfCBmYWxzZTtcclxuICBsaWNlbmNlOiBJTGljZW5jZSB8IGZhbHNlO1xyXG4gIHllYXI/OiBudW1iZXIgfCAnbG9jYWwnIHwgZmFsc2U7XHJcbiAgdmVyc2lvbj86IHN0cmluZztcclxuICBzZXJ2ZXJOYW1lPzogc3RyaW5nO1xyXG4gIGRhdGFiYXNlPzogc3RyaW5nO1xyXG4gIGluZGljYXRvcnM/OiBJRm9vdGVySW5kaWNhdG9yT3B0aW9uc1tdO1xyXG59XHJcblxyXG5jb25zdCBkZWZhdWx0T3B0aW9uczogUGFydGlhbDxJRm9vdGVyT3B0aW9ucz4gPSB7XHJcbiAgeWVhcjogJ2xvY2FsJ1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9vdGVyIHtcclxuICBwcml2YXRlIHN0YXRpYyBnZXRDdXJyZW50WWVhcihjdXJyZW50WWVhcjogbnVtYmVyIHwgJ2xvY2FsJyB8IGZhbHNlKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBjdXJyZW50WWVhciA9PT0gJ2xvY2FsJyB8fCBjdXJyZW50WWVhciA9PT0gZmFsc2VcclxuICAgICAgPyBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKClcclxuICAgICAgOiBjdXJyZW50WWVhcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJvb3Q6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3RlZFRvOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93TmFtZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxpY2VuY2U6IElMaWNlbmNlIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0xpY2VuY2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSB5ZWFyOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93WWVhcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dDb25uZWN0ZWRUbzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNPcHRpb25zOiBJRm9vdGVySW5kaWNhdG9yT3B0aW9uc1tdO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5TmFtZTogTWFwPHN0cmluZywgSlF1ZXJ5PjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvckNsYXNzQnlTdGF0dXMgPSBuZXcgTWFwPEZvb3RlckluZGljYXRvclN0YXR1cywgc3RyaW5nPihbXHJcbiAgICBbRm9vdGVySW5kaWNhdG9yU3RhdHVzLlN1Y2Nlc3MsICdmb290ZXJfX2luZGljYXRvcl90eXBlX3N1Y2Nlc3MnXSxcclxuICAgIFtGb290ZXJJbmRpY2F0b3JTdGF0dXMuV2FybmluZywgJ2Zvb3Rlcl9faW5kaWNhdG9yX3R5cGVfd2FybmluZyddLFxyXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5FcnJvciwgJ2Zvb3Rlcl9faW5kaWNhdG9yX3R5cGVfZXJyb3InXVxyXG4gIF0pO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRm9vdGVyT3B0aW9ucykge1xyXG4gICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgLi4uZGVmYXVsdE9wdGlvbnMgfSBhcyBSZXF1aXJlZDxJRm9vdGVyT3B0aW9ucz47XHJcblxyXG4gICAgdGhpcy4kcm9vdCA9IG1lcmdlZE9wdGlvbnMuJHJvb3Q7XHJcbiAgICB0aGlzLm5hbWUgPSBtZXJnZWRPcHRpb25zLm5hbWUgIT09IGZhbHNlID8gbWVyZ2VkT3B0aW9ucy5uYW1lIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5saWNlbmNlID0gbWVyZ2VkT3B0aW9ucy5saWNlbmNlICE9PSBmYWxzZSA/IG1lcmdlZE9wdGlvbnMubGljZW5jZSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMueWVhciA9IEZvb3Rlci5nZXRDdXJyZW50WWVhcihtZXJnZWRPcHRpb25zLnllYXIpO1xyXG4gICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uIHx8IHVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLnNob3dOYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0xpY2VuY2UgPSBtZXJnZWRPcHRpb25zLmxpY2VuY2UgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93WWVhciA9IG1lcmdlZE9wdGlvbnMueWVhciAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dDb25uZWN0ZWRUbyA9ICEhbWVyZ2VkT3B0aW9ucy5zZXJ2ZXJOYW1lICYmICEhbWVyZ2VkT3B0aW9ucy5kYXRhYmFzZTtcclxuICAgIHRoaXMuaW5kaWNhdG9yc09wdGlvbnMgPSBvcHRpb25zLmluZGljYXRvcnMgfHwgW107XHJcbiAgICB0aGlzLmluZGljYXRvcnNCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgSlF1ZXJ5PigpO1xyXG5cclxuICAgIHRoaXMuY29ubmVjdGVkVG8gPSB0aGlzLnNob3dDb25uZWN0ZWRUbyA/IGAke21lcmdlZE9wdGlvbnMuc2VydmVyTmFtZX0gLSAke21lcmdlZE9wdGlvbnMuZGF0YWJhc2V9YCA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgdGhpcy4kcm9vdC5hZGRDbGFzcygnZm9vdGVyJyk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJJbmRpY2F0b3JzKCk7XHJcbiAgICB0aGlzLnJlbmRlckNvcHlyaWdodCgpO1xyXG4gICAgdGhpcy5zaG93WWVhciAmJiB0aGlzLnJlbmRlclllYXIoKTtcclxuICAgIHRoaXMuc2hvd05hbWUgJiYgdGhpcy5yZW5kZXJOYW1lKCk7XHJcbiAgICB0aGlzLnNob3dDb25uZWN0ZWRUbyAmJiB0aGlzLnJlbmRlckNvbm5lY3RlZFRvKCk7XHJcbiAgICB0aGlzLnNob3dMaWNlbmNlICYmIHRoaXMucmVuZGVyTGljZW5jZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEluZGljYXRvclZhbHVlKGluZGljYXRvck5hbWU6IHN0cmluZywgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZSkge1xyXG4gICAgY29uc3QgJGluZGljYXRvckVsID0gdGhpcy5pbmRpY2F0b3JzQnlOYW1lLmdldChpbmRpY2F0b3JOYW1lKTtcclxuICAgIGlmICgkaW5kaWNhdG9yRWwpIHtcclxuICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckluZGljYXRvcnMoKSB7XHJcbiAgICB0aGlzLmluZGljYXRvcnNPcHRpb25zPy5mb3JFYWNoKChvKSA9PiB7XHJcbiAgICAgIGlmIChvLnRleHQpIHtcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2luZGljYXRvci10ZXh0JylcclxuICAgICAgICAgIC5odG1sKGAke28udGV4dH06YClcclxuICAgICAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgJGluZGljYXRvckVsID0gJCgnPHNwYW4+JylcclxuICAgICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faW5kaWNhdG9yJylcclxuICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcblxyXG4gICAgICB0aGlzLnNldEluZGljYXRvclZhbHVlQ29yZSgkaW5kaWNhdG9yRWwsIG8udmFsdWUpO1xyXG4gICAgICB0aGlzLmluZGljYXRvcnNCeU5hbWUuc2V0KG8ubmFtZSwgJGluZGljYXRvckVsKTtcclxuXHJcbiAgICAgIGlmIChvLmdldFZhbHVlICYmIG8uZ2V0VmFsdWVJbnRlcnZhbE1zKSB7XHJcbiAgICAgICAgc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBvLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICB0aGlzLnNldEluZGljYXRvclZhbHVlQ29yZSgkaW5kaWNhdG9yRWwsIHZhbHVlKTtcclxuICAgICAgICB9LCBvLmdldFZhbHVlSW50ZXJ2YWxNcyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsOiBKUXVlcnksIHZhbHVlOiBJRm9vdGVySW5kaWNhdG9yVmFsdWUpIHtcclxuICAgICRpbmRpY2F0b3JFbC5hdHRyKCd0aXRsZScsIHZhbHVlLnRpdGxlKTtcclxuICAgICRpbmRpY2F0b3JFbC5yZW1vdmVDbGFzcyhbLi4udGhpcy5pbmRpY2F0b3JDbGFzc0J5U3RhdHVzLnZhbHVlcygpXSk7XHJcbiAgICAkaW5kaWNhdG9yRWwuYWRkQ2xhc3ModGhpcy5pbmRpY2F0b3JDbGFzc0J5U3RhdHVzLmdldCh2YWx1ZS5zdGF0dXMpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29weXJpZ2h0KCkge1xyXG4gICAgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2NvcHlyaWdodCcpXHJcbiAgICAgIC5odG1sKCcmY29weTsnKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlck5hbWUoKSB7XHJcbiAgICB0aGlzLm5hbWUgJiYgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2l0ZW0nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fYXBwLW5hbWUnKVxyXG4gICAgICAudGV4dCh0aGlzLm5hbWUgKyAoISF0aGlzLnZlcnNpb24gPyBgOiAke3RoaXMudmVyc2lvbn1gIDogJycpKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvbm5lY3RlZFRvKCkge1xyXG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2Nvbm5lY3RlZC10bycpXHJcbiAgICAgIC50ZXh0KGBDb25uZWN0ZWQgdG86ICR7dGhpcy5jb25uZWN0ZWRUb30uYClcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJZZWFyKCkge1xyXG4gICAgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2l0ZW0nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fY3VycmVudC15ZWFyJylcclxuICAgICAgLnRleHQodGhpcy55ZWFyKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxpY2VuY2UoKSB7XHJcbiAgICB0aGlzLmxpY2VuY2UgJiYgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2l0ZW0nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fbGljZW5jZS1pbmZvJylcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2Utb3duZXInKVxyXG4gICAgICAgICAgLnRleHQoYCR7dGhpcy5nZXRMaWNlbmNlT3duZXJEaXNwbGF5VGV4dCh0aGlzLmxpY2VuY2UpfS4gYClcclxuICAgICAgKVxyXG4gICAgICAuYXBwZW5kKFxyXG4gICAgICAgICQoJzxzcGFuPicpXHJcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fbGljZW5jZS1kYXRlJylcclxuICAgICAgICAgIC50ZXh0KHRoaXMuZ2V0TGljZW5jZUV4cGlyYXRpb25EYXRlRGlzcGxheVRleHQodGhpcy5saWNlbmNlKSlcclxuICAgICAgKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpY2VuY2VPd25lckRpc3BsYXlUZXh0KGxpY2VuY2U6IElMaWNlbmNlKSB7XHJcbiAgICByZXR1cm4gYExpY2VuY2VkIHRvOiAke2xpY2VuY2UuT3duZXJ9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TGljZW5jZUV4cGlyYXRpb25EYXRlRGlzcGxheVRleHQobGljZW5jZTogSUxpY2VuY2UpIHtcclxuICAgIGNvbnN0IGRhdGUgPSB0eXBlb2YgbGljZW5jZS5FeHBpcmF0aW9uRGF0ZSA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZShsaWNlbmNlLkV4cGlyYXRpb25EYXRlKSA6IGxpY2VuY2UuRXhwaXJhdGlvbkRhdGU7XHJcblxyXG4gICAgcmV0dXJuIGBMaWNlbmNlIEV4cGlyeTogJHtkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpfWA7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZsZXQgcmVwYWludFRpbWVvdXQgPSBudWxsO1xyXG5jb25zdCByZXNpemVIYW5kbGVycyA9IFtdO1xyXG5cclxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcclxuICBpZiAocmVwYWludFRpbWVvdXQpIHtcclxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocmVwYWludFRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgcmVwYWludFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICByZXNpemVIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyKCkpO1xyXG4gICAgcmVwYWludFRpbWVvdXQgPSBudWxsO1xyXG4gIH0sIDEwMCk7XHJcbn0pO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25SZXNpemU6ICgpID0+IHZvaWQpIHtcclxuICByZXNpemVIYW5kbGVycy5wdXNoKG9uUmVzaXplKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGF1dG9SZXNpemUgZnJvbSAnLi9BdXRvUmVzaXplJztcclxuXHJcbmNvbnN0IENTUyA9IHtcclxuICBtYWluOiAnLm1haW4nLFxyXG4gIGhlYWRlcjogJy5tYWluIC5oZWFkZXInLFxyXG4gIGNvbnRlbnQ6ICcuY29udGVudC1hcmVhJyxcclxuICBwYW5lbDogJy5wYW5lbCcsXHJcbiAgZm9vdGVyOiAnZm9vdGVyJ1xyXG59O1xyXG5cclxubGV0IGxhc3RXaW5kb3dIZWlnaHQgPSBudWxsO1xyXG5sZXQgbGFzdENvbnRlbnRIZWlnaHQgPSBudWxsO1xyXG5sZXQgbGFzdFdpZGdldEhlaWdodCA9IG51bGw7XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVIZWlnaHQod2lkZ2V0KSB7XHJcbiAgY29uc3QgJGNvbnRlbnQgPSAkKENTUy5jb250ZW50KTtcclxuXHJcbiAgJGNvbnRlbnQuaGVpZ2h0KGxhc3RDb250ZW50SGVpZ2h0KTtcclxuICB3aWRnZXQub3B0aW9uKCdoZWlnaHQnLCBsYXN0V2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55PiwgaWdub3JlU2libGluZ3M6IGJvb2xlYW4gPSBmYWxzZSwgYWRkT3duU2l6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgY29uc3QgJG1haW4gPSAkKENTUy5tYWluKTtcclxuICBjb25zdCAkaGVhZGVyID0gJChDU1MuaGVhZGVyKTtcclxuICBjb25zdCAkY29udGVudCA9ICQoQ1NTLmNvbnRlbnQpO1xyXG4gIGNvbnN0ICRmb290ZXIgPSAkKENTUy5mb290ZXIpO1xyXG5cclxuICBjb25zdCBwYWRkaW5ncyA9ICRjb250ZW50Lm91dGVySGVpZ2h0KCkgLSAkY29udGVudC5oZWlnaHQoKTtcclxuXHJcbiAgbGFzdENvbnRlbnRIZWlnaHQgPSAkbWFpbi5oZWlnaHQoKSAtICRoZWFkZXIuaGVpZ2h0KCkgLSAkZm9vdGVyLm91dGVySGVpZ2h0KCkgLSBwYWRkaW5ncztcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG5cclxuICBjb25zdCAkY29udGVudEVsZW1lbnRzID0gJGNvbnRlbnQuY2hpbGRyZW4oKTtcclxuICBsZXQgY29udGVudEVsZW1lbnRzSGVpZ2h0ID0gMDtcclxuXHJcbiAgaWYgKCFpZ25vcmVTaWJsaW5ncykge1xyXG4gICAgY29uc3QgJHdpZGdldEVsZW1lbnQgPSB3aWRnZXQuZWxlbWVudCgpO1xyXG4gICAgJGNvbnRlbnRFbGVtZW50cy5lYWNoKChpbmRleCwgZWwpID0+IHtcclxuICAgICAgY29uc3QgJGNoaWxkID0gJChlbCk7XHJcblxyXG4gICAgICBpZiAoJGNoaWxkLmlzKCR3aWRnZXRFbGVtZW50KSB8fCAkY2hpbGQuaGFzKCR3aWRnZXRFbGVtZW50WzBdKS5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnRlbnRFbGVtZW50c0hlaWdodCArPSAoJGNoaWxkLmlzKCc6dmlzaWJsZScpICYmICRjaGlsZC5jc3MoJ3Bvc2l0aW9uJykgIT09ICdhYnNvbHV0ZScpID8gJGNoaWxkLm91dGVySGVpZ2h0KHRydWUpIDogMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbGFzdFdpZGdldEhlaWdodCA9IGxhc3RDb250ZW50SGVpZ2h0IC0gY29udGVudEVsZW1lbnRzSGVpZ2h0O1xyXG5cclxuICBpZiAoYWRkT3duU2l6ZSkge1xyXG4gICAgbGFzdFdpZGdldEhlaWdodCArPSB3aWRnZXQuZWxlbWVudCgpLm91dGVySGVpZ2h0KCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gIGNvbnN0IGRpZmYgPSB3aW5kb3dIZWlnaHQgLSBsYXN0V2luZG93SGVpZ2h0O1xyXG5cclxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaWRnZXRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gd2luZG93SGVpZ2h0O1xyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24od2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+LCBpZ25vcmVTaWJsaW5nczogYm9vbGVhbiA9IGZhbHNlLCBhZGRPd25TaXplOiBib29sZWFuID0gZmFsc2UpIHtcclxuICBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0LCBpZ25vcmVTaWJsaW5ncywgYWRkT3duU2l6ZSk7XHJcblxyXG4gIGF1dG9SZXNpemUoKCkgPT4gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0KSk7XHJcbn1cclxuIiwgIlx1RkVGRmNvbnN0IERJU0FCTEVEX0NMQVNTID0gJ2lzb3otaWNvbi1kaXNhYmxlZCc7XHJcblxyXG5leHBvcnQgY29uc3QgVEhFTUVfQ0xBU1NFUyA9IHtcclxuICBsZzogJ2lzem9sZWEtbGcnLFxyXG4gIG1kOiAnaXN6b2xlYS1tZCcsXHJcbiAgc206ICdpc3pvbGVhLXNtJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIFRoZW1lSGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRNaWRkbGVTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcclxuICAgIGVsZW1lbnQuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5tZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRTbWFsbFNpemUoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pikge1xyXG4gICAgZWxlbWVudC5hZGRDbGFzcyhUSEVNRV9DTEFTU0VTLnNtKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgc2V0V2lkZ2V0TWlkZGxlU2l6ZShpbnN0YW5jZTogYW55KSB7XHJcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLm1kKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgc2V0V2lkZ2V0U21hbGxTaXplKGluc3RhbmNlOiBhbnkpIHtcclxuICAgIFRoZW1lSGVscGVyLnNldFdpZGdldFNpemUoaW5zdGFuY2UsIFRIRU1FX0NMQVNTRVMuc20pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXRJY29uQ2xhc3MoaWNvbjogc3RyaW5nLCBkaXNhYmxlZD86IGJvb2xlYW4sIHNpemU6IDE2IHwgMjQgPSAxNikge1xyXG4gICAgY29uc3QgaWNvbkNsYXNzID0gYGlzb3ogaXNvei1pY29uLSR7aWNvbn0tJHtzaXplfWA7XHJcblxyXG4gICAgcmV0dXJuICFkaXNhYmxlZFxyXG4gICAgICA/IGljb25DbGFzc1xyXG4gICAgICA6IGAke2ljb25DbGFzc30gJHtESVNBQkxFRF9DTEFTU31gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgc2V0V2lkZ2V0U2l6ZShpbnN0YW5jZTogYW55LCBzaXplQ2xhc3M6IHN0cmluZykge1xyXG4gICAgaWYgKGluc3RhbmNlKSB7XHJcbiAgICAgIGluc3RhbmNlLm9wdGlvbignZWxlbWVudEF0dHInLCB7IGNsYXNzOiBzaXplQ2xhc3MgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZjb25zdCBDTEFTU0VTID0ge1xyXG4gIHRpdGxlOiAnaXNvei10aXRsZSdcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUb29sYmFySGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIGdldFRvb2xiYXJUaXRsZVRlbXBsYXRlSXRlbSh0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgJGVsID0gJChgPHNwYW4gY2xhc3M9XCIke0NMQVNTRVMudGl0bGV9XCI+JHt0aXRsZX08L3NwYW4+YCk7XHJcblxyXG4gICAgICAgIGlmIChkZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgJGVsLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYXMnKS5hZGRDbGFzcygnZmEtaW5mby1jaXJjbGUnKS5hZGRDbGFzcygncmVwb3J0LWRldGFpbHMtbGluaycpLmF0dHIoJ3RpdGxlJywgJ1JlcG9ydCBkZXRhaWxzJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICRlbDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFRIRU1FX0NMQVNTRVMgfSBmcm9tICcuLi9IZWxwZXJzL1RoZW1lJztcclxuaW1wb3J0IHsgVG9vbGJhckhlbHBlciB9IGZyb20gJy4uL0hlbHBlcnMvVG9vbGJhcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUb29sYmFyU2V0dGluZyB7XHJcbiAgb3B0aW9ucz86IERldkV4cHJlc3MudWkuZHhUb29sYmFyT3B0aW9ucztcclxuICB0aXRsZT86IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgQ0xBU1NFUyA9IHtcclxuICB0aXRsZTogJ2lzb3otdGl0bGUnLFxyXG4gIGhlYWRlcjogJ2lzb3otdG9vbGJhci1oZWFkZXInLFxyXG4gIGRyb3BEb3duQnV0dG9uOiAnZHgtZHJvcGRvd25tZW51LWJ1dHRvbidcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yOiBzdHJpbmcsIHNldHRpbmdzOiBJVG9vbGJhclNldHRpbmcgPSB7IHRpdGxlOiAnJywgZGVzY3JpcHRpb246ICcnLCBvcHRpb25zOiB7fSB9KTpcclxuICBEZXZFeHByZXNzLnVpLmR4VG9vbGJhciB7XHJcbiAgY29uc3Qge1xyXG4gICAgdGl0bGUgPSAnJyxcclxuICAgIGRlc2NyaXB0aW9uID0gJycsXHJcbiAgICBvcHRpb25zID0ge30sXHJcbiAgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IHtcclxuICAgIGl0ZW1zID0gW10sXHJcbiAgICBlbGVtZW50QXR0ciA9IHt9XHJcbiAgfSA9IG9wdGlvbnM7XHJcblxyXG4gIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgIGNvbnN0IG1pZGxkZVNpemVFbGVtZW50QXR0ciA9IHsgY2xhc3M6IFRIRU1FX0NMQVNTRVMubWQgfTtcclxuXHJcbiAgICBpZiAoaXRlbS5vcHRpb25zKSB7XHJcbiAgICAgIGxldCB7IGVkaXRvck9wdGlvbnMgfSA9IGl0ZW0ub3B0aW9ucztcclxuXHJcbiAgICAgIGlmICghZWRpdG9yT3B0aW9ucykge1xyXG4gICAgICAgIGVkaXRvck9wdGlvbnMgPSB7fTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZWRpdG9yT3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcclxuICAgICAgaXRlbS5vcHRpb25zLmVsZW1lbnRBdHRyID0gbWlkbGRlU2l6ZUVsZW1lbnRBdHRyO1xyXG4gICAgICBpdGVtLm9wdGlvbnMuZWRpdG9yT3Rpb25zID0gZWRpdG9yT3B0aW9ucztcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgY29uc3Qgb25Db250ZW50UmVhZHkgPSAoZSkgPT4ge1xyXG4gICAgZS5lbGVtZW50XHJcbiAgICAgIC5maW5kKGAuJHtDTEFTU0VTLmRyb3BEb3duQnV0dG9ufWApXHJcbiAgICAgIC5hZGRDbGFzcyhUSEVNRV9DTEFTU0VTLm1kKTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8ub25Db250ZW50UmVhZHkpIHtcclxuICAgICAgb3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByZXR1cm4gJChgJHtzZWxlY3Rvcn1gKVxyXG4gICAgLmR4VG9vbGJhcih7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgVG9vbGJhckhlbHBlci5nZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0odGl0bGUsIGRlc2NyaXB0aW9uKSxcclxuICAgICAgICAuLi5pdGVtc1xyXG4gICAgICBdLFxyXG4gICAgICBvbkNvbnRlbnRSZWFkeSxcclxuICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICAuLi5lbGVtZW50QXR0cixcclxuICAgICAgICBjbGFzczogQ0xBU1NFUy5oZWFkZXJcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC5keFRvb2xiYXIoJ2luc3RhbmNlJyk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBhdXRvUmVzaXplIGZyb20gJy4vQXV0b1Jlc2l6ZSc7XHJcblxyXG5jb25zdCBDU1MgPSB7XHJcbiAgcGFuZWw6ICcucGFuZWwtYm9keSdcclxufTtcclxuXHJcbmxldCBsYXN0V2luZG93SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RDb250ZW50SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RXaWRnZXRIZWlnaHQgPSBudWxsO1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlSGVpZ2h0KHdpZGdldCkge1xyXG4gIGNvbnN0ICR3aWRnZXQgPSB3aWRnZXQuZWxlbWVudCgpO1xyXG4gIGNvbnN0ICRwYW5lbCA9ICR3aWRnZXQucGFyZW50cyhDU1MucGFuZWwpLmVxKDApO1xyXG5cclxuICAkcGFuZWwuaGVpZ2h0KGxhc3RDb250ZW50SGVpZ2h0KTtcclxuICB3aWRnZXQub3B0aW9uKCdoZWlnaHQnLCBsYXN0V2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55Pikge1xyXG4gIGNvbnN0ICR3aWRnZXQgPSB3aWRnZXQuZWxlbWVudCgpO1xyXG4gIGNvbnN0ICRwYW5lbCA9IHdpZGdldC5lbGVtZW50KCkucGFyZW50cyhDU1MucGFuZWwpLmVxKDApO1xyXG5cclxuICBjb25zdCBwYW5lbFRvcCA9ICRwYW5lbC5wb3NpdGlvbigpLnRvcDtcclxuICBjb25zdCBwYW5lbEhlaWdodCA9ICRwYW5lbC5oZWlnaHQoKTtcclxuICBjb25zdCBwYW5lbFBhZGRpbmcgPSAkcGFuZWwub3V0ZXJIZWlnaHQoKSAtICRwYW5lbC5oZWlnaHQoKTtcclxuICBjb25zdCB3aWRnZXRUb3AgPSAkd2lkZ2V0LnBvc2l0aW9uKCkudG9wO1xyXG5cclxuICBjb25zdCB3aWRnZXRIZWlnaHQgPSBwYW5lbEhlaWdodCAtICh3aWRnZXRUb3AgLSBwYW5lbFRvcCkgKyBwYW5lbFBhZGRpbmcgLyAyO1xyXG5cclxuICB3aWRnZXQub3B0aW9uKCdoZWlnaHQnLCB3aWRnZXRIZWlnaHQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZWNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjb25zdCB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7XHJcbiAgY29uc3QgZGlmZiA9IHdpbmRvd0hlaWdodCAtIGxhc3RXaW5kb3dIZWlnaHQ7XHJcblxyXG4gIGxhc3RDb250ZW50SGVpZ2h0ICs9IGRpZmY7XHJcbiAgbGFzdFdpZGdldEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaW5kb3dIZWlnaHQgPSB3aW5kb3dIZWlnaHQ7XHJcblxyXG4gIHVwZGF0ZUhlaWdodCh3aWRnZXQpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0KTtcclxuXHJcbiAgYXV0b1Jlc2l6ZSgoKSA9PiBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0KSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4uL0Z1bGxTY3JlZW4nO1xyXG5pbXBvcnQgcGFuZWxIZWlnaHQgZnJvbSAnLi4vUGFuZWxIZWlnaHQnO1xyXG5pbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uLy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIHtcclxuICBleHBvcnRGaWxlTmFtZT86IHN0cmluZztcclxuICBzdW1tYXJ5Q29sdW1uPzogc3RyaW5nO1xyXG4gIHNob3dTdW1tYXJ5SW5Db2x1bW4/OiBzdHJpbmc7XHJcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKGlkOiBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGlzSW5QYW5lbEdyaWQgPSBmYWxzZSk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGNyZWF0ZURhdGFHcmlkKGlkLCBvcHRpb25zKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xyXG4gICAgaWYgKGlzSW5QYW5lbEdyaWQpIHtcclxuICAgICAgcGFuZWxIZWlnaHQoZ3JpZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmdWxsU2NyZWVuKGdyaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRhR3JpZChlbDogSlF1ZXJ5LCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBncmlkID0gZWwuZHhEYXRhR3JpZChvcHRpb25zKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG5cclxuICBncmlkLmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QoXHJcbiAgZWw6IHN0cmluZyB8IEpRdWVyeSwgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0LlByb3BlcnRpZXMsIGlzSW5QYW5lbCA9IGZhbHNlXHJcbik6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB7XHJcbiAgY29uc3QgdHJlZUxpc3QgPSAodHlwZW9mIGVsID09PSAnc3RyaW5nJyA/ICQoZWwpIDogZWwpLmR4VHJlZUxpc3Qob3B0aW9ucykuZHhUcmVlTGlzdCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgdHJlZUxpc3QuZWxlbWVudCgpLmFkZENsYXNzKENTU19DTEFTU0VTLmR4RGF0YUdyaWQpO1xyXG5cclxuICBpZiAoIW9wdGlvbnMuaGVpZ2h0KSB7XHJcbiAgICBpZiAoaXNJblBhbmVsKSB7XHJcbiAgICAgIHBhbmVsSGVpZ2h0KHRyZWVMaXN0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZ1bGxTY3JlZW4odHJlZUxpc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRyZWVMaXN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKHRleHQsIHRpdGxlKSB7XHJcbiAgcmV0dXJuICQoJzxzcGFuPicpXHJcbiAgICAuYXR0cigndGl0bGUnLCB0aXRsZSlcclxuICAgIC50ZXh0KHRleHQpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBUb29sYmFySGVscGVyIH0gZnJvbSAnLi4vLi4vSGVscGVycy9Ub29sYmFyJztcclxuaW1wb3J0IHsgVGhlbWVIZWxwZXIsIFRIRU1FX0NMQVNTRVMgfSBmcm9tICcuLi8uLi9IZWxwZXJzL1RoZW1lJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vLi4vQ29uZmlnL0luZGV4JztcclxuaW1wb3J0IHsgY3JlYXRlR3JpZEV4cG9ydEZ1bmN0aW9uIH0gZnJvbSAnLi4vLi4vVXRpbHMvR3JpZEV4cG9ydCc7XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRTZXR0aW5nc0Jhc2U8VD4ge1xyXG4gIG9wdGlvbnM/OiBUO1xyXG5cclxuICBleHBvcnRGaWxlTmFtZT86IHN0cmluZztcclxuICBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZztcclxuICBpblBhbmVsR3JpZD86IGJvb2xlYW47XHJcbiAgaXNGdWxsU2NyZWVuPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBzZXREZWZhdWx0Q29sdW1uV2lkdGg/OiBib29sZWFuO1xyXG4gIHNob3dTdW1tYXJ5SW5Db2x1bW4/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBkaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbj86IGJvb2xlYW47XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgdG9vbGJhckFjY2VudEJ1dHRvbk5hbWU/OiBzdHJpbmc7XHJcbiAgdG9vbGJhckl0ZW1zPzogYW55W107XHJcbiAgYnV0dG9uc1NpemU/OiAnc20nIHwgJ21kJztcclxufVxyXG5cclxuY29uc3QgZ2V0V2lkZ2V0TmFtZSA9ICh3aWRnZXQ6IHN0cmluZykgPT4ge1xyXG4gIHJldHVybiB3aWRnZXRcclxuICAgIC5zbGljZSgnZHgnLmxlbmd0aClcclxuICAgIC50b0xvd2VyQ2FzZSgpO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0U2VsZWN0b3JzID0gKHdpZGdldDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3QgZ3JpZE5hbWUgPSBnZXRXaWRnZXROYW1lKHdpZGdldCk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzZWFyY2hQYW5lbDogYC5keC0ke2dyaWROYW1lfS1zZWFyY2gtcGFuZWxgLFxyXG4gICAgdG9vbGJhckVkaXRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tdG9vbGJhci1idXR0b24uZHgtZWRpdC1idXR0b25gLFxyXG4gICAgdG9vbGJhckV4cG9ydEJ1dHRvbjogYC5keC0ke2dyaWROYW1lfS1leHBvcnQtYnV0dG9uIC5keC1idXR0b25gLFxyXG4gICAgc2VsZWN0Q2hlY2tCb3g6ICcuZHgtc2VsZWN0LWNoZWNrYm94J1xyXG4gIH07XHJcbn07XHJcbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFHcmlkU2V0dGluZ3MgZXh0ZW5kcyBJR3JpZFNldHRpbmdzQmFzZTxEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zPiB7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRyZWVMaXN0U2V0dGluZ3MgZXh0ZW5kcyBJR3JpZFNldHRpbmdzQmFzZTxEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPiB7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmlkRGVmYXVsdE9wdGlvbnMoc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzKSB7XHJcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IGdldExlZ2FjeURlZmF1bHRPcHRpb25zKHNldHRpbmdzKSA6IGdldERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuXHJcbiAgaWYgKHNldHRpbmdzLnN1bW1hcnlDb2x1bW4gfHwgc2V0dGluZ3Muc2hvd1N1bW1hcnlJbkNvbHVtbikge1xyXG4gICAgKHJlc3VsdCBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcykuc3VtbWFyeSA9IHtcclxuICAgICAgdG90YWxJdGVtczogW3tcclxuICAgICAgICBjb2x1bW46IHNldHRpbmdzLnN1bW1hcnlDb2x1bW4gfHwgc2V0dGluZ3Muc2hvd1N1bW1hcnlJbkNvbHVtbixcclxuICAgICAgICBzaG93SW5Db2x1bW46IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4gfHwgc2V0dGluZ3Muc3VtbWFyeUNvbHVtbixcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlc3VsdC5leHBvcnQgPSB7XHJcbiAgICBlbmFibGVkOiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgYWxsb3dFeHBvcnRTZWxlY3RlZERhdGE6IHRydWUsXHJcbiAgfTtcclxuXHJcbiAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgIHJlc3VsdC5ncm91cFBhbmVsID0geyB2aXNpYmxlOiB0cnVlIH07XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJlZUxpc3REZWZhdWx0T3B0aW9ucyhzZXR0aW5nczogSVRyZWVMaXN0U2V0dGluZ3MpIHtcclxuICBjb25zdCByZXN1bHQ6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcblxyXG4gIHJlc3VsdC5zZWxlY3Rpb24gPSB7IG1vZGU6ICdub25lJyB9O1xyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9uc1xyXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICBjYWNoZUVuYWJsZWQ6IHRydWUsXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdHJ1ZSwgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG4gICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IHRydWUgfSxcclxuICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgcGFnaW5nOiB7IHBhZ2VTaXplOiA4MCB9LFxyXG4gICAgcGFnZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICBzY3JvbGxpbmc6IHtcclxuICAgICAgbW9kZTogJ3ZpcnR1YWwnLFxyXG4gICAgICByb3dSZW5kZXJpbmdNb2RlOiAndmlydHVhbCdcclxuICAgIH0sXHJcbiAgICBzZWFyY2hQYW5lbDoge1xyXG4gICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICB3aWR0aDogMjQwLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaC4uLidcclxuICAgIH0sXHJcbiAgICBzaG93Um93TGluZXM6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWVcclxuICB9IGFzIFQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldExlZ2FjeURlZmF1bHRPcHRpb25zXHJcbiAgPFQgZXh0ZW5kcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zIHwgRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucz4oc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzIHwgSVRyZWVMaXN0U2V0dGluZ3MpOiBUIHtcclxuICByZXR1cm4ge1xyXG4gICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiB0cnVlLCBhcHBseUZpbHRlcjogJ29uQ2xpY2snIH0sXHJcblxyXG4gICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdtdWx0aXBsZScgfSxcclxuICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogNTAgfSxcclxuICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IHRydWUgfSxcclxuICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3ZpcnR1YWwnIH0sXHJcbiAgfSBhcyBUO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcmVwYXJlRGVmYXVsdFRvb2xiYXJCdXR0b25zKHRvb2xiYXJPcHRpb25zOiBhbnksIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lPzogc3RyaW5nKSB7XHJcbiAgY29uc3QgZmluZFRvb2xiYXJJdGVtID0gKGl0ZW1zOiBhbnlbXSwgbmFtZTogc3RyaW5nKSA9PiBpdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IG5hbWUpO1xyXG5cclxuICBpZiAodG9vbGJhck9wdGlvbnM/Lml0ZW1zKSB7XHJcbiAgICBjb25zdCB7IGl0ZW1zIH0gPSB0b29sYmFyT3B0aW9ucztcclxuXHJcbiAgICBpZiAodG9vbGJhckFjY2VudEJ1dHRvbk5hbWUpIHtcclxuICAgICAgY29uc3QgYWNjZW50QnV0dG9uSXRlbSA9IGZpbmRUb29sYmFySXRlbShpdGVtcywgdG9vbGJhckFjY2VudEJ1dHRvbk5hbWUpO1xyXG4gICAgICBpZiAoYWNjZW50QnV0dG9uSXRlbSkge1xyXG4gICAgICAgIGFjY2VudEJ1dHRvbkl0ZW0ub3B0aW9ucy50eXBlID0gJ2RlZmF1bHQnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2F2ZUJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdzYXZlQnV0dG9uJyk7XHJcbiAgICBpZiAoc2F2ZUJ1dHRvbkl0ZW0pIHtcclxuICAgICAgc2F2ZUJ1dHRvbkl0ZW0uc2hvd1RleHQgPSAnYWx3YXlzJztcclxuICAgICAgc2F2ZUJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ1NhdmUnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJldmVydEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdyZXZlcnRCdXR0b24nKTtcclxuICAgIGlmIChyZXZlcnRCdXR0b25JdGVtKSB7XHJcbiAgICAgIHJldmVydEJ1dHRvbkl0ZW0uc2hvd1RleHQgPSAnYWx3YXlzJztcclxuICAgICAgcmV2ZXJ0QnV0dG9uSXRlbS5vcHRpb25zLnRleHQgPSAnRGlzY2FyZCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVmcmVzaEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdyZWZyZXNoJyk7XHJcbiAgICBpZiAocmVmcmVzaEJ1dHRvbkl0ZW0pIHtcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0uc2hvd1RleHQgPSAnYWx3YXlzJztcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ1JlZnJlc2gnO1xyXG4gICAgICByZWZyZXNoQnV0dG9uSXRlbS5vcHRpb25zLmhpbnQgPSAnUmVsb2FkIERhdGEnO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgY29uc3QgdG90YWxJdGVtcyA9IGdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXTtcclxuICBjb25zdCBjdXJyZW50U3VtbWFyeUNvbHVtbiA9IHRvdGFsSXRlbXM/LmZpbHRlcigoaSkgPT4gaS5zdW1tYXJ5VHlwZSA9PT0gJ2NvdW50JylbMF0/LmNvbHVtbjtcclxuXHJcbiAgbGV0IHN1bW1hcnlDb2x1bW5JbmRleCA9IGN1cnJlbnRTdW1tYXJ5Q29sdW1uICYmIGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kSW5kZXgoKGVsKSA9PiBlbC5kYXRhRmllbGQgPT09IGN1cnJlbnRTdW1tYXJ5Q29sdW1uKTtcclxuICBpZiAoIXN1bW1hcnlDb2x1bW5JbmRleCkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicpO1xyXG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5tb2RlICE9PSAnbm9uZSc7XHJcbiAgICBzdW1tYXJ5Q29sdW1uSW5kZXggPSBoYXNTZWxlY3Rpb24gPyBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gISFlbC5kYXRhRmllbGQpIDogMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5ld1N1bW1hcnlDb2x1bW4gPSBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkO1xyXG5cclxuICBpZiAobmV3U3VtbWFyeUNvbHVtbiAmJiBjdXJyZW50U3VtbWFyeUNvbHVtbiAhPT0gbmV3U3VtbWFyeUNvbHVtbikge1xyXG4gICAgZ3JpZC5vcHRpb24oJ3N1bW1hcnknLCB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkLFxyXG4gICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICAgIH1dXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYW5kbGVyczxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KFxyXG4gIHdpZGdldDogJ2R4RGF0YUdyaWQnIHwgJ2R4VHJlZUxpc3QnLFxyXG4gIHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzXHJcbik6IFQge1xyXG4gIGNvbnN0IHNlbGVjdG9ycyA9IGdldFNlbGVjdG9ycyh3aWRnZXQpO1xyXG4gIGxldCBpc0dyaWRJbml0aWFsaXphZWQgPSBmYWxzZTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChlLnJvd1R5cGUgPT09ICdoZWFkZXInKSB7XHJcbiAgICAgICAgICBlLmNlbGxFbGVtZW50LmNzcygndGV4dC1hbGlnbicsICdjZW50ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vbkNlbGxQcmVwYXJlZCkge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnM/Lm9uQ2VsbFByZXBhcmVkKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGFHcmlkID0gZS5jb21wb25lbnQ7XHJcblxyXG4gICAgICBpZiAoIXNldHRpbmdzLmRpc2FibGVTdW1tYXJ5Q29sdW1uRGV0ZWN0aW9uKSB7XHJcbiAgICAgICAgdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZGF0YUdyaWQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWlzR3JpZEluaXRpYWxpemFlZCkge1xyXG4gICAgICAgIGlzR3JpZEluaXRpYWxpemFlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vdG8gZml4IGF1dG9zY3JvbGxcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSBkYXRhR3JpZC5nZXRTY3JvbGxhYmxlKCk7XHJcblxyXG4gICAgICAgICAgaWYgKHNjcm9sbGFibGUpIHtcclxuICAgICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7IHRvcDogMCB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhR3JpZC5jb2x1bW5Db3VudCgpOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZGF0YVR5cGUnKTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnNldERlZmF1bHRDb2x1bW5XaWR0aCB8fCBzZXR0aW5ncy5zZXREZWZhdWx0Q29sdW1uV2lkdGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgaWYgKCFkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJykpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzQ1cHgnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxMzVweCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRlJykge1xyXG4gICAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTQwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJyB8fCBkYXRhVHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnYWxpZ25tZW50JywgJ3JpZ2h0Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICdmb3JtYXQnLCAnZGQgTU1NIHl5eXknKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICdmb3JtYXQnLCAnSEg6bW0sIGRkIE1NTSB5eXl5Jyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJykge1xyXG4gICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U21hbGxTaXplKCQoc2VsZWN0b3JzLnNlYXJjaFBhbmVsKS5keFRleHRCb3goJ2luc3RhbmNlJykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRNaWRkbGVTaXplKCQoc2VsZWN0b3JzLnNlYXJjaFBhbmVsKS5keFRleHRCb3goJ2luc3RhbmNlJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgVGhlbWVIZWxwZXIuc2V0RWxlbWVudFNtYWxsU2l6ZShlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZChzZWxlY3RvcnMuc2VsZWN0Q2hlY2tCb3gpKTtcclxuXHJcbiAgICAgICAgaWYgKCQoc2VsZWN0b3JzLnRvb2xiYXJFeHBvcnRCdXR0b24pLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJykge1xyXG4gICAgICAgICAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTbWFsbFNpemUoJChzZWxlY3RvcnMudG9vbGJhckV4cG9ydEJ1dHRvbikuZHhCdXR0b24oJ2luc3RhbmNlJykpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0TWlkZGxlU2l6ZSgkKHNlbGVjdG9ycy50b29sYmFyRXhwb3J0QnV0dG9uKS5keEJ1dHRvbignaW5zdGFuY2UnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZW50UmVhZHkpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgdG9vbGJhck9wdGlvbnMgPSB7fVxyXG4gICAgICB9ID0gZTtcclxuXHJcbiAgICAgIGNvbnN0IGRhdGFHcmlkID0gZS5jb21wb25lbnQ7XHJcblxyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgaXRlbXMgPSBbXVxyXG4gICAgICB9ID0gdG9vbGJhck9wdGlvbnM7XHJcblxyXG4gICAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRpdGxlKSB7XHJcbiAgICAgICAgICBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLnVuc2hpZnQoe1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlKCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlckVsID0gJCgnPGgyIC8+JykuYWRkQ2xhc3MoJ2dyaWQtaGVhZGVyJykudGV4dChzZXR0aW5ncy50aXRsZSk7XHJcbiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhlYWRlckRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJFbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdDbGljayB0byBzZWUgZnVydGhlciBkZXRhaWxzJykpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlckVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLndpZGdldCA9PT0gJ2R4QnV0dG9uJyAmJiBpdGVtLm5hbWUgPT09ICdhcHBseUZpbHRlckJ1dHRvbicpIHtcclxuICAgICAgICAgICAgaXRlbS5vcHRpb25zLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MudGl0bGUpIHtcclxuICAgICAgICAgIGl0ZW1zLnVuc2hpZnQoVG9vbGJhckhlbHBlci5nZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0oc2V0dGluZ3MudGl0bGUsIHNldHRpbmdzLmhlYWRlckRlc2NyaXB0aW9uKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0ud2lkZ2V0ID09PSAnZHhCdXR0b24nKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09ICdhcHBseUZpbHRlckJ1dHRvbicpIHtcclxuICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGljb25TaXplID0gc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyAxNiA6IDI0O1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChpdGVtLm5hbWUpIHtcclxuICAgICAgICAgICAgICBjYXNlICdhZGRSb3dCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ3BsdXMnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgJ3NhdmVCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ3NhdmUnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgJ3JldmVydEJ1dHRvbic6XHJcbiAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuaWNvbiA9IFRoZW1lSGVscGVyLmdldEljb25DbGFzcygnY2xvc2UnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuaWNvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0cikge1xyXG4gICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIuY2xhc3MgPSBzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJyA/IFRIRU1FX0NMQVNTRVMuc20gOiBUSEVNRV9DTEFTU0VTLm1kO1xyXG4gICAgICAgICAgICBpdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHByZXBhcmVEZWZhdWx0VG9vbGJhckJ1dHRvbnModG9vbGJhck9wdGlvbnMsIHNldHRpbmdzLnRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRvb2xiYXJJdGVtcykge1xyXG4gICAgICAgICAgaXRlbXMucHVzaCguLi5zZXR0aW5ncy50b29sYmFySXRlbXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdG9vbGJhck9wdGlvbnMuZWxlbWVudEF0dHIgPSB7XHJcbiAgICAgICAgICBjbGFzczogJ2lzb3otdG9vbGJhci1oZWFkZXInXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbkluZGV4ID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ3NhdmVCdXR0b24nKTtcclxuICAgICAgY29uc3Qgc2VhcmNoUGFuZWxJbmRleCA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzZWFyY2hQYW5lbCcpO1xyXG4gICAgICBsZXQgaW5kZXhGb3JVcGRhdGUgPSAtMTtcclxuXHJcbiAgICAgIGlmIChzYXZlQnV0dG9uSW5kZXggPiAtMSkge1xyXG4gICAgICAgIGluZGV4Rm9yVXBkYXRlID0gc2F2ZUJ1dHRvbkluZGV4O1xyXG4gICAgICB9IGVsc2UgaWYgKHNlYXJjaFBhbmVsSW5kZXggPiAtMSkge1xyXG4gICAgICAgIGluZGV4Rm9yVXBkYXRlID0gc2VhcmNoUGFuZWxJbmRleDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLnNwbGljZShpbmRleEZvclVwZGF0ZSwgMCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgIG5hbWU6ICdyZWZyZXNoJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgaWNvbjogJ3JlZnJlc2gnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IDMwIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogYGR4LWRhdGFncmlkLXRvb2xiYXItYnV0dG9uICR7c2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyBUSEVNRV9DTEFTU0VTLnNtIDogVEhFTUVfQ0xBU1NFUy5tZH1gIH0sXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2RlOiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAndGV4dCcgOiAnY29udGFpbmVkJyxcclxuICAgICAgICAgICAgb25DbGljazogKCkgPT4gZGF0YUdyaWQ/LnJlZnJlc2goKSxcclxuICAgICAgICAgICAgb25Db250ZW50UmVhZHk6IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IChjb250ZW50UmVhZHlFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnRlbnRSZWFkeUV2ZW50LmVsZW1lbnQuZmluZCgnLmR4LWJ1dHRvbi1jb250ZW50JykuY3NzKHtcclxuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6IDYsXHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tOiA2XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbi5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uVG9vbGJhclByZXBhcmluZykge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnMub25Ub29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgZS5lZGl0b3JPcHRpb25zID0ge1xyXG4gICAgICAgICAgLi4uZS5lZGl0b3JPcHRpb25zLFxyXG4gICAgICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICAgICAgY2xhc3M6IFRIRU1FX0NMQVNTRVMubWRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoZS5lZGl0b3JOYW1lID09PSAnZHhTZWxlY3RCb3gnKSB7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZHJvcERvd25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAuLi5lLmVkaXRvck9wdGlvbnMuZHJvcERvd25PcHRpb25zLFxyXG4gICAgICAgICAgICBvblNob3dpbmc6IChhcmdzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCB3aWRnZXROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xyXG4gICAgICAgICAgICAgIGFyZ3MuY29tcG9uZW50Ll8kcG9wdXBDb250ZW50LmFkZENsYXNzKGBpc296LSR7d2lkZ2V0TmFtZX0tc2VsZWN0Ym94LXBvcHVwYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZS5lZGl0b3JOYW1lID09PSAnZHhDaGVja0JveCcpIHtcclxuICAgICAgICAgIFRoZW1lSGVscGVyLnNldEVsZW1lbnRTbWFsbFNpemUoZS5lZGl0b3JFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN3aXRjaCAoZS5wYXJlbnRUeXBlKSB7XHJcbiAgICAgICAgY2FzZSAnZmlsdGVyUm93JzpcclxuICAgICAgICAgIGNvbnN0IGFwcGx5RmlsdGVyOiBEZXZFeHByZXNzLnVpLmR4VGV4dEVkaXRvci5Qcm9wZXJ0aWVzWydvbkVudGVyS2V5J10gPSAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBlLmVsZW1lbnQgJiYgZS5lbGVtZW50LmZpbmQoJy5keC1hcHBseS1idXR0b24nKS50cmlnZ2VyKCdkeGNsaWNrJyk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHlGaWx0ZXI7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5RmlsdGVyO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdzZWFyY2hQYW5lbCc6XHJcbiAgICAgICAgICBjb25zdCBhcHBseVNlYXJjaDogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5jb21wb25lbnQuc2VhcmNoQnlUZXh0KGFyZ3MuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9ICgpID0+IHsgfTtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHlTZWFyY2g7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5U2VhcmNoO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25FZGl0b3JQcmVwYXJpbmcpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uRWRpdG9yUHJlcGFyaW5nKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25Db250ZXh0TWVudVByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoZS50YXJnZXQgPT09ICdjb250ZW50JyAmJiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lKSB7XHJcbiAgICAgICAgICBpZiAoIWUuaXRlbXMpIHtcclxuICAgICAgICAgICAgZS5pdGVtcyA9IFtdO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGUuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgIHRleHQ6ICdFeHBvcnQgYWxsIGRhdGEnLFxyXG4gICAgICAgICAgICBvbkl0ZW1DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmV4cG9ydFRvRXhjZWwoZmFsc2UpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpY29uOiAneGxzeGZpbGUnXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhDb250ZXh0TWVudUl0ZW0pO1xyXG5cclxuICAgICAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zLnNlbGVjdGlvbj8ubW9kZSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IGUuY29tcG9uZW50LmdldFNlbGVjdGVkUm93S2V5cygpO1xyXG5cclxuICAgICAgICAgICAgZS5pdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IHNlbGVjdGVkIHJvd3MnLFxyXG4gICAgICAgICAgICAgIG9uSXRlbUNsaWNrOiAoKSA9PiBlLmNvbXBvbmVudC5leHBvcnRUb0V4Y2VsKHRydWUpLFxyXG4gICAgICAgICAgICAgIGljb246ICdleHBvcnRzZWxlY3RlZCcsXHJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFzZWxlY3RlZFJvd3MgfHwgIXNlbGVjdGVkUm93cy5sZW5ndGhcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnVJdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vbkNvbnRleHRNZW51UHJlcGFyaW5nKSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZXh0TWVudVByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRXhwb3J0aW5nOiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lID8gY3JlYXRlR3JpZEV4cG9ydEZ1bmN0aW9uKHNldHRpbmdzLmV4cG9ydEZpbGVOYW1lKSA6IHZvaWQgMCxcclxuICB9IGFzIFQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURhdGFHcmlkLCBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuaW1wb3J0IHsgZ2V0R3JpZERlZmF1bHRPcHRpb25zLCBnZXRIYW5kbGVycywgSURhdGFHcmlkU2V0dGluZ3MgfSBmcm9tICcuL0RlZmF1bHRHcmlkQmFzZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbDogSlF1ZXJ5LCBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0R3JpZERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuICBsZXQgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgc2V0dGluZ3Mub3B0aW9ucyk7XHJcbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRIYW5kbGVyczxEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zPignZHhEYXRhR3JpZCcsICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgeyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0pKTtcclxuXHJcbiAgbWVyZ2VkT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBtZXJnZWRPcHRpb25zLCBoYW5kbGVycyk7XHJcblxyXG4gIGlmIChzZXR0aW5ncy5pc0Z1bGxTY3JlZW4gfHwgc2V0dGluZ3MuaXNGdWxsU2NyZWVuID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQoZWwsIG1lcmdlZE9wdGlvbnMsIHNldHRpbmdzLmluUGFuZWxHcmlkKTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGNyZWF0ZURhdGFHcmlkKGVsLCBtZXJnZWRPcHRpb25zKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4vRGVmYXVsdEdyaWQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXHJcbiAgaWQ6IHN0cmluZywgZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyA9IHt9LFxyXG4gIGhlYWRlclRleHQ/OiBzdHJpbmcsIGhlYWRlckRlc2NyaXB0aW9uPzogc3RyaW5nXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgcmV0dXJuIGRlZmF1bHRHcmlkKCQoYCMke2lkfWApLCB7XHJcbiAgICBvcHRpb25zOiBkYXRhR3JpZE9wdGlvbnMsXHJcbiAgICBleHBvcnRGaWxlTmFtZTogYWRkaXRpb25hbE9wdGlvbnMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICBpblBhbmVsR3JpZDogYWRkaXRpb25hbE9wdGlvbnMuaW5QYW5lbEdyaWQsXHJcbiAgICBzaG93U3VtbWFyeUluQ29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zaG93U3VtbWFyeUluQ29sdW1uLFxyXG4gICAgc3VtbWFyeUNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc3VtbWFyeUNvbHVtbixcclxuICAgIGhlYWRlckRlc2NyaXB0aW9uLFxyXG4gICAgdGl0bGU6IGhlYWRlclRleHRcclxuICB9KTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVRyZWVMaXN0U2V0dGluZ3MsIGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMsIGdldEhhbmRsZXJzIH0gZnJvbSAnLi9EZWZhdWx0R3JpZEJhc2UnO1xyXG5pbXBvcnQgeyBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKFxyXG4gIGlkOiBzdHJpbmcgfCBKUXVlcnksXHJcbiAgc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzID0ge31cclxuKTogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0IHtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xyXG4gIGxldCBtZXJnZWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBzZXR0aW5ncy5vcHRpb25zKTtcclxuICBjb25zdCBoYW5kbGVycyA9IGdldEhhbmRsZXJzPERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KCdkeFRyZWVMaXN0JywgJC5leHRlbmQodHJ1ZSwge30sIHNldHRpbmdzLCB7IG9wdGlvbnM6IG1lcmdlZE9wdGlvbnMgfSkpO1xyXG5cclxuICBtZXJnZWRPcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIG1lcmdlZE9wdGlvbnMsIGhhbmRsZXJzKTtcclxuXHJcbiAgcmV0dXJuIGNyZWF0ZUZ1bGxTY3JlZW5UcmVlTGlzdChpZCwgbWVyZ2VkT3B0aW9ucywgc2V0dGluZ3MuaW5QYW5lbEdyaWQpO1xyXG59XHJcbiIsICJpbXBvcnQgQ3JvcHByIGZyb20gJ2Nyb3Bwcic7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uL1BvcHVwJztcclxuXHJcbmltcG9ydCBJbml0aWFsaXplZEV2ZW50SW5mbyA9IERldkV4cHJlc3MuZXZlbnRzLkluaXRpYWxpemVkRXZlbnRJbmZvO1xyXG5cclxuY29uc3QgYXZhdGFyU2l6ZSA9IHtcclxuICBoZWlnaHQ6IDMwMCxcclxuICB3aWR0aDogMzAwLFxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRJbWFnZVRvUHJldmlldyAocHJldmlldzogSlF1ZXJ5LCBiYXNlNjRJbWc6IHN0cmluZyB8IG51bGwpIHtcclxuICBwcmV2aWV3LmF0dHIoJ3NyYycsIGJhc2U2NEltZyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRNYXJrdXAgKGltYWdlQmFzZTY0OiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgY29uc3QgJGF2YXRhclBvcHVwQ29udGVudCA9ICQoJzxkaXY+JylcclxuICAgIC5hZGRDbGFzcygnYXZhdGFyLXBvcHVwX19kcm9wem9uZScpO1xyXG4gIC8vLm9uKCdkcm9wJyAsIGV2ID0+IGV2LmRhdGFUcmFuc2Zlci5maWxlcylcclxuXHJcbiAgY29uc3QgJGNyb3BwZXJDb250YWluZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fY3JvcC1jb250YWluZXInKVxyXG4gICAgLmFwcGVuZFRvKCRhdmF0YXJQb3B1cENvbnRlbnQpO1xyXG5cclxuICBjb25zdCAkY3JvcEltYWdlID0gJCgnPGltZyAvPicpLnByZXBlbmRUbygkY3JvcHBlckNvbnRhaW5lcik7XHJcblxyXG4gIHNldEltYWdlVG9QcmV2aWV3KCRjcm9wSW1hZ2UsIGltYWdlQmFzZTY0KTtcclxuXHJcbiAgY29uc3QgY3JvcHBlciA9IG5ldyBDcm9wcHIoJGNyb3BJbWFnZVswXSwge1xyXG4gICAgYXNwZWN0UmF0aW86IDEsXHJcbiAgICBzdGFydFNpemU6IFs5MCwgOTBdLFxyXG4gIH0pO1xyXG5cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgICRjb250ZW50OiAkYXZhdGFyUG9wdXBDb250ZW50LFxyXG4gICAgY3JvcHBlclxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dQb3B1cCAoJGNvbnRlbnQ6IEpRdWVyeSwgY3JvcHBlcjogQ3JvcHByLCBvbkF2YXRhclVwZGF0ZWQ6IChwaG90b0Jhc2U2NDogc3RyaW5nKSA9PiB2b2lkKSB7XHJcbiAgY3JlYXRlRGlhbG9nKFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ1VwZGF0ZSBwcm9maWxlIHBpY3R1cmUnLFxyXG4gICAgICBzaG93VGl0bGU6IHRydWUsXHJcbiAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgcmVzaXplRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgIG1heFdpZHRoOiAxMDI0LFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZTogSW5pdGlhbGl6ZWRFdmVudEluZm88RGV2RXhwcmVzcy51aS5keFBvcHVwPikgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50ICYmIGUuY29tcG9uZW50Lm9wdGlvbignZnVsbFNjcmVlbicsIHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwMjQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgJGNvbnRlbnQsXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6ICdVcGRhdGUnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2UpID0+IHtcclxuICAgICAgICBjb25zdCBjcm9wT3B0aW9ucyA9IGNyb3BwZXIuZ2V0VmFsdWUoKTtcclxuICAgICAgICBjb25zdCAkY2FudmFzOiBKUXVlcnk8SFRNTENhbnZhc0VsZW1lbnQ+ID0gJCgnPGNhbnZhcz4nKS5hdHRyKCdoZWlnaHQnLCBhdmF0YXJTaXplLmhlaWdodCkuYXR0cignd2lkdGgnLCBhdmF0YXJTaXplLndpZHRoKSBhcyBKUXVlcnk8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG4gICAgICAgIGNvbnN0IGN0eCA9ICgkY2FudmFzWzBdIGFzIGFueSkuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBjb25zdCAkaW1hZ2UgPSAkY29udGVudC5maW5kKCdpbWcuY3JvcHByLWltYWdlJylbMF07XHJcblxyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoJGltYWdlLCBjcm9wT3B0aW9ucy54LCBjcm9wT3B0aW9ucy55LCBjcm9wT3B0aW9ucy53aWR0aCwgY3JvcE9wdGlvbnMuaGVpZ2h0LCAwLCAwLCBhdmF0YXJTaXplLndpZHRoLCBhdmF0YXJTaXplLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNyb3BwZWQgPSAkY2FudmFzWzBdLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDAuOSk7XHJcblxyXG4gICAgICAgIG9uQXZhdGFyVXBkYXRlZChjcm9wcGVkKTtcclxuICAgICAgICBjbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgb25DbGljazogKGNsb3NlKSA9PiBjbG9zZSgpXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNob3cgKGltYWdlQmFzZTY0OiBzdHJpbmcgfCBudWxsLCBvbkF2YXRhclVwZGF0ZWQ6IChwaG90b0Jhc2U2NDogc3RyaW5nKSA9PiB2b2lkKSB7XHJcbiAgY29uc3QgY29udGVudCA9IGNyZWF0ZUNvbnRlbnRNYXJrdXAoaW1hZ2VCYXNlNjQpO1xyXG5cclxuICBzaG93UG9wdXAoY29udGVudC4kY29udGVudCwgY29udGVudC5jcm9wcGVyLCBvbkF2YXRhclVwZGF0ZWQpO1xyXG59XHJcbiIsICJleHBvcnQgY29uc3QgZ2V0QmFzZTY0ID0gKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBmaWxlUmVhZGVyLnJlc3VsdDtcclxuICAgICAgICByZXNvbHZlKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnID8gcmVzdWx0IDogbnVsbCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgIH1cclxuICB9KTtcclxufTtcclxuIiwgImltcG9ydCB7SVJlbmRlcmVkfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQge0RldkV4cHJlc3NFdmVudEFyZ3N9IGZyb20gJy4uLy4uL1V0aWxzL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5pbXBvcnQgeyBzaG93IH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cnO1xyXG5pbXBvcnQge2dldEJhc2U2NH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cvSGVscGVycyc7XHJcbmltcG9ydCBkeFRleHRCb3hPcHRpb25zID0gRGV2RXhwcmVzcy51aS5keFRleHRCb3hPcHRpb25zO1xyXG5pbXBvcnQgZHhUZXh0Qm94ID0gRGV2RXhwcmVzcy51aS5keFRleHRCb3g7XHJcbmltcG9ydCBJc3pvbGVhVUkgZnJvbSAnLi4vLi4vaW5kZXgnO1xyXG5cclxuY29uc3QgbWF4RmlsZU1iU2l6ZSA9IDEwO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQWNjb3VudFNldHRpbmdzRGF0YSB7XHJcbiAgVXNlck5hbWU6IHN0cmluZztcclxuICBGaXJzdE5hbWU6IHN0cmluZztcclxuICBMYXN0TmFtZTogc3RyaW5nO1xyXG4gIFBob25lTnVtYmVyOiBzdHJpbmc7XHJcbiAgRW1haWw6IHN0cmluZztcclxuICBPbGRQYXNzd29yZDogc3RyaW5nO1xyXG4gIE5ld1Bhc3N3b3JkOiBzdHJpbmc7XHJcbiAgTmV3UGFzc3dvcmRSZXBlYXQ6IHN0cmluZztcclxuICBBdmF0YXI6IHN0cmluZztcclxuICBIYXNDaGFuZ2VzOiBib29sZWFuO1xyXG4gIEVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyIHtcclxuICBJZDogc3RyaW5nO1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgRmlyc3ROYW1lOiBzdHJpbmc7XHJcbiAgTGFzdE5hbWU6IHN0cmluZztcclxuICBVc2VyQXZhdGFyOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBY2NvdW50U2V0dGluZ3NQYWdlIGltcGxlbWVudHMgSVJlbmRlcmVkIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRVc2VySW5mbzogSVVzZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIHJlYWRvbmx5IGFjY291bnRTZXR0aW5nc0RhdGE6IElBY2NvdW50U2V0dGluZ3NEYXRhIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyByZWFkb25seSBmb3JtQWN0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBhdmF0YXJVcGxvYWRlcjogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGFjY291bnRTZXR0aW5nc0Zvcm06IERldkV4cHJlc3MudWkuZHhGb3JtIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvLyBlbGVtZW50c1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgXyRyb290RWxlbWVudDogSlF1ZXJ5PEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAkY29udGFpbmVyOiBKUXVlcnk8SFRNTERpdkVsZW1lbnQ+LFxyXG4gICAgZm9ybUFjdGlvbjogc3RyaW5nLFxyXG4gICAgYWNjb3VudFNldHRpbmdzRGF0YTogSUFjY291bnRTZXR0aW5nc0RhdGEgfCB1bmRlZmluZWQsXHJcbiAgICB1c2VySW5mbzogSVVzZXIgfCB1bmRlZmluZWRcclxuICApIHtcclxuICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YSA9IGFjY291bnRTZXR0aW5nc0RhdGE7XHJcbiAgICB0aGlzLmN1cnJlbnRVc2VySW5mbyA9IHVzZXJJbmZvO1xyXG4gICAgdGhpcy5fJHJvb3RFbGVtZW50ID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZm9ybUFjdGlvbiA9IGZvcm1BY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5yZW5kZXJVcGxvYWRlcih0aGlzLiRyb290RWxlbWVudCk7XHJcbiAgICB0aGlzLnJlbmRlckFjY291bnRTZXR0aW5nc0Zvcm0odGhpcy4kcm9vdEVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgJHJvb3RFbGVtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLl8kcm9vdEVsZW1lbnQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcm9vdCBlbGVtZW50IGlzIHVuZGVmaW5lZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl8kcm9vdEVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclVwbG9hZGVyKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgdGhpcy5hdmF0YXJVcGxvYWRlciA9ICQoJzxkaXY+JylcclxuICAgICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX3VwbG9hZGVyJylcclxuICAgICAgLmR4RmlsZVVwbG9hZGVyKHtcclxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXHJcbiAgICAgICAgdXBsb2FkTW9kZTogJ3VzZUZvcm0nLFxyXG4gICAgICAgIGFjY2VwdDogJ2ltYWdlLyonLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgIG1heEZpbGVTaXplOiBtYXhGaWxlTWJTaXplICogMTAwMDAwMCxcclxuXHJcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlOiBEZXZFeHByZXNzRXZlbnRBcmdzPERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXJPcHRpb25zLCAnb25WYWx1ZUNoYW5nZWQnPikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCB8fCAhZS52YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBmaWxlID0gZS52YWx1ZVswXTtcclxuICAgICAgICAgIGNvbnN0IG1heFNpemUgPSBlLmNvbXBvbmVudC5vcHRpb24oJ21heEZpbGVTaXplJykgfHwgbWF4RmlsZU1iU2l6ZTtcclxuXHJcbiAgICAgICAgICBpZiAoIWZpbGUgfHwgZmlsZS5zaXplID4gbWF4U2l6ZSkge1xyXG4gICAgICAgICAgICBEZXZFeHByZXNzLnVpLm5vdGlmeShgRmlsZSBzaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gJHttYXhGaWxlTWJTaXplfSBNQi4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIGZpbGVgLCAnZXJyb3InLCA1MDAwKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBnZXRCYXNlNjQoZmlsZSlcclxuICAgICAgICAgICAgLnRoZW4oKGltYWdlQmFzZTY0KSA9PiB7XHJcbiAgICAgICAgICAgICAgc2hvdyhpbWFnZUJhc2U2NCwgKG5ld0ltZ1NvdXJjZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy51cGRhdGVEYXRhKCdBdmF0YXInLCBuZXdJbWdTb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy5yZXBhaW50KCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IERldkV4cHJlc3MudWkubm90aWZ5KGVycm9yLCAnZXJyb3InLCAzMDAwKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpXHJcbiAgICAgIC5keEZpbGVVcGxvYWRlcignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQWNjb3VudFNldHRpbmdzRm9ybSgkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIGlmICh0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybSA9ICQoJzxmb3JtIC8+JylcclxuICAgICAgLmF0dHIoJ2FjdGlvbicsIHRoaXMuZm9ybUFjdGlvbilcclxuICAgICAgLmF0dHIoJ21ldGhvZCcsICdwb3N0JylcclxuICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19mb3JtJylcclxuICAgICAgLmFkZENsYXNzKCdmb3JtLWNvbnRlbnQnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICAgICAgLmR4Rm9ybSh0aGlzLmdldEZvcm1PcHRpb25zKCkpXHJcbiAgICAgIC5keEZvcm0oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YT8uSGFzQ2hhbmdlcyAmJiAhdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLkVycm9yTWVzc2FnZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IElzem9sZWFVSS53aWRnZXRzLm5vdGlmeSgnQ2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWQnLCB0cnVlKSwgNTAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9ybU9wdGlvbnMoKSA6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmb3JtRGF0YTogdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLFxyXG4gICAgICBtaW5Db2xXaWR0aDogMjAwLFxyXG4gICAgICBsYWJlbExvY2F0aW9uOiAndG9wJyxcclxuICAgICAgYWxpZ25JdGVtTGFiZWxzOiB0cnVlLFxyXG4gICAgICBzaG93VmFsaWRhdGlvblN1bW1hcnk6IHRydWUsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICBjb2xDb3VudDogMTYsXHJcbiAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29sU3BhbjogNixcclxuICAgICAgICAgICAgICBjYXB0aW9uOiAnUHJvZmlsZSBQaWN0dXJlJyxcclxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0F2YXRhcicsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGF2YXRhclZpZXdDb250YWluZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci12aWV3LWNvbnRhaW5lcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCAkYXZhdGFyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZCgkYXZhdGFyVmlld0NvbnRhaW5lcilcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci1idXR0b24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3Bob3RvJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdVcGxvYWQgbmV3IGltYWdlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmF2YXRhclVwbG9hZGVyICYmIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdkaWFsb2dUcmlnZ2VyJywgZS5lbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICApLmFwcGVuZFRvKCRhdmF0YXJDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdmF0YXJCYXNlNjQgPSBkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUgfHwgdGhpcy5jdXJyZW50VXNlckluZm8/LlVzZXJBdmF0YXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdmF0YXJCYXNlNjQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICQoJzxpbWc+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzcmMnLCBhdmF0YXJCYXNlNjQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkYXZhdGFyVmlld0NvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCc8aW5wdXQ+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci1pbnB1dCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAndGV4dCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ25hbWUnLCAnQXZhdGFyJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGF2YXRhckNvbnRhaW5lcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsKGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICQoJzxpPicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhbJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci12aWV3LWRlZmF1bHQnLCAnZmFzJywgJ2ZhLXVzZXInXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJWaWV3Q29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmKHRoaXMuYXZhdGFyVXBsb2FkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdkcm9wWm9uZScsICRhdmF0YXJDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5hdmF0YXJVcGxvYWRlci5vcHRpb24oJ29uRHJvcFpvbmVFbnRlcicsICgpID0+ICRhdmF0YXJDb250YWluZXIuYWRkQ2xhc3MoJ2Ryb3AnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignb25Ecm9wWm9uZUxlYXZlJywgKCkgPT4gJGF2YXRhckNvbnRhaW5lci5yZW1vdmVDbGFzcygnZHJvcCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkYXZhdGFyQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdlbXB0eScsXHJcbiAgICAgICAgICAgICAgY29sU3BhbjogMVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29sU3BhbjogOSxcclxuICAgICAgICAgICAgICBjYXB0aW9uOiAnQWNjb3VudCBEZXRhaWxzJyxcclxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0Vycm9yTWVzc2FnZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZGF0YSAmJiBkYXRhLmVkaXRvck9wdGlvbnMgJiYgZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JNZXNzYWdlICYmICQoJzxkaXYgLz4nKS50ZXh0KGVycm9yTWVzc2FnZSkuYWRkQ2xhc3MoJ2Vycm9yLW1lc3NhZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgIC8vICAgZGF0YUZpZWxkOiAnSGFzQ2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICAvLyAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgICAgICAgICAgIC8vICAgfSxcclxuICAgICAgICAgICAgICAgIC8vICAgdmlzaWJsZTogdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhPy5IYXNDaGFuZ2VzICYmICF0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEuRXJyb3JNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgLy8gICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiAkKCc8ZGl2IC8+JykudGV4dCgnQ2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWQnKS5hZGRDbGFzcygnc3VjY2Vzcy1tZXNzYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1VzZXJOYW1lJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnVXNlcm5hbWUnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ1VzZXJuYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICAgICAgY29sQ291bnQ6IDIsXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnRmlyc3ROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdGaXJzdCBOYW1lJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdGaXJzdCBOYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnTGFzdE5hbWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0xhc3QgTmFtZSdcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnTGFzdCBOYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdQaG9uZU51bWJlcicsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1Bob25lIE51bWJlcidcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdFbWFpbCcsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0VtYWlsJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdFbWFpbCBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdlbWFpbCcsIG1lc3NhZ2U6ICdQbGVhc2UgdXNlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycgfVxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGNzc0NsYXNzOiAnYWNjb3VudC1zZXR0aW5nc19fcGFzc3dvcmQtYXJlYScsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiAkKCc8ZGl2IC8+JykuY3NzKCdmb250LXdlaWdodCcsICdib2xkJykudGV4dCgnQ2hhbmdlIFBhc3N3b3JkJylcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnT2xkUGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDdXJyZW50IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlZXZhbHVhdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoISF0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LmdldEVkaXRvcignTmV3UGFzc3dvcmQnKT8ub3B0aW9uKCd2YWx1ZScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhcGFyYW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnT2xkIHBhc3N3b3JkIGlzIHJlcXVpcmVkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmV3UGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdOZXcgcGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAncGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0QXR0cjogeyBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnIH1cclxuICAgICAgICAgICAgICAgICAgfSBhcyBkeFRleHRCb3hPcHRpb25zPGR4VGV4dEJveD4sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ05ld1Bhc3N3b3JkUmVwZWF0JyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ29uZmlybSBuZXcgcGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAncGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVldmFsdWF0ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWxsYmFjazogKHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8uZ2V0RWRpdG9yKCdOZXdQYXNzd29yZCcpPy5vcHRpb24oJ3ZhbHVlJykgfHwgJycpID09PSBwYXJhbXMudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Bhc3N3b3JkIG1pc21hdGNoJyxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ2J1dHRvbicsXHJcbiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6ICdyaWdodCcsXHJcbiAgICAgICAgICAgICAgICAgIGNzc0NsYXNzOiAnYWNjb3VudC1zZXR0aW5nc19fc3VibWl0LWJ0bicsXHJcbiAgICAgICAgICAgICAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnU2F2ZSBDaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlU3VibWl0QmVoYXZpb3I6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25maXJtKHRleHQ6IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0ICRkZWZmZXJlZDogSlF1ZXJ5RGVmZXJyZWQ8Ym9vbGVhbj4gPSAkLkRlZmVycmVkKCk7XHJcbiAgICBjb25zdCAkZWxlbWVudCA9ICQoJzxkaXYvPicpLmFwcGVuZFRvKHdpbmRvdy5kb2N1bWVudC5ib2R5KTtcclxuXHJcbiAgICBjb25zdCBwb3B1cCA9ICRlbGVtZW50LmR4UG9wdXAoe1xyXG4gICAgICAgIHNob3dUaXRsZTogZmFsc2UsXHJcbiAgICAgICAgaGVpZ2h0OiAxNDAsXHJcbiAgICAgICAgd2lkdGg6IDM3MCxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6ICgkY29udGVudCkgPT4ge1xyXG4gICAgICAgICAgICAkY29udGVudC5hZGRDbGFzcygnaXN6b2xlYS1keC1jb25maXJtJyk7XHJcblxyXG4gICAgICAgICAgICAkKCc8Yi8+JykuYWRkQ2xhc3MoJ21lc3NhZ2UnKS50ZXh0KHRleHQpLmFwcGVuZFRvKCRjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRidXR0b25zU2VjdGlvbiA9ICQoJzxkaXYvPicpLmFkZENsYXNzKCdidXR0b25zJykuYXBwZW5kVG8oJGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgJCgnPGRpdi8+JykuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGFuZ2VyJyxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwb3B1cC5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICRkZWZmZXJlZC5yZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9uc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgJCgnPGRpdi8+JykuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zU2VjdGlvbik7XHJcbiAgICAgICAgfSxcclxuICAgICAgb25IaWRkZW46ICgpID0+IHtcclxuICAgICAgICBwb3B1cC5kaXNwb3NlKCk7XHJcbiAgICAgICAgcG9wdXAuZWxlbWVudCgpLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHBvcHVwLnNob3coKTtcclxuXHJcbiAgICByZXR1cm4gJGRlZmZlcmVkO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vQ29uZmlnL0luZGV4JztcclxuaW1wb3J0IHsgSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzIH0gZnJvbSAnLi4vRGF0YS9JQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBzaG93IGFzIHNob3dJbWFnZVZpZXdlciB9IGZyb20gJy4uL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5kaW5nKCRjb250YWluZXI6IEpRdWVyeSwgbG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nLCBzaG93U2lnbkluQnV0dG9uOiBib29sZWFuLCBwaG90b0dhbGxlcnlTZXR0aW5nczogSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzID0geyBlbmFibGVkOiBmYWxzZSB9KSB7XHJcbiAgZ2V0TG9nb1NldHRpbmdzKGxvZ29TZXR0aW5ncykudGhlbigoc2V0dGluZ3MpID0+IHtcclxuICAgIGNyZWF0ZUxhbmRpbmdNYXJrdXAoJGNvbnRhaW5lciwgc2V0dGluZ3MsIHNob3dTaWduSW5CdXR0b24sIHBob3RvR2FsbGVyeVNldHRpbmdzKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TG9nb1NldHRpbmdzKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPElMb2dvU2V0dGluZ3M+IHtcclxuICBjb25zdCAkZGVmZmVyZWQ6IEpRdWVyeURlZmVycmVkPElMb2dvU2V0dGluZ3M+ID0gJC5EZWZlcnJlZCgpO1xyXG5cclxuICBpZiAodHlwZW9mIGxvZ29TZXR0aW5ncyA9PT0gJ3N0cmluZycpIHtcclxuICAgIGNvbnN0IGNhY2hlZFNldHRpbmdzUmF3ID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgICRkZWZmZXJlZC5yZXNvbHZlKEpTT04ucGFyc2UoY2FjaGVkU2V0dGluZ3NSYXcpIGFzIElMb2dvU2V0dGluZ3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VuZFJlcXVlc3QobG9nb1NldHRpbmdzLCAncG9zdCcpLmRvbmUoKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICAgICAgICBhcHBsaWNhdGlvbk5hbWU6IGRhdGEuQXBwbGljYXRpb25OYW1lLFxyXG4gICAgICAgICAgYnVzaW5lc3NOYW1lOiBkYXRhLkJ1c2luZXNzTmFtZSxcclxuICAgICAgICAgIGxhbmRpbmdQYWdlTG9nbzogZGF0YS5MYW5kaW5nUGFnZUxvZ28sXHJcbiAgICAgICAgICBsb2dvSW1hZ2U6IGRhdGEuTG9nb0ltYWdlLFxyXG4gICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEuRGVzY3JpcHRpb25cclxuICAgICAgICB9IGFzIElMb2dvU2V0dGluZ3M7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xyXG4gICAgICAgICRkZWZmZXJlZC5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAkZGVmZmVyZWQucmVzb2x2ZShsb2dvU2V0dGluZ3MpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICRkZWZmZXJlZDtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTGFuZGluZ01hcmt1cCgkY29udGFpbmVyOiBKUXVlcnksIGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncywgc2hvd1NpZ25JbkJ1dHRvbjogYm9vbGVhbiwgcGhvdG9HYWxsZXJ5U2V0dGluZ3M6IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncykge1xyXG4gIGNvbnN0ICRsYW5kaW5nUGFnZSA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXN6b2xlYS1sYW5kaW5nLXBhZ2UnKS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICBsZXQgJGxhbmRpbmdDb250YWluZXIgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2xhbmRpbmctY29udGFpbmVyJykuYXBwZW5kVG8oJGxhbmRpbmdQYWdlKTtcclxuXHJcbiAgaWYocGhvdG9HYWxsZXJ5U2V0dGluZ3MuZW5hYmxlZCkge1xyXG4gICAgJGxhbmRpbmdQYWdlLmFkZENsYXNzKCdwaG90by1nYWxsZXJ5LW1vZGUnKTtcclxuICB9IGVsc2Uge1xyXG4gICAgJGxhbmRpbmdQYWdlLmFkZENsYXNzKCdkZWZhdWx0LW1vZGUnKTtcclxuICAgICRsYW5kaW5nQ29udGFpbmVyID0gJGxhbmRpbmdQYWdlO1xyXG4gIH1cclxuXHJcbiAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2dvLWNvbnRhaW5lcicpXHJcbiAgICAuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8aW1nIC8+JykuYXR0cignc3JjJywgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbykuYWRkQ2xhc3MoJ2xvZ28tbGFyZ2UnKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lciksXHJcbiAgICAgICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKVxyXG4gICk7XHJcblxyXG4gICQoJzxoMiAvPicpLnRleHQoYFdlbGNvbWUgdG8gJHtsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb259YCkuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpO1xyXG5cclxuICBpZiAoc2hvd1NpZ25JbkJ1dHRvbikge1xyXG4gICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCdzaWduLWluLWJ1dHRvbicpLmFwcGVuZCgkKCc8ZGl2IC8+JykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiAnU2lnbiBJbicsXHJcbiAgICAgIHdpZHRoOiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyB1bmRlZmluZWQgOiAnMjAwcHgnLFxyXG4gICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAvSG9tZS9Mb2dpbj9yZXR1cm5Vcmw9JHtlbmNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYudG9TdHJpbmcoKSl9YDtcclxuICAgICAgfVxyXG4gICAgfSkpLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIGlmKHBob3RvR2FsbGVyeVNldHRpbmdzLmVuYWJsZWQpIHtcclxuICAgIHNob3dJbWFnZVZpZXdlcihcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MuJGNvbnRhaW5lciB8fCAkbGFuZGluZ1BhZ2UsXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLmltYWdlVXJscyB8fCBbXSxcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MuaW1nQ2hhbmdlSW50ZXJ2YWxTZWMgfHwgOCxcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MudHJhbnNpdGlvblRpbWVTZWMgfHwgMlxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBY2Nlc3NEZW5pZWRUb1JlcG9ydCgkY29udGFpbmVyOiBKUXVlcnksIGFsbG93ZWRSZXBvcnRSb2xlczogc3RyaW5nW10sIGFsbG93ZWRDb25uZWN0aW9uUm9sZXM6IHN0cmluZ1tdKSB7XHJcbiAgY29uc3QgJGlzem9sZWFDb250YWluZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdhY2Nlc3MtZGVuaWVkLXRvLXJlcG9ydC1wYWdlJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgJCgnPGgyPicpLmFkZENsYXNzKCdlcnJvci10ZXh0JykudGV4dCgnQWNjZXNzIGRlbmllZCB0byB0aGUgcmVwb3J0JykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG5cclxuICBpZiAoYWxsb3dlZFJlcG9ydFJvbGVzICYmIGFsbG93ZWRSZXBvcnRSb2xlcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IHJlcG9ydFJvbGVzID0gYWxsb3dlZFJlcG9ydFJvbGVzLm1hcCgocikgPT4gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ3JvbGUnKS50ZXh0KHIpKTtcclxuICAgICQoJzxwPicpLnRleHQoJ1JlcXVpcmVkIHJvbGVzIGZvciByZXBvcnQ6ICcpLmFwcGVuZChyZXBvcnRSb2xlcykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGFsbG93ZWRDb25uZWN0aW9uUm9sZXMgJiYgYWxsb3dlZENvbm5lY3Rpb25Sb2xlcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGNvbm5lY3Rpb25zUm9sZXMgPSBhbGxvd2VkQ29ubmVjdGlvblJvbGVzLm1hcCgocikgPT4gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ3JvbGUnKS50ZXh0KHIpKTtcclxuICAgICQoJzxwPicpLnRleHQoJ1JlcXVpcmVkIHJvbGVzIGZvciBkYiBjb25uZWN0aW9uOiAnKS5hcHBlbmQoY29ubmVjdGlvbnNSb2xlcykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSUNkbVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBDb250cm9sQ29uZmlndXJhdG9yLCBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMgfSBmcm9tICcuL0NvbnRyb2xDb25maWd1cmF0b3InO1xyXG5pbXBvcnQgeyBDb250cm9sRGlzcGxheSwgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB9IGZyb20gJy4vQ29udHJvbERpc3BsYXknO1xyXG5pbXBvcnQgeyBEaXNwbGF5TWFuYWdlciwgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vRGlzcGxheU1hbmFnZXInO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ0RNUmVwb3J0UGFnZU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXM7XHJcbiAgdXNlck5hbWU6IHN0cmluZztcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgY2RtUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDRE1SZXBvcnRQYWdlIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gU2V0dGluZ3MnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBEaXNwbGF5JztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNUT1JBR0VfTU9ERV9LRVkgPSAnQ0RNX1NUT1JBR0VfTU9ERV9LRVknO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290RWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSUNkbVJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zOiBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5TWFuYWdlck9wdGlvbnM6IElEaXNwbGF5TWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sRGlzcGxheU9wdGlvbnM6IElDb250cm9sRGlzcGxheU9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBtdWx0aVZpZXc6IERldkV4cHJlc3MudWkuZHhNdWx0aVZpZXc7XHJcbiAgcHJpdmF0ZSB0YWJQYW5lbDogRGV2RXhwcmVzcy51aS5keFRhYlBhbmVsO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXI7XHJcblxyXG4gIHByaXZhdGUgbW9kZTogTW9kZTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUNETVJlcG9ydFBhZ2VPcHRpb25zKSB7XHJcbiAgICBjb25zdCBiYXNlVXJsID0gYC8ke29wdGlvbnMuY2RtUmVwb3J0Q29udHJvbGxlclVybH0vJHtvcHRpb25zLnJlcG9ydFBhcmFtcy5SZXBvcnRJZH1gO1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMubW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG5cclxuICAgIHRoaXMuY29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMgPSB0aGlzLmdldENvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zKGJhc2VVcmwsIG9wdGlvbnMuY2RtUmVwb3J0Q29udHJvbGxlclVybCk7XHJcbiAgICB0aGlzLmRpc3BsYXlNYW5hZ2VyT3B0aW9ucyA9IHRoaXMuZ2V0RGlzcGxheU1hbmFnZXJPcHRpb25zKGJhc2VVcmwpO1xyXG4gICAgdGhpcy5jb250cm9sRGlzcGxheU9wdGlvbnMgPSB0aGlzLmdldENvbnRyb2xEaXNwbGF5T3B0aW9ucyhiYXNlVXJsLCBvcHRpb25zLnVzZXJOYW1lLCBvcHRpb25zLnJlcG9ydFBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcucmVwb3J0LWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICB0aGlzLmluaXRTd2l0Y2hNb2RlQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMubXVsdGlWaWV3Py5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnRhYlBhbmVsPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvbnRlbnQoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSBNb2RlLlZpZXdlcikge1xyXG4gICAgICB0aGlzLnJlbmRlckRpc3BsYXkoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyVGFiUGFuZWwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMoYmFzZVVybDogc3RyaW5nLCBjZG1SZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmcpOiBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJGNvbnRhaW5lcjogbnVsbCxcclxuICAgICAgaXNTdGFuZGFsb25lUGFnZTogZmFsc2UsXHJcbiAgICAgIHBhZ2VUaXRsZTogJycsXHJcbiAgICAgIGF2YWlsYWJsZVJvbGVzVXJsOiBgLyR7Y2RtUmVwb3J0Q29udHJvbGxlclVybH0vQXZhaWxhYmxlUm9sZXNgLFxyXG4gICAgICBncm91cEZpZWxkc1VybDogYCR7YmFzZVVybH0vQWxsQ29udHJvbEZpZWxkc2AsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db25maWd1cmF0b3JEYXRhYCxcclxuICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vQ29uZmlndXJhdG9yRGF0YWBcclxuICAgIH0gYXMgSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5TWFuYWdlck9wdGlvbnMoYmFzZVVybDogc3RyaW5nKTogSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkY29udGFpbmVyOiBudWxsLFxyXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcclxuICAgICAgcGFnZVRpdGxlOiAnJyxcclxuICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbnRyb2xEaXNwbGF5VXNlckFzc2lnbm1lbnRzYCxcclxuICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbERpc3BsYXlVc2VyQXNzaWdubWVudHNgXHJcbiAgICB9IGFzIElEaXNwbGF5TWFuYWdlck9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRyb2xEaXNwbGF5T3B0aW9ucyhcclxuICAgIGJhc2VVcmw6IHN0cmluZyxcclxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXHJcbiAgICByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXNcclxuICApOiBJQ29udHJvbERpc3BsYXlPcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICRjb250YWluZXI6IG51bGwsXHJcbiAgICAgIGlzU3RhbmRhbG9uZVBhZ2U6IGZhbHNlLFxyXG4gICAgICBwYWdlVGl0bGU6ICcnLFxyXG4gICAgICBleHBvcnRGaWxlTmFtZTogcmVwb3J0UGFyYW1zLk5hbWUsXHJcbiAgICAgIHVzZXJDb25maWdVcmw6IGAke2Jhc2VVcmx9L0ZpZWxkc1Blcm1pc3Npb25zYCxcclxuICAgICAgY29udHJvbExvZ3NVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xMb2dzYCxcclxuICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbnRyb2xEaXNwbGF5RGF0YWAsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5RGF0YWAsXHJcbiAgICAgIHVzZXJOYW1lLFxyXG4gICAgICBpbXBvcnRGaWxlT3B0aW9uczogcmVwb3J0UGFyYW1zLkFsbG93SW1wb3J0aW5nID8ge1xyXG4gICAgICAgIG1vZGU6IHJlcG9ydFBhcmFtcy5JbXBvcnRGaWxlTW9kZSxcclxuICAgICAgICBjcmVhdGVUYWJsZVVybDogYCR7YmFzZVVybH0vY3JlYXRlLXRhYmxlYCxcclxuICAgICAgICBhZGRSb3dzVXJsOiBgJHtiYXNlVXJsfS9hZGQtcm93c2AsXHJcbiAgICAgICAgZmlsZVVwbG9hZFVybDogYCR7YmFzZVVybH0vZ2V0LWNvbHVtbnNgLFxyXG4gICAgICAgIHByZWRlZmluZWRUYWJsZTogcmVwb3J0UGFyYW1zLkZpbGVJbXBvcnRlclRhYmxlSW5mb1xyXG4gICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xGaWx0ZXJzYCxcclxuICAgICAgICBpbnNlcnREYXRhVXJsOiBgJHtiYXNlVXJsfS9BZGRDb250cm9sRmlsdGVyYCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRmlsdGVyYCxcclxuICAgICAgICBkZWxldGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9SZW1vdmVDb250cm9sRmlsdGVyYFxyXG4gICAgICB9LFxyXG4gICAgICBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sVmlld3NgLFxyXG4gICAgICAgIGluc2VydERhdGFVcmw6IGAke2Jhc2VVcmx9L0FkZENvbnRyb2xWaWV3YCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sVmlld2AsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbFZpZXdgXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xEaXNwbGF5c2AsXHJcbiAgICAgICAgaW5zZXJ0RGF0YVVybDogYCR7YmFzZVVybH0vQWRkQ29udHJvbERpc3BsYXlgLFxyXG4gICAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5YCxcclxuICAgICAgICBkZWxldGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9SZW1vdmVDb250cm9sRGlzcGxheWBcclxuICAgICAgfSxcclxuICAgICAgcmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NgLFxyXG4gICAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzYCxcclxuICAgICAgfVxyXG4gICAgfSBhcyBJQ29udHJvbERpc3BsYXlPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3dpdGNoTW9kZUJ1dHRvbigpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgIHRleHQ6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCB0aGlzLm1vZGUpO1xyXG4gICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckRpc3BsYXkoKSB7XHJcbiAgICB0aGlzLiRyb290RWxlbWVudC5odG1sKCcnKTtcclxuICAgIGNvbnN0ICR2aWV3ID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLm11bHRpVmlldyA9ICR2aWV3LmR4TXVsdGlWaWV3KHtcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgQ29udHJvbERpc3BsYXkoeyAuLi50aGlzLmNvbnRyb2xEaXNwbGF5T3B0aW9ucywgJGNvbnRhaW5lcjogJCgnPGRpdiAvPicpIH0pO1xyXG4gICAgICAgICAgICBjb21wb25lbnQucmVuZGVyKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LiRjb250YWluZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9KS5hZGRDbGFzcygnY2RtLXJlcG9ydF9fZGlzcGx5LWdyaWQnKS5keE11bHRpVmlldygnaW5zdGFuY2UnKTtcclxuICAgIGZ1bGxTY3JlZW4odGhpcy5tdWx0aVZpZXcsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVGFiUGFuZWwoKSB7XHJcbiAgICB0aGlzLiRyb290RWxlbWVudC5odG1sKCcnKTtcclxuXHJcbiAgICBjb25zdCAkbWFpblRhYlBhbmVsID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLnRhYlBhbmVsID0gdGhpcy5jcmVhdGVUYWJQYW5lbCgkbWFpblRhYlBhbmVsKTtcclxuICAgIGZ1bGxTY3JlZW4odGhpcy50YWJQYW5lbCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVUYWJQYW5lbChlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KTogRGV2RXhwcmVzcy51aS5keFRhYlBhbmVsIHtcclxuICAgIHJldHVybiBlbGVtZW50LmR4VGFiUGFuZWwoe1xyXG4gICAgICBzd2lwZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBzaG93TmF2QnV0dG9uczogdHJ1ZSxcclxuICAgICAgZm9jdXNTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBhY3RpdmVTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBob3ZlclN0YXRlRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LnJlcGFpbnQoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aXRsZTogJ0NvbmZpZ3VyYXRvcicsXHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgQ29udHJvbENvbmZpZ3VyYXRvcih7IC4uLnRoaXMuY29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMsICRjb250YWluZXI6ICQoJzxkaXYgLz4nKSB9KTtcclxuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC4kY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdEaXNwbGF5IE1hbmFnZXInLFxyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IERpc3BsYXlNYW5hZ2VyKHsgLi4udGhpcy5kaXNwbGF5TWFuYWdlck9wdGlvbnMsICRjb250YWluZXI6ICQoJzxkaXYgLz4nKSB9KTtcclxuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC4kY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgIF1cclxuICAgIH0pLmFkZENsYXNzKCdjZG0tcmVwb3J0X19jb25maWd1cmF0aW9uLXRhYi1wYW5lbCcpXHJcbiAgICAgIC5keFRhYlBhbmVsKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gaW5pdFBvcG92ZXIobGluazogc3RyaW5nLCBkZXRhaWxzOiBzdHJpbmcpOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB7XHJcbiAgY29uc3QgaHRtbCA9ICQoJzxwLz4nKS5odG1sKGRldGFpbHMpLnRleHQoKTtcclxuXHJcbiAgY29uc3QgcG9wb3ZlciA9ICQoJzxkaXY+JywgeyBjbGFzczogJ3JlcG9ydC1kZXRhaWxzLXBvcG92ZXInIH0pXHJcbiAgICAuaHRtbChodG1sKVxyXG4gICAgLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpO1xyXG5cclxuICByZXR1cm4gJChwb3BvdmVyKS5keFBvcG92ZXIoe1xyXG4gICAgdGFyZ2V0OiBsaW5rLFxyXG4gICAgc2hvd0V2ZW50OiAnZHhjbGljaycsXHJcbiAgICBwb3NpdGlvbjogJ2JvdHRvbScsXHJcbiAgICB3aWR0aDogNTAwXHJcbiAgfSkuZHhQb3BvdmVyKCdpbnN0YW5jZScpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0Z1bGxTY3JlZW4nO1xyXG5pbXBvcnQge0NTU19DTEFTU0VTfSBmcm9tICcuLi8uLi8uLi9TdHlsaW5nL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB7XHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdERhdGFHcmlkKFxyXG4gICR0YXJnZXQsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZywgZGVmYXVsdENvbHVtbldpZHRoID0gZmFsc2VcclxuKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBsZXQgaXNHcmlkSW5pdGlhbGl6YWVkID0gZmFsc2U7XHJcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICBleHBvcnQ6IHtcclxuICAgICAgZW5hYmxlZDogISFhZGRpdGlvbmFsT3B0aW9ucy5leHBvcnRGaWxlTmFtZSxcclxuICAgICAgYWxsb3dFeHBvcnRTZWxlY3RlZERhdGE6IHRydWVcclxuICAgIH0sXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG5cclxuICAgIGNvbHVtbkF1dG9XaWR0aDogdHJ1ZSxcclxuICAgIHNob3dCb3JkZXJzOiB0cnVlLFxyXG5cclxuICAgIHNlbGVjdGlvbjoge21vZGU6ICdtdWx0aXBsZSd9LFxyXG4gICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7ZW5hYmxlZDogZmFsc2V9LFxyXG4gICAgcGFnaW5nOiB7cGFnZVNpemU6IDUwfSxcclxuICAgIHNlYXJjaFBhbmVsOiB7dmlzaWJsZTogdHJ1ZX0sXHJcbiAgICBmaWx0ZXJSb3c6IHt2aXNpYmxlOiB0cnVlfSxcclxuICAgIGhlYWRlckZpbHRlcjoge3Zpc2libGU6IHRydWV9LFxyXG4gICAgc2Nyb2xsaW5nOiB7bW9kZTogJ3ZpcnR1YWwnfSxcclxuICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICB1cGRhdGVTdW1tYXJ5Q29sdW1uSWZSZXF1aXJlZChlLmNvbXBvbmVudCk7XHJcblxyXG4gICAgICBpZiAoaXNHcmlkSW5pdGlhbGl6YWVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpc0dyaWRJbml0aWFsaXphZWQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCFkZWZhdWx0Q29sdW1uV2lkdGgpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGUuY29tcG9uZW50LmNvbHVtbkNvdW50KCk7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgZGF0YVR5cGUgPSBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oaSwgJ2RhdGFUeXBlJyk7XHJcblxyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJykpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzEwMHB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxNTBweCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL3RvIGZpeCBhdXRvc2Nyb2xsXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSBlLmNvbXBvbmVudC5nZXRTY3JvbGxhYmxlKCk7XHJcblxyXG4gICAgICAgIGlmIChzY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgICBzY3JvbGxhYmxlLnNjcm9sbFRvKHt0b3A6IDB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgaWYgKGhlYWRlclRleHQpIHtcclxuICAgICAgICBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLnVuc2hpZnQoe1xyXG4gICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgICAgdGVtcGxhdGUoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlckVsID0gJCgnPGgyIC8+JykuYWRkQ2xhc3MoJ2dyaWQtaGVhZGVyJykudGV4dChoZWFkZXJUZXh0KTtcclxuICAgICAgICAgICAgaWYgKGhlYWRlckRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgaGVhZGVyRWwuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhcycpLmFkZENsYXNzKCdmYS1pbmZvLWNpcmNsZScpLmFkZENsYXNzKCdyZXBvcnQtZGV0YWlscy1saW5rJykuYXR0cigndGl0bGUnLCAnQ2xpY2sgdG8gc2VlIGZ1cnRoZXIgZGV0YWlscycpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGhlYWRlckVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgb25Db250ZW50UmVhZHkgPSBkYXRhR3JpZE9wdGlvbnMub25Db250ZW50UmVhZHlcclxuICAgID8gKGUpID0+IHtcclxuICAgICAgZGVmYXVsdE9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgIH1cclxuICAgIDogZGVmYXVsdE9wdGlvbnMub25Db250ZW50UmVhZHk7XHJcblxyXG4gIHRyeVNldFRvdGFsU3VtbWFyeShkYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zKTtcclxuXHJcbiAgY29uc3QgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgZGF0YUdyaWRPcHRpb25zLCB7b25Db250ZW50UmVhZHl9KTtcclxuXHJcbiAgY29uc3QgZ3JpZCA9ICR0YXJnZXQuZHhEYXRhR3JpZChtZXJnZWRPcHRpb25zKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG5cclxuICBncmlkLmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyeVNldFRvdGFsU3VtbWFyeShkYXRhR3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zOiBJR3JpZEFkZGl0aW9uYWxPcHRpb25zKSB7XHJcbiAgaWYgKGRhdGFHcmlkT3B0aW9ucz8uc3VtbWFyeT8udG90YWxJdGVtcz8uc29tZSgoaSkgPT4gaS5zdW1tYXJ5VHlwZSA9PT0gJ2NvdW50JykpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uID0gYWRkaXRpb25hbE9wdGlvbnM/LnN1bW1hcnlDb2x1bW47XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uICYmIGRhdGFHcmlkT3B0aW9ucz8uY29sdW1ucz8ubGVuZ3RoKSB7XHJcbiAgICBzdW1tYXJ5Q29sdW1uID0gdHlwZW9mIGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdID09PSAnc3RyaW5nJ1xyXG4gICAgICA/IGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdXHJcbiAgICAgIDogZGF0YUdyaWRPcHRpb25zLmNvbHVtbnNbMF0uZGF0YUZpZWxkO1xyXG4gIH1cclxuXHJcbiAgaWYgKHN1bW1hcnlDb2x1bW4pIHtcclxuICAgIGlmICghZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkpIHtcclxuICAgICAgZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMpIHtcclxuICAgICAgZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkudG90YWxJdGVtcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMucHVzaCh7XHJcbiAgICAgIGNvbHVtbjogc3VtbWFyeUNvbHVtbixcclxuICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgY29uc3QgdG90YWxJdGVtcyA9IGdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXTtcclxuICBjb25zdCBjdXJyZW50U3VtbWFyeUNvbHVtbiA9IHRvdGFsSXRlbXM/LmZpbHRlcigoaSkgPT4gaS5zdW1tYXJ5VHlwZSA9PT0gJ2NvdW50JylbMF0/LmNvbHVtbjtcclxuXHJcbiAgbGV0IHN1bW1hcnlDb2x1bW5JbmRleCA9IGN1cnJlbnRTdW1tYXJ5Q29sdW1uICYmIGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kSW5kZXgoKGVsKSA9PiBlbC5kYXRhRmllbGQgPT09IGN1cnJlbnRTdW1tYXJ5Q29sdW1uKTtcclxuICBpZiAoIXN1bW1hcnlDb2x1bW5JbmRleCkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicpO1xyXG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5tb2RlICE9PSAnbm9uZSc7XHJcbiAgICBzdW1tYXJ5Q29sdW1uSW5kZXggPSBoYXNTZWxlY3Rpb24gPyBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gISFlbC5kYXRhRmllbGQpIDogMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5ld1N1bW1hcnlDb2x1bW4gPSBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkO1xyXG5cclxuICBpZiAobmV3U3VtbWFyeUNvbHVtbiAmJiBjdXJyZW50U3VtbWFyeUNvbHVtbiAhPT0gbmV3U3VtbWFyeUNvbHVtbikge1xyXG4gICAgZ3JpZC5vcHRpb24oJ3N1bW1hcnknLCB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkLFxyXG4gICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICAgIH1dXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQoXHJcbiAgJHRhcmdldCwgZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyA9IHt9LFxyXG4gIGhlYWRlclRleHQ/OiBzdHJpbmcsIGhlYWRlckRlc2NyaXB0aW9uPzogc3RyaW5nLCBkZWZhdWx0Q29sdW1uV2lkdGggPSBmYWxzZSwgc2tpcEZ1bGxTY3JlZW4gPSBmYWxzZVxyXG4pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGdyaWQgPSBjcmVhdGVEZWZhdWx0RGF0YUdyaWQoJHRhcmdldCwgZGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucywgaGVhZGVyVGV4dCwgaGVhZGVyRGVzY3JpcHRpb24sIGRlZmF1bHRDb2x1bW5XaWR0aCk7XHJcblxyXG4gIGlmICghc2tpcEZ1bGxTY3JlZW4pIHtcclxuICAgIGZ1bGxTY3JlZW4oZ3JpZCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZ3JpZDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0ZXh0LCB0aXRsZSkge1xyXG4gIHJldHVybiAkKCc8c3Bhbj4nKVxyXG4gICAgLmF0dHIoJ3RpdGxlJywgdGl0bGUpXHJcbiAgICAudGV4dCh0ZXh0KTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCwgY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQge0lMb29rdXBEdG99IGZyb20gJy4uLy4uLy4uL0RhdGEvQXBpUmVzcG9uc2UnO1xyXG5cclxuLy8gTk9URTogY29uc3QgZGVmYXVsdFNob3dlZFJvbGVzID0gWydQcm9kdWN0aW9uJywgJ1NhbGVzJywgJ0Zsb29yJ107XHJcbmNvbnN0IHJvbGVzT3JkZXIgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGVudW0gRGlzcGxheVR5cGUge1xyXG4gIEljb25zID0gMSxcclxuICBQcmVkZWZpbmVkVmFsdWVzID0gMixcclxuICBSYWJiaXRBY3Rpb24gPSAzXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUljb25zQ29sdW1uRWRpdG9ySXRlbSB7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIGltYWdlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVByZWRlZmluZWRWYWx1ZXNFZGl0b3JJdGVtIHtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhIHtcclxuICBhY3Rpb25UeXBlOiBzdHJpbmc7XHJcbiAgZmllbGRzOiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSURpc3BsYXlUeXBlU2V0dGluZ3MgPSBJRGlzcGxheUljb25zVHlwZVNldHRpbmdzIHwgSURpc3BsYXlJUHJlZGVmaW5lZFZhbHVlc1R5cGVTZXR0aW5ncyB8IElEaXNwbGF5SVJhYmJpdEFjdGlvblR5cGVTZXR0aW5ncztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlJY29uc1R5cGVTZXR0aW5ncyB7XHJcbiAgdHlwZTogRGlzcGxheVR5cGUuSWNvbnM7XHJcbiAgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SVByZWRlZmluZWRWYWx1ZXNUeXBlU2V0dGluZ3Mge1xyXG4gIHR5cGU6IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXM7XHJcbiAgZGF0YTogSVByZWRlZmluZWRWYWx1ZXNFZGl0b3JJdGVtW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlJUmFiYml0QWN0aW9uVHlwZVNldHRpbmdzIHtcclxuICB0eXBlOiBEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb247XHJcbiAgZGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckRhdGE7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwYWdlVGl0bGU6IHN0cmluZztcclxuICBhdmFpbGFibGVSb2xlc1VybDogc3RyaW5nO1xyXG4gIGdyb3VwRmllbGRzVXJsOiBzdHJpbmc7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJUmFiYml0QWN0aW9uRWRpdG9ySW5pdERhdGEge1xyXG4gIGZpZWxkczogSUxvb2t1cER0bzxzdHJpbmc+W107XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sQ29uZmlndXJhdG9yIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXZhaWxhYmxlUm9sZXNVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwRmllbGRzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlUeXBlczogYW55W10gPSBbXHJcbiAgICB7IGtleTogRGlzcGxheVR5cGUuSWNvbnMsIHZhbHVlOiAnSWNvbnMnIH0sXHJcbiAgICB7IGtleTogRGlzcGxheVR5cGUuUHJlZGVmaW5lZFZhbHVlcywgdmFsdWU6ICdQcmVkZWZpbmVkVmFsdWVzJyB9LFxyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbiwgdmFsdWU6ICdSYWJiaXRBY3Rpb24nIH1cclxuICBdO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZWRpdG9ycyA9IHtcclxuICAgIFtEaXNwbGF5VHlwZS5JY29uc106IEljb25zQ29sdW1uRWRpdG9yLFxyXG4gICAgW0Rpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXNdOiBQcmVkZWZpbmVkVmFsdWVzQ29sdW1uRWRpdG9yLFxyXG4gICAgW0Rpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbl06IFJhYmJpdEFjdGlvbkNvbHVtbkVkaXRvcixcclxuICB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZWRpdG9yc0luaXREYXRhIDoge1tpZDogbnVtYmVyXSA6IG9iamVjdDt9ID0ge307XHJcbiAgcHJpdmF0ZSByb2xlczogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIGZpZWxkczogSUxvb2t1cER0bzxzdHJpbmc+W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UgPSBvcHRpb25zLmlzU3RhbmRhbG9uZVBhZ2U7XHJcbiAgICB0aGlzLmF2YWlsYWJsZVJvbGVzVXJsID0gb3B0aW9ucy5hdmFpbGFibGVSb2xlc1VybDtcclxuICAgIHRoaXMuZ3JvdXBGaWVsZHNVcmwgPSBvcHRpb25zLmdyb3VwRmllbGRzVXJsO1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLnBhZ2VUaXRsZSA9IG9wdGlvbnMucGFnZVRpdGxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lci5hZGRDbGFzcygnYXBzLWdyaWQnKTtcclxuXHJcbiAgICBQcm9taXNlLmFsbChbXHJcbiAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlUm9sZXMoKSxcclxuICAgICAgdGhpcy5nZXRBdmFpbGFibGVGaWVsZHMoKVxyXG4gICAgXSkudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgIHRoaXMucm9sZXMgPSByZXN1bHRbMF07XHJcbiAgICAgIHRoaXMuZmllbGRzID0gcmVzdWx0WzFdO1xyXG4gICAgICB0aGlzLmVkaXRvcnNJbml0RGF0YVtEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb25dID0geyBmaWVsZHM6IHRoaXMuZmllbGRzIH07XHJcbiAgICAgIHRoaXMuY3JlYXRlTWFpbkdyaWQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRBdmFpbGFibGVSb2xlcygpIHtcclxuICAgIHJldHVybiBzZW5kUmVxdWVzdDxBcnJheTx7IE5hbWU6IHN0cmluZyB9Pj4odGhpcy5hdmFpbGFibGVSb2xlc1VybClcclxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLm1hcCgocikgPT4gci5OYW1lKS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYU9yZGVyID0gcm9sZXNPcmRlci5nZXQoYSkgfHwgOTk5OTtcclxuICAgICAgICBjb25zdCBiT3JkZXIgPSByb2xlc09yZGVyLmdldChiKSB8fCA5OTk5O1xyXG5cclxuICAgICAgICByZXR1cm4gYU9yZGVyIC0gYk9yZGVyO1xyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldEF2YWlsYWJsZUZpZWxkcygpOiBQcm9taXNlPElMb29rdXBEdG88c3RyaW5nPltdPiB7XHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3QodGhpcy5ncm91cEZpZWxkc1VybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERpc3BsYXlUeXBlRWRpdG9yKCRjb250YWluZXIsIHR5cGUsIGRhdGEpIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yc1t0eXBlXTtcclxuICAgIGNvbnN0IGluaXREYXRhID0gdGhpcy5lZGl0b3JzSW5pdERhdGFbdHlwZV07XHJcblxyXG4gICAgcmV0dXJuIGVkaXRvclxyXG4gICAgICA/IG5ldyBlZGl0b3IoJGNvbnRhaW5lciwgZGF0YSwgaW5pdERhdGEpXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWQoKSB7XHJcbiAgICBsZXQgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG5cclxuICAgIGNvbnN0IGdyaWRPcHRpb25zID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZSgpLFxyXG4gICAgICBjb2x1bW5DaG9vc2VyOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBhbGxvd1NlYXJjaDogdHJ1ZSxcclxuICAgICAgICBtb2RlOiAnc2VsZWN0J1xyXG4gICAgICB9LFxyXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIHJlZnJlc2hNb2RlOiAncmVwYWludCdcclxuICAgICAgfSxcclxuICAgICAgcmVwYWludENoYW5nZXNPbmx5OiB0cnVlLFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiB7XHJcbiAgICAgICAgc3VtbWFyeTogdHJ1ZSxcclxuICAgICAgICBwYWdpbmc6IHRydWUsXHJcbiAgICAgICAgZ3JvdXBpbmc6IGZhbHNlLFxyXG4gICAgICAgIHNvcnRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGZpbHRlcmluZzogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBpbmc6IHtcclxuICAgICAgICBhbGxvd0NvbGxhcHNpbmc6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbXVsdGlwbGUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGFsbG93Q29sdW1uUmVvcmRlcmluZzogZmFsc2UsXHJcbiAgICAgIGNvbHVtbkhpZGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1uQXV0b1dpZHRoOiBmYWxzZSxcclxuICAgICAgcm93QWx0ZXJuYXRpb25FbmFibGVkOiB0cnVlLFxyXG4gICAgICBjb2x1bW5NaW5XaWR0aDogODAsXHJcbiAgICAgIG9uUm93VXBkYXRpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFlLm5ld0RhdGEgfHwgIWUub2xkRGF0YSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZS5jb21wb25lbnQuYmVnaW5DdXN0b21Mb2FkaW5nKCdVcGRhdGluZycpO1xyXG5cclxuICAgICAgICBjb25zdCB1cGRhdGVkUm9sZXMgPSBlLm5ld0RhdGEuUm9sZXM7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFJvbGVzID0gZS5vbGREYXRhLlJvbGVzO1xyXG5cclxuICAgICAgICBjb25zdCBhZGRPbGREYXRhVG9OZXdEYXRhID0gKGZpZWxkTmFtZTogc3RyaW5nLCBuZXdEYXRhU2VjdGlvbiA9IGUubmV3RGF0YSwgb2xkRGF0YVNlY3Rpb24gPSBlLm9sZERhdGEpID0+IHtcclxuICAgICAgICAgIGlmICghbmV3RGF0YVNlY3Rpb24uaGFzT3duUHJvcGVydHkoZmllbGROYW1lKSkge1xyXG4gICAgICAgICAgICBuZXdEYXRhU2VjdGlvbltmaWVsZE5hbWVdID0gb2xkRGF0YVNlY3Rpb25bZmllbGROYW1lXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAodXBkYXRlZFJvbGVzICYmIGN1cnJlbnRSb2xlcykge1xyXG4gICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModXBkYXRlZFJvbGVzKVxyXG4gICAgICAgICAgICAuZm9yRWFjaCgocm9sZU5hbWUpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkUm9sZSA9IHVwZGF0ZWRSb2xlc1tyb2xlTmFtZV07XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFJvbGUgPSBjdXJyZW50Um9sZXNbcm9sZU5hbWVdO1xyXG5cclxuICAgICAgICAgICAgICB1cGRhdGVkUm9sZS5JZCA9IGN1cnJlbnRSb2xlLklkO1xyXG5cclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZUNyZWF0ZWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlUmVhZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVVcGRhdGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZURlbGV0ZWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0xhYmVsJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnT3JkZXInKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdUb29sVGlwJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnSXNEZWZhdWx0Vmlld0ZpZWxkJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnSXNLZXlDb2x1bW4nKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdHcm91cEZpZWxkJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnRGlzcGxheVR5cGUnKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdEYXRhT3duZXInKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdYTFNTY2hlZHVsZUxhYmVsJyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uUm93VXBkYXRlZDogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgZS5jb21wb25lbnQucmVwYWludCgpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5zOiB0aGlzLnByZXBhcmVNYWluR3JpZENvbHVtbnMoW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ05hbWUnLFxyXG4gICAgICAgICAgY2FwdGlvbjogJ0ZpZWxkJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2UsXHJcbiAgICAgICAgICBmaXhlZDogdHJ1ZSxcclxuICAgICAgICAgIGZpeGVkUG9zaXRpb246ICdsZWZ0JyxcclxuICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXHJcbiAgICAgICAgICB3aWR0aDogMTgwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnR3JvdXBGaWVsZCcsXHJcbiAgICAgICAgICBjYXB0aW9uOiAnR3JvdXAnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUsXHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZTogWy4uLm5ldyBTZXQoZ3JpZC5nZXREYXRhU291cmNlKCkuaXRlbXMoKS5maWx0ZXIoKGkpID0+IGkuR3JvdXBGaWVsZCkubWFwKChpKSA9PiBpLkdyb3VwRmllbGQpLnNvcnQoKSldLFxyXG4gICAgICAgICAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICAgICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKGUudmFsdWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdMYWJlbCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTgwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnVHlwZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnRGF0YU93bmVyJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdETycsICdEYXRhIE93bmVyJylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1hMU1NjaGVkdWxlTGFiZWwnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ1hMUycsICdYTFMgU2NoZWR1bGUgTGFiZWwnKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnRGlzcGxheVR5cGUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE2MCxcclxuICAgICAgICAgIGN1c3RvbWl6ZVRleHQ6IChjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWNlbGxJbmZvLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShjZWxsSW5mby52YWx1ZSBhcyBzdHJpbmcpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kaXNwbGF5VHlwZXNcclxuICAgICAgICAgICAgICAuZmluZCgoaXRlbSkgPT4gaXRlbS5rZXkgPT09IHNldHRpbmdzLnR5cGUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlZGl0Q2VsbFRlbXBsYXRlOiAoXywgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGNlbGxJbmZvLnZhbHVlKTtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHNldHRpbmdzID8gc2V0dGluZ3MudHlwZSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBzZXR0aW5ncyA/IHNldHRpbmdzLmRhdGEgOiBbXTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhEcm9wRG93bkJveCh7XHJcbiAgICAgICAgICAgICAgZHJvcERvd25PcHRpb25zOiB7IHdpZHRoOiA0MDAgfSxcclxuICAgICAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmRpc3BsYXlUeXBlcyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdrZXknLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiB0eXBlLFxyXG4gICAgICAgICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKGUudmFsdWUpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgY29udGVudFRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkY29udGFpdGVyID0gJCgnPGRpdiAvPicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJHNlbGVjdG9yID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKCRjb250YWl0ZXIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGJvZHkgPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luOiA4cHggMDtcIiAvPicpLmFwcGVuZFRvKCRjb250YWl0ZXIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGJ1dHRvbnMgPSAkKCc8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCIgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRzYXZlQnV0dG9uID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1yaWdodDogOHB4O1wiIC8+JykuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGNhbmNlbEJ1dHRvbiA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDtcIiAvPicpLmFwcGVuZFRvKCRidXR0b25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZWRpdG9yID0gdHlwZVxyXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuZ2V0RGlzcGxheVR5cGVFZGl0b3IoJGJvZHksIHR5cGUsIGRhdGEpXHJcbiAgICAgICAgICAgICAgICAgIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICRib2R5Lmh0bWwoJycpO1xyXG4gICAgICAgICAgICAgICAgICBlZGl0b3IucmVuZGVyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgJHNlbGVjdG9yLmR4U2VsZWN0Qm94KHtcclxuICAgICAgICAgICAgICAgICAgaXRlbXM6IHRoaXMuZGlzcGxheVR5cGVzLFxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcclxuICAgICAgICAgICAgICAgICAgdmFsdWVFeHByOiAna2V5JyxcclxuICAgICAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvciA9IHRoaXMuZ2V0RGlzcGxheVR5cGVFZGl0b3IoJGJvZHksIGUudmFsdWUsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICRib2R5Lmh0bWwoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5yZW5kZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAkc2F2ZUJ1dHRvbi5keEJ1dHRvbignaW5zdGFuY2UnKS5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAkc2F2ZUJ1dHRvbi5keEJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICAgIHRleHQ6ICdTYXZlJyxcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWVkaXRvcixcclxuICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvckRhdGEgPSBlZGl0b3IuZ2V0RGF0YSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVkaXRvckRhdGEgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICRzZWxlY3Rvci5keFNlbGVjdEJveCgnaW5zdGFuY2UnKS5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBlZGl0b3JEYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpKTtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsSW5mby5jb21wb25lbnQuY2xvc2VFZGl0Q2VsbCgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgJGNhbmNlbEJ1dHRvbi5keEJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNsb3NlRWRpdENlbGwoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICRjb250YWl0ZXIuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiAkY29udGFpdGVyO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdJc0RlZmF1bHRWaWV3RmllbGQnLFxyXG4gICAgICAgICAgY2FwdGlvbjogJ0Rpc3BsYXkgaW4gZGVmYXVsdCB2aWV3JyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdJc0tleUNvbHVtbicsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTUwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnT3JkZXInLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxyXG4gICAgICAgICAgICAgIG1pbjogMCxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAnT3JkZXIgY2FuXFwndCBiZSBuZWdhdGl2ZSdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1dpZHRoJyxcclxuICAgICAgICAgIGRhdGFUeXBlOiAnbnVtYmVyJyxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdXaWR0aCcsICdXaWR0aCAoaW4gcGl4ZWxzKScpLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxyXG4gICAgICAgICAgICAgIG1pbjogMSxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAnV2lkdGggY2FuXFwndCBiZSBsZXNzIHRoZW4gMXB4J1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSGlkaW5nT3JkZXInLFxyXG4gICAgICAgICAgZGF0YVR5cGU6ICdudW1iZXInLFxyXG4gICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ0hpZGUnLCAnSGlkaW5nIE9yZGVyJyksXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IGZvcm1hdDogJyMnIH0sXHJcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdyYW5nZScsXHJcbiAgICAgICAgICAgICAgbWluOiAxLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdIaWRpbmcgb3JkZXIgY2FuXFwndCBiZSBsZXNzIHRoZW4gMSdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHdpZHRoOiA3MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1Rvb2xUaXAnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgbWluV2lkdGg6IDE4MFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ1JvbGVzJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGFsbG93SGlkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIHNob3dJbkNvbHVtbkNob29zZXI6IHRydWUsXHJcbiAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNyZWF0ZVJvbGVzQ29sdW1ucyh0aGlzLnJvbGVzKVxyXG4gICAgICAgIH1cclxuICAgICAgXSksXHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnM7XHJcblxyXG4gICAgY29uc3QgYWRkaXRpb25hbE9wdGlvbnMgPSB7XHJcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdOYW1lJ1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1N0YW5kYWxvbmVQYWdlKSB7XHJcbiAgICAgIGdyaWQgPSBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQodGhpcy4kY29udGFpbmVyLCBncmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMsIHRoaXMucGFnZVRpdGxlLCAnJywgdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncmlkID0gY3JlYXRlRGVmYXVsdEdyaWQodGhpcy4kY29udGFpbmVyLCB7XHJcbiAgICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgICAgc3VtbWFyeUNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc3VtbWFyeUNvbHVtbixcclxuICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXHJcbiAgICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdyaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVNYWluR3JpZENvbHVtbnMoY29sdW1uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uW10pIHtcclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4uYWxsb3dIaWRpbmcgPT09IHVuZGVmaW5lZCB8fCBjb2x1bW4uYWxsb3dIaWRpbmcgPT09IG51bGwpIHtcclxuICAgICAgICBjb2x1bW4uYWxsb3dIaWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID09PSB1bmRlZmluZWQgfHwgY29sdW1uLnNob3dJbkNvbHVtbkNob29zZXIgPT09IG51bGwpIHtcclxuICAgICAgICBjb2x1bW4uc2hvd0luQ29sdW1uQ2hvb3NlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUm9sZXNDb2x1bW5zKHJvbGVzOiBzdHJpbmdbXSk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbltdIHtcclxuICAgIHJldHVybiByb2xlc1xyXG4gICAgICAubWFwKChyb2xlKSA9PiAoe1xyXG4gICAgICAgIG5hbWU6IHJvbGUsXHJcbiAgICAgICAgY2FwdGlvbjogcm9sZSxcclxuICAgICAgICBhbGxvd0hpZGluZzogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHNob3dJbkNvbHVtbkNob29zZXI6IHRydWUsXHJcbiAgICAgICAgY29sdW1uczogW1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVSb2xlc1Blcm1pc3Npb25Db2x1bW4ocm9sZSwgJ0NhbkJlUmVhZCcsIHtcclxuICAgICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ1JlYWQnLCAnUmVhZCcpXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHRoaXMuY3JlYXRlUm9sZXNQZXJtaXNzaW9uQ29sdW1uKHJvbGUsICdDYW5CZVVwZGF0ZWQnLCB7XHJcbiAgICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdFZGl0JywgJ0VkaXQnKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICBdXHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUm9sZXNQZXJtaXNzaW9uQ29sdW1uKFxyXG4gICAgcm9sZTogc3RyaW5nLCBwZXJtaXNzaW9uTmFtZTogc3RyaW5nLCBiYXNlQ29sdW1uT3B0aW9ucz86IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtblxyXG4gICk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5iYXNlQ29sdW1uT3B0aW9ucyxcclxuICAgICAgbmFtZTogYCR7cm9sZX1fJHtwZXJtaXNzaW9uTmFtZX1gLFxyXG4gICAgICBkYXRhRmllbGQ6IGBSb2xlcy4ke3JvbGV9LiR7cGVybWlzc2lvbk5hbWV9YCxcclxuICAgICAgYWxsb3dIaWRpbmc6IGZhbHNlLFxyXG4gICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiBmYWxzZSxcclxuICAgICAgYWxsb3dIZWFkZXJGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICBhbGxvd0ZpbHRlcmluZzogZmFsc2UsXHJcbiAgICAgIG1pbldpZHRoOiA2MFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ2RhdGFTb3VyY2UnXSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICBsb2FkVXJsOiB0aGlzLmxvYWREYXRhVXJsLFxyXG4gICAgICAgIHVwZGF0ZVVybDogdGhpcy51cGRhdGVEYXRhVXJsLFxyXG4gICAgICAgIGtleTogJ05hbWUnLFxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIEljb25zQ29sdW1uRWRpdG9yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10pIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9ICRjb250YWluZXI7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIGNvbnN0IG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmRhdGEsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBtb2RlOiAncm93JyxcclxuICAgICAgICBhbGxvd0FkZGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgdXNlSWNvbnM6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7IGNvbnRleHRNZW51RW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBQYW5lbDogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAndmFsdWUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAndGl0bGUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnaW1hZ2UnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlOiAoY29udGFpbmVyLCBjZWxsRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGNlbGxEYXRhLmRhdGEuaW1hZ2UgfSkpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZWRpdENlbGxUZW1wbGF0ZTogKF8sIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltZyA9IGNlbGxJbmZvLnZhbHVlIHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiIC8+Jyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRpbWcgPSAkKGA8aW1nIHNyYz1cIiR7aW1nfVwiIC8+YCk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRsaW5rID0gJCgnPGEgY2xhc3M9XCJkeC1saW5rIGR4LWljb24tdXBsb2FkXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiA4cHg7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1zaXplOiAxOHB4O1wiIC8+Jyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRmaWxlSW5wdXQgPSAkKCc8aW5wdXQgdHlwZT1cImZpbGVcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiAvPicpO1xyXG5cclxuICAgICAgICAgICAgJGxpbmsub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICRmaWxlSW5wdXQuY2xpY2soKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkZmlsZUlucHV0Lm9uKCdjaGFuZ2UnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICgoZS50YXJnZXQgYXMgYW55KS5maWxlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAkaW1nLmF0dHIoJ3NyYycsIChyZWFkZXIucmVzdWx0IGFzIHN0cmluZykpO1xyXG4gICAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZSgocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpKTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IChlLnRhcmdldCBhcyBhbnkpLmZpbGVzWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgJGltZy5hdHRyKCdzcmMnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICRpbWcuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICRsaW5rLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICAgICAgICAgICAkZmlsZUlucHV0LmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgd2lkdGg6IDEwMCxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgJ2VkaXQnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGludDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAocm93cyBhcyBhbnlbXSkuc3BsaWNlKGUucm93LnJvd0luZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCByb3dzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgJGdyaWQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZChcclxuICAgICAgJGdyaWQsXHJcbiAgICAgIHtcclxuICAgICAgICBvcHRpb25zLFxyXG4gICAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2VcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCk6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpIGFzIElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFByZWRlZmluZWRWYWx1ZXNDb2x1bW5FZGl0b3Ige1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YTogSVByZWRlZmluZWRWYWx1ZXNFZGl0b3JJdGVtW107XHJcbiAgcHJpdmF0ZSBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5kYXRhLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ3JvdycsXHJcbiAgICAgICAgYWxsb3dBZGRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIHVzZUljb25zOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBncm91cGluZzogeyBjb250ZXh0TWVudUVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZmlsdGVyUm93OiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICB3aWR0aDogMTAwLFxyXG4gICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAnZWRpdCcsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBoaW50OiAnRGVsZXRlJyxcclxuICAgICAgICAgICAgICBpY29uOiAndHJhc2gnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dzID0gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpO1xyXG5cclxuICAgICAgICAgICAgICAgIChyb3dzIGFzIGFueVtdKS5zcGxpY2UoZS5yb3cucm93SW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHJvd3MpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCAkZ3JpZCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKCRncmlkLCB7XHJcbiAgICAgIG9wdGlvbnMsXHJcbiAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2VcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGEoKTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdIHtcclxuICAgIHJldHVybiB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJykgYXMgSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgUmFiYml0QWN0aW9uQ29sdW1uRWRpdG9yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5pdERhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JJbml0RGF0YTtcclxuICBwcml2YXRlIGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtO1xyXG5cclxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhLCBpbml0RGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgIHRoaXMuaW5pdERhdGEgPSBpbml0RGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLmZvcm0gPSAkKCc8ZGl2IC8+JykuZHhGb3JtKHtcclxuICAgICAgZm9ybURhdGE6IHRoaXMuZGF0YSxcclxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnYWN0aW9uVHlwZScsXHJcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCdcclxuICAgICAgICAgIH1dXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdmaWVsZHMnLFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIChlLnZhbHVlIGFzIGFueSkubGVuZ3RoID4gMDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbWVzc2FnZTogJ1JlcXVpcmVkJ1xyXG4gICAgICAgICAgfV0sXHJcbiAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhUYWdCb3gnLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmluaXREYXRhLmZpZWxkcyxcclxuICAgICAgICAgICAgZGlzcGxheUV4cHI6ICdUZXh0JyxcclxuICAgICAgICAgICAgdmFsdWVFeHByOiAnVmFsdWUnLFxyXG4gICAgICAgICAgICBzZWFyY2hFbmFibGVkOiB0cnVlXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUYWdCb3hPcHRpb25zXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9KS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpLmR4Rm9ybSgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCk6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLmZvcm0udmFsaWRhdGUoKTtcclxuXHJcbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWN0aW9uVHlwZSA9IHRoaXMuZm9ybS5nZXRFZGl0b3IoJ2FjdGlvblR5cGUnKS5vcHRpb24oJ3ZhbHVlJykgYXMgc3RyaW5nO1xyXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5mb3JtLmdldEVkaXRvcignZmllbGRzJykub3B0aW9uKCd2YWx1ZScpIGFzIHN0cmluZ1tdO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFjdGlvblR5cGUsXHJcbiAgICAgIGZpZWxkc1xyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbihEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgYXMgYW55KS5yZWdpc3Rlck1vZHVsZSgnY29sdW1uQ2hvb3NlclNvcnRpbmcnLCB7XHJcbiAgZXh0ZW5kZXJzOiB7XHJcbiAgICBjb250cm9sbGVyczoge1xyXG4gICAgICBjb2x1bW5zOiB7XHJcbiAgICAgICAgZ2V0Q2hvb3NlckNvbHVtbnMobG9hZEFsbENvbHVtbnMpIHtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9ICh0aGlzIGFzIGFueSkuY2FsbEJhc2UobG9hZEFsbENvbHVtbnMpO1xyXG5cclxuICAgICAgICAgIHJldHVybiByZXN1bHQuc29ydCgoY29sdW1uMSwgY29sdW1uMikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uMSA9IGNvbHVtbjE/LmNhcHRpb24gfHwgJyc7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24yID0gY29sdW1uMj8uY2FwdGlvbiB8fCAnJztcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjYXB0aW9uMS5sb2NhbGVDb21wYXJlKGNhcHRpb24yKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbiIsICJcdUZFRkZjb25zdCBhcmVBcmd1bWVudHNTaGFsbG93bHlFcXVhbCA9IChwcmV2OiBhbnlbXSB8IG51bGwsIG5leHQ6IGFueVtdIHwgbnVsbCkgPT4ge1xyXG4gIGlmIChwcmV2ID09PSBudWxsIHx8IG5leHQgPT09IG51bGwgfHwgcHJldi5sZW5ndGggIT09IG5leHQubGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYubGVuZ3RoOyBpKyspIHtcclxuICAgIGlmIChwcmV2W2ldICE9PSBuZXh0W2ldKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IG1lbW9pemUgPSA8VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55PihmdW5jOiBUKTogVCA9PiB7XHJcbiAgbGV0IGxhc3RBcmdzOiBhbnlbXSB8IG51bGwgPSBudWxsO1xyXG4gIGxldCBsYXN0UmVzdWx0OiB1bmtub3duIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogb25seS1hcnJvdy1mdW5jdGlvbnNcclxuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgaWYgKCFhcmVBcmd1bWVudHNTaGFsbG93bHlFcXVhbChsYXN0QXJncywgYXJncykpIHtcclxuICAgICAgbGFzdFJlc3VsdCA9IGZ1bmMoLi4uYXJncyBhcyBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxhc3RBcmdzID0gYXJncztcclxuXHJcbiAgICByZXR1cm4gbGFzdFJlc3VsdDtcclxuICB9IGFzIFQ7XHJcbn07XHJcbiIsICJcdUZFRkYvLyB0c2xpbnQ6ZGlzYWJsZTogbWVtYmVyLW9yZGVyaW5nXHJcbmltcG9ydCB7IElHcmlkU3RhdGUgfSBmcm9tICcuL0dyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL01lbW9pemUnO1xyXG5pbXBvcnQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24gZnJvbSAnLi4vLi4vLi4vRGF0YS9Mb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVZpZXcge1xyXG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGdyaWRTdGF0ZTogSUdyaWRTdGF0ZSB8IG51bGw7XHJcbiAgaXNHbG9iYWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlWaWV3RHRvIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIE5hbWU6IHN0cmluZztcclxuICBHcmlkU3RhdGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbiAgSXNHbG9iYWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zIHtcclxuICAvLyByZWFkb25seSBkZWZhdWx0T3BlbmVkVmlld0lkOiBudW1iZXI7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxudHlwZSBDb250cm9sRGlzcGxheVZpZXdVcGRhdGVzID0gUGFydGlhbDxQaWNrPElDb250cm9sRGlzcGxheVZpZXcsICduYW1lJyB8ICdncmlkU3RhdGUnIHwgJ2lzR2xvYmFsJz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRWaWV3c01hbmFnZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdENvbnRyb2xEaXNwbGF5VmlldzogSUNvbnRyb2xEaXNwbGF5VmlldyA9IHtcclxuICAgIGlkOiAwLFxyXG4gICAgbmFtZTogJ0RlZmF1bHQnLFxyXG4gICAgZ3JpZFN0YXRlOiBudWxsLFxyXG4gICAgaXNHbG9iYWw6IGZhbHNlXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdFZpZXdzID0gW0dyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlld107XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2N1cnJlbnRWaWV3SWQ6IG51bWJlciA9IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuICBwcml2YXRlIHZpZXdzOiBJQ29udHJvbERpc3BsYXlWaWV3W10gPSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRWaWV3cztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0Vmlld0J5SWRJbnRlcm5hbCA9ICh2aWV3SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmlld3MgJiYgdGhpcy52aWV3cy5maW5kKCh2KSA9PiB2LmlkID09PSB2aWV3SWQpO1xyXG4gIH1cclxuICBwcml2YXRlIGdldFZpZXdCeUlkID0gbWVtb2l6ZSh0aGlzLmdldFZpZXdCeUlkSW50ZXJuYWwpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy5pbnNlcnREYXRhVXJsID0gb3B0aW9ucy5pbnNlcnREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5kZWxldGVEYXRhVXJsID0gb3B0aW9ucy5kZWxldGVEYXRhVXJsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50VmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLmdldFZpZXdCeUlkKHRoaXMuX2N1cnJlbnRWaWV3SWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50Vmlld0lkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWaWV3SWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRWaWV3SWQoaWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY3VycmVudFZpZXdJZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFZpZXdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5Vmlld1tdPiB7XHJcbiAgICBpZiAodGhpcy52aWV3cyA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Vmlld3MpIHtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkVmlld3MoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy52aWV3cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVDdXJyZW50Vmlldyh2aWV3VXBkYXRlczogQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcykge1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlVmlldyh0aGlzLmN1cnJlbnRWaWV3LmlkLCB2aWV3VXBkYXRlcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmV3Vmlldyh2aWV3TmFtZTogc3RyaW5nLCBncmlkU3RhdGU6IElHcmlkU3RhdGUsIGlzR2xvYmFsKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlWaWV3PiB7XHJcbiAgICBsZXQgbmV3Vmlld0R0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byA9IHRoaXMubWFwVmlld01vZGVsVG9EdG8oe1xyXG4gICAgICBpZDogLTEsXHJcbiAgICAgIG5hbWU6IHZpZXdOYW1lLFxyXG4gICAgICBncmlkU3RhdGUsXHJcbiAgICAgIGlzR2xvYmFsXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXdWaWV3RHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5Vmlld0R0bz4odGhpcy5pbnNlcnREYXRhVXJsLCAnUE9TVCcsIG5ld1ZpZXdEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld3MoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYXBWaWV3RHRvVG9Nb2RlbChuZXdWaWV3RHRvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWaWV3KHZpZXdJZDogbnVtYmVyLCB1cGRhdGVzOiBDb250cm9sRGlzcGxheVZpZXdVcGRhdGVzKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXdCeUlkKHZpZXdJZCk7XHJcbiAgICBpZiAoIXZpZXcpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRWaWV3OiBJQ29udHJvbERpc3BsYXlWaWV3ID0ge1xyXG4gICAgICAuLi52aWV3LFxyXG4gICAgICAuLi51cGRhdGVzXHJcbiAgICB9O1xyXG4gICAgbGV0IHVwZGF0ZWRWaWV3RHRvOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvID0gdGhpcy5tYXBWaWV3TW9kZWxUb0R0byh1cGRhdGVkVmlldyk7XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIHVwZGF0ZWRWaWV3RHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5Vmlld0R0bz4odGhpcy51cGRhdGVEYXRhVXJsLCAnUFVUJywgdXBkYXRlZFZpZXdEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld3MoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGVWaWV3KHZpZXdJZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXdCeUlkKHZpZXdJZCk7XHJcbiAgICBpZiAoIXZpZXcpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGVsZXRlRGF0YVVybCwgJ0RFTEVURScsIHsgdmlld0lkIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld3MoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZFZpZXdzKCkge1xyXG4gICAgY29uc3Qgdmlld3MgPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlWaWV3RHRvW10+KHRoaXMubG9hZERhdGFVcmwpO1xyXG5cclxuICAgIHRoaXMudmlld3MgPSB2aWV3cy5tYXAoKGR0bykgPT4gdGhpcy5tYXBWaWV3RHRvVG9Nb2RlbChkdG8pKTtcclxuICAgIHRoaXMudmlld3MudW5zaGlmdChHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcpO1xyXG4gICAgLy8gTk9URTogcmVzZXQgbWVtb2l6ZVxyXG4gICAgdGhpcy5yZXNldENhY2hlZFJlc3VsdE9mR2V0Vmlld0J5SWRGdW5jdGlvbigpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnZpZXdzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBWaWV3TW9kZWxUb0R0byhtb2RlbDogSUNvbnRyb2xEaXNwbGF5Vmlldyk6IElDb250cm9sRGlzcGxheVZpZXdEdG8ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgSWQ6IG1vZGVsLmlkLFxyXG4gICAgICBOYW1lOiBtb2RlbC5uYW1lLFxyXG4gICAgICBHcmlkU3RhdGU6IEpTT04uc3RyaW5naWZ5KG1vZGVsLmdyaWRTdGF0ZSksXHJcbiAgICAgIElzR2xvYmFsOiBtb2RlbC5pc0dsb2JhbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwVmlld0R0b1RvTW9kZWwoZHRvOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvKTogSUNvbnRyb2xEaXNwbGF5VmlldyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogZHRvLklkLFxyXG4gICAgICBuYW1lOiBkdG8uTmFtZSxcclxuICAgICAgZ3JpZFN0YXRlOiBKU09OLnBhcnNlKGR0by5HcmlkU3RhdGUpLFxyXG4gICAgICBpc0dsb2JhbDogZHRvLklzR2xvYmFsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENhY2hlZFJlc3VsdE9mR2V0Vmlld0J5SWRGdW5jdGlvbigpIHtcclxuICAgIHRoaXMuZ2V0Vmlld0J5SWQgPSBtZW1vaXplKHRoaXMuZ2V0Vmlld0J5SWRJbnRlcm5hbCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi9HcmlkU3RhdGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT25lVGltZUdyaWRTdGF0ZU1hbmFnZXJPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZTogSUdyaWRTdGF0ZSB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlciB7XHJcbiAgcHVibGljIGN1cnJlbnRTYXZlZEdyaWRTdGF0ZTogSUdyaWRTdGF0ZTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJT25lVGltZUdyaWRTdGF0ZU1hbmFnZXJPcHRpb25zO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJT25lVGltZUdyaWRTdGF0ZU1hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUgPSBvcHRpb25zLmluaXRpYWxTdGF0ZTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMub3duZXIub3B0aW9uKCdzdGF0ZVN0b3JpbmcnLCB7XHJcbiAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICBjdXN0b21Mb2FkOiAoKSA9PiBQcm9taXNlLnJlc29sdmUodGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUpXHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ3N0YXRlU3RvcmluZyddKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGFzQ2hhbmdlcygpIHtcclxuICAgIC8vIFRPRE86IHVzZSBkZWVwIGVxdWFsXHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUgIT09IG51bGwgJiYgSlNPTi5zdHJpbmdpZnkodGhpcy5jdXJyZW50VW5zYXZlZEdyaWRTdGF0ZSkgIT09IEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICB0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRVbnNhdmVkR3JpZFN0YXRlKCk6IElHcmlkU3RhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZVVuc2F2ZWRHcmlkU3RhdGUodGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5KGdyaWRTdGF0ZTogSUdyaWRTdGF0ZSB8IG51bGwsIHJlc2V0RmlsdGVyID0gdHJ1ZSkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgY3VycmVudEZpbHRlciA9IHJlc2V0RmlsdGVyID8gdW5kZWZpbmVkIDogdGhpcy5vcHRpb25zLm93bmVyLmZpbHRlcigpO1xyXG5cclxuICAgICAgLyogTk9URTogU29tZXRpbWVzIGEgZ3JpZCBjYW4gcmV0dXJuIGEgbmV3IHN0YXRlIHdpdGggb2xkIGZpbHRlclZhbHVlLFxyXG4gICAgICAgIHNvIHdlIHNob3VsZCByZXNldCB0aGUgZmlsdGVyVmFsdWUgYmVmb3JlIHN0YXRlIGFwcGx5aW5nXHJcbiAgICAgICAgaWYgdGhpcyBidWcgd2lsbCBiZSBmaXhlZCBvbiB0aGUgRGV2RXh0cmVtZSBzaWRlIHdlIGNhbiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lXHJcbiAgICAgICovXHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5iZWdpblVwZGF0ZSgpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuY2xlYXJGaWx0ZXIoJ2ZpbHRlclZhbHVlJyk7XHJcblxyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuc3RhdGUoZ3JpZFN0YXRlKTtcclxuXHJcbiAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5vcHRpb25zLm93bmVyLmdldFZpc2libGVDb2x1bW5zKCkuZmlsdGVyKChjKSA9PiAhYy50eXBlKTtcclxuXHJcbiAgICAgIGlmICh2aXNpYmxlQ29sdW1uc1swXSAmJiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMub3duZXIub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICAgICAgdG90YWxJdGVtczogW3tcclxuICAgICAgICAgICAgY29sdW1uOiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQsXHJcbiAgICAgICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjdXJyZW50RmlsdGVyICYmIHRoaXMub3B0aW9ucy5vd25lci5maWx0ZXIoY3VycmVudEZpbHRlcik7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5lbmRVcGRhdGUoKTtcclxuXHJcbiAgICAgIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2ZSgpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB0aGlzLm9wdGlvbnMub3duZXIub2ZmKCdjb250ZW50UmVhZHknLCBvbkNvbnRlbnRSZWFkeSk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIub24oJ2NvbnRlbnRSZWFkeScsIG9uQ29udGVudFJlYWR5KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSA9IHRoaXMuY3VycmVudFVuc2F2ZWRHcmlkU3RhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMub3duZXIuc3RhdGUodGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlVW5zYXZlZEdyaWRTdGF0ZSh1bnNhdmVkR3JpZFN0YXRlOiBJR3JpZFN0YXRlKTogSUdyaWRTdGF0ZSB7XHJcbiAgICBpZiAodW5zYXZlZEdyaWRTdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdW5zYXZlZEdyaWRTdGF0ZS5jb2x1bW5zXHJcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKTtcclxuICAgICAgY29uc3QgbGFzdENvbHVtbiA9IHZpc2libGVDb2x1bW5zW3Zpc2libGVDb2x1bW5zLmxlbmd0aCAtIDFdO1xyXG4gICAgICBsYXN0Q29sdW1uLndpZHRoID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bnNhdmVkR3JpZFN0YXRlO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciwgSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIgfSBmcm9tICcuL0dyaWRTdGF0ZU1hbmFnZXInO1xyXG5pbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgY3JlYXRlRGlhbG9nIH0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9Qb3B1cCc7XHJcbmltcG9ydCBub3RpZnkgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkU3RhdGVNYW5hZ2VyOiBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlcjtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgb25WaWV3QXBwbGllZD86ICh2aWV3SWQ6IG51bWJlcikgPT4gdm9pZDtcclxuICByZWFkb25seSBvblZpZXdEZWxldGVkPzogKHZpZXdJZDogbnVtYmVyKSA9PiB2b2lkO1xyXG4gIHJlYWRvbmx5IGNhbkNyZWF0ZUdsb2JhbFZpZXdzOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IHZpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zIHtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXJPcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlTWFuYWdlcjogT25lVGltZUdyaWRTdGF0ZU1hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucyA9XHJcbiAgTXV0YWJsZTxPbWl0PElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucywga2V5b2YgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnM7XHJcbiAgLy8gdG9vbGJhciBpdGVtc1xyXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF92aWV3c1Rvb2xiYXJJdGVtOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgLy8gdHNsaW50OmVuYWJsZSB2YXJpYWJsZS1uYW1lXHJcblxyXG4gIC8vIHRvb2xiYXIgd2lkZ2V0c1xyXG4gIHByaXZhdGUgdmlld3NEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHZpZXdzRGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGN1cnJlbnRWaWV3VGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZVZpZXdCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzYXZlVmlld0FzQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY29sdW1uQ2hvb3NlckJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgZ3JpZFN0YXRlTWFuYWdlcjogb3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyID8gb3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyIDogbmV3IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyKHtcclxuICAgICAgICBvd25lcjogb3B0aW9ucy5vd25lcixcclxuICAgICAgICBpbml0aWFsU3RhdGU6IG51bGxcclxuICAgICAgfSksXHJcbiAgICAgIGdyaWRWaWV3c01hbmFnZXI6IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlciA/IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlciA6IG5ldyBHcmlkVmlld3NNYW5hZ2VyKG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnMpLFxyXG4gICAgICBhdXRvSW50ZWdyYXRpb246IChvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSBudWxsKVxyXG4gICAgICAgID8gb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gJiYgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB0cnlBcHBseVZpZXcodmlld0lkOiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGlzQ2FuQmVWaWV3QXBwbGllZCA9IGF3YWl0IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKCk7XHJcblxyXG4gICAgaWYgKGlzQ2FuQmVWaWV3QXBwbGllZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmFwcGx5Vmlldyh2aWV3SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc0NhbkJlVmlld0FwcGxpZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYXBwbHlWaWV3KHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmJlZ2luVmlld0FwcGx5aW5nTG9hZGluZygpO1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgPSB2aWV3SWQ7XHJcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5hcHBseSh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlldy5ncmlkU3RhdGUsIGZhbHNlKTtcclxuXHJcbiAgICB0aGlzLmVuZFZpZXdBcHBseWluZ0xvYWRpbmcoKTtcclxuICAgIHRoaXMuc3luY1VJV2l0aEN1cnJlbnRWaWV3KCk7XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLm9uVmlld0FwcGxpZWQgJiYgdGhpcy5vcHRpb25zLm9uVmlld0FwcGxpZWQodmlld0lkKTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludGVncmF0ZVRvR3JpZChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nID0gZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycpO1xyXG5cclxuICAgIGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nICYmIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgICB0aGlzLm9uR3JpZFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25HcmlkVG9vbGJhclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25Ub29sYmFyUHJlcGFyaW5nJ10gPSAoZSkgPT4ge1xyXG4gICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucyAmJiBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG4gICAgaWYgKCF0b29sYmFySXRlbXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVtb3ZlRGVmYXVsdENvbHVtbkNob29zZXJCdXR0b24odG9vbGJhckl0ZW1zKTtcclxuXHJcbiAgICB0b29sYmFySXRlbXMuc3BsaWNlKDEsIDAsXHJcbiAgICAgIHRoaXMudmlld3NUb29sYmFySXRlbSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZURlZmF1bHRDb2x1bW5DaG9vc2VyQnV0dG9uKHRvb2xiYXJJdGVtczogQXJyYXk8eyBuYW1lPzogc3RyaW5nIH0+KSB7XHJcbiAgICB0b29sYmFySXRlbXMuc3BsaWNlKHRvb2xiYXJJdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ2NvbHVtbkNob29zZXJCdXR0b24nKSwgMSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCB2aWV3c1Rvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl92aWV3c1Rvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX3ZpZXdzVG9vbGJhckl0ZW0gPSB0aGlzLmNyZWF0ZVZpZXdzVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdmlld3NUb29sYmFySXRlbTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzRGVmYXVsdFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaGFzQ2hhbmdlcygpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXc7XHJcbiAgICBpZiAoIXRoaXMuY3VycmVudFZpZXdUaXRsZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3ZhbHVlJykgIT09IGN1cnJlbnRWaWV3Lm5hbWUgfHwgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuaGFzQ2hhbmdlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVmlld3NUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xyXG4gICAgbGV0IGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkZ2V0OiAnZHhEcm9wRG93bkJveCcgYXMgYW55LFxyXG4gICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgdGV4dDogJ1ZpZXdzJyxcclxuICAgICAgdmlzaWJsZTogdGhpcy5vcHRpb25zLnZpc2libGUsXHJcbiAgICAgIGNzc0NsYXNzOiAnYXBzLXZpZXdzX190b29sYmFyLWl0ZW0nLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfSxcclxuICAgICAgICBpdGVtczogW0dyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlld10sXHJcbiAgICAgICAgdmFsdWU6IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCxcclxuICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJyxcclxuICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgIGRyb3BEb3duT3B0aW9uczoge1xyXG4gICAgICAgICAgd2lkdGg6IDU1MFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMudmlld3NEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgICAgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS52YWx1ZSA9PT0gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCB8fCAhaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaXNWaWV3QXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlWaWV3KGUudmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGlzVmlld0FwcGxpZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zeW5jVUlXaXRoQ3VycmVudFZpZXcodHJ1ZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnZpZXdzRGF0YUdyaWQgPSB0aGlzLmNyZWF0ZVZpZXdzRGF0YUdyaWQoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlID0gdGhpcy5jcmVhdGVDdXJyZW50Vmlld1RpdGxlKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gPSB0aGlzLmNyZWF0ZVNhdmVWaWV3QnV0dG9uKCk7XHJcbiAgICAgICAgICB0aGlzLnNhdmVWaWV3QXNCdXR0b24gPSB0aGlzLmNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTtcclxuICAgICAgICAgIHRoaXMuY29sdW1uQ2hvb3NlckJ1dHRvbiA9IHRoaXMuY3JlYXRlQ29sdW1uQ2hvb3NlckJ1dHRvbigpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudEhlYWRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19faGVhZGVyJylcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLmN1cnJlbnRWaWV3VGl0bGUuZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZVZpZXdCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5lbGVtZW50KCkpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5jb2x1bW5DaG9vc2VyQnV0dG9uLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50ID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgIC5oZWlnaHQoJzEwMCUnKVxyXG4gICAgICAgICAgICAuYXBwZW5kKGRyb3Bkb3duQ29udGVudEhlYWRlcilcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnZpZXdzRGF0YUdyaWQuZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVmlld3NEYXRhR3JpZChkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogZHJvcGRvd25Cb3hPd25lci5nZXREYXRhU291cmNlKCksXHJcbiAgICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgICAgYWxsb3dBZGRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgICAgICB1c2VJY29uczogdHJ1ZSxcclxuICAgICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1EZWxldGVNZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHZpZXc/J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGxvYWRQYW5lbDoge1xyXG4gICAgICAgICAgc2hhZGluZzogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29sdW1uczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNHbG9iYWwnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnSXMgR2xvYmFsJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDcwXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGVsZXRlJyxcclxuICAgICAgICAgICAgICAgIHZpc2libGU6IChlKSA9PiBlLnJvdyAmJiBlLnJvdy5rZXkgIT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7XHJcbiAgICAgICAgICBlZGl0T25LZXlQcmVzczogZmFsc2UsXHJcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NvbHVtbkhlYWRlcnM6IHRydWUsXHJcbiAgICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dCb3JkZXJzOiBmYWxzZSxcclxuICAgICAgICBzaG93Q29sdW1uTGluZXM6IGZhbHNlLFxyXG4gICAgICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnc2luZ2xlJyB9LFxyXG4gICAgICAgIGhlaWdodDogJ2NhbGMoMTAwJSAtIDUxcHgpJyxcclxuICAgICAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3N0YW5kYXJkJyB9LFxyXG4gICAgICAgIHBhZ2luZzogeyBlbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICAgIG5vRGF0YVRleHQ6ICdObyB2aWV3cycsXHJcbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5zZWxlY3RlZFJvd0tleXMgJiYgZS5zZWxlY3RlZFJvd0tleXMubGVuZ3RoID8gZS5zZWxlY3RlZFJvd0tleXNbMF0gOiAwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuZGF0YUZpZWxkID09PSAnaXNHbG9iYWwnKSB7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5kaXNhYmxlZCA9ICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3M7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy52aXNpYmxlID0gZS5yb3cuZGF0YS5pZCAhPT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb25WYWx1ZUNoYW5nZWQgPSBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IGFzeW5jIChvcHQpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIudXBkYXRlVmlldyhlLnJvdy5kYXRhLmlkLCB7IGlzR2xvYmFsOiBvcHQudmFsdWUgfSk7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG5cclxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZChvcHQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25DZWxsUHJlcGFyZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5jb2x1bW4udHlwZSAhPT0gJ2J1dHRvbnMnIHx8ICFlLmRhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSAhZS5kYXRhLmlzR2xvYmFsXHJcbiAgICAgICAgICAgIHx8IChlLmRhdGEuaXNHbG9iYWwgJiYgdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWVuYWJsZWQpIHtcclxuICAgICAgICAgICAgQXJyYXkuZnJvbShlLmNlbGxFbGVtZW50LmNoaWxkcmVuKCkpLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgICAgICAkKGMpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBjb2xvcjogJyNkZGQgIWltcG9ydGFudCcsXHJcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0J1xyXG4gICAgICAgICAgICAgIH0pLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1JlbW92aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kZWxldGVWaWV3KGUua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDdXJyZW50Vmlld1RpdGxlKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX2N1cnJlbnQtdmlldyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgdmFsdWU6IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd0ZXh0JykgfHwgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3BsYWNlaG9sZGVyJyksXHJcbiAgICAgICAgcmVhZE9ubHk6IHRoaXMuaXNEZWZhdWx0Vmlld1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX3NhdmUtdmlldyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEZWZhdWx0VmlldyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLnNhdmUuYmluZCh0aGlzKSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDg3XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX3NhdmUtdmlldy1hcyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZSBBcycsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5jcmVhdGVTYXZlQXNEaWFsb2cuYmluZCh0aGlzKSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDExOFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNvbHVtbkNob29zZXJCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19jb2x1bW4tY2hvb3NlciBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLm9wZW5Db2x1bW5DaG9vc2VyLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ2NvbHVtbi1jaG9vc2VyJ1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVBc0RpYWxvZygpIHtcclxuICAgIGNvbnN0ICRwb3B1cENvbnRlbnQgPSAkKCc8ZGl2IC8+Jyk7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nQ29udGVudEVsZW1lbnQgPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCIgLz4nKS5keFRleHRCb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1ZpZXcgTmFtZScsXHJcbiAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgIH0pLmR4VmFsaWRhdG9yKHtcclxuICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnIH0sXHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG4gICAgY29uc3Qgdmlld05hbWVUZXh0Qm94ID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gICAgY29uc3Qgdmlld05hbWVUZXh0Qm94VmFsaWRhdG9yID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhWYWxpZGF0b3IoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdmlld05hbWVUZXh0Qm94LmVsZW1lbnQoKS5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcclxuXHJcbiAgICBjb25zdCB2aWV3SXNHbG9iYWxDaGVja2JveCA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCIgLz4nKVxyXG4gICAgICAuZHhDaGVja0JveCh7XHJcbiAgICAgICAgdGV4dDogJ0dsb2JhbCB2aWV3JyxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3c1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhDaGVja0JveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB2aWV3SXNHbG9iYWxDaGVja2JveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZURpYWxvZyhcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiAnQ3JlYXRlIE5ldyBWaWV3JyxcclxuICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIG1heFdpZHRoOiAnMzAwcHgnLFxyXG4gICAgICB9LFxyXG4gICAgICAkcG9wdXBDb250ZW50LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ09rJyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoY2xvc2VQb3B1cCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF2aWV3TmFtZVRleHRCb3hWYWxpZGF0b3IudmFsaWRhdGUoKS5pc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVBcyh2aWV3TmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpLCB2aWV3SXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgY2xvc2VQb3B1cCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuQ29sdW1uQ2hvb3NlcigpIHtcclxuICAgIHRoaXMub3B0aW9ucy5vd25lci5zaG93Q29sdW1uQ2hvb3NlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpIHtcclxuICAgIGlmICghdGhpcy52aWV3c0Ryb3Bkb3duQm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3cyA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmdldFZpZXdzKCk7XHJcbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5BcnJheVN0b3JlKHtcclxuICAgICAga2V5OiAnaWQnLFxyXG4gICAgICBkYXRhOiB2aWV3c1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3gub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQpO1xyXG4gICAgdGhpcy52aWV3c0RhdGFHcmlkICYmIHRoaXMudmlld3NEYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZSgpIHtcclxuICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5zYXZlKCk7XHJcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci51cGRhdGVDdXJyZW50Vmlldyh7XHJcbiAgICAgIG5hbWU6IHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgIGdyaWRTdGF0ZTogdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuY3VycmVudFNhdmVkR3JpZFN0YXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBub3RpZnkoJ1NhdmVkJywgdHJ1ZSk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlQXModmlld05hbWU6IHN0cmluZywgaXNHbG9iYWw6IGJvb2xlYW4pIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLnNhdmUoKTtcclxuICAgIGNvbnN0IHVwZGF0ZWRWaWV3ID0gYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3JlYXRlTmV3VmlldyhcclxuICAgICAgdmlld05hbWUsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSxcclxuICAgICAgaXNHbG9iYWxcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5Vmlldyh1cGRhdGVkVmlldy5pZCk7XHJcblxyXG4gICAgbm90aWZ5KCdWaWV3IGlzIGNyZWF0ZWQnLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlVmlldyh2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuZGVsZXRlVmlldyh2aWV3SWQpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vblZpZXdEZWxldGVkKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vblZpZXdEZWxldGVkKHZpZXdJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgIT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmFwcGx5VmlldyhHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWdpblZpZXdBcHBseWluZ0xvYWRpbmcoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUgJiYgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCB0cnVlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gJiYgdGhpcy5zYXZlVmlld0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QXNCdXR0b24gJiYgdGhpcy5zYXZlVmlld0FzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgIHRoaXMudmlld3NEYXRhR3JpZCAmJiB0aGlzLnZpZXdzRGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdBcHBseWluZy4uLicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbmRWaWV3QXBwbHlpbmdMb2FkaW5nKCkge1xyXG4gICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlICYmIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3JlYWRPbmx5JywgZmFsc2UpO1xyXG4gICAgdGhpcy5zYXZlVmlld0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QXNCdXR0b24gJiYgdGhpcy5zYXZlVmlld0FzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICB0aGlzLnZpZXdzRGF0YUdyaWQgJiYgdGhpcy52aWV3c0RhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3luY1VJV2l0aEN1cnJlbnRWaWV3KGlnbm9yZUN1cnJlbnRWaWV3VGl0bGUgPSBmYWxzZSkge1xyXG4gICAgaWYgKCFpZ25vcmVDdXJyZW50Vmlld1RpdGxlICYmIHRoaXMuY3VycmVudFZpZXdUaXRsZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3Lm5hbWUpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCdyZWFkT25seScsIHRoaXMuaXNEZWZhdWx0Vmlldyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy52aWV3c0RhdGFHcmlkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCkge1xyXG4gICAgICAgICAgdGhpcy52aWV3c0RhdGFHcmlkLnNlbGVjdFJvd3NCeUluZGV4ZXMoWzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy52aWV3c0RhdGFHcmlkLnNlbGVjdFJvd3MoW3RoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWRdLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCAwKTtcclxuXHJcbiAgICBjb25zdCBpc0dsb2JhbFZpZXcgPSB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlldy5pc0dsb2JhbFxyXG4gICAgICAmJiAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzO1xyXG5cclxuICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gJiYgdGhpcy5zYXZlVmlld0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgdGhpcy5pc0RlZmF1bHRWaWV3IHx8IGlzR2xvYmFsVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1DaGFuZ2VzTG9zcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBjbG9zZSB0aGlzIHBvcHVwLiBEbyB5b3Ugd2FudCB0byBjbG9zZSB0aGUgcG9wdXAgYW5kIG5vdCBzYXZlIGNoYW5nZXM/JyxcclxuICAgICAgJ1Vuc2F2ZWQgY2hhbmdlcydcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkYvLyB0c2xpbnQ6ZGlzYWJsZTogbWVtYmVyLW9yZGVyaW5nXHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSAnLi4vLi4vLi4vVXRpbHMvTWVtb2l6ZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheUZpbHRlciB7XHJcbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgaXNEZWZhdWx0OiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IGlzR2xvYmFsOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IGZpbHRlclN0YXRlOiBhbnkgfCBudWxsO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIE5hbWU6IHN0cmluZztcclxuICBJc0RlZmF1bHQ6IGJvb2xlYW47XHJcbiAgSXNHbG9iYWw6IGJvb2xlYW47XHJcbiAgRmlsdGVyU3RhdGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMge1xyXG4gIC8vIHJlYWRvbmx5IGRlZmF1bHRPcGVuZWRGaWx0ZXJJZDogbnVtYmVyO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbnR5cGUgQ29udHJvbERpc3BsYXlGaWx0ZXJVcGRhdGVzID0gUGFydGlhbDxQaWNrPElDb250cm9sRGlzcGxheUZpbHRlciwgJ25hbWUnIHwgJ2ZpbHRlclN0YXRlJyB8ICdpc0dsb2JhbCc+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRmlsdGVyc01hbmFnZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfY3VycmVudEZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJzOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRGaWx0ZXJCeUlkSW50ZXJuYWwgPSAoZmlsdGVySWQ6IG51bWJlcikgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycyAmJiB0aGlzLmZpbHRlcnMuZmluZCgodikgPT4gdi5pZCA9PT0gZmlsdGVySWQpO1xyXG4gIH1cclxuICBwcml2YXRlIGdldEZpbHRlckJ5SWQgPSBtZW1vaXplKHRoaXMuZ2V0RmlsdGVyQnlJZEludGVybmFsKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy5pbnNlcnREYXRhVXJsID0gb3B0aW9ucy5pbnNlcnREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5kZWxldGVEYXRhVXJsID0gb3B0aW9ucy5kZWxldGVEYXRhVXJsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50RmlsdGVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyQnlJZCh0aGlzLl9jdXJyZW50RmlsdGVySWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50RmlsdGVySWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudEZpbHRlcklkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50RmlsdGVySWQoaWQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fY3VycmVudEZpbHRlcklkID0gaWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RmlsdGVycygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheUZpbHRlcltdPiB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVycykge1xyXG4gICAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVDdXJyZW50RmlsdGVyKGZpbHRlclVwZGF0ZXM6IENvbnRyb2xEaXNwbGF5RmlsdGVyVXBkYXRlcykge1xyXG4gICAgcmV0dXJuICEhdGhpcy5jdXJyZW50RmlsdGVyICYmIHRoaXMudXBkYXRlRmlsdGVyKHRoaXMuY3VycmVudEZpbHRlci5pZCwgZmlsdGVyVXBkYXRlcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmV3RmlsdGVyKGZpbHRlck5hbWU6IHN0cmluZywgZmlsdGVyU3RhdGU6IGFueSwgaXNEZWZhdWx0OiBib29sZWFuLCBpc0dsb2JhbDogYm9vbGVhbilcclxuICAgIDogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlGaWx0ZXI+IHtcclxuICAgIGxldCBuZXdGaWx0ZXJEdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byA9IHRoaXMubWFwRmlsdGVyTW9kZWxUb0R0byh7XHJcbiAgICAgIGlkOiAtMSxcclxuICAgICAgbmFtZTogZmlsdGVyTmFtZSxcclxuICAgICAgaXNEZWZhdWx0LFxyXG4gICAgICBpc0dsb2JhbCxcclxuICAgICAgZmlsdGVyU3RhdGVcclxuICAgIH0pO1xyXG5cclxuICAgIG5ld0ZpbHRlckR0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheUZpbHRlckR0bz4odGhpcy5pbnNlcnREYXRhVXJsLFxyXG4gICAgICAnUE9TVCcsIG5ld0ZpbHRlckR0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWFwRmlsdGVyRHRvVG9Nb2RlbChuZXdGaWx0ZXJEdG8pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyLCB1cGRhdGVzOiBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyQnlJZChmaWx0ZXJJZCk7XHJcbiAgICBpZiAoIWZpbHRlcikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZEZpbHRlcjogSUNvbnRyb2xEaXNwbGF5RmlsdGVyID0ge1xyXG4gICAgICAuLi5maWx0ZXIsXHJcbiAgICAgIC4uLnVwZGF0ZXNcclxuICAgIH07XHJcbiAgICBsZXQgdXBkYXRlZEZpbHRlckR0bzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvID0gdGhpcy5tYXBGaWx0ZXJNb2RlbFRvRHRvKHVwZGF0ZWRGaWx0ZXIpO1xyXG5cclxuICAgIHVwZGF0ZWRGaWx0ZXJEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8+KHRoaXMudXBkYXRlRGF0YVVybCxcclxuICAgICAgJ1BVVCcsIHVwZGF0ZWRGaWx0ZXJEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEZpbHRlckJ5SWQoZmlsdGVySWQpO1xyXG4gICAgaWYgKCFmaWx0ZXIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGVsZXRlRGF0YVVybCwgJ0RFTEVURScsIHsgZmlsdGVySWQgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRGaWx0ZXJzKCkge1xyXG4gICAgY29uc3QgZmlsdGVycyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheUZpbHRlckR0b1tdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzLm1hcCgoZHRvKSA9PiB0aGlzLm1hcEZpbHRlckR0b1RvTW9kZWwoZHRvKSk7XHJcbiAgICAvLyBOT1RFOiByZXNldCBtZW1vaXplXHJcbiAgICB0aGlzLnJlc2V0Q2FjaGVkUmVzdWx0T2ZHZXRGaWx0ZXJCeUlkRnVuY3Rpb24oKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBGaWx0ZXJNb2RlbFRvRHRvKG1vZGVsOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgSWQ6IG1vZGVsLmlkLFxyXG4gICAgICBOYW1lOiBtb2RlbC5uYW1lLFxyXG4gICAgICBJc0RlZmF1bHQ6IG1vZGVsLmlzRGVmYXVsdCxcclxuICAgICAgSXNHbG9iYWw6IG1vZGVsLmlzR2xvYmFsLFxyXG4gICAgICBGaWx0ZXJTdGF0ZTogSlNPTi5zdHJpbmdpZnkobW9kZWwuZmlsdGVyU3RhdGUpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBGaWx0ZXJEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvKTogSUNvbnRyb2xEaXNwbGF5RmlsdGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkOiBkdG8uSWQsXHJcbiAgICAgIG5hbWU6IGR0by5OYW1lLFxyXG4gICAgICBpc0RlZmF1bHQ6IGR0by5Jc0RlZmF1bHQgfHwgZmFsc2UsXHJcbiAgICAgIGlzR2xvYmFsOiBkdG8uSXNHbG9iYWwgfHwgZmFsc2UsXHJcbiAgICAgIGZpbHRlclN0YXRlOiBKU09OLnBhcnNlKGR0by5GaWx0ZXJTdGF0ZSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2FjaGVkUmVzdWx0T2ZHZXRGaWx0ZXJCeUlkRnVuY3Rpb24oKSB7XHJcbiAgICB0aGlzLmdldEZpbHRlckJ5SWQgPSBtZW1vaXplKHRoaXMuZ2V0RmlsdGVyQnlJZEludGVybmFsKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRGaWx0ZXJzTWFuYWdlciwgSUNvbnRyb2xEaXNwbGF5RmlsdGVyLCBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZEZpbHRlcnNNYW5hZ2VyJztcclxuaW1wb3J0IHsgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIH0gZnJvbSAnLi9Db250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXInO1xyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvTm90aWZ5JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyOiBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IG9uRmlsdGVyQXBwbGllZD86IChmaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xyXG4gIHJlYWRvbmx5IG9uRmlsdGVyRGVsZXRlZD86IChmaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xyXG4gIHJlYWRvbmx5IGNhbkNyZWF0ZUdsb2JhbEZpbHRlcnM6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgdmlzaWJsZTogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczogSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG59XHJcblxyXG50eXBlIE11dGFibGU8VD4gPSB7XHJcbiAgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucyA9XHJcbiAgTXV0YWJsZTxPbWl0PElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zLCBrZXlvZiBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PiAmXHJcbiAgTXV0YWJsZTxQYXJ0aWFsPElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zO1xyXG4gIC8vIHRvb2xiYXIgaXRlbXNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZmlsdGVyc1Rvb2xiYXJJdGVtOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgLy8gdHNsaW50OmVuYWJsZSB2YXJpYWJsZS1uYW1lXHJcblxyXG4gIC8vIHRvb2xiYXIgd2lkZ2V0c1xyXG4gIHByaXZhdGUgZmlsdGVyc0Ryb3Bkb3duQm94OiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJzRGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGN1cnJlbnRGaWx0ZXJUaXRsZTogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBuZXdGaWx0ZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcbiAgLy8gd2lkZ2V0c1xyXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9maWx0ZXJQb3B1cDogRGV2RXhwcmVzcy51aS5keFBvcHVwIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyTmFtZVRleHRCb3g6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyQnVpbGRlcjogRGV2RXhwcmVzcy51aS5keEZpbHRlckJ1aWxkZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvcjogRGV2RXhwcmVzcy51aS5keEZpbHRlckJ1aWxkZXI7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJJc0dsb2JhbENoZWNrYm94OiBEZXZFeHByZXNzLnVpLmR4Q2hlY2tCb3ggfCB1bmRlZmluZWQ7XHJcbiAgLy8gdHNsaW50OmVuYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBpc0luRmlsdGVyQXBwbHlpbmcgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBncmlkRmlsdGVyc01hbmFnZXI6IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyXHJcbiAgICAgICAgPyBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlclxyXG4gICAgICAgIDogbmV3IEdyaWRGaWx0ZXJzTWFuYWdlcihvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMpLFxyXG4gICAgICBhdXRvSW50ZWdyYXRpb246IChvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSBudWxsKVxyXG4gICAgICAgID8gb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gJiYgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICAgIHRoaXMuZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3IgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RmlsdGVyQnVpbGRlcih7XHJcbiAgICAgICAgZmllbGRzOiB0aGlzLmdldEZsYXRDb2x1bW5zTGlzdCh0aGlzLm9wdGlvbnMub3duZXIub3B0aW9uKCdjb2x1bW5zJykpXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdHJ5QXBwbHlGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgaXNDYW5CZUZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpO1xyXG5cclxuICAgIGlmIChpc0NhbkJlRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKGZpbHRlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNDYW5CZUZpbHRlckFwcGxpZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYXBwbHlGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCwgZGVmZXJyZWRMb2FkaW5nID0gZmFsc2UpIHtcclxuICAgIC8vIE5PVEU6IElmIHdlIGNoYW5nZSB0aGUgZmlsdGVyLCB0aGUgZ3JpZCB3aWxsIGJlIHJlbG9hZGVkIGluIHRoZSBmaWx0ZXJzRHJvcGRvd25Cb3gub25WYWx1ZUNoYW5nZWRcclxuICAgIC8vIGNvbnN0IGZpbHRlckNoYW5nZWQgPSB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCAhPT0gZmlsdGVySWQ7XHJcbiAgICB0aGlzLmlzSW5GaWx0ZXJBcHBseWluZyA9IHRydWU7XHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCA9IGZpbHRlcklkO1xyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveC5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQpO1xyXG5cclxuICAgIGxldCBncmlkRGF0YVNvdXJjZSA9IHRoaXMub3B0aW9ucy5vd25lci5nZXREYXRhU291cmNlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAvLyBOT1RFOiBuZWVkIHRvIHByb2Nlc3MgZmlsdGVyIHZhbHVlIGJ5IHRoZSBnZXRGaWx0ZXJFeHByZXNzaW9uIG1ldGhvZFxyXG4gICAgICAvLyB0byBiZSBzdXJlIGl0IHdpbGwgd29yayBpbiBkYXRhc291cmNlIChmb3IgZXhhbXBsZSwgdGhlICdiZXR3ZWVuJyBjb25kaXRpb24pXHJcbiAgICAgIC8vIHdpbGwgYmUgbW9kaWZpZWQgdG8gXCI+PSBhbmQgPD1cIiBiZWNhdXNlIGRhdGEgc291cmNlIGRvZXNuJ3Qgc3VwcG9ydCAnYmV0d2VlbicuXHJcblxyXG4gICAgICB0aGlzLmZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yLm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIuZmlsdGVyU3RhdGUpO1xyXG4gICAgICBjb25zdCB2YWwgPSB0aGlzLmZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yLmdldEZpbHRlckV4cHJlc3Npb24oKTtcclxuXHJcbiAgICAgIGlmIChncmlkRGF0YVNvdXJjZS5pc0xvYWRpbmcoKSkge1xyXG4gICAgICAgIGNvbnN0IGFwcGx5VmFsdWUgPSAoKSA9PiB7XHJcbiAgICAgICAgICBncmlkRGF0YVNvdXJjZS5vZmYoJ2xvYWRpbmdDaGFuZ2VkJywgYXBwbHlWYWx1ZSk7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgZ3JpZERhdGFTb3VyY2UgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0RGF0YVNvdXJjZSgpO1xyXG4gICAgICAgICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIodmFsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGdyaWREYXRhU291cmNlLm9uKCdsb2FkaW5nQ2hhbmdlZCcsIGFwcGx5VmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGdyaWREYXRhU291cmNlLmZpbHRlcih2YWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZERhdGFTb3VyY2UuZmlsdGVyKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICghZmlsdGVyQ2hhbmdlZCkge1xyXG4gICAgaWYgKCFkZWZlcnJlZExvYWRpbmcpIHtcclxuICAgICAgYXdhaXQgZ3JpZERhdGFTb3VyY2UubG9hZCgpO1xyXG4gICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5vbkZpbHRlckFwcGxpZWQgJiYgdGhpcy5vcHRpb25zLm9uRmlsdGVyQXBwbGllZChmaWx0ZXJJZCk7XHJcbiAgICB0aGlzLmlzSW5GaWx0ZXJBcHBseWluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhclByZXBhcmluZyA9IGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnKTtcclxuXHJcbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBjdXJyZW50VG9vbGJhclByZXBhcmluZyAmJiBjdXJyZW50VG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMgJiYgZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0b29sYmFySXRlbXMuc3BsaWNlKDEsIDAsXHJcbiAgICAgIHRoaXMuZmlsdGVyc1Rvb2xiYXJJdGVtXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgZmlsdGVyc1Rvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl9maWx0ZXJzVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5fZmlsdGVyc1Rvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVGaWx0ZXJzVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyc1Rvb2xiYXJJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgZmlsdGVyUG9wdXAoKSB7XHJcbiAgICBpZiAoIXRoaXMuX2ZpbHRlclBvcHVwKSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlclBvcHVwID0gdGhpcy5jcmVhdGVGaWx0ZXJQb3B1cCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXJQb3B1cDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50RmlsdGVyID0gdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyO1xyXG5cclxuICAgIGNvbnN0IG5ld05hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94ICYmIHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3Qgb2xkTmFtZSA9IGN1cnJlbnRGaWx0ZXIgJiYgY3VycmVudEZpbHRlci5uYW1lO1xyXG5cclxuICAgIGNvbnN0IG5ld0ZpbHRlciA9IHRoaXMuZmlsdGVyQnVpbGRlciAmJiB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3Qgb2xkRmlsdGVyID0gY3VycmVudEZpbHRlciAmJiBjdXJyZW50RmlsdGVyLmZpbHRlclN0YXRlO1xyXG5cclxuICAgIGNvbnN0IG5ld0lzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94ICYmIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBvbGRJc0dsb2JhbCA9IGN1cnJlbnRGaWx0ZXIgJiYgY3VycmVudEZpbHRlci5pc0dsb2JhbDtcclxuXHJcbiAgICByZXR1cm4gbmV3TmFtZSAhPT0gb2xkTmFtZSB8fCBuZXdGaWx0ZXIgIT09IG9sZEZpbHRlciB8fCBuZXdJc0dsb2JhbCAhPT0gb2xkSXNHbG9iYWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlcnNUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xyXG4gICAgbGV0IGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkZ2V0OiAnZHhEcm9wRG93bkJveCcgYXMgYW55LFxyXG4gICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgdGV4dDogJ0RhdGEgU2V0cycsXHJcbiAgICAgIHZpc2libGU6IHRoaXMub3B0aW9ucy52aXNpYmxlLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy1maWx0ZXJzX190b29sYmFyLWl0ZW0nLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfSxcclxuICAgICAgICB2YWx1ZTogdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZScsXHJcbiAgICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnTm9uZScsXHJcbiAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICAgIHdpZHRoOiA1MDBcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uSW5pdGlhbGl6ZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgICAgY29uc3QgWywgdXNlclNldHRpbmdzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgICAgdGhpcy5sb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCksXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIuZ2V0VXNlclNldHRpbmdzKClcclxuICAgICAgICAgIF0pO1xyXG5cclxuICAgICAgICAgIHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQgJiYgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5pc0luRmlsdGVyQXBwbHlpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICghaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHZhbHVlID0gZS52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IGlzRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlGaWx0ZXIodmFsdWUpO1xyXG5cclxuICAgICAgICAgIGlmICghaXNGaWx0ZXJBcHBsaWVkKSB7XHJcbiAgICAgICAgICAgIGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGUucHJldmlvdXNWYWx1ZTtcclxuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCAmJiB0aGlzLmZpbHRlcnNEYXRhR3JpZC5zZWxlY3RSb3dzKHZhbHVlLCBmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJUaXRsZSAmJiB0aGlzLmN1cnJlbnRGaWx0ZXJUaXRsZS5vcHRpb24oJ3ZhbHVlJyxcclxuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd0ZXh0JykgfHwgZS5jb21wb25lbnQub3B0aW9uKCdwbGFjZWhvbGRlcicpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uT3BlbmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgJiYgdGhpcy5maWx0ZXJzRGF0YUdyaWQuc2VsZWN0Um93cyhlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJyksIGZhbHNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkID0gdGhpcy5jcmVhdGVGaWx0ZXJzRGF0YUdyaWQoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUgPSB0aGlzLmNyZWF0ZUN1cnJlbnRGaWx0ZXJUaXRsZShlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLm5ld0ZpbHRlckJ1dHRvbiA9IHRoaXMuY3JlYXRlTmV3RmlsdGVyQnV0dG9uKCk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50SGVhZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgIC5hZGRDbGFzcygnYXBzLWZpbHRlcnNfX2hlYWRlcicpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5jdXJyZW50RmlsdGVyVGl0bGUuZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMubmV3RmlsdGVyQnV0dG9uLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50ID0gJCgnPGRpdiAvPicpLmNzcygnaGVpZ2h0JywgJzEwMCUnKVxyXG4gICAgICAgICAgICAuYXBwZW5kKGRyb3Bkb3duQ29udGVudEhlYWRlcilcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLmZpbHRlcnNEYXRhR3JpZC5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBkcm9wZG93bkNvbnRlbnQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3hPcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJzRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkYXRhIHNldD8nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgY29sdW1uczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNEZWZhdWx0JyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIERlZmF1bHQnLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdpc0dsb2JhbCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdJcyBHbG9iYWwnLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICB3aWR0aDogNzBcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGljb246ICdlZGl0JyxcclxuICAgICAgICAgICAgICAgIGhpbnQ6ICdFZGl0JyxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghZS5yb3cgfHwgIWUucm93LmtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy50cnlBcHBseUZpbHRlcihlLnJvdy5rZXkpO1xyXG4gICAgICAgICAgICAgICAgICBpc0ZpbHRlckFwcGxpZWQgJiYgIXRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd2aXNpYmxlJylcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm9wZW5FZGl0RmlsdGVyUG9wdXAodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICdkZWxldGUnXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgc2hvd0NvbHVtbkxpbmVzOiBmYWxzZSxcclxuICAgICAgICBzZWxlY3Rpb246IHsgbW9kZTogJ3NpbmdsZScgfSxcclxuICAgICAgICBoZWlnaHQ6ICdjYWxjKDEwMCUgLSA1MXB4KScsXHJcbiAgICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICdzdGFuZGFyZCcgfSxcclxuICAgICAgICBwYWdpbmc6IHsgZW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gZGF0YSBzZXRzJyxcclxuICAgICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndmFsdWUnLCBlLnNlbGVjdGVkUm93S2V5cyA/IGUuc2VsZWN0ZWRSb3dLZXlzWzBdIDogbnVsbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmRhdGFGaWVsZCA9PT0gJ2lzR2xvYmFsJykge1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbEZpbHRlcnM7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvblZhbHVlQ2hhbmdlZCA9IGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gYXN5bmMgKG9wdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmJlZ2luQ3VzdG9tTG9hZGluZygnVXBkYXRpbmcnKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLnVwZGF0ZUZpbHRlcihlLnJvdy5kYXRhLmlkLCB7IGlzR2xvYmFsOiBvcHQudmFsdWUgfSk7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG5cclxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZChvcHQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25DZWxsUHJlcGFyZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5jb2x1bW4udHlwZSAhPT0gJ2J1dHRvbnMnIHx8ICFlLmRhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgPT09ICdidXR0b25zJykge1xyXG4gICAgICAgICAgICBjb25zdCBlbmFibGVkID0gIWUuZGF0YS5pc0dsb2JhbFxyXG4gICAgICAgICAgICAgIHx8IChlLmRhdGEuaXNHbG9iYWwgJiYgdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbEZpbHRlcnMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFlbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgQXJyYXkuZnJvbShlLmNlbGxFbGVtZW50LmNoaWxkcmVuKCkpLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgICAgICAgICQoYykuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZGRkICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0J1xyXG4gICAgICAgICAgICAgICAgfSkub2ZmKCdjbGljaycpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1VwZGF0aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmtleSB8fCBlLm5ld0RhdGEuaXNEZWZhdWx0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBlLmNvbXBvbmVudC5nZXREYXRhU291cmNlKCkuaXRlbXMoKS5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5pc0RlZmF1bHQpO1xyXG4gICAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgZGVmYXVsdEZpbHRlci5pc0RlZmF1bHQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnVwZGF0ZVVzZXJTZXR0aW5ncyh7XHJcbiAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJJZDogZS5uZXdEYXRhLmlzRGVmYXVsdCA/IGUua2V5IDogdW5kZWZpbmVkXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93UmVtb3Zpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUua2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZUZpbHRlcihlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudEZpbHRlclRpdGxlKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZmlsdGVyc19fY3VycmVudC1maWx0ZXInKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICB2YWx1ZTogZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3RleHQnKSB8fCBkcm9wZG93bkJveE93bmVyLm9wdGlvbigncGxhY2Vob2xkZXInKSxcclxuICAgICAgICByZWFkT25seTogdHJ1ZVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVOZXdGaWx0ZXJCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWZpbHRlcnNfX2FkZC1uZXctZmlsdGVyIGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdOZXcgRGF0YSBTZXQnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMub3Blbk5ld0ZpbHRlclBvcHVwKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAncGx1cydcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cCgpIHtcclxuICAgIGNvbnN0ICRwb3B1cFJvb3QgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICAgIGxldCBpc1BvcHVwSGlkaW5nQ29uZmlybWVkID0gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuICRwb3B1cFJvb3QuZHhQb3B1cCh7XHJcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5vcHRpb25zLm93bmVyLmVsZW1lbnQoKSxcclxuICAgICAgc2hhZGluZzogZmFsc2UsXHJcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiA2NTAsXHJcbiAgICAgIGhlaWdodDogNTAwLFxyXG4gICAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3ggJiYgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3guY2xvc2UoKTtcclxuICAgICAgfSxcclxuICAgICAgb25IaWRpbmc6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGUuY2FuY2VsID0gdHJ1ZTtcclxuICAgICAgICBpc1BvcHVwSGlkaW5nQ29uZmlybWVkID0gYXdhaXQgdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKTtcclxuICAgICAgICBpZiAoaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3ggJiYgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3BlbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyTmFtZVRleHRCb3goKSB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgRGF0YSBTZXQgTmFtZS4uLicsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlcklzR2xvYmFsQ2hlY2tib3goKSB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keENoZWNrQm94KHtcclxuICAgICAgICB0ZXh0OiAnR2xvYmFsIGRhdGEgc2V0JyxcclxuICAgICAgfSlcclxuICAgICAgLmR4Q2hlY2tCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZsYXRDb2x1bW5zTGlzdChzb3VyY2VDb2x1bW5zLCAuLi5yZXN0KSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBzb3VyY2VDb2x1bW4gb2Ygc291cmNlQ29sdW1ucykge1xyXG4gICAgICBpZiAoc291cmNlQ29sdW1uLmNvbHVtbnMgJiYgc291cmNlQ29sdW1uLmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IG5lc3RlZENvbHVtbnMgPSB0aGlzLmdldEZsYXRDb2x1bW5zTGlzdChzb3VyY2VDb2x1bW4uY29sdW1ucyk7XHJcblxyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQobmVzdGVkQ29sdW1ucyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gJC5leHRlbmQoe30sIHNvdXJjZUNvbHVtbik7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW4uZGF0YVR5cGUgPT09ICdkYXRlJyB8fCBjb2x1bW4uZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgIGNvbnN0IGlzRGF0ZVRpbWUgPSBjb2x1bW4uZGF0YVR5cGUgPT09ICdkYXRldGltZSc7XHJcbiAgICAgICAgICBjb25zdCBkYXRlRm9ybWF0ID0gJ2RkIE1NTSB5eSc7XHJcbiAgICAgICAgICBjb25zdCBkYXRlVGltZUZvcm1hdCA9ICdoaDptbSwgZGQgTU1NIHl5JztcclxuICAgICAgICAgIGNvbnN0IGRpc3BsYXlGb3JtYXQgPSBpc0RhdGVUaW1lID8gZGF0ZVRpbWVGb3JtYXQgOiBkYXRlRm9ybWF0O1xyXG5cclxuICAgICAgICAgIGNvbnN0IHBhcnNlRGF0ZVRpbWUgPSAoZGF0ZVN0cjogc3RyaW5nKTogRGF0ZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVUaW1lUGFydHMgPSBkYXRlU3RyLnNwbGl0KCcsICcpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24ucGFyc2VEYXRlKGRhdGVUaW1lUGFydHNbMV0sIGRhdGVGb3JtYXQpIHx8IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRpbWVQYXJ0cyA9IGRhdGVUaW1lUGFydHNbMF0uc3BsaXQoJzonKTtcclxuXHJcbiAgICAgICAgICAgICAgZGF0ZS5zZXRIb3VycyhwYXJzZUludCh0aW1lUGFydHNbMF0pKTtcclxuICAgICAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMocGFyc2VJbnQodGltZVBhcnRzWzFdKSk7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGNvbHVtbi5mb3JtYXQgPSBkaXNwbGF5Rm9ybWF0O1xyXG4gICAgICAgICAgY29sdW1uLmVkaXRvclRlbXBsYXRlID0gKGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keERhdGVCb3goe1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQsXHJcbiAgICAgICAgICAgICAgdHlwZTogaXNEYXRlVGltZSA/ICdkYXRldGltZScgOiAnZGF0ZScsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IDE1MCxcclxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZS5zZXRWYWx1ZShEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5mb3JtYXREYXRlKHZhbHVlLCBkaXNwbGF5Rm9ybWF0KSk7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB2YWx1ZTogKGlzRGF0ZVRpbWUgPyBwYXJzZURhdGVUaW1lKGUudmFsdWUpIDogRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24ucGFyc2VEYXRlKGUudmFsdWUsIGRpc3BsYXlGb3JtYXQpKVxyXG4gICAgICAgICAgICAgICAgfHwgbnVsbFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBjb2x1bW4uZmlsdGVyT3BlcmF0aW9ucyA9IFsnPScsICc8PicsICc8JywgJz4nLCAnPD0nLCAnPj0nLCAnaXNibGFuaycsICdpc25vdGJsYW5rJ107XHJcbiAgICAgICAgICBjb2x1bW4uY2FsY3VsYXRlRmlsdGVyRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBbc291cmNlQ29sdW1ucywgLi4ucmVzdF07XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJnc1swXSkge1xyXG4gICAgICAgICAgICAgIGlmIChpc0RhdGVUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBhcmdzWzBdID0gcGFyc2VEYXRlVGltZShhcmdzWzBdKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXJnc1swXSA9IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShmaWx0ZXJWYWx1ZSwgZGlzcGxheUZvcm1hdCkgfHwgbnVsbDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRDYWxjdWxhdGVGaWx0ZXJFeHByZXNzaW9uKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlc3VsdC5wdXNoKGNvbHVtbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0LnNvcnQoKGNvbDEsIGNvbDIpID0+IHtcclxuICAgICAgY29uc3QgY2FwdGlvbjEgPSAoY29sMS5jYXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCBjYXB0aW9uMiA9IChjb2wyLmNhcHRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICBpZiAoY2FwdGlvbjEgPCBjYXB0aW9uMikge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNhcHRpb24xID4gY2FwdGlvbjIpIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyQnVpbGRlcigpIHtcclxuICAgIGNvbnN0IGZpbHRlckJ1aWxkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RmlsdGVyQnVpbGRlcih7XHJcbiAgICAgICAgZmllbGRzOiB0aGlzLmdldEZsYXRDb2x1bW5zTGlzdCh0aGlzLm9wdGlvbnMub3duZXIub3B0aW9uKCdjb2x1bW5zJykpXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlckJ1aWxkZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGNvbnN0ICRwb3B1cENvbnRlbnQgPSAkKCc8ZGl2IC8+JykuaGVpZ2h0KCcxMDAlJyk7XHJcblxyXG4gICAgY29uc3QgJG5hbWVDb250YWluZXIgPSAkKCc8ZGl2IGNsYXNzPVwiYXBzLWZpbHRlcnNfX25hbWUtY29udGFpbmVyXCIgLz4nKS5oZWlnaHQoJzM2cHgnKTtcclxuXHJcbiAgICAvLyBOT1RFOiBSZWNyZWF0ZSB3aWRnZXRzXHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94ID0gdGhpcy5jcmVhdGVGaWx0ZXJOYW1lVGV4dEJveCgpO1xyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyID0gdGhpcy5jcmVhdGVGaWx0ZXJCdWlsZGVyKCk7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3ggPSB0aGlzLmNyZWF0ZUZpbHRlcklzR2xvYmFsQ2hlY2tib3goKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnLCBmaWx0ZXIgJiYgZmlsdGVyLm5hbWUpO1xyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJG5hbWVDb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJywgZmlsdGVyICYmIGZpbHRlci5pc0dsb2JhbCk7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3guZWxlbWVudCgpLmFwcGVuZFRvKCRuYW1lQ29udGFpbmVyKTtcclxuICAgIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ2Rpc2FibGVkJywgIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzKTtcclxuXHJcbiAgICAkbmFtZUNvbnRhaW5lci5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcclxuXHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScsIGZpbHRlciAmJiBmaWx0ZXIuZmlsdGVyU3RhdGUpO1xyXG5cclxuICAgIGNvbnN0ICRmaWx0ZXJCdWlsZGVyQ29udGFpbmVyID0gJCgnPGRpdiAvPicpLmhlaWdodCgnY2FsYygxMDAlIC0gMzZweCknKS5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcclxuXHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIuZWxlbWVudCgpLmFwcGVuZFRvKCRmaWx0ZXJCdWlsZGVyQ29udGFpbmVyKTtcclxuXHJcbiAgICAkZmlsdGVyQnVpbGRlckNvbnRhaW5lci5keFNjcm9sbFZpZXcoe1xyXG4gICAgICBzY3JvbGxCeUNvbnRlbnQ6IHRydWVcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiAkcG9wdXBDb250ZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtcyhmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gZmlsdGVyID8gW1xyXG4gICAgICB0aGlzLmNyZWF0ZVVwZGF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKSxcclxuICAgICAgdGhpcy5jcmVhdGVTYXZlRmlsdGVyQXNOZXdQb3B1cFRvb2xiYXJJdGVtKCksXHJcbiAgICAgIHRoaXMuY3JlYXRlUmVzZXRGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCksXHJcbiAgICAgIHRoaXMuY3JlYXRlRGVsZXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpXHJcbiAgICBdIDogW3RoaXMuY3JlYXRlU2F2ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnQXBwbHkgYW5kIFNhdmUnLFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY3JlYXRlTmV3RmlsdGVyLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdBcHBseSBhbmQgVXBkYXRlJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXIodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlRmlsdGVyQXNOZXdQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZSBBcyBOZXcnLFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY3JlYXRlTmV3RmlsdGVyLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJlc2V0RmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ1Jlc2V0JyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcyB8fCAhdGhpcy5maWx0ZXJCdWlsZGVyIHx8ICF0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgICAgICAgJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZXNldCB1bnNhdmVkIGNoYW5nZXM/JyxcclxuICAgICAgICAgICAgJ1Jlc2V0IHRoZSBkYXRhIHNldCdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoIWlzQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlc2V0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3VuZG8nXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURlbGV0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdEZWxldGUgRGF0YSBTZXQnLFxyXG4gICAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgICAgICAgIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBcIiR7dGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLm5hbWV9XCIgZGF0YSBzZXQ/YCxcclxuICAgICAgICAgICAgJ0RlbGV0ZSB0aGUgZGF0YSBzZXQnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKCFpc0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVGaWx0ZXIodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJQb3B1cC5oaWRlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAndHJhc2gnXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9wZW5OZXdGaWx0ZXJQb3B1cCgpIHtcclxuICAgIGNvbnN0IGlzRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlGaWx0ZXIodW5kZWZpbmVkKTtcclxuICAgIGlmICghaXNGaWx0ZXJBcHBsaWVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclBvcHVwQ29udGVudCgpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5zaG93KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wZW5FZGl0RmlsdGVyUG9wdXAoZmlsdGVyOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIHRoaXMudXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KGZpbHRlcik7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLnNob3coKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KGZpbHRlcj86IElDb250cm9sRGlzcGxheUZpbHRlcikge1xyXG4gICAgY29uc3QgY3VycmVudEFuaW1hdGlvbiA9IHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdhbmltYXRpb24nKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignYW5pbWF0aW9uJywgdW5kZWZpbmVkKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd0aXRsZScsIGZpbHRlciA/IGBFZGl0IHRoZSBcIiR7ZmlsdGVyLm5hbWV9XCIgZGF0YSBzZXRgIDogJ0NyZWF0ZSBhIG5ldyBkYXRhIHNldCcpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2NvbnRlbnRUZW1wbGF0ZScsICgpID0+IHRoaXMuY3JlYXRlRmlsdGVyUG9wdXBDb250ZW50KGZpbHRlcikpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ3Rvb2xiYXJJdGVtcycsIHRoaXMuY3JlYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbXMoZmlsdGVyKSk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLnJlcGFpbnQoKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignYW5pbWF0aW9uJywgY3VycmVudEFuaW1hdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5ld0ZpbHRlcigpIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJOYW1lVGV4dEJveCB8fCAhdGhpcy5maWx0ZXJCdWlsZGVyIHx8ICF0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbHRlck5hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGZpbHRlckJ1aWxkZXJTdGF0ZSA9IHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBpc0RlZmF1bHQgPSBmYWxzZTtcclxuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICBpZiAoIWZpbHRlck5hbWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2xEaXNwbGF5RmlsdGVyID0gYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jcmVhdGVOZXdGaWx0ZXIoXHJcbiAgICAgIGZpbHRlck5hbWUsIGZpbHRlckJ1aWxkZXJTdGF0ZSwgaXNEZWZhdWx0LCBpc0dsb2JhbFxyXG4gICAgKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcihjb250cm9sRGlzcGxheUZpbHRlci5pZCk7XHJcblxyXG4gICAgbm90aWZ5KCdDcmVhdGVkJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUZpbHRlcihmaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlcikge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlck5hbWVUZXh0Qm94IHx8ICF0aGlzLmZpbHRlckJ1aWxkZXIgfHwgIXRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZmlsdGVyTmFtZSA9IHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgZmlsdGVyU3RhdGUgPSB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgaXNHbG9iYWwgPSB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgIGlmICghZmlsdGVyTmFtZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNVcGRhdGVkID0gYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci51cGRhdGVGaWx0ZXIoZmlsdGVyLmlkLCB7XHJcbiAgICAgIG5hbWU6IGZpbHRlck5hbWUsXHJcbiAgICAgIGZpbHRlclN0YXRlLFxyXG4gICAgICBpc0dsb2JhbFxyXG4gICAgfSk7XHJcbiAgICBpZiAoIWlzVXBkYXRlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogdXBkYXRlIHRpdGxlXHJcbiAgICBub3RpZnkoJ1VwZGF0ZWQnLCB0cnVlKTtcclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmlkKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5kZWxldGVGaWx0ZXIoZmlsdGVySWQpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vbkZpbHRlckRlbGV0ZWQpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLm9uRmlsdGVyRGVsZXRlZChmaWx0ZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcih1bmRlZmluZWQpO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2hhbmdlcygpIHtcclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5uYW1lKTtcclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmZpbHRlclN0YXRlKTtcclxuICAgIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmlzR2xvYmFsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFt1c2VyU2V0dGluZ3MsIGZpbHRlcnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLmdldFVzZXJTZXR0aW5ncygpLFxyXG4gICAgICB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmdldEZpbHRlcnMoKVxyXG4gICAgXSk7XHJcblxyXG4gICAgaWYgKHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpIHtcclxuICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGZpbHRlcnMuZmluZCgoZikgPT4gZi5pZCA9PT0gdXNlclNldHRpbmdzLmRlZmF1bHRGaWx0ZXJJZCk7XHJcbiAgICAgIGlmIChkZWZhdWx0RmlsdGVyKSB7XHJcbiAgICAgICAgKGRlZmF1bHRGaWx0ZXIgYXMgYW55KS5pc0RlZmF1bHQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgIGtleTogJ2lkJyxcclxuICAgICAgZGF0YTogZmlsdGVyc1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBOT1RFOiBEZWxheSBmb3IgcG9wdXAgdmlzaWJpbGl0eSBjaGVja2luZ1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAwKSk7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcyB8fCAhdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ3Zpc2libGUnKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXHJcbiAgICAgICdVbnNhdmVkIGNoYW5nZXMnXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlLCBSZXF1ZXN0U3RhdGUgfSBmcm9tICcuLi8uLi9EYXRhJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVVcGxvYWRlck9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBtYXhGaWxlU2l6ZTogbnVtYmVyO1xyXG4gIGFjY2VwdGVkRmlsZVR5cGVzOiBzdHJpbmc7XHJcbiAgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiBzdHJpbmdbXTtcclxuICBvblZhbHVlQ2hhbmdlZD86IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlZhbHVlQ2hhbmdlZEV2ZW50KSA9PiB2b2lkO1xyXG4gIG9uVXBsb2FkU3RhcnRlZD86IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZFN0YXJ0ZWRFdmVudCkgPT4gdm9pZDtcclxuICBvblVwbG9hZGVkPzogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVXBsb2FkZWRFdmVudCkgPT4gdm9pZDtcclxuICBzZWxlY3RCdXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIGNzc0NsYXNzPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZGVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1heEZpbGVTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhY2NlcHRlZEZpbGVUeXBlczogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiBzdHJpbmdbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVmFsdWVDaGFuZ2VkOiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5WYWx1ZUNoYW5nZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXBsb2FkU3RhcnRlZDogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVXBsb2FkU3RhcnRlZEV2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25VcGxvYWRlZDogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVXBsb2FkZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNzc0NsYXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RCdXR0b25UZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZmlsZVVwbG9hZGVyOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRmlsZVVwbG9hZGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5jc3NDbGFzcyA9IG9wdGlvbnMuY3NzQ2xhc3M7XHJcbiAgICB0aGlzLm1heEZpbGVTaXplID0gb3B0aW9ucy5tYXhGaWxlU2l6ZTtcclxuICAgIHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMgPSBvcHRpb25zLmFjY2VwdGVkRmlsZVR5cGVzO1xyXG4gICAgdGhpcy5zZWxlY3RCdXR0b25UZXh0ID0gb3B0aW9ucy5zZWxlY3RCdXR0b25UZXh0O1xyXG4gICAgdGhpcy5hbGxvd2VkRmlsZUV4dGVuc2lvbnMgPSBvcHRpb25zLmFsbG93ZWRGaWxlRXh0ZW5zaW9ucztcclxuICAgIHRoaXMub25WYWx1ZUNoYW5nZWQgPSBvcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgdGhpcy5vblVwbG9hZFN0YXJ0ZWQgPSBvcHRpb25zLm9uVXBsb2FkU3RhcnRlZDtcclxuICAgIHRoaXMub25VcGxvYWRlZCA9IG9wdGlvbnMub25VcGxvYWRlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCAkZmlsZVVwbG9hZGVyID0gJCgnPGRpdiAvPicpO1xyXG4gICAgaWYgKHRoaXMuY3NzQ2xhc3MpIHtcclxuICAgICAgJGZpbGVVcGxvYWRlci5hZGRDbGFzcyh0aGlzLmNzc0NsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlciA9ICRmaWxlVXBsb2FkZXIuZHhGaWxlVXBsb2FkZXIoe1xyXG4gICAgICBzZWxlY3RCdXR0b25UZXh0OiB0aGlzLnNlbGVjdEJ1dHRvblRleHQsXHJcbiAgICAgIGxhYmVsVGV4dDogJycsXHJcbiAgICAgIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogdGhpcy5hbGxvd2VkRmlsZUV4dGVuc2lvbnMsXHJcbiAgICAgIGFjY2VwdDogdGhpcy5hY2NlcHRlZEZpbGVUeXBlcyxcclxuICAgICAgdXBsb2FkTW9kZTogJ3VzZUZvcm0nLFxyXG4gICAgICBtYXhGaWxlU2l6ZTogdGhpcy5tYXhGaWxlU2l6ZSxcclxuICAgICAgc2hvd0ZpbGVMaXN0OiBmYWxzZSxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCdsYWJlbFRleHQnLCBlLnZhbHVlWzBdID8gZS52YWx1ZVswXS5uYW1lIDogJycpO1xyXG4gICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQ/LihlKTtcclxuICAgICAgfSxcclxuICAgICAgb25VcGxvYWRTdGFydGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuZWxlbWVudC5maW5kKCcuZHgtZmlsZXVwbG9hZGVyLXVwbG9hZC1idXR0b24nKS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5vblVwbG9hZFN0YXJ0ZWQ/LihlKTtcclxuICAgICAgfSxcclxuICAgICAgb25VcGxvYWRlZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLm9uVXBsb2FkZWQ/LihlKTtcclxuICAgICAgfSxcclxuICAgIH0pLmR4RmlsZVVwbG9hZGVyKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmQodGhpcy5maWxlVXBsb2FkZXIuZWxlbWVudCgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGxvYWQ8VD4odXBsb2FkVXJsOiBzdHJpbmcsIHBhcmFtcz86IGFueSk6IFByb21pc2U8VD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgZmQgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgY29uc3QgZmlsZSA9ICh0aGlzLmZpbGVVcGxvYWRlci5lbGVtZW50KCkuZmluZCgnaW5wdXQnKVswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlc1swXTtcclxuXHJcbiAgICAgIGZkLmFwcGVuZCgnZmlsZScsIGZpbGUpO1xyXG5cclxuICAgICAgLyogZXNsaW50IGd1YXJkLWZvci1pbjogb2ZmICovXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZm9yaW5cclxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhcmFtcykge1xyXG4gICAgICAgIGZkLmFwcGVuZChwcm9wLCBwYXJhbXNbcHJvcF0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAkLmFqYXgoe1xyXG4gICAgICAgIHVybDogdXBsb2FkVXJsLFxyXG4gICAgICAgIHR5cGU6ICdwb3N0JyxcclxuICAgICAgICBkYXRhOiBmZCxcclxuICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXHJcbiAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxyXG4gICAgICAgIHN1Y2Nlc3M6IChyZXNwb25zZTogSUFwaVJlc3BvbnNlPFQ+KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UuUmVxdWVzdFN0YXRlID09PSBSZXF1ZXN0U3RhdGUuQ29tcGxldGVkKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuRGF0YSBhcyBhbnkpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlKSA9PiByZWplY3QoJ1Vua25vd24gZXJyb3InKVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4uLy4uL1dpZGdldHMvTm90aWZ5JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyIH0gZnJvbSAnLi4vRmlsZVVwbG9hZGVyL0luZGV4JztcclxuaW1wb3J0IHsgSUZpbGVJbXBvcnRlckNvbHVtbkluZm8sIElGaWxlSW1wb3J0ZXJUYWJsZU1ldGFkYXRhIH0gZnJvbSAnLi9JRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YSc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9VdGlscy9FdmVudEVtaXR0ZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZUltcG9ydGVyVGFibGVJbmZvIHtcclxuICBzY2hlbWE6IHN0cmluZztcclxuICB0YWJsZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlSW1wb3J0ZXJPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgY3JlYXRlVGFibGVVcmw6IHN0cmluZztcclxuICBhZGRSb3dzVXJsOiBzdHJpbmc7XHJcbiAgZ2V0VGFibGVzTGlzdFVybD86IHN0cmluZztcclxuICBwcmVkZWZpbmVkVGFibGU/OiBJRmlsZUltcG9ydGVyVGFibGVJbmZvO1xyXG4gIHByZWRlZmluZWRJbXBvcnRGaWxlTW9kZT86IEltcG9ydEZpbGVNb2RlO1xyXG4gIGNyZWF0ZVRhYmxlQnV0dG9uVGV4dD86IHN0cmluZztcclxuICB1cGRhdGVUYWJsZUJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgY3JlYXRlVGFibGVNb2RlVGV4dD86IHN0cmluZztcclxuICB1cGRhdGVUYWJsZU1vZGVUZXh0Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBJbXBvcnRGaWxlTW9kZSB7XHJcbiAgQ3JlYXRlTmV3VGFibGUgPSAwLFxyXG4gIEFkZE5ld1Jvd3MgPSAxXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGaWxlSW1wb3J0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVEFCTEVfVVBEQVRFRF9FVkVOVCA9ICdmaWxlLWltcG9ydGVyLXRhYmxlLXVwZGF0ZWQtZXZlbnQnO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVVcGxvYWRVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUm93c1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZGVmaW5lZFRhYmxlOiBJRmlsZUltcG9ydGVyVGFibGVJbmZvIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0VGFibGVzTGlzdFVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuQ2hhbmdlTW9kZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZVRhYmxlQnV0dG9uVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVGFibGVCdXR0b25UZXh0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZU1vZGVUZXh0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVUYWJsZU1vZGVUZXh0OiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBwcml2YXRlIGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtO1xyXG4gIHByaXZhdGUgZmlsZVVwbG9hZGVyOiBGaWxlVXBsb2FkZXI7XHJcbiAgcHJpdmF0ZSBkYXRhR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHByaXZhdGUgYWN0aW9uQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uO1xyXG4gIHByaXZhdGUgcm93c0NvdW50ZXJDb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJvd3NDb3VudGVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSBtb2RlOiBJbXBvcnRGaWxlTW9kZTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRVcmwgPSBvcHRpb25zLmZpbGVVcGxvYWRVcmw7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLnRpdGxlID0gb3B0aW9ucy50aXRsZTtcclxuICAgIHRoaXMuZ2V0VGFibGVzTGlzdFVybCA9IG9wdGlvbnMuZ2V0VGFibGVzTGlzdFVybDtcclxuICAgIHRoaXMuY3JlYXRlVGFibGVVcmwgPSBvcHRpb25zLmNyZWF0ZVRhYmxlVXJsO1xyXG4gICAgdGhpcy5hZGRSb3dzVXJsID0gb3B0aW9ucy5hZGRSb3dzVXJsO1xyXG4gICAgdGhpcy5wcmVkZWZpbmVkVGFibGUgPSBvcHRpb25zLnByZWRlZmluZWRUYWJsZTtcclxuICAgIHRoaXMuY2FuQ2hhbmdlTW9kZSA9IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlID09PSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLm1vZGUgPSBvcHRpb25zLnByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUgOiBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZTtcclxuICAgIHRoaXMuY3JlYXRlVGFibGVCdXR0b25UZXh0ID0gb3B0aW9ucy5jcmVhdGVUYWJsZUJ1dHRvblRleHQgfHwgJ0NyZWF0ZSBUYWJsZSc7XHJcbiAgICB0aGlzLnVwZGF0ZVRhYmxlQnV0dG9uVGV4dCA9IG9wdGlvbnMudXBkYXRlVGFibGVCdXR0b25UZXh0IHx8ICdBZGQgTmV3IFJvd3MnO1xyXG4gICAgdGhpcy5jcmVhdGVUYWJsZU1vZGVUZXh0ID0gb3B0aW9ucy5jcmVhdGVUYWJsZU1vZGVUZXh0IHx8ICdDcmVhdGUgVGFibGUnO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZU1vZGVUZXh0ID0gb3B0aW9ucy51cGRhdGVUYWJsZU1vZGVUZXh0IHx8ICdBZGQgTmV3IFJvd3MnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3coKSB7XHJcbiAgICB0aGlzLnBvcHVwID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcilcclxuICAgICAgLmR4UG9wdXAoe1xyXG4gICAgICAgIHNob3dUaXRsZTogdHJ1ZSxcclxuICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICBkcmFnRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgcmVzaXplRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICAgIGZ1bGxTY3JlZW46IHRydWUsXHJcbiAgICAgICAgbWF4V2lkdGg6IDEzMDAsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiA4MDAsXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgJHNjcm9sbFZpZXcgPSAkKCc8ZGl2IC8+Jyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5jcmVhdGVGb3JtKCk7XHJcbiAgICAgICAgICAkc2Nyb2xsVmlldy5hcHBlbmQodGhpcy5mb3JtLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgJHNjcm9sbFZpZXcuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcclxuICAgICAgICAgIH0pLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdG9vbGJhckl0ZW1zOiBbe1xyXG4gICAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgdGV4dDogdGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KCksXHJcbiAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcclxuICAgICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbiA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGUoKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRSb3dzVG9UYWJsZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnBvcHVwLmhpZGUoKVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgIH1dXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHRoaXMucG9wdXAuc2hvdygpO1xyXG4gICAgdGhpcy5vbk1vZGVTd2l0Y2hpbmcoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgaWYgKHRoaXMucG9wdXApIHtcclxuICAgICAgdGhpcy5wb3B1cC5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKTogRGV2RXhwcmVzcy51aS5keEZvcm0ge1xyXG4gICAgY29uc3QgZm9ybSA9ICQoJzxkaXY+JykuZHhGb3JtKHtcclxuICAgICAgc2hvd0NvbG9uQWZ0ZXJMYWJlbDogdHJ1ZSxcclxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXHJcbiAgICAgIGNvbENvdW50QnlTY3JlZW46IHsgbWQ6IDQsIHNtOiAxIH0sXHJcbiAgICAgIHNjcmVlbkJ5V2lkdGg6ICh3aWR0aCkgPT4gd2lkdGggPCAxMjU2ID8gJ3NtJyA6ICdtZCcsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ01vZGUnLFxyXG4gICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICB0ZW1wbGF0ZTogKF9kYXRhLCAkY29udGFpbmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZU1vZGVTd2l0Y2hlcigkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTY2hlbWEnLFxyXG4gICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgIGRpc2FibGVkOiAhdGhpcy5jYW5DaGFuZ2VNb2RlXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCcsXHJcbiAgICAgICAgfV1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ1RhYmxlJyxcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZVxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUYWJsZVNlbGVjdG9yJyxcclxuICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgdGV4dDogJ1RhYmxlJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICBjb2xTcGFuOiAyLFxyXG4gICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICAgIHN0b3JlOiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICAgIGxvYWRVcmw6IHRoaXMuZ2V0VGFibGVzTGlzdFVybCxcclxuICAgICAgICAgICAgICBsb2FkUGFyYW1zOiB7IGNvbnRleHROYW1lOiAnJywgdGFibGVzT25seTogdHJ1ZSwgaXNXYXJlaG91c2VDb250ZXh0OiB0cnVlIH0sXHJcbiAgICAgICAgICAgICAgbG9hZE1ldGhvZDogJ3Bvc3QnLFxyXG4gICAgICAgICAgICAgIG5vdGlmeUVycm9yOiBmYWxzZVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgcGFnaW5hdGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBzb3J0OiAndGhpcycsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHNlYXJjaEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCcsXHJcbiAgICAgICAgfV1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ1NvdXJjZSBGaWxlJyxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVGaWxlc1VwbG9hZGVyKCRjb250YWluZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ0NvbHVtbnMgU2VsZWN0b3InLFxyXG4gICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29sU3BhbjogNCxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVEYXRhR3JpZCgkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1dXHJcbiAgICB9KS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1vZGVTd2l0Y2hlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgICQoJzxkaXYgLz4nKS5keEJ1dHRvbkdyb3VwKHtcclxuICAgICAgaXRlbXM6IFt7XHJcbiAgICAgICAgdGV4dDogdGhpcy5jcmVhdGVUYWJsZU1vZGVUZXh0LFxyXG4gICAgICAgIGljb246ICdpbnNlcnR0YWJsZScsXHJcbiAgICAgICAgdmFsdWU6IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICB0ZXh0OiB0aGlzLnVwZGF0ZVRhYmxlTW9kZVRleHQsXHJcbiAgICAgICAgaWNvbjogJ2luc2VydHJvd2JlbG93JyxcclxuICAgICAgICB2YWx1ZTogSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93c1xyXG4gICAgICB9XSBhcyBhbnksXHJcbiAgICAgIGtleUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgIGRpc2FibGVkOiAhdGhpcy5jYW5DaGFuZ2VNb2RlLFxyXG4gICAgICBzdHlsaW5nTW9kZTogJ291dGxpbmVkJyxcclxuICAgICAgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScsXHJcbiAgICAgIHNlbGVjdGVkSXRlbUtleXM6IFt0aGlzLm1vZGVdLFxyXG4gICAgICBvbkl0ZW1DbGljazogKGUpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSBlLml0ZW1EYXRhLnZhbHVlO1xyXG4gICAgICAgIHRoaXMub25Nb2RlU3dpdGNoaW5nKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsZXNVcGxvYWRlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIHRoaXMuZmlsZVVwbG9hZGVyID0gbmV3IEZpbGVVcGxvYWRlcih7XHJcbiAgICAgICRjb250YWluZXIsXHJcbiAgICAgIGNzc0NsYXNzOiAndGFibGUtY3JlYXRvcl9fdXBsb2FkJyxcclxuICAgICAgbWF4RmlsZVNpemU6IDEwICogMTAwMDAwMCxcclxuICAgICAgYWNjZXB0ZWRGaWxlVHlwZXM6ICcueGxzLCAueGxzeCcsXHJcbiAgICAgIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogWycueGxzJywgJy54bHN4J10sXHJcbiAgICAgIHNlbGVjdEJ1dHRvblRleHQ6ICdTZWxlY3QgRXhjZWwgZmlsZScsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1BhcnNpbmcgc2VsZWN0ZWQgZmlsZS4uLicpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxJRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YT4odGhpcy5maWxlVXBsb2FkVXJsKS50aGVuKCh0YWJsZU1ldGEpID0+IHtcclxuICAgICAgICAgIGlmICh0YWJsZU1ldGEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRSb3dzQ291bnQodGFibGVNZXRhLlJvd3NDb3VudCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICAgIHN0b3JlOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxyXG4gICAgICAgICAgICAgICAga2V5OiAnSWQnLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogdGFibGVNZXRhLkNvbHVtbnNcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHBhZ2luYXRlOiBmYWxzZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgIG5vdGlmeShgUGFyc2luZyBFcnJvciA6ICR7ZX1gLCBmYWxzZSk7XHJcbiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlci5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGF0YUdyaWQoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICBjb25zdCBncmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9IHtcclxuICAgICAgbm9EYXRhVGV4dDogJ1NlbGVjdCBFeGNlbCBGaWxlJyxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICBmaWx0ZXJSb3c6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBzb3J0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgIHBhZ2VTaXplOiAxMDAwMCxcclxuICAgICAgICBlbmFibGVkOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICB9LFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogW3tcclxuICAgICAgICBkYXRhRmllbGQ6ICdJZCcsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTZWxlY3RlZCcsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdJc0tleUNvbHVtbicsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICBjYXB0aW9uOiAnQ29sdW1uIE5hbWUnXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUeXBlJyxcclxuICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdJc051bGxhYmxlJyxcclxuICAgICAgICBhbGxvd0VkaXRpbmc6IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUgJiYgdGhpcy5jYW5DaGFuZ2VNb2RlLFxyXG4gICAgICAgIHNldENlbGxWYWx1ZTogKG5ld0RhdGEsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBuZXdEYXRhLklzTnVsbGFibGUgPSB2YWx1ZTtcclxuICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBuZXdEYXRhLklzS2V5Q29sdW1uID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG4gICAgICAgIHRvb2xiYXJJdGVtcy5wdXNoKHtcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCd0YWJsZS1jcmVhdG9yX190YWJsZS1oZWFkZXInKVxyXG4gICAgICAgICAgICAgICAgLnRleHQoJ1BhcnNlZCBGaWxlIE1ldGFkYXRhJyksXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZSdcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJvd3NDb3VudGVyID0gJCgnPHNwYW4+JykudGV4dCgnMTAwMCcpO1xyXG4gICAgICAgICAgICB0aGlzLnJvd3NDb3VudGVyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JykudGV4dCgnUm93cyBDb3VudDogJyksIHRoaXMucm93c0NvdW50ZXIpLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvd3NDb3VudGVyQ29udGFpbmVyO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgPT09ICdkYXRhUm93JyAmJiBlLmRhdGFGaWVsZCA9PT0gJ0lzS2V5Q29sdW1uJykge1xyXG4gICAgICAgICAgY29uc3QgZWRpdG9yT3B0aW9ucyA9IGUuZWRpdG9yT3B0aW9ucyBhcyBEZXZFeHByZXNzLnVpLmR4Q2hlY2tCb3hPcHRpb25zO1xyXG4gICAgICAgICAgZWRpdG9yT3B0aW9ucy5kaXNhYmxlZCA9IGUucm93LmRhdGEuSXNOdWxsYWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5kYXRhR3JpZCA9IGRlZmF1bHRHcmlkKCQoJzxkaXYgLz4nKSwge1xyXG4gICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgc3VtbWFyeUNvbHVtbjogJ05hbWUnLFxyXG4gICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICBzZXREZWZhdWx0Q29sdW1uV2lkdGg6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICAkY29udGFpbmVyLmFwcGVuZCh0aGlzLmRhdGFHcmlkLmVsZW1lbnQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVRhYmxlKCkge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuZm9ybS52YWxpZGF0ZSgpO1xyXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICBjb25zdCBkcyA9IHRoaXMuZGF0YUdyaWQuZ2V0RGF0YVNvdXJjZSgpO1xyXG4gICAgICBpZiAoIWRzKSB7XHJcbiAgICAgICAgbm90aWZ5KCdTZWxlY3QgZmlsZSB3aXRoIGRhdGEnLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29sdW1ucyA9IGRzLml0ZW1zKCk7XHJcbiAgICAgIGlmICghdGhpcy5hcmVDb2x1bW5zVmFsaWQoY29sdW1ucykpIHtcclxuICAgICAgICBub3RpZnkoJ0F0IGxlYXN0IDEga2V5IGNvbHVtbiBtdXN0IGJlIHNldCcsIGZhbHNlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykuU2NoZW1hLFxyXG4gICAgICAgICAgdGFibGU6IHRoaXMuZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykuVGFibGUsXHJcbiAgICAgICAgICBjb2x1bW5zOiBKU09OLnN0cmluZ2lmeShjb2x1bW5zKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0NyZWF0aW5nIGFuZCBmaWxsaW5nIERCIHRhYmxlLi4uJyk7XHJcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkZXIudXBsb2FkPGJvb2xlYW4+KHRoaXMuY3JlYXRlVGFibGVVcmwsIHBhcmFtcykudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvcHVwLmhpZGUoKTtcclxuICAgICAgICAgICAgbm90aWZ5KGBUaGUgdGFibGUgWyR7cGFyYW1zLnNjaGVtYX1dLlske3BhcmFtcy50YWJsZX1dIGhhcyBiZWVuIGNyZWF0ZWRgLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KEZpbGVJbXBvcnRlci5UQUJMRV9VUERBVEVEX0VWRU5UKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5vdGlmeSgnVGhlIHRhYmxlIGhhcyBub3QgYmVlbiBjcmVhdGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBub3RpZnkoYFRhYmxlIGNyZWF0aW5nIGVycm9yOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkUm93c1RvVGFibGUoKSB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5mb3JtLnZhbGlkYXRlKCk7XHJcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XHJcbiAgICAgIGNvbnN0IGRzID0gdGhpcy5kYXRhR3JpZC5nZXREYXRhU291cmNlKCk7XHJcbiAgICAgIGlmICghZHMpIHtcclxuICAgICAgICBub3RpZnkoJ1NlbGVjdCBmaWxlIHdpdGggZGF0YScsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBjb2x1bW5zID0gZHMuaXRlbXMoKTtcclxuICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgIHRhYmxlOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlRhYmxlU2VsZWN0b3IsXHJcbiAgICAgICAgY29sdW1uczogSlNPTi5zdHJpbmdpZnkoY29sdW1ucylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0FkZGluZyByb3dzIHRvIERCIHRhYmxlLi4uJyk7XHJcbiAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxib29sZWFuPih0aGlzLmFkZFJvd3NVcmwsIHBhcmFtcykudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2UgPT09IHRydWUpIHtcclxuICAgICAgICAgIHRoaXMucG9wdXAuaGlkZSgpO1xyXG4gICAgICAgICAgbm90aWZ5KGBUaGUgdGFibGUgJHtwYXJhbXMudGFibGV9IGhhcyBiZWVuIHVwZGF0ZWRgLCB0cnVlKTtcclxuICAgICAgICAgIHRoaXMuZW1pdChGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5vdGlmeSgnVGhlIHRhYmxlIGhhcyBub3QgYmVlbiB1cGRhdGVkJywgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICBub3RpZnkoYFRhYmxlIHVwZGF0aW5nIGVycm9yOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uTW9kZVN3aXRjaGluZygpIHtcclxuICAgIGNvbnN0IGlzQ3JlYXRlVGFibGVNb2RlID0gdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZTtcclxuXHJcbiAgICB0aGlzLmFjdGlvbkJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLmdldEFjdGlvbkJ1dHRvblRleHQoKSk7XHJcbiAgICB0aGlzLmRhdGFHcmlkLmNvbHVtbk9wdGlvbignSXNLZXlDb2x1bW4nLCAndmlzaWJsZScsIGlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgIHRoaXMuZGF0YUdyaWQuY29sdW1uT3B0aW9uKCdJc051bGxhYmxlJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmNhbkNoYW5nZU1vZGUpIHtcclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1NjaGVtYScsICd2aXNpYmxlJywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZm9ybS51cGRhdGVEYXRhKCdTY2hlbWEnLCB0aGlzLnByZWRlZmluZWRUYWJsZS5zY2hlbWEpO1xyXG5cclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1RhYmxlJywgJ3Zpc2libGUnLCB0cnVlKTtcclxuICAgICAgdGhpcy5mb3JtLnVwZGF0ZURhdGEoJ1RhYmxlJywgdGhpcy5wcmVkZWZpbmVkVGFibGUudGFibGUpO1xyXG5cclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1RhYmxlU2VsZWN0b3InLCAndmlzaWJsZScsIGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdTY2hlbWEnLCAndmlzaWJsZScsIGlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1RhYmxlJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZVNlbGVjdG9yJywgJ3Zpc2libGUnLCAhaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRBY3Rpb25CdXR0b25UZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZSA/IHRoaXMuY3JlYXRlVGFibGVCdXR0b25UZXh0IDogdGhpcy51cGRhdGVUYWJsZUJ1dHRvblRleHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFyZUNvbHVtbnNWYWxpZChjb2x1bW5zOiBJRmlsZUltcG9ydGVyQ29sdW1uSW5mb1tdKSB7XHJcbiAgICByZXR1cm4gY29sdW1ucy5maWx0ZXIoKGMpID0+IGMuU2VsZWN0ZWQpLnNvbWUoKHMpID0+IHMuSXNLZXlDb2x1bW4pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRSb3dzQ291bnQoY291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lci5zaG93KCk7XHJcbiAgICB0aGlzLnJvd3NDb3VudGVyLnRleHQoY291bnQpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZERpc3BsYXlzTWFuYWdlciB9IGZyb20gJy4vR3JpZERpc3BsYXlzTWFuYWdlcic7XHJcbmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIgfSBmcm9tICcuL0dyaWRWaWV3c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIgfSBmcm9tICcuL0dyaWRGaWx0ZXJzTWFuYWdlcic7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4uLy4uL0J1c2luZXNzJztcclxuaW1wb3J0IHsgRmlsZUltcG9ydGVyLCBJRmlsZUltcG9ydGVyVGFibGVJbmZvLCBJbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvRmlsZUltcG9ydGVyL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlck9wdGlvbnMge1xyXG4gIG1vZGU6IENkbUltcG9ydEZpbGVNb2RlO1xyXG4gIGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XHJcbiAgYWRkUm93c1VybDogc3RyaW5nO1xyXG4gIGZpbGVVcGxvYWRVcmw6IHN0cmluZztcclxuICBwcmVkZWZpbmVkVGFibGU6IElGaWxlSW1wb3J0ZXJUYWJsZUluZm87XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcmVhZG9ubHkgZWRpdE1vZGU6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgZ3JpZERpc3BsYXlzTWFuYWdlcjogR3JpZERpc3BsYXlzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGltcG9ydEZpbGVPcHRpb25zPzogSUZpbGVJbXBvcnRlck9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZERpc3BsYXlzTWFuYWdlcjogR3JpZERpc3BsYXlzTWFuYWdlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGltcG9ydEZpbGVPcHRpb25zOiBJRmlsZUltcG9ydGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBkaXNwbGF5c0Ryb3Bkb3duQm94OiBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY3VycmVudERpc3BsYXlUaXRsZTogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzYXZlQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZUFzQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbGVJbXBvcnRlcjogRmlsZUltcG9ydGVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZGlzcGxheXNUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2ltcG9ydEZpbGVUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCkge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZERpc3BsYXlzTWFuYWdlcjtcclxuICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlcjtcclxuICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyID0gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgICB0aGlzLmltcG9ydEZpbGVPcHRpb25zID0gb3B0aW9ucy5pbXBvcnRGaWxlT3B0aW9ucztcclxuXHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIub25EaXNwbGFpc0xvYWRlZCA9IChkaXNwbGF5cykgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5BcnJheVN0b3JlKHtcclxuICAgICAgICBrZXk6ICdJZCcsXHJcbiAgICAgICAgZGF0YTogZGlzcGxheXNcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3ggJiYgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG5cclxuICAgICAgdGhpcy5kYXRhR3JpZCAmJiB0aGlzLmRhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgICB0aGlzLmRhdGFHcmlkICYmIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIub25EaXNwbGF5Q2hhbmdlZCA9IChkaXNwbGF5KSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveCAmJiB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIGRpc3BsYXkgPyBkaXNwbGF5LklkIDogbnVsbCk7XHJcbiAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSAmJiB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUub3B0aW9uKCd2YWx1ZScsIGRpc3BsYXkgPyBkaXNwbGF5Lk5hbWUgOiBudWxsKTtcclxuICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlICYmIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG4gICAgICB0aGlzLnNhdmVBc0J1dHRvbiAmJiB0aGlzLnNhdmVBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG4gICAgICB0aGlzLnNhdmVCdXR0b24gJiYgdGhpcy5zYXZlQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhZGlzcGxheSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5kYXRhR3JpZCkge1xyXG4gICAgICAgIGRpc3BsYXlcclxuICAgICAgICAgID8gdGhpcy5kYXRhR3JpZC5zZWxlY3RSb3dzKFtkaXNwbGF5LklkXSwgZmFsc2UpXHJcbiAgICAgICAgICA6IHRoaXMuZGF0YUdyaWQuZGVzZWxlY3RBbGwoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhclByZXBhcmluZyA9IGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnKTtcclxuXHJcbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBjdXJyZW50VG9vbGJhclByZXBhcmluZyAmJiBjdXJyZW50VG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMgJiYgZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdJdGVtcyA9IFt0aGlzLmRpc3BsYXlzVG9vbGJhckl0ZW1dO1xyXG5cclxuICAgIGlmICh0aGlzLmltcG9ydEZpbGVPcHRpb25zICYmIHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMubW9kZSAhPT0gQ2RtSW1wb3J0RmlsZU1vZGUuTm9uZSkge1xyXG4gICAgICBuZXdJdGVtcy5wdXNoKHRoaXMuaW1wb3J0RmlsZVRvb2xiYXJJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICB0b29sYmFySXRlbXMuc3BsaWNlKDEsIDAsIC4uLm5ld0l0ZW1zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93VXBkYXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgYWxsb3dEZWxldGluZzogdGhpcy5vcHRpb25zLmVkaXRNb2RlLFxyXG4gICAgICAgICAgbW9kZTogJ3JvdycsXHJcbiAgICAgICAgICB1c2VJY29uczogdHJ1ZSxcclxuICAgICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1EZWxldGVNZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGRpc3BsYXk/J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbG9hZFBhbmVsOiB7XHJcbiAgICAgICAgICBzaGFkaW5nOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbkF1dG9XaWR0aDogdHJ1ZSxcclxuICAgICAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgY29sdW1uczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0Rpc3BsYXknXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdGaWx0ZXJJZCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdEYXRhIFNldCcsXHJcbiAgICAgICAgICAgIGxvb2t1cDoge1xyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ1ZpZXdJZCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdWaWV3JyxcclxuICAgICAgICAgICAgbG9va3VwOiB7XHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZSdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7XHJcbiAgICAgICAgICBlZGl0T25LZXlQcmVzczogZmFsc2UsXHJcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NvbHVtbkhlYWRlcnM6IHRydWUsXHJcbiAgICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dCb3JkZXJzOiBmYWxzZSxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSA/ICdjYWxjKDEwMCUgLSA1MXB4KScgOiAnMTAwJScsXHJcbiAgICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICdzdGFuZGFyZCcgfSxcclxuICAgICAgICBwYWdpbmc6IHsgZW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gZGlzcGxheXMnLFxyXG4gICAgICAgIG9uSW5pdGlhbGl6ZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gYXdhaXQgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuZ2V0RmlsdGVycygpO1xyXG4gICAgICAgICAgY29uc3Qgdmlld3MgPSBhd2FpdCB0aGlzLmdyaWRWaWV3c01hbmFnZXIuZ2V0Vmlld3MoKTtcclxuXHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oJ0ZpbHRlcklkJywgJ2xvb2t1cC5kYXRhU291cmNlJywgZmlsdGVycyk7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oJ1ZpZXdJZCcsICdsb29rdXAuZGF0YVNvdXJjZScsIHZpZXdzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbENsaWNrOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUucm93VHlwZSAhPT0gJ2RhdGEnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndmFsdWUnLCBlLmRhdGEuSWQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dSZW1vdmluZzogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuZGVsZXRlRGlzcGxheShlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGlzcGxheXNUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xyXG4gICAgY29uc3QgYmFzaWNPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXMgfCBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3guUHJvcGVydGllcyA9IHtcclxuICAgICAgdmFsdWVFeHByOiAnSWQnLFxyXG4gICAgICBkaXNwbGF5RXhwcjogJ05hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnTm9uZScsXHJcbiAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94ID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmdldERpc3BsYXlzKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbHRlckNoYW5nZWQgPSBkaXNwbGF5ICYmIGRpc3BsYXkuRmlsdGVySWQgIT09IHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZDtcclxuICAgICAgICBjb25zdCB2aWV3Q2hhbmdlZCA9IGRpc3BsYXkgJiYgZGlzcGxheS5WaWV3SWQgIT09IHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkO1xyXG5cclxuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCAoZmlsdGVyQ2hhbmdlZCB8fCB2aWV3Q2hhbmdlZFxyXG4gICAgICAgICAgPyB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpXHJcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSh0cnVlKSk7XHJcblxyXG4gICAgICAgIGlmIChjb25maXJtZWQpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheUlkID0gZS52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZHJvcERvd25Cb3hPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3hPcHRpb25zID0ge1xyXG4gICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICB3aWR0aDogODAwXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogIXRoaXMub3B0aW9ucy5lZGl0TW9kZSA/IHZvaWQgMCA6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZCA9IHRoaXMuY3JlYXRlRGF0YUdyaWQoZS5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSA9IHRoaXMuY3JlYXRlQ3VycmVudERpc3BsYXlUaXRsZShlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0J1dHRvbigpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUFzQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudEhlYWRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX2hlYWRlcicpXHJcbiAgICAgICAgICAuYXBwZW5kKHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5lbGVtZW50KCkpXHJcbiAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZUJ1dHRvbi5lbGVtZW50KCkpXHJcbiAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZUFzQnV0dG9uLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJzEwMCUnKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lZGl0TW9kZSkge1xyXG4gICAgICAgICAgZHJvcGRvd25Db250ZW50LmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZHJvcGRvd25Db250ZW50LmFwcGVuZCh0aGlzLmRhdGFHcmlkLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkcm9wZG93bkNvbnRlbnQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uT3BlbmVkOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zYXZlQXNCdXR0b24gJiYgdGhpcy5zYXZlQXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiAmJiB0aGlzLnNhdmVCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gKCdkeERyb3BEb3duQm94JyBhcyBhbnkpIDogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdEaXNwbGF5cycsXHJcbiAgICAgIGNzc0NsYXNzOiAnYXBzLWRpc3BsYXlzX190b29sYmFyLWl0ZW0nLFxyXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyAkLmV4dGVuZChiYXNpY09wdGlvbnMsIGRyb3BEb3duQm94T3B0aW9ucykgOiBiYXNpY09wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUltcG9ydEZpbGVUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGljb246ICd1cGxvYWQnLFxyXG4gICAgICAgIGhpbnQ6ICdJbXBvcnQgZmlsZScsXHJcbiAgICAgICAgaGVpZ2h0OiAzMCxcclxuICAgICAgICBzdHlsaW5nTW9kZTogJ3RleHQnLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmZpbGVJbXBvcnRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVJbXBvcnRlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIgPSBuZXcgRmlsZUltcG9ydGVyKHtcclxuICAgICAgICAgICAgJGNvbnRhaW5lcjogdGhpcy5vcHRpb25zLm93bmVyLmVsZW1lbnQoKS5wYXJlbnQoKSxcclxuICAgICAgICAgICAgdGl0bGU6ICdJbXBvcnQgRmlsZSB0byBDRE0nLFxyXG4gICAgICAgICAgICBjcmVhdGVUYWJsZVVybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5jcmVhdGVUYWJsZVVybCxcclxuICAgICAgICAgICAgYWRkUm93c1VybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5hZGRSb3dzVXJsLFxyXG4gICAgICAgICAgICBmaWxlVXBsb2FkVXJsOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLmZpbGVVcGxvYWRVcmwsXHJcbiAgICAgICAgICAgIHByZWRlZmluZWRJbXBvcnRGaWxlTW9kZTogdGhpcy5nZXRQcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUodGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5tb2RlKSxcclxuICAgICAgICAgICAgcHJlZGVmaW5lZFRhYmxlOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLnByZWRlZmluZWRUYWJsZSxcclxuICAgICAgICAgICAgY3JlYXRlVGFibGVCdXR0b25UZXh0OiAnUmVwbGFjZSBBbGwgUm93cycsXHJcbiAgICAgICAgICAgIGNyZWF0ZVRhYmxlTW9kZVRleHQ6ICdSZXBsYWNlIFJvd3MnLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIub24oRmlsZUltcG9ydGVyLlRBQkxFX1VQREFURURfRVZFTlQsICgpID0+IHRoaXMub3B0aW9ucy5vd25lci5yZWZyZXNoKCkpO1xyXG4gICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIuc2hvdygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgICAgICBlLmVsZW1lbnQuZmluZCgnLmR4LWJ1dHRvbi1jb250ZW50JykuY3NzKHtcclxuICAgICAgICAgICAgcGFkZGluZ1RvcDogNSxcclxuICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogNVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUobW9kZTogQ2RtSW1wb3J0RmlsZU1vZGUpOiBJbXBvcnRGaWxlTW9kZSB7XHJcbiAgICBzd2l0Y2ggKG1vZGUpIHtcclxuICAgICAgY2FzZSBDZG1JbXBvcnRGaWxlTW9kZS5BZGROZXdSb3dzOlxyXG4gICAgICAgIHJldHVybiBJbXBvcnRGaWxlTW9kZS5BZGROZXdSb3dzO1xyXG5cclxuICAgICAgY2FzZSBDZG1JbXBvcnRGaWxlTW9kZS5SZXBsYWNlQWxsUm93czpcclxuICAgICAgICByZXR1cm4gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbW9kZScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDdXJyZW50RGlzcGxheVRpdGxlKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX2N1cnJlbnQtZGlzcGxheSBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgdmFsdWU6IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd0ZXh0JykgfHwgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3BsYWNlaG9sZGVyJyksXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXksXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1kaXNwbGF5c19fc2F2ZS1kaXNwbGF5IGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdTYXZlJyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheSxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci51cGRhdGVDdXJyZW50RGlzcGxheShcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLm9wdGlvbigndmFsdWUnKSxcclxuICAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICdzYXZlJyxcclxuICAgICAgICB3aWR0aDogMTI1XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheV9fc2F2ZS1kaXNwbGF5LWFzIGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdTYXZlIEFzJyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiAoXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNhdmVBc0RpYWxvZygpXHJcbiAgICAgICAgKSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDE2MFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVBc0RpYWxvZygpIHtcclxuICAgIGNvbnN0ICRwb3B1cENvbnRlbnQgPSAkKCc8ZGl2IC8+Jyk7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nQ29udGVudEVsZW1lbnQgPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCIgLz4nKS5keFRleHRCb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ0Rpc3BsYXkgTmFtZScsXHJcbiAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgIH0pLmR4VmFsaWRhdG9yKHtcclxuICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnIH0sXHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG4gICAgY29uc3QgbmFtZVRleHRCb3ggPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFZhbGlkYXRvcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICBuYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZURpYWxvZyhcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiAnQ3JlYXRlIE5ldyBEaXNwbGF5JyxcclxuICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIG1heFdpZHRoOiAnMzAwcHgnLFxyXG4gICAgICB9LFxyXG4gICAgICAkcG9wdXBDb250ZW50LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ09rJyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoY2xvc2VQb3B1cCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF2YWxpZGF0b3IudmFsaWRhdGUoKS5pc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jcmVhdGVOZXdEaXNwbGF5KFxyXG4gICAgICAgICAgICBuYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWRcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgY2xvc2VQb3B1cCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXHJcbiAgICAgICdVbnNhdmVkIGNoYW5nZXMnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgZGlzcGxheXNUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fZGlzcGxheXNUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl9kaXNwbGF5c1Rvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVEaXNwbGF5c1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlzVG9vbGJhckl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBpbXBvcnRGaWxlVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2ltcG9ydEZpbGVUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW0gPSB0aGlzLmNyZWF0ZUltcG9ydEZpbGVUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24gZnJvbSAnLi4vLi4vLi4vRGF0YS9Mb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbic7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zIHtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheSB7XHJcbiAgcmVhZG9ubHkgSWQ6IG51bWJlcjtcclxuICByZWFkb25seSBOYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgRmlsdGVySWQ6IG51bWJlcjtcclxuICByZWFkb25seSBWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWREaXNwbGF5c01hbmFnZXIge1xyXG4gIHByaXZhdGUgZGlzcGxheXM6IElDb250cm9sRGlzcGxheVtdIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyczoge1xyXG4gICAgY2hhbmdlZDogQXJyYXk8KGRpc3BsYXk6IElDb250cm9sRGlzcGxheSkgPT4gdm9pZD4sXHJcbiAgICBsb2FkZWQ6IEFycmF5PChkaXNwbGFpczogSUNvbnRyb2xEaXNwbGF5W10pID0+IHZvaWQ+XHJcbiAgfTtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9jdXJyZW50RGlzcGxheUlkOiBudW1iZXIgPSAwO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLmluc2VydERhdGFVcmwgPSBvcHRpb25zLmluc2VydERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLmRlbGV0ZURhdGFVcmwgPSBvcHRpb25zLmRlbGV0ZURhdGFVcmw7XHJcblxyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzID0ge1xyXG4gICAgICBjaGFuZ2VkOiBbXSxcclxuICAgICAgbG9hZGVkOiBbXVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkRGlzcGxheXMoKSB7XHJcbiAgICB0aGlzLmRpc3BsYXlzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5W10+KHRoaXMubG9hZERhdGFVcmwpO1xyXG4gICAgdGhpcy5vbkRpc3BsYWlzTG9hZGVkUHJpdmF0ZSgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERpc3BsYXlzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheXMgfHwgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREaXNwbGF5QnlJZCA9IChpZDogbnVtYmVyKSA9PiB7XHJcbiAgICBpZiAoIWlkIHx8ICF0aGlzLmRpc3BsYXlzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzLmZpbmQoKHYpID0+IHYuSWQgPT09IGlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVOZXdEaXNwbGF5KG5hbWU6IHN0cmluZywgZmlsdGVySWQ6IG51bWJlciwgdmlld0lkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG5ld1ZpZXdEdG8gPSB7XHJcbiAgICAgIElkOiAwLFxyXG4gICAgICBOYW1lOiBuYW1lLFxyXG4gICAgICBGaWx0ZXJJZDogZmlsdGVySWQsXHJcbiAgICAgIFZpZXdJZDogdmlld0lkXHJcbiAgICB9O1xyXG5cclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuaW5zZXJ0RGF0YVVybCwgJ1BPU1QnLCBuZXdWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlRGlzcGxheShpZDogbnVtYmVyKSB7XHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IGlkIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVDdXJyZW50RGlzcGxheShuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVEaXNwbGF5KHRoaXMuY3VycmVudERpc3BsYXkuSWQsIG5hbWUsIGZpbHRlcklkLCB2aWV3SWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZURpc3BsYXkoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCBmaWx0ZXJJZDogbnVtYmVyLCB2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy51cGRhdGVEYXRhVXJsLCAnUFVUJywge1xyXG4gICAgICBpZCwgbmFtZSwgZmlsdGVySWQsIHZpZXdJZFxyXG4gICAgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRpc3BsYXlDaGFuZ2VkUHJpdmF0ZSgpIHtcclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5jaGFuZ2VkLmZvckVhY2goKGhhbmRsZXJzKSA9PiAoXHJcbiAgICAgIGhhbmRsZXJzKHRoaXMuY3VycmVudERpc3BsYXkpXHJcbiAgICApKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EaXNwbGFpc0xvYWRlZFByaXZhdGUoKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMubG9hZGVkLmZvckVhY2goKGhhbmRsZXJzKSA9PiAoXHJcbiAgICAgIGhhbmRsZXJzKHRoaXMuZGlzcGxheXMpXHJcbiAgICApKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudERpc3BsYXlJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50RGlzcGxheUlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50RGlzcGxheUlkKGlkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2N1cnJlbnREaXNwbGF5SWQgPSBpZDtcclxuICAgIHRoaXMub25EaXNwbGF5Q2hhbmdlZFByaXZhdGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudERpc3BsYXkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREaXNwbGF5QnlJZCh0aGlzLl9jdXJyZW50RGlzcGxheUlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb25EaXNwbGF5Q2hhbmdlZChoYW5kbGVyOiAoZGlzcGxheTogSUNvbnRyb2xEaXNwbGF5KSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuY2hhbmdlZC5wdXNoKGhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBvbkRpc3BsYWlzTG9hZGVkKGhhbmRsZXI6IChkaXNwbGFpczogSUNvbnRyb2xEaXNwbGF5W10pID0+IHZvaWQpIHtcclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5sb2FkZWQucHVzaChoYW5kbGVyKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IE11dGFibGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbkRlZmF1bHRPcHRpb25zIHtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucyA9XHJcbiAgTXV0YWJsZTxPbWl0PElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMsIGtleW9mIElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbkRlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGF1dG9JbnRlZ3JhdGlvbjogKG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IG51bGwpXHJcbiAgICAgICAgPyBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAmJiB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBncmlkLm9wdGlvbignc2VsZWN0aW9uJywge1xyXG4gICAgICBtb2RlOiAnbXVsdGlwbGUnXHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ3NlbGVjdGlvbiddKTtcclxuICAgIGdyaWQub24oJ2VkaXRvclByZXBhcmluZycsIHRoaXMub25HcmlkRWRpdG9yUHJlcGFyaW5nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25HcmlkRWRpdG9yUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvbkVkaXRvclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGlmICghZS5jb21wb25lbnQgfHwgIWUuZWRpdG9yT3B0aW9ucyB8fCBlLnBhcmVudFR5cGUgIT09ICdkYXRhUm93JyB8fCAhZS5kYXRhRmllbGQgfHwgIWUucm93IHx8ICFlLnJvdy5rZXkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFGaWVsZCA9IGUuZGF0YUZpZWxkO1xyXG4gICAgY29uc3QgZWRpdG9yS2V5ID0gZS5yb3cua2V5O1xyXG4gICAgY29uc3QgZGVmYXVsdExpc3RlbmVyID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gKGV2ZW50OiB7IHZhbHVlOiBhbnkgfSkgPT4ge1xyXG4gICAgICBkZWZhdWx0TGlzdGVuZXIoZXZlbnQpO1xyXG5cclxuICAgICAgdGhpcy51cGRhdGVNdWx0aXBsZVJvd3MoZGF0YUZpZWxkLCBlZGl0b3JLZXksIGV2ZW50LnZhbHVlKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU11bHRpcGxlUm93czxUPihkYXRhRmllbGQ6IHN0cmluZywgZWRpdG9yS2V5OiBzdHJpbmcsIHZhbHVlOiBUKSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZFJvd0tleXM6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5vcHRpb25zLm93bmVyLmdldFNlbGVjdGVkUm93S2V5cygpO1xyXG4gICAgaWYgKCFzZWxlY3RlZFJvd0tleXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlZGl0b3JLZXlTZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRSb3dLZXlzLmZpbmRJbmRleCgoaykgPT4gayA9PT0gZWRpdG9yS2V5KTtcclxuICAgIGlmIChlZGl0b3JLZXlTZWxlY3RlZEluZGV4IDwgMCB8fCBzZWxlY3RlZFJvd0tleXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RlZFJvd0tleXMuc3BsaWNlKGVkaXRvcktleVNlbGVjdGVkSW5kZXgsIDEpO1xyXG4gICAgc2VsZWN0ZWRSb3dLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuY2VsbFZhbHVlKHRoaXMub3B0aW9ucy5vd25lci5nZXRSb3dJbmRleEJ5S2V5KGtleSksIGRhdGFGaWVsZCwgdmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3Mge1xyXG4gIHJlYWRvbmx5IGRlZmF1bHRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHJlYWRvbmx5IGRlZmF1bHRWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0byB7XHJcbiAgRGVmYXVsdEZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgRGVmYXVsdFZpZXdJZDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zIHtcclxuICByZWFkb25seSB1c2VySWQ6IHN0cmluZztcclxuICByZWFkb25seSBsb2FkZWRVc2VyU2V0dGluZ3M/OiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M7XHJcbn1cclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tZW1wdHktaW50ZXJmYWNlXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyRGVmYXVsdE9wdGlvbnMge1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBUFNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zID1cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIE11dGFibGU8T21pdDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucywga2V5b2YgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyRGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucztcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRVc2VyU2V0dGluZ3M6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyA9IHtcclxuICAgIGRlZmF1bHRGaWx0ZXJJZDogdW5kZWZpbmVkLFxyXG4gICAgZGVmYXVsdFZpZXdJZDogR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkXHJcbiAgfTtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcm90ZWN0ZWQgX2xhdGVzdExvYWRlZFVzZXJTZXR0aW5nczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGF1dG9SZXNldHRpbmdDYWNoZVRpbWVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogQVBTQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvYWRlZFVzZXJTZXR0aW5ncykge1xyXG4gICAgICB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IHRoaXMub3B0aW9ucy5sb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGFydEF1dG9DYWNoZVJlc2V0dGluZ1RpbWVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncygpIHtcclxuICAgIHJldHVybiB0aGlzLl9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyh2YWx1ZTogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzKSB7XHJcbiAgICB0aGlzLl9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSB2YWx1ZTtcclxuICAgIHRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBpZiAoIXRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMubG9hZFVzZXJTZXR0aW5ncygpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZVVzZXJTZXR0aW5ncyh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXMpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPjtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz47XHJcblxyXG4gIHByb3RlY3RlZCBzdGFydEF1dG9DYWNoZVJlc2V0dGluZ1RpbWVyKCkge1xyXG4gICAgdGhpcy5hdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5pc0xhdGVzdExvYWRlZFVzZXJTZXR0aW5nc0V4cGlyZWQgPSB0cnVlO1xyXG4gICAgfSwgNTAwMCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3RvcEF1dG9DYWNoZVJlc2V0dGluZ1RpbWVyKCkge1xyXG4gICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5hdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBMb2NhbENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciBleHRlbmRzIENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB7XHJcbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSB1c2VyU2V0dGluZ3NTdG9yYWdlS2V5ID0gJ2Fwczpjb250cm9sLWRpc3BsYXk6dXNlci1zZXR0aW5ncyc7XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCByYXdVc2VyU2V0dGluZ3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51c2VyU2V0dGluZ3NTdG9yYWdlS2V5KTtcclxuICAgIGlmICghcmF3VXNlclNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgPSBKU09OLnBhcnNlKHJhd1VzZXJTZXR0aW5ncyk7XHJcblxyXG4gICAgcmV0dXJuIHVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXM6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy5nZXRVc2VyU2V0dGluZ3MoKTtcclxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyU2V0dGluZ3MgPSB7IC4uLmN1cnJlbnRVc2VyU2V0dGluZ3MsIC4uLnVwZGF0ZXMgfTtcclxuXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMb2NhbENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51c2VyU2V0dGluZ3NTdG9yYWdlS2V5LFxyXG4gICAgICBKU09OLnN0cmluZ2lmeSh1cGRhdGVkVXNlclNldHRpbmdzKSk7XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucyB7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zID1cclxuICBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyAmIElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuXHJcbmV4cG9ydCBjbGFzcyBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgZXh0ZW5kcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKG9wdGlvbnMpO1xyXG5cclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWRVc2VyU2V0dGluZ3MoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGNvbnN0IHVzZXJTZXR0aW5nc0R0byA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4odGhpcy5sb2FkRGF0YVVybCk7XHJcblxyXG4gICAgcmV0dXJuIHVzZXJTZXR0aW5nc0R0byA/IHRoaXMubWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKHVzZXJTZXR0aW5nc0R0bykgOiB0aGlzLmRlZmF1bHRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgY3VycmVudFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzID0geyAuLi5jdXJyZW50VXNlclNldHRpbmdzLCAuLi51cGRhdGVzIH07XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZFVzZXJTZXR0aW5nc0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4oXHJcbiAgICAgIHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsXHJcbiAgICAgIHRoaXMubWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNb2RlbFRvRHRvKHVwZGF0ZWRVc2VyU2V0dGluZ3MpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvVG9Nb2RlbCh1cGRhdGVkVXNlclNldHRpbmdzRHRvKTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJpdmF0ZSBtYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01vZGVsVG9EdG8obW9kZWw6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBEZWZhdWx0RmlsdGVySWQ6IG1vZGVsLmRlZmF1bHRGaWx0ZXJJZCxcclxuICAgICAgRGVmYXVsdFZpZXdJZDogbW9kZWwuZGVmYXVsdFZpZXdJZFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJpdmF0ZSBtYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0b1RvTW9kZWwoZHRvOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8pOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3Mge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGVmYXVsdEZpbHRlcklkOiBkdG8uRGVmYXVsdEZpbHRlcklkLFxyXG4gICAgICBkZWZhdWx0Vmlld0lkOiBkdG8uRGVmYXVsdFZpZXdJZFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBnZXRTdW1tYXJ5Q29sdW1uKGNvbHVtbnM6IEFycmF5PHsgdmlzaWJsZUluZGV4OiBudW1iZXIsIHZpc2libGU6IGJvb2xlYW4sIGRhdGFGaWVsZDogc3RyaW5nIH0+IHxcclxuICBSZWFkb25seUFycmF5PFBpY2s8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uLCAndmlzaWJsZUluZGV4JyB8ICd2aXNpYmxlJyB8ICdkYXRhRmllbGQnPj4pIHtcclxuICBsZXQgY29sdW1uRm9yU3VtbWFyeSA9ICcnO1xyXG5cclxuICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpO1xyXG4gIGNvbnN0IGNvbHVtbnNXaXRoSW5kZXggPSB2aXNpYmxlQ29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZUluZGV4ICE9PSBudWxsICYmIGMudmlzaWJsZUluZGV4ICE9PSB2b2lkIDApO1xyXG5cclxuICBpZiAoISFjb2x1bW5zV2l0aEluZGV4Lmxlbmd0aCkge1xyXG4gICAgY29sdW1uRm9yU3VtbWFyeSA9IGNvbHVtbnNXaXRoSW5kZXguc29ydCgoYSwgYikgPT4gYS52aXNpYmxlSW5kZXggLSBiLnZpc2libGVJbmRleClbMF0uZGF0YUZpZWxkO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb2x1bW5Gb3JTdW1tYXJ5ID0gKHZpc2libGVDb2x1bW5zWzBdICYmIHZpc2libGVDb2x1bW5zWzBdLmRhdGFGaWVsZCkgfHwgJyc7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY29sdW1uRm9yU3VtbWFyeTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCwgSUZpbGVJbXBvcnRlck9wdGlvbnMgfSBmcm9tICcuL0dyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkRGlzcGxheXNNYW5hZ2VyLCBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWREaXNwbGF5c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyLCBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRWaWV3c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIsIElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRmlsdGVyc01hbmFnZXInO1xyXG5pbXBvcnQgeyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB9IGZyb20gJy4vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4nO1xyXG5pbXBvcnQgeyBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMsIFJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB9IGZyb20gJy4vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgRGlzcGxheVR5cGUsIElEaXNwbGF5VHlwZVNldHRpbmdzLCBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtIH0gZnJvbSAnLi9Db250cm9sQ29uZmlndXJhdG9yJztcclxuaW1wb3J0IHsgY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlLCBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgeyBjcmVhdGVEeERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9EYXRhL0R4RGF0YVNvdXJjZSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgZ2V0U3VtbWFyeUNvbHVtbiB9IGZyb20gJy4vR3JpZFN1bW1hcnlIZWxwZXInO1xyXG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4uLy4uL0J1c2luZXNzJztcclxuXHJcbmludGVyZmFjZSBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbiB7XHJcbiAgUGVybWlzc2lvbnM6IENvbnRyb2xSb2xlUGVybWlzc2lvbnM7XHJcbiAgTmFtZTogc3RyaW5nO1xyXG4gIFR5cGU6ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbicgfCAnb2JqZWN0JyB8ICdkYXRlJyB8ICdkYXRldGltZSc7XHJcbiAgTGFiZWw6IHN0cmluZztcclxuICBPcmRlcjogbnVtYmVyO1xyXG4gIFRvb2xUaXA6IHN0cmluZztcclxuICBJc0RlZmF1bHRWaWV3RmllbGQ6IGJvb2xlYW47XHJcbiAgSXNLZXlDb2x1bW46IGJvb2xlYW47XHJcbiAgR3JvdXBGaWVsZDogc3RyaW5nO1xyXG4gIERpc3BsYXlUeXBlOiBzdHJpbmc7XHJcbiAgV2lkdGg/OiBudW1iZXI7XHJcbiAgSGlkaW5nT3JkZXI/OiBudW1iZXI7XHJcbiAgQ29sdW1ucz86IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVXNlckNvbmZpZ3VyYXRpb25SZXNwb25zZSB7XHJcbiAgRmllbGRzQ29uZmlndXJhdGlvbjogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXTtcclxuICBDYW5DcmVhdGVHbG9iYWxWaWV3czogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVHbG9iYWxGaWx0ZXJzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZUZpbHRlcnM6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlVmlld3M6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlRGlzcGxheXM6IGJvb2xlYW47XHJcbiAgQ2FuQXBwbGF5RGlzcGxheXM6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qIGVzbGludCBuby1iaXR3aXNlOiBvZmYgKi9cclxuLyogdHNsaW50OmRpc2FibGU6IG5vLWJpdHdpc2UgKi9cclxuY29uc3QgZW51bSBDb250cm9sUm9sZVBlcm1pc3Npb25zIHtcclxuICBOb25lID0gMCxcclxuICBSZWFkID0gMSA8PCAwLFxyXG4gIENyZWF0ZSA9IDEgPDwgMSxcclxuICBVcGRhdGUgPSAxIDw8IDIsXHJcbiAgRGVsZXRlID0gMSA8PCAzLFxyXG59XHJcbi8qIHRzbGludDplbmFibGU6IG5vLWJpdHdpc2UgKi9cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgZXhwb3J0RmlsZU5hbWU6IHN0cmluZztcclxuICB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHVzZXJDb25maWdVcmw6IHN0cmluZztcclxuICBjb250cm9sTG9nc1VybDogc3RyaW5nO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIGdyaWRWaWV3c01hbmFnZXJPcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM6IElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICByZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gIGltcG9ydEZpbGVPcHRpb25zPzogSUZpbGVJbXBvcnRlck9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sRGlzcGxheSB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBleHBvcnRGaWxlTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlck5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDb25maWdVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xMb2dzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczogSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM6IElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgbWFpbkdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkVmlld3NUb29sYmFyQ29tcG9uZW50OiBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudDogR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQ6IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgbXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW46IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQ29udHJvbERpc3BsYXlPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UgPSBvcHRpb25zLmlzU3RhbmRhbG9uZVBhZ2U7XHJcbiAgICB0aGlzLnBhZ2VUaXRsZSA9IG9wdGlvbnMucGFnZVRpdGxlO1xyXG4gICAgdGhpcy5leHBvcnRGaWxlTmFtZSA9IG9wdGlvbnMuZXhwb3J0RmlsZU5hbWU7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMudXNlckNvbmZpZ1VybCA9IG9wdGlvbnMudXNlckNvbmZpZ1VybDtcclxuICAgIHRoaXMuY29udHJvbExvZ3NVcmwgPSBvcHRpb25zLmNvbnRyb2xMb2dzVXJsO1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMgPSBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMgPSBvcHRpb25zLmdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zO1xyXG4gICAgdGhpcy5yZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucyA9IG9wdGlvbnMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcbiAgICB0aGlzLmltcG9ydEZpbGVPcHRpb25zID0gb3B0aW9ucy5pbXBvcnRGaWxlT3B0aW9ucztcclxuXHJcbiAgICB0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoWydhcHMtZ3JpZCcsICdjb250cm9sLWRpc3BsYXktZ3JpZCddKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBzZW5kUmVxdWVzdDxJVXNlckNvbmZpZ3VyYXRpb25SZXNwb25zZT4odGhpcy51c2VyQ29uZmlnVXJsKVxyXG4gICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JpZEZpbHRlcnNNYW5hZ2VyID0gbmV3IEdyaWRGaWx0ZXJzTWFuYWdlcih0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGdyaWRWaWV3c01hbmFnZXIgPSBuZXcgR3JpZFZpZXdzTWFuYWdlcih0aGlzLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBncmlkRGlzcGxheXNNYW5hZ2VyID0gbmV3IEdyaWREaXNwbGF5c01hbmFnZXIodGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMubWFpbkdyaWQgPSB0aGlzLmNyZWF0ZU1haW5HcmlkKHJlcy5GaWVsZHNDb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2FuQ3JlYXRlRGlzcGxheXMgPSByZXMuQ2FuQ3JlYXRlRGlzcGxheXMgJiYgcmVzLkNhbkNyZWF0ZVZpZXdzICYmIHJlcy5DYW5DcmVhdGVGaWx0ZXJzO1xyXG5cclxuICAgICAgICBpZiAoY2FuQ3JlYXRlRGlzcGxheXMgfHwgcmVzLkNhbkFwcGxheURpc3BsYXlzKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQgPSBuZXcgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCh7XHJcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkLFxyXG4gICAgICAgICAgICBlZGl0TW9kZTogY2FuQ3JlYXRlRGlzcGxheXMsXHJcbiAgICAgICAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlcixcclxuICAgICAgICAgICAgZ3JpZFZpZXdzTWFuYWdlcixcclxuICAgICAgICAgICAgZ3JpZERpc3BsYXlzTWFuYWdlcixcclxuICAgICAgICAgICAgaW1wb3J0RmlsZU9wdGlvbnM6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnNcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQoe1xyXG4gICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWQsXHJcbiAgICAgICAgICBvblZpZXdBcHBsaWVkOiB0aGlzLm9uVmlld0FwcGxpZWQsXHJcbiAgICAgICAgICBvblZpZXdEZWxldGVkOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IGdyaWREaXNwbGF5c01hbmFnZXIubG9hZERpc3BsYXlzKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYXV0b0ludGVncmF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgZ3JpZFZpZXdzTWFuYWdlcixcclxuICAgICAgICAgIGNhbkNyZWF0ZUdsb2JhbFZpZXdzOiByZXMuQ2FuQ3JlYXRlR2xvYmFsVmlld3MsXHJcbiAgICAgICAgICB2aXNpYmxlOiByZXMuQ2FuQ3JlYXRlVmlld3NcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQgPSBuZXcgR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50KHtcclxuICAgICAgICAgIGFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjogbmV3IFJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcih7XHJcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VyTmFtZSxcclxuICAgICAgICAgICAgbG9hZERhdGFVcmw6IHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMubG9hZERhdGFVcmwsXHJcbiAgICAgICAgICAgIHVwZGF0ZURhdGFVcmw6IHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMudXBkYXRlRGF0YVVybFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZCxcclxuICAgICAgICAgIG9uRmlsdGVyRGVsZXRlZDogYXN5bmMgKGZpbHRlcklkKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IGdyaWREaXNwbGF5c01hbmFnZXIubG9hZERpc3BsYXlzKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYXV0b0ludGVncmF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyLFxyXG4gICAgICAgICAgY2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogcmVzLkNhbkNyZWF0ZUdsb2JhbEZpbHRlcnMsXHJcbiAgICAgICAgICB2aXNpYmxlOiByZXMuQ2FuQ3JlYXRlRmlsdGVyc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luID0gbmV3IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luKHtcclxuICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdyaWREaXNwbGF5c01hbmFnZXIub25EaXNwbGF5Q2hhbmdlZCA9IGFzeW5jIChkaXNwbGF5KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGlzcGxheSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC5hcHBseUZpbHRlcihkaXNwbGF5LkZpbHRlcklkLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50LmFwcGx5VmlldyhkaXNwbGF5LlZpZXdJZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC5hcHBseUZpbHRlcih2b2lkIDAsIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQuYXBwbHlWaWV3KEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiB0c2xpbnQ6ZGlzYWJsZTogbm8tYml0d2lzZSAqL1xyXG4gIHByaXZhdGUgaGFzUGVybWlzc29uKHJ1bGVzLCBwZXJtaXNzb24pIHtcclxuICAgIHJldHVybiBydWxlcyAmIHBlcm1pc3NvbjtcclxuICB9XHJcbiAgLyogdHNsaW50OmVuYWJsZTogbm8tYml0d2lzZSAqL1xyXG5cclxuICBwcml2YXRlIGJ1aWxkVHJlZShjb2x1bW5zKSB7XHJcbiAgICBjb25zdCBncm91cFByZWZpeCA9ICdfX0dST1VQX18nO1xyXG5cclxuICAgIGxldCBjb2x1bW5zTWFwID0gY29sdW1ucy5yZWR1Y2UoKGFjYywgY29sdW1uKSA9PiB7XHJcbiAgICAgIGNvbHVtbi5Db2x1bW5zID0gW107XHJcbiAgICAgIGNvbHVtbi5Hcm91cEZpZWxkID0gY29sdW1uLkdyb3VwRmllbGRcclxuICAgICAgICA/IGAke2dyb3VwUHJlZml4fSR7Y29sdW1uLkdyb3VwRmllbGR9YFxyXG4gICAgICAgIDogbnVsbDtcclxuICAgICAgYWNjW2NvbHVtbi5OYW1lXSA9IGNvbHVtbjtcclxuXHJcbiAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCB7fSk7XHJcblxyXG4gICAgY29sdW1uc01hcCA9IGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uR3JvdXBGaWVsZClcclxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uR3JvdXBGaWVsZClcclxuICAgICAgLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleClcclxuICAgICAgLnJlZHVjZSgoYWNjLCBncm91cEZpZWxkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGdyb3VwRmllbGQucmVwbGFjZShncm91cFByZWZpeCwgJycpO1xyXG5cclxuICAgICAgICBjb25zdCBncm91cENvbHVtbiA9IHtcclxuICAgICAgICAgIE5hbWU6IGdyb3VwRmllbGQsXHJcbiAgICAgICAgICBMYWJlbDogY29sdW1uTmFtZSxcclxuICAgICAgICAgIENvbHVtbnM6IFtdLFxyXG4gICAgICAgICAgLyogdHNsaW50OmRpc2FibGU6IG1heC1saW5lLWxlbmd0aCAqL1xyXG4gICAgICAgICAgR3JvdXBGaWVsZDogY29sdW1uc01hcFtjb2x1bW5OYW1lXSAmJiBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdLkdyb3VwRmllbGQgJiYgY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkICE9PSBncm91cEZpZWxkXHJcbiAgICAgICAgICAgID8gY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkXHJcbiAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGFjY1tncm91cEZpZWxkXSA9IGdyb3VwQ29sdW1uO1xyXG5cclxuICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICB9LCBjb2x1bW5zTWFwKTtcclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNvbHVtbk5hbWUgaW4gY29sdW1uc01hcCkge1xyXG4gICAgICBpZiAoY29sdW1uc01hcC5oYXNPd25Qcm9wZXJ0eShjb2x1bW5OYW1lKSkge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnNNYXBbY29sdW1uTmFtZV07XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW4uR3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgY29sdW1uc01hcFtjb2x1bW4uR3JvdXBGaWVsZF0uQ29sdW1ucy5wdXNoKGNvbHVtbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyRGlzcGxheVR5cGUoc2V0dGluZ3M6IElEaXNwbGF5VHlwZVNldHRpbmdzLCBjb2x1bW46IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiwgcGVybWlzc2lvbnM6IENvbnRyb2xSb2xlUGVybWlzc2lvbnMpIHtcclxuICAgIGlmIChzZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5JY29ucykge1xyXG4gICAgICBjb2x1bW4uY2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgb3B0aW9ucykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gU3RyaW5nKG9wdGlvbnMudmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGNlbGxTZXR0aW5ncyA9IHNldHRpbmdzLmRhdGEuZmluZCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0udmFsdWUpID09PSBzdHJpbmdWYWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChjZWxsU2V0dGluZ3MpIHtcclxuICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgY2VsbFNldHRpbmdzLnRpdGxlKVxyXG4gICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGNlbGxTZXR0aW5ncy5pbWFnZSB9KSlcclxuICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KVxyXG4gICAgICAgICAgICAudGV4dChvcHRpb25zLnZhbHVlKVxyXG4gICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4uZWRpdENlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgJCgnPGRpdiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHNldHRpbmdzLmRhdGEsXHJcbiAgICAgICAgICBkaXNwbGF5VmFsdWU6ICd0aXRsZScsXHJcbiAgICAgICAgICBpdGVtVGVtcGxhdGU6IChkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KVxyXG4gICAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIGRhdGEudGl0bGUpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBkYXRhLmltYWdlIH0pKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICBmaWVsZFRlbXBsYXRlOiAoZGF0YSwgZWwpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBzZXR0aW5ncy5kYXRhLmZpbmQoKGl0ZW0pID0+IHBhcnNlSW50KGl0ZW0udmFsdWUpID09PSBjZWxsSW5mby52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRpdGVtTmFtZSA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbS1uYW1lJyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRyZXN1bHQgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1pY29uLWVkaXRvcl9fY3VzdG9tLWl0ZW0nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogY3VycmVudEl0ZW0gPyBjdXJyZW50SXRlbS5pbWFnZSA6ICcnIH0pLmF0dHIoJ3RpdGxlJywgY3VycmVudEl0ZW0gPyBjdXJyZW50SXRlbS50aXRsZSA6ICcnKSlcclxuICAgICAgICAgICAgICAuYXBwZW5kKCRpdGVtTmFtZSk7XHJcblxyXG4gICAgICAgICAgICAkaXRlbU5hbWVcclxuICAgICAgICAgICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiAnJyxcclxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlXHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBlbC5hcHBlbmQoJHJlc3VsdCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlLCBjb21wb25lbnQgfSkgPT4ge1xyXG4gICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShwYXJzZUludCh2YWx1ZS52YWx1ZSkpO1xyXG4gICAgICAgICAgICBjb21wb25lbnQuYmx1cigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHZhbHVlOiAoY2VsbEluZm8udmFsdWUgIT09IG51bGwgJiYgY2VsbEluZm8gIT09IHZvaWQgMCkgJiYgY2VsbEluZm8udmFsdWUudG9TdHJpbmcoKSxcclxuICAgICAgICAgIHNlbGVjdGVkSXRlbTogc2V0dGluZ3MuZGF0YS5maW5kKChpdGVtKSA9PiBwYXJzZUludChpdGVtLnZhbHVlKSA9PT0gY2VsbEluZm8udmFsdWUpXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbHVtbi5hbGxvd1NlYXJjaCA9IGZhbHNlO1xyXG4gICAgICBjb2x1bW4uYWxsb3dGaWx0ZXJpbmcgPSBmYWxzZTtcclxuICAgICAgY29sdW1uLmFsbG93SGVhZGVyRmlsdGVyaW5nID0gdHJ1ZTtcclxuICAgICAgY29sdW1uLmFsbG93R3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuUHJlZGVmaW5lZFZhbHVlcykge1xyXG4gICAgICBjb2x1bW4uZWRpdENlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgJCgnPGRpdiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHNldHRpbmdzLmRhdGEubWFwKChpKSA9PiBpLnZhbHVlKS5zb3J0KCksXHJcbiAgICAgICAgICBhY2NlcHRDdXN0b21WYWx1ZTogdHJ1ZSxcclxuICAgICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSwgY29tcG9uZW50IH0pID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUodmFsdWUgfHwgJycpO1xyXG4gICAgICAgICAgICBjb21wb25lbnQuYmx1cigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHZhbHVlOiBjZWxsSW5mby52YWx1ZSxcclxuICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb24pIHtcclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keENoZWNrQm94KHtcclxuICAgICAgICAgIHZhbHVlOiBjZWxsSW5mby52YWx1ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIHJlYWRPbmx5OiAhdGhpcy5oYXNQZXJtaXNzb24ocGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuVXBkYXRlKSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjZWxsSW5mby5jb21wb25lbnQuY2VsbFZhbHVlKGNlbGxJbmZvLnJvd0luZGV4LCBjZWxsSW5mby5jb2x1bW4uZGF0YUZpZWxkLCBlLnZhbHVlKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uZmlndXJlQ29sdW1uKGNvbHVtbkNvbmZpZzogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb24pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4ge1xyXG4gICAgY29uc3QgdGl0bGUgPSBjb2x1bW5Db25maWcuTGFiZWwgfHwgY29sdW1uQ29uZmlnLk5hbWU7XHJcbiAgICBjb25zdCB0b29sdGlwID0gY29sdW1uQ29uZmlnLlRvb2xUaXAgfHwgdGl0bGU7XHJcblxyXG4gICAgY29uc3QgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4gPSAhY29sdW1uQ29uZmlnLkNvbHVtbnMubGVuZ3RoXHJcbiAgICAgID8ge1xyXG4gICAgICAgIGRhdGFGaWVsZDogY29sdW1uQ29uZmlnLk5hbWUsXHJcbiAgICAgICAgZGF0YVR5cGU6IGNvbHVtbkNvbmZpZy5UeXBlLFxyXG4gICAgICAgIGNhcHRpb246IHRpdGxlLFxyXG4gICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKHRpdGxlLCB0b29sdGlwKSxcclxuICAgICAgICB2aXNpYmxlOiBjb2x1bW5Db25maWcuSXNEZWZhdWx0Vmlld0ZpZWxkLFxyXG4gICAgICAgIHZpc2libGVJbmRleDogY29sdW1uQ29uZmlnLk9yZGVyLFxyXG4gICAgICAgIGFsbG93Rml4aW5nOiBmYWxzZSxcclxuICAgICAgICBhbGxvd0VkaXRpbmc6ICEhdGhpcy5oYXNQZXJtaXNzb24oY29sdW1uQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSksXHJcbiAgICAgICAgd2lkdGg6IGNvbHVtbkNvbmZpZy5XaWR0aCxcclxuICAgICAgICBoaWRpbmdQcmlvcml0eTogY29sdW1uQ29uZmlnLkhpZGluZ09yZGVyXHJcbiAgICAgIH0gOiB7XHJcbiAgICAgICAgY2FwdGlvbjogdGl0bGUsXHJcbiAgICAgICAgY29sdW1uczogY29sdW1uQ29uZmlnLkNvbHVtbnMubWFwKChjKSA9PiB0aGlzLmNvbmZpZ3VyZUNvbHVtbihjKSlcclxuICAgICAgfTtcclxuXHJcbiAgICBpZiAoY29sdW1uQ29uZmlnLkRpc3BsYXlUeXBlKSB7XHJcbiAgICAgIGNvbnN0IGRpc3BsYXlTZXR0aW5nczogSURpc3BsYXlUeXBlU2V0dGluZ3MgPSBKU09OLnBhcnNlKGNvbHVtbkNvbmZpZy5EaXNwbGF5VHlwZSk7XHJcblxyXG4gICAgICBpZiAoZGlzcGxheVNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLkljb25zKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBkaXNwbGF5U2V0dGluZ3MuZGF0YS5tYXAoKGl0ZW0pID0+ICh7XHJcbiAgICAgICAgICB0ZXh0OiBpdGVtLnRpdGxlLFxyXG4gICAgICAgICAgdmFsdWU6IGl0ZW0udmFsdWVcclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIGl0ZW1zLnNwbGljZSgwLCAwLCB7XHJcbiAgICAgICAgICB0ZXh0OiAnQmxhbmsnLFxyXG4gICAgICAgICAgdmFsdWU6IG51bGxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLmhlYWRlckZpbHRlciA9IHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IGl0ZW1zXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yZW5kZXJEaXNwbGF5VHlwZShkaXNwbGF5U2V0dGluZ3MsIGNvbHVtbiwgY29sdW1uQ29uZmlnLlBlcm1pc3Npb25zKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sdW1uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25maWd1cmVDb2x1bW5zKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pIHtcclxuICAgIGNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uLmZpbHRlcihcclxuICAgICAgKGMpID0+IHRoaXMuaGFzUGVybWlzc29uKGMuUGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuUmVhZClcclxuICAgICk7XHJcblxyXG4gICAgY29uZmlndXJhdGlvbiA9IHRoaXMuYnVpbGRUcmVlKGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgY29uc3QgY29sdW1ucyA9IGNvbmZpZ3VyYXRpb24ubWFwKChjKSA9PiB0aGlzLmNvbmZpZ3VyZUNvbHVtbihjKSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pIHtcclxuICAgIGNvbnN0IGhhc0tleXMgPSBjb25maWd1cmF0aW9uLnNvbWUoKGMpID0+IGMuSXNLZXlDb2x1bW4pO1xyXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29uZmlndXJlQ29sdW1ucyhjb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5Gb3JTdW1tYXJ5ID0gZ2V0U3VtbWFyeUNvbHVtbihjb2x1bW5zKTtcclxuICAgIGNvbnN0IGdyaWRPcHRpb25zID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZShjb25maWd1cmF0aW9uKSxcclxuICAgICAgY29sdW1uUmVzaXppbmdNb2RlOiAnd2lkZ2V0JyxcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IGhhc0tleXMsXHJcbiAgICAgICAgYWxsb3dBZGRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgIG1vZGU6ICdiYXRjaCdcclxuICAgICAgfSxcclxuICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICd2aXJ0dWFsJywgcHJlbG9hZEVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuICAgICAgcGFnZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UgPyB1bmRlZmluZWQgOiAnMTAwJScsXHJcbiAgICAgIGNvbHVtbkNob29zZXI6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdkcmFnQW5kRHJvcCdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uRml4aW5nOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBmaWx0ZXJQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgIGNyZWF0ZUZpbHRlcjogJ05vbmUnLFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgc3VtbWFyeToge1xyXG4gICAgICAgIHRvdGFsSXRlbXM6IFt7IHN1bW1hcnlUeXBlOiAnY291bnQnLCBjb2x1bW46IGNvbHVtbkZvclN1bW1hcnkgfV1cclxuICAgICAgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgY29sdW1uSGlkaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICBjb2x1bW5zLFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IHRydWUsXHJcbiAgICAgIGdyb3VwaW5nOiB7XHJcbiAgICAgICAgY29udGV4dE1lbnVFbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIG1hc3RlckRldGFpbDogIWhhc0tleXMgPyB1bmRlZmluZWQgOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0ZW1wbGF0ZTogKGNvbnRhaW5lciwgb3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgY29uc3Qga2V5cyA9IHt9O1xyXG4gICAgICAgICAgY29uZmlndXJhdGlvbi5maWx0ZXIoKGMpID0+IGMuSXNLZXlDb2x1bW4pLmZvckVhY2goKGMpID0+IGtleXNbYy5OYW1lXSA9IG9wdGlvbnMuZGF0YVtjLk5hbWVdKTtcclxuXHJcbiAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICAgICAgICBkYXRhU291cmNlOiB7XHJcbiAgICAgICAgICAgICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICAgICAgbG9hZFVybDogYCR7dGhpcy5jb250cm9sTG9nc1VybH0/a2V5PSR7SlNPTi5zdHJpbmdpZnkoa2V5cyl9YCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgICAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnVXNlcicsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMjAwXHJcbiAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnQ3JlYXRlZEF0JyxcclxuICAgICAgICAgICAgICAgIGNhcHRpb246ICdEYXRlJyxcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnZGF0ZScsXHJcbiAgICAgICAgICAgICAgICBmb3JtYXQ6ICdzaG9ydERhdGVTaG9ydFRpbWUnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMFxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0NoYW5nZXMnLFxyXG4gICAgICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiAoYywgbykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gby5kYXRhLkNoYW5nZXNcclxuICAgICAgICAgICAgICAgICAgICAubWFwKFxyXG4gICAgICAgICAgICAgICAgICAgICAgKGl0ZW0pID0+IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgYDxkaXYgY2xhc3M9J2Fwcy1jb250cm9sLWxvZyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nX19maWVsZCc+JHtpdGVtLkZpZWxkfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdhcHMtY29udHJvbC1sb2dfX29sZC12YWx1ZSc+JHtpdGVtLk9sZFZhbHVlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjE5MlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2Fwcy1jb250cm9sLWxvZ19fbmV3LXZhbHVlJz4ke2l0ZW0uTmV3VmFsdWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmBcclxuICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgJChgPGRpdiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9ncyc+JHtjb250ZW50fTwvZGl2PmApLmFwcGVuZFRvKGMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmVwYXJlRmlsdGVyUGFuZWwoZS5jb21wb25lbnQpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlICE9PSAnZGF0YVJvdycpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gY29uZmlndXJhdGlvbi5maW5kKChjKSA9PiBjLk5hbWUgPT09IGUuZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgaWYgKCFmaWVsZENvbmZpZykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGlzYWJsZUVkaXRpbmcgPSAhdGhpcy5oYXNQZXJtaXNzb24oZmllbGRDb25maWcuUGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuVXBkYXRlKTtcclxuXHJcbiAgICAgICAgZS5lZGl0b3JPcHRpb25zLnJlYWRPbmx5ID0gZGlzYWJsZUVkaXRpbmc7XHJcblxyXG4gICAgICAgIGlmICghZGlzYWJsZUVkaXRpbmcgJiYgZmllbGRDb25maWcuVHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnN0IGJhc2VTZXRWYWx1ZSA9IGUuc2V0VmFsdWU7XHJcblxyXG4gICAgICAgICAgKGUgYXMgYW55KS5zZXRWYWx1ZSA9IChuZXdWYWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGJhc2VTZXRWYWx1ZShuZXdWYWx1ZS50cmltKCkpO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlLnJvd1R5cGUgPT09ICdkYXRhJykge1xyXG4gICAgICAgICAgY29uc3QgZmllbGRDb25maWcgPSBjb25maWd1cmF0aW9uLmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gZS5jb2x1bW4uZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGRDb25maWcgJiYgIXRoaXMuaGFzUGVybWlzc29uKGZpZWxkQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSkpIHtcclxuICAgICAgICAgICAgJChlLmNlbGxFbGVtZW50KS5hZGRDbGFzcygnYXBzLWdyaWRfX2Rpc2FibGVkLWNlbGwnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uUm93RXhwYW5kZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGV0YWlsUm93SW5kZXggPSBlLmNvbXBvbmVudC5nZXRSb3dJbmRleEJ5S2V5KGUua2V5KSArIDE7XHJcbiAgICAgICAgY29uc3QgJGRldGFpbENlbGwgPSBlLmNvbXBvbmVudC5nZXRDZWxsRWxlbWVudChkZXRhaWxSb3dJbmRleCwgMCkucGFyZW50KCkuZmluZCgnLmR4LW1hc3Rlci1kZXRhaWwtY2VsbCcpO1xyXG4gICAgICAgIGNvbnN0IGRhdGFHcmlkID0gJGRldGFpbENlbGwuZmluZCgnLmR4LWRhdGFncmlkJykuZmlyc3QoKS5wYXJlbnQoKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICBkYXRhR3JpZC5yZWZyZXNoKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnM7XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UsXHJcbiAgICAgIHNldERlZmF1bHRDb2x1bW5XaWR0aDogdHJ1ZSxcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHRoaXMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcclxuICAgICAgZGlzYWJsZVN1bW1hcnlDb2x1bW5EZXRlY3Rpb246IHRydWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoY29uZmlndXJhdGlvbjogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXSk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ2RhdGFTb3VyY2UnXSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICBrZXk6IGNvbmZpZ3VyYXRpb24uZmlsdGVyKChjKSA9PiBjLklzS2V5Q29sdW1uKS5tYXAoKGMpID0+IGMuTmFtZSksXHJcbiAgICAgICAgbG9hZFVybDogdGhpcy5sb2FkRGF0YVVybCxcclxuICAgICAgICB1cGRhdGVVcmw6IHRoaXMudXBkYXRlRGF0YVVybFxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25WaWV3QXBwbGllZCA9ICh2aWV3SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgdGhpcy5jbGVhckZpbHRlclJvd0FmdGVyVmlld1N3aXRjaGluZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlRmlsdGVyUGFuZWwoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCAkZmlsdGVyUGFuZWxFbGVtZW50ID0gZ3JpZC5lbGVtZW50KClcclxuICAgICAgLmZpbmQoJy5keC1kYXRhZ3JpZC1maWx0ZXItcGFuZWwnKTtcclxuICAgIGNvbnN0ICRmaWx0ZXJJY29uRmlsdGVyID0gJGZpbHRlclBhbmVsRWxlbWVudC5maW5kKCcuZHgtaWNvbi1maWx0ZXInKTtcclxuICAgIGNvbnN0ICRmaWx0ZXJQYW5lbFRleHQgPSAkZmlsdGVyUGFuZWxFbGVtZW50LmZpbmQoJy5keC1kYXRhZ3JpZC1maWx0ZXItcGFuZWwtdGV4dCcpO1xyXG5cclxuICAgICRmaWx0ZXJJY29uRmlsdGVyLm9mZignY2xpY2snKTtcclxuICAgICRmaWx0ZXJQYW5lbFRleHQub2ZmKCdjbGljaycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Um93c0NvdW50U3VtbWFyeShncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4gPSBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZCgoYykgPT4gISFjLmRhdGFGaWVsZCk7XHJcbiAgICBpZiAoIWZpcnN0VmlzaWJsZURhdGFDb2x1bW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvd3NDb3VudFN1bW1hcnlOYW1lID0gJ1Jvd3NDb3VudCc7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgY29uc3QgdG90YWxJdGVtczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXNbJ3N1bW1hcnknXVsndG90YWxJdGVtcyddID0gKGdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ10gKSB8fCBbXTtcclxuICAgIGNvbnN0IHJvd3NDb3VudFN1bW1hcnlJdGVtID0gdG90YWxJdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtICYmIGl0ZW0ubmFtZSA9PT0gcm93c0NvdW50U3VtbWFyeU5hbWUpO1xyXG4gICAgaWYgKHJvd3NDb3VudFN1bW1hcnlJdGVtICYmIHJvd3NDb3VudFN1bW1hcnlJdGVtLmNvbHVtbiA9PT0gZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyb3dzQ291bnRTdW1tYXJ5SXRlbSkge1xyXG4gICAgICByb3dzQ291bnRTdW1tYXJ5SXRlbS5jb2x1bW4gPSBmaXJzdFZpc2libGVEYXRhQ29sdW1uLmRhdGFGaWVsZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRvdGFsSXRlbXMucHVzaCh7XHJcbiAgICAgICAgbmFtZTogcm93c0NvdW50U3VtbWFyeU5hbWUsXHJcbiAgICAgICAgY29sdW1uOiBmaXJzdFZpc2libGVEYXRhQ29sdW1uLmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50JyxcclxuICAgICAgICBhbGlnbm1lbnQ6ICdsZWZ0JyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tYWluR3JpZC5vcHRpb24oJ3N1bW1hcnkudG90YWxJdGVtcycsIHRvdGFsSXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gTk9URTogV29ya2Fyb3VuZC4gVGhlIGdyaWQgY2FuJ3QgY2xlYXIgdGhlIGZpbHRlciByb3csIHNvIHdlIGNsZWFyIHRoYXQgbWFudWFsbHlcclxuICBwcml2YXRlIGNsZWFyRmlsdGVyUm93QWZ0ZXJWaWV3U3dpdGNoaW5nKCkge1xyXG4gICAgY29uc3QgY2xlYXJIZWFkZXIgPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXM6IHsgW3Zpc2libGVJbmRleDogbnVtYmVyXTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uIH0gPSB7fTtcclxuXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZS5jb2x1bW5zXHJcbiAgICAgICAgfHwgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50Lm9wdGlvbnMub3duZXIub3B0aW9uKCdjb2x1bW5zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkNvbHVtbltdO1xyXG5cclxuICAgICAgY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMudmlzaWJsZUluZGV4ICYmIChjLmZpbHRlclZhbHVlIHx8IGMuZmlsdGVyVmFsdWVzKSlcclxuICAgICAgICAuZm9yRWFjaCgoYykgPT4gY29sdW1uc1dpdGhGaWx0ZXJlZFZhbHVlc1tjLnZpc2libGVJbmRleF0gPSBjKTtcclxuXHJcbiAgICAgICQoJ3RkIFthcmlhLWxhYmVsKj1cIkZpbHRlciBjZWxsXCJdJylcclxuICAgICAgICAuZmlsdGVyKChpbmRleCkgPT4gIWNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXNbaW5kZXhdKVxyXG4gICAgICAgIC52YWwoJycpO1xyXG4gICAgICB0aGlzLm1haW5HcmlkLm9mZignY29udGVudFJlYWR5JywgY2xlYXJIZWFkZXIpO1xyXG4gICAgfTtcclxuICAgIHRoaXMubWFpbkdyaWQub24oJ2NvbnRlbnRSZWFkeScsIGNsZWFySGVhZGVyKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY3JlYXRlRGVmYXVsdERhdGFHcmlkLCBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQsIElHcmlkQWRkaXRpb25hbE9wdGlvbnMgfSBmcm9tICcuLi9HcmlkL0NyZWF0ZURlZmF1bHRHcmlkJztcclxuaW1wb3J0IGNyZWF0ZURlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcblxyXG5pbnRlcmZhY2UgSUFwcFVzZXIge1xyXG4gIElkOiBzdHJpbmc7XHJcbiAgVXNlck5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElEaXNwbGF5IHtcclxuICBJZDogbnVtYmVyO1xyXG4gIE5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheXNVc2VyQXNzaWdubWVudCB7XHJcbiAgRGlzcGxheUlkOiBudW1iZXI7XHJcbiAgVXNlcklkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR3JpZENvbHVtbiB7XHJcbiAgSWQ6IHN0cmluZztcclxuICBDYXB0aW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQVBTQ29udHJvbERpc3BsYXlBc3NpZ25tZW50c0RhdGEge1xyXG4gIFVzZXJzOiBJQXBwVXNlcltdO1xyXG4gIERpc3BsYXlzOiBJRGlzcGxheVtdO1xyXG4gIEFzc2lnbm1lbnRzOiBJQ29udHJvbERpc3BsYXlzVXNlckFzc2lnbm1lbnRbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheU1hbmFnZXJPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwYWdlVGl0bGU6IHN0cmluZztcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERpc3BsYXlNYW5hZ2VyIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSURpc3BsYXlNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLnBhZ2VUaXRsZSA9IG9wdGlvbnMucGFnZVRpdGxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIGxldCBjb2x1bW5zOiBJR3JpZENvbHVtbltdID0gW107XHJcblxyXG4gICAgY29uc3QgbG9hZERhdGFQcm9taXNlID0gc2VuZFJlcXVlc3Q8SUFQU0NvbnRyb2xEaXNwbGF5QXNzaWdubWVudHNEYXRhPih0aGlzLmxvYWREYXRhVXJsLCAnZ2V0JylcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGNvbHVtbnMgPSByZXMuRGlzcGxheXMubWFwKChkKSA9PiAoeyBJZDogZC5JZC50b1N0cmluZygpLCBDYXB0aW9uOiBkLk5hbWUgfSkpO1xyXG5cclxuICAgICAgICBjb25zdCBkYXRhID0gW107XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgdXNlciBvZiByZXMuVXNlcnMpIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSB7IFVzZXJOYW1lOiB1c2VyLlVzZXJOYW1lLCBVc2VySWQ6IHVzZXIuSWQgfTtcclxuICAgICAgICAgIGNvbnN0IHVzZXJBc3NpZ25tZW50cyA9IHJlcy5Bc3NpZ25tZW50cy5maWx0ZXIoKGEpID0+IGEuVXNlcklkID09PSB1c2VyLklkKTtcclxuXHJcbiAgICAgICAgICB1c2VyQXNzaWdubWVudHMuZm9yRWFjaCgoYXNzaWdubWVudCkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtW2Fzc2lnbm1lbnQuRGlzcGxheUlkXSA9IHRydWU7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBkYXRhLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBncmlkQ29sdW1ucyA9IFtcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnVXNlck5hbWUnLCB3aWR0aDogMzAwLCBmaXhlZDogdHJ1ZSwgZml4ZWRQb3NpdGlvbjogJ2xlZnQnLCBhbGxvd0VkaXRpbmc6IGZhbHNlIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1VzZXJJZCcsIHZpc2libGU6IGZhbHNlIH1cclxuICAgICAgICBdIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Db2x1bW5bXTtcclxuXHJcbiAgICAgICAgZ3JpZC5vcHRpb24oJ2NvbHVtbnMnLCBncmlkQ29sdW1ucy5jb25jYXQoY29sdW1ucy5tYXAoKGNvbCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiBjb2wuSWQsXHJcbiAgICAgICAgICAgIGNhcHRpb246IGNvbC5DYXB0aW9uLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICBjYWxjdWxhdGVDZWxsVmFsdWU6IChyb3dEYXRhKSA9PiAhIXJvd0RhdGFbY29sLklkXVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgbGV0IHVwZGF0aW5nSXNJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2Fwcy1kaXNwbGF5LW1hbmFnZXInfSxcclxuICAgICAgZGF0YVNvdXJjZToge1xyXG4gICAgICAgIHN0b3JlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkN1c3RvbVN0b3JlKHtcclxuICAgICAgICAgIGtleTogJ1VzZXJJZCcsXHJcbiAgICAgICAgICBsb2FkTW9kZTogJ3JhdycsXHJcbiAgICAgICAgICBsb2FkOiAoKSA9PiBsb2FkRGF0YVByb21pc2UsXHJcbiAgICAgICAgICB1cGRhdGU6IChrZXksIHZhbHVlczogeyBbZGlzcGxheUlkOiBudW1iZXJdOiBib29sZWFuIH0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdG9SZW1vdmU6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IHRvQWRkOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCB0aGVyZUlzQ3VycmVudFVwZGF0aW5nID0gdXBkYXRpbmdJc0luUHJvZ3Jlc3M7XHJcblxyXG4gICAgICAgICAgICB1cGRhdGluZ0lzSW5Qcm9ncmVzcyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5SWRzID0gT2JqZWN0LmtleXModmFsdWVzKTtcclxuXHJcbiAgICAgICAgICAgIGRpc3BsYXlJZHMuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodmFsdWVzW2lkXSkge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQucHVzaChwYXJzZUludChpZCkpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0b1JlbW92ZS5wdXNoKHBhcnNlSW50KGlkKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIE5PVEU6IG5vdGlmeSBhYm91dCBzdWNjZXNzZnVsIHJlcXVlc3Qgb25seSBmb3IgdGhlIGZpcnN0IHJlcXVlc3QgaW4gdGhlIHF1ZXVlXHJcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsgdXBkYXRpbmdJc0luUHJvZ3Jlc3MgPSBmYWxzZTsgfSwgMCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc2VuZFJlcXVlc3QodGhpcy51cGRhdGVEYXRhVXJsLCAncHV0Jywge1xyXG4gICAgICAgICAgICAgIHVzZXJJZDoga2V5LFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlzVG9SZW1vdmU6IHRvUmVtb3ZlLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlzVG9BZGQ6IHRvQWRkXHJcbiAgICAgICAgICAgIH0sICF0aGVyZUlzQ3VycmVudFVwZGF0aW5nKS5wcm9taXNlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgICBncm91cGluZzoge1xyXG4gICAgICAgIGNvbnRleHRNZW51RW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgIHJlZnJlc2hNb2RlOiAncmVwYWludCdcclxuICAgICAgfVxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcztcclxuXHJcbiAgICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6ICdEaXNwbGF5TWFuYWdlbWVudCcsXHJcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdVc2VyTmFtZSdcclxuICAgIH0gYXMgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucztcclxuXHJcbiAgICBsZXQgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gICAgaWYgKHRoaXMuaXNTdGFuZGFsb25lUGFnZSkge1xyXG4gICAgICBncmlkID0gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKHRoaXMuJGNvbnRhaW5lciwgZ3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCB0aGlzLnBhZ2VUaXRsZSwgJycsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxyXG4gICAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi9EYXRhL1JlcXVlc3QnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUGluZ1Jlc3VsdCB7XHJcbiAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTZXNzaW9uTm90aWZpZXJPcHRpb25zIHtcclxuICBzZXNzaW9uRXhwaXJlVGltZU1zOiBudW1iZXI7XHJcbiAgZGlzcGxheUR1cmF0aW9uTXM6IG51bWJlcjtcclxuICBzZXNzaW9uUGluZ1VybDogc3RyaW5nO1xyXG4gIGxvZ291dFVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk5vdGlmaWVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25FeHBpcmVUaW1lTXM6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlEdXJhdGlvbk1zOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uUGluZ1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nb3V0VXJsOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgd2F0aW5nVGltZW91dElkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBjb3VudGVySW50ZXJ2YWxJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgcGluZ0ludGVydmFsSWQ6IG51bWJlcjtcclxuICBwcml2YXRlIGV4cGlyYXRpb25UaW1lOiBEYXRlO1xyXG4gIHByaXZhdGUgJHRleHRDb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIGNvbnRpbnVlckJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIG9rQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uO1xyXG4gIHByaXZhdGUgbG9nb3V0QnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uO1xyXG5cclxuICBwcml2YXRlIF9wb3B1cDogRGV2RXhwcmVzcy51aS5keFBvcHVwO1xyXG4gIHByaXZhdGUgZ2V0IHBvcHVwKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cCB7XHJcbiAgICBpZiAoIXRoaXMuX3BvcHVwKSB7XHJcbiAgICAgIHRoaXMuX3BvcHVwID0gdGhpcy5jcmVhdGVQb3B1cCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9wb3B1cDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElTZXNzaW9uTm90aWZpZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMgPSBvcHRpb25zLnNlc3Npb25FeHBpcmVUaW1lTXM7XHJcbiAgICB0aGlzLmRpc3BsYXlEdXJhdGlvbk1zID0gb3B0aW9ucy5kaXNwbGF5RHVyYXRpb25NcztcclxuICAgIHRoaXMuc2Vzc2lvblBpbmdVcmwgPSBvcHRpb25zLnNlc3Npb25QaW5nVXJsO1xyXG4gICAgdGhpcy5sb2dvdXRVcmwgPSBvcHRpb25zLmxvZ291dFVybDtcclxuXHJcbiAgICB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSA9IHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICB0aGlzLmNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKTtcclxuXHJcbiAgICB0aGlzLnBvcHVwPy5oaWRlKCk7XHJcblxyXG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IHRoaXMuZ2V0RXhwaXJhdGlvblRpbWUoKTtcclxuXHJcbiAgICB0aGlzLndhdGluZ1RpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKCk7XHJcbiAgICB9LCBNYXRoLm1heCh0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMgLSB0aGlzLmRpc3BsYXlEdXJhdGlvbk1zLCAwKSk7XHJcblxyXG4gICAgdGhpcy5waW5nSW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKCk7XHJcbiAgICB9LCA2MCAqIDEwMDApO1xyXG5cclxuICAgICQoZG9jdW1lbnQpLm9uKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvd05vdGlmaWNhdGlvbigpIHtcclxuICAgIHRoaXMucG9wdXA/LnNob3coKTtcclxuXHJcbiAgICB0aGlzLmNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVBvcHVwQ29udGVudCgpO1xyXG4gICAgdGhpcy5jb3VudGVySW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlUG9wdXBDb250ZW50KCk7XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpIHtcclxuICAgIGlmICh0aGlzLndhdGluZ1RpbWVvdXRJZCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy53YXRpbmdUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY291bnRlckludGVydmFsSWQpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmNvdW50ZXJJbnRlcnZhbElkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBpbmdJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5waW5nSW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgJChkb2N1bWVudCkub2ZmKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRFeHBpcmF0aW9uVGltZSgpOiBEYXRlIHtcclxuICAgIGNvbnN0IGV4cGlyYXRpb25UaW1lID0gbmV3IERhdGUoKTtcclxuICAgIGV4cGlyYXRpb25UaW1lLnNldE1pbGxpc2Vjb25kcyhleHBpcmF0aW9uVGltZS5nZXRNaWxsaXNlY29uZHMoKSArIHRoaXMuc2Vzc2lvbkV4cGlyZVRpbWVNcyk7XHJcblxyXG4gICAgcmV0dXJuIGV4cGlyYXRpb25UaW1lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVQb3B1cCgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keFBvcHVwKHtcclxuICAgICAgdGl0bGU6ICdTZXNzaW9uIEV4cGlyaW5nJyxcclxuICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBzaG93Q2xvc2VCdXR0b246IGZhbHNlLFxyXG4gICAgICBkcmFnRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIG1heEhlaWdodDogMTkwLFxyXG4gICAgICBtYXhXaWR0aDogMzcwLFxyXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgY29udGVudFRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy4kdGV4dENvbnRhaW5lciA9ICQoJzxzcGFuIC8+Jyk7XHJcbiAgICAgICAgdGhpcy4kdGV4dENvbnRhaW5lci5hcHBlbmQodGhpcy5nZXRDb3VudGVyVGV4dCgpKTtcclxuICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpLmFwcGVuZCh0aGlzLiR0ZXh0Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgIH0sXHJcbiAgICAgIHRvb2xiYXJJdGVtczogW3tcclxuICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgIHRleHQ6ICdDb250aW51ZSBzZXNzaW9uJyxcclxuICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmNvbnRpbnVlckJ1dHRvbiA9IGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZXNzaW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgfSwge1xyXG4gICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgdGV4dDogJ1JlbG9hZCBwYWdlJyxcclxuICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLm9rQnV0dG9uID0gZS5jb21wb25lbnQsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIHRleHQ6ICdMb2cgT3V0JyxcclxuICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmxvZ291dEJ1dHRvbiA9IGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ091dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0sXHJcbiAgICB9KS5hcHBlbmRUbygkKGRvY3VtZW50LmJvZHkpKS5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb3VudGVyVGV4dCgpOiBKUXVlcnkge1xyXG4gICAgY29uc3QgcmVtYWluZWRTZWNvbmRzID0gTWF0aC5tYXgodGhpcy5nZXRTZWNvbmRzVG9FeHBpcmF0aW9uKCksIDApO1xyXG4gICAgaWYgKHJlbWFpbmVkU2Vjb25kcyA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gJCgnPHNwYW4gLz4nKS50ZXh0KCdZb3VyIHNlc3Npb24gaGFzIGJlZW4gZXhwaXJlZCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgJHN0YXJ0VGV4dCA9ICQoJzxzcGFuIC8+JykudGV4dCgnWW91ciBzZXNzaW9uIHdpbGwgZXhwaXJlIGluICcpO1xyXG4gICAgICBjb25zdCAkY291bnRlciA9ICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3Nlc3Npb24tbm90aWZpZXJfX2NvdW50ZXInKS50ZXh0KHJlbWFpbmVkU2Vjb25kcy50b0ZpeGVkKDApKTtcclxuICAgICAgY29uc3QgJGZpbmlzaFRleHQgPSAkKCc8c3BhbiAvPicpLnRleHQoJyBzZWNvbmRzJyk7XHJcblxyXG4gICAgICByZXR1cm4gJCgnPHNwYW4gLz4nKS5hcHBlbmQoJHN0YXJ0VGV4dCwgJGNvdW50ZXIsICRmaW5pc2hUZXh0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuICh0aGlzLmV4cGlyYXRpb25UaW1lLmdldFRpbWUoKSAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpKSAvIDEwMDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hTZXNzaW9uKCkge1xyXG4gICAgdGhpcy5yZXNldCgpO1xyXG5cclxuICAgIHNlbmRSZXF1ZXN0PElQaW5nUmVzdWx0Pih0aGlzLnNlc3Npb25QaW5nVXJsLCAnR0VUJywgbnVsbCwgZmFsc2UsIHsgbm90aWZ5RXJyb3I6IGZhbHNlIH0pLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICBpZiAoIXJlcy5pc0F1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKCgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSgpIHtcclxuICAgIGlmIChkb2N1bWVudC5oaWRkZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbmRSZXF1ZXN0PElQaW5nUmVzdWx0Pih0aGlzLnNlc3Npb25QaW5nVXJsLCAnR0VUJywgbnVsbCwgZmFsc2UsIHsgbm90aWZ5RXJyb3I6IGZhbHNlIH0pLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICBpZiAoIXJlcy5pc0F1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgICB0aGlzLnNldEV4cGlyZWQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEV4cGlyZWQoKSB7XHJcbiAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMucGluZ0ludGVydmFsSWQpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBpbmdJbnRlcnZhbElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9nT3V0KCkge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmxvZ291dFVybDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUG9wdXBDb250ZW50KCkge1xyXG4gICAgY29uc3QgaXNBbHJlYWR5RXhwaXJlZCA9IHRoaXMuZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpIDw9IDA7XHJcblxyXG4gICAgdGhpcy4kdGV4dENvbnRhaW5lcj8uaHRtbCgnJykuYXBwZW5kKHRoaXMuZ2V0Q291bnRlclRleHQoKSk7XHJcbiAgICB0aGlzLm9rQnV0dG9uLm9wdGlvbigndmlzaWJsZScsIGlzQWxyZWFkeUV4cGlyZWQpO1xyXG4gICAgdGhpcy5jb250aW51ZXJCdXR0b24ub3B0aW9uKCd2aXNpYmxlJywgIWlzQWxyZWFkeUV4cGlyZWQpO1xyXG4gICAgdGhpcy5sb2dvdXRCdXR0b24ub3B0aW9uKCd2aXNpYmxlJywgIWlzQWxyZWFkeUV4cGlyZWQpO1xyXG4gIH1cclxufVxyXG4iLCAiY29uc3QgR1JJRF9JTkRJQ0FUT1JfU1RBVEUgPSB7XHJcbiAgZWRpdDogJ2VkaXQnLFxyXG4gIHNhdmluZzogJ3NhdmluZycsXHJcbiAgc2F2ZWQ6ICdzYXZlZCdcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEdSSURfSU5ESUNBVE9SX1NUQVRFO1xyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUdyaWREYXRhTGF5ZXIgfSBmcm9tICcuLi8uLi9EYXRhL0luZGV4JztcclxuaW1wb3J0IHsgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUsIElHcmlkU3RhdGUsIElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZSwgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL0luZGV4JztcclxuXHJcbmludGVyZmFjZSBJTG9hZGVkQ29sdW1ucyB7IFtkYXRhRmllbGQ6IHN0cmluZ106IGJvb2xlYW47IH1cclxuaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbENvbHVtblNldHRpbmdzIHsgW2RhdGFGaWVsZDogc3RyaW5nXTogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGU7IH1cclxuaW50ZXJmYWNlIElDb2x1bW5XaWR0aHMgeyBbdmlzaWJsZUluZGV4OiBudW1iZXJdOiBudW1iZXIgfCBzdHJpbmc7IH1cclxuXHJcbmludGVyZmFjZSBJQ29sdW1uQ2FwdGlvbiB7XHJcbiAgZGF0YUZpZWxkOiBzdHJpbmc7XHJcbiAgY2FwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmlkU3RhdGVNYW5hZ2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwdWJsaWMgT1VUREFURV9DT0xVTU5TX0ZPVU5EX0VWRU5UID0gJ291dGRhdGVkLWNvbHVtbnMtZm91bmQtZXZlbnQnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaWQ6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyO1xyXG5cclxuICBwcml2YXRlIHN0YXRlTG9hZGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsb2FkZWRDb2x1bW5zOiBJTG9hZGVkQ29sdW1ucyA9IHt9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBsYXN0Q29sdW1uU2V0dGluZ3NTdHI6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoZ3JpZElkOiBudW1iZXIsIGdyaWREYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuaWQgPSBncmlkSWQ7XHJcbiAgICB0aGlzLmdyaWREYXRhTGF5ZXIgPSBncmlkRGF0YUxheWVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWQoY2hlY2tPdXRkYXRlZENvbHVtbnM6IGJvb2xlYW4sIG91dGRhdGVkQ29sdW1uc0NhbGxiYWNrOiAoY29sdW1ucykgPT4gdm9pZCk6IEpRdWVyeVByb21pc2U8SUdyaWRTdGF0ZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFMYXllci5nZXRHcmlkVmlld1NldHRpbmdzKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhOiBJR3JpZFN0YXRlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbkRhdGFMb2FkZWQoZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChjaGVja091dGRhdGVkQ29sdW1ucykge1xyXG4gICAgICAgICAgdGhpcy5jaGVja0NvbHVtbnNSZWxldmFuY2UoZGF0YS5jb2x1bW5zLCBvdXRkYXRlZENvbHVtbnNDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZShzdGF0ZTogSUdyaWRTdGF0ZSwgc2F2aW5nQ2FsbGJhY2s/OiAoKSA9PiB2b2lkLCBzYXZlZENhbGxiYWNrPzogKCkgPT4gdm9pZCk6IElDb2x1bW5XaWR0aHMge1xyXG4gICAgY29uc3QgY29sdW1uV2lkdGhzOiBJQ29sdW1uV2lkdGhzID0ge307XHJcblxyXG4gICAgaWYgKCFzdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0ZS5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBjb25zdCBhZGRTZXR0aW5ncyA9IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXTtcclxuXHJcbiAgICAgIGlmIChhZGRTZXR0aW5ncykge1xyXG4gICAgICAgIGNvbHVtbi5jYXB0aW9uID0gYWRkU2V0dGluZ3MuY2FwdGlvbjtcclxuICAgICAgICBjb2x1bW4udG9vbHRpcCA9IGFkZFNldHRpbmdzLnRvb2x0aXA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vTk9URTogaWYgREIgdGFibGUgaGFzIG5vIGRhdGEgaW4gYSBjb2x1bW4sIGRhdGEgZ3JpZCBjYW4ndCBpbmZlciBkYXRhIHR5cGUgYW5kIGRvZXNuJ3Qgc2V0IHRoZSBkYXRhVHlwZSBmaWVsZFxyXG4gICAgICBpZiAoIWNvbHVtbi5kYXRhVHlwZSkge1xyXG4gICAgICAgIGNvbHVtbi5kYXRhVHlwZSA9IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUuRGVmYXVsdDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCEhY29sdW1uLndpZHRoICYmIGNvbHVtbi52aXNpYmxlKSB7XHJcbiAgICAgICAgY29sdW1uV2lkdGhzW2NvbHVtbi52aXNpYmxlSW5kZXhdID0gY29sdW1uLndpZHRoO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5TZXR0aW5nc1N0ciA9IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbHVtbnMpO1xyXG5cclxuICAgIGlmICghdGhpcy5zdGF0ZUxvYWRlZCB8fCBjb2x1bW5TZXR0aW5nc1N0ciA9PT0gdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIgPSBjb2x1bW5TZXR0aW5nc1N0cjtcclxuXHJcbiAgICBpZiAoc2F2aW5nQ2FsbGJhY2spIHtcclxuICAgICAgc2F2aW5nQ2FsbGJhY2soKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdyaWREYXRhTGF5ZXIudXBkYXRlR3JpZFZpZXdTZXR0aW5ncyh0aGlzLmlkLCBzdGF0ZSlcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGlmIChzYXZlZENhbGxiYWNrKSB7XHJcbiAgICAgICAgICBzYXZlZENhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1uV2lkdGhzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrTmV3Q29sdW1ucyhzdGF0ZTogSUdyaWRTdGF0ZSk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IG5ld0NvbHVtbkZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBpZiAoc3RhdGUuY29sdW1ucykge1xyXG4gICAgICBjb25zdCBuZXdDb2x1bW5zID0gc3RhdGUuY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gIXRoaXMubG9hZGVkQ29sdW1uc1tjb2x1bW4uZGF0YUZpZWxkXSAmJiBjb2x1bW4udmlzaWJsZSk7XHJcblxyXG4gICAgICBpZiAobmV3Q29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICBuZXdDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgbmV3Q29sdW1uRmllbGRzLnB1c2goY29sdW1uLmRhdGFGaWVsZCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlZENvbHVtbnNbY29sdW1uLmRhdGFGaWVsZF0gPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ld0NvbHVtbkZpZWxkcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb2x1bW5DYXB0aW9ucygpOiBJQ29sdW1uQ2FwdGlvbltdIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3MpLm1hcCgoZGF0YUZpZWxkKSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF0YUZpZWxkLFxyXG4gICAgICAgIGNhcHRpb246IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdLmNhcHRpb25cclxuICAgICAgfSBhcyBJQ29sdW1uQ2FwdGlvbjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENvbHVtbkNhcHRpb24oZGF0YUZpZWxkOiBzdHJpbmcsIGNhcHRpb246IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXSkge1xyXG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXSA9IHsgY2FwdGlvbjogJycsIHRvb2x0aXA6ICcnIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0uY2FwdGlvbiA9IGNhcHRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q29sdW1uQWRkaXRpb25hbFNldHRpbmdzKGRhdGFGaWVsZDogc3RyaW5nKTogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrQ29sdW1uc1JlbGV2YW5jZShjb2x1bW5zOiBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGVbXSwgY2FsbGJhY2s6IChvdXRkYXRlZENvbHVtbnM6IHN0cmluZ1tdKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmdyaWREYXRhTGF5ZXIuZ2V0Q29sdW1uc0J5UmVwb3J0SWQodGhpcy5pZClcclxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBhY3R1YWxDb2x1bW5zID0ge307XHJcblxyXG4gICAgICAgIGRhdGEuZm9yRWFjaCgoYykgPT4gYWN0dWFsQ29sdW1uc1tjLk5hbWVdID0gdHJ1ZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG91dGRhdGVkQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYWN0dWFsQ29sdW1uc1tjLmRhdGFGaWVsZF0pLm1hcCgoYykgPT4gYy5kYXRhRmllbGQpO1xyXG5cclxuICAgICAgICBpZiAob3V0ZGF0ZWRDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShgR3JpZCBzZXR0aW5ncyBjb250YWluIHNvbWUgY29sdW5tcyB3aGljaCBkb24ndCBleGlzdCBpbiB0aGUgZGF0YWJhc2UgdGFibGUgYW55bW9yZTpcclxuXHJcbiAgICAgICAgICAnJHtvdXRkYXRlZENvbHVtbnMuam9pbignLCAnKX0nLlxyXG5cclxuICAgICAgICAgIERvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGVzZSBjb2x1bW5zIGZyb20gZ3JpZCBzZXR0aW5ncz9cclxuICAgICAgICAgIGAsICdSZW1vdmUgcmVkdW5kYW50IGNvbHVtbnM/JylcclxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICghcmVzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBjYWxsYmFjayhvdXRkYXRlZENvbHVtbnMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0U2V0dGluZ3MoKTogSlF1ZXJ5UHJvbWlzZTxJR3JpZFN0YXRlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkRGF0YUxheWVyLnJlc2V0U2V0dGluZ3ModGhpcy5pZClcclxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICB0aGlzLm9uRGF0YUxvYWRlZChkYXRhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRhdGFMb2FkZWQoZGF0YTogSUdyaWRTdGF0ZSkge1xyXG4gICAgY29uc3QgbG9hZGVkR3JpZFN0YXRlQ29sdW1ucyA9IGRhdGEgJiYgZGF0YS5jb2x1bW5zO1xyXG4gICAgbGV0IHZpc2libGVJbmRleENvdW50ZXIgPSAwO1xyXG5cclxuICAgIHRoaXMuc3RhdGVMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmIChsb2FkZWRHcmlkU3RhdGVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMubG9hZGVkQ29sdW1ucyA9IHt9O1xyXG5cclxuICAgICAgbG9hZGVkR3JpZFN0YXRlQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRlZENvbHVtbnNbY29sdW1uLmRhdGFGaWVsZF0gPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBOT1RFOiBzZXQgdmlzaWJsZSBpbmRleGVzIGlmIHRoZXkgaGF2ZSBub3QgYmVlbiBzZXQuIEl0J3MgcmVxdWlyZWQgZm9yIHByb3BlciBkeERhdGFHcmlkIGFwcGVhcmFuY2UuXHJcbiAgICAgICAgaWYgKGNvbHVtbi52aXNpYmxlICYmIGNvbHVtbi52aXNpYmxlSW5kZXggPT09IG51bGwpIHtcclxuICAgICAgICAgIGNvbHVtbi52aXNpYmxlSW5kZXggPSB2aXNpYmxlSW5kZXhDb3VudGVyKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOT1RFOiByZW1vdmUgZW1wdHkgdmFsdWVzIGJlY2F1c2UgdGhleSBsZWFkIHRvIHdyb25nIGR4RGF0YUdyaWQgYmVoYXZpb3JcclxuICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW4pLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNvbHVtbltrZXldID09PSBudWxsIHx8IGNvbHVtbltrZXldID09PSB2b2lkIDAgfHwgY29sdW1uW2tleV0gPT09ICcnKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW5ba2V5XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFNldHRpbmdzID0gdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2NvbHVtbi5kYXRhRmllbGRdO1xyXG5cclxuICAgICAgICBpZiAoIWFkZGl0aW9uYWxTZXR0aW5ncykge1xyXG4gICAgICAgICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2NvbHVtbi5kYXRhRmllbGRdID0ge1xyXG4gICAgICAgICAgICBjYXB0aW9uOiBjb2x1bW4uY2FwdGlvbixcclxuICAgICAgICAgICAgdG9vbHRpcDogY29sdW1uLnRvb2x0aXBcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGFkZGl0aW9uYWxTZXR0aW5ncy5jYXB0aW9uID0gY29sdW1uLmNhcHRpb247XHJcbiAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCA9IGNvbHVtbi50b29sdGlwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTk9URTogcmVtb3ZlIGNvbHVtbnMgd2hpY2ggZHhEYXRhR3JpZCBkb2Vzbid0IGV4cGVjdC5cclxuICAgICAgICBkZWxldGUgY29sdW1uLmNhcHRpb247XHJcbiAgICAgICAgZGVsZXRlIGNvbHVtbi50b29sdGlwO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxhc3RDb2x1bW5TZXR0aW5nc1N0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEuY29sdW1ucyk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZlbnVtIEdyaWRNb2RlIHtcclxuICBWaWV3ID0gMSxcclxuICBFZGl0ID0gMlxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHcmlkTW9kZTtcclxuIiwgIlx1RkVGRmltcG9ydCBHcmlkTW9kZSBmcm9tICcuLi9QYWdlcy9HcmlkL01vZGUnO1xyXG5pbXBvcnQgeyBJUmVwb3J0UGFyYW1zIH0gZnJvbSAnLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IElHcmlkU3RhdGUgfSBmcm9tICcuLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBJQ29sdW1uTWV0YURhdGEgfSBmcm9tICcuLi9Db2x1bW5NZXRhRGF0YSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi4vLi4vRGF0YS9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWREYXRhTGF5ZXIge1xyXG4gIGdldENvbHVtbnNCeVJlcG9ydElkKHJlcG9ydElkOiBudW1iZXIpOiBKUXVlcnlEZWZlcnJlZDxJQ29sdW1uTWV0YURhdGFbXT47XHJcbiAgZ2V0R3JpZERhdGFTb3VyY2UocmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zLCBncmlkTW9kZTogR3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0OiBib29sZWFuKTogRGV2RXhwcmVzcy5kYXRhLkN1c3RvbVN0b3JlPGFueSwgYW55PjtcclxuICByZXNldFNldHRpbmdzKHJlcG9ydElkOiBudW1iZXIpOiBKUXVlcnlEZWZlcnJlZDxJR3JpZFN0YXRlPjtcclxuICB1cGRhdGVHcmlkVmlld1NldHRpbmdzKHJlcG9ydElkOiBudW1iZXIsIHN0YXRlOiBJR3JpZFN0YXRlKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PjtcclxuICBnZXRHcmlkVmlld1NldHRpbmdzKHJlcG9ydElkOiBudW1iZXIpOiBKUXVlcnlEZWZlcnJlZDxJR3JpZFN0YXRlPjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNyZWF0ZUdyaWREYXRhTGF5ZXI6IChncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKSA9PiBJR3JpZERhdGFMYXllciA9IChncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3QgdXJscyA9IHtcclxuICAgIGdyaWRSZXN1bHQ6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HcmlkVmlld1Jlc3VsdGAsXHJcbiAgICBnZXRDb2x1bW5zQnlSZXBvcnRJZDogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldERiVGFibGVGaWVsZHNgLFxyXG4gICAgcmVzZXRHcmlkU2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9SZXNldEdyaWRWaWV3U2V0dGluZ3NgLFxyXG4gICAgdXBkYXRlR3JpZFZpZXdTZXR0aW5nczogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L1VwZGF0ZUdyaWRWaWV3U2V0dGluZ3NgLFxyXG4gICAgZ2V0R3JpZFZpZXdTZXR0aW5nczogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldEdyaWRWaWV3U2V0dGluZ3NgXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcywgZ3JpZE1vZGU6IEdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdCkge1xyXG4gICAgICByZXR1cm4gY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICBsb2FkUGFyYW1zOiB7XHJcbiAgICAgICAgICBpZDogcmVwb3J0UGFyYW1zLlJlcG9ydElkLFxyXG4gICAgICAgICAgYXBwTmFtZTogcmVwb3J0UGFyYW1zLkFwcE5hbWUsXHJcbiAgICAgICAgICBncmlkTW9kZSxcclxuICAgICAgICAgIHJvd3NMaW1pdDogZ3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgJiYgIXNob3dBbGxEYXRhSW5FZGl0ID8gMTUgOiBudWxsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2FkVXJsOiB1cmxzLmdyaWRSZXN1bHQsXHJcbiAgICAgICAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRDb2x1bW5zQnlSZXBvcnRJZDogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMuZ2V0Q29sdW1uc0J5UmVwb3J0SWQsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICByZXNldFNldHRpbmdzOiAocmVwb3J0SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy5yZXNldEdyaWRTZXR0aW5ncywgJ3Bvc3QnLCB7IGlkOiByZXBvcnRJZCB9LCBmYWxzZSwgeyBkYXRhVHlwZTogJ2pzb24nIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVHcmlkVmlld1NldHRpbmdzOiAocmVwb3J0SWQ6IG51bWJlciwgc3RhdGU6IElHcmlkU3RhdGUpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMudXBkYXRlR3JpZFZpZXdTZXR0aW5ncywgJ3Bvc3QnLCB7XHJcbiAgICAgICAgaWQ6IHJlcG9ydElkLCBjb2x1bW5zU2V0dGluZ3M6IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbHVtbnMpXHJcbiAgICAgIH0sIGZhbHNlLCB7XHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0R3JpZFZpZXdTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMuZ2V0R3JpZFZpZXdTZXR0aW5ncywgJ3Bvc3QnLCB7IGlkOiByZXBvcnRJZCB9LCBmYWxzZSwge1xyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxufTtcclxuXHJcbmNvbnN0IGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZSA9IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKTogc3RyaW5nID0+IHtcclxuICBzd2l0Y2ggKGV4Y2VwdGlvblR5cGUpIHtcclxuICAgIGNhc2UgRXhjZXB0aW9uVHlwZS5TcWxFeGNlcHRpb246XHJcbiAgICAgIHJldHVybiAnV2UgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgdGhlIGRhdGEgcXVlcnkgaG93ZXZlciBpdCBhcHBlYXJzIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBkYXRhIHNvdXJjZS4gUGxlYXNlIGNvbnRhY3QgdGhlIHJlcG9ydCBhdXRob3IgdG8gY29uZmlybSB0aGUgZGF0YSByZXF1aXJlbWVudHMuJztcclxuXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG59O1xyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaE9wdGlvbnMge1xyXG4gIGNhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gIGVsYXBzZWRDYWxsYmFjazogKHRpbWU6IG51bWJlcikgPT4gdm9pZDtcclxufVxyXG5cclxuY29uc3QgdXBkYXRlVGltZW91dCA9IDEwMDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZnJlc2hUaW1lciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVsYXBzZWRDYWxsYmFjazogKHRpbWU6IG51bWJlcikgPT4gdm9pZDtcclxuICBwcml2YXRlIGFjdGl2ZVRpbWVySWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBjdXJyZW50SW50ZXJ2YWw6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBsYXN0U3RhdGVDaGVja2VkOiBEYXRlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVmcmVzaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrID0gb3B0aW9ucy5lbGFwc2VkQ2FsbGJhY2s7XHJcbiAgICB0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFydChpbnRlcnZhbDogbnVtYmVyKSB7XHJcbiAgICBpZiAoaW50ZXJ2YWwgPD0gMCkge1xyXG4gICAgICB0aGlzLmNhbGxiYWNrKCk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuY3VycmVudEludGVydmFsID0gaW50ZXJ2YWw7XHJcblxyXG4gICAgY29uc3QgdGltZXJJZCA9IHRoaXMuYWN0aXZlVGltZXJJZCA9IE1hdGgucmFuZG9tKCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50SW50ZXJ2YWwgPCAwKSB7XHJcbiAgICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrKHRoaXMuY3VycmVudEludGVydmFsKTtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyaWdnZXJDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy5jYWxsYmFjaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICAvL0NoYW5nZSB0aW1lcklkIGZvciBicmVha2luZyByZWZyZXNoIHByb2Nlc3MgaW4gbmV4dCBzZXRUaW1lb3V0IGNhbGwuIGRrbGltYW5vdlxyXG4gICAgdGhpcy5hY3RpdmVUaW1lcklkLS07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQ6IG51bWJlcikge1xyXG4gICAgaWYgKHRpbWVySWQgIT09IHRoaXMuYWN0aXZlVGltZXJJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgbGV0IHRpbWVUb1VwZGF0ZTogbnVtYmVyID0gdGhpcy5jdXJyZW50SW50ZXJ2YWwgLSAobmV3IERhdGUoKSAtIHRoaXMubGFzdFN0YXRlQ2hlY2tlZCk7XHJcbiAgICBpZiAodGltZVRvVXBkYXRlIDw9IDApIHtcclxuICAgICAgdGltZVRvVXBkYXRlID0gdGhpcy5jdXJyZW50SW50ZXJ2YWwgKyA5OTk7XHJcbiAgICAgIHRoaXMuY2FsbGJhY2soKTtcclxuICAgICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayh0aW1lVG9VcGRhdGUpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50aWNrVGltZXJGdW5jdGlvbih0aW1lcklkKSwgdXBkYXRlVGltZW91dCk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgUmVmcmVzaENvbXBvbmVudCBmcm9tICcuL0luZGV4JztcclxuXHJcbmNvbnN0IGRlZmF1bHRSZWZyZXNoRW50cmllczogSVJlZnJlc2hFbnRyeVtdID0gW3tcclxuICB0aW1lb3V0OiAwLFxyXG4gIHRleHQ6ICdyZWZyZXNoIG5vdycsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDE1ICogMTAwMCxcclxuICB0ZXh0OiAnMTUgc2VjJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogMzAgKiAxMDAwLFxyXG4gIHRleHQ6ICczMCBzZWMnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiA2MCAqIDEwMDAsXHJcbiAgdGV4dDogJzEgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogMTgwICogMTAwMCxcclxuICB0ZXh0OiAnMyBtaW4nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAzMDAgKiAxMDAwLFxyXG4gIHRleHQ6ICc1IG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDYwMCAqIDEwMDAsXHJcbiAgdGV4dDogJzEwIG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IC0xLFxyXG4gIHRleHQ6ICdvZmYnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlOiBvZmYnLFxyXG4gIGlzRGVmYXVsdDogdHJ1ZVxyXG59XTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJlZnJlc2hFbnRyeSB7XHJcbiAgdGltZW91dDogbnVtYmVyLFxyXG4gIHRleHQ6IHN0cmluZyxcclxuICByZWZyZXNoVGVtcGxhdGU6IHN0cmluZyxcclxuICBpc0RlZmF1bHQ/OiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZnJlc2hCdXR0b24ge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcERvd25CdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0TWVudTogRGV2RXhwcmVzcy51aS5keENvbnRleHRNZW51O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaENvbXBvbmVudDogUmVmcmVzaENvbXBvbmVudDtcclxuICBwcml2YXRlIG1lbnVJc09wZW5lZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRFbnRyeTogSVJlZnJlc2hFbnRyeTtcclxuXHJcbiAgY29uc3RydWN0b3IoJHRhcmdldDogSlF1ZXJ5LCBjYWxsYmFjazogKCkgPT4gdm9pZCwgcmVmcmVzaEVudHJpZXM6IElSZWZyZXNoRW50cnlbXSB8IG51bGwgPSBkZWZhdWx0UmVmcmVzaEVudHJpZXMpIHtcclxuICAgIHRoaXMucmVmcmVzaENvbXBvbmVudCA9IG5ldyBSZWZyZXNoQ29tcG9uZW50KHsgY2FsbGJhY2ssIGVsYXBzZWRDYWxsYmFjazogKGUpID0+IHRoaXMuZWxhcHNlZENhbGxiYWNrKGUpIH0pO1xyXG4gICAgdGhpcy5zZWxlY3RlZEVudHJ5ID0gcmVmcmVzaEVudHJpZXMuZmluZCgoZSkgPT4gZS5pc0RlZmF1bHQpIHx8IHJlZnJlc2hFbnRyaWVzLmZpbHRlcigoZSkgPT4gISFlLnRpbWVvdXQpWzBdO1xyXG5cclxuICAgIHRoaXMuY29udGV4dE1lbnUgPSAkKCc8ZGl2IC8+JykuZHhDb250ZXh0TWVudSh7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHJlZnJlc2hFbnRyaWVzLFxyXG4gICAgICB0YXJnZXQ6ICR0YXJnZXQsXHJcbiAgICAgIHBvc2l0aW9uOiB7IG15OiAncmlnaHQgdG9wJywgYXQ6ICdyaWdodCBib3R0b20nIH0sXHJcbiAgICAgIG9uSXRlbUNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmKCEoZS5pdGVtRGF0YSBhcyBhbnkpLnRpbWVvdXQpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRW50cnkgPSBlLml0ZW1EYXRhIGFzIElSZWZyZXNoRW50cnk7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0ZWRFbnRyeSBhcyBhbnkpO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50LnN0YXJ0KChlLml0ZW1EYXRhIGFzIGFueSkudGltZW91dCk7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkhpZGRlbjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubWVudUlzT3BlbmVkID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uU2hvd246IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZW51SXNPcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgIChlLmNvbXBvbmVudCBhcyBhbnkpLml0ZW1zQ29udGFpbmVyKClbMF0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc3pvbGVhLXRoZW1lJyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1UZW1wbGF0ZTogKGVudHJ5KSA9PiBlbnRyeS50ZXh0LFxyXG5cclxuICAgICAgY3NzQ2xhc3M6ICdpc3pvbGVhLXRoZW1lJ1xyXG4gICAgfSkuYXBwZW5kVG8oJ2JvZHknKS5keENvbnRleHRNZW51KCdpbnN0YW5jZScpO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudS5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0ZWRFbnRyeSBhcyBhbnkpO1xyXG5cclxuICAgIHRoaXMuZHJvcERvd25CdXR0b24gPSAkdGFyZ2V0LmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogdGhpcy5zZWxlY3RlZEVudHJ5LnRleHQsXHJcbiAgICAgIHRlbXBsYXRlOiAoYnV0dG9uRGF0YSwgY29udGVudCkgPT4ge1xyXG4gICAgICAgICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2R4LWljb24gZHgtaWNvbi1yZWZyZXNoJykuYXBwZW5kVG8oY29udGVudCk7XHJcbiAgICAgICAgJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ2J1dHRvbi13aXRoLWV4cGFuZC10ZXh0JykudGV4dChidXR0b25EYXRhLnRleHQpLmFwcGVuZFRvKGNvbnRlbnQpO1xyXG4gICAgICAgICQoJzxzcGFuPicpLmFkZENsYXNzKCdidXR0b24td2l0aC1leHBhbmQtaWNvbiBpc296LWljb24tMTYgaXNvei1pY29uLWFycm93LWRvd24tMTYnKS5hcHBlbmRUbyhjb250ZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgY2xhc3M6ICdpc3pvbGVhLW1kIGJ1dHRvbi13aXRoLWV4cGFuZCdcclxuICAgICAgfSxcclxuXHJcbiAgICAgIG9uQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5lbGVtZW50KCkud2lkdGgoJHRhcmdldC5vdXRlcldpZHRoKCkpO1xyXG4gICAgICAgIGlmICh0aGlzLm1lbnVJc09wZW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSkuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgKHRoaXMuc2VsZWN0ZWRFbnRyeS50aW1lb3V0ID4gMCkgJiYgdGhpcy5yZWZyZXNoQ29tcG9uZW50LnN0YXJ0KHRoaXMuc2VsZWN0ZWRFbnRyeS50aW1lb3V0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50LnRyaWdnZXJDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZWxhcHNlZENhbGxiYWNrKHRpbWVUb1VwZGF0ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyb3BEb3duQnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMuc2VsZWN0ZWRFbnRyeS5yZWZyZXNoVGVtcGxhdGUucmVwbGFjZSgnJScsIE1hdGguZmxvb3IodGltZVRvVXBkYXRlIC8gMTAwMCkudG9TdHJpbmcoKSkpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGdyaWRDb2x1bW5UeXBlcyBmcm9tICcuLi8uLi9CdXNpbmVzcy9HcmlkQ29sdW1uVHlwZXMnO1xyXG5pbXBvcnQge2luaXRQb3BvdmVyfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHtJR3JpZFJlcG9ydFBhcmFtcywgSVJlcG9ydFBhcmFtc30gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCBHUklEX0lORElDQVRPUl9TVEFURSBmcm9tICcuL0dyaWRJbmRpY2F0b3JTdGF0ZSc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgR3JpZFN0YXRlTWFuYWdlciBmcm9tICcuL0dyaWRTdGF0ZU1hbmFnZXInO1xyXG5pbXBvcnQgR3JpZE1vZGUgZnJvbSAnLi9Nb2RlJztcclxuaW1wb3J0IHtjcmVhdGVHcmlkRGF0YUxheWVyLCBJR3JpZERhdGFMYXllcn0gZnJvbSAnLi4vLi4vRGF0YS9JbmRleCc7XHJcbmltcG9ydCB7R3JpZERhdGFDb2x1bW5EYXRhVHlwZSwgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUsIElHcmlkU3RhdGV9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcblxyXG5jb25zdCBSRVNFVF9TQVZFRF9JTkRJQ0FUT1JfVElNRU9VVCA9IDMwMDA7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkT3B0aW9ucyB7XHJcbiAgZ3JpZFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJR3JpZFJlcG9ydFBhcmFtcztcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHNob3dIZWFkZXI/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmlkIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkUG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlcG9ydFBhcmFtczogSUdyaWRSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0hlYWRlcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgY3VycmVudEdyaWRNb2RlOiBHcmlkTW9kZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc2hvd0FsbERhdGFJbkVkaXQgPSBmYWxzZTtcclxuICBwcml2YXRlIGxvYWRpbmdUaW1lb3V0ID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFN0YXRlTWFuYWdlcjogR3JpZFN0YXRlTWFuYWdlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJGdyaWRTdGF0ZUluZGljYXRvcjogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZEVycm9yUGxhY2Vob2xkZXI6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJGdyaWRUYXJnZXRFbGVtZW50OiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50OiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZGF0YUxheWVyOiBJR3JpZERhdGFMYXllcjtcclxuICBwcml2YXRlIGVkaXRXaWR0aEVkaXRCb3hlczogRGV2RXhwcmVzcy51aS5keFRleHRCb3hbXSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdyaWRSZXBhaW50UXVldWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBjb2x1bW5OYW1lc1VwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHJlZnJlc2hCdXR0b246IFJlZnJlc2hCdXR0b24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWRPcHRpb25zKSB7XHJcbiAgICB0aGlzLmdyaWRQb3NpdGlvbk1hcmtlciA9IG9wdGlvbnMuZ3JpZFBvc2l0aW9uTWFya2VyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsID0gb3B0aW9ucy5ncmlkUmVwb3J0Q29udHJvbGxlclVybDtcclxuICAgIHRoaXMuc2hvd0hlYWRlciA9IG9wdGlvbnMuc2hvd0hlYWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRHcmlkTW9kZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IEdyaWRNb2RlLlZpZXc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0SW50ZXJuYWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkPy5yZWZyZXNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5ncmlkID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IG51bGw7XHJcbiAgICB0aGlzLiRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50Py5yZW1vdmUoKTtcclxuICAgIHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50Py5yZW1vdmUoKTtcclxuXHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3ZlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRJbnRlcm5hbCgpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gICAgdGhpcy5kYXRhTGF5ZXIgPSBjcmVhdGVHcmlkRGF0YUxheWVyKHRoaXMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmwpO1xyXG5cclxuICAgIGlmICh0aGlzLiRncmlkVGFyZ2V0RWxlbWVudCkge1xyXG4gICAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudCA9ICQoJzxkaXYgLz4nKS5pbnNlcnRBZnRlcih0aGlzLmdyaWRQb3NpdGlvbk1hcmtlcik7XHJcblxyXG4gICAgdGhpcy5ncmlkU3RhdGVNYW5hZ2VyID0gbmV3IEdyaWRTdGF0ZU1hbmFnZXIodGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQsIHRoaXMuZGF0YUxheWVyKTtcclxuXHJcbiAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlciA9ICQoJzxkaXYgLz4nKS50ZXh0KCdEYXRhIGxvYWRpbmcgZmFpbGVkLicpLmFkZENsYXNzKCdkeC1kYXRhZ3JpZC1ub2RhdGEnKS5jc3MoeyB6SW5kZXg6IDEgfSk7XHJcbiAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5hcHBlbmRUbyh0aGlzLmdyaWRQb3NpdGlvbk1hcmtlcik7XHJcbiAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5oaWRlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgLy8gVE9ETzogZWxlbWVudCBzZWxlY3RvciBhcyBhIHBhcmFtXHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcucmVwb3J0LWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzID0gW107XHJcbiAgICBjb25zdCBncmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCksXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7IGNsYXNzOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCA/ICdlZGl0LW1vZGUnIDogJ3ZpZXctbW9kZScgfSxcclxuICAgICAgcmVwYWludENoYW5nZXNPbmx5OiB0cnVlLFxyXG4gICAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgJiYgdGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzZWFyY2hQYW5lbCcpWzBdO1xyXG4gICAgICAgICAgY29uc3Qgc2VhcmNoUGFuZWxJbmRleCA9IGl0ZW1zLmluZGV4T2Yoc2VhcmNoUGFuZWwpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHN3aXRjaFRvRWRpdEJ0biA9IHtcclxuICAgICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdTd2l0Y2ggdG8gRWRpdCBNb2RlJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnN3aXRjaFRvTW9kZShHcmlkTW9kZS5FZGl0KSxcclxuICAgICAgICAgICAgICBpY29uOiAnc3dpdGNoLXRvLWVkaXQtbW9kZScsXHJcbiAgICAgICAgICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2Uoc2VhcmNoUGFuZWxJbmRleCwgMSk7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHN3aXRjaFRvRWRpdEJ0bik7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHNlYXJjaFBhbmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICAgICAgY29uc3QgY29sdW1uQ2hvb3NlckJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnY29sdW1uQ2hvb3NlckJ1dHRvbicpWzBdO1xyXG4gICAgICAgICAgY29uc3QgY29sdW1udENob29zZXJCdG5JbmRleCA9IGl0ZW1zLmluZGV4T2YoY29sdW1uQ2hvb3NlckJ0bik7XHJcblxyXG4gICAgICAgICAgY29uc3Qgc2hvd0RhdGFJdGVtID0ge1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgICAuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4ICNlMGUwZTAgc29saWQnLFxyXG4gICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnM3B4IDZweCcsXHJcbiAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXHJcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd3aGl0ZScsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7IG1hcmdpbjogJzAgNXB4IDAgMCcsIHdpZHRoOiAnNTRweCcgfSlcclxuICAgICAgICAgICAgICAgIC5keFN3aXRjaCh7XHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNob3dBbGxEYXRhSW5FZGl0LFxyXG4gICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxzcGFuIC8+JykudGV4dCgnU2hvdyBhbGwgZGF0YSAnKS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgJGhpbnRUYXJnZXQgPSAkKCc8YSAvPicpXHJcbiAgICAgICAgICAgICAgICAuY3NzKHsgdGV4dERlY29yYXRpb246ICd1bmRlcmxpbmUnLCBjb2xvcjogJ2JsdWUnIH0pXHJcbiAgICAgICAgICAgICAgICAudGV4dCgnKD8pJylcclxuICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgICAudGV4dChgSWYgdGhlIHRhYmxlIGNvbnRhaW5zIGEgbG90IG9mIGNvbHVtbnMgc2hvd2luZyBhbGwgZGF0YSBjYW4gbGVhZCB0byBzbG93IHBhZ2UgcGVyZm9ybWFuY2Ugd2hlbiB5b3UncmUgZWRpdGluZyB0aGUgZ3JpZC5cclxuQnkgZGVmYXVsdCBncmlkIHNob3dzIG9ubHkgZmlyc3QgMTAgcm93cyBpbiB0aGUgRWRpdCBtb2RlLmApXHJcbiAgICAgICAgICAgICAgICAuZHhQb3BvdmVyKHtcclxuICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAkaGludFRhcmdldCxcclxuICAgICAgICAgICAgICAgICAgc2hvd0V2ZW50OiAnbW91c2VlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgIGhpZGVFdmVudDogJ21vdXNlbGVhdmUnLFxyXG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MDBcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzd2l0Y2hUb1ZpZXdCdG4gPSB7XHJcbiAgICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnU3dpdGNoIHRvIFZpZXcgTW9kZScsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zd2l0Y2hUb01vZGUoR3JpZE1vZGUuVmlldyksXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3N3aXRjaC10by12aWV3LW1vZGUnLFxyXG4gICAgICAgICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ31cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGNvbHVtbnRDaG9vc2VyQnRuSW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGV4cG9ydEJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnZXhwb3J0QnV0dG9uJylbMF07XHJcbiAgICAgICAgICBjb25zdCBleHBvcnRCdG5JbmRleCA9IGl0ZW1zLmluZGV4T2YoZXhwb3J0QnRuKTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoZXhwb3J0QnRuSW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnB1c2goc2hvd0RhdGFJdGVtKTtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goc3dpdGNoVG9WaWV3QnRuKTtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goY29sdW1uQ2hvb3NlckJ0bik7XHJcblxyXG4gICAgICAgICAgY29uc3QgZWRpdFN0YXR1cyA9IHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdlZGl0LWdyaWQtc3RhdGUnKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdCk7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnVuc2hpZnQoZWRpdFN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hZGRSZWZyZXNoQnV0dG9uKSB7XHJcbiAgICAgICAgICBjb25zdCByZWZyZXNoQnRuID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdyZWZyZXNoJylbMF07XHJcbiAgICAgICAgICBjb25zdCByZWZyZXNoQnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKHJlZnJlc2hCdG4pO1xyXG5cclxuICAgICAgICAgIGl0ZW1zW3JlZnJlc2hCdG5JbmRleF0gPSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJGNvbnRhaW5lciwgKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkNlbGxQcmVwYXJlZDogKHsgcm93VHlwZSwgY29sdW1uLCBjZWxsRWxlbWVudCB9KSA9PiB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBpZiAocm93VHlwZSA9PT0gJ2hlYWRlcicgJiYgIWNvbHVtbi5jb21tYW5kKSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhRmllbGQgPSBjb2x1bW4uZGF0YUZpZWxkO1xyXG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbFNldHRpbmdzID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmdldENvbHVtbkFkZGl0aW9uYWxTZXR0aW5ncyhkYXRhRmllbGQpO1xyXG5cclxuICAgICAgICAgIHRoaXMuaW5pdEdyaWRIZWFkZXJDZWxsKGNlbGxFbGVtZW50LCBhZGRpdGlvbmFsU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRHcmlkSGVhZGVyQ2VsbEVkaXRQYW5lbChjb2x1bW4sIGNlbGxFbGVtZW50LCBhZGRpdGlvbmFsU2V0dGluZ3MpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuXHJcbiAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRHcmlkID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlOiBJR3JpZFN0YXRlID0gY3VycmVudEdyaWQuc3RhdGUoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCkge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5OYW1pbmcoY3VycmVudFN0YXRlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTk9URTogY29sdW1uIG5hbWUgdXBkYXRpbmcgdHJpZ2dlcnMgb25Db250ZW50UmVhZHkgZXZlbnQgcmFpc2luZyBhZ2Fpbi5cclxuICAgICAgICAgIC8vIFdlIG5lZWQgbm90IHRvIGV4ZXVjdXRlIHRoZSBzYW1lIG9uZSBtb3JlIHRpbWUuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBjdXJyZW50R3JpZC5lbmRDdXN0b21Mb2FkaW5nKCkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgIT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuY2hlY2tOZXdDb2x1bW5zKGN1cnJlbnRTdGF0ZSk7XHJcblxyXG4gICAgICAgIG5ld0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uTmFtZSkgPT4gZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGNvbHVtbk5hbWUsICd2aXNpYmxlJywgZmFsc2UpKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sdW1uQ2FwdGlvbnMgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuZ2V0Q29sdW1uQ2FwdGlvbnMoKTtcclxuXHJcbiAgICAgICAgY29sdW1uQ2FwdGlvbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgaWYgKGMuY2FwdGlvbiAmJiBjdXJyZW50R3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYXB0aW9uJykgIT09IGMuY2FwdGlvbikge1xyXG4gICAgICAgICAgICBjdXJyZW50R3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYXB0aW9uJywgYy5jYXB0aW9uKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgc3RhdGVTdG9yaW5nOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICBjdXN0b21Mb2FkOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmxvYWQodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQsIChvdXRkYXRlZENvbHVtbnMpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdyaWQuc3RhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIHN0YXRlLmNvbHVtbnMgPSAoc3RhdGUuY29sdW1ucyBhcyBhbnlbXSkuZmlsdGVyKChjb2x1bW4pID0+IG91dGRhdGVkQ29sdW1ucy5pbmRleE9mKGNvbHVtbi5kYXRhRmllbGQpIDwgMCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdyaWQuc3RhdGUoc3RhdGUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjdXN0b21TYXZlOiAoc3RhdGUpID0+IHRoaXMuc2F2ZUdyaWRTdGF0ZShzdGF0ZSlcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldywgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgfSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgfSxcclxuICAgICAgZXJyb3JSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgc29ydGluZzogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogdHJ1ZSB9LFxyXG4gICAgICBncm91cGluZzogeyBhdXRvRXhwYW5kQWxsOiBmYWxzZSB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0LFxyXG4gICAgICBjb2x1bW5DaG9vc2VyOiB7IGVuYWJsZWQ6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0IH0sXHJcbiAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtlbmFibGVkOiBmYWxzZX0sXHJcblxyXG4gICAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgICAgcGFnaW5nOiB7IHBhZ2VTaXplOiA1MCwgZW5hYmxlZDogdHJ1ZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG5cclxuICAgICAgc3VtbWFyeTogdGhpcy5yZXBvcnRQYXJhbXMuVG90YWxTdW1tYXJ5Q29sdW1uID8ge1xyXG4gICAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgICBjb2x1bW46IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtbixcclxuICAgICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICAgICAgfV1cclxuICAgICAgfSA6IHVuZGVmaW5lZCxcclxuXHJcbiAgICAgIG9uRWRpdG9yUHJlcGFyaW5nKGUpIHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnZmlsdGVyUm93Jykge1xyXG4gICAgICAgICAgY29uc3QgYXBwbHkgPSAoKSA9PiBlLmVsZW1lbnQuZmluZCgnLmR4LWFwcGx5LWJ1dHRvbicpLnRyaWdnZXIoJ2R4Y2xpY2snKTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5O1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSA9PT0gJ3NlYXJjaFBhbmVsJykge1xyXG4gICAgICAgICAgY29uc3QgYXBwbHlTZWFyY2g6IERldkV4cHJlc3MudWkuZHhUZXh0RWRpdG9yLlByb3BlcnRpZXNbJ29uRW50ZXJLZXknXSA9IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNlYXJjaEJ5VGV4dChhcmdzLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5U2VhcmNoO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseVNlYXJjaDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5ncmlkID0gZGVmYXVsdEdyaWQodGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQsIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiB0aGlzLnJlcG9ydFBhcmFtcy5OYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5zaG93SGVhZGVyID8gdGhpcy5yZXBvcnRQYXJhbXMuTmFtZSA6IG51bGwsXHJcbiAgICAgIGhlYWRlckRlc2NyaXB0aW9uOiB0aGlzLnNob3dIZWFkZXIgPyB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzIDogbnVsbFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy4kcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgIHRoaXMuJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQgPSAkKCc8c3BhbiAvPicpXHJcbiAgICAgICAgLmNzcyh7XHJcbiAgICAgICAgICBmbG9hdDogJ3JpZ2h0JyxcclxuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxyXG4gICAgICAgICAgYm90dG9tOiAnOHB4J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmFkZENsYXNzKCdpc3pvbGVhLW1kJylcclxuICAgICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgICAgdGV4dDogJ1Jlc2V0IHNldHRpbmdzJyxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMucmVzZXRTZXR0aW5ncygpLFxyXG4gICAgICAgICAgaWNvbjogJ3Jlc2V0LWdyaWQtc2V0dGluZ3MnXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXBwZW5kVG8oJ2Zvb3RlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdyaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihzdGF0ZTogc3RyaW5nKSB7XHJcbiAgICBPYmplY3Qua2V5cyhHUklEX0lORElDQVRPUl9TVEFURSkuZm9yRWFjaCgocykgPT4gdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yLnJlbW92ZUNsYXNzKEdSSURfSU5ESUNBVE9SX1NUQVRFW3NdKSk7XHJcblxyXG4gICAgdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yLmFkZENsYXNzKHN0YXRlKTtcclxuXHJcbiAgICBpZiAodGhpcy5ncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0KSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5ncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhdGUgPT09IEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmVkKSB7XHJcbiAgICAgIHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5lZGl0KTtcclxuICAgICAgfSwgUkVTRVRfU0FWRURfSU5ESUNBVE9SX1RJTUVPVVQpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0aXRsZSA9ICcnO1xyXG5cclxuICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgY2FzZSBHUklEX0lORElDQVRPUl9TVEFURS5lZGl0OlxyXG4gICAgICAgIHRpdGxlID0gJ0VkaXQgbW9kZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmVkOlxyXG4gICAgICAgIHRpdGxlID0gJ1NhdmVkJztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2aW5nOlxyXG4gICAgICAgIHRpdGxlID0gJ1NhdmluZyc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yLmF0dHIoJ3RpdGxlJywgdGl0bGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5OYW1pbmcoc3RhdGU6IElHcmlkU3RhdGUpIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aFxyXG4gICAgLy8gSEFDSzogRGV2RXh0cmVtZSBncmlkIGRvZXNuJ3Qgc2hvdyBjb2x1bW5zIGRhdGEgaWYgYSBkYXRhRmllbGQgaGFzIHNwZWNpYWwgc3ltYm9scy5cclxuICAgIC8vIFNlZSBodHRwczovL3d3dy5kZXZleHByZXNzLmNvbS9TdXBwb3J0L0NlbnRlci9RdWVzdGlvbi9EZXRhaWxzL1Q2MjE4MzgvZHhkYXRhZ3JpZC1hLWNvbHVtbi1pcy1lbXB0eS1pZi1kYXRhZmllbGQtY29udGFpbnMtc3BlY2lhbC1jaGFyYWN0ZXJzXHJcbiAgICAvLyB0c2xpbnQ6ZW5hYmxlOm1heC1saW5lLWxlbmd0aFxyXG4gICAgaWYgKHN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgc3RhdGUuY29sdW1ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgaWYgKC9bXmEtekEtWjAtOV9dLy50ZXN0KGMuZGF0YUZpZWxkKSkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk9wdGlvbihjLmRhdGFGaWVsZCwgJ2NhbGN1bGF0ZUNlbGxWYWx1ZScsIChyb3dEYXRhKSA9PiByb3dEYXRhW2MuZGF0YUZpZWxkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXRhU291cmNlKHJlcG9ydFBhcmFtc0RhdGFTb3VyY2U6IElSZXBvcnRQYXJhbXMsIGdyaWRNb2RlOiBHcmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXREYXRhU291cmNlOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuZGF0YUxheWVyLmdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtc0RhdGFTb3VyY2UsIGdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdERhdGFTb3VyY2UpO1xyXG4gICAgY29uc3QgZHMgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICBzdG9yZSxcclxuICAgICAgb25DaGFuZ2VkOiBncmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldyA/IHZvaWQgMCA6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkxvYWRFcnJvcjogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWRzLmlzTG9hZGVkKCkpIHtcclxuICAgICAgICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLnNob3coKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uTG9hZGluZ0NoYW5nZWQ6IChpc0xvYWRpbmcpID0+IHtcclxuICAgICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnUGxlYXNlIHdhaXQsIGRhdGEgbG9hZGluZyBpbiBwcm9ncmVzcy4nKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgMTAwMDApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5sb2FkaW5nVGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5sb2FkaW5nVGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1RpbWVvdXQgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5ncmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRTZXR0aW5ncygpIHtcclxuICAgIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oJ1Jlc2V0IGdyaWQgc2V0dGluZ3MgdG8gZGVmYXVsdCB2YWx1ZXM/JywgJ1Jlc2V0IHRvIGRlZmF1bHQ/JylcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuICAgICAgICAgIHRoaXMuZ3JpZFN0YXRlTWFuYWdlclxyXG4gICAgICAgICAgICAucmVzZXRTZXR0aW5ncygpXHJcbiAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLnN0YXRlKGRhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCB0aGlzLmNyZWF0ZURhdGFTb3VyY2UodGhpcy5yZXBvcnRQYXJhbXMsIHRoaXMuY3VycmVudEdyaWRNb2RlLCB0aGlzLnNob3dBbGxEYXRhSW5FZGl0KSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3dpdGNoVG9Nb2RlKG1vZGU6IEdyaWRNb2RlKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IG1vZGUgfHwgbW9kZSA9PT0gR3JpZE1vZGUuRWRpdCAmJiAhdGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3VycmVudEdyaWRNb2RlID0gbW9kZTtcclxuXHJcbiAgICBjb25zdCBjdXJyZW50U3VtbWFyeUNvbHVtbiA9IHRoaXMuZ3JpZC5vcHRpb24oJ3N1bW1hcnkudG90YWxJdGVtc1swXS5jb2x1bW4nKSBhcyBzdHJpbmc7XHJcblxyXG4gICAgY29uc3QgbmV3UmVwb3J0UGFyYW1zID0ge1xyXG4gICAgICAuLi50aGlzLnJlcG9ydFBhcmFtcyxcclxuICAgICAgVG90YWxTdW1tYXJ5Q29sdW1uOiBjdXJyZW50U3VtbWFyeUNvbHVtbiA/IGN1cnJlbnRTdW1tYXJ5Q29sdW1uIDogdGhpcy5yZXBvcnRQYXJhbXMuVG90YWxTdW1tYXJ5Q29sdW1uXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gbmV3UmVwb3J0UGFyYW1zO1xyXG5cclxuICAgIHRoaXMuZ3JpZC5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudC5yZW1vdmUoKTtcclxuICAgIHRoaXMuZ3JpZCA9IHRoaXMuaW5pdEludGVybmFsKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNhdmVHcmlkU3RhdGUoc3RhdGUpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSAhPT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCB3aWR0aHMgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZShzdGF0ZSxcclxuICAgICAgKCkgPT4gdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2aW5nKSxcclxuICAgICAgKCkgPT4gdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2ZWQpKTtcclxuXHJcbiAgICBpZiAod2lkdGhzKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHdpZHRocykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZWRpdFdpZHRoQm94ID0gdGhpcy5lZGl0V2lkdGhFZGl0Qm94ZXNba2V5XTtcclxuXHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB3aWR0aHNba2V5XSA9PT0gJ2luaGVyaXQnID8gJycgOiB3aWR0aHNba2V5XTtcclxuXHJcbiAgICAgICAgaWYgKGVkaXRXaWR0aEJveCAmJiBlZGl0V2lkdGhCb3gub3B0aW9uKCd2YWx1ZScpICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgZWRpdFdpZHRoQm94Lm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEdyaWRIZWFkZXJDZWxsRWRpdFBhbmVsKFxyXG4gICAgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4sXHJcbiAgICAkY2VsbDogSlF1ZXJ5LFxyXG4gICAgYWRkaXRpb25hbFNldHRpbmdzOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZVxyXG4gICkge1xyXG4gICAgY29uc3QgZGF0YUZpZWxkID0gY29sdW1uLmRhdGFGaWVsZDtcclxuICAgIGNvbnN0ICRjb2x1bW5DYXB0aW9uRWwgPSAkY2VsbC5maW5kKCcuZHgtZGF0YWdyaWQtdGV4dC1jb250ZW50Jyk7XHJcbiAgICBjb25zdCAkZWRpdG9yQXJlYSA9ICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2NvbHVtbi1lZGl0b3ItYXJlYScpLmluc2VydEFmdGVyKCRjb2x1bW5DYXB0aW9uRWwpO1xyXG5cclxuICAgICRjb2x1bW5DYXB0aW9uRWwuY3NzKCdtYXhXaWR0aCcsICc1NSUnKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFR5cGVQYW5lbCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2VkaXQtdHlwZS1wYW5lbCcpXHJcbiAgICAgIC53aWR0aCgnMTAwJScpXHJcbiAgICAgIC5hcHBlbmRUbygkY2VsbCk7XHJcblxyXG4gICAgY29uc3QgJGVkaXRXaWR0aFBhbmVsID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZWRpdC13aWR0aC1wYW5lbCcpXHJcbiAgICAgIC53aWR0aCgnMTAwJScpXHJcbiAgICAgIC5hcHBlbmRUbygkY2VsbCk7XHJcblxyXG4gICAgJGVkaXRUeXBlUGFuZWxbMF0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICBjb25zdCBzZWxlY3RCb3ggPSAkZWRpdFR5cGVCb3guZHhTZWxlY3RCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0Qm94Lm9wdGlvbignb3BlbmVkJykpIHtcclxuICAgICAgICBzZWxlY3RCb3guY2xvc2UoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZWxlY3RCb3gub3BlbigpO1xyXG4gICAgICB9XHJcbiAgICB9LCB0cnVlKTtcclxuXHJcbiAgICBsZXQgbGFzdENhcHRpb25WYWx1ZSA9IGNvbHVtbi5jYXB0aW9uO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0Q2FwdGlvbkJ0biA9ICQoJzxzcGFuIC8+JykuZHhCdXR0b24oe1xyXG4gICAgICBoaW50OiAnRWRpdCBjb2x1bW4gY2FwdGlvbicsXHJcbiAgICAgIHRlbXBsYXRlOiAoZGF0YSwgJGNvbnRlbnQpID0+ICRjb250ZW50LmFwcGVuZCgkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdlZGl0LWNhcHRpb24tYnRuJykpLFxyXG4gICAgICBvbkNsaWNrOiAoeyBldmVudCB9KSA9PiB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRDYXB0aW9uQnRuLmhpZGUoKTtcclxuICAgICAgICAkZWRpdFRvb2x0aXBCdG4uaGlkZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkZWRpdCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgICAgIHZhbHVlOiBsYXN0Q2FwdGlvblZhbHVlLFxyXG4gICAgICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdjYXB0aW9uLWVkaXRvcicgfSxcclxuICAgICAgICAgIG9uRW50ZXJLZXk6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGVkaXRCdG4uYmx1cigpO1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbkZvY3VzT3V0OiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGVkaXRCdG4ub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgICAgICAgICAgJGVkaXQucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICRjb2x1bW5DYXB0aW9uRWwudGV4dChuZXdWYWx1ZSkuc2hvdygpO1xyXG4gICAgICAgICAgICAkZWRpdENhcHRpb25CdG4uc2hvdygpO1xyXG4gICAgICAgICAgICAkZWRpdFRvb2x0aXBCdG4uc2hvdygpO1xyXG5cclxuICAgICAgICAgICAgbGFzdENhcHRpb25WYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuc2V0Q29sdW1uQ2FwdGlvbihkYXRhRmllbGQsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zYXZlR3JpZFN0YXRlKHRoaXMuZ3JpZC5zdGF0ZSgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgICAgICAuYXBwZW5kVG8oJGVkaXRvckFyZWEpXHJcbiAgICAgICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRCdG4gPSAkZWRpdC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICAgIGVkaXRCdG4uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSkuaW5zZXJ0QWZ0ZXIoJGNvbHVtbkNhcHRpb25FbCk7XHJcblxyXG4gICAgY29uc3QgJGVkaXRUb29sdGlwQnRuID0gJCgnPHNwYW4gLz4nKS5keEJ1dHRvbih7XHJcbiAgICAgIGhpbnQ6ICdFZGl0IGNvbHVtbiB0b29sdGlwJyxcclxuICAgICAgdGVtcGxhdGU6IChkYXRhLCAkY29udGVudCkgPT4gJGNvbnRlbnQuYXBwZW5kKCQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2VkaXQtdG9vbHRpcC1idG4nKSksXHJcbiAgICAgIG9uQ2xpY2s6ICh7IGV2ZW50IH0pID0+IHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLmhpZGUoKTtcclxuICAgICAgICAkZWRpdENhcHRpb25CdG4uaGlkZSgpO1xyXG4gICAgICAgICRlZGl0VG9vbHRpcEJ0bi5oaWRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICRlZGl0ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xyXG4gICAgICAgICAgdmFsdWU6IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCxcclxuICAgICAgICAgIHRleHQ6IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCxcclxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgY29sdW1uIHRvb2x0aXAuLi4nLFxyXG4gICAgICAgICAgb25FbnRlcktleTogKGUpID0+IHtcclxuICAgICAgICAgICAgZWRpdEJ0bi5ibHVyKCk7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uRm9jdXNPdXQ6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBlZGl0QnRuLm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgICAgICAgICRlZGl0LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRDYXB0aW9uQnRuLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRUb29sdGlwQnRuLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwID0gbmV3VmFsdWU7XHJcbiAgICAgICAgICAgICRjZWxsLmF0dHIoJ3RpdGxlJywgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVHcmlkU3RhdGUodGhpcy5ncmlkLnN0YXRlKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJylcclxuICAgICAgICAgIC5hcHBlbmRUbygkZWRpdG9yQXJlYSlcclxuICAgICAgICAgIC5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdEJ0biA9ICRlZGl0LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgICAgZWRpdEJ0bi5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9KS5pbnNlcnRBZnRlcigkZWRpdENhcHRpb25CdG4pO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0VHlwZUJveCA9ICQoJzxzcGFuIC8+JykuZHhTZWxlY3RCb3goe1xyXG4gICAgICBkYXRhU291cmNlOiBncmlkQ29sdW1uVHlwZXMsXHJcbiAgICAgIHZhbHVlOiBjb2x1bW4uZGF0YVR5cGUgfHwgR3JpZERhdGFDb2x1bW5EYXRhVHlwZS5EZWZhdWx0LFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb2x1bW4gdHlwZS4uLicsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk9wdGlvbihkYXRhRmllbGQsICdkYXRhVHlwZScsIHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKS5hcHBlbmRUbygkZWRpdFR5cGVQYW5lbCk7XHJcblxyXG4gICAgbGV0IHByZXZWYWx1ZSA9ICEhY29sdW1uLndpZHRoID8gY29sdW1uLndpZHRoLnRvU3RyaW5nKCkgOiAnJztcclxuXHJcbiAgICBjb25zdCBvbldpZHRoVmFsdWVDaGFuZ2VkID0gKGUpID0+IHtcclxuICAgICAgbGV0IG5ld1ZhbHVlID0gZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgICAgaWYgKCFuZXdWYWx1ZSB8fCBuZXdWYWx1ZSA9PT0gJ2luaGVyaXQnKSB7XHJcbiAgICAgICAgbmV3VmFsdWUgPSAnJztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFwcmV2VmFsdWUgfHwgcHJldlZhbHVlID09PSAnaW5oZXJpdCcpIHtcclxuICAgICAgICBwcmV2VmFsdWUgPSAnJztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5ld1ZhbHVlICE9PSBwcmV2VmFsdWUpIHtcclxuICAgICAgICBwcmV2VmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICB0aGlzLmdyaWQuY29sdW1uT3B0aW9uKGRhdGFGaWVsZCwgJ3dpZHRoJywgbmV3VmFsdWUgfHwgJ2luaGVyaXQnKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmdyaWRSZXBhaW50UXVldWVkKSB7XHJcbiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5yZXBhaW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFJlcGFpbnRRdWV1ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICB0aGlzLmdyaWRSZXBhaW50UXVldWVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCAkZWRpdFdpZHRoQm94ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xyXG4gICAgICB0ZXh0OiBwcmV2VmFsdWUgPT09ICdpbmhlcml0JyA/ICcnIDogcHJldlZhbHVlLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NldCB3aWR0aC4uLicsXHJcbiAgICAgIG9uRW50ZXJLZXk6ICgpID0+ICRlZGl0V2lkdGhCb3guZHhUZXh0Qm94KCdpbnN0YW5jZScpLmJsdXIoKSxcclxuICAgICAgb25Gb2N1c091dDogb25XaWR0aFZhbHVlQ2hhbmdlZCxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQ6IG9uV2lkdGhWYWx1ZUNoYW5nZWRcclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJylcclxuICAgICAgLmFwcGVuZFRvKCRlZGl0V2lkdGhQYW5lbClcclxuICAgICAgLm9uKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzW2NvbHVtbi52aXNpYmxlSW5kZXhdID0gJGVkaXRXaWR0aEJveC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRHcmlkSGVhZGVyQ2VsbCgkY2VsbEVsOiBKUXVlcnksIGFkZGl0aW9uYWxTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUpIHtcclxuICAgIGNvbnN0ICRjb2x1bW5DYXB0aW9uRWwgPSAkY2VsbEVsLmZpbmQoJy5keC1kYXRhZ3JpZC10ZXh0LWNvbnRlbnQnKTtcclxuICAgIGNvbnN0IHRvb2x0aXAgPSBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXA7XHJcbiAgICBjb25zdCBjYXB0aW9uID0gYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy5jYXB0aW9uO1xyXG5cclxuICAgICRjZWxsRWwuYXR0cigndGl0bGUnLCB0b29sdGlwIHx8IHZvaWQgMCk7XHJcblxyXG4gICAgaWYgKGNhcHRpb24pIHtcclxuICAgICAgJGNvbHVtbkNhcHRpb25FbC50ZXh0KGNhcHRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW50ZXJmYWNlIElHYXVnZVN1YnZhbHVlc09wdGlvbnMge1xyXG4gIHN1YnZhbHVlczogSVN1YnZhbHVlT3B0aW9uc1tdO1xyXG4gIHR5cGU6IHN0cmluZztcclxuICB3aWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVN1YnZhbHVlT3B0aW9ucyB7XHJcbiAga2V5OiBudW1iZXI7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGlzQm91bmQ6IGJvb2xlYW47XHJcbiAgbWVhc3VyZUlkOiBzdHJpbmc7XHJcbiAgdmFsdWU6IG51bWJlcjtcclxuICBjb2xvcjogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcclxuICBzdWJ2YWx1ZXM6IFtdLFxyXG4gIHR5cGU6ICd0cmlhbmdsZU1hcmtlcicsXHJcbiAgY29sb3I6ICcjODc5OGE1JyxcclxuICBzZWNvbmRDb2xvcjogJyNlMThlOTInLFxyXG4gIHdpZHRoOiAxMCxcclxuICBpc0N1c3RvbVBhbGV0dGU6IGZhbHNlLFxyXG4gIHBhbGV0dGU6IG51bGwsXHJcbiAgY3VzdG9tUGFsZXR0ZTogWycjNjFhNTk1JywgJ0dyZXknLCAncmdiKDE1MywgMTAyLCAyNTUpJywgJ05hdnknXVxyXG59IGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcblxyXG5jb25zdCBDU1NfQ0xBU1MgPSAnaXNvei1zdWJ2YWx1ZUVkaXRvckZvcm1Hcm91cCc7XHJcbmNvbnN0IE5BTUVfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19uYW1lYDtcclxuY29uc3QgSVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19pcy1ib3VuZGA7XHJcbmNvbnN0IFZBTFVFX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fdmFsdWVgO1xyXG5jb25zdCBNRUFTVVJFX0lEX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fbWVhc3VyZS1pZGA7XHJcbmNvbnN0IENPTE9SX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fY29sb3JgO1xyXG5cclxuY29uc3QgQ0lSQ0xVQVJfSU5ESUNBVE9SX1RZUEVTID0gWydyZWN0YW5nbGVOZWVkbGUnLCAndHJpYW5nbGVOZWVkbGUnLCAncmFuZ2VCYXInLCAndHJpYW5nbGVNYXJrZXInLCAndGV4dENsb3VkJ107XHJcbmNvbnN0IExJTkVBUl9JTkRJQ0FUT1JfVFlQRVMgPSBbJ3JlY3RhbmdsZScsICdjaXJjbGUnLCAncmhvbWJ1cycsICdyYW5nZUJhcicsICd0cmlhbmdsZU1hcmtlcicsICd0ZXh0Q2xvdWQnXTtcclxuXHJcbmNvbnN0IENJUkNVTEFSX1ZJRVdfVFlQRVM6IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlVmlld1R5cGVbXSA9IFsnQ2lyY3VsYXJGdWxsJywgJ0NpcmN1bGFySGFsZicsICdDaXJjdWxhclF1YXJ0ZXJMZWZ0JywgJ0NpcmN1bGFyUXVhcnRlclJpZ2h0JywgJ0NpcmN1bGFyVGhyZWVGb3VydGgnXTtcclxuY29uc3QgTElORUFSX1ZJRVdfVFlQRVM6IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlVmlld1R5cGVbXSA9IFsnTGluZWFySG9yaXpvbnRhbCcsICdMaW5lYXJWZXJ0aWNhbCddO1xyXG5cclxuY29uc3QgREVGQVVMVF9QQUxFVFRFID0gWycjMWRiMmY1JywgJyNmNTU2NGEnLCAnIzk3Yzk1YycsICcjZmZjNzIwJywgJyNlYjM1NzMnLCAnI2E2M2RiOCcsICcjNjU5M2JjJywgJyNmYWEzMzUnLCAnI2ZmODg3YyddO1xyXG5cclxuY29uc3QgUFJFREVGSU5FRF9QQUxFVFRFUyA9IFsnQnJpZ2h0JywgJ0hhcm1vbnkgTGlnaHQnLCAnT2NlYW4nLCAnUGFzdGVsJywgJ1NvZnQnLCAnU29mdCBQYXN0ZWwnLCAnVmludGFnZScsXHJcbiAgJ1Zpb2xldCcsICdDYXJtaW5lJywgJ0RhcmsgTW9vbicsICdEYXJrIFZpb2xldCcsICdHcmVlbiBNaXN0JywgJ1NvZnQgQmx1ZScsICdNYXRlcmlhbCcsICdPZmZpY2UnXTtcclxuXHJcbi8vIDEuIE1vZGVsXHJcbmNvbnN0IHByb3BlcnR5ID0ge1xyXG4gIG93bmVyVHlwZTogRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8uR2F1Z2VJdGVtLFxyXG4gIHByb3BlcnR5TmFtZTogJ0dhdWdlU3VidmFsdWVzU2V0dGluZ3MnLFxyXG4gIGRlZmF1bHRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoZGVmYXVsdE9wdGlvbnMpLFxyXG4gIHZhbHVlVHlwZTogJ3N0cmluZydcclxufSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5DdXN0b21Qcm9wZXJ0eU1ldGFkYXRhO1xyXG5cclxuRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8ucmVnaXN0ZXJDdXN0b21Qcm9wZXJ0eShwcm9wZXJ0eSk7XHJcblxyXG4vLyAyLiBWaWV3ZXJcclxuZnVuY3Rpb24gb25JdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkKGFyZ3M6IERldkV4cHJlc3MuRGFzaGJvYXJkLkl0ZW1XaWRnZXRPcHRpb25FdmVudEFyZ3MpIHtcclxuICBpZiAoYXJncy5kYXNoYm9hcmRJdGVtIGluc3RhbmNlb2YgRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8uR2F1Z2VJdGVtKSB7XHJcbiAgICBjb25zdCBzdG9yZWRPcHRpb25zID0gZ2V0T3B0aW9ucyhhcmdzLmRhc2hib2FyZEl0ZW0pO1xyXG5cclxuICAgIGNvbnN0IGdhdWdlT3B0aW9ucyA9IGFyZ3Mub3B0aW9ucyBhcyBEZXZFeHByZXNzLnZpei5keExpbmVhckdhdWdlT3B0aW9ucyB8IERldkV4cHJlc3Mudml6LmR4Q2lyY3VsYXJHYXVnZU9wdGlvbnM7XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVzID0gZ2F1Z2VPcHRpb25zLnN1YnZhbHVlcyB8fCBbXTtcclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvciA9IGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvciB8fCB7fTtcclxuXHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IudHlwZSA9IHN0b3JlZE9wdGlvbnMudHlwZSBhcyBhbnk7XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3Iud2lkdGggPSBzdG9yZWRPcHRpb25zLndpZHRoO1xyXG5cclxuICAgIGNvbnN0IGhhc1RhcmdldFZhbHVlID0gISFhcmdzLmRhc2hib2FyZEl0ZW0uZ2F1Z2VzKClbMF0/LnRhcmdldFZhbHVlKCk7XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IucGFsZXR0ZSA9IHN0b3JlZE9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigocykgPT4gaGFzVGFyZ2V0VmFsdWUgfHwgcy5rZXkgPiAtMSkubWFwKChzKSA9PiBzLmNvbG9yKTtcclxuXHJcbiAgICBzdG9yZWRPcHRpb25zLnN1YnZhbHVlcy5mb3JFYWNoKChzdWJ2YWx1ZSkgPT4ge1xyXG4gICAgICBpZiAoc3VidmFsdWUua2V5ID09PSAtMSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdmFsdWUgPSBzdWJ2YWx1ZS5pc0JvdW5kID8gYXJncy5pdGVtRGF0YS5nZXRNZWFzdXJlVmFsdWUoc3VidmFsdWUubWVhc3VyZUlkKS5nZXRWYWx1ZSgpIDogc3VidmFsdWUudmFsdWU7XHJcbiAgICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8vIDMuIERlc2lnbmVyXHJcbmZ1bmN0aW9uIG9uQ3VzdG9taXplU2VjdGlvbnMoYXJnczogRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuQ3VzdG9taXplU2VjdGlvbnNFdmVudEFyZ3MpIHtcclxuICBjb25zdCBnYXVnZUl0ZW0gPSBhcmdzLmRhc2hib2FyZEl0ZW07XHJcbiAgaWYgKGdhdWdlSXRlbSBpbnN0YW5jZW9mIERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSkge1xyXG4gICAgYXJncy5hZGRTZWN0aW9uKHtcclxuICAgICAgdGl0bGU6ICdTdWJ2YWx1ZXMnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogcHJvcGVydHkucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgdGVtcGxhdGUoYSwgZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgbmV3IERldkV4cHJlc3MudWkuZHhCdXR0b24oYnV0dG9uQ29udGFpbmVyLCB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0VkaXQgaW4gV2l6YXJkJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgICAgICAgICAgc2hvd1BvcHVwKGdhdWdlSXRlbSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBidXR0b25Db250YWluZXI7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dQb3B1cChnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSkge1xyXG4gIGNvbnN0IHBvcHVwQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwb3B1cENvbnRhaW5lcik7XHJcbiAgY29uc3QgcG9wdXBPcHRpb25zID0ge1xyXG4gICAgd2lkdGg6ICc4MDBweCcsXHJcbiAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgIG1heEhlaWdodDogJzEwMCUnLFxyXG4gICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICBjb250ZW50VGVtcGxhdGUodGhpczogYW55LCBjb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnN0IHN1YnZhbHVlc0Zvcm1Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29uc3Qgc3VidmFsdWVzZm9ybU9wdGlvbnMgPSBnZXRTdWJ2YWx1ZUZvcm1PcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIHRoaXMuX3N1YnZhbHVlc0Zvcm0gPSBuZXcgRGV2RXhwcmVzcy51aS5keEZvcm0oc3VidmFsdWVzRm9ybUNvbnRhaW5lciwgc3VidmFsdWVzZm9ybU9wdGlvbnMpO1xyXG5cclxuICAgICAgY29uc3QgaW5kaWNhdG9yRm9ybUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBjb25zdCBpbmRpY2F0b3Jmb3JtT3B0aW9ucyA9IGdldEluZGljYXRvckZvcm1PcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIHRoaXMuX2luZGljYXRvckZvcm0gPSBuZXcgRGV2RXhwcmVzcy51aS5keEZvcm0oaW5kaWNhdG9yRm9ybUNvbnRhaW5lciwgaW5kaWNhdG9yZm9ybU9wdGlvbnMpO1xyXG5cclxuICAgICAgY29uc3QgY29udGVudCA9ICQoJzxkaXYgLz4nKS5hcHBlbmQoc3VidmFsdWVzRm9ybUNvbnRhaW5lciwgaW5kaWNhdG9yRm9ybUNvbnRhaW5lcik7XHJcblxyXG4gICAgICBjb25zdCBzY3JvbGxWaWV3ID0gJCgnPGRpdiAvPicpO1xyXG4gICAgICBzY3JvbGxWaWV3LmFwcGVuZChjb250ZW50KTtcclxuICAgICAgc2Nyb2xsVmlldy5keFNjcm9sbFZpZXcoe1xyXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgaGVpZ2h0OiAnMTAwJSdcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gc2Nyb2xsVmlldztcclxuICAgIH0sXHJcbiAgICBvbkhpZGRlbigpIHtcclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChwb3B1cENvbnRhaW5lcik7XHJcbiAgICB9LFxyXG4gICAgdGl0bGU6ICdTdWJ2YWx1ZXMgV2l6YXJkJyxcclxuICB9IGFzIERldkV4cHJlc3MudWkuZHhQb3B1cC5Qcm9wZXJ0aWVzO1xyXG4gIGNvbnN0IHBvcHVwID0gbmV3IERldkV4cHJlc3MudWkuZHhQb3B1cChwb3B1cENvbnRhaW5lciwgcG9wdXBPcHRpb25zKTtcclxuICBwb3B1cC5zaG93KCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE9wdGlvbnMoZ2FndWVJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pOiBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zIHtcclxuICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShnYWd1ZUl0ZW0uY3VzdG9tUHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0eS5wcm9wZXJ0eU5hbWUpIGFzIHN0cmluZykgYXMgSUdhdWdlU3VidmFsdWVzT3B0aW9ucztcclxuICBjb25zdCBoYXNUYXJnZXRWYWx1ZSA9ICEhZ2FndWVJdGVtLmdhdWdlcygpWzBdPy50YXJnZXRWYWx1ZSgpO1xyXG5cclxuICBpZiAoaGFzVGFyZ2V0VmFsdWUgJiYgKCFkYXRhLnN1YnZhbHVlcyB8fCAhZGF0YS5zdWJ2YWx1ZXMuc29tZSgocykgPT4gcy5rZXkgPT09IC0xKSkpIHtcclxuICAgIGRhdGEuc3VidmFsdWVzLnNwbGljZSgwLCAwLCB7XHJcbiAgICAgIGtleTogLTEsXHJcbiAgICAgIG5hbWU6ICdUYXJnZXQgVmFsdWUnLFxyXG4gICAgICBpc0JvdW5kOiBmYWxzZSxcclxuICAgICAgbWVhc3VyZUlkOiAnJyxcclxuICAgICAgdmFsdWU6IDAsXHJcbiAgICAgIGNvbG9yOiBERUZBVUxUX1BBTEVUVEVbKGRhdGEuc3VidmFsdWVzPy5sZW5ndGggfHwgMCkgJSAoREVGQVVMVF9QQUxFVFRFLmxlbmd0aCAtIDEpXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRhdGE7XHJcbn1cclxuZnVuY3Rpb24gc2V0T3B0aW9ucyhnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSwgdmFsdWU6IElHYXVnZVN1YnZhbHVlc09wdGlvbnMpIHtcclxuICByZXR1cm4gZ2F1Z2VJdGVtLmN1c3RvbVByb3BlcnRpZXMuc2V0VmFsdWUocHJvcGVydHkucHJvcGVydHlOYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG5mdW5jdGlvbiBjcmVhdGVMaXN0QW5kVG9vbGJhcihmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSwgZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pOiBbSlF1ZXJ5LCBEZXZFeHByZXNzLnVpLmR4TGlzdCwgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJdIHtcclxuICBjb25zdCAkZWxlbWVudCA9ICQoJzxkaXYgLz4nKTtcclxuICBjb25zdCAkdG9vbGJhckNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKTtcclxuICAkZWxlbWVudC5hcHBlbmQoJHRvb2xiYXJDb250YWluZXIpO1xyXG4gIGNvbnN0IGVkaXRCdXR0b24gPSBudWxsO1xyXG4gIGxldCBsaXN0OiBEZXZFeHByZXNzLnVpLmR4TGlzdCA9IG51bGw7XHJcblxyXG4gIGNvbnN0IHRvb2xiYXJPcHRpb25zID0ge1xyXG4gICAgaXRlbXM6IFt7XHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgaWNvbjogJ2FkZCcsXHJcbiAgICAgICAgc3R5bGluZ01vZGU6ICd0ZXh0JyxcclxuICAgICAgICBvbkNsaWNrKGUpIHtcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgICAgICBjb25zdCBrZXkgPSBvcHRpb25zLnN1YnZhbHVlcy5yZWR1Y2UoKGFjYywgaXRlbSkgPT4gYWNjIDwgaXRlbS5rZXkgPyBpdGVtLmtleSA6IGFjYywgMCkgKyAxO1xyXG4gICAgICAgICAgY29uc3QgbmV3U3VidmFsdWU6IElTdWJ2YWx1ZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgbmFtZTogYFN1YnZhbHVlICR7a2V5fWAsXHJcbiAgICAgICAgICAgIGlzQm91bmQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBtZWFzdXJlSWQ6ICcnLFxyXG4gICAgICAgICAgICB2YWx1ZTogMCxcclxuICAgICAgICAgICAgY29sb3I6IERFRkFVTFRfUEFMRVRURVtvcHRpb25zLnN1YnZhbHVlcy5sZW5ndGggJSAoREVGQVVMVF9QQUxFVFRFLmxlbmd0aCAtIDEpXSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBmb3JtLm9wdGlvbignZm9ybURhdGEnLCBuZXdTdWJ2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgaXRlbUluRGF0YVNvdXJjZSA9IG9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5rZXkgPT09IG5ld1N1YnZhbHVlLmtleSlbMF07XHJcbiAgICAgICAgICBpZiAoIWl0ZW1JbkRhdGFTb3VyY2UpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXMucHVzaChuZXdTdWJ2YWx1ZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IG9wdGlvbnMuc3VidmFsdWVzLmluZGV4T2YoaXRlbUluRGF0YVNvdXJjZSk7XHJcbiAgICAgICAgICAgIG9wdGlvbnNbaW5kZXhdID0gbmV3U3VidmFsdWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xyXG4gICAgICAgICAgbGlzdC5yZWxvYWQoKTtcclxuICAgICAgICAgIGxpc3Qub3B0aW9uKCdzZWxlY3RlZEl0ZW0nLCBvcHRpb25zLnN1YnZhbHVlc1tvcHRpb25zLnN1YnZhbHVlcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfVxyXG4gICAgfV1cclxuICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFyT3B0aW9ucztcclxuXHJcbiAgY29uc3QgdXBkYXRlVG9vbGJhclN0YXRlID0gKGhhc1NlbGVjdGVkSXRlbTogYm9vbGVhbikgPT4ge1xyXG4gICAgZWRpdEJ1dHRvbiAmJiBlZGl0QnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhaGFzU2VsZWN0ZWRJdGVtKTtcclxuICB9O1xyXG5cclxuICBjb25zdCB0b29sYmFyID0gbmV3IERldkV4cHJlc3MudWkuZHhUb29sYmFyKCR0b29sYmFyQ29udGFpbmVyLCB0b29sYmFyT3B0aW9ucyk7XHJcbiAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gIGNvbnN0IGxpc3RPcHRpb25zID0ge1xyXG4gICAgZGF0YVNvdXJjZTogbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgbG9hZDogKCkgPT4gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pLnN1YnZhbHVlcyxcclxuICAgICAgcmVtb3ZlOiAoKSA9PiB7IH1cclxuICAgIH0gYXMgYW55KSxcclxuICAgIGRpc3BsYXlFeHByOiAnbmFtZScsXHJcbiAgICBoZWlnaHQ6ICcyMDBweCcsXHJcbiAgICBrZXlFeHByOiAna2V5JyxcclxuICAgIG5vRGF0YVRleHQ6ICdBZGQgYSBTdWJ2YWx1ZScsXHJcbiAgICBhbGxvd0l0ZW1EZWxldGluZzogdHJ1ZSxcclxuICAgIGl0ZW1EZWxldGVNb2RlOiAnc3RhdGljJyxcclxuICAgIHNlbGVjdGlvbk1vZGU6ICdzaW5nbGUnLFxyXG4gICAgb25Db250ZW50UmVhZHkoZSkgeyB1cGRhdGVUb29sYmFyU3RhdGUoISFlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSXRlbScpKTsgfSxcclxuICAgIG9uSXRlbVJlbmRlcmVkKGUpIHtcclxuICAgICAgY29uc3QgaXRlbURhdGEgPSBlLml0ZW1EYXRhIGFzIElTdWJ2YWx1ZU9wdGlvbnM7XHJcbiAgICAgIGlmIChpdGVtRGF0YS5rZXkgPT09IC0xKSB7XHJcbiAgICAgICAgY29uc3QgZGVsZXRlRWxlbWVudCA9IGUuaXRlbUVsZW1lbnRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZHgtbGlzdC1zdGF0aWMtZGVsZXRlLWJ1dHRvbi1jb250YWluZXInKVswXSBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgICAgICBkZWxldGVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvblNlbGVjdGlvbkNoYW5nZWQoZSkge1xyXG4gICAgICB1cGRhdGVUb29sYmFyU3RhdGUoISFlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSXRlbScpKTtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKTtcclxuICAgICAgZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJywgc2VsZWN0ZWRJdGVtKTtcclxuICAgICAgY29uc3Qgd2FzZm9ybVZpc2libGUgPSBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtDU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JykgPT09ICdibG9jayc7XHJcbiAgICAgIGNvbnN0IHNob3VsZEZvcm1CZVZpc2libGUgPSAhIXNlbGVjdGVkSXRlbTtcclxuICAgICAgaWYgKCF3YXNmb3JtVmlzaWJsZSAmJiBzaG91bGRGb3JtQmVWaXNpYmxlIHx8IHdhc2Zvcm1WaXNpYmxlICYmICFzaG91bGRGb3JtQmVWaXNpYmxlKSB7XHJcbiAgICAgICAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsIHNob3VsZEZvcm1CZVZpc2libGUgPyAnYmxvY2snIDogJ25vbmUnKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uSXRlbURlbGV0ZWQ6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIGNvbnN0IGtleSA9IGUuaXRlbURhdGEua2V5O1xyXG4gICAgICBjb25zdCBpbmRleCA9IG9wdGlvbnMuc3VidmFsdWVzLmluZGV4T2Yob3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzdWJ2YWx1ZSkgPT4gc3VidmFsdWUua2V5ID09PSBrZXkpWzBdKTtcclxuICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICBvcHRpb25zLnN1YnZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgICBsaXN0LnJlbG9hZCgpO1xyXG4gICAgICBsaXN0Lm9wdGlvbignc2VsZWN0ZWRJdGVtJywgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keExpc3RPcHRpb25zO1xyXG5cclxuICBjb25zdCAkbGlzdENvbnRhaW5lciA9ICQoJzxkaXYgLz4nKTtcclxuICAkZWxlbWVudC5hcHBlbmQoJGxpc3RDb250YWluZXIpO1xyXG5cclxuICBsaXN0ID0gbmV3IERldkV4cHJlc3MudWkuZHhMaXN0KCRsaXN0Q29udGFpbmVyLCBsaXN0T3B0aW9ucyk7XHJcblxyXG4gIHJldHVybiBbJGVsZW1lbnQsIGxpc3QsIHRvb2xiYXJdO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRTdWJ2YWx1ZUZvcm1PcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogRGV2RXhwcmVzcy51aS5keEZvcm1PcHRpb25zIHtcclxuICBsZXQgaXRlbXNMaXN0OiBEZXZFeHByZXNzLnVpLmR4TGlzdCB8IG51bGwgPSBudWxsO1xyXG4gIGNvbnN0IHVwZGF0ZUZvcm1TdGF0ZSA9IChmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSkgPT4ge1xyXG4gICAgY29uc3QgdmFsdWVFZGl0b3IgPSBmb3JtLmdldEVkaXRvcigndmFsdWUnKTtcclxuICAgIGNvbnN0IG1lYXN1cmVJZEVkaXRvciA9IGZvcm0uZ2V0RWRpdG9yKCdtZWFzdXJlSWQnKTtcclxuICAgIGNvbnN0IG5hbWVFZGl0b3IgPSBmb3JtLmdldEVkaXRvcignbmFtZScpO1xyXG4gICAgY29uc3QgaXNCb3VuZCA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLmlzQm91bmQ7XHJcbiAgICBjb25zdCBpc1RhcmdldFZhbHVlID0gZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykua2V5ID09PSAtMTtcclxuXHJcbiAgICB2YWx1ZUVkaXRvciAmJiB2YWx1ZUVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgaXNCb3VuZCk7XHJcbiAgICBtZWFzdXJlSWRFZGl0b3IgJiYgbWVhc3VyZUlkRWRpdG9yLm9wdGlvbignZGlzYWJsZWQnLCAhaXNCb3VuZCk7XHJcblxyXG4gICAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7SVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgIWlzVGFyZ2V0VmFsdWUgPyAnZmxleCcgOiAnbm9uZScpO1xyXG4gICAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7VkFMVUVfSVRFTV9DU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgIWlzVGFyZ2V0VmFsdWUgPyAnZmxleCcgOiAnbm9uZScpO1xyXG4gICAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7TUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAhaXNUYXJnZXRWYWx1ZSA/ICdmbGV4JyA6ICdub25lJyk7XHJcblxyXG4gICAgbmFtZUVkaXRvciAmJiBuYW1lRWRpdG9yLm9wdGlvbignZGlzYWJsZWQnLCBpc1RhcmdldFZhbHVlKTtcclxuICB9O1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZm9ybURhdGE6IG51bGwsXHJcbiAgICBjb2xDb3VudDogMixcclxuICAgIGl0ZW1zOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBjYXB0aW9uOiAnU3VidmFsdWVzIGl0ZW1zJyxcclxuICAgICAgICB0ZW1wbGF0ZTogKGFyZ3MpID0+IHtcclxuICAgICAgICAgIGNvbnN0IFskY29udGFpbmVyLCBsaXN0XSA9IGNyZWF0ZUxpc3RBbmRUb29sYmFyKGFyZ3MuY29tcG9uZW50LCBnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgaXRlbXNMaXN0ID0gbGlzdDtcclxuXHJcbiAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ3N1YnZhbHVlRWRpdG9yJyxcclxuICAgICAgICBjc3NDbGFzczogQ1NTX0NMQVNTLFxyXG4gICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgIGNhcHRpb246ICdJdGVtIG9wdGlvbnMnLFxyXG4gICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ25hbWUnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogTkFNRV9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4VGV4dEJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB2YWx1ZUNoYW5nZUV2ZW50OiAna2V5dXAnXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNCb3VuZCcsXHJcbiAgICAgICAgICAgIGNzc0NsYXNzOiBJU19CT1VORF9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4UmFkaW9Hcm91cCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICBsYXlvdXQ6ICdob3Jpem9udGFsJyxcclxuICAgICAgICAgICAgICBpdGVtczogW3tcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdVbmJvdW5kJywgdmFsdWU6IGZhbHNlXHJcbiAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ0JvdW5kJywgdmFsdWU6IHRydWVcclxuICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhSYWRpb0dyb3VwLlByb3BlcnRpZXMsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1R5cGUnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAndmFsdWUnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogVkFMVUVfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1ZhbHVlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHNob3dTcGluQnV0dG9uczogdHJ1ZSxcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4TnVtYmVyQm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ21lYXN1cmVJZCcsXHJcbiAgICAgICAgICAgIGNzc0NsYXNzOiBNRUFTVVJFX0lEX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdIaWRkZW4gbWVhc3VyZXMnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IGdhdWdlSXRlbS5oaWRkZW5NZWFzdXJlcygpLm1hcCgobWVhc3VyZSkgPT4gKHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IGdldE1lYXN1cmVEaXNhcGxheVRleHQobWVhc3VyZSksXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogbWVhc3VyZS51bmlxdWVOYW1lKClcclxuICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnY29sb3InLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogQ09MT1JfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2NvbG9yJyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4Q29sb3JCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdDb2xvcicsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXVxyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgb25Db250ZW50UmVhZHkoZSkgeyB1cGRhdGVGb3JtU3RhdGUoZS5jb21wb25lbnQpOyB9LFxyXG4gICAgb25GaWVsZERhdGFDaGFuZ2VkKGUpIHtcclxuICAgICAgY29uc3QgZm9ybURhdGEgPSBlLmNvbXBvbmVudC5vcHRpb24oJ2Zvcm1EYXRhJykgYXMgSVN1YnZhbHVlT3B0aW9ucztcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuICAgICAgY29uc3QgZWRpdGVkU3VidmFsdWUgPSBvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKHN1YnZhbHVlKSA9PiBzdWJ2YWx1ZS5rZXkgPT09IGZvcm1EYXRhLmtleSlbMF07XHJcblxyXG4gICAgICBvcHRpb25zLnN1YnZhbHVlc1tvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKGVkaXRlZFN1YnZhbHVlKV0gPSBmb3JtRGF0YTtcclxuICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xyXG5cclxuICAgICAgaWYgKGVkaXRlZFN1YnZhbHVlICYmIGVkaXRlZFN1YnZhbHVlLm5hbWUgIT09IGZvcm1EYXRhLm5hbWUgJiYgaXRlbXNMaXN0KSB7XHJcbiAgICAgICAgaXRlbXNMaXN0LnJlcGFpbnQoKTtcclxuICAgICAgfVxyXG4gICAgICB1cGRhdGVGb3JtU3RhdGUoZS5jb21wb25lbnQpO1xyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRNZWFzdXJlRGlzYXBsYXlUZXh0KG1lYXN1cmU6IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLk1lYXN1cmUpOiBzdHJpbmcge1xyXG4gIGlmIChtZWFzdXJlLm5hbWUoKSkge1xyXG4gICAgcmV0dXJuIG1lYXN1cmUubmFtZSgpO1xyXG4gIH1cclxuXHJcbiAgbGV0IHJlc3VsdCA9IG1lYXN1cmUuZGF0YU1lbWJlcigpO1xyXG4gIGlmIChtZWFzdXJlLnN1bW1hcnlUeXBlICYmIG1lYXN1cmUuc3VtbWFyeVR5cGUoKSkge1xyXG4gICAgcmVzdWx0ICs9IGAgKCR7bWVhc3VyZS5zdW1tYXJ5VHlwZSgpfSlgO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0SW5kaWNhdG9yRm9ybU9wdGlvbnMoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pOiBEZXZFeHByZXNzLnVpLmR4Rm9ybU9wdGlvbnMge1xyXG4gIGNvbnN0IGN1cnJlbnRWaWV3VHlwZSA9IGdhdWdlSXRlbS52aWV3VHlwZSgpO1xyXG4gIGNvbnN0IGluZGljYXRvclR5cGVzID0gTElORUFSX1ZJRVdfVFlQRVMuc29tZSgodCkgPT4gdCA9PT0gY3VycmVudFZpZXdUeXBlKVxyXG4gICAgPyBMSU5FQVJfSU5ESUNBVE9SX1RZUEVTXHJcbiAgICA6IENJUkNMVUFSX0lORElDQVRPUl9UWVBFUztcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGZvcm1EYXRhOiBnZXRPcHRpb25zKGdhdWdlSXRlbSkgfHwgbnVsbCxcclxuICAgIGl0ZW1zOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBjYXB0aW9uOiAnSW5kaWNhdG9yIG9wdGlvbnMnLFxyXG4gICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ3R5cGUnLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdUeXBlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBpbmRpY2F0b3JUeXBlcy5tYXAoKHQpID0+ICh7IHRleHQ6IHQsIHZhbHVlOiB0IH0pKSxcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ3dpZHRoJyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHNob3dTcGluQnV0dG9uczogdHJ1ZSxcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4TnVtYmVyQm94T3B0aW9ucyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnV2lkdGgnLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgb25GaWVsZERhdGFDaGFuZ2VkKGUpIHtcclxuICAgICAgY29uc3QgZm9ybURhdGEgPSBlLmNvbXBvbmVudC5vcHRpb24oJ2Zvcm1EYXRhJykgYXMgSUdhdWdlU3VidmFsdWVzT3B0aW9ucztcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuXHJcbiAgICAgIG9wdGlvbnMud2lkdGggPSBmb3JtRGF0YS53aWR0aDtcclxuICAgICAgb3B0aW9ucy50eXBlID0gZm9ybURhdGEudHlwZTtcclxuXHJcbiAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuICAgIH1cclxuICB9O1xyXG59XHJcblxyXG4vLyA0LiBFdmVudCBTdWJzY3JpcHRpb25cclxuZXhwb3J0IGZ1bmN0aW9uIGdhdWdlU3VidmFsdWVzRXh0ZW5zaW9uKHRoaXM6IGFueSwgZGFzaGJvYXJkQ29udHJvbDogRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGFzaGJvYXJkQ29udHJvbCkge1xyXG4gIHRoaXMubmFtZSA9ICdHYXVnZVN1YnZhbHVlcyc7XHJcbiAgdGhpcy5zdGFydCA9ICgpID0+IHtcclxuICAgIGNvbnN0IHZpZXdlckFwaUV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbigndmlld2VyLWFwaScpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLlZpZXdlckFwaUV4dGVuc2lvbjtcclxuICAgIGlmICh2aWV3ZXJBcGlFeHRlbnNpb24pIHtcclxuICAgICAgdmlld2VyQXBpRXh0ZW5zaW9uLm9uKCdpdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkJywgb25JdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9wdGlvbnNQYW5lbEV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbignaXRlbS1vcHRpb25zLXBhbmVsJykgYXMgYW55O1xyXG4gICAgaWYgKG9wdGlvbnNQYW5lbEV4dGVuc2lvbikge1xyXG4gICAgICBvcHRpb25zUGFuZWxFeHRlbnNpb24ub24oJ2N1c3RvbWl6ZVNlY3Rpb25zJywgb25DdXN0b21pemVTZWN0aW9ucyk7XHJcbiAgICB9XHJcbiAgfTtcclxuICB0aGlzLnN0b3AgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB2aWV3ZXJBcGlFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ3ZpZXdlci1hcGknKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5WaWV3ZXJBcGlFeHRlbnNpb247XHJcbiAgICBpZiAodmlld2VyQXBpRXh0ZW5zaW9uKSB7XHJcbiAgICAgIHZpZXdlckFwaUV4dGVuc2lvbi5vZmYoJ2l0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQnLCBvbkl0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCdpdGVtLW9wdGlvbnMtcGFuZWwnKSBhcyBhbnk7XHJcbiAgICBpZiAob3B0aW9uc1BhbmVsRXh0ZW5zaW9uKSB7XHJcbiAgICAgIG9wdGlvbnNQYW5lbEV4dGVuc2lvbi5vZmYoJ2N1c3RvbWl6ZVNlY3Rpb25zJywgb25DdXN0b21pemVTZWN0aW9ucyk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSURhc2hib2FyZFBlcm1pc3Npb25zLCBJRGFzaGJvYXJkVXJscywgSVJlcG9ydFBhcmFtcyB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbiB9IGZyb20gJy4vRXh0ZW5zaW9ucy9HYXVnZVN1YnZhbHVlc0V4dGVuc2lvbic7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcblxyXG5jb25zdCBEQVNIQk9BUkRfTU9ERV9LRVkgPSAnREFTSEJPQVJEX01PREVfS0VZJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURhc2hib2FyZE9wdGlvbnMge1xyXG4gICRkYXNoYm9hcmRDb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcGVybWlzc2lvbnM6IElEYXNoYm9hcmRQZXJtaXNzaW9ucztcclxuICB1cmxzOiBJRGFzaGJvYXJkVXJscztcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRkYXNoYm9hcmRDb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBJRGFzaGJvYXJkUGVybWlzc2lvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxzOiBJRGFzaGJvYXJkVXJscztcclxuICBwcml2YXRlIHJlZnJlc2hCdXR0b246IFJlZnJlc2hCdXR0b24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBkYXNoYm9hcmQ6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSURhc2hib2FyZE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGRhc2hib2FyZENvbnRhaW5lciA9IG9wdGlvbnMuJGRhc2hib2FyZENvbnRhaW5lcjtcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLnJlcG9ydElkID0gb3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgICB0aGlzLnBlcm1pc3Npb25zID0gb3B0aW9ucy5wZXJtaXNzaW9ucztcclxuICAgIHRoaXMudXJscyA9IG9wdGlvbnMudXJscztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IHJlcG9ydElkU3RyID0gdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgJiYgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQudG9TdHJpbmcoKTtcclxuXHJcbiAgICBEZXZFeHByZXNzLkRhc2hib2FyZC5SZXNvdXJjZU1hbmFnZXIuZW1iZWRCdW5kbGVkUmVzb3VyY2VzKCk7XHJcblxyXG4gICAgbGV0IG1vZGU6IERldkV4cHJlc3MuRGFzaGJvYXJkLldvcmtpbmdNb2RlID0gdGhpcy5wZXJtaXNzaW9ucy5BbGxvd0VkaXRpbmdcclxuICAgICAgPyB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuV29ya2luZ01vZGUgfHwgJ1ZpZXdlcidcclxuICAgICAgOiAnVmlld2VyJztcclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBOT1RFOiBEYXNoYm9hcmQgMTguMSBkb2Vzbid0IHN1cHBvcnQgZXhwb3J0LiBXZSBoaWRlIHRoZSBleHBvcnQgYnV0dG9uIHZpYSBzdHlsZXNcclxuICAgIHRoaXMuZGFzaGJvYXJkID0gbmV3IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wodGhpcy4kZGFzaGJvYXJkQ29udGFpbmVyWzBdLCB7XHJcbiAgICAgIHdvcmtpbmdNb2RlOiBtb2RlLFxyXG4gICAgICBpbml0aWFsRGFzaGJvYXJkSWQ6IHJlcG9ydElkU3RyLFxyXG4gICAgICBlbmRwb2ludDogdGhpcy51cmxzLkVuZFBvaW50LFxyXG4gICAgICBhamF4UmVtb3RlU2VydmljZToge1xyXG4gICAgICAgIGhlYWRlcnM6ICF0aGlzLnJlcG9ydFBhcmFtcy5Ub2tlbiA/IHVuZGVmaW5lZCA6IHtcclxuICAgICAgICAgIHRva2VuOiB0aGlzLnJlcG9ydFBhcmFtcy5Ub2tlblxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25EYXNoYm9hcmRJbml0aWFsaXppbmc6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQucmVnaXN0ZXJFeHRlbnNpb24obmV3IGdhdWdlU3VidmFsdWVzRXh0ZW5zaW9uKGUuY29tcG9uZW50KSk7XHJcblxyXG4gICAgICAgIGlmIChyZXBvcnRJZFN0ciAhPT0gZS5kYXNoYm9hcmRJZCkge1xyXG4gICAgICAgICAgcmVwb3J0SWRTdHIgPSBlLmRhc2hib2FyZElkO1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBlbmNvZGVVUkkodGhpcy51cmxzLlByZXZpZXdVcmwgKyBlLmRhc2hib2FyZElkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQmVmb3JlUmVuZGVyOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlZ2lzdGVyRXh0ZW5zaW9uKG5ldyBEZXZFeHByZXNzLkRhc2hib2FyZC5EZXNpZ25lci5UZXh0Qm94SXRlbUVkaXRvckV4dGVuc2lvbihlLmNvbXBvbmVudCkpO1xyXG4gICAgICB9LFxyXG4gICAgICBleHRlbnNpb25zOiB7XHJcbiAgICAgICAgJ2RhdGEtc291cmNlLXdpemFyZCc6IHtcclxuICAgICAgICAgIGVuYWJsZUN1c3RvbVNxbDogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2Rhc2hib2FyZC1leHBvcnQnOiB7XHJcbiAgICAgICAgICBhbGxvd0V4cG9ydERhc2hib2FyZEl0ZW1zOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICAnZGF0YS1pbnNwZWN0b3InOiB7XHJcbiAgICAgICAgICBhbGxvd0luc3BlY3RBZ2dyZWdhdGVkRGF0YTogdHJ1ZSxcclxuICAgICAgICAgIGFsbG93SW5zcGVjdFJhd0RhdGE6IHRydWUsXHJcbiAgICAgICAgICBvbkdyaWRJbml0aWFsaXplZDogKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZ3JpZCA9IGUuY29tcG9uZW50IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICAgICAgICAgICAgZ3JpZC5vcHRpb24oJ2V4cG9ydC5lbmFibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhc2hib2FyZC5yZW5kZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5wZXJtaXNzaW9ucy5BbGxvd0VkaXRpbmcpIHtcclxuICAgICAgY29uc3QgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiBtb2RlID09PSAnVmlld2VyJyA/ICdTd2l0Y2ggdG8gRGVzaWduZXInIDogJ1N3aXRjaCB0byBWaWV3ZXInLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIG1vZGUgPSBtb2RlID09PSAnVmlld2VyJyA/ICdEZXNpZ25lcicgOiAnVmlld2VyJztcclxuXHJcbiAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgbW9kZSk7XHJcblxyXG4gICAgICAgICAgaWYgKG1vZGUgPT09ICdWaWV3ZXInKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkLnN3aXRjaFRvVmlld2VyKCk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCAnU3dpdGNoIHRvIERlc2lnbmVyJyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZC5zd2l0Y2hUb0Rlc2lnbmVyKCk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCAnU3dpdGNoIHRvIFZpZXdlcicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgIHJlbW92ZVJlZHVuZGFudFRvb2xib3hJdGVtcyh0aGlzLmRhc2hib2FyZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uICYmICh0aGlzLnJlZnJlc2hCdXR0b24gPSBuZXcgUmVmcmVzaEJ1dHRvbigkKCcucmVwb3J0LXJlZnJlc2gtYnV0dG9uJyksICgpID0+IHRoaXMucmVmcmVzaCgpKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGFzaGJvYXJkPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmRhc2hib2FyZCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gREFTSEJPQVJEX01PREVfS0VZICsgdGhpcy5yZXBvcnRJZDtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhc2hib2FyZD8ucmVmcmVzaCgpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlUmVkdW5kYW50VG9vbGJveEl0ZW1zKGNvbnRyb2w6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wpIHtcclxuICBjb25zdCBpdGVtc1RvUmVtb3ZlID0gWydjcmVhdGUtZGFzaGJvYXJkJywgJ29wZW4tZGFzaGJvYXJkJ107XHJcbiAgY29uc3QgdG9vbGJveCA9IGNvbnRyb2wuZmluZEV4dGVuc2lvbigndG9vbGJveCcpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLlRvb2xib3hFeHRlbnNpb247XHJcbiAgaXRlbXNUb1JlbW92ZS5mb3JFYWNoKChpdGVtSWQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0b29sYm94Lm1lbnVJdGVtcygpLmZpbHRlcigoaSkgPT4gaS5pZCA9PT0gaXRlbUlkKVswXTtcclxuXHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICB0b29sYm94LnJlbW92ZU1lbnVJdGVtKGl0ZW1JZCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElSZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgSVJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR2FudHRDaGFydE9wdGlvbnMge1xyXG4gIGNoYXJ0UG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcbiAgZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgc2hvd0hlYWRlcjogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFRhc2sge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgUGFyZW50SWQ6IG51bWJlcjtcclxuICBUaXRsZTogc3RyaW5nO1xyXG4gIFN0YXJ0OiBEYXRlO1xyXG4gIEVuZDogRGF0ZTtcclxuICBQcm9ncmVzczogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0RGVwZW5kZW5jeVxyXG57XHJcbiAgSWQ6IG51bWJlcjtcclxuICBQcmVkZWNlc3NvcklkOiBudW1iZXI7XHJcbiAgU3VjY2Vzc29ySWQ6IG51bWJlcjtcclxuICBUeXBlOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRSZXNvdXJjZSB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRSZXNvdXJjZUFzc2lnbm1lbnQge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgVGFza0lkOiBudW1iZXI7XHJcbiAgUmVzb3VyY2VJZDogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0Q2hhcnREYXRhTW9kZWwge1xyXG4gIFRhc2tzOiBJR2FudHRUYXNrW107XHJcbiAgRGVwZW5kZW5jaWVzOiBJR2FudHREZXBlbmRlbmN5W107XHJcbiAgUmVzb3VyY2VzOiBJR2FudHRSZXNvdXJjZVtdO1xyXG4gIFJlc291cmNlQXNzaWdubWVudHM6IElHYW50dFJlc291cmNlQXNzaWdubWVudFtdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0Q29sdW1uU3RhdGUge1xyXG4gIGRhdGFGaWVsZD86IHN0cmluZztcclxuICBkYXRhVHlwZT86IEdyaWREYXRhQ29sdW1uRGF0YVR5cGU7XHJcbiAgd2lkdGg/OiBzdHJpbmc7XHJcbiAgc29ydEluZGV4PzogbnVtYmVyO1xyXG4gIHNvcnRPcmRlcj86IHN0cmluZztcclxuICBjYXB0aW9uPzogc3RyaW5nO1xyXG4gIHZpc2libGU/OiBib29sZWFuO1xyXG4gIHZpc2libGVJbmRleD86IG51bWJlcjtcclxuICB0YXNrQ29sdW1uVHlwZTogR2FudHRUYXNrc0NvbHVtblR5cGU7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRTZXR0aW5ncyB7XHJcbiAgVGFza0NvbHVtbnM6IElHYW50dENvbHVtblN0YXRlW10sXHJcbiAgRGJDb25uZWN0aW9uTmFtZTogc3RyaW5nLFxyXG4gIFRhYmxlTmFtZTogc3RyaW5nLFxyXG4gIFJlc291cmNlc1RhYmxlTmFtZTogc3RyaW5nLFxyXG4gIFJlc291cmNlc0tleUZpZWxkOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VzVGV4dEZpZWxkOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50VGFibGVOYW1lOiBzdHJpbmc7XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQ6IHN0cmluZztcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZDogc3RyaW5nO1xyXG4gIFJlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZDogc3RyaW5nO1xyXG4gIERlcGVuZGVuY2llc1RhYmxlTmFtZTogc3RyaW5nO1xyXG4gIERlcGVuZGVuY2llc0tleUZpZWxkOiBzdHJpbmc7XHJcbiAgRGVwZW5kZW5jaWVzUHJlZGVjZXNzb3JJZEZpZWxkOiBzdHJpbmc7XHJcbiAgRGVwZW5kZW5jaWVzU3VjY2Vzc29ySWRGaWVsZDogc3RyaW5nO1xyXG4gIERlcGVuZGVuY2llc1R5cGVGaWVsZDogc3RyaW5nO1xyXG5cclxuICBUYXNrVGl0bGVQb3NpdGlvbjogRGV2RXhwcmVzcy51aS5keEdhbnR0LkdhbnR0VGFza1RpdGxlUG9zaXRpb247XHJcbiAgU2NhbGVUeXBlOiBEZXZFeHByZXNzLnVpLmR4R2FudHQuR2FudHRTY2FsZVR5cGU7XHJcbiAgU3RhcnREYXRlUmFuZ2U6IHN0cmluZztcclxuICBFbmREYXRlUmFuZ2U6IHN0cmluZztcclxufVxyXG5cclxuZW51bSBHYW50dFRhc2tzQ29sdW1uVHlwZVxyXG57XHJcbiAgS2V5ID0gMSxcclxuICBUaXRsZSA9IDIsXHJcbiAgU3RhcnQgPSAzLFxyXG4gIEVuZCA9IDQsXHJcbiAgUGFyZW50SWQgPSA1LFxyXG4gIFByb2dyZXNzID0gNlxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW5udENoYXJ0IGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGVzaWduZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBWaWV3ZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfU1RPUkFHRV9NT0RFX0tFWSA9ICdDSEFSVF9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93SGVhZGVyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBtb2RlOiBNb2RlO1xyXG4gIHByaXZhdGUgaGFzRm9ybSA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGNoYXJ0OiBEZXZFeHByZXNzLnVpLmR4R2FudHQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdhbnR0Q2hhcnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLmNoYXJ0UG9zaXRpb25NYXJrZXIgPSBvcHRpb25zLmNoYXJ0UG9zaXRpb25NYXJrZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uID0gb3B0aW9ucy5hZGRSZWZyZXNoQnV0dG9uO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsID0gb3B0aW9ucy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmw7XHJcbiAgICB0aGlzLnNob3dIZWFkZXIgPSBvcHRpb25zLnNob3dIZWFkZXI7XHJcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IGdhbnR0U2V0dGluZ3M6IElHYW50dFNldHRpbmdzID0ge1xyXG4gICAgICBEYkNvbm5lY3Rpb25OYW1lOiAnJywgVGFibGVOYW1lOiAnJywgVGFza0NvbHVtbnM6IFtdLFxyXG4gICAgICBSZXNvdXJjZXNUYWJsZU5hbWU6ICcnLCBSZXNvdXJjZXNUZXh0RmllbGQ6ICcnLCBSZXNvdXJjZXNLZXlGaWVsZDogJycsXHJcbiAgICAgIFJlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQ6ICcnLCBSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWU6ICcnLFxyXG4gICAgICBEZXBlbmRlbmNpZXNLZXlGaWVsZDogJycsIERlcGVuZGVuY2llc1ByZWRlY2Vzc29ySWRGaWVsZDogJycsIERlcGVuZGVuY2llc1N1Y2Nlc3NvcklkRmllbGQ6ICcnLCBEZXBlbmRlbmNpZXNUYWJsZU5hbWU6ICcnLCBEZXBlbmRlbmNpZXNUeXBlRmllbGQ6ICcnLFxyXG4gICAgICBFbmREYXRlUmFuZ2U6IHZvaWQgMCwgU3RhcnREYXRlUmFuZ2U6IHZvaWQgMCwgVGFza1RpdGxlUG9zaXRpb246ICdvdXRzaWRlJywgU2NhbGVUeXBlOiAnYXV0bydcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSA9IFtdO1xyXG4gICAgbGV0IGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBzZW5kUmVxdWVzdChgJHt0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybH0vR2V0R2FudHRDaGFydFNldHRpbmdzYCwgJ3Bvc3QnLCB7IGlkOiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCB9LCBmYWxzZSwgeyBkYXRhVHlwZTogJ2pzb24nIH0pXHJcbiAgICAgIC50aGVuKChkYXRhOiBJR2FudHRTZXR0aW5ncykgPT4ge1xyXG4gICAgICAgIGdhbnR0U2V0dGluZ3MgPSBkYXRhO1xyXG5cclxuICAgICAgICBpZighZ2FudHRTZXR0aW5ncy5EYkNvbm5lY3Rpb25OYW1lIHx8ICFnYW50dFNldHRpbmdzLlRhYmxlTmFtZSB8fCAhZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyB8fCAhZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIGdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMgPSBbXTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBpdGVtID0gMDsgaXRlbSA8IDY7IGl0ZW0rKykge1xyXG4gICAgICAgICAgICBnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zLnB1c2goeyB0YXNrQ29sdW1uVHlwZTogR2FudHRUYXNrc0NvbHVtblR5cGVbR2FudHRUYXNrc0NvbHVtblR5cGVbaXRlbSsxXV0gfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXR1cEZvcm0oZ2FudHRTZXR0aW5ncywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YS5UYXNrQ29sdW1ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICBjb2x1bW5zW2MudGFza0NvbHVtblR5cGUtMV0gPSBjO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zID0gY29sdW1ucztcclxuXHJcbiAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoRGF0YSgpO1xyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigoZGF0YTogeyBEYXRhOiBJR2FudHRDaGFydERhdGFNb2RlbCB9KSA9PiB7XHJcbiAgICAgICAgaWYoIWlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMubW9kZSA9PT0gTW9kZS5EZXNpZ25lcikge1xyXG4gICAgICAgICAgdGhpcy5zZXR1cEZvcm0oZ2FudHRTZXR0aW5ncywgIWlzSW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXR1cENoYXJ0KGNvbHVtbnMsIGdhbnR0U2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRGF0YShkYXRhLkRhdGEpO1xyXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oZ2FudHRTZXR0aW5ncywgdHJ1ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcuZGlhZ3JhbS1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmV0Y2hEYXRhKCkge1xyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHYW50dENoYXJ0RGF0YWAsICdwb3N0JywgeyBpZDogdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTd2l0Y2hNb2RlQnV0dG9uKCkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kZSA9IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIHRoaXMubW9kZSk7XHJcbiAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3M6IElHYW50dFNldHRpbmdzLCBpbml0aWFsU2V0dXA6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaGFzRm9ybSA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgZm9ybUl0ZW1zOiBEZXZFeHByZXNzLnVpLmR4Rm9ybS5JdGVtW10gPSBbXHJcbiAgICAgIHsgZGF0YUZpZWxkOiAnRGJDb25uZWN0aW9uTmFtZScsIGNhcHRpb246ICdDb25uZWN0aW9uIE5hbWUnIH0sXHJcbiAgICAgIHsgZGF0YUZpZWxkOiAnVGFibGVOYW1lJywgY2FwdGlvbjogJ1RhYmxlJyB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBmb3IgKGxldCBpdGVtID0gMTsgaXRlbSA8IDc7IGl0ZW0rKykge1xyXG4gICAgICBmb3JtSXRlbXMucHVzaCh7IGl0ZW1UeXBlOiAnZ3JvdXAnLCBjb2xDb3VudDogOCwgaXRlbXM6IFtcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS50YXNrQ29sdW1uVHlwZWAsIHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uZGF0YUZpZWxkYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiBgJHtHYW50dFRhc2tzQ29sdW1uVHlwZVtpdGVtXX0gRGF0YSBGaWVsZGAgfSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLmNhcHRpb25gLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdDYXB0aW9uJyB9IH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uZGF0YVR5cGVgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdEYXRhVHlwZScgfSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLndpZHRoYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnV2lkdGgnIH0sIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5zb3J0SW5kZXhgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdTb3J0SW5kZXgnIH0sIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5zb3J0T3JkZXJgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdTb3J0T3JkZXInIH0sIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsIGVkaXRvck9wdGlvbnM6IHsgaXRlbXM6IFsnYXNjJywgJ2Rlc2MnXSwgc2hvd0NsZWFyQnV0dG9uOiB0cnVlIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0udmlzaWJsZWAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1Zpc2libGUnIH0sIGVkaXRvclR5cGU6ICdkeENoZWNrQm94JyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnZpc2libGVJbmRleGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1Zpc2libGVJbmRleCcgfSB9LFxyXG4gICAgICAgIF1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgY2FwdGlvbjogJ1Jlc291cmNlcycsXHJcbiAgICAgIGNvbENvdW50OiA0LFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VzVGFibGVOYW1lJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnICx0ZXh0OiAnVGFibGUnIH0sIGNvbFNwYW46IDIgfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlc0tleUZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnS2V5IEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZXNUZXh0RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUZXh0IEZpZWxkJyB9IH0sXHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKHtcclxuICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgIGNhcHRpb246ICdSZXNvdXJjZSBBc3NpZ25tZW50cycsXHJcbiAgICAgIGNvbENvdW50OiA1LFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50VGFibGVOYW1lJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGFibGUnIH0sIGNvbFNwYW46IDIgfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudEtleUZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnS2V5IEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1Rhc2sgSWQgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1Jlc291cmNlIElkIEZpZWxkJyB9IH0sXHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKHtcclxuICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgIGNhcHRpb246ICdEZXBlbmRlbmNpZXMnLFxyXG4gICAgICBjb2xDb3VudDogNixcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ0RlcGVuZGVuY2llc1RhYmxlTmFtZScsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1RhYmxlJyB9LCBjb2xTcGFuOiAyIH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdEZXBlbmRlbmNpZXNLZXlGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0tleSBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnRGVwZW5kZW5jaWVzUHJlZGVjZXNzb3JJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnUHJlZGVjZXNzb3IgSWQgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ0RlcGVuZGVuY2llc1N1Y2Nlc3NvcklkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdTdWNjZXNzb3IgSWQgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ0RlcGVuZGVuY2llc1R5cGVGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0RlcGVuZGVuY3kgVHlwZSBGaWVsZCcgfSB9XHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKHtcclxuICAgICAgaXRlbVR5cGU6ICdidXR0b24nLFxyXG4gICAgICBidXR0b25PcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMuc2F2ZUZvcm1EYXRhKGZvcm0pLnRoZW4oKCkgPT4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaChcclxuICAgICAge1xyXG4gICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgIGNhcHRpb246ICdBcHBlYXJhbmNlJyxcclxuICAgICAgICBjb2xDb3VudDogNSxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdUYXNrVGl0bGVQb3NpdGlvbicsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyB9LFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgaXRlbXM6IFsnaW5zaWRlJywgJ291dHNpZGUnLCAnbm9uZSddXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdTY2FsZVR5cGUnLFxyXG4gICAgICAgICAgICBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgfSxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGl0ZW1zOiBbJ2F1dG8nLCAnbWludXRlcycsICdob3VycycsICdkYXlzJywgJ3dlZWtzJywgJ21vbnRocycsICdxdWFydGVycycsICd5ZWFycyddXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdTdGFydERhdGVSYW5nZScsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyB9LFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhEYXRlQm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBzaG93Q2xlYXJCdXR0b246IHRydWUgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0ZUJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdFbmREYXRlUmFuZ2UnLFxyXG4gICAgICAgICAgICBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgfSxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4RGF0ZUJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgc2hvd0NsZWFyQnV0dG9uOiB0cnVlIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGVCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbVR5cGU6ICdidXR0b24nLFxyXG4gICAgICAgICAgICBidXR0b25PcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1VwZGF0ZScsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuY2hhcnQpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnQuYmVnaW5VcGRhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnQub3B0aW9uKHtcclxuICAgICAgICAgICAgICAgICAgc2NhbGVUeXBlOiBkYXRhLlNjYWxlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgdGFza1RpdGxlUG9zaXRpb246IGRhdGEuVGFza1RpdGxlUG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVJhbmdlOiBkYXRhLlN0YXJ0RGF0ZVJhbmdlID8gbmV3IERhdGUoZGF0YS5TdGFydERhdGVSYW5nZSkgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICBlbmREYXRlUmFuZ2U6IGRhdGEuRW5kRGF0ZVJhbmdlID8gbmV3IERhdGUoZGF0YS5FbmREYXRlUmFuZ2UpIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydC5lbmRVcGRhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnQucmVwYWludCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZvcm1EYXRhKGZvcm0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBmb3JtID0gJCgnPGRpdiAvPicpLmNzcygncGFkZGluZycsIDIwKS5pbnNlcnRBZnRlcih0aGlzLmNoYXJ0UG9zaXRpb25NYXJrZXIpLmR4Rm9ybSh7XHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGhlaWdodDogaW5pdGlhbFNldHVwID8gJ2NhbGMoMTAwJSAtIDUwcHgpJyA6ICdjYWxjKDUwJSAtIDUwcHgpJyxcclxuICAgICAgZm9ybURhdGE6IGdhbnR0U2V0dGluZ3MsXHJcbiAgICAgIHNjcm9sbGluZ0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGl0ZW1zOiBmb3JtSXRlbXNcclxuICAgIH0pLmR4Rm9ybSgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZUZvcm1EYXRhKGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtKSB7XHJcbiAgICBjb25zdCBkYXRhID0gZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykgYXMgSUdhbnR0U2V0dGluZ3M7XHJcblxyXG4gICAgaWYgKGRhdGEuVGFza0NvbHVtbnMpIHtcclxuICAgICAgZGF0YS5UYXNrQ29sdW1ucyA9IGRhdGEuVGFza0NvbHVtbnMuZmlsdGVyKChjKSA9PiAhIWMuZGF0YUZpZWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3QoYCR7dGhpcy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmx9L1VwZGF0ZUdhbnR0Q2hhcnRTZXR0aW5nc2AsICdwb3N0Jywge1xyXG4gICAgICBpZDogdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQsXHJcbiAgICAgIHNldHRpbmdzOiBKU09OLnN0cmluZ2lmeShmb3JtLm9wdGlvbignZm9ybURhdGEnKSlcclxuICAgIH0sIHRydWUsIHsgZGF0YVR5cGU6ICdqc29uJyB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBDaGFydCAoY29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSwgZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MpIHtcclxuICAgIGxldCB0b3RhbFdpZHRoID0gMDtcclxuICAgIGxldCB1c2VBdXRvV2lkdGggPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zTWFwcGluZyA9IHt9O1xyXG5cclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICBpZiAoYy50YXNrQ29sdW1uVHlwZSkge1xyXG4gICAgICAgIGNvbHVtbnNNYXBwaW5nW2MudGFza0NvbHVtblR5cGVdID0gYy5kYXRhRmllbGQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgY29uc3QgdyA9IHBhcnNlSW50KGMud2lkdGgpO1xyXG5cclxuICAgICAgaWYoIWlzTmFOKHcpKSB7XHJcbiAgICAgICAgdG90YWxXaWR0aCArPSB3O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHVzZUF1dG9XaWR0aCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2hhcnQgPSB0aGlzLmNoYXJ0UG9zaXRpb25NYXJrZXIuZHhHYW50dCh7XHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGhlaWdodDogdGhpcy5oYXNGb3JtID8gJzUwJScgOiAnY2FsYygxMDAlIC0gNjBweCknLFxyXG4gICAgICBmaXJzdERheU9mV2VlazogNixcclxuICAgICAgdGFza0xpc3RXaWR0aDogKCF1c2VBdXRvV2lkdGggJiYgdG90YWxXaWR0aCA+IDApID8gdG90YWxXaWR0aCA6IHZvaWQgMCxcclxuICAgICAgdG9vbGJhcjoge1xyXG4gICAgICAgIGl0ZW1zOiBbJ3pvb21JbicsICd6b29tT3V0JywgJ3NlcGFyYXRvcicsICd0YXNrRGV0YWlscyddXHJcbiAgICAgIH0sXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YXJ0RGF0ZVJhbmdlOiBnYW50dFNldHRpbmdzLlN0YXJ0RGF0ZVJhbmdlID8gbmV3IERhdGUoZ2FudHRTZXR0aW5ncy5TdGFydERhdGVSYW5nZSkgOiB2b2lkIDAsXHJcbiAgICAgIGVuZERhdGVSYW5nZTogZ2FudHRTZXR0aW5ncy5FbmREYXRlUmFuZ2UgPyBuZXcgRGF0ZShnYW50dFNldHRpbmdzLkVuZERhdGVSYW5nZSkgOiB2b2lkIDAsXHJcbiAgICAgIHNjYWxlVHlwZTogZ2FudHRTZXR0aW5ncy5TY2FsZVR5cGUsXHJcbiAgICAgIHRhc2tUaXRsZVBvc2l0aW9uOiBnYW50dFNldHRpbmdzLlRhc2tUaXRsZVBvc2l0aW9uLFxyXG4gICAgICBjb2x1bW5zOiBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKS5tYXAoKGMpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiBjLmRhdGFGaWVsZCxcclxuICAgICAgICAgIGRhdGFUeXBlOiBjLmRhdGFUeXBlLFxyXG4gICAgICAgICAgd2lkdGg6IGMud2lkdGgsXHJcbiAgICAgICAgICB2aXNpYmxlSW5kZXg6IGMudmlzaWJsZUluZGV4LFxyXG4gICAgICAgICAgc29ydEluZGV4OiBjLnNvcnRJbmRleCxcclxuICAgICAgICAgIHNvcnRPcmRlcjogYy5zb3J0T3JkZXIgJiYgKGMuc29ydE9yZGVyID09PSAnYXNjJyA/ICdhc2MnIDogJ2Rlc2MnKSxcclxuICAgICAgICAgIGNhcHRpb246IGMuY2FwdGlvbiB8fCB2b2lkIDBcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUcmVlTGlzdENvbHVtblxyXG4gICAgICB9KSxcclxuICAgICAgdGFza3M6IHtcclxuICAgICAgICBrZXlFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5LZXldLFxyXG4gICAgICAgIHN0YXJ0RXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuU3RhcnRdLFxyXG4gICAgICAgIGVuZEV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLkVuZF0sXHJcbiAgICAgICAgcGFyZW50SWRFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5QYXJlbnRJZF0sXHJcbiAgICAgICAgcHJvZ3Jlc3NFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5Qcm9ncmVzc10sXHJcbiAgICAgICAgdGl0bGVFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5UaXRsZV1cclxuICAgICAgfSxcclxuICAgICAgZGVwZW5kZW5jaWVzOiB7XHJcbiAgICAgICAga2V5RXhwcjogZ2FudHRTZXR0aW5ncy5EZXBlbmRlbmNpZXNLZXlGaWVsZCxcclxuICAgICAgICBwcmVkZWNlc3NvcklkRXhwcjogZ2FudHRTZXR0aW5ncy5EZXBlbmRlbmNpZXNQcmVkZWNlc3NvcklkRmllbGQsXHJcbiAgICAgICAgc3VjY2Vzc29ySWRFeHByOiBnYW50dFNldHRpbmdzLkRlcGVuZGVuY2llc1N1Y2Nlc3NvcklkRmllbGQsXHJcbiAgICAgICAgdHlwZUV4cHI6IGdhbnR0U2V0dGluZ3MuRGVwZW5kZW5jaWVzVHlwZUZpZWxkXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc291cmNlczoge1xyXG4gICAgICAgIGtleUV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VzS2V5RmllbGQsXHJcbiAgICAgICAgdGV4dEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VzVGV4dEZpZWxkXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc291cmNlQXNzaWdubWVudHM6IHtcclxuICAgICAgICBrZXlFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlQXNzaWdubWVudEtleUZpZWxkLFxyXG4gICAgICAgIHJlc291cmNlSWRFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZCxcclxuICAgICAgICB0YXNrSWRFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkXHJcbiAgICAgIH0sXHJcbiAgICB9KS5keEdhbnR0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiAmJiBuZXcgUmVmcmVzaEJ1dHRvbigkKCcucmVwb3J0LXJlZnJlc2gtYnV0dG9uJyksICgpID0+IHRoaXMucmVmcmVzaCgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGF0YShkYXRhOiBJR2FudHRDaGFydERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgaWYoIXRoaXMuY2hhcnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hhcnQub3B0aW9uKCd0YXNrcy5kYXRhU291cmNlJywgZGF0YS5UYXNrcyk7XHJcbiAgICB0aGlzLmNoYXJ0Lm9wdGlvbignZGVwZW5kZW5jaWVzLmRhdGFTb3VyY2UnLCBkYXRhLkRlcGVuZGVuY2llcyk7XHJcbiAgICB0aGlzLmNoYXJ0Lm9wdGlvbigncmVzb3VyY2VzLmRhdGFTb3VyY2UnLCBkYXRhLlJlc291cmNlcyk7XHJcbiAgICB0aGlzLmNoYXJ0Lm9wdGlvbigncmVzb3VyY2VBc3NpZ25tZW50cy5kYXRhU291cmNlJywgZGF0YS5SZXNvdXJjZUFzc2lnbm1lbnRzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mZXRjaERhdGEoKS50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlRGF0YShkYXRhLkRhdGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hhcnQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuY2hhcnQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5DSEFSVF9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQgeyBJUmVwb3J0UGFyYW1zLCBNb2RlIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcblxyXG5jb25zdCBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGVzaWduZXInO1xyXG5jb25zdCBTV0lUQ0hfVE9fVklFV0VSX1RFWFQgPSAnU3dpdGNoIHRvIFZpZXdlcic7XHJcbmNvbnN0IFNFU1NJT05fU1RPUkFHRV9NT0RFX0tFWSA9ICdyZXBvcnRNb2RlJztcclxuY29uc3QgQ1VSUkVOVF9VUkxfS0VZID0gJ2N1c3RvbUN1cnJlbnRVcmwnO1xyXG5cclxuZGVjbGFyZSBjb25zdCBkeFJlcG9ydERlc2lnbmVyOiBhbnk7XHJcbmNvbnN0IGtvID0gKHdpbmRvdyBhcyBhbnkpLmtvO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVwb3J0T3B0aW9ucyB7XHJcbiAgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBvcnQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRyZXBvcnRDb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2lnbmVyTW9kZWxVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydElkOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVwb3J0T3B0aW9ucykge1xyXG4gICAgdGhpcy4kcmVwb3J0Q29udGFpbmVyID0gb3B0aW9ucy4kcmVwb3J0Q29udGFpbmVyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmRlc2lnbmVyTW9kZWxVcmwgPSBvcHRpb25zLmRlc2lnbmVyTW9kZWxVcmw7XHJcbiAgICB0aGlzLnJlcG9ydElkID0gb3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG5cclxuICBpbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IG1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuICAgIGxldCBidXR0b24gPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcucmVwb3J0LWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6IG1vZGUgPT09IE1vZGUuVmlld2VyID8gU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiBTV0lUQ0hfVE9fVklFV0VSX1RFWFQsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgbW9kZSA9IG1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xyXG4gICAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIG1vZGUpO1xyXG4gICAgICAgICAgdGhpcy5zd2l0Y2hNb2RlKG1vZGUsIGJ1dHRvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3JlYXRlUmVwb3J0RGVzaWduZXIodGhpcy4kcmVwb3J0Q29udGFpbmVyLCB0aGlzLmRlc2lnbmVyTW9kZWxVcmwsICdkeFJlcG9ydERlc2lnbmVyJywgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQudG9TdHJpbmcoKSwgKHMpID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGUsIGJ1dHRvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgbW9kZSA9PT0gTW9kZS5WaWV3ZXIpO1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBpc05vdFNhdmVkUmVwb3J0ID0gZHhSZXBvcnREZXNpZ25lciAmJiBkeFJlcG9ydERlc2lnbmVyLkdldERlc2lnbmVyTW9kZWwoKSAmJiBkeFJlcG9ydERlc2lnbmVyLkdldERlc2lnbmVyTW9kZWwoKS5pc0RpcnR5O1xyXG5cclxuICAgICAgaWYgKGlzTm90U2F2ZWRSZXBvcnQpIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9ICdUaGUgcmVwb3J0IGRvY3VtZW50IGlzIG5vdCBzYXZlZC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlIHRoZSBwYWdlPyc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVQcmV2aWV3KGRlc2lnbmVyKSB7XHJcbiAgICBjb25zdCByZXBvcnRQcmV2aWV3ID0gZGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldztcclxuICAgIGNvbnN0IFJlcG9ydFByZXZpZXdTZXJ2aWNlID0gKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuSW50ZXJuYWwuUmVwb3J0UHJldmlld1NlcnZpY2U7XHJcblxyXG4gICAgcmVwb3J0UHJldmlldy5pbml0aWFsaXplKFJlcG9ydFByZXZpZXdTZXJ2aWNlLmluaXRpYWxpemVQcmV2aWV3KGRlc2lnbmVyLmRlc2lnbmVyTW9kZWwubW9kZWwoKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hNb2RlKG1vZGU6IE1vZGUsIGJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbikge1xyXG4gICAgaWYgKG1vZGUgPT09IE1vZGUuVmlld2VyKSB7XHJcbiAgICAgIGR4UmVwb3J0RGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5wcmV2aWV3VmlzaWJsZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVByZXZpZXcoZHhSZXBvcnREZXNpZ25lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcucHJldmlld1Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgZHhSZXBvcnREZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LmRlYWN0aXZhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZVN3aXRjaE1vZGVCdXR0b24obW9kZSwgYnV0dG9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU3dpdGNoTW9kZUJ1dHRvbihtb2RlOiBNb2RlLCBidXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24pIHtcclxuICAgIGlmIChidXR0b24pIHtcclxuICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIG1vZGUgPT09IE1vZGUuVmlld2VyID8gU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiBTV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZXBvcnREZXNpZ25lcihcclxuICAgICRyZXBvcnRDb250YWluZXI6IEpRdWVyeSxcclxuICAgIGRlc2lnbmVyTW9kZWxVcmw6IHN0cmluZyxcclxuICAgIGdsb2JhbE5hbWU6IHN0cmluZyxcclxuICAgIHJlcG9ydElkU3RyOiBzdHJpbmcsXHJcbiAgICBvbkluaXRIYW5kbGVyOiAoc2VuZGVyOiBhbnkpID0+IHZvaWQsXHJcbiAgICBpc1ByZXZpZXdNb2RlOiBib29sZWFuXHJcbiAgKTogSlF1ZXJ5PEhUTUxFbGVtZW50PiB7XHJcbiAgICBjb25zdCBkZXNpZ25lciA9ICRyZXBvcnRDb250YWluZXJcclxuICAgICAgLmF0dHIoJ2RhdGEtYmluZCcsICdkeFJlcG9ydERlc2lnbmVyOiBkZXNpZ25lck9wdGlvbnMnKVxyXG4gICAgICAuYWRkQ2xhc3MoJ3JlcG9ydC1kZXNpZ25lcicpO1xyXG5cclxuICAgIGNvbnN0IGRlc2lnbmVyT3B0aW9ucyA9IHtcclxuICAgICAgcmVwb3J0VXJsOiByZXBvcnRJZFN0cixcclxuICAgICAgcmVxdWVzdE9wdGlvbnM6IHtcclxuICAgICAgICBnZXREZXNpZ25lck1vZGVsQWN0aW9uOiBkZXNpZ25lck1vZGVsVXJsXHJcbiAgICAgIH0sXHJcbiAgICAgIGNhbGxiYWNrczoge1xyXG4gICAgICAgIEJlZm9yZVJlbmRlcjogKHMpID0+IHtcclxuICAgICAgICAgICh3aW5kb3cgYXMgYW55KVtnbG9iYWxOYW1lXSA9IHM7XHJcblxyXG4gICAgICAgICAgaWYgKGlzUHJldmlld01vZGUpIHtcclxuICAgICAgICAgICAgcy5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gdHJ1ZSA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgb25Jbml0SGFuZGxlcihzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIEN1c3RvbWl6ZU1lbnVBY3Rpb25zOiB0aGlzLkN1c3RvbWl6ZU1lbnVBY3Rpb25zLFxyXG4gICAgICAgIFByZXZpZXdDdXN0b21pemVNZW51QWN0aW9uczogdGhpcy5QcmV2aWV3Q3VzdG9taXplTWVudUFjdGlvbnMsXHJcbiAgICAgICAgUmVwb3J0T3BlbmVkOiAocywgZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzUHJldmlld01vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplUHJldmlldyhzKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLlJlcG9ydE9wZW5lZChzLCBlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIFJlcG9ydFRhYkNsb3NlZDogdGhpcy5SZXBvcnRUYWJDbG9zZWRcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBrby5hcHBseUJpbmRpbmdzKHsgZGVzaWduZXJPcHRpb25zIH0sIGRlc2lnbmVyWzBdKTtcclxuXHJcbiAgICByZXR1cm4gZGVzaWduZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFByZXZpZXdDdXN0b21pemVNZW51QWN0aW9ucyhzLCBlKSB7XHJcbiAgICBjb25zdCBzaG93RGVzaWduZXJJdGVtID0gZS5HZXRCeUlkKChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLlZpZXdlci5BY3Rpb25JZC5EZXNpZ24pO1xyXG5cclxuICAgIGlmIChzaG93RGVzaWduZXJJdGVtKSB7XHJcbiAgICAgIHNob3dEZXNpZ25lckl0ZW0udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBDdXN0b21pemVNZW51QWN0aW9ucyhzLCBlKSB7XHJcbiAgICBjb25zdCBBY3Rpb25JZCA9IChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLkRlc2lnbmVyLkFjdGlvbnMuQWN0aW9uSWQ7XHJcbiAgICBjb25zdCBhY3Rpb25JZHNUb01vdmVJblRvb2xiYXI6IHN0cmluZ1tdID0gW0FjdGlvbklkLlNhdmVdO1xyXG4gICAgY29uc3QgYWN0aW9uSWRzVG9IaWRlOiBzdHJpbmdbXSA9IFtBY3Rpb25JZC5OZXdSZXBvcnQsIEFjdGlvbklkLk5ld1JlcG9ydFZpYVdpemFyZCwgQWN0aW9uSWQuT3BlblJlcG9ydCxcclxuICAgICAgQWN0aW9uSWQuUHJldmlldywgQWN0aW9uSWQuU2F2ZUFzLCBBY3Rpb25JZC5FeGl0XTtcclxuXHJcbiAgICBhY3Rpb25JZHNUb01vdmVJblRvb2xiYXIuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgY29uc3QgaXRlbSA9IGUuR2V0QnlJZChpZCk7XHJcblxyXG4gICAgICBpZiAoaXRlbSAmJiAoaXRlbS5jb250YWluZXIgPT09ICdtZW51JykpIHtcclxuICAgICAgICBpdGVtLmNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgYWN0aW9uSWRzVG9IaWRlLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSBlLkdldEJ5SWQoaWQpO1xyXG5cclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICBpdGVtLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2F2ZUFjdGlvbiA9IGUuR2V0QnlJZCgoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5EZXNpZ25lci5BY3Rpb25zLkFjdGlvbklkLlNhdmUpO1xyXG4gICAgY29uc3Qgb3JpZ0NsaWNrQWN0aW9uID0gc2F2ZUFjdGlvbi5jbGlja0FjdGlvbjtcclxuICAgIHNhdmVBY3Rpb24uY2xpY2tBY3Rpb24gPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhYiA9IHMuR2V0Q3VycmVudFRhYigpO1xyXG4gICAgICB0YWIudXJsKGtvLnVud3JhcChzW0NVUlJFTlRfVVJMX0tFWV0pKTtcclxuICAgICAgb3JpZ0NsaWNrQWN0aW9uKCk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBSZXBvcnRPcGVuZWQocywgZSkge1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldID0gc1tDVVJSRU5UX1VSTF9LRVldIHx8IGtvLm9ic2VydmFibGUoKTtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXShlLlVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFJlcG9ydFRhYkNsb3NlZChzLCBlKSB7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0gPSBzW0NVUlJFTlRfVVJMX0tFWV0gfHwga28ub2JzZXJ2YWJsZSgpO1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gU0VTU0lPTl9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRJZDtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElSZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlhZ3JhbVBhZ2VPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBkaWFncmFtQ29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERpYWdyYW1QYWdlIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIERlc2lnbmVyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IERJQUdSQU1fU1RPUkFHRV9NT0RFX0tFWSA9ICdESUFHUkFNX1NUT1JBR0VfTU9ERV9LRVknO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpYWdyYW1Db250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG5cclxuICBwcml2YXRlIG1vZGU6IE1vZGU7XHJcbiAgcHJpdmF0ZSBkaWFncmFtOiBEZXZFeHByZXNzLnVpLmR4RGlhZ3JhbTtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVmcmVzaEJ1dHRvbjogUmVmcmVzaEJ1dHRvbjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSURpYWdyYW1QYWdlT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsID0gb3B0aW9ucy5kaWFncmFtQ29udHJvbGxlclVybDtcclxuXHJcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVEaWFncmFtQ29udHJvbCgpO1xyXG4gICAgdGhpcy5pbml0RGlhZ3JhbSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICB0aGlzLmluaXRTd2l0Y2hNb2RlQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5kaWFncmFtLWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmRpYWdyYW0uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmRpYWdyYW0gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGlhZ3JhbSAmJiBzZW5kUmVxdWVzdChgJHt0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsfT9pZD0ke3RoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkfWAsICdnZXQnKS50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5pbXBvcnQoSlNPTi5zdHJpbmdpZnkoZGF0YSksIGZhbHNlKTtcclxuICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEaWFncmFtQ29udHJvbCgpIHtcclxuICAgIHRoaXMuZGlhZ3JhbSA9IHRoaXMuJGNvbnRhaW5lci5keERpYWdyYW0oe1xyXG4gICAgICBoaXN0b3J5VG9vbGJhcjoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgY29tbWFuZHM6IFsnc2VwYXJhdG9yJywgJ3VuZG8nLCAncmVkbycsICdzZXBhcmF0b3InLCB7IG5hbWU6ICdzYXZlJywgdGV4dDogJ1NhdmUnLCBpY29uOiAnc2F2ZScgfV0gYXMgYW55XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ3VzdG9tQ29tbWFuZDogKGUpID0+IHtcclxuICAgICAgICBzd2l0Y2ggKGUubmFtZSkge1xyXG4gICAgICAgICAgY2FzZSAnc2F2ZSc6XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZVJlcG9ydChlLmNvbXBvbmVudC5leHBvcnQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIHJlYWRPbmx5OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyXHJcbiAgICB9KS5keERpYWdyYW0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXREaWFncmFtKCkge1xyXG4gICAgc2VuZFJlcXVlc3QoYCR7dGhpcy5kaWFncmFtQ29udHJvbGxlclVybH0/aWQ9JHt0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZH1gLCAnZ2V0JykudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRpYWdyYW0uaW1wb3J0KEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmFkZFJlZnJlc2hCdXR0b24pIHtcclxuICAgICAgdGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJykpIHtcclxuICAgICAgICBlLnJldHVyblZhbHVlID0gJ1RoZSBkb2N1bWVudCBpcyBub3Qgc2F2ZWQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsZWF2ZSB0aGUgcGFnZT8nO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdyZWFkT25seScsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIpO1xyXG4gICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVJlcG9ydChzb3VyY2U6IHN0cmluZykge1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmwsICdwb3N0JywgeyBpZCwgc291cmNlIH0sIHRydWUpO1xyXG4gICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuRElBR1JBTV9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5pbXBvcnQge01lbnVJdGVtVHlwZX0gZnJvbSAnLi4vLi4vLi4vQnVzaW5lc3MnO1xyXG5pbXBvcnQge0lDZG1SZXBvcnRQYXJhbXMsIElHcmlkUmVwb3J0UGFyYW1zLCBJUmVwb3J0UGFyYW1zfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IFJlZnJlc2hUaW1lciBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9JbmRleCc7XHJcbmltcG9ydCBEYXNoYm9hcmRSZXBvcnRQYWdlIGZyb20gJy4uL0Rhc2hib2FyZC9JbmRleCc7XHJcbmltcG9ydCBHYW50dENoYXJ0IGZyb20gJy4uL0dhbm50Q2hhcnQvSW5kZXgnO1xyXG5pbXBvcnQgR3JpZFJlcG9ydFBhZ2UgZnJvbSAnLi4vR3JpZC9JbmRleCc7XHJcbmltcG9ydCBDRE1SZXBvcnRQYWdlIGZyb20gJy4uL0NETS9JbmRleCc7XHJcbmltcG9ydCBEWFJlcG9ydFBhZ2UgZnJvbSAnLi4vUmVwb3J0L0luZGV4JztcclxuaW1wb3J0IERpYWdyYW1SZXBvcnRQYWdlIGZyb20gJy4uL0RpYWdyYW0vSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTmVzdGVkUmVwb3J0IGV4dGVuZHMgSVJlcG9ydFBhcmFtcyB7XHJcbiAgVHlwZTogTWVudUl0ZW1UeXBlO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTbGlkZXNob3dSZXBvcnRQYXJhbXMgZXh0ZW5kcyBJUmVwb3J0UGFyYW1zIHtcclxuICBSZXBvcnRzOiBJTmVzdGVkUmVwb3J0W107XHJcbiAgRGVsYXlTZWM6IG51bWJlcjtcclxuICBSZWZyZXNoU2VjOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNsaWRlc2hvd1JlcG9ydFBhZ2VPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJU2xpZGVzaG93UmVwb3J0UGFyYW1zO1xyXG4gIGRlZmF1bHRSZXBvcnRTZXR0aW5nczogeyBba2V5IGluIE1lbnVJdGVtVHlwZV06IGFueTsgfTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2xpZGVzaG93UmVwb3J0UGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSVNsaWRlc2hvd1JlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290RWxlbWVudDogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFJlcG9ydFNldHRpbmdzOiB7IFtrZXkgaW4gTWVudUl0ZW1UeXBlXTogYW55OyB9O1xyXG4gIHByaXZhdGUgcmVwb3J0czogSVJlcG9ydENvbXBvbmVudFtdID0gW107XHJcbiAgcHJpdmF0ZSBkeEdhbGxlcnk6IERldkV4cHJlc3MudWkuZHhHYWxsZXJ5O1xyXG4gIHByaXZhdGUgcmVmcmVzaFRpbWVyOiBSZWZyZXNoVGltZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElTbGlkZXNob3dSZXBvcnRQYWdlT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLiRyb290RWxlbWVudCA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzID0gb3B0aW9ucy5kZWZhdWx0UmVwb3J0U2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICBpZiAoISF0aGlzLnJlcG9ydHMpIHtcclxuICAgICAgdGhpcy5yZXBvcnRzLmZvckVhY2goKHJlcG9ydCkgPT4ge1xyXG4gICAgICAgIHJlcG9ydC5kaXNwb3NlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB3aGlsZSAodGhpcy5yZXBvcnRzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMucmVwb3J0cy5wb3AoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlcG9ydHMgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKCEhdGhpcy5yZWZyZXNoVGltZXIpIHtcclxuICAgICAgdGhpcy5yZWZyZXNoVGltZXIuZGlzcG9zZSgpO1xyXG4gICAgICB0aGlzLnJlZnJlc2hUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVwb3J0cyAmJiB0aGlzLnJlcG9ydHMuZm9yRWFjaCgocmVwb3J0KSA9PiB7XHJcbiAgICAgIHJlcG9ydC5yZWZyZXNoKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xyXG4gICAgbGV0IGN1cnJlbnRUaW1lb3V0ID0gbnVsbDtcclxuICAgIGNvbnN0IG1heEluZGV4ID0gdGhpcy5vcHRpb25zLlJlcG9ydHMubGVuZ3RoO1xyXG5cclxuICAgIGNvbnN0IHNldHVwTmV4dEl0ZW1TZWxlY3QgPSAoKSA9PiB7XHJcbiAgICAgIGN1cnJlbnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGxldCBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xyXG5cclxuICAgICAgICBpZihuZXh0SW5kZXggPj0gbWF4SW5kZXgpIHtcclxuICAgICAgICAgIG5leHRJbmRleCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmR4R2FsbGVyeS5nb1RvSXRlbShuZXh0SW5kZXgsIHRydWUpO1xyXG4gICAgICB9LCB0aGlzLm9wdGlvbnMuRGVsYXlTZWMgKiAxMDAwKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgJHZpZXcgPSAkKCc8ZGl2IC8+JykuYXR0cih7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydCcgfSkuYXBwZW5kVG8odGhpcy4kcm9vdEVsZW1lbnQpO1xyXG4gICAgY29uc3QgJGdhbGxlcnkgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dhbGxlcnknIH0pLmR4R2FsbGVyeSh7XHJcbiAgICAgIGxvb3A6IGZhbHNlLFxyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLm9wdGlvbnMuUmVwb3J0cyxcclxuICAgICAgc2xpZGVzaG93RGVsYXk6IDAsXHJcbiAgICAgIHNob3dOYXZCdXR0b25zOiBmYWxzZSxcclxuICAgICAgc2hvd0luZGljYXRvcjogdHJ1ZSxcclxuICAgICAgc3RyZXRjaEltYWdlczogdHJ1ZSxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgIG9uSW5pdGlhbGl6ZWQ6ICgpID0+IHNldHVwTmV4dEl0ZW1TZWxlY3QoKSxcclxuICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIGN1cnJlbnRJbmRleCA9IGUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJbmRleCcpO1xyXG5cclxuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGN1cnJlbnRUaW1lb3V0KTtcclxuICAgICAgICBzZXR1cE5leHRJdGVtU2VsZWN0KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1UZW1wbGF0ZTogKHJlcG9ydFBhcmFtczogSU5lc3RlZFJlcG9ydCwgaW5kZXgsIGl0ZW1FbGVtZW50KSA9PiB7XHJcbiAgICAgICAgaXRlbUVsZW1lbnQuYXR0cih7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ2FsbGVyeS1pdGVtJyB9KS5oZWlnaHQoJzEwMCUnKTtcclxuXHJcbiAgICAgICAgY29uc3QgJHNsaWRlRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fc2xpZGUtY29udGVudCcgfSkuaGVpZ2h0KCcxMDAlJyk7XHJcbiAgICAgICAgbGV0IHJlcG9ydFNsaWRlOiBJUmVwb3J0Q29tcG9uZW50O1xyXG5cclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBzd2l0Y2ggKHJlcG9ydFBhcmFtcy5UeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkRhc2hib2FyZDpcclxuICAgICAgICAgICAgICBjb25zdCAkZGFzaGJvYXJkUG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRkYXNoYm9hcmRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IERhc2hib2FyZFJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5EYXNoYm9hcmRdIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRkYXNoYm9hcmRDb250YWluZXI6ICRkYXNoYm9hcmRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zXHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICRzbGlkZUVsZW1lbnQuZmluZCgnZGFzaGJvYXJkLXRpdGxlJykuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICRzbGlkZUVsZW1lbnQuZmluZCgnLmR4LWRhc2hib2FyZC1sYXlvdXQtY29udGFpbmVyJykuY3NzKHsgdG9wOiAwIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuR3JpZFZpZXc6XHJcbiAgICAgICAgICAgICAgY29uc3QgJGdyaWRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dyaWQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRzbGlkZUVsZW1lbnQuYWRkQ2xhc3MoJ2lzem9sZWEtdGhlbWUnKS5hZGRDbGFzcygncGFuZWwtYm9keScpO1xyXG5cclxuICAgICAgICAgICAgICAkZ3JpZFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBHcmlkUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkdyaWRWaWV3XSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICBncmlkUG9zaXRpb25NYXJrZXI6ICRncmlkUG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgYW55IGFzIElHcmlkUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5DRE06XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgQ0RNUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkNETV0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJGNvbnRhaW5lcjogJHNsaWRlRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIGFueSBhcyBJQ2RtUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5SZXBvcnQ6XHJcbiAgICAgICAgICAgICAgY29uc3QgJHJlcG9ydFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAncmVwb3J0LXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkcmVwb3J0UG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IERYUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLlJlcG9ydF0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJHJlcG9ydENvbnRhaW5lcjogJHJlcG9ydFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIElSZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkRpYWdyYW06XHJcbiAgICAgICAgICAgICAgY29uc3QgJGRpYWdyYW1Qb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3JlcG9ydC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJGRpYWdyYW1Qb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgRGlhZ3JhbVJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5EaWFncmFtXSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkY29udGFpbmVyOiAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIElSZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkdhbnR0Q2hhcnQ6XHJcbiAgICAgICAgICAgICAgY29uc3QgJGdhbnR0UG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19ncmlkLXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmFkZENsYXNzKCdpc3pvbGVhLXRoZW1lJykuYWRkQ2xhc3MoJ3BhbmVsLWJvZHknKTtcclxuXHJcbiAgICAgICAgICAgICAgJGdhbnR0UG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IEdhbnR0Q2hhcnQoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5HYW50dENoYXJ0XSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICBjaGFydFBvc2l0aW9uTWFya2VyOiAkZ2FudHRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUdyaWRSZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLk1lbnVOb2RlOlxyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5TbGlkZXNob3c6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlcG9ydFNsaWRlKSB7XHJcbiAgICAgICAgICAgIHJlcG9ydFNsaWRlLmluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnRzLnB1c2gocmVwb3J0U2xpZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDUwMCk7XHJcblxyXG4gICAgICAgICRzbGlkZUVsZW1lbnQuYXBwZW5kVG8oaXRlbUVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmR4R2FsbGVyeSA9ICRnYWxsZXJ5LmR4R2FsbGVyeSgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAkZ2FsbGVyeS5hcHBlbmRUbygkdmlldyk7XHJcblxyXG4gICAgdGhpcy5yZWZyZXNoVGltZXIgPSBuZXcgUmVmcmVzaFRpbWVyKHtjYWxsYmFjazogKCkgPT4gdGhpcy5yZWZyZXNoKCksIGVsYXBzZWRDYWxsYmFjazogKGUpID0+IHt9fSk7XHJcbiAgICB0aGlzLnJlZnJlc2hUaW1lci5zdGFydCh0aGlzLm9wdGlvbnMuUmVmcmVzaFNlYyAqIDEwMDApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1ZlbmRvci9EZXZFeHRyZW1lL2R4LmFsbC5kLnRzXCIgLz5cclxuXHJcbmV4cG9ydCB7IElMaWNlbmNlLCBNZW51SXRlbVR5cGUsIExpY2VuY2VTdGF0dXMgfSBmcm9tICcuL0J1c2luZXNzJztcclxuZXhwb3J0IHsgSUFwaVJlc3BvbnNlLCBJRHhEYXRhU291cmNlT3B0aW9ucywgSUVycm9ySW5mbywgSUxvZ29TZXR0aW5ncywgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9EYXRhJztcclxuZXhwb3J0IHtcclxuICBIZWFkZXIsIE5hdmlnYXRpb25NZW51LCBVc2VyTWVudSwgTWVudVN3aXRjaGVyLFxyXG4gIEhlYWRlclRoZW1lcywgSUhlYWRlck9wdGlvbnMsIElBcHBNZW51TW9kZWwsIElNZW51U2V0dGluZ3MsIElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCxcclxuICBJVXNlck1lbnVJdGVtLCBJVXNlck1lbnVJdGVtTW9kZWwsXHJcbn0gZnJvbSAnLi9IZWFkZXInO1xyXG5leHBvcnQgeyBJSGllcmFyY2hpY2FsLCBJUmVwb3J0QmFzZSwgSUFwcE1lbnVJdGVtQmFzZU1vZGVsLCBncmlkQ29sdW1uVHlwZXMgfSBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MnO1xyXG5leHBvcnQge1xyXG4gIElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZSwgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSwgSUdyaWRTdGF0ZSxcclxuICBJR3JpZENvbHVtblN0YXRlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZVxyXG59IGZyb20gJy4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuZXhwb3J0IHsgSUdyaWREYXRhLCBJVjJHcmlkQ29sdW1uU3RhdGUgfSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvR3JpZC9JR3JpZERhdGEnO1xyXG5leHBvcnQgeyBJQ29sdW1uTWV0YURhdGEgfSBmcm9tICcuL1JlcG9ydHMvQ29sdW1uTWV0YURhdGEnO1xyXG5leHBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XHJcblxyXG5pbXBvcnQgeyBzaG93IGFzIGJhY2tncm91bmRJbWFnZVZpZXdlciB9IGZyb20gJy4vV2lkZ2V0cy9CYWNrZ3JvdW5kSW1hZ2VWaWV3ZXInO1xyXG5pbXBvcnQgeyBMaWNlbmNlU3RhdHVzLCBNZW51SXRlbVR5cGUgfSBmcm9tICcuL0J1c2luZXNzJztcclxuaW1wb3J0IHsgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IGRhdGEgZnJvbSAnLi9EYXRhJztcclxuaW1wb3J0IEZvb3RlciwgeyBGb290ZXJJbmRpY2F0b3JTdGF0dXMgfSBmcm9tICcuL0Zvb3Rlci9JbmRleCc7XHJcbmltcG9ydCB7XHJcbiAgSGVhZGVyLFxyXG4gIE5hdmlnYXRpb25NZW51LFxyXG4gIFVzZXJNZW51LFxyXG4gIE1lbnVTd2l0Y2hlclxyXG59IGZyb20gJy4vSGVhZGVyJztcclxuXHJcbmV4cG9ydCB7XHJcbiAgRm9vdGVyLFxyXG59O1xyXG5cclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuL1dpZGdldHMvTm90aWZ5JztcclxuaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi9XaWRnZXRzL0Z1bGxTY3JlZW4nO1xyXG5pbXBvcnQgZGVmYXVsdFRvb2xiYXIgZnJvbSAnLi9XaWRnZXRzL0RlZmF1bHRUb29sYmFyJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkT2Jzb2xldGUgZnJvbSAnLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWRPYnNvbGV0ZSc7XHJcbmltcG9ydCBkZWZhdWx0VHJlZUxpc3QgZnJvbSAnLi9XaWRnZXRzL0dyaWQvRGVmYXVsdFRyZWVMaXN0JztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0ICogYXMgaW1hZ2VDcm9wRGlhbG9nIGZyb20gJy4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cnO1xyXG5pbXBvcnQgeyBBY2NvdW50U2V0dGluZ3NQYWdlIH0gZnJvbSAnLi9QYWdlcy9BY2NvdW50U2V0dGluZ3MnO1xyXG5pbXBvcnQgKiBhcyBzdHlsaW5nIGZyb20gJy4vU3R5bGluZy9JbmRleCc7XHJcbmltcG9ydCAqIGFzIHBvcHVwIGZyb20gJy4vV2lkZ2V0cy9Qb3B1cCc7XHJcbmltcG9ydCAqIGFzIGNvbmZpcm0gZnJvbSAnLi9XaWRnZXRzL0NvbmZpcm0nO1xyXG5pbXBvcnQgKiBhcyBsYW5kaW5nIGZyb20gJy4vV2lkZ2V0cy9MYW5kaW5nJztcclxuaW1wb3J0ICogYXMgaGVscGVycyBmcm9tICcuL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL1V0aWxzL0luZGV4JztcclxuaW1wb3J0ICogYXMgYWNjZXNzRGVuaWVkIGZyb20gJy4vV2lkZ2V0cy9BY2Nlc3NEZW5pZWRUb1JlcG9ydCc7XHJcbmltcG9ydCBncmlkQ29sdW1uVHlwZXMgZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcyc7XHJcbmltcG9ydCAqIGFzIENETSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvQ0RNL0luZGV4JztcclxuaW1wb3J0IHsgU2Vzc2lvbk5vdGlmaWVyIH0gZnJvbSAnLi9Db21wb25lbnRzL1Nlc3Npb25Ob3RpZmllcic7XHJcbmltcG9ydCB7IEZpbGVJbXBvcnRlciB9IGZyb20gJy4vQ29tcG9uZW50cy9GaWxlSW1wb3J0ZXIvSW5kZXgnO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkZXIgfSBmcm9tICcuL0NvbXBvbmVudHMvRmlsZVVwbG9hZGVyL0luZGV4JztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MnO1xyXG5cclxuaW1wb3J0IEdyaWRSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4JztcclxuaW1wb3J0IFNsaWRlc2hvd1JlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL1NsaWRlc2hvdy9JbmRleCc7XHJcbmltcG9ydCBEYXNoYm9hcmRSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgnO1xyXG5pbXBvcnQgRFhSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9SZXBvcnQvSW5kZXgnO1xyXG5pbXBvcnQgRGlhZ3JhbVJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0RpYWdyYW0vSW5kZXgnO1xyXG5pbXBvcnQgQ0RNUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvQ0RNL0luZGV4JztcclxuaW1wb3J0IEdhbnR0Q2hhcnRSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9HYW5udENoYXJ0L0luZGV4JztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbmNvbnN0IElzem9sZWFVSSA9IHtcclxuICBjb25maWcsXHJcblxyXG4gIEhlYWRlcixcclxuICBGb290ZXIsXHJcbiAgTmF2aWdhdGlvbk1lbnUsXHJcbiAgVXNlck1lbnUsXHJcbiAgTWVudVN3aXRjaGVyLFxyXG5cclxuICBkYXRhLFxyXG5cclxuICB3aWRnZXRzOiB7XHJcbiAgICBub3RpZnksXHJcbiAgICBmdWxsU2NyZWVuLFxyXG4gICAgcG9wdXAsXHJcbiAgICBjb25maXJtLFxyXG4gICAgbGFuZGluZyxcclxuICAgIGFjY2Vzc0RlbmllZCxcclxuICAgIGRlZmF1bHRHcmlkT2Jzb2xldGUsXHJcbiAgICBkZWZhdWx0VHJlZUxpc3QsXHJcbiAgICBkZWZhdWx0R3JpZCxcclxuICAgIGRlZmF1bHRUb29sYmFyLFxyXG4gICAgYmFja2dyb3VuZEltYWdlVmlld2VyLFxyXG4gICAgaW1hZ2VDcm9wRGlhbG9nXHJcbiAgfSxcclxuICBwYWdlczoge1xyXG4gICAgQWNjb3VudFNldHRpbmdzUGFnZVxyXG4gIH0sXHJcbiAgY29tcG9uZW50czoge1xyXG4gICAgQ0RNLFxyXG4gICAgU2Vzc2lvbk5vdGlmaWVyLFxyXG4gICAgRmlsZUltcG9ydGVyLFxyXG4gICAgRmlsZVVwbG9hZGVyLFxyXG4gIH0sXHJcblxyXG4gIHN0eWxpbmcsXHJcbiAgaGVscGVycyxcclxuICB1dGlscyxcclxuXHJcbiAgcmVwb3J0czoge1xyXG4gICAgQ0RNUmVwb3J0UGFnZSxcclxuICAgIERpYWdyYW1SZXBvcnRQYWdlLFxyXG4gICAgR3JpZFJlcG9ydFBhZ2UsXHJcbiAgICBEYXNoYm9hcmRSZXBvcnRQYWdlLFxyXG4gICAgRFhSZXBvcnRQYWdlLFxyXG4gICAgU2xpZGVzaG93UmVwb3J0UGFnZSxcclxuICAgIEdhbnR0Q2hhcnRSZXBvcnRQYWdlLFxyXG4gICAgZ3JpZENvbHVtblR5cGVzLFxyXG4gIH0sXHJcbiAgYnVzaW5lc3M6IHtcclxuICAgIExpY2VuY2VTdGF0dXMsXHJcbiAgICBNZW51SXRlbVR5cGUsXHJcbiAgICBDZG1JbXBvcnRGaWxlTW9kZSxcclxuICAgIEZvb3RlckluZGljYXRvclN0YXR1cyxcclxuICAgIEdyaWREYXRhQ29sdW1uRGF0YVR5cGVcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJc3pvbGVhVUk7XHJcblxyXG4od2luZG93IGFzIGFueSkuSXN6b2xlYVVJID0gSXN6b2xlYVVJO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLG1CQUFjLElBQU0sSUFBTTtBQUFBLGlCQUNKLEFBQWhCLE9BQU8sTUFBUyxjQUFhLEtBQU8sRUFBRSxTQUFPLFVBQ3hCLEFBQWhCLE9BQU8sTUFBUyxZQUN2QixTQUFRLEtBQUssdURBQ2IsS0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUtqQixHQUFLLFdBQVcsNkVBQTZFLEtBQUssR0FBSyxRQUNsRyxJQUFJLEtBQUssQ0FBQSxVQUE4QixLQUFPLEVBQUUsTUFBTSxHQUFLLFVBRTdEOztBQUdULG1CQUFtQixJQUFLLElBQU0sSUFBTTtBQUNsQyxjQUFJLEtB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