tnx-shared 5.0.69 → 5.0.70

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.
Files changed (104) hide show
  1. package/bundles/tnx-shared.umd.js +575 -807
  2. package/bundles/tnx-shared.umd.js.map +1 -1
  3. package/bundles/tnx-shared.umd.min.js +1 -1
  4. package/bundles/tnx-shared.umd.min.js.map +1 -1
  5. package/classes/base/data-form-base.d.ts +2 -2
  6. package/classes/base/data-form-base.d.ts.map +1 -1
  7. package/classes/base/data-list-base.d.ts +1 -3
  8. package/classes/base/data-list-base.d.ts.map +1 -1
  9. package/classes/constants.d.ts +0 -4
  10. package/classes/constants.d.ts.map +1 -1
  11. package/classes/form-schema.d.ts +4 -38
  12. package/classes/form-schema.d.ts.map +1 -1
  13. package/components/autocomplete-picker/autocomplete-picker.component.d.ts +0 -1
  14. package/components/autocomplete-picker/autocomplete-picker.component.d.ts.map +1 -1
  15. package/components/common-app-component/common-app-component.d.ts +1 -4
  16. package/components/common-app-component/common-app-component.d.ts.map +1 -1
  17. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  18. package/components/crud/crud-list/crud-list.component.d.ts +1 -6
  19. package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
  20. package/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.d.ts.map +1 -1
  21. package/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.d.ts.map +1 -1
  22. package/components/file-explorer/file-manager/file-manager.component.d.ts +2 -0
  23. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  24. package/components/file-explorer/services/download-link.service.d.ts +1 -0
  25. package/components/file-explorer/services/download-link.service.d.ts.map +1 -1
  26. package/components/file-explorer/services/file-explorer.service.d.ts +2 -0
  27. package/components/file-explorer/services/file-explorer.service.d.ts.map +1 -1
  28. package/components/file-explorer/services/file-object.service.d.ts +1 -0
  29. package/components/file-explorer/services/file-object.service.d.ts.map +1 -1
  30. package/components/file-explorer/signature-detail/signature-detail.component.d.ts +8 -0
  31. package/components/file-explorer/signature-detail/signature-detail.component.d.ts.map +1 -0
  32. package/components/file-explorer/signature-detail/signature-detail.component.ngfactory.d.ts.map +1 -0
  33. package/components/file-explorer/signature-detail/signature-detail.component.scss.shim.ngstyle.d.ts.map +1 -0
  34. package/components/mask/mask.component.d.ts +0 -2
  35. package/components/mask/mask.component.d.ts.map +1 -1
  36. package/configs/component-context.constant.d.ts +0 -1
  37. package/configs/component-context.constant.d.ts.map +1 -1
  38. package/esm2015/classes/base/data-form-base.js +5 -5
  39. package/esm2015/classes/base/data-list-base.js +23 -48
  40. package/esm2015/classes/constants.js +1 -6
  41. package/esm2015/classes/form-schema.js +3 -34
  42. package/esm2015/components/autocomplete-picker/autocomplete-picker.component.js +16 -72
  43. package/esm2015/components/common-app-component/app.menu.component.js +2 -2
  44. package/esm2015/components/common-app-component/common-app-component.js +3 -26
  45. package/esm2015/components/crud/crud-form/crud-form.component.js +2 -9
  46. package/esm2015/components/crud/crud-list/crud-list.component.js +6 -71
  47. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.js +3 -29
  48. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.js +3 -29
  49. package/esm2015/components/file-explorer/file-manager/file-manager.component.js +151 -12
  50. package/esm2015/components/file-explorer/services/download-link.service.js +4 -1
  51. package/esm2015/components/file-explorer/services/file-explorer.service.js +22 -8
  52. package/esm2015/components/file-explorer/services/file-object.service.js +15 -1
  53. package/esm2015/components/file-explorer/signature-detail/signature-detail.component.js +66 -0
  54. package/esm2015/components/mask/mask.component.js +4 -8
  55. package/esm2015/components/workflow/services/entity-workflow-history.service.js +3 -3
  56. package/esm2015/components/workflow/services/entity-workflow-setting.service.js +4 -4
  57. package/esm2015/configs/component-context.constant.js +2 -3
  58. package/esm2015/models/grid-info.js +1 -1
  59. package/esm2015/pipes/tn-date.pipe.js +2 -12
  60. package/esm2015/public-api.js +7 -3
  61. package/esm2015/services/base.service.js +1 -16
  62. package/esm2015/services/common.service.js +1 -9
  63. package/esm2015/services/crud.service.js +4 -23
  64. package/esm2015/services/menu.service.js +3 -6
  65. package/esm2015/services/notifier.service.js +2 -2
  66. package/esm2015/services/permission.service.js +2 -9
  67. package/esm2015/services/template-text-v4.service.js +1 -1
  68. package/esm2015/services/user-v5.service.js +1 -1
  69. package/esm2015/services/user.service.js +2 -8
  70. package/esm2015/tnx-shared.js +22 -24
  71. package/esm2015/tnx-shared.module.js +4 -2
  72. package/fesm2015/tnx-shared.js +341 -530
  73. package/fesm2015/tnx-shared.js.map +1 -1
  74. package/models/grid-info.d.ts +0 -1
  75. package/models/grid-info.d.ts.map +1 -1
  76. package/package.json +2 -2
  77. package/pipes/tn-date.pipe.d.ts +0 -2
  78. package/pipes/tn-date.pipe.d.ts.map +1 -1
  79. package/public-api.d.ts +6 -2
  80. package/public-api.d.ts.map +1 -1
  81. package/services/base.service.d.ts +0 -1
  82. package/services/base.service.d.ts.map +1 -1
  83. package/services/common.service.d.ts +0 -4
  84. package/services/common.service.d.ts.map +1 -1
  85. package/services/crud.service.d.ts.map +1 -1
  86. package/services/menu.service.d.ts +1 -1
  87. package/services/menu.service.d.ts.map +1 -1
  88. package/services/permission.service.d.ts +0 -1
  89. package/services/permission.service.d.ts.map +1 -1
  90. package/services/template-text-v4.service.d.ts.map +1 -1
  91. package/services/user.service.d.ts.map +1 -1
  92. package/tnx-shared.d.ts +21 -23
  93. package/tnx-shared.d.ts.map +1 -1
  94. package/tnx-shared.metadata.json +1 -1
  95. package/tnx-shared.module.d.ts +2 -2
  96. package/tnx-shared.module.d.ts.map +1 -1
  97. package/tnx-shared.module.ngfactory.d.ts.map +1 -1
  98. package/components/file-explorer/models/file-settings.d.ts +0 -46
  99. package/components/file-explorer/models/file-settings.d.ts.map +0 -1
  100. package/esm2015/components/file-explorer/models/file-settings.js +0 -60
  101. package/esm2015/services/organization-base.service.js +0 -57
  102. package/services/organization-base.service.d.ts +0 -16
  103. package/services/organization-base.service.d.ts.map +0 -1
  104. package/services/organization-base.service.ngfactory.d.ts.map +0 -1
@@ -181,7 +181,24 @@ export class FileManagerComponent extends DataListBase {
181
181
  setDatasource(dataSource = []) {
182
182
  this._dataSource = dataSource;
183
183
  this._oldValue = this._value;
184
- this._value = dataSource.map(item => item.id);
184
+ const value = [];
185
+ dataSource.forEach(item => {
186
+ value.push(item.id);
187
+ if (item.name) {
188
+ item.nameWithoutExtension = item.name;
189
+ const index = item.name.lastIndexOf('.');
190
+ if (index > -1) {
191
+ item.nameWithoutExtension = item.name.substring(0, index);
192
+ }
193
+ if (item.extension) {
194
+ item.extension = item.extension.toLowerCase();
195
+ }
196
+ item.tailFile = item.name.substring(index);
197
+ item.tailFileUpper = item.tailFile.toUpperCase();
198
+ item.isFile = item.fileExplorerItemType == FileExplorerItemType.File;
199
+ }
200
+ });
201
+ this._value = value;
185
202
  if (this._oldValue != null) {
186
203
  if (JSON.stringify(this._oldValue) != JSON.stringify(this._value)) {
187
204
  this.fireEventChange();
@@ -301,6 +318,10 @@ export class FileManagerComponent extends DataListBase {
301
318
  show: false,
302
319
  formData: {}
303
320
  };
321
+ this.forms[this.formIds.signatureDetail] = {
322
+ header: 'Thông tin chữ ký số',
323
+ show: false,
324
+ };
304
325
  this.forms[this.formIds.fileVersionList] = {
305
326
  header: 'Danh sách phiên bản',
306
327
  show: false,
@@ -767,32 +788,61 @@ export class FileManagerComponent extends DataListBase {
767
788
  // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SIGN.
768
789
  // TODO: Lưu ý xử lý trường double click vào nút
769
790
  signFile(file) {
770
- this._notifierService.showConfirm('Bạn có chắc chắn muốn ký số văn bản này?').then(rs => {
791
+ this._notifierService.showConfirm('Bạn có chắc chắn muốn ký số văn bản này?').then((rs) => __awaiter(this, void 0, void 0, function* () {
771
792
  if (rs) {
793
+ let sourceFileId = file.id;
794
+ let sourceFile = file;
795
+ // Ký số file word - cần convert sang pdf trước
796
+ if (this._fileExplorerService.needConvertBeforeSign(file.name)) {
797
+ // convert file before sign
798
+ try {
799
+ const rsConvert = yield this._fileExplorerService.convertDocumentToPdfAndSave({
800
+ id: sourceFileId,
801
+ name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
802
+ folderId: file.parentFolderId,
803
+ ownerType: this._userService.getCurrentUser().userId.toString(),
804
+ });
805
+ if (!rsConvert || !rsConvert.success) {
806
+ this._notifierService.showWarning(`Có lỗi xảy ra khi chuyển đổi tài liệu ${file.name} thành pdf để ký. Vui lòng thử lại sau`);
807
+ return;
808
+ }
809
+ else {
810
+ this._notifierService.showSuccess(`Chuyển đổi tài liệu ${file.name} thành pdf thành công`);
811
+ sourceFileId = rsConvert.data;
812
+ sourceFile = { id: sourceFileId };
813
+ this._triggerProcessData();
814
+ }
815
+ }
816
+ catch (e) {
817
+ this._notifierService.showWarning(`Có lỗi xảy ra khi chuyển đổi tài liệu ${file.name} thành pdf để ký. Vui lòng thử lại sau`);
818
+ return;
819
+ }
820
+ }
772
821
  this._fileExplorerService.generateLinkDownload({
773
- fileId: file.id
822
+ fileId: sourceFileId,
774
823
  }).then(rs => {
775
- const url = this._fileExplorerService.getDownloadForSignUrl(rs.data);
824
+ const url = this._downloadLinkService.getDownloadForSignUrl(rs.data);
776
825
  const prms = {};
777
- prms['FileUploadHandler'] = `${this._moduleConfig.environment.apiDomain.fileEndpoint}/Signature/SavePhysicalSignedFile`;
826
+ prms['FileUploadHandler'] = `${this._moduleConfig.environment.apiDomain.fileEndpoint}/${this._moduleConfig.environment.apiVersion}/KySoFile/SavePhysicalSignedFile`;
778
827
  prms['SessionId'] = '';
779
828
  prms['FileName'] = url;
780
829
  // tslint:disable-next-line: variable-name
781
830
  const json_prms = JSON.stringify(prms);
782
- vgca_sign_file(json_prms, (result) => {
831
+ vgca_sign_approved(json_prms, (result) => {
783
832
  const resultObj = JSON.parse(result);
784
833
  if (resultObj.FileServer != '') {
785
834
  this._fileExplorerService.saveSignedFile({
786
- sourceFile: file,
787
- tempFileId: resultObj.FileServer
835
+ sourceFile: sourceFile,
836
+ tempFileId: resultObj.FileServer,
788
837
  }).then(rss => {
838
+ this._triggerProcessData();
789
839
  this._notifierService.showSuccess('Ký số thành công');
790
840
  });
791
841
  }
792
842
  });
793
843
  });
794
844
  }
795
- });
845
+ }));
796
846
  }
797
847
  shareFolder(file) {
798
848
  return __awaiter(this, void 0, void 0, function* () {
@@ -813,18 +863,107 @@ export class FileManagerComponent extends DataListBase {
813
863
  }
814
864
  viewListSign(e, signatures) {
815
865
  e.stopPropagation();
816
- this.forms.signatureDetail.data = signatures;
866
+ this.model.advanceData = signatures;
817
867
  this.forms.signatureDetail.show = true;
818
868
  }
819
869
  onRowSelect(evt) {
820
870
  this.onSelected.emit(this.model.selectedItems);
821
871
  }
872
+ signMultiple() {
873
+ return __awaiter(this, void 0, void 0, function* () {
874
+ const selectedItems = this.model.selectedItems;
875
+ const hasItems = selectedItems && selectedItems.length;
876
+ if (hasItems) {
877
+ if (selectedItems.length == 1) {
878
+ this.signFile(selectedItems[0]);
879
+ }
880
+ else {
881
+ this.signFileMultiple(selectedItems);
882
+ }
883
+ }
884
+ });
885
+ }
886
+ signFileMultiple(lstFile) {
887
+ return __awaiter(this, void 0, void 0, function* () {
888
+ const prms = {};
889
+ prms['Files'] = [];
890
+ prms['FileUploadHandler'] = `${this._moduleConfig.environment.apiDomain.fileEndpoint}/${this._moduleConfig.environment.apiVersion}/KySoFile/SavePhysicalSignedFile`;
891
+ prms['SessionId'] = '';
892
+ var rs = yield this._notifierService.showConfirm('Bạn có chắc chắn muốn ký số các văn bản này?');
893
+ if (rs) {
894
+ for (const file of lstFile) {
895
+ if (!this._fileObjectService.isTypeFileKySo(file.name))
896
+ continue;
897
+ let sourceFileId = file.id;
898
+ let sourceFile = file;
899
+ if (this._fileExplorerService.needConvertBeforeSign(file.name)) {
900
+ try {
901
+ const rsConvert = yield this._fileExplorerService.convertDocumentToPdfAndSave({
902
+ id: sourceFileId,
903
+ name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
904
+ folderId: file.parentFolderId,
905
+ ownerType: this._userService.getCurrentUser().userId.toString(),
906
+ });
907
+ if (!rsConvert || !rsConvert.success) {
908
+ this._notifierService.showWarning(`Có lỗi xảy ra khi chuyển đổi tài liệu ${file.name} thành pdf để ký. Vui lòng thử lại sau`);
909
+ continue;
910
+ }
911
+ else {
912
+ const result = yield this._fileExplorerService.generateLinkDownload({ fileId: rsConvert.data });
913
+ if (result.success) {
914
+ const url = this._downloadLinkService.getDownloadForSignUrl(result.data);
915
+ prms['Files'].push({
916
+ "FileID": rsConvert.data,
917
+ "FileName": this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
918
+ "URL": url,
919
+ });
920
+ }
921
+ }
922
+ }
923
+ catch (e) {
924
+ this._notifierService.showWarning(`Có lỗi xảy ra khi chuyển đổi tài liệu ${file.name} thành pdf để ký. Vui lòng thử lại sau`);
925
+ continue;
926
+ }
927
+ }
928
+ else {
929
+ const result = yield this._fileExplorerService.generateLinkDownload({ fileId: sourceFileId });
930
+ if (result.success) {
931
+ const url = this._downloadLinkService.getDownloadForSignUrl(result.data);
932
+ prms['Files'].push({
933
+ "FileID": sourceFileId,
934
+ "FileName": file.name,
935
+ "URL": url,
936
+ });
937
+ }
938
+ }
939
+ }
940
+ const json_prms = JSON.stringify(prms);
941
+ vgca_sign_files(json_prms, (result) => {
942
+ var _a;
943
+ const resultObj = JSON.parse(result);
944
+ if ((_a = resultObj.Files) === null || _a === void 0 ? void 0 : _a.length) {
945
+ resultObj.Files.forEach((item) => __awaiter(this, void 0, void 0, function* () {
946
+ this._fileExplorerService.saveSignedFile({
947
+ sourceFile: { id: item.FileID },
948
+ tempFileId: item.FileSignedURL,
949
+ }).then(rss => {
950
+ this._triggerProcessData();
951
+ this._notifierService.showSuccess('Ký số thành công');
952
+ });
953
+ }));
954
+ }
955
+ ;
956
+ });
957
+ }
958
+ ;
959
+ });
960
+ }
822
961
  }
823
962
  FileManagerComponent.decorators = [
824
963
  { type: Component, args: [{
825
964
  // tslint:disable-next-line: component-selector
826
965
  selector: 'file-manager',
827
- template: "<div *ngIf=\"layout == _layout.LIST\" class=\"full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"p-grid fm-toolbar\">\r\n <div class=\"fm-toolbar-path\">\r\n <p-breadcrumb class=\"customBreadCrumb\" [model]=\"data.breadcrumbs\"></p-breadcrumb>\r\n </div>\r\n <div *ngIf=\"!readonly && rootFolderId\" class=\"fm-toolbar-buttons\">\r\n <button *ngIf=\"!hiddenCreateFolder\" pButton type=\"button\" pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c\" tooltipPosition=\"top\"\r\n icon=\"pi pi-folder\" class=\"p-button-text p-button-rounded\" iconPos=\"left\" (click)=\"createFolder()\">\r\n </button>\r\n\r\n <button pButton icon=\"pi pi-cloud-upload\" pTooltip=\"T\u1EA3i l\u00EAn\" tooltipPosition=\"top\" type=\"button\"\r\n class=\"p-button-rounded p-button-text p-button-primary\" (click)=\"selectFile()\"></button>\r\n\r\n <button *ngIf=\"canSelect()\" class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n\" tooltipPosition=\"top\" icon=\"fas fa-arrows-alt\" iconPos=\"left\"\r\n (click)=\"moveExplorerItems()\">\r\n </button>\r\n\r\n <ng-container *ngIf=\"canSetMove()\">\r\n <button class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"\u0110\u1EB7t \u1EDF \u0111\u00E2y\" tooltipPosition=\"top\" icon=\"far fa-hand-paper\" iconPos=\"left\"\r\n (click)=\"setMoveExplorerItems()\">\r\n </button>\r\n\r\n <button icon=\"pi pi-undo\" pButton class=\"p-button-rounded p-button-text p-button-secondary\"\r\n type=\"button\" pTooltip=\"B\u1ECF qua\" tooltipPosition=\"top\" (click)=\"cancelMove()\">\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasSelect()\">\r\n <button class=\"p-button-rounded p-button-text p-button-secondary\" pButton type=\"button\"\r\n pTooltip=\"N\u00E9n & t\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"fas fa-file-archive\" iconPos=\"left\"\r\n (click)=\"downloadMultiple()\">\r\n </button>\r\n\r\n <button pButton type=\"button\" pTooltip=\"{{ 'X\u00F3a' | translate }}\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\" iconPos=\"left\" class=\"p-button-rounded p-button-text p-button-danger\"\r\n (click)=\"deleteMutiple(model.selectedItems)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fm-grid\">\r\n <crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"_dataSource\"\r\n [disableKeypressControl]=\"true\" [showScrollBar]=\"false\" class=\"--auto-height-content --no-wrapper-padding\"\r\n (onReload)=\"_triggerProcessData($event)\" (onRowSelect)=\"onRowSelect($event)\">\r\n\r\n <ng-template #explorerItem let-rowData='rowData' let-col='col'>\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\"\r\n (click)=\"openObject(rowData)\">\r\n </span>\r\n\r\n <span class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n {{rowData.name}}\r\n <div *ngIf=\"rowData.signatures\" class=\"pull-right signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <ng-template #fileSize let-rowData='rowData'>\r\n <div *ngIf=\"rowData.isFile\">{{rowData.fileSize | fileSize}}</div>\r\n </ng-template>\r\n\r\n <ng-template #function let-rowData=\"rowData\" let-crudList=\"crudList\">\r\n <div class=\"function-list\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\"\r\n pTooltip=\"X\u00F3a\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </crud-list>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"layout == _layout.SIMPLE\" class=\"not-full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"nfl-toolbar\">\r\n <button *ngIf=\"!readonly\" type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"fas fa-cloud-upload-alt\" label=\"T\u1EA3i l\u00EAn\" (click)=\"selectFile()\"></button>\r\n </div>\r\n\r\n <div class=\"nfl-grid\">\r\n <div *ngFor=\"let rowData of _dataSource; index as i\" class=\"nfl-item\">\r\n <div class=\"nfl-no\">\r\n {{i + 1}}.\r\n </div>\r\n\r\n <div class=\"nfl-name\">\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon\">\r\n </span>\r\n <a class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n <span>{{rowData.name}}</span>\r\n <div *ngIf=\"rowData.signatures\" class=\"signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </a>\r\n </div>\r\n\r\n <div class=\"nfl-version\">\r\n v{{rowData.currentFileVersion}}\r\n </div>\r\n\r\n <div class=\"nfl-function\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\" pTooltip=\"X\u00F3a\"\r\n tooltipPosition=\"top\" icon=\"pi pi-trash\" (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!_dataSource || !_dataSource.length\" class=\"nfl-no-item\">\r\n Ch\u01B0a c\u00F3 t\u00E0i li\u1EC7u \u0111\u01B0\u1EE3c t\u1EA3i l\u00EAn\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<p-fileUpload #fileControl [name]=\"fileInForm\" mode=\"basic\" [ngStyle]=\"{'display': 'none'}\" [chooseLabel]=\"chooseLabel\"\r\n [multiple]=\"control.multiple\" [url]=\"apiUploadUrl\" [maxFileSize]=\"maxFileSize\" auto=\"true\"\r\n [invalidFileSizeMessageSummary]=\"invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"invalidFileLimitMessageDetail\" (onProgress)=\"onUploadProgress($event)\"\r\n (onBeforeUpload)=\"onBeforeUpload($event)\" (onSelect)=\"handleSelectFile($event)\" (onUpload)=\"onUploaded($event)\">\r\n</p-fileUpload>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"data.itemsMenuFile\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>\r\n\r\n<!-- T\u1EA1o m\u1EDBi/ \u0111\u1ED5i t\u00EAn th\u01B0 m\u1EE5c -->\r\n<tn-dialog *ngIf=\"forms.createFolder.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.createFolder.header | translate\" [popupSize]=\"forms[formIds.createFolder].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.createFolder)\">\r\n <folder-form #formBase [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms[formIds.createFolder].formData\" (onSaved)=\"onSavedForm(formIds.createFolder)\"\r\n (onCancel)=\"onCancelForm(formIds.createFolder)\">\r\n </folder-form>\r\n</tn-dialog>\r\n\r\n<!-- \u0110\u1ED5i t\u00EAn file -->\r\n<tn-dialog *ngIf=\"forms.renameFile.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.renameFile.header | translate\" [popupSize]=\"forms[formIds.renameFile].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.renameFile)\">\r\n <file-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"forms[formIds.renameFile].formData\"\r\n (onSaved)=\"onSavedForm(formIds.renameFile)\" (onCancel)=\"onCancelForm(formIds.renameFile)\">\r\n </file-form>\r\n</tn-dialog>\r\n\r\n<!-- Xem file tr\u1EF1c tuy\u1EBFn -->\r\n<file-viewer *ngIf=\"forms.fileViewer.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms.fileViewer.formData\" [readonly]=\"readonly\" (onClose)=\"closeFileViewer()\">\r\n</file-viewer>\r\n\r\n<!-- Xem phi\u00EAn b\u1EA3n -->\r\n<tn-dialog *ngIf=\"forms.fileVersionList.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.fileVersionList.header | translate\" [popupSize]=\"forms[formIds.fileVersionList].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.fileVersionList)\">\r\n <file-version-list *ngIf=\"forms.fileVersionList.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [fileId]=\"forms[formIds.fileVersionList].fileId\" [readonly]=\"readonly\">\r\n </file-version-list>\r\n</tn-dialog>\r\n\r\n<!--<share-file *ngIf=\"forms.shareFile.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFile.formData\">\r\n</share-file>\r\n\r\n<share-folder *ngIf=\"forms.shareFolder.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFolder.formData\">\r\n</share-folder>\r\n\r\n<signature-detail *ngIf=\"forms.signatureDetail.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.signatureDetail.formData\">\r\n</signature-detail> -->",
966
+ template: "<div *ngIf=\"layout == _layout.LIST\" class=\"full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"p-grid fm-toolbar\">\r\n <div class=\"fm-toolbar-path\">\r\n <p-breadcrumb class=\"customBreadCrumb\" [model]=\"data.breadcrumbs\"></p-breadcrumb>\r\n </div>\r\n <div *ngIf=\"!readonly && rootFolderId\" class=\"fm-toolbar-buttons\">\r\n <button *ngIf=\"!hiddenCreateFolder\" pButton type=\"button\" pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c\" tooltipPosition=\"top\"\r\n icon=\"pi pi-folder\" class=\"p-button-text p-button-rounded\" iconPos=\"left\" (click)=\"createFolder()\">\r\n </button>\r\n\r\n <button pButton icon=\"pi pi-cloud-upload\" pTooltip=\"T\u1EA3i l\u00EAn\" tooltipPosition=\"top\" type=\"button\"\r\n class=\"p-button-rounded p-button-text p-button-primary\" (click)=\"selectFile()\"></button>\r\n\r\n <button *ngIf=\"canSelect()\" class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n\" tooltipPosition=\"top\" icon=\"fas fa-arrows-alt\" iconPos=\"left\"\r\n (click)=\"moveExplorerItems()\">\r\n </button>\r\n\r\n <ng-container *ngIf=\"canSetMove()\">\r\n <button class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"\u0110\u1EB7t \u1EDF \u0111\u00E2y\" tooltipPosition=\"top\" icon=\"far fa-hand-paper\" iconPos=\"left\"\r\n (click)=\"setMoveExplorerItems()\">\r\n </button>\r\n\r\n <button icon=\"pi pi-undo\" pButton class=\"p-button-rounded p-button-text p-button-secondary\"\r\n type=\"button\" pTooltip=\"B\u1ECF qua\" tooltipPosition=\"top\" (click)=\"cancelMove()\">\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasSelect()\">\r\n <button class=\"p-button-rounded p-button-text p-button-secondary\" pButton type=\"button\"\r\n pTooltip=\"N\u00E9n & t\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"fas fa-file-archive\" iconPos=\"left\"\r\n (click)=\"downloadMultiple()\">\r\n </button>\r\n <button *ngIf=\"!control.uploadOnly\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"K\u00FD s\u1ED1 nhi\u1EC1u\" tooltipPosition=\"top\" icon=\"fas fa-signature\" iconPos=\"left\"\r\n label=\"K\u00FD s\u1ED1 nhi\u1EC1u\" (click)=\"signMultiple()\">\r\n </button>\r\n <button pButton type=\"button\" pTooltip=\"{{ 'X\u00F3a' | translate }}\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\" iconPos=\"left\" class=\"p-button-rounded p-button-text p-button-danger\"\r\n (click)=\"deleteMutiple(model.selectedItems)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fm-grid\">\r\n <crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"_dataSource\"\r\n [disableKeypressControl]=\"true\" [showScrollBar]=\"false\" class=\"--auto-height-content --no-wrapper-padding\"\r\n (onReload)=\"_triggerProcessData($event)\" (onRowSelect)=\"onRowSelect($event)\">\r\n\r\n <ng-template #explorerItem let-rowData='rowData' let-col='col'>\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\"\r\n (click)=\"openObject(rowData)\">\r\n </span>\r\n\r\n <span class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n {{rowData.name}}\r\n <div *ngIf=\"rowData.signatures\" class=\"pull-right signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <ng-template #fileSize let-rowData='rowData'>\r\n <div *ngIf=\"rowData.isFile\">{{rowData.fileSize | fileSize}}</div>\r\n </ng-template>\r\n\r\n <ng-template #function let-rowData=\"rowData\" let-crudList=\"crudList\">\r\n <div class=\"function-list\">\r\n\r\n\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\"\r\n pTooltip=\"X\u00F3a\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n (click)=\"deleteFile(rowData)\"></button>\r\n </ng-container>\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </div>\r\n </ng-template>\r\n </crud-list>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"layout == _layout.SIMPLE\" class=\"not-full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"nfl-toolbar\">\r\n <button *ngIf=\"!readonly\" type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"fas fa-cloud-upload-alt\" label=\"T\u1EA3i l\u00EAn\" (click)=\"selectFile()\"></button>\r\n </div>\r\n\r\n <div class=\"nfl-grid\">\r\n <div *ngFor=\"let rowData of _dataSource; index as i\" class=\"nfl-item\">\r\n <div class=\"nfl-no\">\r\n {{i + 1}}.\r\n </div>\r\n\r\n <div class=\"nfl-name\">\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon\">\r\n </span>\r\n <a class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n <span>{{rowData.name}}</span>\r\n <div *ngIf=\"rowData.signatures\" class=\"signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </a>\r\n </div>\r\n\r\n <div class=\"nfl-version\">\r\n v{{rowData.currentFileVersion}}\r\n </div>\r\n\r\n <div class=\"nfl-function\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\" pTooltip=\"X\u00F3a\"\r\n tooltipPosition=\"top\" icon=\"pi pi-trash\" (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!_dataSource || !_dataSource.length\" class=\"nfl-no-item\">\r\n Ch\u01B0a c\u00F3 t\u00E0i li\u1EC7u \u0111\u01B0\u1EE3c t\u1EA3i l\u00EAn\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<p-fileUpload #fileControl [name]=\"fileInForm\" mode=\"basic\" [ngStyle]=\"{'display': 'none'}\" [chooseLabel]=\"chooseLabel\"\r\n [multiple]=\"control?control.multiple:false\" [url]=\"apiUploadUrl\" [maxFileSize]=\"maxFileSize\" auto=\"true\"\r\n [invalidFileSizeMessageSummary]=\"invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"invalidFileLimitMessageDetail\" (onProgress)=\"onUploadProgress($event)\"\r\n (onBeforeUpload)=\"onBeforeUpload($event)\" (onSelect)=\"handleSelectFile($event)\" (onUpload)=\"onUploaded($event)\">\r\n</p-fileUpload>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"data.itemsMenuFile\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>\r\n\r\n<!-- T\u1EA1o m\u1EDBi/ \u0111\u1ED5i t\u00EAn th\u01B0 m\u1EE5c -->\r\n<tn-dialog *ngIf=\"forms.createFolder.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.createFolder.header | translate\" [popupSize]=\"forms[formIds.createFolder].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.createFolder)\">\r\n <folder-form #formBase [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms[formIds.createFolder].formData\" (onSaved)=\"onSavedForm(formIds.createFolder)\"\r\n (onCancel)=\"onCancelForm(formIds.createFolder)\">\r\n </folder-form>\r\n</tn-dialog>\r\n\r\n<!-- \u0110\u1ED5i t\u00EAn file -->\r\n<tn-dialog *ngIf=\"forms.renameFile.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.renameFile.header | translate\" [popupSize]=\"forms[formIds.renameFile].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.renameFile)\">\r\n <file-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"forms[formIds.renameFile].formData\"\r\n (onSaved)=\"onSavedForm(formIds.renameFile)\" (onCancel)=\"onCancelForm(formIds.renameFile)\">\r\n </file-form>\r\n</tn-dialog>\r\n\r\n<!-- Xem file tr\u1EF1c tuy\u1EBFn -->\r\n<file-viewer *ngIf=\"forms.fileViewer.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms.fileViewer.formData\" [readonly]=\"readonly\" (onClose)=\"closeFileViewer()\">\r\n</file-viewer>\r\n\r\n<!-- Xem phi\u00EAn b\u1EA3n -->\r\n<tn-dialog *ngIf=\"forms.fileVersionList.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.fileVersionList.header | translate\" [popupSize]=\"forms[formIds.fileVersionList].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.fileVersionList)\">\r\n <file-version-list *ngIf=\"forms.fileVersionList.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [fileId]=\"forms[formIds.fileVersionList].fileId\" [readonly]=\"readonly\">\r\n </file-version-list>\r\n</tn-dialog>\r\n\r\n<!--<share-file *ngIf=\"forms.shareFile.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFile.formData\">\r\n</share-file>\r\n\r\n<share-folder *ngIf=\"forms.shareFolder.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFolder.formData\">\r\n</share-folder>-->\r\n\r\n<!-- Xem ch\u1EEF k\u00FD s\u1ED1 -->\r\n<tn-dialog *ngIf=\"forms.signatureDetail.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.signatureDetail.header | translate\" [popupSize]=\"forms[formIds.signatureDetail].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.signatureDetail)\">\r\n <signature-detail [parentModel]=\"model\" [parentContext]=\"context\">\r\n </signature-detail>\r\n</tn-dialog>",
828
967
  providers: [
829
968
  {
830
969
  provide: NG_VALUE_ACCESSOR,
@@ -882,4 +1021,4 @@ FileManagerComponent.propDecorators = {
882
1021
  onChanged: [{ type: Output }],
883
1022
  onSelected: [{ type: Output }]
884
1023
  };
885
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2ZpbGUtZXhwbG9yZXIvZmlsZS1tYW5hZ2VyL2ZpbGUtbWFuYWdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELCtFQUErRTtBQUMvRSxxREFBcUQ7QUFDckQsbURBQW1EO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFZLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRixPQUFP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QUFLLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7O1lBbDNCSixTQUFTLFNBQUM7Z0JBQ1AsK0NBQStDO2dCQUMvQyxRQUFRLEVBQUUsY0FBYztnQkFDeEIsK3VXQUE0QztnQkFFNUMsU0FBUyxFQUFFO29CQUNQO3dCQUNJLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUM7d0JBQ25ELEtBQUssRUFBRSxJQUFJO3FCQUNkO29CQUNELHVCQUF1QjtpQkFDMUI7O2FBQ0o7OztZQXRCUSxjQUFjO1lBaEN1QixRQUFRO1lBUWQsY0FBYztZQU43QyxnQkFBZ0I7WUFNaEIsbUJBQW1CO1lBU25CLGFBQWE7WUFJYixlQUFlO1lBU2Ysa0JBQWtCO1lBWmxCLG1CQUFtQjtZQUNuQixlQUFlO1lBQ2YsY0FBYztZQWVkLG1CQUFtQjtZQVBuQixzQkFBc0I7WUF6QnRCLHFCQUFxQjtZQTRCckIsYUFBYTtZQUZiLGlCQUFpQjtZQUhqQixtQkFBbUI7OzswQkFnQ3ZCLFNBQVMsU0FBQyxhQUFhOzBCQUN2QixTQUFTLFNBQUMsYUFBYTtzQkFFdkIsS0FBSzs4QkFDTCxLQUFLO3FCQUNMLEtBQUs7aUNBQ0wsS0FBSzswQkFDTCxLQUFLOzRDQUNMLEtBQUs7MkNBQ0wsS0FBSzs0Q0FDTCxLQUFLOzJDQUNMLEtBQUs7NkNBQ0wsS0FBSzs0Q0FDTCxLQUFLOzZCQUdMLEtBQUs7MEJBR0wsS0FBSztxQkFDTCxLQUFLO3dCQUdMLEtBQUs7dUJBYUwsS0FBSztvQkFDTCxLQUFLO3NCQU1MLE1BQU07OEJBQ04sTUFBTTt5QkFDTixNQUFNOzBCQUNOLE1BQU07d0JBQ04sTUFBTTt5QkFDTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gJ25neC1kZXZpY2UtZGV0ZWN0b3InO1xyXG4vLyBpbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlLCBNZW51SXRlbSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbi8vIGltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAncHJpbWVuZy9jb250ZXh0bWVudSc7XHJcbi8vIGltcG9ydCB7IEZpbGVVcGxvYWQgfSBmcm9tICdwcmltZW5nL2ZpbGV1cGxvYWQnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvY29udGV4dG1lbnUnO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvZmlsZXVwbG9hZCc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBwLWNvbnRleHQvY29tcG9uZW50LWNvbnRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFMaXN0QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9kYXRhLWxpc3QtYmFzZSc7XHJcbmltcG9ydCB7IENvbW1vbkVycm9yQ29kZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29tbW9uLWVycm9yLWNvZGUnO1xyXG5pbXBvcnQgeyBNb2R1bGVDb25maWcgfSBmcm9tICcuLi8uLi8uLi9jb25maWdzL21vZHVsZS1jb25maWcnO1xyXG5pbXBvcnQgeyBFZGl0RmlsZUNvbW1hbmQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZWRpdC1maWxlLWNvbW1hbmQnO1xyXG5pbXBvcnQgeyBDb21tYW5kVHlwZSwgVG5DbGllbnRDb21tYW5kIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RuLWNsaWVudC1jb21tYW5kJztcclxuaW1wb3J0IHsgQXV0aGVuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGhlbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTW9kdWxlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21vZHVsZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IE5vdGlmaWVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTaWduYWxSU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3NpZ25hbHIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRuQ2xpZW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RuLWNsaWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsZUV4cGxvcmVySXRlbSwgRmlsZUV4cGxvcmVySXRlbVR5cGUgfSBmcm9tICcuLi9tb2RlbHMvZmlsZS1leHBsb3Jlci1pdGVtJztcclxuaW1wb3J0IHsgRmlsZVZlcnNpb25EVE8gfSBmcm9tICcuLi9tb2RlbHMvZmlsZS12ZXJzaW9uLWR0byc7XHJcbmltcG9ydCB7IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPIH0gZnJvbSAnLi4vbW9kZWxzL2dlbmVyYXRlLWxpbmstZG93bmxvYWQtZHRvJztcclxuaW1wb3J0IHsgU2VydmljZVJlcXVlc3RNb2RlbCB9IGZyb20gJy4uL21vZGVscy9zZXJ2aWNlLXJlcXVlc3QtbW9kZWwnO1xyXG5pbXBvcnQgeyBEb3dubG9hZExpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZG93bmxvYWQtbGluay5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsZURhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZmlsZS1kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWxlRXhwbG9yZXJOZXdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZmlsZS1leHBsb3Jlci1uZXcuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbGVPYmplY3RTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZmlsZS1vYmplY3Quc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbGVWZXJzaW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ZpbGUtdmVyc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRm9sZGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ZvbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTXlEcml2ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9teS1kcml2ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29sdW1uU2NoZW1hQmFzZSwgQ3J1ZEZvcm1EYXRhLCBFbnVtRmlsZUxheW91dCwgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hLCBIZWlnaHRUeXBlLCBNb2RlbFNjaGVtYSwgT3BlcmF0b3IsIFBvcHVwU2l6ZSB9IGZyb20gJy4vLi4vLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IEdyaWRJbmZvIH0gZnJvbSAnLi8uLi8uLi8uLi9tb2RlbHMvZ3JpZC1pbmZvJztcclxuaW1wb3J0IHsgRmlsZUV4cGxvcmVyU2VydmljZSB9IGZyb20gJy4vLi4vc2VydmljZXMvZmlsZS1leHBsb3Jlci5zZXJ2aWNlJztcclxuXHJcbi8vIGRlY2xhcmUgdmFyIHZnY2Ffc2lnbl9hcHByb3ZlZDogYW55O1xyXG5kZWNsYXJlIHZhciB2Z2NhX3NpZ25fcGRmOiBhbnk7XHJcbmRlY2xhcmUgdmFyIHZnY2Ffc2lnbl9maWxlOiBhbnk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ2ZpbGUtbWFuYWdlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1tYW5hZ2VyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2ZpbGUtbWFuYWdlci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRmlsZU1hbmFnZXJDb21wb25lbnQpLFxyXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ29tcG9uZW50Q29udGV4dFNlcnZpY2VcclxuICAgIF1cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBGaWxlTWFuYWdlckNvbXBvbmVudCBleHRlbmRzIERhdGFMaXN0QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdmaWxlQ29udHJvbCcpIGZpbGVDb250cm9sOiBGaWxlVXBsb2FkO1xyXG4gICAgQFZpZXdDaGlsZCgnY29udGV4dE1lbnUnKSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XHJcblxyXG4gICAgQElucHV0KCkgY29udHJvbDogRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hO1xyXG4gICAgQElucHV0KCkgZmlsZURhdGFTZXJ2aWNlOiBGaWxlRGF0YVNlcnZpY2U7XHJcbiAgICBASW5wdXQoKSBsYXlvdXQ6IEVudW1GaWxlTGF5b3V0ID0gRW51bUZpbGVMYXlvdXQuTElTVDtcclxuICAgIEBJbnB1dCgpIGhpZGRlbkNyZWF0ZUZvbGRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgbWF4RmlsZVNpemU6IG51bWJlciA9IDEwMDAwMDAwMDsgLy8gU2l6ZSBpbiBieXRlXHJcbiAgICBASW5wdXQoKSBpbnZhbGlkRmlsZVNpemVNZXNzYWdlU3VtbWFyeT86IHN0cmluZyA9ICd7MH06IFF1w6EgZHVuZyBsxrDhu6NuZyBmaWxlIGNobyBwaMOpcCwgJztcclxuICAgIEBJbnB1dCgpIGludmFsaWRGaWxlU2l6ZU1lc3NhZ2VEZXRhaWw/OiBzdHJpbmcgPSAnZHVuZyBsxrDhu6NuZyB04buRaSDEkWEgbMOgIHswfS4nO1xyXG4gICAgQElucHV0KCkgaW52YWxpZEZpbGVUeXBlTWVzc2FnZVN1bW1hcnk/OiBzdHJpbmcgPSAnezB9OiBLaMO0bmcgxJHDum5nIMSR4buLbmggZOG6oW5nIGZpbGUsICc7XHJcbiAgICBASW5wdXQoKSBpbnZhbGlkRmlsZVR5cGVNZXNzYWdlRGV0YWlsPzogc3RyaW5nID0gJ8SR4buLbmggZOG6oW5nIGZpbGUgY2hvIHBow6lwOiB7MH0uJztcclxuICAgIEBJbnB1dCgpIGludmFsaWRGaWxlTGltaXRNZXNzYWdlU3VtbWFyeT86IHN0cmluZyA9ICdRdcOhIHPhu5EgbMaw4bujbmcgZmlsZSBjaG8gcGjDqXAsICc7XHJcbiAgICBASW5wdXQoKSBpbnZhbGlkRmlsZUxpbWl0TWVzc2FnZURldGFpbD86IHN0cmluZyA9ICd04buRaSDEkWEgezB9IGZpbGUuJztcclxuXHJcbiAgICAvLyBUw6puIHRoxrAgbeG7pWMgZ+G7kWMuXHJcbiAgICBASW5wdXQoKSByb290Rm9sZGVyTmFtZTogc3RyaW5nO1xyXG5cclxuICAgIC8vIELhu5kga2V5IMSR4buDIHThuqFvIHRoxrAgbeG7pWMgZ+G7kWMuXHJcbiAgICBASW5wdXQoKSBzZXJ2aWNlQ29kZTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgZW50aXR5OiBzdHJpbmc7XHJcbiAgICBfZW50aXR5S2V5OiBzdHJpbmc7XHJcbiAgICBfaGFzTG9hZGVkU291cmNlID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzZXQgZW50aXR5S2V5KHZhbDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fZW50aXR5S2V5ID0gdmFsO1xyXG5cclxuICAgICAgICBpZiAodmFsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhc0xvYWRlZFNvdXJjZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVudGl0eUtleUNoYW5nZS5lbWl0KHRoaXMuX2VudGl0eUtleSk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlRGF0YVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Um9vdEZvbGRlckNvbnRlbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXREYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLl92YWx1ZSAhPSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KCkgb25SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGVudGl0eUtleUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGNsb3NlUG9wdXAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBwcml2YXRlIF91bnN1YmNyaWJsZUFsbCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIHByaXZhdGUgX21vZHVsZUNvbmZpZzogTW9kdWxlQ29uZmlnO1xyXG5cclxuICAgIF9vbGRWYWx1ZTogYW55O1xyXG4gICAgX3ZhbHVlOiBhbnk7XHJcbiAgICBfZGF0YVNvdXJjZTogYW55W10gPSBbXTtcclxuICAgIF9sYXlvdXQgPSBFbnVtRmlsZUxheW91dDtcclxuXHJcbiAgICAvLyBJbnN0YW5jZUlkIHRoxrAgbeG7pWMgZ+G7kWMuXHJcbiAgICByb290Rm9sZGVySWQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgcHJvZ3Jlc3NWYWx1ZSA9IDA7XHJcbiAgICBhcGlVcGxvYWRVcmwgPSAnJztcclxuICAgIGZpbGVJbkZvcm0gPSAnZmlsZSc7XHJcbiAgICBjaG9vc2VMYWJlbCA9ICdDaOG7jW4nO1xyXG4gICAgdXNlcklkOiBhbnk7XHJcblxyXG4gICAgZm9ybUlkcyA9IHtcclxuICAgICAgICBjcmVhdGVGb2xkZXI6ICdjcmVhdGVGb2xkZXInLFxyXG4gICAgICAgIHJlbmFtZUZpbGU6ICdyZW5hbWVGaWxlJyxcclxuICAgICAgICBzaGFyZUZpbGU6ICdzaGFyZUZpbGUnLFxyXG4gICAgICAgIHNoYXJlRm9sZGVyOiAnc2hhcmVGb2xkZXInLFxyXG4gICAgICAgIGZpbGVWaWV3ZXI6ICdmaWxlVmlld2VyJyxcclxuICAgICAgICBmaWxlVmVyc2lvbkxpc3Q6ICdmaWxlVmVyc2lvbkxpc3QnLFxyXG4gICAgICAgIHNpZ25hdHVyZURldGFpbDogJ3NpZ25hdHVyZURldGFpbCdcclxuICAgIH07XHJcbiAgICBmb3JtczogYW55ID0ge307XHJcbiAgICBkYXRhOiBhbnkgPSB7XHJcbiAgICAgICAgcm9vdEZvbGRlcklkOiBudWxsLFxyXG4gICAgICAgIGN1cnJlbnRGb2xkZXJJZDogbnVsbCxcclxuXHJcbiAgICAgICAgbW92aW5nOiB7XHJcbiAgICAgICAgICAgIGlzU2VsZWN0aW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtczogbnVsbCxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBicmVhZGNydW1iczogPE1lbnVJdGVtW10+W11cclxuICAgIH07XHJcbiAgICBzY3JvbGxDb25maWcgPSB7IHN1cHByZXNzU2Nyb2xsWDogdHJ1ZSwgc3VwcHJlc3NTY3JvbGxZOiB0cnVlIH07XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJvdGVjdGVkIF9teURyaXZlU2VydmljZTogTXlEcml2ZVNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBfbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9jb25maXJtU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9hdXRoZW5TZXJ2aWNlOiBBdXRoZW5TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3RuQ2xpZW50U2VydmljZTogVG5DbGllbnRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2ZpbGVWZXJzaW9uU2VydmljZTogRmlsZVZlcnNpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX21vZHVsZUNvbmZpZ1NlcnZpY2U6IE1vZHVsZUNvbmZpZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9zaWduYWxyU2VydmljZTogU2lnbmFsUlNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9maWxlRXhwbG9yZXJTZXJ2aWNlOiBGaWxlRXhwbG9yZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2ZpbGVFeHBsb3Jlck5ld1NlcnZpY2U6IEZpbGVFeHBsb3Jlck5ld1NlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9kZXZpY2VEZXRlY3RvclNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9mb2xkZXJTZXJ2aWNlOiBGb2xkZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2ZpbGVPYmplY3RTZXJ2aWNlOiBGaWxlT2JqZWN0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9kb3dubG9hZExpbmtTZXJ2aWNlOiBEb3dubG9hZExpbmtTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLl9tb2R1bGVDb25maWcgPSB0aGlzLl9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xyXG4gICAgICAgIHRoaXMuYXBpVXBsb2FkVXJsID0gdGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuZ2V0VXBsb2FkVXJsKCk7XHJcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLl91c2VyU2VydmljZS5nZXRVc2VySWRDb21iaW5lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuX2NvbXBvbmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFVwbG9hZCB3aXRoIG11bHRpcGxlIGZpbGVcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBpVXBsb2FkVXJsID0gdGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuZ2V0VXBsb2FkTXVsdGlwbGVVcmwoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUluRm9ybSA9ICdmaWxlcyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oYXNDcnVkTGlzdCA9IHRoaXMubGF5b3V0ID09IEVudW1GaWxlTGF5b3V0LkxJU1Q7XHJcbiAgICAgICAgdGhpcy5wbHVzVXJsID0gJ0J5Rm9sZGVySWQnO1xyXG4gICAgICAgIHRoaXMuaW5pdEdyaWQoKTtcclxuICAgICAgICB0aGlzLmluaXRGb3JtcygpO1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5yZWFkeSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbGVEYXRhU2VydmljZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVEYXRhU2VydmljZS5yZWdpc3Rlcih0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Um9vdEZvbGRlckNvbnRlbnQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJvb3RGb2xkZXJJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBoYXNLZXkgPSB0aGlzLnNlcnZpY2VDb2RlXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmVudGl0eVxyXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5fZW50aXR5S2V5O1xyXG5cclxuICAgICAgICAgICAgaWYgKCFoYXNLZXkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtMb2FkaW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvbGRlclNlcnZpY2UuZ2V0U2VydmljZUZvbGRlcklkKHtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2VDb2RlOiB0aGlzLnNlcnZpY2VDb2RlLFxyXG4gICAgICAgICAgICAgICAgZW50aXR5OiB0aGlzLmVudGl0eSxcclxuICAgICAgICAgICAgICAgIGVudGl0eUtleTogdGhpcy5fZW50aXR5S2V5XHJcbiAgICAgICAgICAgIH0gYXMgU2VydmljZVJlcXVlc3RNb2RlbClcclxuICAgICAgICAgICAgICAgIC50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91bm1hcmtMb2FkaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290Rm9sZGVySWQgPSBycy5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRGb2xkZXJDb250ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3J1ZFNlcnZpY2UucHJvY2Vzc0Vycm9yUmVzcG9uc2UocnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0PDsyBs4buXaSB44bqjeSByYSBraGkgbOG6pXkgdGjGsCBt4bulYyBn4buRYyEnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmdldEZvbGRlckNvbnRlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXREYXRhKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YS5icmVhZGNydW1icyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREYXRhc291cmNlKGRhdGFTb3VyY2U6IGFueVtdID0gW10pIHtcclxuICAgICAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICAgICAgICB0aGlzLl9vbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gZGF0YVNvdXJjZS5tYXAoaXRlbSA9PiBpdGVtLmlkKTtcclxuICAgICAgICBpZiAodGhpcy5fb2xkVmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5fb2xkVmFsdWUpICE9IEpTT04uc3RyaW5naWZ5KHRoaXMuX3ZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnRDaGFuZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudENoYW5nZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5faGFzTG9hZGVkU291cmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhc0xvYWRlZFNvdXJjZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMub25SZWFkeS5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZpcmVFdmVudENoYW5nZSgpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2VkLmVtaXQodGhpcy5fdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRHcmlkKCkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5tb2RlbFNjaGVtYXMgPSBbXHJcbiAgICAgICAgICAgIG5ldyBNb2RlbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogJ25hbWUnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ1TDqm4gdMOgaSBsaeG7h3UnLFxyXG4gICAgICAgICAgICAgICAgZnVsbE5hbWU6ICdUw6puIHTDoGkgbGnhu4d1JyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVMOqbiB0w6BpIGxp4buHdSdcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIG5ldyBNb2RlbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2ZpbGVTaXplJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdLw61jaCB0aMaw4bubYycsXHJcbiAgICAgICAgICAgICAgICBmdWxsTmFtZTogJ0vDrWNoIHRoxrDhu5tjJyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnS8OtY2ggdGjGsOG7m2MnXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBuZXcgTW9kZWxTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgZmllbGQ6ICdjcmVhdGVkJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdOZ8OgeSB04bqhbycsXHJcbiAgICAgICAgICAgICAgICBmdWxsTmFtZTogJ05nw6B5IHThuqFvJyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTmfDoHkgdOG6oW8nLFxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdkYXRldGltZSdcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIG5ldyBNb2RlbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2N1cnJlbnRGaWxlVmVyc2lvbicsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnUGhpw6puIGLhuqNuJyxcclxuICAgICAgICAgICAgICAgIGZ1bGxOYW1lOiAnUGhpw6puIGLhuqNuJyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUGhpw6puIGLhuqNuJ1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgbmV3IE1vZGVsU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZnVuY3Rpb24nLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ0No4bupYyBuxINuZycsXHJcbiAgICAgICAgICAgICAgICBmdWxsTmFtZTogJ0No4bupYyBuxINuZycsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0No4bupYyBuxINuZydcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmcuY29scyA9IFtcclxuICAgICAgICAgICAgbmV3IENvbHVtblNjaGVtYUJhc2Uoe1xyXG4gICAgICAgICAgICAgICAgZmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnZXhwbG9yZXJJdGVtJyxcclxuICAgICAgICAgICAgICAgIHNvcnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogJ2F1dG8nLFxyXG4gICAgICAgICAgICAgICAgYWxsb3dGaWx0ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBuZXcgQ29sdW1uU2NoZW1hQmFzZSh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2ZpbGVTaXplJyxcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnZmlsZVNpemUnLFxyXG4gICAgICAgICAgICAgICAgc29ydDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAnOWVtJyxcclxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogMSxcclxuICAgICAgICAgICAgICAgIGFsbG93RmlsdGVyOiBmYWxzZVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgbmV3IENvbHVtblNjaGVtYUJhc2Uoe1xyXG4gICAgICAgICAgICAgICAgZmllbGQ6ICdjcmVhdGVkJyxcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnZGF0ZXRpbWUnLFxyXG4gICAgICAgICAgICAgICAgc29ydDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTBlbScsXHJcbiAgICAgICAgICAgICAgICBhbGxvd0ZpbHRlcjogZmFsc2VcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIG5ldyBDb2x1bW5TY2hlbWFCYXNlKHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiAnY3VycmVudEZpbGVWZXJzaW9uJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAnOGVtJyxcclxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogMSxcclxuICAgICAgICAgICAgICAgIGFsbG93RmlsdGVyOiBmYWxzZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFNldHRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0U2V0dGluZygpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcuaGVpZ2h0VHlwZSA9IEhlaWdodFR5cGUuZHluYW1pYztcclxuICAgICAgICB0aGlzLnNldHRpbmcuaGlkZGVuRmlsdGVyUm93ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UgPSB0aGlzLl9mb2xkZXJTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5oaWRkZW5IZWFkZXIgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5oaWRkZW5TZXR0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHRpbmcuaGlkZGVuU2V0dGluZ1dvcmtmbG93ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHRpbmcuaGlkZGVuU2V0dGluZ1Blcm1pc3Npb24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5oaWRkZW5Ub29sYmFyID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3Jtcy5cclxuICAgIGluaXRGb3JtcygpIHtcclxuICAgICAgICB0aGlzLmZvcm1zW3RoaXMuZm9ybUlkcy5jcmVhdGVGb2xkZXJdID0ge1xyXG4gICAgICAgICAgICBoZWFkZXI6ICdU4bqhbyBt4bubaSB0aMawIG3hu6VjJyxcclxuICAgICAgICAgICAgc2hvdzogZmFsc2UsXHJcbiAgICAgICAgICAgIGZvcm1EYXRhOiBuZXcgQ3J1ZEZvcm1EYXRhKCksXHJcbiAgICAgICAgICAgIHBvcHVwU2l6ZTogbmV3IFBvcHVwU2l6ZSh7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogNDAwLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAyMDBcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmZvcm1zW3RoaXMuZm9ybUlkcy5yZW5hbWVGaWxlXSA9IHtcclxuICAgICAgICAgICAgaGVhZGVyOiAnxJDhu5VpIHTDqm4gdOG7h3AnLFxyXG4gICAgICAgICAgICBzaG93OiBmYWxzZSxcclxuICAgICAgICAgICAgZm9ybURhdGE6IG5ldyBDcnVkRm9ybURhdGEoKSxcclxuICAgICAgICAgICAgcG9wdXBTaXplOiBuZXcgUG9wdXBTaXplKHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiA0MDAsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybXNbdGhpcy5mb3JtSWRzLmZpbGVWaWV3ZXJdID0ge1xyXG4gICAgICAgICAgICBzaG93OiBmYWxzZSxcclxuICAgICAgICAgICAgZm9ybURhdGE6IHt9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3Jtc1t0aGlzLmZvcm1JZHMuZmlsZVZlcnNpb25MaXN0XSA9IHtcclxuICAgICAgICAgICAgaGVhZGVyOiAnRGFuaCBzw6FjaCBwaGnDqm4gYuG6o24nLFxyXG4gICAgICAgICAgICBzaG93OiBmYWxzZSxcclxuICAgICAgICAgICAgZmlsZUlkOiBudWxsLFxyXG4gICAgICAgICAgICBwb3B1cFNpemU6IG5ldyBQb3B1cFNpemUoe1xyXG4gICAgICAgICAgICAgICAgbWF4aW1pemU6IHRydWVcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBvblNhdmVkRm9ybShmb3JtSWQpIHtcclxuICAgICAgICB0aGlzLmZvcm1zW2Zvcm1JZF0uc2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3RyaWdnZXJQcm9jZXNzRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2FuY2VsRm9ybShmb3JtSWQpIHtcclxuICAgICAgICB0aGlzLmZvcm1zW2Zvcm1JZF0uc2hvdyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dDb250ZXh0TWVudShldnQsIGl0ZW0pIHtcclxuICAgICAgICBpZiAoaXRlbS5pc0ZpbGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLml0ZW1zTWVudUZpbGUgPSBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdYZW0gdHLhu7FjIHR1eeG6v24nLCBpY29uOiAnZmFzIGZhLWV5ZScsIGNvbW1hbmQ6IChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5PYmplY3QoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKClcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdYZW0gY8OhYyBwaGnDqm4gYuG6o24ga2jDoWMnLCBpY29uOiAnZmFzIGZhLWhpc3RvcnknLCBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbkZpbGVWZXJzaW9ucyhpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVOG6o2kgduG7gSBi4bqjbiBjw7RuZyBraGFpJywgaWNvbjogJ2ZhcyBmYS1kb3dubG9hZCcsIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnS8O9IHPhu5EnLCBpY29uOiAnZmFzIGZhLXNpZ25hdHVyZScsIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaWduRmlsZShpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6ICF0aGlzLnJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnWMOzYSB04buHcCB0aW4nLCBpY29uOiAnZmFyIGZhLXRyYXNoLWFsdCcsIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVGaWxlKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogIXRoaXMucmVhZG9ubHlcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICfEkOG7lWkgdMOqbicsIGljb246ICdmYXMgZmEtZXJhc2VyJywgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmFtZUZpbGUoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiAhdGhpcy5yZWFkb25seVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5pdGVtc01lbnVGaWxlID0gW3tcclxuICAgICAgICAgICAgICAgIGxhYmVsOiAnVOG6o2kgduG7gScsIGljb246ICdmYXMgZmEtZG93bmxvYWQnLCBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZChpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdYw7NhIHRoxrAgbeG7pWMnLCBpY29uOiAnZmFyIGZhLXRyYXNoLWFsdCcsIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZvbGRlcihpdGVtKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAhdGhpcy5yZWFkb25seVxyXG4gICAgICAgICAgICB9XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUudG9nZ2xlKGV2dCk7XHJcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNsaWNrRmlsZU5hbWUoaXRlbSkge1xyXG4gICAgICAgIGlmICghaXRlbS5jYW5WaWV3T25saW5lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWQoaXRlbSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vcGVuT2JqZWN0KGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBtb2RpZnlHcmlkSW5mbyhncmlkSW5mbzogR3JpZEluZm8pIHtcclxuICAgICAgICBncmlkSW5mby5maWx0ZXJzLnB1c2godGhpcy5uZXdGaWx0ZXIoJ3BhcmVudEZvbGRlcklkJywgT3BlcmF0b3IuZXF1YWwsIHRoaXMuZGF0YS5jdXJyZW50Rm9sZGVySWQpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBhZnRlckdldERhdGEoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBpbmQgaW4gdGhpcy5tb2RlbC5kYXRhU291cmNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1vZGVsLmRhdGFTb3VyY2VbaW5kXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2Uuc3VwcG9ydERpZ2l0YWxTaWduYXR1cmUoaXRlbS5uYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5nZXRTaWduYXR1cmVJbmZvQnlGaWxlSWQoaXRlbS5pZCkudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzLnN1Y2Nlc3MgJiYgcnMuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2lnbmF0dXJlcyA9IHJzLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubGFzdFNpZ25hdHVyZSA9IHJzLmRhdGFbcnMuZGF0YS5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0uZmlsZUV4cGxvcmVySXRlbVR5cGUgPT09IEZpbGVFeHBsb3Jlckl0ZW1UeXBlLkZvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5jbGFzcyA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmV4dGVuc2lvbikge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5pbWFnZUljb24gPSBgL2Fzc2V0cy9pbWFnZXMvZmlsZS1leHQvaWNvbiR7aXRlbS5leHRlbnNpb24udG9Mb3dlckNhc2UoKX0ucG5nYDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXRlbS5jYW5WaWV3T25saW5lID0gdGhpcy5fZmlsZUV4cGxvcmVyTmV3U2VydmljZS5pc1N1cHBvcnRlZFZpZXdPbmxpbmUoaXRlbS5uYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGF0YXNvdXJjZSh0aGlzLm1vZGVsLmRhdGFTb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuX3Vuc3ViY3JpYmxlQWxsLm5leHQoKTtcclxuICAgICAgICB0aGlzLl91bnN1YmNyaWJsZUFsbC5jb21wbGV0ZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbGVEYXRhU2VydmljZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVEYXRhU2VydmljZS51bnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gRlVOQ1RJT04gQ09MVU1OIE1BTlVMQVRJT04uXHJcbiAgICBnZXRCdXR0b25JY29uKGV4cGxvcmVySXRlbSkge1xyXG4gICAgICAgIGlmIChleHBsb3Jlckl0ZW0uaXNGaWxlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAncGkgcGktcGVuY2lsJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAncGkgcGktZXllJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAncGkgcGktcGVuY2lsJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QnV0dG9uVG9vbHRpcChleHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICBpZiAoZXhwbG9yZXJJdGVtLmlzRmlsZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzRGVza3RvcCgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0No4buJbmggc+G7rWEnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdYZW0gdHLhu7FjIHR1eeG6v24nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICfEkOG7lWkgdMOqbic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQnV0dG9uQ2xpY2soZXhwbG9yZXJJdGVtKSB7XHJcbiAgICAgICAgaWYgKGV4cGxvcmVySXRlbS5pc0ZpbGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc0Rlc2t0b3AoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0RmlsZShleHBsb3Jlckl0ZW0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuT2JqZWN0KGV4cGxvcmVySXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmFtZUZvbGRlcihleHBsb3Jlckl0ZW0uaWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRNZW51SXRlbXMoZXhwbG9yZGVySXRlbSkge1xyXG4gICAgICAgIHJldHVybiBleHBsb3JkZXJJdGVtLmlzRmlsZSA/IHRoaXMuZGF0YS5pdGVtc01lbnVGaWxlIDogdGhpcy5kYXRhLml0ZW1zTWVudUZvbGRlcjtcclxuICAgIH1cclxuXHJcbiAgICBvbkRyb3Bkb3duQ2xpY2soZXhwbG9yZXJJdGVtKSB7XHJcbiAgICAgICAgaWYgKGV4cGxvcmVySXRlbS5pc0ZpbGUpIHtcclxuICAgICAgICAgICAgY29uc3Qga3lTb0l0ZW0gPSB0aGlzLmRhdGEuaXRlbXNNZW51RmlsZS5maW5kKHggPT4geC5sYWJlbC50b0xvd2VyQ2FzZSgpID09ICdLw70gc+G7kScpO1xyXG4gICAgICAgICAgICBpZiAoa3lTb0l0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGt5U29JdGVtLnZpc2libGUgPSB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLnN1cHBvcnREaWdpdGFsU2lnbmF0dXJlKGV4cGxvcmVySXRlbS5uYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXRhLnNlbGVjdGVkRXhwbG9yZXJJdGVtID0gZXhwbG9yZXJJdGVtO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+IEZJTEUgTUFOVUxBVElPTi5cclxuICAgIC8vIFThuqNpIGzDqm4gZmlsZS5cclxuICAgIG9uU2VsZWN0RmlsZSgpIHtcclxuICAgICAgICB0aGlzLmZpbGVDb250cm9sLnVwbG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQmVmb3JlVXBsb2FkKGV2dCkge1xyXG4gICAgICAgIHRoaXMuX21hcmtMb2FkaW5nKCk7XHJcbiAgICAgICAgZXZ0LmZvcm1EYXRhLmFwcGVuZCgnc2VydmljZUNvZGUnLCB0aGlzLnNlcnZpY2VDb2RlKTtcclxuICAgICAgICBldnQuZm9ybURhdGEuYXBwZW5kKCdlbnRpdHknLCB0aGlzLmVudGl0eSk7XHJcbiAgICAgICAgZXZ0LmZvcm1EYXRhLmFwcGVuZCgnZW50aXR5S2V5JywgdGhpcy5fZW50aXR5S2V5KTtcclxuICAgICAgICBldnQuZm9ybURhdGEuYXBwZW5kKCdmb2xkZXJJZCcsIHRoaXMuZGF0YS5jdXJyZW50Rm9sZGVySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzc1ZhbHVlID0gZXZ0LnByb2dyZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNlbGVjdEZpbGUoZXZ0KSB7XHJcbiAgICAgICAgaWYgKGV2dC5lcnJvck1lc3NhZ2VzICYmIGV2dC5lcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKFxyXG4gICAgICAgICAgICAgICAgZXZ0LmVycm9yTWVzc2FnZXMubWFwKGl0ZW0gPT4gYCR7aXRlbS5zdW1tYXJ5fSR7aXRlbS5kZXRhaWx9YCkuam9pbignOyAnKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblVwbG9hZGVkKGV2dCkge1xyXG4gICAgICAgIHRoaXMuX3RyaWdnZXJQcm9jZXNzRGF0YSgpO1xyXG4gICAgICAgIHRoaXMuX21hcmtMb2FkaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gxJDhu5VpIHTDqm4gZmlsZS5cclxuICAgIHJlbmFtZUZpbGUoaXRlbSkge1xyXG4gICAgICAgIHRoaXMuZm9ybXMucmVuYW1lRmlsZS5oZWFkZXIgPSAnxJDhu5VpIHTDqm4gdGjGsCBt4bulYyc7XHJcbiAgICAgICAgdGhpcy5mb3Jtcy5yZW5hbWVGaWxlLmZvcm1EYXRhLmRhdGEgPSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2VDb2RlOiB0aGlzLnNlcnZpY2VDb2RlLFxyXG4gICAgICAgICAgICBlbnRpdHk6IHRoaXMuZW50aXR5LFxyXG4gICAgICAgICAgICBlbnRpdHlLZXk6IHRoaXMuX2VudGl0eUtleSxcclxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmZvcm1zLnJlbmFtZUZpbGUuc2hvdyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gWMOzYSBmaWxlLlxyXG4gICAgZGVsZXRlRmlsZShleHBsb3Jlckl0ZW06IEZpbGVFeHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICB0aGlzLmRlbGV0ZU11dGlwbGUoW2V4cGxvcmVySXRlbV0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+IEZPTERFUiBNQU5VTEFUSU9OLlxyXG4gICAgLy8gVOG6oW8gdGjGsCBt4bulYy5cclxuICAgIGNyZWF0ZUZvbGRlcigpIHtcclxuICAgICAgICB0aGlzLmZvcm1zLmNyZWF0ZUZvbGRlci5mb3JtRGF0YS5kYXRhID0ge1xyXG4gICAgICAgICAgICBzZXJ2aWNlQ29kZTogdGhpcy5zZXJ2aWNlQ29kZSxcclxuICAgICAgICAgICAgZW50aXR5OiB0aGlzLmVudGl0eSxcclxuICAgICAgICAgICAgZW50aXR5S2V5OiB0aGlzLl9lbnRpdHlLZXksXHJcbiAgICAgICAgICAgIHBhcmVudEZvbGRlcklkOiB0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3Jtcy5jcmVhdGVGb2xkZXIuc2hvdyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTeG7nyB0aMawIG3hu6VjLyBjbGljayB0aMawIG3hu6VjLlxyXG4gICAgZ2V0Rm9sZGVyQ29udGVudChjdXJyZW50Rm9sZGVySWQ/OiBzdHJpbmcpIHtcclxuICAgICAgICBjdXJyZW50Rm9sZGVySWQgPSBjdXJyZW50Rm9sZGVySWQgfHwgdGhpcy5yb290Rm9sZGVySWQ7XHJcbiAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZCA9IGN1cnJlbnRGb2xkZXJJZDtcclxuICAgICAgICB0aGlzLl90cmlnZ2VyUHJvY2Vzc0RhdGEoKTtcclxuICAgICAgICB0aGlzLnNldEJyZWFkY3J1bWJzKCk7XHJcbiAgICAgICAgdGhpcy5zZXRWYWxpZGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFZhbGlkYXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkICE9IHRoaXMucm9vdEZvbGRlcklkKSB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5vbkNoYW5nZWQuZW1pdCh0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5maXJlRXZlbnRDaGFuZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gxJDhu5VpIHTDqm4gdGjGsCBt4bulYy5cclxuICAgIHJlbmFtZUZvbGRlcihmb2xkZXJJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5mb3Jtcy5jcmVhdGVGb2xkZXIuaGVhZGVyID0gJ8SQ4buVaSB0w6puIHRoxrAgbeG7pWMnO1xyXG4gICAgICAgIHRoaXMuZm9ybXMuY3JlYXRlRm9sZGVyLmZvcm1EYXRhLmRhdGEgPSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2VDb2RlOiB0aGlzLnNlcnZpY2VDb2RlLFxyXG4gICAgICAgICAgICBlbnRpdHk6IHRoaXMuZW50aXR5LFxyXG4gICAgICAgICAgICBlbnRpdHlLZXk6IHRoaXMuX2VudGl0eUtleSxcclxuICAgICAgICAgICAgaWQ6IGZvbGRlcklkXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3Jtcy5jcmVhdGVGb2xkZXIuc2hvdyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gWMOzYSB0aMawIG3hu6VjLlxyXG4gICAgZGVsZXRlRm9sZGVyKGV4cGxvcmVySXRlbTogRmlsZUV4cGxvcmVySXRlbSkge1xyXG4gICAgICAgIHRoaXMuZGVsZXRlTXV0aXBsZShbZXhwbG9yZXJJdGVtXSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gQ09NTU9OIEZPTERFUiAmIEZJTEUgTUFOVUxBVElPTi5cclxuICAgIC8vIE3hu58gdGjGsCBt4bulYy8gdOG7h3AuXHJcbiAgICBhc3luYyBvcGVuT2JqZWN0KGV4cGxvcmVySXRlbTogRmlsZUV4cGxvcmVySXRlbSkge1xyXG4gICAgICAgIGlmIChleHBsb3Jlckl0ZW0uaXNGaWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhblZpZXdPbmxpbmUgPSB0aGlzLl9maWxlT2JqZWN0U2VydmljZS5pc1N1cHBvcnRlZFZpZXdPbmxpbmUoZXhwbG9yZXJJdGVtLm5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoY2FuVmlld09ubGluZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRmlsZVZpZXdlcihleHBsb3Jlckl0ZW0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZChleHBsb3Jlckl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRGb2xkZXJDb250ZW50KGV4cGxvcmVySXRlbS5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFjDs2Egbmhp4buBdSB0aMawIG3hu6VjLyB04buHcC5cclxuICAgIGRlbGV0ZU11dGlwbGUoaXRlbXM6IEZpbGVFeHBsb3Jlckl0ZW1bXSkge1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93RGVsZXRlQ29uZmlybSgpXHJcbiAgICAgICAgICAgIC50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2xkZXJTZXJ2aWNlLmRlbGV0ZU11bHRpcGxlKGl0ZW1zKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Rm9sZGVyQ29udGVudCh0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93RGVsZXRlRGF0YVN1Y2Nlc3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZ0J5UmVwb25zZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVOG6o2kgdGjGsCBt4bulYy8gdOG7h3AuXHJcbiAgICBhc3luYyBkb3dubG9hZChleHBsb3Jlckl0ZW06IEZpbGVFeHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2Rvd25sb2FkTGlua1NlcnZpY2UuZ2V0R2VuZXJhdGVEb3dubG9hZExpbmtNb2RlbChleHBsb3Jlckl0ZW0pO1xyXG4gICAgICAgIHRoaXMuX2Rvd25sb2FkTGlua1NlcnZpY2UuZG93bmxvYWQobW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFThuqNpIG5oaeG7gXUgdGjGsCBt4bulYy8gdOG7h3AuXHJcbiAgICBhc3luYyBkb3dubG9hZE11bHRpcGxlKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXM7XHJcbiAgICAgICAgY29uc3QgaGFzSXRlbXMgPSBzZWxlY3RlZEl0ZW1zICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChoYXNJdGVtcykge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZChzZWxlY3RlZEl0ZW1zWzBdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFyck1vZGVsID0gc2VsZWN0ZWRJdGVtcy5tYXAoZXhwbG9yZXJJdGVtID0+IHRoaXMuX2Rvd25sb2FkTGlua1NlcnZpY2UuZ2V0R2VuZXJhdGVEb3dubG9hZExpbmtNb2RlbChleHBsb3Jlckl0ZW0pKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rvd25sb2FkTGlua1NlcnZpY2UuZG93bmxvYWRNdWx0aXBsZShhcnJNb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIG9wZW5GaWxlVmlld2VyKGV4cGxvcmVySXRlbTogRmlsZUV4cGxvcmVySXRlbSkge1xyXG4gICAgICAgIHRoaXMuZm9ybXMuZmlsZVZpZXdlci5mb3JtRGF0YS5kYXRhID0ge1xyXG4gICAgICAgICAgICBmaWxlSWQ6IGV4cGxvcmVySXRlbS5pZCxcclxuICAgICAgICAgICAgaXNGaWxlVmVyc2lvbjogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmZvcm1zLmZpbGVWaWV3ZXIuc2hvdyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VGaWxlVmlld2VyKCkge1xyXG4gICAgICAgIHRoaXMuZm9ybXMuZmlsZVZpZXdlci5zaG93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXRGb2xkZXJDb250ZW50KHRoaXMuZGF0YS5jdXJyZW50Rm9sZGVySWQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+TU9WRSBGSUxFUyAmIEZPTERFUlMuXHJcbiAgICBoYXNTZWxlY3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtc1xyXG4gICAgICAgICAgICAmJiB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENo4buNbiB0aMawIG3hu6VjLyBmaWxlIGRpIGNodXnhu4NuLlxyXG4gICAgY2FuU2VsZWN0KCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5kYXRhLm1vdmluZy5pc1NlbGVjdGluZ1xyXG4gICAgICAgICAgICAmJiB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBjYW5TZXRNb3ZlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubW92aW5nLmlzU2VsZWN0aW5nXHJcbiAgICAgICAgICAgICYmIHRoaXMuZGF0YS5tb3Zpbmcuc2VsZWN0ZWRJdGVtc1xyXG4gICAgICAgICAgICAmJiB0aGlzLmRhdGEubW92aW5nLnNlbGVjdGVkSXRlbXMubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIG1vdmVFeHBsb3Jlckl0ZW1zKCkge1xyXG4gICAgICAgIGNvbnN0IGNhbk1vdmUgPSAhdGhpcy5kYXRhLm1vdmluZy5pc1NlbGVjdGluZ1xyXG4gICAgICAgICAgICAmJiB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aFxyXG4gICAgICAgICAgICAmJiB0aGlzLm1vZGVsLmRhdGFTb3VyY2VcclxuICAgICAgICAgICAgJiYgdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKCFjYW5Nb3ZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5tb3ZpbmcgPSB7XHJcbiAgICAgICAgICAgIGlzU2VsZWN0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zOiB0aGlzLl9jb21tb25TZXJ2aWNlLmNsb25lT2JqZWN0KHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyksXHJcbiAgICAgICAgICAgIHNvdXJjZUZvbGRlcklkOiB0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaOG6oyB0aMawIG3hu6VjLyBmaWxlLlxyXG4gICAgc2V0TW92ZUV4cGxvcmVySXRlbXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEubW92aW5nLmlzU2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZGVsID0ge1xyXG4gICAgICAgICAgICBzb3VyY2VGb2xkZXJJZDogdGhpcy5kYXRhLm1vdmluZy5zb3VyY2VGb2xkZXJJZCxcclxuICAgICAgICAgICAgdGFyZ2V0Rm9sZGVySWQ6IHRoaXMuZGF0YS5jdXJyZW50Rm9sZGVySWQsXHJcbiAgICAgICAgICAgIGxzdEZpbGVFeHBsb3Jlckl0ZW1zOiB0aGlzLmRhdGEubW92aW5nLnNlbGVjdGVkSXRlbXNcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9mb2xkZXJTZXJ2aWNlLm1vdmVFeHBsb3Jlckl0ZW1zKG1vZGVsKVxyXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Rm9sZGVyQ29udGVudCh0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ0RpIGNodXnhu4NuIHRow6BuaCBjw7RuZycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5tb3ZpbmcgPSB7fTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nQnlSZXBvbnNlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQuG7jyBkaSBjaHV54buDbi5cclxuICAgIGNhbmNlbE1vdmUoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhLm1vdmluZyA9IHt9O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+VkVSU0lPTi5cclxuICAgIG9wZW5GaWxlVmVyc2lvbnMoZmlsZTogRmlsZUV4cGxvcmVySXRlbSkge1xyXG4gICAgICAgIHRoaXMuZm9ybXMuZmlsZVZlcnNpb25MaXN0LmZpbGVJZCA9IGZpbGUuaWQ7XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybXMuZmlsZVZlcnNpb25MaXN0LnNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5WSUVXIE9OTElORS5cclxuICAgIGVkaXRGaWxlKGZpbGU6IEZpbGVFeHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ8SQYW5nIGvhur90IG7hu5FpIG3hu58g4bupbmcgZOG7pW5nJyk7XHJcbiAgICAgICAgdGhpcy5fZmlsZVZlcnNpb25TZXJ2aWNlLmNyZWF0ZU5ld01pbm9yVmVyc2lvbihmaWxlLmlkLCAnJywgZmFsc2UpXHJcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVWZXJzaW9uID0gPEZpbGVWZXJzaW9uRFRPPnJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlVXJsID0gdGhpcy5fZmlsZVZlcnNpb25TZXJ2aWNlLmdldEZpbGVWZXJzaW9uRG93bmxvYWRVcmwoZmlsZVZlcnNpb24uaWQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IG5ldyBUbkNsaWVudENvbW1hbmQoKTtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmQuY29tbWFuZFR5cGUgPSBDb21tYW5kVHlwZS5FZGl0RmlsZTtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmQua2V5ID0gdGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LnNpZ25hbHIuY2xpZW50S2V5O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdEZpbGVDb21tYW5kID0gbmV3IEVkaXRGaWxlQ29tbWFuZCgpO1xyXG4gICAgICAgICAgICAgICAgZWRpdEZpbGVDb21tYW5kLmZpbGVTZXJ2aWNlRW5kcG9pbnQgPSB0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBpRG9tYWluLmZpbGVFbmRwb2ludDtcclxuICAgICAgICAgICAgICAgIGVkaXRGaWxlQ29tbWFuZC51cGxvYWRGaWxlQXBpID0gdGhpcy5fZmlsZVZlcnNpb25TZXJ2aWNlLmdldFVwbG9hZEZpbGVWZXJzaW9uQXBpVXJsKCk7XHJcbiAgICAgICAgICAgICAgICBlZGl0RmlsZUNvbW1hbmQucmVtb3ZlRmlsZUFwaSA9IHRoaXMuX2ZpbGVWZXJzaW9uU2VydmljZS5nZXRSZW1vdmVGaWxlVmVyc2lvbkFwaVVybCgpO1xyXG4gICAgICAgICAgICAgICAgZWRpdEZpbGVDb21tYW5kLmZpbGVVcmwgPSBmaWxlVXJsO1xyXG4gICAgICAgICAgICAgICAgZWRpdEZpbGVDb21tYW5kLmlzRHJhZnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZWRpdEZpbGVDb21tYW5kLmdyb3VwRmlsZU5hbWUgPSBmaWxlLm5hbWU7XHJcbiAgICAgICAgICAgICAgICBlZGl0RmlsZUNvbW1hbmQuZmlsZU5hbWUgPSBmaWxlLm5hbWU7XHJcbiAgICAgICAgICAgICAgICBlZGl0RmlsZUNvbW1hbmQudmVyc2lvbk5hbWUgPSBmaWxlVmVyc2lvbi52ZXJzaW9uTmFtZTtcclxuICAgICAgICAgICAgICAgIGVkaXRGaWxlQ29tbWFuZC5maWxlVmVyc2lvbklkID0gZmlsZVZlcnNpb24uaWQ7XHJcbiAgICAgICAgICAgICAgICBlZGl0RmlsZUNvbW1hbmQuYWNjZXNzVG9rZW4gPSB0aGlzLl9hdXRoZW5TZXJ2aWNlLmdldEFjY2Vzc1Rva2VuKCk7XHJcbiAgICAgICAgICAgICAgICBjb21tYW5kLmRhdGEgPSBlZGl0RmlsZUNvbW1hbmQ7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG5DbGllbnRTZXJ2aWNlLnNlbmRDb21tYW5kKGNvbW1hbmQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3NpZ25hbHJTZXJ2aWNlLnVuU3Vic2NyaWJlVmlld0NvZGUobnVsbCwgJ0ZJTEUuVkVSU0lPTi5VUERBVEVEJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaWduYWxyU2VydmljZS5zdGFydChudWxsLCAnRklMRS5WRVJTSU9OLlVQREFURUQnLCBkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2JqOiBhbnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JqLm1lc3NhZ2UuY29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmouTWVzc2FnZS5Db250ZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmdldExpc3RGaWxlcyh0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKENvbW1vbkVycm9yQ29kZS5FUlJPUl9TRVJWSUNFX05PVF9SVU4gPT09IGVycm9yLnN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93UmVzcG9uc2VFcnJvcigwLCBudWxsLCAnRmlsZScpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdGSUxFX0VYUExPUkVSLk1FU1NBR0VfRVJST1JfSEVBREVSJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdGSUxFX0VYUExPUkVSLk1FU1NBR0VfRVJST1JfREVUQUlMJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpZmU6IDUwMDBcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBCUkVBRENSVU1CUy5cclxuICAgIGFzeW5jIHNldEJyZWFkY3J1bWJzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJzID0gYXdhaXQgdGhpcy5fZm9sZGVyU2VydmljZS5nZXRGdWxsRm9sZGVyUGF0aCh0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkKTtcclxuICAgICAgICAgICAgaWYgKHJzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJyZWFkY3J1bWJzID0gcnMuZGF0YS5tYXAoZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGYuaWQgPT0gdGhpcy5yb290Rm9sZGVySWQgPyB0aGlzLnJvb3RGb2xkZXJOYW1lIDogZi5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogZi5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzczogZi5pZCAhPSB0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkID8gJ2ZtLWNsaWNrYWJsZScgOiAnZm0tY3VycmVudC1mb2xkZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Rm9sZGVyQ29udGVudChmLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYnJlYWRjcnVtYnMgPSBicmVhZGNydW1icztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5icmVhZGNydW1icyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY3J1ZFNlcnZpY2UucHJvY2Vzc0Vycm9yUmVzcG9uc2UocnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLmJyZWFkY3J1bWJzID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gU0lHTi5cclxuICAgIC8vIFRPRE86IEzGsHUgw70geOG7rSBsw70gdHLGsOG7nW5nIGRvdWJsZSBjbGljayB2w6BvIG7DunRcclxuICAgIHNpZ25GaWxlKGZpbGU6IEZpbGVFeHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0NvbmZpcm0oJ0LhuqFuIGPDsyBjaOG6r2MgY2jhuq9uIG114buRbiBrw70gc+G7kSB2xINuIGLhuqNuIG7DoHk/JykudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5nZW5lcmF0ZUxpbmtEb3dubG9hZCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBmaWxlLmlkXHJcbiAgICAgICAgICAgICAgICB9IGFzIEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPKS50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmdldERvd25sb2FkRm9yU2lnblVybChycy5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm1zID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgcHJtc1snRmlsZVVwbG9hZEhhbmRsZXInXSA9IGAke3RoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5hcGlEb21haW4uZmlsZUVuZHBvaW50fS9TaWduYXR1cmUvU2F2ZVBoeXNpY2FsU2lnbmVkRmlsZWA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJtc1snU2Vzc2lvbklkJ10gPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBwcm1zWydGaWxlTmFtZSddID0gdXJsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uX3BybXMgPSBKU09OLnN0cmluZ2lmeShwcm1zKTtcclxuICAgICAgICAgICAgICAgICAgICB2Z2NhX3NpZ25fZmlsZShqc29uX3BybXMsIChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRPYmogPSBKU09OLnBhcnNlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRPYmouRmlsZVNlcnZlciAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5zYXZlU2lnbmVkRmlsZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZTogZmlsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZUlkOiByZXN1bHRPYmouRmlsZVNlcnZlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyc3MgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcygnS8O9IHPhu5EgdGjDoG5oIGPDtG5nJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaGFyZUZvbGRlcihmaWxlOiBGaWxlRXhwbG9yZXJJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5mb3Jtcy5zaGFyZUZvbGRlci5kYXRhID0gZmlsZTtcclxuICAgICAgICB0aGlzLmZvcm1zLnNoYXJlRm9sZGVyLnNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNoYXJlRmlsZShmaWxlOiBGaWxlRXhwbG9yZXJJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5mb3Jtcy5zaGFyZUZpbGUuZGF0YSA9IGZpbGU7XHJcbiAgICAgICAgdGhpcy5mb3Jtcy5zaGFyZUZpbGUuc2hvdyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0RmlsZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5maWxlQ29udHJvbC5iYXNpY0ZpbGVJbnB1dCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVDb250cm9sLmJhc2ljRmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmlld0xpc3RTaWduKGU6IEV2ZW50LCBzaWduYXR1cmVzOiBhbnkpIHtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIHRoaXMuZm9ybXMuc2lnbmF0dXJlRGV0YWlsLmRhdGEgPSBzaWduYXR1cmVzO1xyXG4gICAgICAgIHRoaXMuZm9ybXMuc2lnbmF0dXJlRGV0YWlsLnNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUm93U2VsZWN0KGV2dCkge1xyXG4gICAgICAgIHRoaXMub25TZWxlY3RlZC5lbWl0KHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
1024
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2ZpbGUtZXhwbG9yZXIvZmlsZS1tYW5hZ2VyL2ZpbGUtbWFuYWdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELCtFQUErRTtBQUMvRSxxREFBcUQ7QUFDckQsbURBQW1EO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFZLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRixPQUFP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LEtBQUs7d0JBR0wsS0FBSzt1QkFhTCxLQUFLO29CQUNMLEtBQUs7c0JBTUwsTUFBTTs4QkFDTixNQUFNO3lCQUNOLE1BQU07MEJBQ04sTUFBTTt3QkFDTixNQUFNO3lCQUNOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlIH0gZnJvbSAnbmd4LWRldmljZS1kZXRlY3Rvcic7XHJcbi8vIGltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuLy8gaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICdwcmltZW5nL2NvbnRleHRtZW51JztcclxuLy8gaW1wb3J0IHsgRmlsZVVwbG9hZCB9IGZyb20gJ3ByaW1lbmcvZmlsZXVwbG9hZCc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgTWVudUl0ZW0sIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9jb250ZXh0bWVudSc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWQgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9maWxldXBsb2FkJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcHAtY29udGV4dC9jb21wb25lbnQtY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGF0YUxpc3RCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2RhdGEtbGlzdC1iYXNlJztcclxuaW1wb3J0IHsgQ29tbW9uRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9jb21tb24tZXJyb3ItY29kZSc7XHJcbmltcG9ydCB7IE1vZHVsZUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2NvbmZpZ3MvbW9kdWxlLWNvbmZpZyc7XHJcbmltcG9ydCB7IEVkaXRGaWxlQ29tbWFuZCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9lZGl0LWZpbGUtY29tbWFuZCc7XHJcbmltcG9ydCB7IENvbW1hbmRUeXBlLCBUbkNsaWVudENvbW1hbmQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvdG4tY2xpZW50LWNvbW1hbmQnO1xyXG5pbXBvcnQgeyBBdXRoZW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aGVuLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNpZ25hbFJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc2lnbmFsci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG5DbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdG4tY2xpZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWxlRXhwbG9yZXJJdGVtLCBGaWxlRXhwbG9yZXJJdGVtVHlwZSB9IGZyb20gJy4uL21vZGVscy9maWxlLWV4cGxvcmVyLWl0ZW0nO1xyXG5pbXBvcnQgeyBGaWxlVmVyc2lvbkRUTyB9IGZyb20gJy4uL21vZGVscy9maWxlLXZlcnNpb24tZHRvJztcclxuaW1wb3J0IHsgR2VuZXJhdGVMaW5rRG93bmxvYWREVE8gfSBmcm9tICcuLi9tb2RlbHMvZ2VuZXJhdGUtbGluay1kb3dubG9hZC1kdG8nO1xyXG5pbXBvcnQgeyBTZXJ2aWNlUmVxdWVzdE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL3NlcnZpY2UtcmVxdWVzdC1tb2RlbCc7XHJcbmltcG9ydCB7IERvd25sb2FkTGlua1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kb3dubG9hZC1saW5rLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWxlRGF0YVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9maWxlLWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbGVFeHBsb3Jlck5ld1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9maWxlLWV4cGxvcmVyLW5ldy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsZU9iamVjdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9maWxlLW9iamVjdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsZVZlcnNpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZmlsZS12ZXJzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb2xkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZm9sZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNeURyaXZlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL215LWRyaXZlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb2x1bW5TY2hlbWFCYXNlLCBDcnVkRm9ybURhdGEsIEVudW1GaWxlTGF5b3V0LCBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEsIEhlaWdodFR5cGUsIE1vZGVsU2NoZW1hLCBPcGVyYXRvciwgUG9wdXBTaXplIH0gZnJvbSAnLi8uLi8uLi8uLi9jbGFzc2VzL2Zvcm0tc2NoZW1hJztcclxuaW1wb3J0IHsgR3JpZEluZm8gfSBmcm9tICcuLy4uLy4uLy4uL21vZGVscy9ncmlkLWluZm8nO1xyXG5pbXBvcnQgeyBGaWxlRXhwbG9yZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9maWxlLWV4cGxvcmVyLnNlcnZpY2UnO1xyXG5cclxuLy8gZGVjbGFyZSB2YXIgdmdjYV9zaWduX2FwcHJvdmVkOiBhbnk7XHJcbmRlY2xhcmUgdmFyIHZnY2Ffc2lnbl9wZGY6IGFueTtcclxuZGVjbGFyZSB2YXIgdmdjYV9zaWduX2FwcHJvdmVkOiBhbnk7XHJcbmRlY2xhcmUgbGV0IHZnY2Ffc2lnbl9maWxlczogYW55O1xyXG5AQ29tcG9uZW50KHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ2ZpbGUtbWFuYWdlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1tYW5hZ2VyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2ZpbGUtbWFuYWdlci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRmlsZU1hbmFnZXJDb21wb25lbnQpLFxyXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ29tcG9uZW50Q29udGV4dFNlcnZpY2VcclxuICAgIF1cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBGaWxlTWFuYWdlckNvbXBvbmVudCBleHRlbmRzIERhdGFMaXN0QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdmaWxlQ29udHJvbCcpIGZpbGVDb250cm9sOiBGaWxlVXBsb2FkO1xyXG4gICAgQFZpZXdDaGlsZCgnY29udGV4dE1lbnUnKSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XHJcblxyXG4gICAgQElucHV0KCkgY29udHJvbDogRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hO1xyXG4gICAgQElucHV0KCkgZmlsZURhdGFTZXJ2aWNlOiBGaWxlRGF0YVNlcnZpY2U7XHJcbiAgICBASW5wdXQoKSBsYXlvdXQ6IEVudW1GaWxlTGF5b3V0ID0gRW51bUZpbGVMYXlvdXQuTElTVDtcclxuICAgIEBJbnB1dCgpIGhpZGRlbkNyZWF0ZUZvbGRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgbWF4RmlsZVNpemU6IG51bWJlciA9IDEwMDAwMDAwMDsgLy8gU2l6ZSBpbiBieXRlXHJcbiAgICBASW5wdXQoKSBpbnZhbGlkRmlsZVNpemVNZXNzYWdlU3VtbWFyeT86IHN0cmluZyA9ICd7MH06IFF1w6EgZHVuZyBsxrDhu6NuZyBmaWxlIGNobyBwaMOpcCwgJztcclxuICAgIEBJbnB1dCgpIGludmFsaWRGaWxlU2l6ZU1lc3NhZ2VEZXRhaWw/OiBzdHJpbmcgPSAnZHVuZyBsxrDhu6NuZyB04buRaSDEkWEgbMOgIHswfS4nO1xyXG4gICAgQElucHV0KCkgaW52YWxpZEZpbGVUeXBlTWVzc2FnZVN1bW1hcnk/OiBzdHJpbmcgPSAnezB9OiBLaMO0bmcgxJHDum5nIMSR4buLbmggZOG6oW5nIGZpbGUsICc7XHJcbiAgICBASW5wdXQoKSBpbnZhbGlkRmlsZVR5cGVNZXNzYWdlRGV0YWlsPzogc3RyaW5nID0gJ8SR4buLbmggZOG6oW5nIGZpbGUgY2hvIHBow6lwOiB7MH0uJztcclxuICAgIEBJbnB1dCgpIGludmFsaWRGaWxlTGltaXRNZXNzYWdlU3VtbWFyeT86IHN0cmluZyA9ICdRdcOhIHPhu5EgbMaw4bujbmcgZmlsZSBjaG8gcGjDqXAsICc7XHJcbiAgICBASW5wdXQoKSBpbnZhbGlkRmlsZUxpbWl0TWVzc2FnZURldGFpbD86IHN0cmluZyA9ICd04buRaSDEkWEgezB9IGZpbGUuJztcclxuXHJcbiAgICAvLyBUw6puIHRoxrAgbeG7pWMgZ+G7kWMuXHJcbiAgICBASW5wdXQoKSByb290Rm9sZGVyTmFtZTogc3RyaW5nO1xyXG5cclxuICAgIC8vIELhu5kga2V5IMSR4buDIHThuqFvIHRoxrAgbeG7pWMgZ+G7kWMuXHJcbiAgICBASW5wdXQoKSBzZXJ2aWNlQ29kZTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgZW50aXR5OiBzdHJpbmc7XHJcbiAgICBfZW50aXR5S2V5OiBzdHJpbmc7XHJcbiAgICBfaGFzTG9hZGVkU291cmNlID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzZXQgZW50aXR5S2V5KHZhbDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fZW50aXR5S2V5ID0gdmFsO1xyXG5cclxuICAgICAgICBpZiAodmFsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhc0xvYWRlZFNvdXJjZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVudGl0eUtleUNoYW5nZS5lbWl0KHRoaXMuX2VudGl0eUtleSk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlRGF0YVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Um9vdEZvbGRlckNvbnRlbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXREYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLl92YWx1ZSAhPSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KCkgb25SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGVudGl0eUtleUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGNsb3NlUG9wdXAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBwcml2YXRlIF91bnN1YmNyaWJsZUFsbCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIHByaXZhdGUgX21vZHVsZUNvbmZpZzogTW9kdWxlQ29uZmlnO1xyXG5cclxuICAgIF9vbGRWYWx1ZTogYW55O1xyXG4gICAgX3ZhbHVlOiBhbnk7XHJcbiAgICBfZGF0YVNvdXJjZTogYW55W10gPSBbXTtcclxuICAgIF9sYXlvdXQgPSBFbnVtRmlsZUxheW91dDtcclxuXHJcbiAgICAvLyBJbnN0YW5jZUlkIHRoxrAgbeG7pWMgZ+G7kWMuXHJcbiAgICByb290Rm9sZGVySWQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgcHJvZ3Jlc3NWYWx1ZSA9IDA7XHJcbiAgICBhcGlVcGxvYWRVcmwgPSAnJztcclxuICAgIGZpbGVJbkZvcm0gPSAnZmlsZSc7XHJcbiAgICBjaG9vc2VMYWJlbCA9ICdDaOG7jW4nO1xyXG4gICAgdXNlcklkOiBhbnk7XHJcblxyXG4gICAgZm9ybUlkcyA9IHtcclxuICAgICAgICBjcmVhdGVGb2xkZXI6ICdjcmVhdGVGb2xkZXInLFxyXG4gICAgICAgIHJlbmFtZUZpbGU6ICdyZW5hbWVGaWxlJyxcclxuICAgICAgICBzaGFyZUZpbGU6ICdzaGFyZUZpbGUnLFxyXG4gICAgICAgIHNoYXJlRm9sZGVyOiAnc2hhcmVGb2xkZXInLFxyXG4gICAgICAgIGZpbGVWaWV3ZXI6ICdmaWxlVmlld2VyJyxcclxuICAgICAgICBmaWxlVmVyc2lvbkxpc3Q6ICdmaWxlVmVyc2lvbkxpc3QnLFxyXG4gICAgICAgIHNpZ25hdHVyZURldGFpbDogJ3NpZ25hdHVyZURldGFpbCdcclxuICAgIH07XHJcbiAgICBmb3JtczogYW55ID0ge307XHJcbiAgICBkYXRhOiBhbnkgPSB7XHJcbiAgICAgICAgcm9vdEZvbGRlcklkOiBudWxsLFxyXG4gICAgICAgIGN1cnJlbnRGb2xkZXJJZDogbnVsbCxcclxuXHJcbiAgICAgICAgbW92aW5nOiB7XHJcbiAgICAgICAgICAgIGlzU2VsZWN0aW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtczogbnVsbCxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBicmVhZGNydW1iczogPE1lbnVJdGVtW10+W11cclxuICAgIH07XHJcbiAgICBzY3JvbGxDb25maWcgPSB7IHN1cHByZXNzU2Nyb2xsWDogdHJ1ZSwgc3VwcHJlc3NTY3JvbGxZOiB0cnVlIH07XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJvdGVjdGVkIF9teURyaXZlU2VydmljZTogTXlEcml2ZVNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBfbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9jb25maXJtU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9hdXRoZW5TZXJ2aWNlOiBBdXRoZW5TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3RuQ2xpZW50U2VydmljZTogVG5DbGllbnRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2ZpbGVWZXJzaW9uU2VydmljZTogRmlsZVZlcnNpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX21vZHVsZUNvbmZpZ1NlcnZpY2U6IE1vZHVsZUNvbmZpZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9zaWduYWxyU2VydmljZTogU2lnbmFsUlNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9maWxlRXhwbG9yZXJTZXJ2aWNlOiBGaWxlRXhwbG9yZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2ZpbGVFeHBsb3Jlck5ld1NlcnZpY2U6IEZpbGVFeHBsb3Jlck5ld1NlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9kZXZpY2VEZXRlY3RvclNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9mb2xkZXJTZXJ2aWNlOiBGb2xkZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2ZpbGVPYmplY3RTZXJ2aWNlOiBGaWxlT2JqZWN0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9kb3dubG9hZExpbmtTZXJ2aWNlOiBEb3dubG9hZExpbmtTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLl9tb2R1bGVDb25maWcgPSB0aGlzLl9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xyXG4gICAgICAgIHRoaXMuYXBpVXBsb2FkVXJsID0gdGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuZ2V0VXBsb2FkVXJsKCk7XHJcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLl91c2VyU2VydmljZS5nZXRVc2VySWRDb21iaW5lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuX2NvbXBvbmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFVwbG9hZCB3aXRoIG11bHRpcGxlIGZpbGVcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBpVXBsb2FkVXJsID0gdGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuZ2V0VXBsb2FkTXVsdGlwbGVVcmwoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUluRm9ybSA9ICdmaWxlcyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oYXNDcnVkTGlzdCA9IHRoaXMubGF5b3V0ID09IEVudW1GaWxlTGF5b3V0LkxJU1Q7XHJcbiAgICAgICAgdGhpcy5wbHVzVXJsID0gJ0J5Rm9sZGVySWQnO1xyXG4gICAgICAgIHRoaXMuaW5pdEdyaWQoKTtcclxuICAgICAgICB0aGlzLmluaXRGb3JtcygpO1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5yZWFkeSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbGVEYXRhU2VydmljZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVEYXRhU2VydmljZS5yZWdpc3Rlcih0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Um9vdEZvbGRlckNvbnRlbnQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJvb3RGb2xkZXJJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBoYXNLZXkgPSB0aGlzLnNlcnZpY2VDb2RlXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmVudGl0eVxyXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5fZW50aXR5S2V5O1xyXG5cclxuICAgICAgICAgICAgaWYgKCFoYXNLZXkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtMb2FkaW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvbGRlclNlcnZpY2UuZ2V0U2VydmljZUZvbGRlcklkKHtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2VDb2RlOiB0aGlzLnNlcnZpY2VDb2RlLFxyXG4gICAgICAgICAgICAgICAgZW50aXR5OiB0aGlzLmVudGl0eSxcclxuICAgICAgICAgICAgICAgIGVudGl0eUtleTogdGhpcy5fZW50aXR5S2V5XHJcbiAgICAgICAgICAgIH0gYXMgU2VydmljZVJlcXVlc3RNb2RlbClcclxuICAgICAgICAgICAgICAgIC50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91bm1hcmtMb2FkaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290Rm9sZGVySWQgPSBycy5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRGb2xkZXJDb250ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3J1ZFNlcnZpY2UucHJvY2Vzc0Vycm9yUmVzcG9uc2UocnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0PDsyBs4buXaSB44bqjeSByYSBraGkgbOG6pXkgdGjGsCBt4bulYyBn4buRYyEnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmdldEZvbGRlckNvbnRlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXREYXRhKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YS5icmVhZGNydW1icyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREYXRhc291cmNlKGRhdGFTb3VyY2U6IGFueVtdID0gW10pIHtcclxuICAgICAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICAgICAgICB0aGlzLl9vbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gW107XHJcbiAgICAgICAgZGF0YVNvdXJjZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICB2YWx1ZS5wdXNoKGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLm5hbWVXaXRob3V0RXh0ZW5zaW9uID0gaXRlbS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtLm5hbWUubGFzdEluZGV4T2YoJy4nKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5uYW1lV2l0aG91dEV4dGVuc2lvbiA9IGl0ZW0ubmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uZXh0ZW5zaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5leHRlbnNpb24gPSBpdGVtLmV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaXRlbS50YWlsRmlsZSA9IGl0ZW0ubmFtZS5zdWJzdHJpbmcoaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgaXRlbS50YWlsRmlsZVVwcGVyID0gaXRlbS50YWlsRmlsZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5pc0ZpbGUgPSBpdGVtLmZpbGVFeHBsb3Jlckl0ZW1UeXBlID09IEZpbGVFeHBsb3Jlckl0ZW1UeXBlLkZpbGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLl9vbGRWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLl9vbGRWYWx1ZSkgIT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fdmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudENoYW5nZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50Q2hhbmdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9oYXNMb2FkZWRTb3VyY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5faGFzTG9hZGVkU291cmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vblJlYWR5LmVtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZmlyZUV2ZW50Q2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZWQuZW1pdCh0aGlzLl92YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdEdyaWQoKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLm1vZGVsU2NoZW1hcyA9IFtcclxuICAgICAgICAgICAgbmV3IE1vZGVsU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnVMOqbiB0w6BpIGxp4buHdScsXHJcbiAgICAgICAgICAgICAgICBmdWxsTmFtZTogJ1TDqm4gdMOgaSBsaeG7h3UnLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUw6puIHTDoGkgbGnhu4d1J1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgbmV3IE1vZGVsU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZmlsZVNpemUnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ0vDrWNoIHRoxrDhu5tjJyxcclxuICAgICAgICAgICAgICAgIGZ1bGxOYW1lOiAnS8OtY2ggdGjGsOG7m2MnLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdLw61jaCB0aMaw4bubYydcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIG5ldyBNb2RlbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2NyZWF0ZWQnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ05nw6B5IHThuqFvJyxcclxuICAgICAgICAgICAgICAgIGZ1bGxOYW1lOiAnTmfDoHkgdOG6oW8nLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdOZ8OgeSB04bqhbycsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2RhdGV0aW1lJ1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgbmV3IE1vZGVsU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiAnY3VycmVudEZpbGVWZXJzaW9uJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdQaGnDqm4gYuG6o24nLFxyXG4gICAgICAgICAgICAgICAgZnVsbE5hbWU6ICdQaGnDqm4gYuG6o24nLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdQaGnDqm4gYuG6o24nXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBuZXcgTW9kZWxTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgZmllbGQ6ICdmdW5jdGlvbicsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ2jhu6ljIG7Eg25nJyxcclxuICAgICAgICAgICAgICAgIGZ1bGxOYW1lOiAnQ2jhu6ljIG7Eg25nJyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ2jhu6ljIG7Eg25nJ1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dGluZy5jb2xzID0gW1xyXG4gICAgICAgICAgICBuZXcgQ29sdW1uU2NoZW1hQmFzZSh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogJ25hbWUnLFxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdleHBsb3Jlckl0ZW0nLFxyXG4gICAgICAgICAgICAgICAgc29ydDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXHJcbiAgICAgICAgICAgICAgICBhbGxvd0ZpbHRlcjogZmFsc2VcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIG5ldyBDb2x1bW5TY2hlbWFCYXNlKHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZmlsZVNpemUnLFxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdmaWxlU2l6ZScsXHJcbiAgICAgICAgICAgICAgICBzb3J0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6ICc5ZW0nLFxyXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAxLFxyXG4gICAgICAgICAgICAgICAgYWxsb3dGaWx0ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBuZXcgQ29sdW1uU2NoZW1hQmFzZSh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2NyZWF0ZWQnLFxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdkYXRldGltZScsXHJcbiAgICAgICAgICAgICAgICBzb3J0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMGVtJyxcclxuICAgICAgICAgICAgICAgIGFsbG93RmlsdGVyOiBmYWxzZVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgbmV3IENvbHVtblNjaGVtYUJhc2Uoe1xyXG4gICAgICAgICAgICAgICAgZmllbGQ6ICdjdXJyZW50RmlsZVZlcnNpb24nLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6ICc4ZW0nLFxyXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAxLFxyXG4gICAgICAgICAgICAgICAgYWxsb3dGaWx0ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0U2V0dGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRTZXR0aW5nKCkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5oZWlnaHRUeXBlID0gSGVpZ2h0VHlwZS5keW5hbWljO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5oaWRkZW5GaWx0ZXJSb3cgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSA9IHRoaXMuX2ZvbGRlclNlcnZpY2U7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmhpZGRlbkhlYWRlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmhpZGRlblNldHRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5oaWRkZW5TZXR0aW5nV29ya2Zsb3cgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5oaWRkZW5TZXR0aW5nUGVybWlzc2lvbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmhpZGRlblRvb2xiYXIgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvcm1zLlxyXG4gICAgaW5pdEZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuZm9ybXNbdGhpcy5mb3JtSWRzLmNyZWF0ZUZvbGRlcl0gPSB7XHJcbiAgICAgICAgICAgIGhlYWRlcjogJ1ThuqFvIG3hu5tpIHRoxrAgbeG7pWMnLFxyXG4gICAgICAgICAgICBzaG93OiBmYWxzZSxcclxuICAgICAgICAgICAgZm9ybURhdGE6IG5ldyBDcnVkRm9ybURhdGEoKSxcclxuICAgICAgICAgICAgcG9wdXBTaXplOiBuZXcgUG9wdXBTaXplKHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiA0MDAsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybXNbdGhpcy5mb3JtSWRzLnJlbmFtZUZpbGVdID0ge1xyXG4gICAgICAgICAgICBoZWFkZXI6ICfEkOG7lWkgdMOqbiB04buHcCcsXHJcbiAgICAgICAgICAgIHNob3c6IGZhbHNlLFxyXG4gICAgICAgICAgICBmb3JtRGF0YTogbmV3IENydWRGb3JtRGF0YSgpLFxyXG4gICAgICAgICAgICBwb3B1cFNpemU6IG5ldyBQb3B1cFNpemUoe1xyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDQwMCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogMjAwXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3Jtc1t0aGlzLmZvcm1JZHMuZmlsZVZpZXdlcl0gPSB7XHJcbiAgICAgICAgICAgIHNob3c6IGZhbHNlLFxyXG4gICAgICAgICAgICBmb3JtRGF0YToge31cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZm9ybXNbdGhpcy5mb3JtSWRzLnNpZ25hdHVyZURldGFpbF0gPSB7XHJcbiAgICAgICAgICAgIGhlYWRlcjogJ1Row7RuZyB0aW4gY2jhu68ga8O9IHPhu5EnLFxyXG4gICAgICAgICAgICBzaG93OiBmYWxzZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZm9ybXNbdGhpcy5mb3JtSWRzLmZpbGVWZXJzaW9uTGlzdF0gPSB7XHJcbiAgICAgICAgICAgIGhlYWRlcjogJ0Rhbmggc8OhY2ggcGhpw6puIGLhuqNuJyxcclxuICAgICAgICAgICAgc2hvdzogZmFsc2UsXHJcbiAgICAgICAgICAgIGZpbGVJZDogbnVsbCxcclxuICAgICAgICAgICAgcG9wdXBTaXplOiBuZXcgUG9wdXBTaXplKHtcclxuICAgICAgICAgICAgICAgIG1heGltaXplOiB0cnVlXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgb25TYXZlZEZvcm0oZm9ybUlkKSB7XHJcbiAgICAgICAgdGhpcy5mb3Jtc1tmb3JtSWRdLnNob3cgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl90cmlnZ2VyUHJvY2Vzc0RhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbEZvcm0oZm9ybUlkKSB7XHJcbiAgICAgICAgdGhpcy5mb3Jtc1tmb3JtSWRdLnNob3cgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93Q29udGV4dE1lbnUoZXZ0LCBpdGVtKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0uaXNGaWxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5pdGVtc01lbnVGaWxlID0gW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnWGVtIHRy4buxYyB0dXnhur9uJywgaWNvbjogJ2ZhcyBmYS1leWUnLCBjb21tYW5kOiAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuT2JqZWN0KGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzRGVza3RvcCgpXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnWGVtIGPDoWMgcGhpw6puIGLhuqNuIGtow6FjJywgaWNvbjogJ2ZhcyBmYS1oaXN0b3J5JywgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5GaWxlVmVyc2lvbnMoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1ThuqNpIHbhu4EgYuG6o24gY8O0bmcga2hhaScsIGljb246ICdmYXMgZmEtZG93bmxvYWQnLCBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWQoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0vDvSBz4buRJywgaWNvbjogJ2ZhcyBmYS1zaWduYXR1cmUnLCBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2lnbkZpbGUoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiAhdGhpcy5yZWFkb25seVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1jDs2EgdOG7h3AgdGluJywgaWNvbjogJ2ZhciBmYS10cmFzaC1hbHQnLCBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlRmlsZShpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6ICF0aGlzLnJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnxJDhu5VpIHTDqm4nLCBpY29uOiAnZmFzIGZhLWVyYXNlcicsIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5hbWVGaWxlKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogIXRoaXMucmVhZG9ubHlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuaXRlbXNNZW51RmlsZSA9IFt7XHJcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1ThuqNpIHbhu4EnLCBpY29uOiAnZmFzIGZhLWRvd25sb2FkJywgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWQoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiAnWMOzYSB0aMawIG3hu6VjJywgaWNvbjogJ2ZhciBmYS10cmFzaC1hbHQnLCBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVGb2xkZXIoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogIXRoaXMucmVhZG9ubHlcclxuICAgICAgICAgICAgfV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnRvZ2dsZShldnQpO1xyXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVDbGlja0ZpbGVOYW1lKGl0ZW0pIHtcclxuICAgICAgICBpZiAoIWl0ZW0uY2FuVmlld09ubGluZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRvd25sb2FkKGl0ZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMub3Blbk9iamVjdChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbW9kaWZ5R3JpZEluZm8oZ3JpZEluZm86IEdyaWRJbmZvKSB7XHJcbiAgICAgICAgZ3JpZEluZm8uZmlsdGVycy5wdXNoKHRoaXMubmV3RmlsdGVyKCdwYXJlbnRGb2xkZXJJZCcsIE9wZXJhdG9yLmVxdWFsLCB0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWZ0ZXJHZXREYXRhKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgaW5kIGluIHRoaXMubW9kZWwuZGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5tb2RlbC5kYXRhU291cmNlW2luZF07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLnN1cHBvcnREaWdpdGFsU2lnbmF0dXJlKGl0ZW0ubmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuZ2V0U2lnbmF0dXJlSW5mb0J5RmlsZUlkKGl0ZW0uaWQpLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChycy5zdWNjZXNzICYmIHJzLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNpZ25hdHVyZXMgPSBycy5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmxhc3RTaWduYXR1cmUgPSBycy5kYXRhW3JzLmRhdGEubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpdGVtLmZpbGVFeHBsb3Jlckl0ZW1UeXBlID09PSBGaWxlRXhwbG9yZXJJdGVtVHlwZS5Gb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uY2xhc3MgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXRlbS5leHRlbnNpb24pIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uaW1hZ2VJY29uID0gYC9hc3NldHMvaW1hZ2VzL2ZpbGUtZXh0L2ljb24ke2l0ZW0uZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCl9LnBuZ2A7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGl0ZW0uY2FuVmlld09ubGluZSA9IHRoaXMuX2ZpbGVFeHBsb3Jlck5ld1NlcnZpY2UuaXNTdXBwb3J0ZWRWaWV3T25saW5lKGl0ZW0ubmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldERhdGFzb3VyY2UodGhpcy5tb2RlbC5kYXRhU291cmNlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLl91bnN1YmNyaWJsZUFsbC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5fdW5zdWJjcmlibGVBbGwuY29tcGxldGUoKTtcclxuICAgICAgICBpZiAodGhpcy5maWxlRGF0YVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlRGF0YVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+IEZVTkNUSU9OIENPTFVNTiBNQU5VTEFUSU9OLlxyXG4gICAgZ2V0QnV0dG9uSWNvbihleHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICBpZiAoZXhwbG9yZXJJdGVtLmlzRmlsZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzRGVza3RvcCgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BpIHBpLXBlbmNpbCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BpIHBpLWV5ZSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3BpIHBpLXBlbmNpbCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEJ1dHRvblRvb2x0aXAoZXhwbG9yZXJJdGVtKSB7XHJcbiAgICAgICAgaWYgKGV4cGxvcmVySXRlbS5pc0ZpbGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc0Rlc2t0b3AoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdDaOG7iW5oIHPhu61hJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnWGVtIHRy4buxYyB0dXnhur9uJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnxJDhu5VpIHTDqm4nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkJ1dHRvbkNsaWNrKGV4cGxvcmVySXRlbSkge1xyXG4gICAgICAgIGlmIChleHBsb3Jlckl0ZW0uaXNGaWxlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdEZpbGUoZXhwbG9yZXJJdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3Blbk9iamVjdChleHBsb3Jlckl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5hbWVGb2xkZXIoZXhwbG9yZXJJdGVtLmlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TWVudUl0ZW1zKGV4cGxvcmRlckl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gZXhwbG9yZGVySXRlbS5pc0ZpbGUgPyB0aGlzLmRhdGEuaXRlbXNNZW51RmlsZSA6IHRoaXMuZGF0YS5pdGVtc01lbnVGb2xkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgb25Ecm9wZG93bkNsaWNrKGV4cGxvcmVySXRlbSkge1xyXG4gICAgICAgIGlmIChleHBsb3Jlckl0ZW0uaXNGaWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGt5U29JdGVtID0gdGhpcy5kYXRhLml0ZW1zTWVudUZpbGUuZmluZCh4ID0+IHgubGFiZWwudG9Mb3dlckNhc2UoKSA9PSAnS8O9IHPhu5EnKTtcclxuICAgICAgICAgICAgaWYgKGt5U29JdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBreVNvSXRlbS52aXNpYmxlID0gdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5zdXBwb3J0RGlnaXRhbFNpZ25hdHVyZShleHBsb3Jlckl0ZW0ubmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5zZWxlY3RlZEV4cGxvcmVySXRlbSA9IGV4cGxvcmVySXRlbTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBGSUxFIE1BTlVMQVRJT04uXHJcbiAgICAvLyBU4bqjaSBsw6puIGZpbGUuXHJcbiAgICBvblNlbGVjdEZpbGUoKSB7XHJcbiAgICAgICAgdGhpcy5maWxlQ29udHJvbC51cGxvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkJlZm9yZVVwbG9hZChldnQpIHtcclxuICAgICAgICB0aGlzLl9tYXJrTG9hZGluZygpO1xyXG4gICAgICAgIGV2dC5mb3JtRGF0YS5hcHBlbmQoJ3NlcnZpY2VDb2RlJywgdGhpcy5zZXJ2aWNlQ29kZSk7XHJcbiAgICAgICAgZXZ0LmZvcm1EYXRhLmFwcGVuZCgnZW50aXR5JywgdGhpcy5lbnRpdHkpO1xyXG4gICAgICAgIGV2dC5mb3JtRGF0YS5hcHBlbmQoJ2VudGl0eUtleScsIHRoaXMuX2VudGl0eUtleSk7XHJcbiAgICAgICAgZXZ0LmZvcm1EYXRhLmFwcGVuZCgnZm9sZGVySWQnLCB0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBvblVwbG9hZFByb2dyZXNzKGV2dCkge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NWYWx1ZSA9IGV2dC5wcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVTZWxlY3RGaWxlKGV2dCkge1xyXG4gICAgICAgIGlmIChldnQuZXJyb3JNZXNzYWdlcyAmJiBldnQuZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhcclxuICAgICAgICAgICAgICAgIGV2dC5lcnJvck1lc3NhZ2VzLm1hcChpdGVtID0+IGAke2l0ZW0uc3VtbWFyeX0ke2l0ZW0uZGV0YWlsfWApLmpvaW4oJzsgJylcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25VcGxvYWRlZChldnQpIHtcclxuICAgICAgICB0aGlzLl90cmlnZ2VyUHJvY2Vzc0RhdGEoKTtcclxuICAgICAgICB0aGlzLl9tYXJrTG9hZGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIMSQ4buVaSB0w6puIGZpbGUuXHJcbiAgICByZW5hbWVGaWxlKGl0ZW0pIHtcclxuICAgICAgICB0aGlzLmZvcm1zLnJlbmFtZUZpbGUuaGVhZGVyID0gJ8SQ4buVaSB0w6puIHRoxrAgbeG7pWMnO1xyXG4gICAgICAgIHRoaXMuZm9ybXMucmVuYW1lRmlsZS5mb3JtRGF0YS5kYXRhID0ge1xyXG4gICAgICAgICAgICBzZXJ2aWNlQ29kZTogdGhpcy5zZXJ2aWNlQ29kZSxcclxuICAgICAgICAgICAgZW50aXR5OiB0aGlzLmVudGl0eSxcclxuICAgICAgICAgICAgZW50aXR5S2V5OiB0aGlzLl9lbnRpdHlLZXksXHJcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3Jtcy5yZW5hbWVGaWxlLnNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFjDs2EgZmlsZS5cclxuICAgIGRlbGV0ZUZpbGUoZXhwbG9yZXJJdGVtOiBGaWxlRXhwbG9yZXJJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5kZWxldGVNdXRpcGxlKFtleHBsb3Jlckl0ZW1dKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBGT0xERVIgTUFOVUxBVElPTi5cclxuICAgIC8vIFThuqFvIHRoxrAgbeG7pWMuXHJcbiAgICBjcmVhdGVGb2xkZXIoKSB7XHJcbiAgICAgICAgdGhpcy5mb3Jtcy5jcmVhdGVGb2xkZXIuZm9ybURhdGEuZGF0YSA9IHtcclxuICAgICAgICAgICAgc2VydmljZUNvZGU6IHRoaXMuc2VydmljZUNvZGUsXHJcbiAgICAgICAgICAgIGVudGl0eTogdGhpcy5lbnRpdHksXHJcbiAgICAgICAgICAgIGVudGl0eUtleTogdGhpcy5fZW50aXR5S2V5LFxyXG4gICAgICAgICAgICBwYXJlbnRGb2xkZXJJZDogdGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybXMuY3JlYXRlRm9sZGVyLnNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE3hu58gdGjGsCBt4bulYy8gY2xpY2sgdGjGsCBt4bulYy5cclxuICAgIGdldEZvbGRlckNvbnRlbnQoY3VycmVudEZvbGRlcklkPzogc3RyaW5nKSB7XHJcbiAgICAgICAgY3VycmVudEZvbGRlcklkID0gY3VycmVudEZvbGRlcklkIHx8IHRoaXMucm9vdEZvbGRlcklkO1xyXG4gICAgICAgIHRoaXMuZGF0YS5jdXJyZW50Rm9sZGVySWQgPSBjdXJyZW50Rm9sZGVySWQ7XHJcbiAgICAgICAgdGhpcy5fdHJpZ2dlclByb2Nlc3NEYXRhKCk7XHJcbiAgICAgICAgdGhpcy5zZXRCcmVhZGNydW1icygpO1xyXG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRWYWxpZGF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZCAhPSB0aGlzLnJvb3RGb2xkZXJJZCkge1xyXG4gICAgICAgICAgICAvLyB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZCk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMub25DaGFuZ2VkLmVtaXQodGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZCk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuZmlyZUV2ZW50Q2hhbmdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIMSQ4buVaSB0w6puIHRoxrAgbeG7pWMuXHJcbiAgICByZW5hbWVGb2xkZXIoZm9sZGVySWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZm9ybXMuY3JlYXRlRm9sZGVyLmhlYWRlciA9ICfEkOG7lWkgdMOqbiB0aMawIG3hu6VjJztcclxuICAgICAgICB0aGlzLmZvcm1zLmNyZWF0ZUZvbGRlci5mb3JtRGF0YS5kYXRhID0ge1xyXG4gICAgICAgICAgICBzZXJ2aWNlQ29kZTogdGhpcy5zZXJ2aWNlQ29kZSxcclxuICAgICAgICAgICAgZW50aXR5OiB0aGlzLmVudGl0eSxcclxuICAgICAgICAgICAgZW50aXR5S2V5OiB0aGlzLl9lbnRpdHlLZXksXHJcbiAgICAgICAgICAgIGlkOiBmb2xkZXJJZFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybXMuY3JlYXRlRm9sZGVyLnNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFjDs2EgdGjGsCBt4bulYy5cclxuICAgIGRlbGV0ZUZvbGRlcihleHBsb3Jlckl0ZW06IEZpbGVFeHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICB0aGlzLmRlbGV0ZU11dGlwbGUoW2V4cGxvcmVySXRlbV0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+IENPTU1PTiBGT0xERVIgJiBGSUxFIE1BTlVMQVRJT04uXHJcbiAgICAvLyBN4bufIHRoxrAgbeG7pWMvIHThu4dwLlxyXG4gICAgYXN5bmMgb3Blbk9iamVjdChleHBsb3Jlckl0ZW06IEZpbGVFeHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICBpZiAoZXhwbG9yZXJJdGVtLmlzRmlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjYW5WaWV3T25saW5lID0gdGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuaXNTdXBwb3J0ZWRWaWV3T25saW5lKGV4cGxvcmVySXRlbS5uYW1lKTtcclxuICAgICAgICAgICAgaWYgKGNhblZpZXdPbmxpbmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3BlbkZpbGVWaWV3ZXIoZXhwbG9yZXJJdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWQoZXhwbG9yZXJJdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9sZGVyQ29udGVudChleHBsb3Jlckl0ZW0uaWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBYw7NhIG5oaeG7gXUgdGjGsCBt4bulYy8gdOG7h3AuXHJcbiAgICBkZWxldGVNdXRpcGxlKGl0ZW1zOiBGaWxlRXhwbG9yZXJJdGVtW10pIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0RlbGV0ZUNvbmZpcm0oKVxyXG4gICAgICAgICAgICAudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9sZGVyU2VydmljZS5kZWxldGVNdWx0aXBsZShpdGVtcylcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEZvbGRlckNvbnRlbnQodGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0RlbGV0ZURhdGFTdWNjZXNzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmdCeVJlcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFThuqNpIHRoxrAgbeG7pWMvIHThu4dwLlxyXG4gICAgYXN5bmMgZG93bmxvYWQoZXhwbG9yZXJJdGVtOiBGaWxlRXhwbG9yZXJJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9kb3dubG9hZExpbmtTZXJ2aWNlLmdldEdlbmVyYXRlRG93bmxvYWRMaW5rTW9kZWwoZXhwbG9yZXJJdGVtKTtcclxuICAgICAgICB0aGlzLl9kb3dubG9hZExpbmtTZXJ2aWNlLmRvd25sb2FkKG1vZGVsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBU4bqjaSBuaGnhu4F1IHRoxrAgbeG7pWMvIHThu4dwLlxyXG4gICAgYXN5bmMgZG93bmxvYWRNdWx0aXBsZSgpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGhhc0l0ZW1zID0gc2VsZWN0ZWRJdGVtcyAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBpZiAoaGFzSXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWQoc2VsZWN0ZWRJdGVtc1swXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJNb2RlbCA9IHNlbGVjdGVkSXRlbXMubWFwKGV4cGxvcmVySXRlbSA9PiB0aGlzLl9kb3dubG9hZExpbmtTZXJ2aWNlLmdldEdlbmVyYXRlRG93bmxvYWRMaW5rTW9kZWwoZXhwbG9yZXJJdGVtKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb3dubG9hZExpbmtTZXJ2aWNlLmRvd25sb2FkTXVsdGlwbGUoYXJyTW9kZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBvcGVuRmlsZVZpZXdlcihleHBsb3Jlckl0ZW06IEZpbGVFeHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICB0aGlzLmZvcm1zLmZpbGVWaWV3ZXIuZm9ybURhdGEuZGF0YSA9IHtcclxuICAgICAgICAgICAgZmlsZUlkOiBleHBsb3Jlckl0ZW0uaWQsXHJcbiAgICAgICAgICAgIGlzRmlsZVZlcnNpb246IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5mb3Jtcy5maWxlVmlld2VyLnNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlRmlsZVZpZXdlcigpIHtcclxuICAgICAgICB0aGlzLmZvcm1zLmZpbGVWaWV3ZXIuc2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZ2V0Rm9sZGVyQ29udGVudCh0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pk1PVkUgRklMRVMgJiBGT0xERVJTLlxyXG4gICAgaGFzU2VsZWN0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaOG7jW4gdGjGsCBt4bulYy8gZmlsZSBkaSBjaHV54buDbi5cclxuICAgIGNhblNlbGVjdCgpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuZGF0YS5tb3ZpbmcuaXNTZWxlY3RpbmdcclxuICAgICAgICAgICAgJiYgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zXHJcbiAgICAgICAgICAgICYmIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuU2V0TW92ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLm1vdmluZy5pc1NlbGVjdGluZ1xyXG4gICAgICAgICAgICAmJiB0aGlzLmRhdGEubW92aW5nLnNlbGVjdGVkSXRlbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5kYXRhLm1vdmluZy5zZWxlY3RlZEl0ZW1zLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBtb3ZlRXhwbG9yZXJJdGVtcygpIHtcclxuICAgICAgICBjb25zdCBjYW5Nb3ZlID0gIXRoaXMuZGF0YS5tb3ZpbmcuaXNTZWxlY3RpbmdcclxuICAgICAgICAgICAgJiYgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zXHJcbiAgICAgICAgICAgICYmIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5sZW5ndGhcclxuICAgICAgICAgICAgJiYgdGhpcy5tb2RlbC5kYXRhU291cmNlXHJcbiAgICAgICAgICAgICYmIHRoaXMubW9kZWwuZGF0YVNvdXJjZS5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICghY2FuTW92ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRhdGEubW92aW5nID0ge1xyXG4gICAgICAgICAgICBpc1NlbGVjdGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5fY29tbW9uU2VydmljZS5jbG9uZU9iamVjdCh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMpLFxyXG4gICAgICAgICAgICBzb3VyY2VGb2xkZXJJZDogdGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGjhuqMgdGjGsCBt4bulYy8gZmlsZS5cclxuICAgIHNldE1vdmVFeHBsb3Jlckl0ZW1zKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5kYXRhLm1vdmluZy5pc1NlbGVjdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtb2RlbCA9IHtcclxuICAgICAgICAgICAgc291cmNlRm9sZGVySWQ6IHRoaXMuZGF0YS5tb3Zpbmcuc291cmNlRm9sZGVySWQsXHJcbiAgICAgICAgICAgIHRhcmdldEZvbGRlcklkOiB0aGlzLmRhdGEuY3VycmVudEZvbGRlcklkLFxyXG4gICAgICAgICAgICBsc3RGaWxlRXhwbG9yZXJJdGVtczogdGhpcy5kYXRhLm1vdmluZy5zZWxlY3RlZEl0ZW1zXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5fZm9sZGVyU2VydmljZS5tb3ZlRXhwbG9yZXJJdGVtcyhtb2RlbClcclxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEZvbGRlckNvbnRlbnQodGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdEaSBjaHV54buDbiB0aMOgbmggY8O0bmcnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubW92aW5nID0ge307XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZ0J5UmVwb25zZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIELhu48gZGkgY2h1eeG7g24uXHJcbiAgICBjYW5jZWxNb3ZlKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YS5tb3ZpbmcgPSB7fTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlZFUlNJT04uXHJcbiAgICBvcGVuRmlsZVZlcnNpb25zKGZpbGU6IEZpbGVFeHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICB0aGlzLmZvcm1zLmZpbGVWZXJzaW9uTGlzdC5maWxlSWQgPSBmaWxlLmlkO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm1zLmZpbGVWZXJzaW9uTGlzdC5zaG93ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+VklFVyBPTkxJTkUuXHJcbiAgICBlZGl0RmlsZShmaWxlOiBGaWxlRXhwbG9yZXJJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCfEkGFuZyBr4bq/dCBu4buRaSBt4bufIOG7qW5nIGThu6VuZycpO1xyXG4gICAgICAgIHRoaXMuX2ZpbGVWZXJzaW9uU2VydmljZS5jcmVhdGVOZXdNaW5vclZlcnNpb24oZmlsZS5pZCwgJycsIGZhbHNlKVxyXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlVmVyc2lvbiA9IDxGaWxlVmVyc2lvbkRUTz5yZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZVVybCA9IHRoaXMuX2ZpbGVWZXJzaW9uU2VydmljZS5nZXRGaWxlVmVyc2lvbkRvd25sb2FkVXJsKGZpbGVWZXJzaW9uLmlkKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgVG5DbGllbnRDb21tYW5kKCk7XHJcbiAgICAgICAgICAgICAgICBjb21tYW5kLmNvbW1hbmRUeXBlID0gQ29tbWFuZFR5cGUuRWRpdEZpbGU7XHJcbiAgICAgICAgICAgICAgICBjb21tYW5kLmtleSA9IHRoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5zaWduYWxyLmNsaWVudEtleTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRGaWxlQ29tbWFuZCA9IG5ldyBFZGl0RmlsZUNvbW1hbmQoKTtcclxuICAgICAgICAgICAgICAgIGVkaXRGaWxlQ29tbWFuZC5maWxlU2VydmljZUVuZHBvaW50ID0gdGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwaURvbWFpbi5maWxlRW5kcG9pbnQ7XHJcbiAgICAgICAgICAgICAgICBlZGl0RmlsZUNvbW1hbmQudXBsb2FkRmlsZUFwaSA9IHRoaXMuX2ZpbGVWZXJzaW9uU2VydmljZS5nZXRVcGxvYWRGaWxlVmVyc2lvbkFwaVVybCgpO1xyXG4gICAgICAgICAgICAgICAgZWRpdEZpbGVDb21tYW5kLnJlbW92ZUZpbGVBcGkgPSB0aGlzLl9maWxlVmVyc2lvblNlcnZpY2UuZ2V0UmVtb3ZlRmlsZVZlcnNpb25BcGlVcmwoKTtcclxuICAgICAgICAgICAgICAgIGVkaXRGaWxlQ29tbWFuZC5maWxlVXJsID0gZmlsZVVybDtcclxuICAgICAgICAgICAgICAgIGVkaXRGaWxlQ29tbWFuZC5pc0RyYWZ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGVkaXRGaWxlQ29tbWFuZC5ncm91cEZpbGVOYW1lID0gZmlsZS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgZWRpdEZpbGVDb21tYW5kLmZpbGVOYW1lID0gZmlsZS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgZWRpdEZpbGVDb21tYW5kLnZlcnNpb25OYW1lID0gZmlsZVZlcnNpb24udmVyc2lvbk5hbWU7XHJcbiAgICAgICAgICAgICAgICBlZGl0RmlsZUNvbW1hbmQuZmlsZVZlcnNpb25JZCA9IGZpbGVWZXJzaW9uLmlkO1xyXG4gICAgICAgICAgICAgICAgZWRpdEZpbGVDb21tYW5kLmFjY2Vzc1Rva2VuID0gdGhpcy5fYXV0aGVuU2VydmljZS5nZXRBY2Nlc3NUb2tlbigpO1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZC5kYXRhID0gZWRpdEZpbGVDb21tYW5kO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3RuQ2xpZW50U2VydmljZS5zZW5kQ29tbWFuZChjb21tYW5kKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaWduYWxyU2VydmljZS51blN1YnNjcmliZVZpZXdDb2RlKG51bGwsICdGSUxFLlZFUlNJT04uVVBEQVRFRCcpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2lnbmFsclNlcnZpY2Uuc3RhcnQobnVsbCwgJ0ZJTEUuVkVSU0lPTi5VUERBVEVEJywgZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9iajogYW55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9iai5tZXNzYWdlLmNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JqLk1lc3NhZ2UuQ29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRMaXN0RmlsZXModGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChDb21tb25FcnJvckNvZGUuRVJST1JfU0VSVklDRV9OT1RfUlVOID09PSBlcnJvci5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1Jlc3BvbnNlRXJyb3IoMCwgbnVsbCwgJ0ZpbGUnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnRklMRV9FWFBMT1JFUi5NRVNTQUdFX0VSUk9SX0hFQURFUicpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnRklMRV9FWFBMT1JFUi5NRVNTQUdFX0VSUk9SX0RFVEFJTCcpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaWZlOiA1MDAwXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gQlJFQURDUlVNQlMuXHJcbiAgICBhc3luYyBzZXRCcmVhZGNydW1icygpIHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBycyA9IGF3YWl0IHRoaXMuX2ZvbGRlclNlcnZpY2UuZ2V0RnVsbEZvbGRlclBhdGgodGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZCk7XHJcbiAgICAgICAgICAgIGlmIChycy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBicmVhZGNydW1icyA9IHJzLmRhdGEubWFwKGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBmLmlkID09IHRoaXMucm9vdEZvbGRlcklkID8gdGhpcy5yb290Rm9sZGVyTmFtZSA6IGYubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGYuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M6IGYuaWQgIT0gdGhpcy5kYXRhLmN1cnJlbnRGb2xkZXJJZCA/ICdmbS1jbGlja2FibGUnIDogJ2ZtLWN1cnJlbnQtZm9sZGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEZvbGRlckNvbnRlbnQoZi5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLmJyZWFkY3J1bWJzID0gYnJlYWRjcnVtYnM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYnJlYWRjcnVtYnMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlLnByb2Nlc3NFcnJvclJlc3BvbnNlKHJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5icmVhZGNydW1icyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+IFNJR04uXHJcbiAgICAvLyBUT0RPOiBMxrB1IMO9IHjhu60gbMO9IHRyxrDhu51uZyBkb3VibGUgY2xpY2sgdsOgbyBuw7p0XHJcbiAgICBzaWduRmlsZShmaWxlOiBGaWxlRXhwbG9yZXJJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dDb25maXJtKCdC4bqhbiBjw7MgY2jhuq9jIGNo4bqvbiBtdeG7kW4ga8O9IHPhu5EgdsSDbiBi4bqjbiBuw6B5PycpLnRoZW4oYXN5bmMgcnMgPT4ge1xyXG4gICAgICAgICAgICBpZiAocnMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VGaWxlSWQgPSBmaWxlLmlkO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGUgPSBmaWxlO1xyXG4gICAgICAgICAgICAgICAgLy8gS8O9IHPhu5EgZmlsZSB3b3JkIC0gY+G6p24gY29udmVydCBzYW5nIHBkZiB0csaw4bubY1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UubmVlZENvbnZlcnRCZWZvcmVTaWduKGZpbGUubmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IGZpbGUgYmVmb3JlIHNpZ25cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByc0NvbnZlcnQgPSBhd2FpdCB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmNvbnZlcnREb2N1bWVudFRvUGRmQW5kU2F2ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc291cmNlRmlsZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jaGFuZ2VGaWxlRXh0ZW5zaW9uKGZpbGUubmFtZSwgJ3BkZicpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVySWQ6IGZpbGUucGFyZW50Rm9sZGVySWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lclR5cGU6IHRoaXMuX3VzZXJTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCkudXNlcklkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJzQ29udmVydCB8fCAhcnNDb252ZXJ0LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhgQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBjaHV54buDbiDEkeG7lWkgdMOgaSBsaeG7h3UgJHtmaWxlLm5hbWV9IHRow6BuaCBwZGYgxJHhu4Mga8O9LiBWdWkgbMOybmcgdGjhu60gbOG6oWkgc2F1YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoYENodXnhu4NuIMSR4buVaSB0w6BpIGxp4buHdSAke2ZpbGUubmFtZX0gdGjDoG5oIHBkZiB0aMOgbmggY8O0bmdgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVJZCA9IHJzQ29udmVydC5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZSA9IHsgaWQ6IHNvdXJjZUZpbGVJZCB9IGFzIEZpbGVFeHBsb3Jlckl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyUHJvY2Vzc0RhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYEPDsyBs4buXaSB44bqjeSByYSBraGkgY2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7ZmlsZS5uYW1lfSB0aMOgbmggcGRmIMSR4buDIGvDvS4gVnVpIGzDsm5nIHRo4butIGzhuqFpIHNhdWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuZ2VuZXJhdGVMaW5rRG93bmxvYWQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogc291cmNlRmlsZUlkLFxyXG4gICAgICAgICAgICAgICAgfSBhcyBHZW5lcmF0ZUxpbmtEb3dubG9hZERUTykudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fZG93bmxvYWRMaW5rU2VydmljZS5nZXREb3dubG9hZEZvclNpZ25VcmwocnMuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJtcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIHBybXNbJ0ZpbGVVcGxvYWRIYW5kbGVyJ10gPSBgJHt0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBpRG9tYWluLmZpbGVFbmRwb2ludH0vJHt0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBpVmVyc2lvbn0vS3lTb0ZpbGUvU2F2ZVBoeXNpY2FsU2lnbmVkRmlsZWA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJtc1snU2Vzc2lvbklkJ10gPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBwcm1zWydGaWxlTmFtZSddID0gdXJsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uX3BybXMgPSBKU09OLnN0cmluZ2lmeShwcm1zKTtcclxuICAgICAgICAgICAgICAgICAgICB2Z2NhX3NpZ25fYXBwcm92ZWQoanNvbl9wcm1zLCAocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0T2JqID0gSlNPTi5wYXJzZShyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0T2JqLkZpbGVTZXJ2ZXIgIT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2Uuc2F2ZVNpZ25lZEZpbGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGU6IHNvdXJjZUZpbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGVJZDogcmVzdWx0T2JqLkZpbGVTZXJ2ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKHJzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlclByb2Nlc3NEYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdLw70gc+G7kSB0aMOgbmggY8O0bmcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNoYXJlRm9sZGVyKGZpbGU6IEZpbGVFeHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICB0aGlzLmZvcm1zLnNoYXJlRm9sZGVyLmRhdGEgPSBmaWxlO1xyXG4gICAgICAgIHRoaXMuZm9ybXMuc2hhcmVGb2xkZXIuc2hvdyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hhcmVGaWxlKGZpbGU6IEZpbGVFeHBsb3Jlckl0ZW0pIHtcclxuICAgICAgICB0aGlzLmZvcm1zLnNoYXJlRmlsZS5kYXRhID0gZmlsZTtcclxuICAgICAgICB0aGlzLmZvcm1zLnNoYXJlRmlsZS5zaG93ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RGaWxlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmZpbGVDb250cm9sLmJhc2ljRmlsZUlucHV0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZUNvbnRyb2wuYmFzaWNGaWxlSW5wdXQubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2aWV3TGlzdFNpZ24oZTogRXZlbnQsIHNpZ25hdHVyZXM6IGFueSkge1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5hZHZhbmNlRGF0YSA9IHNpZ25hdHVyZXM7XHJcbiAgICAgICAgdGhpcy5mb3Jtcy5zaWduYXR1cmVEZXRhaWwuc2hvdyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgb25Sb3dTZWxlY3QoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5vblNlbGVjdGVkLmVtaXQodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHNpZ25NdWx0aXBsZSgpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGhhc0l0ZW1zID0gc2VsZWN0ZWRJdGVtcyAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBpZiAoaGFzSXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2lnbkZpbGUoc2VsZWN0ZWRJdGVtc1swXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25GaWxlTXVsdGlwbGUoc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBzaWduRmlsZU11bHRpcGxlKGxzdEZpbGU6IEZpbGVFeHBsb3Jlckl0ZW1bXSkge1xyXG4gICAgICAgIGNvbnN0IHBybXMgPSB7fTtcclxuICAgICAgICBwcm1zWydGaWxlcyddID0gW107XHJcbiAgICAgICAgcHJtc1snRmlsZVVwbG9hZEhhbmRsZXInXSA9IGAke3RoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5hcGlEb21haW4uZmlsZUVuZHBvaW50fS8ke3RoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5hcGlWZXJzaW9ufS9LeVNvRmlsZS9TYXZlUGh5c2ljYWxTaWduZWRGaWxlYDtcclxuICAgICAgICBwcm1zWydTZXNzaW9uSWQnXSA9ICcnO1xyXG4gICAgICAgIHZhciBycyA9IGF3YWl0IHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93Q29uZmlybSgnQuG6oW4gY8OzIGNo4bqvYyBjaOG6r24gbXXhu5FuIGvDvSBz4buRIGPDoWMgdsSDbiBi4bqjbiBuw6B5PycpO1xyXG4gICAgICAgIGlmIChycykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgbHN0RmlsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9maWxlT2JqZWN0U2VydmljZS5pc1R5cGVGaWxlS3lTbyhmaWxlLm5hbWUpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlRmlsZUlkID0gZmlsZS5pZDtcclxuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VGaWxlID0gZmlsZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5uZWVkQ29udmVydEJlZm9yZVNpZ24oZmlsZS5uYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJzQ29udmVydCA9IGF3YWl0IHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuY29udmVydERvY3VtZW50VG9QZGZBbmRTYXZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBzb3VyY2VGaWxlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmNoYW5nZUZpbGVFeHRlbnNpb24oZmlsZS5uYW1lLCAncGRmJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJJZDogZmlsZS5wYXJlbnRGb2xkZXJJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyVHlwZTogdGhpcy5fdXNlclNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKS51c2VySWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJzQ29udmVydCB8fCAhcnNDb252ZXJ0LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhgQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBjaHV54buDbiDEkeG7lWkgdMOgaSBsaeG7h3UgJHtmaWxlLm5hbWV9IHRow6BuaCBwZGYgxJHhu4Mga8O9LiBWdWkgbMOybmcgdGjhu60gbOG6oWkgc2F1YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuZ2VuZXJhdGVMaW5rRG93bmxvYWQoeyBmaWxlSWQ6IHJzQ29udmVydC5kYXRhIH0gYXMgR2VuZXJhdGVMaW5rRG93bmxvYWREVE8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fZG93bmxvYWRMaW5rU2VydmljZS5nZXREb3dubG9hZEZvclNpZ25VcmwocmVzdWx0LmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBybXNbJ0ZpbGVzJ10ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRmlsZUlEXCI6IHJzQ29udmVydC5kYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkZpbGVOYW1lXCI6IHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuY2hhbmdlRmlsZUV4dGVuc2lvbihmaWxlLm5hbWUsICdwZGYnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVUkxcIjogdXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYEPDsyBs4buXaSB44bqjeSByYSBraGkgY2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7ZmlsZS5uYW1lfSB0aMOgbmggcGRmIMSR4buDIGvDvS4gVnVpIGzDsm5nIHRo4butIGzhuqFpIHNhdWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuZ2VuZXJhdGVMaW5rRG93bmxvYWQoeyBmaWxlSWQ6IHNvdXJjZUZpbGVJZCB9IGFzIEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fZG93bmxvYWRMaW5rU2VydmljZS5nZXREb3dubG9hZEZvclNpZ25VcmwocmVzdWx0LmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJtc1snRmlsZXMnXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRmlsZUlEXCI6IHNvdXJjZUZpbGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRmlsZU5hbWVcIjogZmlsZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVUkxcIjogdXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGpzb25fcHJtcyA9IEpTT04uc3RyaW5naWZ5KHBybXMpO1xyXG4gICAgICAgICAgICB2Z2NhX3NpZ25fZmlsZXMoanNvbl9wcm1zLCAocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdE9iaiA9IEpTT04ucGFyc2UocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRPYmouRmlsZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdE9iai5GaWxlcy5mb3JFYWNoKGFzeW5jIChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5zYXZlU2lnbmVkRmlsZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlOiB7IGlkOiBpdGVtLkZpbGVJRCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGVJZDogaXRlbS5GaWxlU2lnbmVkVVJMLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKHJzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyUHJvY2Vzc0RhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcygnS8O9IHPhu5EgdGjDoG5oIGPDtG5nJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==