tnx-shared 5.3.423 → 5.3.425

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.
@@ -6,7 +6,7 @@ import { FileUpload } from 'tn-custom-primeng/fileupload';
6
6
  import { OverlayPanel } from 'tn-custom-primeng/overlaypanel';
7
7
  import { ComponentContextService } from '../../app-context/component-context.service';
8
8
  import { ComponentBase } from '../../classes/base/component-base';
9
- import { FileUploadControlSchema } from '../../classes/form-schema';
9
+ import { CrudFormData, CrudFormSetting, FileUploadControlSchema, PopupSize } from '../../classes/form-schema';
10
10
  import { ComCtxConstants } from '../../configs/component-context.constant';
11
11
  import { CommandType, TnClientCommand } from '../../models/tn-client-command';
12
12
  import { AuthenService } from '../../services/authen.service';
@@ -22,8 +22,9 @@ import { DownloadLinkService } from '../file-explorer/services/download-link.ser
22
22
  import { FileDataService } from '../file-explorer/services/file-data.service';
23
23
  import { FileExplorerService } from '../file-explorer/services/file-explorer.service';
24
24
  import { FileObjectService } from '../file-explorer/services/file-object.service';
25
+ import { DeviceDetectorService } from 'ngx-device-detector';
25
26
  export class ServiceFileUploadComponent extends ComponentBase {
26
- constructor(_fileObjectService, _signalRService, _moduleConfigService, _tnClientService, _authenService, _userService, _notifierService, _downloadLinkService, _fileExplorerService, _injector) {
27
+ constructor(_fileObjectService, _signalRService, _moduleConfigService, _tnClientService, _authenService, _userService, _notifierService, _downloadLinkService, _fileExplorerService, _deviceDetectorService, _injector) {
27
28
  super(_injector);
28
29
  this._fileObjectService = _fileObjectService;
29
30
  this._signalRService = _signalRService;
@@ -34,10 +35,12 @@ export class ServiceFileUploadComponent extends ComponentBase {
34
35
  this._notifierService = _notifierService;
35
36
  this._downloadLinkService = _downloadLinkService;
36
37
  this._fileExplorerService = _fileExplorerService;
38
+ this._deviceDetectorService = _deviceDetectorService;
37
39
  this.control = new FileUploadControlSchema();
38
40
  this.serviceCode = '';
39
41
  this.entity = '';
40
42
  this.chooseLabel = 'Chọn';
43
+ this.parentSetting = new CrudFormSetting();
41
44
  this.onInit = new EventEmitter();
42
45
  this.onSelect = new EventEmitter();
43
46
  this.onRemove = new EventEmitter();
@@ -62,6 +65,25 @@ export class ServiceFileUploadComponent extends ComponentBase {
62
65
  this._subscribe = null;
63
66
  this.dataModel = {};
64
67
  this.forms = {};
68
+ this.formIds = {
69
+ createFolder: 'createFolder',
70
+ renameFile: 'renameFile',
71
+ shareFile: 'shareFile',
72
+ shareFolder: 'shareFolder',
73
+ fileViewer: 'fileViewer',
74
+ fileVersionList: 'fileVersionList',
75
+ signatureDetail: 'signatureDetail',
76
+ kySoSim: 'kySoSim',
77
+ viewDetail: 'viewDetail'
78
+ };
79
+ this.signatureFormModel = {
80
+ formData: new CrudFormData(),
81
+ show: false,
82
+ popupSize: new PopupSize({
83
+ width: 600,
84
+ height: 400
85
+ })
86
+ };
65
87
  if (this._userService.isValidAccessToken()) {
66
88
  this.userId = this._userService.getUserIdCombine();
67
89
  }
@@ -94,6 +116,10 @@ export class ServiceFileUploadComponent extends ComponentBase {
94
116
  show: false,
95
117
  formData: {},
96
118
  };
119
+ this.forms[this.formIds.signatureDetail] = {
120
+ header: 'Thông tin chữ ký số',
121
+ show: false,
122
+ };
97
123
  if (this.fileDataService) {
98
124
  this.fileDataService.register(this);
99
125
  }
@@ -121,6 +147,12 @@ export class ServiceFileUploadComponent extends ComponentBase {
121
147
  else {
122
148
  this.setFileObject(null);
123
149
  }
150
+ this._fileExplorerService.getSignatureInfoByFileId(this.fileId).then(rs => {
151
+ var _a;
152
+ if (rs.success && ((_a = rs.data) === null || _a === void 0 ? void 0 : _a.length)) {
153
+ this.selectedFile.signatures = rs.data;
154
+ }
155
+ });
124
156
  this.control.hasFile = this.hasFile;
125
157
  this.setMenu();
126
158
  });
@@ -136,6 +168,7 @@ export class ServiceFileUploadComponent extends ComponentBase {
136
168
  this.onChanged.emit();
137
169
  return;
138
170
  }
171
+ this.selectedFile = fileObject;
139
172
  this.fileObj = fileObject;
140
173
  this.fileId = fileObject.id;
141
174
  this.setFileName(fileObject.name);
@@ -162,7 +195,70 @@ export class ServiceFileUploadComponent extends ComponentBase {
162
195
  command: () => {
163
196
  this.download();
164
197
  }
165
- }
198
+ },
199
+ {
200
+ label: 'Ký số cá nhân (SIM)',
201
+ icon: 'fas fa-sim-card',
202
+ command: () => {
203
+ this.signKySimFile(this.selectedFile);
204
+ },
205
+ visible: (this._fileObjectService.isTypeFileKySo(this.selectedFile.name)
206
+ && !this.parentSetting.hiddenKySoSimCaNhan),
207
+ },
208
+ {
209
+ label: 'Ký số SmartCA',
210
+ icon: 'fas fa-signature',
211
+ command: () => {
212
+ this.signatureFormModel.show = true;
213
+ },
214
+ visible: (this._fileObjectService.isTypeFileKySo(this.selectedFile.name)
215
+ && !this.parentSetting.hiddenKySoSmartCA),
216
+ },
217
+ {
218
+ label: 'Ký số cá nhân (USB)', icon: 'fas fa-signature',
219
+ command: () => {
220
+ this.signFile(this.selectedFile);
221
+ },
222
+ visible: (this._fileObjectService.isTypeFileKySo(this.selectedFile.name)
223
+ && this._deviceDetectorService.isDesktop()
224
+ && !this.parentSetting.hiddenKySoUsbCaNhan),
225
+ },
226
+ {
227
+ label: 'Ký số VNPTCA', icon: 'fas fa-signature',
228
+ command: () => {
229
+ this.signVNPTCA(this.selectedFile);
230
+ },
231
+ visible: (this._fileObjectService.isTypeFileKySo(this.selectedFile.name)
232
+ && this._deviceDetectorService.isDesktop()
233
+ && !this.parentSetting.hiddenKySoVNPTCA),
234
+ },
235
+ {
236
+ label: 'Bút phê', icon: 'fas fa-comment-dots',
237
+ command: () => {
238
+ this.addComment(this.selectedFile);
239
+ },
240
+ visible: (this._fileObjectService.isTypeFileKySo(this.selectedFile.name)
241
+ && this._deviceDetectorService.isDesktop()
242
+ && !this.parentSetting.hiddenButPhe),
243
+ },
244
+ {
245
+ label: 'Bút phê và ký', icon: 'fas fa-comment-medical',
246
+ command: () => {
247
+ this.addCommentAndSign(this.selectedFile);
248
+ },
249
+ visible: (this._fileObjectService.isTypeFileKySo(this.selectedFile.name)
250
+ && this._deviceDetectorService.isDesktop()
251
+ && !this.parentSetting.hiddenButPhe),
252
+ },
253
+ {
254
+ label: 'Ký số đơn vị (USB)', icon: 'fas fa-signature',
255
+ command: () => {
256
+ this.signFileDonVi(this.selectedFile);
257
+ },
258
+ visible: (this._fileObjectService.isTypeFileKySo(this.selectedFile.name)
259
+ && this._deviceDetectorService.isDesktop()
260
+ && !this.parentSetting.hiddenKySoDonVi),
261
+ },
166
262
  ];
167
263
  }
168
264
  subscribe() {
@@ -190,70 +286,82 @@ export class ServiceFileUploadComponent extends ComponentBase {
190
286
  }
191
287
  }
192
288
  onSelectFile(evt) {
193
- this.hasFile = false;
194
- this.fileId = null;
195
- this.file.clear();
196
- if (evt.errorFiles && evt.errorFiles.length > 0) {
197
- this.showNoti = true;
198
- this.notification = `${evt.errorMessages[0].summary}${evt.errorMessages[0].detail}`;
199
- }
200
- else {
201
- this.selectedFile = evt.successFiles[0];
202
- this.setFileName(this.selectedFile ? this.selectedFile.name : null);
203
- if (this.control.autoSaved) {
204
- this.handleSaveFile();
289
+ return __awaiter(this, void 0, void 0, function* () {
290
+ this.hasFile = false;
291
+ this.fileId = null;
292
+ this.file.clear();
293
+ if (evt.errorFiles && evt.errorFiles.length > 0) {
294
+ this.showNoti = true;
295
+ this.notification = `${evt.errorMessages[0].summary}${evt.errorMessages[0].detail}`;
205
296
  }
206
297
  else {
207
- this.hasFile = true;
208
- this.onChangeBase('has-value');
209
- this.onSelect.emit(this.selectedFile);
210
- this.onChanged.emit(this.selectedFile);
298
+ this.selectedFile = evt.successFiles[0];
299
+ this.setFileName(this.selectedFile ? this.selectedFile.name : null);
300
+ if (this.control.autoSaved) {
301
+ yield this.handleSaveFile();
302
+ }
303
+ else {
304
+ this.hasFile = true;
305
+ this.onChangeBase('has-value');
306
+ this.onSelect.emit(this.selectedFile);
307
+ this.onChanged.emit(this.selectedFile);
308
+ }
211
309
  }
212
- }
213
- this.control.hasFile = this.hasFile;
310
+ this.control.hasFile = this.hasFile;
311
+ this.setMenu();
312
+ });
214
313
  }
215
314
  handleSaveFile() {
216
- // Đã lưu file.
217
- if (this.fileId) {
218
- return;
219
- }
220
- // Trường hợp không có đủ keys.
221
- if (!this.hasKeys()) {
222
- this._notifierService.showWarning('Chưa cấu hình keys');
223
- return;
224
- }
225
- // Chưa chọn file.
226
- if (!this.selectedFile) {
227
- return;
228
- }
229
- const formData = new FormData();
230
- formData.append('serviceCode', this.serviceCode);
231
- formData.append('entity', this.entity);
232
- formData.append('entityKey', this.entityKey);
233
- formData.append('isMultiple', 'false');
234
- formData.append('isPublic', `${this.control.isPublic}`);
235
- formData.append('file', this.selectedFile);
236
- this.loading = true;
237
- this.setNoti('Đang tải file lên...');
238
- this._fileObjectService.createServiceFile(formData)
239
- .then(rs => {
240
- this.loading = false;
241
- this.setNoti(null);
242
- if (rs.success) {
243
- this.selectedFile = this.selectedFile;
244
- this.selectedFileName = this.selectedFile.name;
245
- this.fileId = rs.data;
246
- this.hasFile = true;
247
- this.control.hasFile = this.hasFile;
248
- this.onChanged.emit({ fileId: this.fileId, selectedFile: this.selectedFile });
315
+ return __awaiter(this, void 0, void 0, function* () {
316
+ // Đã lưu file.
317
+ if (this.fileId) {
318
+ return;
249
319
  }
250
- else {
251
- this._crudService.processErrorResponse(rs);
320
+ // Trường hợp không có đủ keys.
321
+ if (!this.hasKeys()) {
322
+ this._notifierService.showWarning('Chưa cấu hình keys');
323
+ return;
324
+ }
325
+ // Chưa chọn file.
326
+ if (!this.selectedFile) {
327
+ return;
252
328
  }
253
- }, err => {
254
- this.loading = false;
255
- this.setNoti(null);
256
- this._notifierService.showWarning('Upload file chưa thành công');
329
+ const formData = new FormData();
330
+ formData.append('serviceCode', this.serviceCode);
331
+ formData.append('entity', this.entity);
332
+ formData.append('entityKey', this.entityKey);
333
+ formData.append('isMultiple', 'false');
334
+ formData.append('isPublic', `${this.control.isPublic}`);
335
+ formData.append('file', this.selectedFile);
336
+ this.loading = true;
337
+ this.setNoti('Đang tải file lên...');
338
+ yield this._fileObjectService.createServiceFile(formData)
339
+ .then(rs => {
340
+ this.loading = false;
341
+ this.setNoti(null);
342
+ if (rs.success) {
343
+ this.selectedFile = this.selectedFile;
344
+ this.selectedFileName = this.selectedFile.name;
345
+ this.fileId = rs.data;
346
+ this.selectedFile.id = rs.data;
347
+ this.hasFile = true;
348
+ this.control.hasFile = this.hasFile;
349
+ this.onChanged.emit({ fileId: this.fileId, selectedFile: this.selectedFile });
350
+ this._fileExplorerService.getSignatureInfoByFileId(this.fileId).then(rs => {
351
+ var _a;
352
+ if (rs.success && ((_a = rs.data) === null || _a === void 0 ? void 0 : _a.length)) {
353
+ this.selectedFile.signatures = rs.data;
354
+ }
355
+ });
356
+ }
357
+ else {
358
+ this._crudService.processErrorResponse(rs);
359
+ }
360
+ }, err => {
361
+ this.loading = false;
362
+ this.setNoti(null);
363
+ this._notifierService.showWarning('Upload file chưa thành công');
364
+ });
257
365
  });
258
366
  }
259
367
  setNoti(msg) {
@@ -278,6 +386,11 @@ export class ServiceFileUploadComponent extends ComponentBase {
278
386
  this.selectedFileNameShort = null;
279
387
  }
280
388
  }
389
+ viewListSign(e, signatures) {
390
+ e.stopPropagation();
391
+ this.forms[this.formIds.signatureDetail].show = true;
392
+ this.model.advanceData = signatures;
393
+ }
281
394
  showContextMenu(evt) {
282
395
  this.contextMenu.toggle(evt);
283
396
  evt.stopPropagation();
@@ -421,11 +534,432 @@ export class ServiceFileUploadComponent extends ComponentBase {
421
534
  this.forms.fileViewer.show = true;
422
535
  });
423
536
  }
537
+ signFileSmartCA(dataKySo) {
538
+ var _a;
539
+ return __awaiter(this, void 0, void 0, function* () {
540
+ this.signatureFormModel.show = false;
541
+ let sourceFileId = this.selectedFile.id;
542
+ if (this._fileExplorerService.needConvertBeforeSign(this.selectedFile.name)) {
543
+ try {
544
+ const rsConvert = yield this._fileExplorerService.convertDocumentToPdfAndSave({
545
+ instanceId: sourceFileId,
546
+ name: this._fileExplorerService.changeFileExtension(this.selectedFile.name, 'pdf'),
547
+ folderInstanceId: (_a = this.selectedFile.parentFolderId) !== null && _a !== void 0 ? _a : this._commonService.guid(),
548
+ ownerType: this._userService.getCurrentUser().userId.toString(),
549
+ });
550
+ if (!rsConvert || !rsConvert.success) {
551
+ this._notifierService.showWarning(`Có lỗi xảy ra khi chuyển đổi tài liệu ${this.selectedFile.name} thành pdf để ký. Vui lòng thử lại sau`);
552
+ return;
553
+ }
554
+ else {
555
+ this._notifierService.showSuccess(`Chuyển đổi tài liệu ${this.selectedFile.name} thành pdf thành công`);
556
+ sourceFileId = rsConvert.data;
557
+ }
558
+ }
559
+ catch (e) {
560
+ this._notifierService.showWarning(`Có lỗi xảy ra khi chuyển đổi tài liệu ${this.selectedFile.name} thành pdf để ký. Vui lòng thử lại sau`);
561
+ return;
562
+ }
563
+ }
564
+ if (!dataKySo) {
565
+ this._notifierService.showWarning('Người dùng chưa cấu hình thông tin ký số');
566
+ }
567
+ debugger;
568
+ this.forms.fileViewer.formData.data = {
569
+ fileId: sourceFileId,
570
+ isFileVersion: false,
571
+ fileName: this.selectedFile.name,
572
+ service: this.serviceCode,
573
+ entity: this.entity,
574
+ entityKey: this.entityKey,
575
+ fileBase64Content: dataKySo.fileBase64Content,
576
+ userChuKySoId: dataKySo.id,
577
+ showKySoButton: true,
578
+ width: dataKySo.width,
579
+ height: dataKySo.height,
580
+ };
581
+ this.forms.fileViewer.show = true;
582
+ });
583
+ }
584
+ signKySimFile(file) {
585
+ this.forms.kySoSim.show = true;
586
+ this.model.advanceData = file;
587
+ }
588
+ signFile(file) {
589
+ 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* () {
590
+ if (rs) {
591
+ let sourceFileId = file.id;
592
+ let sourceFile = file;
593
+ // Ký số file word - cần convert sang pdf trước
594
+ if (this._fileExplorerService.needConvertBeforeSign(file.name)) {
595
+ // convert file before sign
596
+ try {
597
+ const rsConvert = yield this._fileExplorerService.convertDocumentToPdfAndSave({
598
+ instanceId: sourceFileId,
599
+ name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
600
+ folderInstanceId: file.parentFolderId,
601
+ ownerType: this._userService.getCurrentUser().userId.toString(),
602
+ });
603
+ if (!rsConvert || !rsConvert.success) {
604
+ 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`);
605
+ return;
606
+ }
607
+ else {
608
+ this._notifierService.showSuccess(`Chuyển đổi tài liệu ${file.name} thành pdf thành công`);
609
+ sourceFileId = rsConvert.data;
610
+ sourceFile = { id: sourceFileId };
611
+ this.getServiceFile();
612
+ }
613
+ }
614
+ catch (e) {
615
+ 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`);
616
+ return;
617
+ }
618
+ }
619
+ this._fileExplorerService.generateLinkDownload({
620
+ fileId: sourceFileId,
621
+ }).then(rs => {
622
+ const url = this._downloadLinkService.getDownloadForSignUrl(rs.data);
623
+ const prms = {};
624
+ prms['FileUploadHandler'] = `${this._moduleConfig.environment.apiDomain.fileEndpoint}/${this._moduleConfig.environment.apiVersion}/KySoFile/SavePhysicalSignedFile`;
625
+ prms['SessionId'] = '';
626
+ prms['FileName'] = url;
627
+ // tslint:disable-next-line: variable-name
628
+ const json_prms = JSON.stringify(prms);
629
+ vgca_sign_approved(json_prms, (result) => {
630
+ const resultObj = JSON.parse(result);
631
+ if (resultObj.FileServer != '') {
632
+ this._fileExplorerService.saveSignedFile({
633
+ sourceFile: sourceFile,
634
+ tempFileId: resultObj.FileServer,
635
+ }).then(rss => {
636
+ this.getServiceFile();
637
+ this._notifierService.showSuccess('Ký số thành công');
638
+ });
639
+ }
640
+ });
641
+ });
642
+ }
643
+ }));
644
+ }
645
+ signVNPTCA(item) {
646
+ var _a;
647
+ return __awaiter(this, void 0, void 0, function* () {
648
+ let sourceFileId = item.id;
649
+ if (this._fileExplorerService.needConvertBeforeSign(item.name)) {
650
+ // convert file before sign
651
+ try {
652
+ const rsConvert = yield this._fileExplorerService.convertDocumentToPdfAndSave({
653
+ instanceId: item.id,
654
+ name: this._fileExplorerService.changeFileExtension(item.name, 'pdf'),
655
+ folderInstanceId: (_a = item.parentFolderId) !== null && _a !== void 0 ? _a : this._commonService.guid(),
656
+ ownerType: this._userService.getCurrentUser().userId.toString(),
657
+ });
658
+ if (!rsConvert || !rsConvert.success) {
659
+ this._notifierService.showWarning(`Có lỗi xảy ra khi chuyển đổi tài liệu ${item.name} thành pdf để ký. Vui lòng thử lại sau`);
660
+ return;
661
+ }
662
+ else {
663
+ this._notifierService.showSuccess(`Chuyển đổi tài liệu ${item.name} thành pdf thành công`);
664
+ sourceFileId = rsConvert.data;
665
+ this.model.selectedItem.id = rsConvert.data;
666
+ this.getServiceFile();
667
+ }
668
+ }
669
+ catch (e) {
670
+ this._notifierService.showWarning(`Có lỗi xảy ra khi chuyển đổi tài liệu ${item.name} thành pdf để ký. Vui lòng thử lại sau`);
671
+ return;
672
+ }
673
+ }
674
+ const dataInput = (yield this._fileExplorerService.getBase64FromFileId(sourceFileId)).split(',')[1];
675
+ const sigOptions = new PdfSigner();
676
+ sigOptions.page = 1;
677
+ sigOptions.AdvancedCustom = true;
678
+ sigOptions.SigType = 1;
679
+ const dataJS = {
680
+ data: dataInput,
681
+ type: 'pdf',
682
+ sigOptions: JSON.stringify(sigOptions)
683
+ };
684
+ try {
685
+ const data = yield vnpt_plugin.signArrDataAdvanced([JSON.stringify(dataJS)], "", false);
686
+ this.handeResult(data);
687
+ }
688
+ catch (e) {
689
+ console.log(e);
690
+ }
691
+ });
692
+ }
693
+ handeResult(data) {
694
+ if (typeof JSON.parse(data).code !== 'undefined') {
695
+ var jsOb = JSON.parse(data);
696
+ }
697
+ else {
698
+ var jsOb = JSON.parse(JSON.parse(data)[0]);
699
+ }
700
+ switch (jsOb.code) {
701
+ case 0:
702
+ this._fileExplorerService.kySimSaveSignedFile({
703
+ sourceFile: this.model.selectedItem,
704
+ fileContents: jsOb.data,
705
+ }).then((rss) => {
706
+ this._notifierService.showSuccess("Ký thành công");
707
+ this.getServiceFile();
708
+ });
709
+ break;
710
+ case 1:
711
+ this._notifierService.showWarning("Dữ liệu đầu vào không đúng định dạng");
712
+ break;
713
+ case 2:
714
+ this._notifierService.showWarning("Không lấy được thông tin chứng thư số");
715
+ break;
716
+ case 3:
717
+ this._notifierService.showWarning("Có lỗi trong quá trình ký số");
718
+ break;
719
+ case 4:
720
+ this._notifierService.showSuccess("Chứng thư số không có khóa bí mật");
721
+ break;
722
+ case 5:
723
+ this._notifierService.showSuccess("Lỗi không xác định");
724
+ break;
725
+ case 6:
726
+ this._notifierService.showSuccess("Ký pdf: không tìm thấy tham số số trang cần ký");
727
+ break;
728
+ case 7:
729
+ this._notifierService.showSuccess("Ký pdf: trang đặt chữ ký không tồn tại");
730
+ break;
731
+ case 8:
732
+ this._notifierService.showSuccess("Ký xml: không tìm thấy thẻ ký số");
733
+ break;
734
+ case 9:
735
+ this._notifierService.showSuccess("Ký pdf: không tìm thấy id của thẻ ký số");
736
+ break;
737
+ case 10:
738
+ this._notifierService.showSuccess("Dữ liệu ký đã chứa một hoặc nhiều chữ ký không hợp lệ");
739
+ break;
740
+ case 11:
741
+ this._notifierService.showSuccess("Người dùng hủy bỏ");
742
+ break;
743
+ case 13:
744
+ this._notifierService.showWarning("Dữ liệu ký rỗng");
745
+ break;
746
+ default:
747
+ this._notifierService.showSuccess("Lỗi không xác định");
748
+ break;
749
+ }
750
+ }
751
+ addComment(file) {
752
+ this._notifierService.showConfirm('Bạn có chắc chắn muốn bút phê văn bản này?').then((rs) => __awaiter(this, void 0, void 0, function* () {
753
+ if (rs) {
754
+ let sourceFileId = file.id;
755
+ let sourceFile = file;
756
+ // Ký số file word - cần convert sang pdf trước
757
+ if (this._fileExplorerService.needConvertBeforeSign(file.name)) {
758
+ // convert file before sign
759
+ try {
760
+ const rsConvert = yield this._fileExplorerService.convertDocumentToPdfAndSave({
761
+ instanceId: sourceFileId,
762
+ name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
763
+ folderInstanceId: file.parentFolderId,
764
+ ownerType: this._userService.getCurrentUser().userId.toString(),
765
+ });
766
+ if (!rsConvert || !rsConvert.success) {
767
+ 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`);
768
+ return;
769
+ }
770
+ else {
771
+ this._notifierService.showSuccess(`Chuyển đổi tài liệu ${file.name} thành pdf thành công`);
772
+ sourceFileId = rsConvert.data;
773
+ sourceFile = { id: sourceFileId };
774
+ this.getServiceFile();
775
+ }
776
+ }
777
+ catch (e) {
778
+ 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`);
779
+ return;
780
+ }
781
+ }
782
+ this._fileExplorerService.generateLinkDownload({
783
+ fileId: sourceFileId,
784
+ }).then(rs => {
785
+ const url = this._downloadLinkService.getDownloadForSignUrl(rs.data);
786
+ const prms = {};
787
+ prms['FileUploadHandler'] = `${this._moduleConfig.environment.apiDomain.fileEndpoint}/${this._moduleConfig.environment.apiVersion}/KySoFile/SavePhysicalSignedFile`;
788
+ prms['SessionId'] = '';
789
+ prms['FileName'] = url;
790
+ // tslint:disable-next-line: variable-name
791
+ const json_prms = JSON.stringify(prms);
792
+ vgca_comment(json_prms, (result) => {
793
+ const resultObj = JSON.parse(result);
794
+ if (resultObj.FileServer != '') {
795
+ this._fileExplorerService.saveSignedFile({
796
+ sourceFile: sourceFile,
797
+ tempFileId: resultObj.FileServer,
798
+ }).then(rss => {
799
+ this.getServiceFile();
800
+ this._notifierService.showSuccess('Tạo bút phê thành công');
801
+ });
802
+ }
803
+ });
804
+ });
805
+ }
806
+ }));
807
+ }
808
+ addCommentAndSign(file) {
809
+ return __awaiter(this, void 0, void 0, function* () {
810
+ const rs = yield this._notifierService.showConfirm('Bạn có chắc chắn muốn tạo bút phê và ký văn bản này?');
811
+ if (rs) {
812
+ let sourceFileId = file.id;
813
+ let sourceFile = file;
814
+ // Ký số file word - cần convert sang pdf trước
815
+ if (this._fileExplorerService.needConvertBeforeSign(file.name)) {
816
+ // convert file before sign
817
+ try {
818
+ const rsConvert = yield this._fileExplorerService.convertDocumentToPdfAndSave({
819
+ instanceId: sourceFileId,
820
+ name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
821
+ folderInstanceId: file.parentFolderId,
822
+ ownerType: this._userService.getCurrentUser().userId.toString(),
823
+ });
824
+ if (!rsConvert || !rsConvert.success) {
825
+ 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`);
826
+ return;
827
+ }
828
+ else {
829
+ this._notifierService.showSuccess(`Chuyển đổi tài liệu ${file.name} thành pdf thành công`);
830
+ sourceFileId = rsConvert.data;
831
+ sourceFile = { id: sourceFileId };
832
+ this.getServiceFile();
833
+ }
834
+ }
835
+ catch (e) {
836
+ 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`);
837
+ return;
838
+ }
839
+ }
840
+ const downloadLink = yield this._fileExplorerService.generateLinkDownload({
841
+ fileId: sourceFileId,
842
+ });
843
+ const url = this._downloadLinkService.getDownloadForSignUrl(downloadLink.data);
844
+ const prms = {
845
+ FileUploadHandler: `${this._moduleConfig.environment.apiDomain.fileEndpoint}/${this._moduleConfig.environment.apiVersion}/KySoFile/SavePhysicalSignedFile`,
846
+ SessionId: '',
847
+ FileName: url
848
+ };
849
+ const json_prms = JSON.stringify(prms);
850
+ // Wrap callback-based functions in Promises
851
+ const commentResult = yield new Promise((resolve) => {
852
+ vgca_comment(json_prms, (result) => resolve(result));
853
+ });
854
+ const resultObj = JSON.parse(commentResult);
855
+ const downloadLink2 = yield this._fileExplorerService.generateLinkDownload({
856
+ fileId: resultObj.FileServer,
857
+ });
858
+ const url2 = this._downloadLinkService.getDownloadForSignUrl(downloadLink2.data);
859
+ const prms2 = {
860
+ FileUploadHandler: `${this._moduleConfig.environment.apiDomain.fileEndpoint}/${this._moduleConfig.environment.apiVersion}/KySoFile/SavePhysicalSignedFile`,
861
+ SessionId: '',
862
+ FileName: url2
863
+ };
864
+ const json_prms2 = JSON.stringify(prms2);
865
+ const signResult = yield new Promise((resolve) => {
866
+ vgca_sign_approved(json_prms2, (result) => resolve(result));
867
+ });
868
+ const signResultObj = JSON.parse(signResult);
869
+ if (signResultObj.FileServer != '') {
870
+ yield this._fileExplorerService.saveSignedFile({
871
+ sourceFile: sourceFile,
872
+ tempFileId: signResultObj.FileServer,
873
+ });
874
+ this.getServiceFile();
875
+ this._notifierService.showSuccess('Tạo bút phê và ký thành công');
876
+ }
877
+ }
878
+ });
879
+ }
880
+ signFileDonVi(file) {
881
+ this._notifierService
882
+ .showConfirm('Bạn có chắc chắn muốn ký số đơn vị văn bản này?')
883
+ .then((rs) => __awaiter(this, void 0, void 0, function* () {
884
+ if (rs) {
885
+ let sourceFileId = file.id;
886
+ let sourceFile = file;
887
+ if (this._fileExplorerService.needConvertBeforeSign(file.name)) {
888
+ // convert file before sign
889
+ try {
890
+ const rsConvert = yield this._fileExplorerService.convertDocumentToPdfAndSave({
891
+ instanceId: sourceFileId,
892
+ name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
893
+ folderInstanceId: file.parentFolderId,
894
+ ownerType: this._userService.getCurrentUser().userId.toString(),
895
+ });
896
+ if (!rsConvert || !rsConvert.success) {
897
+ 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`);
898
+ return;
899
+ }
900
+ else {
901
+ this._notifierService.showSuccess(`Chuyển đổi tài liệu ${file.name} thành pdf thành công`);
902
+ this.getServiceFile();
903
+ sourceFileId = rsConvert.data;
904
+ sourceFile = { id: sourceFileId };
905
+ }
906
+ }
907
+ catch (e) {
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
+ return;
910
+ }
911
+ }
912
+ this._fileExplorerService
913
+ .generateLinkDownload({
914
+ isFileVersion: false,
915
+ fileId: sourceFileId,
916
+ })
917
+ .then((rs) => {
918
+ const url = this._downloadLinkService.getDownloadForSignUrl(rs.data);
919
+ const prms = {};
920
+ prms['FileUploadHandler'] = `${this._moduleConfig.environment.apiDomain.fileEndpoint}/${this._moduleConfig.environment.apiVersion}/KySoFile/SavePhysicalSignedFile`;
921
+ prms['SessionId'] = '';
922
+ prms['FileName'] = url;
923
+ // Truyền số, ngày ký số phòng ban nếu cần
924
+ const that = this;
925
+ if (that.control && that.control.dataKySoDonVi) {
926
+ const dataKySoDonVi = that.control.dataKySoDonVi();
927
+ if (dataKySoDonVi) {
928
+ // lấy số DocNumber
929
+ if (dataKySoDonVi.docNumber) {
930
+ prms['DocNumber'] = dataKySoDonVi.docNumber;
931
+ }
932
+ // lấy ngày ban hành vb đi
933
+ if (dataKySoDonVi.issuedDate) {
934
+ prms['IssuedDate'] = dataKySoDonVi.issuedDate;
935
+ }
936
+ }
937
+ }
938
+ // tslint:disable-next-line: variable-name
939
+ const json_prms = JSON.stringify(prms);
940
+ vgca_sign_issued(json_prms, (result) => {
941
+ const resultObj = JSON.parse(result);
942
+ if (resultObj.FileServer != '') {
943
+ this._fileExplorerService
944
+ .saveSignedFile({
945
+ sourceFile: sourceFile,
946
+ tempFileId: resultObj.FileServer,
947
+ })
948
+ .then((rss) => {
949
+ this.getServiceFile();
950
+ this._notifierService.showSuccess('Ký số thành công');
951
+ });
952
+ }
953
+ });
954
+ });
955
+ }
956
+ }));
957
+ }
424
958
  }
425
959
  ServiceFileUploadComponent.decorators = [
426
960
  { type: Component, args: [{
427
961
  selector: 'service-file-upload',
428
- template: "<div class=\"file-upload\">\n <div class=\"fl-icon\">\n <i *ngIf=\"loading\" class=\"pi pi-spin pi-spinner\"></i>\n <i *ngIf=\"!loading\" class=\"pi pi-file-o\"></i>\n </div>\n\n <div class=\"fl-file-name\" (click)=\"openFileViewer()\">\n <div>\n <ng-container *ngIf=\"!showNoti\">\n <span pTooltip=\"{{selectedFileName}}\">{{selectedFileNameShort}}</span>\n <span class=\"suffix\" *ngIf=\"extension\">.{{extension}} </span>\n </ng-container>\n <span *ngIf=\"showNoti\"> {{notification}} </span>\n </div>\n </div>\n\n <!-- <div class=\"fl-file-name\">\n <div>\n <ng-container *ngIf=\"!showNoti\">\n <span pTooltip=\"{{selectedFileName}}\">{{selectedFileNameShort}}</span>\n <span *ngIf=\"extension\">.{{extension}} </span>\n </ng-container>\n <span *ngIf=\"showNoti\"> {{notification}} </span>\n </div>\n </div> -->\n\n <div class=\"fl-buttons\">\n <button *ngIf=\"!hasFile && !readonly\" pTooltip=\"Ch\u1ECDn file\" class=\"fl-choose\"\n class=\"link-or-action p-button-text p-button-rounded fl-choose\" tooltipPosition=\"top\" pButton type=\"button\"\n icon=\"pi pi-plus\" [disabled]=\"disabled\" (click)=\"onOpenSelect()\"></button>\n\n <button *ngIf=\"hasFile && !readonly && control.showDeleteFile\"\n class=\"link-or-action p-button-text p-button-rounded p-button-danger fl-remove\" pTooltip=\"X\u00F3a file\"\n tooltipPosition=\"top\" pButton type=\"button\" icon=\"pi pi-trash\" [disabled]=\"disabled\"\n (click)=\"onRemoveFile()\"></button>\n\n <button [disabled]=\"!menu || !menu.length\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\n (click)=\"showContextMenu($event)\"></button>\n </div>\n\n <div style=\"display: none;\">\n <p-fileUpload #file [accept]=\"accept\" class=\"file-upload\" mode=\"basic\" [chooseLabel]=\"chooseLabel\" name=\"file[]\"\n [maxFileSize]=\"control.maxFileSize\" pTooltip=\"Ch\u1ECDn t\u1EEB m\u00E1y t\u00EDnh\" toolStipPosition=\"top\" [multiple]=\"false\"\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" (onSelect)=\"onSelectFile($event)\">\n </p-fileUpload>\n </div>\n\n</div>\n\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"menu\" styleClass=\"fm-contextMenu-panel\">\n</p-contextMenu>\n\n<!-- Xem file tr\u1EF1c tuy\u1EBFn -->\n<file-viewer #fileViewerNew *ngIf=\"forms.fileViewer.show\" [parentModel]=\"model\" [parentContext]=\"context\"\n [readonly]=\"readonly || control.disabled\" [model]=\"forms.fileViewer.formData\"\n (onClose)=\"this.forms.fileViewer.show = false;\">\n</file-viewer>",
962
+ template: "<div class=\"file-upload\">\n <div class=\"fl-icon\">\n <i *ngIf=\"loading\" class=\"pi pi-spin pi-spinner\"></i>\n <i *ngIf=\"!loading\" class=\"pi pi-file-o\"></i>\n </div>\n\n <div class=\"fl-file-name\" (click)=\"openFileViewer()\">\n <div style=\"position: relative;\">\n <ng-container *ngIf=\"!showNoti\">\n <span pTooltip=\"{{selectedFileName}}\">{{selectedFileNameShort}}</span>\n <span class=\"suffix\" *ngIf=\"extension\">.{{extension}} </span>\n </ng-container>\n <span *ngIf=\"showNoti\"> {{notification}} </span>\n <span *ngIf=\"selectedFile?.signatures\" class=\"pull-right signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\n tooltipPosition=\"top\" (click)=\"viewListSign($event, selectedFile.signatures)\">\n <i class=\"fas fa-signature\"></i>\n </span>\n </div>\n </div>\n\n <!-- <div class=\"fl-file-name\">\n <div>\n <ng-container *ngIf=\"!showNoti\">\n <span pTooltip=\"{{selectedFileName}}\">{{selectedFileNameShort}}</span>\n <span *ngIf=\"extension\">.{{extension}} </span>\n </ng-container>\n <span *ngIf=\"showNoti\"> {{notification}} </span>\n </div>\n </div> -->\n <div class=\"fl-buttons\">\n <button *ngIf=\"!hasFile && !readonly\" pTooltip=\"Ch\u1ECDn file\" class=\"fl-choose\"\n class=\"link-or-action p-button-text p-button-rounded fl-choose\" tooltipPosition=\"top\" pButton type=\"button\"\n icon=\"pi pi-plus\" [disabled]=\"disabled\" (click)=\"onOpenSelect()\"></button>\n\n <button *ngIf=\"hasFile && !readonly && control.showDeleteFile\"\n class=\"link-or-action p-button-text p-button-rounded p-button-danger fl-remove\" pTooltip=\"X\u00F3a file\"\n tooltipPosition=\"top\" pButton type=\"button\" icon=\"pi pi-trash\" [disabled]=\"disabled\"\n (click)=\"onRemoveFile()\"></button>\n\n <button [disabled]=\"!menu || !menu.length\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\n (click)=\"showContextMenu($event)\"></button>\n </div>\n\n <div style=\"display: none;\">\n <p-fileUpload #file [accept]=\"accept\" class=\"file-upload\" mode=\"basic\" [chooseLabel]=\"chooseLabel\" name=\"file[]\"\n [maxFileSize]=\"control.maxFileSize\" pTooltip=\"Ch\u1ECDn t\u1EEB m\u00E1y t\u00EDnh\" toolStipPosition=\"top\" [multiple]=\"false\"\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" (onSelect)=\"onSelectFile($event)\">\n </p-fileUpload>\n </div>\n</div>\n\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"menu\" styleClass=\"fm-contextMenu-panel\">\n</p-contextMenu>\n\n<!-- Xem file tr\u1EF1c tuy\u1EBFn -->\n<file-viewer #fileViewerNew *ngIf=\"forms.fileViewer.show\" [parentModel]=\"model\" [parentContext]=\"context\"\n [readonly]=\"readonly || control.disabled\" [model]=\"forms.fileViewer.formData\"\n (onClose)=\"this.forms.fileViewer.show = false;\">\n</file-viewer>\n<tn-dialog *ngIf=\"forms.signatureDetail.show\" #dialog [styleClass]=\"'address-form'\"\n [header]=\"forms.signatureDetail.header | translate\" [popupSize]=\"forms[formIds.signatureDetail].popupSize\"\n (onHide)=\"forms.signatureDetail.show=false;\">\n <signature-detail [parentModel]=\"model\" [parentContext]=\"context\">\n </signature-detail>\n</tn-dialog>\n<tn-dialog *ngIf=\"signatureFormModel.show\" #dialog [styleClass]=\"'address-form'\" [header]=\"'Ch\u1ECDn ch\u1EEF k\u00FD s\u1ED1' | translate\"\n [popupSize]=\"signatureFormModel.popupSize\" (onHide)=\"signatureFormModel.show=false\">\n <signature-select #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"signatureFormModel.formData\"\n (onCancel)=\"signatureFormModel.show = false\" (onSaved)=\"signFileSmartCA($event)\">\n </signature-select>\n</tn-dialog>",
429
963
  providers: [
430
964
  {
431
965
  provide: NG_VALUE_ACCESSOR,
@@ -434,7 +968,7 @@ ServiceFileUploadComponent.decorators = [
434
968
  },
435
969
  ComponentContextService
436
970
  ],
437
- styles: ["::ng-deep .file-upload{display:flex;border:1px solid #ced4da;border-radius:4px}::ng-deep .file-upload .fl-icon{flex:0 0 30px;display:flex;font-size:20px;justify-content:center;align-items:center;border-right:1px solid #ced4da}::ng-deep .file-upload .fl-icon>i{font-size:16px!important}::ng-deep .file-upload .fl-file-name{display:flex;align-items:center;flex-grow:1;cursor:pointer;opacity:.8;padding:0 10px;color:#109bf8;overflow:hidden}::ng-deep .file-upload .fl-file-name>div{width:100%;display:flex}::ng-deep .file-upload .fl-file-name>div>span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .file-upload .fl-file-name:hover{opacity:1}::ng-deep .file-upload .fl-file-name .suffix{min-width:45px}::ng-deep .file-upload .fl-buttons{flex:0 0 80px;display:flex;border-right:1px solid #ced4da;align-items:center;justify-content:space-evenly;border-left:1px solid #ced4da}"]
971
+ styles: ["::ng-deep .file-upload{display:flex;border:1px solid #ced4da;border-radius:4px}::ng-deep .file-upload .fl-icon{flex:0 0 30px;display:flex;font-size:20px;justify-content:center;align-items:center;border-right:1px solid #ced4da}::ng-deep .file-upload .fl-icon>i{font-size:16px!important}::ng-deep .file-upload .fl-file-name{display:flex;align-items:center;flex-grow:1;cursor:pointer;opacity:.8;padding:0 10px;color:#109bf8;overflow:hidden}::ng-deep .file-upload .fl-file-name>div{width:100%;display:flex}::ng-deep .file-upload .fl-file-name>div>span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .file-upload .fl-file-name:hover{opacity:1}::ng-deep .file-upload .fl-file-name .suffix{min-width:45px}::ng-deep .file-upload .fl-buttons{flex:0 0 80px;display:flex;border-right:1px solid #ced4da;align-items:center;justify-content:space-evenly;border-left:1px solid #ced4da}::ng-deep .file-upload .nfl-signature{display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:.8;padding:0 10px;color:#109bf8;overflow:hidden}::ng-deep .file-upload .nfl-signature:hover{opacity:1}::ng-deep .file-upload .signature i{position:absolute;top:0;right:0}"]
438
972
  },] }
439
973
  ];
440
974
  ServiceFileUploadComponent.ctorParameters = () => [
@@ -447,6 +981,7 @@ ServiceFileUploadComponent.ctorParameters = () => [
447
981
  { type: NotifierService },
448
982
  { type: DownloadLinkService },
449
983
  { type: FileExplorerService },
984
+ { type: DeviceDetectorService },
450
985
  { type: Injector }
451
986
  ];
452
987
  ServiceFileUploadComponent.propDecorators = {
@@ -460,9 +995,10 @@ ServiceFileUploadComponent.propDecorators = {
460
995
  entity: [{ type: Input }],
461
996
  entityKey: [{ type: Input }],
462
997
  chooseLabel: [{ type: Input }],
998
+ parentSetting: [{ type: Input }],
463
999
  onInit: [{ type: Output }],
464
1000
  onSelect: [{ type: Output }],
465
1001
  onRemove: [{ type: Output }],
466
1002
  onChanged: [{ type: Output }]
467
1003
  };
468
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1maWxlLXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9zZXJ2aWNlLWZpbGUtdXBsb2FkL3NlcnZpY2UtZmlsZS11cGxvYWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU5RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUs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LDBCQUEwQixDQUFDO3dCQUN6RCxLQUFLLEVBQUUsSUFBSTtxQkFDZDtvQkFDRCx1QkFBdUI7aUJBQzFCOzthQUNKOzs7WUFmUSxpQkFBaUI7WUFWakIsY0FBYztZQUZkLG1CQUFtQjtZQUduQixlQUFlO1lBSmYsYUFBYTtZQUtiLFdBQVc7WUFIWCxlQUFlO1lBUWYsbUJBQW1CO1lBRW5CLG1CQUFtQjtZQS9CeEIsUUFBUTs7OzBCQWlEUCxTQUFTLFNBQUMsYUFBYTttQkFDdkIsU0FBUyxTQUFDLE1BQU07Z0NBQ2hCLFNBQVMsU0FBQyxtQkFBbUI7NEJBQzdCLFNBQVMsU0FBQyxlQUFlOzhCQUV6QixLQUFLO3NCQUNMLEtBQUs7MEJBQ0wsS0FBSztxQkFDTCxLQUFLO3dCQUVMLEtBQUs7MEJBSUwsS0FBSztxQkFFTCxNQUFNO3VCQUNOLE1BQU07dUJBQ04sTUFBTTt3QkFDTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL2NvbnRleHRtZW51JztcbmltcG9ydCB7IEZpbGVVcGxvYWQgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9maWxldXBsb2FkJztcbmltcG9ydCB7IE92ZXJsYXlQYW5lbCB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL292ZXJsYXlwYW5lbCc7XG5cbmltcG9ydCB7IENvbXBvbmVudENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwLWNvbnRleHQvY29tcG9uZW50LWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlJztcbmltcG9ydCB7IEZpbGVVcGxvYWRDb250cm9sU2NoZW1hIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcbmltcG9ydCB7IE1vZHVsZUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZ3MvbW9kdWxlLWNvbmZpZyc7XG5pbXBvcnQgeyBDb21tYW5kVHlwZSwgVG5DbGllbnRDb21tYW5kIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RuLWNsaWVudC1jb21tYW5kJztcbmltcG9ydCB7IEF1dGhlblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoZW4uc2VydmljZSc7XG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vdGlmaWVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2lnbmFsUlNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zaWduYWxyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG5DbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdG4tY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsZVZpZXdlckNvbXBvbmVudCB9IGZyb20gJy4uL2ZpbGUtZXhwbG9yZXIvZmlsZS12aWV3ZXIvZmlsZS12aWV3ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEZpbGVFeHBsb3Jlckl0ZW0gfSBmcm9tICcuLi9maWxlLWV4cGxvcmVyL21vZGVscy9maWxlLWV4cGxvcmVyLWl0ZW0nO1xuaW1wb3J0IHsgR2VuZXJhdGVMaW5rRG93bmxvYWREVE8gfSBmcm9tICcuLi9maWxlLWV4cGxvcmVyL21vZGVscy9nZW5lcmF0ZS1saW5rLWRvd25sb2FkLWR0byc7XG5pbXBvcnQgeyBJU2VydmljZUZpbGVVcGxvYWRDb21wb25lbnQgfSBmcm9tICcuLi9maWxlLWV4cGxvcmVyL21vZGVscy9pbnRlcmZhY2VzJztcbmltcG9ydCB7IERvd25sb2FkTGlua1NlcnZpY2UgfSBmcm9tICcuLi9maWxlLWV4cGxvcmVyL3NlcnZpY2VzL2Rvd25sb2FkLWxpbmsuc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlRGF0YVNlcnZpY2UgfSBmcm9tICcuLi9maWxlLWV4cGxvcmVyL3NlcnZpY2VzL2ZpbGUtZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbGVFeHBsb3JlclNlcnZpY2UgfSBmcm9tICcuLi9maWxlLWV4cGxvcmVyL3NlcnZpY2VzL2ZpbGUtZXhwbG9yZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlT2JqZWN0U2VydmljZSB9IGZyb20gJy4uL2ZpbGUtZXhwbG9yZXIvc2VydmljZXMvZmlsZS1vYmplY3Quc2VydmljZSc7XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzZXJ2aWNlLWZpbGUtdXBsb2FkJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VydmljZS1maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VydmljZS1maWxlLXVwbG9hZC5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlcnZpY2VGaWxlVXBsb2FkQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIENvbXBvbmVudENvbnRleHRTZXJ2aWNlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlRmlsZVVwbG9hZENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBJU2VydmljZUZpbGVVcGxvYWRDb21wb25lbnQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQFZpZXdDaGlsZCgnY29udGV4dE1lbnUnKSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XG4gICAgQFZpZXdDaGlsZCgnZmlsZScpIGZpbGU6IEZpbGVVcGxvYWQ7XG4gICAgQFZpZXdDaGlsZCgnZmlsZURldGFpbENvbW1hbmQnKSBmaWxlRGV0YWlsQ29tbWFuZDogT3ZlcmxheVBhbmVsO1xuICAgIEBWaWV3Q2hpbGQoJ2ZpbGVWaWV3ZXJOZXcnKSBmaWxlVmlld2VyTmV3OiBGaWxlVmlld2VyQ29tcG9uZW50O1xuXG4gICAgQElucHV0KCkgZmlsZURhdGFTZXJ2aWNlOiBGaWxlRGF0YVNlcnZpY2U7XG4gICAgQElucHV0KCkgY29udHJvbDogRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEgPSBuZXcgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEoKTtcbiAgICBASW5wdXQoKSBzZXJ2aWNlQ29kZSA9ICcnO1xuICAgIEBJbnB1dCgpIGVudGl0eSA9ICcnO1xuICAgIF9lbnRpdHlLZXk6IHN0cmluZztcbiAgICBASW5wdXQoKSBzZXQgZW50aXR5S2V5KHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VudGl0eUtleSA9IHZhbDtcbiAgICB9O1xuXG4gICAgQElucHV0KCkgY2hvb3NlTGFiZWwgPSAnQ2jhu41uJztcblxuICAgIEBPdXRwdXQoKSBvbkluaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uU2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvblJlbW92ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgZ2V0IGVudGl0eUtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VudGl0eUtleTtcbiAgICB9XG5cbiAgICBmaWxlSWQ6IHN0cmluZyA9IG51bGw7XG4gICAgc2VsZWN0ZWRGaWxlID0gbnVsbDtcbiAgICBzZWxlY3RlZEZpbGVOYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIGV4dGVuc2lvbjogc3RyaW5nID0gbnVsbDtcbiAgICBzZWxlY3RlZEZpbGVOYW1lU2hvcnQ6IHN0cmluZyA9IG51bGw7XG4gICAgaGFzRmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBzaG93Tm90aTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGZpbGVPYmo6IEZpbGVFeHBsb3Jlckl0ZW0gPSBuZXcgRmlsZUV4cGxvcmVySXRlbSgpO1xuICAgIHVzZXJJZDogc3RyaW5nID0gbnVsbDtcbiAgICBub3RpZmljYXRpb246IHN0cmluZyA9IG51bGw7XG4gICAgX21vZHVsZUNvbmZpZzogTW9kdWxlQ29uZmlnO1xuICAgIGFjY2VwdDogc3RyaW5nID0gJyc7XG4gICAgLy8gPSAnaW1hZ2UvKiwueGxzeCwueGxzLC5wZGYsLmRvYywuZG9jeCwuemlwLC5yYXIsJztcbiAgICByZWFkb25seSA9IG51bGw7XG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBkZWZhdWx0U2NhbkZpbGVOYW1lID0gbnVsbDtcbiAgICBtZW51OiBBcnJheTxhbnk+ID0gW107XG5cbiAgICBvbkNoYW5nZUJhc2U6ICh2YWwpID0+IHZvaWQ7XG4gICAgb25Ub3VjaGVkOiAodmFsKSA9PiB2b2lkO1xuICAgIGlzRGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgX3N1YnNjcmliZTogU3Vic2NyaXB0aW9uID0gbnVsbDtcblxuICAgIGRhdGFNb2RlbDogYW55ID0ge307XG4gICAgZm9ybXM6IGFueSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2ZpbGVPYmplY3RTZXJ2aWNlOiBGaWxlT2JqZWN0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfc2lnbmFsUlNlcnZpY2U6IFNpZ25hbFJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9tb2R1bGVDb25maWdTZXJ2aWNlOiBNb2R1bGVDb25maWdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF90bkNsaWVudFNlcnZpY2U6IFRuQ2xpZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfYXV0aGVuU2VydmljZTogQXV0aGVuU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF91c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfbm90aWZpZXJTZXJ2aWNlOiBOb3RpZmllclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfZG93bmxvYWRMaW5rU2VydmljZTogRG93bmxvYWRMaW5rU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9maWxlRXhwbG9yZXJTZXJ2aWNlOiBGaWxlRXhwbG9yZXJTZXJ2aWNlLFxuICAgICAgICBfaW5qZWN0b3I6IEluamVjdG9yXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKF9pbmplY3Rvcik7XG5cbiAgICAgICAgaWYgKHRoaXMuX3VzZXJTZXJ2aWNlLmlzVmFsaWRBY2Nlc3NUb2tlbigpKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXJJZCA9IHRoaXMuX3VzZXJTZXJ2aWNlLmdldFVzZXJJZENvbWJpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFNb2RlbC5maWxlVmlld2VyID0ge307XG4gICAgICAgIHRoaXMuZGF0YU1vZGVsLmRyaXZlRmlsZURpYWxvZyA9IHsgcG9wdXBTaXplOiA8YW55Pnt9IH07XG5cbiAgICAgICAgdGhpcy5fbW9kdWxlQ29uZmlnID0gX21vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0VXAoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5vbkluaXQuZW1pdCh0aGlzKTtcbiAgICB9XG5cbiAgICBzZXRVcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5hY2NlcHQpIHtcbiAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gdGhpcy5jb250cm9sLmFjY2VwdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbnRyb2wuYWNjZXB0RmlsZVR5cGVzKSB7XG4gICAgICAgICAgICB0aGlzLmFjY2VwdCA9IHRoaXMuX2ZpbGVPYmplY3RTZXJ2aWNlLmdldEFjY2VwdGVkRXh0ZW5zaW9ucyh0aGlzLmNvbnRyb2wuYWNjZXB0RmlsZVR5cGVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRvbmx5ID0gdGhpcy5jb250cm9sLnJlYWRvbmx5O1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gdGhpcy5jb250cm9sLmRpc2FibGVkO1xuICAgICAgICB0aGlzLmZvcm1zWydmaWxlVmlld2VyJ10gPSB7XG4gICAgICAgICAgICBzaG93OiBmYWxzZSxcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuZmlsZURhdGFTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVEYXRhU2VydmljZS5yZWdpc3Rlcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbnRpdHlLZXkgJiYgIXRoaXMuZmlsZURhdGFTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmdldFNlcnZpY2VGaWxlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRTZXJ2aWNlRmlsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzS2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlUmVxdWVzdE1vZGVsID0ge1xuICAgICAgICAgICAgICAgIHNlcnZpY2VDb2RlOiB0aGlzLnNlcnZpY2VDb2RlLFxuICAgICAgICAgICAgICAgIGVudGl0eTogdGhpcy5lbnRpdHksXG4gICAgICAgICAgICAgICAgZW50aXR5S2V5OiB0aGlzLmVudGl0eUtleSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldE5vdGkoJ8SQYW5nIGzhuqV5IMSRw61uaCBrw6htLi4uJyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlT2JqZWN0ID0gKGF3YWl0IHRoaXMuX2ZpbGVPYmplY3RTZXJ2aWNlLmdldFNpbmdsZVNlcnZpY2VGaWxlKHNlcnZpY2VSZXF1ZXN0TW9kZWwpKS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldE5vdGkobnVsbCk7XG4gICAgICAgICAgICBpZiAoZmlsZU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RmlsZU9iamVjdChmaWxlT2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsZU9iamVjdChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2wuaGFzRmlsZSA9IHRoaXMuaGFzRmlsZTtcbiAgICAgICAgdGhpcy5zZXRNZW51KCk7XG4gICAgfVxuXG4gICAgc2V0RmlsZU9iamVjdChmaWxlT2JqZWN0OiBhbnkpIHtcbiAgICAgICAgaWYgKGZpbGVPYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5maWxlT2JqID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZmlsZUlkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuaGFzRmlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVOYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUJhc2UobnVsbCk7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlZC5lbWl0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWxlT2JqID0gZmlsZU9iamVjdDtcbiAgICAgICAgdGhpcy5maWxlSWQgPSBmaWxlT2JqZWN0LmlkO1xuICAgICAgICB0aGlzLnNldEZpbGVOYW1lKGZpbGVPYmplY3QubmFtZSk7XG4gICAgICAgIHRoaXMuaGFzRmlsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbC5oYXNGaWxlID0gdGhpcy5oYXNGaWxlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlQmFzZSgnaGFzLXZhbHVlJyk7XG4gICAgICAgIHRoaXMub25Jbml0LmVtaXQoeyBmaWxlSWQ6IHRoaXMuZmlsZUlkIH0pO1xuICAgIH1cblxuICAgIGhhc0tleXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VDb2RlXG4gICAgICAgICAgICAmJiB0aGlzLmVudGl0eVxuICAgICAgICAgICAgJiYgdGhpcy5lbnRpdHlLZXlcbiAgICAgICAgICAgICYmIHRoaXMuZW50aXR5S2V5ICE9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZEVtcHR5KCk7XG4gICAgfVxuXG4gICAgc2V0TWVudSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc0ZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMubWVudSA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZW51ID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnVOG6o2kgduG7gScsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2ZhcyBmYS1kb3dubG9hZCcsXG4gICAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHN1YnNjcmliZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdENvbnRleHQgJiYgIXRoaXMuY29udHJvbC5hdXRvU2F2ZWQpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGAtLS0tLS0tLS0tLS0tLS0tLT5zdWJzY3JpYmUgZXZlbnQgJHt0aGlzLmNvbnRyb2wuZmllbGR9XyR7dGhpcy5yb290Q29udGV4dC5rZXl9YCk7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmUgPSB0aGlzLnJvb3RDb250ZXh0LnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuQ09NTU9OLlNBVkVfRklMRV9JTl9GT1JNLCBycyA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tPnNhdmUgZXZlbnQgJyArIHRoaXMuY29udHJvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTYXZlRmlsZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N1YnNjcmliZSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3Vuc3Vic2NyaWJlICcgKyB0aGlzLmNvbnRyb2wuZmllbGQpO1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsZURhdGFTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVEYXRhU2VydmljZS51bnJlZ2lzdGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgb25PcGVuU2VsZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5maWxlLmJhc2ljRmlsZUlucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmZpbGUuYmFzaWNGaWxlSW5wdXQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TZWxlY3RGaWxlKGV2dCkge1xuICAgICAgICB0aGlzLmhhc0ZpbGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maWxlSWQgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbGUuY2xlYXIoKTtcbiAgICAgICAgaWYgKGV2dC5lcnJvckZpbGVzICYmIGV2dC5lcnJvckZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd05vdGkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBgJHtldnQuZXJyb3JNZXNzYWdlc1swXS5zdW1tYXJ5fSR7ZXZ0LmVycm9yTWVzc2FnZXNbMF0uZGV0YWlsfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGV2dC5zdWNjZXNzRmlsZXNbMF07XG4gICAgICAgICAgICB0aGlzLnNldEZpbGVOYW1lKHRoaXMuc2VsZWN0ZWRGaWxlID8gdGhpcy5zZWxlY3RlZEZpbGUubmFtZSA6IG51bGwpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sLmF1dG9TYXZlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2F2ZUZpbGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzRmlsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUJhc2UoJ2hhcy12YWx1ZScpO1xuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkRmlsZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZWQuZW1pdCh0aGlzLnNlbGVjdGVkRmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sLmhhc0ZpbGUgPSB0aGlzLmhhc0ZpbGU7XG4gICAgfVxuXG4gICAgaGFuZGxlU2F2ZUZpbGUoKSB7XG4gICAgICAgIC8vIMSQw6MgbMawdSBmaWxlLlxuICAgICAgICBpZiAodGhpcy5maWxlSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyxrDhu51uZyBo4bujcCBraMO0bmcgY8OzIMSR4bunIGtleXMuXG4gICAgICAgIGlmICghdGhpcy5oYXNLZXlzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnQ2jGsGEgY+G6pXUgaMOsbmgga2V5cycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2jGsGEgY2jhu41uIGZpbGUuXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnc2VydmljZUNvZGUnLCB0aGlzLnNlcnZpY2VDb2RlKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdlbnRpdHknLCB0aGlzLmVudGl0eSk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZW50aXR5S2V5JywgdGhpcy5lbnRpdHlLZXkpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2lzTXVsdGlwbGUnLCAnZmFsc2UnKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdpc1B1YmxpYycsIGAke3RoaXMuY29udHJvbC5pc1B1YmxpY31gKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgdGhpcy5zZWxlY3RlZEZpbGUpO1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0Tm90aSgnxJBhbmcgdOG6o2kgZmlsZSBsw6puLi4uJyk7XG4gICAgICAgIHRoaXMuX2ZpbGVPYmplY3RTZXJ2aWNlLmNyZWF0ZVNlcnZpY2VGaWxlKGZvcm1EYXRhKVxuICAgICAgICAgICAgLnRoZW4ocnMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Tm90aShudWxsKTtcblxuICAgICAgICAgICAgICAgIGlmIChycy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gdGhpcy5zZWxlY3RlZEZpbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlTmFtZSA9IHRoaXMuc2VsZWN0ZWRGaWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZUlkID0gcnMuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNGaWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLmhhc0ZpbGUgPSB0aGlzLmhhc0ZpbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2VkLmVtaXQoeyBmaWxlSWQ6IHRoaXMuZmlsZUlkLCBzZWxlY3RlZEZpbGU6IHRoaXMuc2VsZWN0ZWRGaWxlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3J1ZFNlcnZpY2UucHJvY2Vzc0Vycm9yUmVzcG9uc2UocnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXROb3RpKG51bGwpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdVcGxvYWQgZmlsZSBjaMawYSB0aMOgbmggY8O0bmcnKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldE5vdGkobXNnKSB7XG4gICAgICAgIGlmIChtc2cpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd05vdGkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBtc2c7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dOb3RpID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGaWxlTmFtZShmaWxlTmFtZSkge1xuICAgICAgICBpZiAoZmlsZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgICAgICAgdGhpcy5leHRlbnNpb24gPSB0aGlzLl9maWxlT2JqZWN0U2VydmljZS5nZXRGaWxlRXh0ZW5zaW9uKGZpbGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlTmFtZVNob3J0ID0gZmlsZU5hbWUuc3Vic3RyKDAsIGZpbGVOYW1lLmxlbmd0aCAtIHRoaXMuZXh0ZW5zaW9uLmxlbmd0aCAtIDEpO1xuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZU5hbWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5leHRlbnNpb24gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVOYW1lU2hvcnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd0NvbnRleHRNZW51KGV2dCkge1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnRvZ2dsZShldnQpO1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgb25SZW1vdmVGaWxlKCkge1xuICAgICAgICB0aGlzLl9maWxlT2JqZWN0U2VydmljZS5kZWxldGVCeUlkKHRoaXMuZmlsZUlkKTtcbiAgICAgICAgY29uc3QgZmlsZURhdGEgPSB7IC4uLnRoaXMuZmlsZU9iaiB9O1xuICAgICAgICB0aGlzLmZpbGVPYmogPSBudWxsO1xuICAgICAgICB0aGlzLmZpbGVJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZXRGaWxlTmFtZShudWxsKTtcbiAgICAgICAgdGhpcy5oYXNGaWxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udHJvbC5oYXNGaWxlID0gdGhpcy5oYXNGaWxlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlQmFzZShudWxsKTtcbiAgICAgICAgdGhpcy5vblJlbW92ZS5lbWl0KGZpbGVEYXRhKTtcbiAgICB9XG5cbiAgICBvbkRvd25sb2FkRmlsZSgpIHtcbiAgICAgICAgdGhpcy5kb3dubG9hZCgpO1xuICAgIH1cblxuICAgIHNjYW5GaWxlKGV2dCkge1xuICAgICAgICAvLyBzZW5kIHRuIGNvbW1hbmRcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UucmFuZG9tU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgVG5DbGllbnRDb21tYW5kKCk7XG4gICAgICAgIGNvbW1hbmQuY29tbWFuZFR5cGUgPSBDb21tYW5kVHlwZS5TY2FuO1xuICAgICAgICAvLyBjb21tYW5kLmtleSA9IHRoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5zaWduYWxyLmNsaWVudEtleTtcbiAgICAgICAgY29tbWFuZC5rZXkgPSB0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuc2lnbmFsci5jbGllbnRLZXk7XG5cbiAgICAgICAgY29uc3Qgc2NhbkZpbGVDb21tYW5kID0ge1xuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHVwbG9hZEZpbGVBcGk6IHRoaXMuX2ZpbGVPYmplY3RTZXJ2aWNlLmdldFNjYW5GaWxlVXBsb2FkRW5kcG9pbnQoY29ycmVsYXRpb25JZCksXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogdGhpcy5fYXV0aGVuU2VydmljZS5nZXRBY2Nlc3NUb2tlbigpLFxuICAgICAgICAgICAgZGVmYXVsdEZpbGVOYW1lOiB0aGlzLmRlZmF1bHRTY2FuRmlsZU5hbWVcbiAgICAgICAgfTtcbiAgICAgICAgY29tbWFuZC5kYXRhID0gc2NhbkZpbGVDb21tYW5kO1xuXG4gICAgICAgIHRoaXMuX3RuQ2xpZW50U2VydmljZS5zZW5kQ29tbWFuZChjb21tYW5kKTtcblxuICAgICAgICB0aGlzLl9zaWduYWxSU2VydmljZS51blN1YnNjcmliZVZpZXdDb2RlKG51bGwsIGBGSUxFLlNDQU5ORUQuJHtjb3JyZWxhdGlvbklkfWApO1xuICAgICAgICB0aGlzLl9zaWduYWxSU2VydmljZS5zdGFydChudWxsLCBgRklMRS5TQ0FOTkVELiR7Y29ycmVsYXRpb25JZH1gLCBkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9iajogYW55O1xuICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZUlkID0gb2JqLm1lc3NhZ2UuY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlT2JqLm5hbWUgPSBvYmoubWVzc2FnZS50aXRsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZUlkID0gb2JqLm1lc3NhZ2UuY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlT2JqLm5hbWUgPSBvYmoubWVzc2FnZS50aXRsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZpZXdPbmxpbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9maWxlT2JqZWN0U2VydmljZS5pc1N1cHBvcnRlZFZpZXdPbmxpbmUodGhpcy5maWxlT2JqLm5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbC5maWxlVmlld2VyLmRhdGEgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsLmZpbGVWaWV3ZXIuZGF0YS5maWxlSWQgPSB0aGlzLmZpbGVJZDtcbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsLmZpbGVWaWV3ZXIuZGF0YS5maWxlTmFtZSA9IHRoaXMuZmlsZU9iai5uYW1lO1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWwuZmlsZVZpZXdlci5kYXRhLnNlcnZpY2UgPSB0aGlzLnNlcnZpY2VDb2RlO1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWwuZmlsZVZpZXdlci5kYXRhLmVudGl0eSA9IHRoaXMuZW50aXR5O1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWwuZmlsZVZpZXdlci5kYXRhLmVudGl0eUtleSA9IHRoaXMuZW50aXR5S2V5O1xuXG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbC5maWxlVmlld2VyLmRhdGEuaXNGaWxlVmVyc2lvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWwuZmlsZVZpZXdlci5zaG93ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRvd25sb2FkKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsZUlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbCA9IG5ldyBHZW5lcmF0ZUxpbmtEb3dubG9hZERUTyh7XG4gICAgICAgICAgICBmaWxlSWQ6IHRoaXMuZmlsZUlkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2Rvd25sb2FkTGlua1NlcnZpY2UuZG93bmxvYWRMaW5rKG1vZGVsKTtcbiAgICB9XG5cbiAgICB1cGxvYWRGaWxlRnJvbURyaXZlKCkge1xuICAgICAgICAvLyB0aGlzLmRhdGFNb2RlbC5kcml2ZUZpbGVEaWFsb2cgPSB7XG4gICAgICAgIC8vICAgICBzaG93OiB0cnVlXG4gICAgICAgIC8vIH07XG4gICAgfVxuXG4gICAgY29weUZpbGVUb0RyaXZlKCkge1xuICAgICAgICAvLyB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmdldEZvbGRlcklkKHRoaXMudXNlcklkKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgLy8gICAgIHZhciBjb3B5RmlsZUR0byA9IG5ldyBDb3B5RmlsZUR0bygpO1xuICAgICAgICAvLyAgICAgY29weUZpbGVEdG8uaWQgPSB0aGlzLmZpbGVJZDtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmZpbGVOYW1lID09IFwiXCIpIHtcbiAgICAgICAgLy8gICAgICAgICBpZiAodGhpcy5maWxlT2JqICE9IG51bGwpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29weUZpbGVEdG8ubmFtZSA9IHRoaXMuZmlsZU9iai5uYW1lO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgY29weUZpbGVEdG8ubmFtZSA9IHRoaXMuZmlsZU5hbWU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICBjb3B5RmlsZUR0by5vd25lclR5cGUgPSB0aGlzLnVzZXJJZDtcbiAgICAgICAgLy8gICAgIGNvcHlGaWxlRHRvLmZvbGRlcklkID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgICAvLyAgICAgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jb3B5RmlsZShjb3B5RmlsZUR0bykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdTYW8gY2jDqXAgdMOgaSBsaeG7h3UgduG7gSB0aMawIG3hu6VjIGPDoSBuaMOibiB0aMOgbmggY8O0bmcnKTtcbiAgICAgICAgLy8gICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0J1c2luZXNzRXJyb3IoZXJyb3IuZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlQmFzZSA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlbkZpbGVWaWV3ZXIoKSB7XG4gICAgICAgIC8vIGNvbnN0IGZpbGVFeHBsb3JlclJlcyA9IGF3YWl0IHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuZ2V0U2VydmljZUZpbGVFeHBsb3Jlcih0aGlzLnNlcnZpY2VDb2RlLCB0aGlzLmVudGl0eSwgdGhpcy5lbnRpdHlLZXkpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmNvbnRyb2wpO1xuICAgICAgICAvLyBpZiAoIWZpbGVFeHBsb3JlclJlcy5zdWNjZXNzIHx8IGZpbGVFeHBsb3JlclJlcy5kYXRhKSB7XG4gICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc3QgZXhwbG9yZXJJdGVtID0gZmlsZUV4cGxvcmVyUmVzLmRhdGE7XG4gICAgICAgIC8vIGNvbnN0IGNhblZpZXdPbmxpbmUgPSB0aGlzLl9maWxlT2JqZWN0U2VydmljZS5pc1N1cHBvcnRlZFZpZXdPbmxpbmUoZXhwbG9yZXJJdGVtLm5hbWUpO1xuICAgICAgICBjb25zdCBmaWxlQmluYXJ5ID0gYXdhaXQgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jaGVja1BoeXNpY2FsRmlsZSh0aGlzLmZpbGVJZCk7XG4gICAgICAgIGlmICghZmlsZUJpbmFyeS5zdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0ZpbGUga2jDtG5nIHThu5NuIHThuqFpLCB2dWkgbMOybmcgbGnDqm4gaOG7hyBxdeG6o24gdHLhu4sgdmnDqm4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWxlT2JqZWN0ID0gYXdhaXQgdGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuZ2V0RGV0YWlsKHRoaXMuZmlsZUlkKTtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gJyc7XG4gICAgICAgIGlmICghZmlsZU9iamVjdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0PDsyBs4buXaSB0cm9uZyBsw7pjIGzhuqV5IGThu68gbGnhu4d1IGZpbGUsIHZ1aSBsw7JuZyBsacOqbiBo4buHIHF14bqjbiB0cuG7iyB2acOqbicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZpbGVOYW1lID0gZmlsZU9iamVjdD8ubmFtZTtcbiAgICAgICAgdGhpcy5mb3Jtcy5maWxlVmlld2VyLmZvcm1EYXRhLmRhdGEgPSB7XG4gICAgICAgICAgICBmaWxlSWQ6IHRoaXMuZmlsZUlkLFxuICAgICAgICAgICAgaXNGaWxlVmVyc2lvbjogZmFsc2UsXG4gICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgIHNlcnZpY2U6IHRoaXMuc2VydmljZUNvZGUsXG4gICAgICAgICAgICBlbnRpdHk6IHRoaXMuZW50aXR5LFxuICAgICAgICAgICAgZW50aXR5S2V5OiB0aGlzLmVudGl0eUtleSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb3Jtcy5maWxlVmlld2VyLnNob3cgPSB0cnVlO1xuICAgIH1cbn1cbiJdfQ==
1004
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1maWxlLXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9zZXJ2aWNlLWZpbGUtdXBsb2FkL3NlcnZpY2UtZmlsZS11cGxvYWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU5RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FB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ZUFBZTtZQUpmLGFBQWE7WUFLYixXQUFXO1lBSFgsZUFBZTtZQVFmLG1CQUFtQjtZQUVuQixtQkFBbUI7WUFFbkIscUJBQXFCO1lBakMxQixRQUFROzs7MEJBc0RQLFNBQVMsU0FBQyxhQUFhO21CQUN2QixTQUFTLFNBQUMsTUFBTTtnQ0FDaEIsU0FBUyxTQUFDLG1CQUFtQjs0QkFDN0IsU0FBUyxTQUFDLGVBQWU7OEJBRXpCLEtBQUs7c0JBQ0wsS0FBSzswQkFDTCxLQUFLO3FCQUNMLEtBQUs7d0JBRUwsS0FBSzswQkFJTCxLQUFLOzRCQUNMLEtBQUs7cUJBRUwsTUFBTTt1QkFDTixNQUFNO3VCQUNOLE1BQU07d0JBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9jb250ZXh0bWVudSc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvZmlsZXVwbG9hZCc7XG5pbXBvcnQgeyBPdmVybGF5UGFuZWwgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9vdmVybGF5cGFuZWwnO1xuXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XG5pbXBvcnQgeyBDcnVkRm9ybURhdGEsIENydWRGb3JtU2V0dGluZywgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEsIFBvcHVwU2l6ZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xuaW1wb3J0IHsgQ29tQ3R4Q29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XG5pbXBvcnQgeyBNb2R1bGVDb25maWcgfSBmcm9tICcuLi8uLi9jb25maWdzL21vZHVsZS1jb25maWcnO1xuaW1wb3J0IHsgQ29tbWFuZFR5cGUsIFRuQ2xpZW50Q29tbWFuZCB9IGZyb20gJy4uLy4uL21vZGVscy90bi1jbGllbnQtY29tbWFuZCc7XG5pbXBvcnQgeyBBdXRoZW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aGVuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTW9kdWxlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZHVsZS1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcbmltcG9ydCB7IFNpZ25hbFJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2lnbmFsci5zZXJ2aWNlJztcbmltcG9ydCB7IFRuQ2xpZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RuLWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbGVWaWV3ZXJDb21wb25lbnQgfSBmcm9tICcuLi9maWxlLWV4cGxvcmVyL2ZpbGUtdmlld2VyL2ZpbGUtdmlld2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWxlRXhwbG9yZXJJdGVtIH0gZnJvbSAnLi4vZmlsZS1leHBsb3Jlci9tb2RlbHMvZmlsZS1leHBsb3Jlci1pdGVtJztcbmltcG9ydCB7IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPIH0gZnJvbSAnLi4vZmlsZS1leHBsb3Jlci9tb2RlbHMvZ2VuZXJhdGUtbGluay1kb3dubG9hZC1kdG8nO1xuaW1wb3J0IHsgSVNlcnZpY2VGaWxlVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsZS1leHBsb3Jlci9tb2RlbHMvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEb3dubG9hZExpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vZmlsZS1leHBsb3Jlci9zZXJ2aWNlcy9kb3dubG9hZC1saW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsZURhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vZmlsZS1leHBsb3Jlci9zZXJ2aWNlcy9maWxlLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlRXhwbG9yZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZmlsZS1leHBsb3Jlci9zZXJ2aWNlcy9maWxlLWV4cGxvcmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsZU9iamVjdFNlcnZpY2UgfSBmcm9tICcuLi9maWxlLWV4cGxvcmVyL3NlcnZpY2VzL2ZpbGUtb2JqZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlIH0gZnJvbSAnbmd4LWRldmljZS1kZXRlY3Rvcic7XG5cbmRlY2xhcmUgbGV0IHZnY2Ffc2lnbl9hcHByb3ZlZDogYW55O1xuZGVjbGFyZSBsZXQgdmdjYV9zaWduX2lzc3VlZDogYW55O1xuZGVjbGFyZSBsZXQgdmdjYV9jb21tZW50OiBhbnk7XG5kZWNsYXJlIGxldCB2bnB0X3BsdWdpbjogYW55O1xuZGVjbGFyZSBsZXQgUGRmU2lnbmVyOiBhbnk7XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NlcnZpY2UtZmlsZS11cGxvYWQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZXJ2aWNlLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zZXJ2aWNlLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VydmljZUZpbGVVcGxvYWRDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgQ29tcG9uZW50Q29udGV4dFNlcnZpY2VcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFNlcnZpY2VGaWxlVXBsb2FkQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIElTZXJ2aWNlRmlsZVVwbG9hZENvbXBvbmVudCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBAVmlld0NoaWxkKCdjb250ZXh0TWVudScpIGNvbnRleHRNZW51OiBDb250ZXh0TWVudTtcbiAgICBAVmlld0NoaWxkKCdmaWxlJykgZmlsZTogRmlsZVVwbG9hZDtcbiAgICBAVmlld0NoaWxkKCdmaWxlRGV0YWlsQ29tbWFuZCcpIGZpbGVEZXRhaWxDb21tYW5kOiBPdmVybGF5UGFuZWw7XG4gICAgQFZpZXdDaGlsZCgnZmlsZVZpZXdlck5ldycpIGZpbGVWaWV3ZXJOZXc6IEZpbGVWaWV3ZXJDb21wb25lbnQ7XG5cbiAgICBASW5wdXQoKSBmaWxlRGF0YVNlcnZpY2U6IEZpbGVEYXRhU2VydmljZTtcbiAgICBASW5wdXQoKSBjb250cm9sOiBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSA9IG5ldyBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSgpO1xuICAgIEBJbnB1dCgpIHNlcnZpY2VDb2RlID0gJyc7XG4gICAgQElucHV0KCkgZW50aXR5ID0gJyc7XG4gICAgX2VudGl0eUtleTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHNldCBlbnRpdHlLZXkodmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZW50aXR5S2V5ID0gdmFsO1xuICAgIH07XG5cbiAgICBASW5wdXQoKSBjaG9vc2VMYWJlbCA9ICdDaOG7jW4nO1xuICAgIEBJbnB1dCgpIHBhcmVudFNldHRpbmc6IENydWRGb3JtU2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcblxuICAgIEBPdXRwdXQoKSBvbkluaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uU2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvblJlbW92ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgZ2V0IGVudGl0eUtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VudGl0eUtleTtcbiAgICB9XG5cbiAgICBmaWxlSWQ6IHN0cmluZyA9IG51bGw7XG4gICAgc2VsZWN0ZWRGaWxlID0gbnVsbDtcbiAgICBzZWxlY3RlZEZpbGVOYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIGV4dGVuc2lvbjogc3RyaW5nID0gbnVsbDtcbiAgICBzZWxlY3RlZEZpbGVOYW1lU2hvcnQ6IHN0cmluZyA9IG51bGw7XG4gICAgaGFzRmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBzaG93Tm90aTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGZpbGVPYmo6IEZpbGVFeHBsb3Jlckl0ZW0gPSBuZXcgRmlsZUV4cGxvcmVySXRlbSgpO1xuICAgIHVzZXJJZDogc3RyaW5nID0gbnVsbDtcbiAgICBub3RpZmljYXRpb246IHN0cmluZyA9IG51bGw7XG4gICAgX21vZHVsZUNvbmZpZzogTW9kdWxlQ29uZmlnO1xuICAgIGFjY2VwdDogc3RyaW5nID0gJyc7XG4gICAgLy8gPSAnaW1hZ2UvKiwueGxzeCwueGxzLC5wZGYsLmRvYywuZG9jeCwuemlwLC5yYXIsJztcbiAgICByZWFkb25seSA9IG51bGw7XG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBkZWZhdWx0U2NhbkZpbGVOYW1lID0gbnVsbDtcbiAgICBtZW51OiBBcnJheTxhbnk+ID0gW107XG5cbiAgICBvbkNoYW5nZUJhc2U6ICh2YWwpID0+IHZvaWQ7XG4gICAgb25Ub3VjaGVkOiAodmFsKSA9PiB2b2lkO1xuICAgIGlzRGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgX3N1YnNjcmliZTogU3Vic2NyaXB0aW9uID0gbnVsbDtcblxuICAgIGRhdGFNb2RlbDogYW55ID0ge307XG4gICAgZm9ybXM6IGFueSA9IHt9O1xuICAgIGZvcm1JZHMgPSB7XG4gICAgICAgIGNyZWF0ZUZvbGRlcjogJ2NyZWF0ZUZvbGRlcicsXG4gICAgICAgIHJlbmFtZUZpbGU6ICdyZW5hbWVGaWxlJyxcbiAgICAgICAgc2hhcmVGaWxlOiAnc2hhcmVGaWxlJyxcbiAgICAgICAgc2hhcmVGb2xkZXI6ICdzaGFyZUZvbGRlcicsXG4gICAgICAgIGZpbGVWaWV3ZXI6ICdmaWxlVmlld2VyJyxcbiAgICAgICAgZmlsZVZlcnNpb25MaXN0OiAnZmlsZVZlcnNpb25MaXN0JyxcbiAgICAgICAgc2lnbmF0dXJlRGV0YWlsOiAnc2lnbmF0dXJlRGV0YWlsJyxcbiAgICAgICAga3lTb1NpbTogJ2t5U29TaW0nLFxuICAgICAgICB2aWV3RGV0YWlsOiAndmlld0RldGFpbCdcbiAgICB9O1xuICAgIHNpZ25hdHVyZUZvcm1Nb2RlbDogYW55ID0ge1xuICAgICAgICBmb3JtRGF0YTogbmV3IENydWRGb3JtRGF0YSgpLFxuICAgICAgICBzaG93OiBmYWxzZSxcbiAgICAgICAgcG9wdXBTaXplOiBuZXcgUG9wdXBTaXplKHtcbiAgICAgICAgICAgIHdpZHRoOiA2MDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDQwMFxuICAgICAgICB9KVxuICAgIH07XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2ZpbGVPYmplY3RTZXJ2aWNlOiBGaWxlT2JqZWN0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfc2lnbmFsUlNlcnZpY2U6IFNpZ25hbFJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9tb2R1bGVDb25maWdTZXJ2aWNlOiBNb2R1bGVDb25maWdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF90bkNsaWVudFNlcnZpY2U6IFRuQ2xpZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfYXV0aGVuU2VydmljZTogQXV0aGVuU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF91c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfbm90aWZpZXJTZXJ2aWNlOiBOb3RpZmllclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfZG93bmxvYWRMaW5rU2VydmljZTogRG93bmxvYWRMaW5rU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9maWxlRXhwbG9yZXJTZXJ2aWNlOiBGaWxlRXhwbG9yZXJTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgX2RldmljZURldGVjdG9yU2VydmljZTogRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLFxuXG4gICAgICAgIF9pbmplY3RvcjogSW5qZWN0b3JcbiAgICApIHtcbiAgICAgICAgc3VwZXIoX2luamVjdG9yKTtcblxuICAgICAgICBpZiAodGhpcy5fdXNlclNlcnZpY2UuaXNWYWxpZEFjY2Vzc1Rva2VuKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5fdXNlclNlcnZpY2UuZ2V0VXNlcklkQ29tYmluZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YU1vZGVsLmZpbGVWaWV3ZXIgPSB7fTtcbiAgICAgICAgdGhpcy5kYXRhTW9kZWwuZHJpdmVGaWxlRGlhbG9nID0geyBwb3B1cFNpemU6IDxhbnk+e30gfTtcblxuICAgICAgICB0aGlzLl9tb2R1bGVDb25maWcgPSBfbW9kdWxlQ29uZmlnU2VydmljZS5nZXRDb25maWcoKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zZXRVcCgpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLm9uSW5pdC5lbWl0KHRoaXMpO1xuICAgIH1cblxuICAgIHNldFVwKCkge1xuICAgICAgICBpZiAodGhpcy5jb250cm9sLmFjY2VwdCkge1xuICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSB0aGlzLmNvbnRyb2wuYWNjZXB0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29udHJvbC5hY2NlcHRGaWxlVHlwZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gdGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuZ2V0QWNjZXB0ZWRFeHRlbnNpb25zKHRoaXMuY29udHJvbC5hY2NlcHRGaWxlVHlwZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVhZG9ubHkgPSB0aGlzLmNvbnRyb2wucmVhZG9ubHk7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0aGlzLmNvbnRyb2wuZGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuZm9ybXNbJ2ZpbGVWaWV3ZXInXSA9IHtcbiAgICAgICAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmZvcm1zW3RoaXMuZm9ybUlkcy5zaWduYXR1cmVEZXRhaWxdID0ge1xuICAgICAgICAgICAgaGVhZGVyOiAnVGjDtG5nIHRpbiBjaOG7ryBrw70gc+G7kScsXG4gICAgICAgICAgICBzaG93OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuZmlsZURhdGFTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVEYXRhU2VydmljZS5yZWdpc3Rlcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbnRpdHlLZXkgJiYgIXRoaXMuZmlsZURhdGFTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmdldFNlcnZpY2VGaWxlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRTZXJ2aWNlRmlsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzS2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlUmVxdWVzdE1vZGVsID0ge1xuICAgICAgICAgICAgICAgIHNlcnZpY2VDb2RlOiB0aGlzLnNlcnZpY2VDb2RlLFxuICAgICAgICAgICAgICAgIGVudGl0eTogdGhpcy5lbnRpdHksXG4gICAgICAgICAgICAgICAgZW50aXR5S2V5OiB0aGlzLmVudGl0eUtleSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldE5vdGkoJ8SQYW5nIGzhuqV5IMSRw61uaCBrw6htLi4uJyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlT2JqZWN0ID0gKGF3YWl0IHRoaXMuX2ZpbGVPYmplY3RTZXJ2aWNlLmdldFNpbmdsZVNlcnZpY2VGaWxlKHNlcnZpY2VSZXF1ZXN0TW9kZWwpKS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldE5vdGkobnVsbCk7XG4gICAgICAgICAgICBpZiAoZmlsZU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RmlsZU9iamVjdChmaWxlT2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsZU9iamVjdChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmdldFNpZ25hdHVyZUluZm9CeUZpbGVJZCh0aGlzLmZpbGVJZCkudGhlbihycyA9PiB7XG4gICAgICAgICAgICBpZiAocnMuc3VjY2VzcyAmJiBycy5kYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZS5zaWduYXR1cmVzID0gcnMuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udHJvbC5oYXNGaWxlID0gdGhpcy5oYXNGaWxlO1xuICAgICAgICB0aGlzLnNldE1lbnUoKTtcbiAgICB9XG5cbiAgICBzZXRGaWxlT2JqZWN0KGZpbGVPYmplY3Q6IGFueSkge1xuICAgICAgICBpZiAoZmlsZU9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVPYmogPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5maWxlSWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5oYXNGaWxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZU5hbWUgPSBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlQmFzZShudWxsKTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VkLmVtaXQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGZpbGVPYmplY3Q7XG4gICAgICAgIHRoaXMuZmlsZU9iaiA9IGZpbGVPYmplY3Q7XG4gICAgICAgIHRoaXMuZmlsZUlkID0gZmlsZU9iamVjdC5pZDtcbiAgICAgICAgdGhpcy5zZXRGaWxlTmFtZShmaWxlT2JqZWN0Lm5hbWUpO1xuICAgICAgICB0aGlzLmhhc0ZpbGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2wuaGFzRmlsZSA9IHRoaXMuaGFzRmlsZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUJhc2UoJ2hhcy12YWx1ZScpO1xuICAgICAgICB0aGlzLm9uSW5pdC5lbWl0KHsgZmlsZUlkOiB0aGlzLmZpbGVJZCB9KTtcbiAgICB9XG5cbiAgICBoYXNLZXlzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlQ29kZVxuICAgICAgICAgICAgJiYgdGhpcy5lbnRpdHlcbiAgICAgICAgICAgICYmIHRoaXMuZW50aXR5S2V5XG4gICAgICAgICAgICAmJiB0aGlzLmVudGl0eUtleSAhPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWRFbXB0eSgpO1xuICAgIH1cblxuICAgIHNldE1lbnUoKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNGaWxlKSB7XG4gICAgICAgICAgICB0aGlzLm1lbnUgPSBbXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVudSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1ThuqNpIHbhu4EnLFxuICAgICAgICAgICAgICAgIGljb246ICdmYXMgZmEtZG93bmxvYWQnLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdLw70gc+G7kSBjw6EgbmjDom4gKFNJTSknLFxuICAgICAgICAgICAgICAgIGljb246ICdmYXMgZmEtc2ltLWNhcmQnLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaWduS3lTaW1GaWxlKHRoaXMuc2VsZWN0ZWRGaWxlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZpc2libGU6ICh0aGlzLl9maWxlT2JqZWN0U2VydmljZS5pc1R5cGVGaWxlS3lTbyh0aGlzLnNlbGVjdGVkRmlsZS5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAmJiAhdGhpcy5wYXJlbnRTZXR0aW5nLmhpZGRlbkt5U29TaW1DYU5oYW4pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0vDvSBz4buRIFNtYXJ0Q0EnLFxuICAgICAgICAgICAgICAgIGljb246ICdmYXMgZmEtc2lnbmF0dXJlJyxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2lnbmF0dXJlRm9ybU1vZGVsLnNob3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKHRoaXMuX2ZpbGVPYmplY3RTZXJ2aWNlLmlzVHlwZUZpbGVLeVNvKHRoaXMuc2VsZWN0ZWRGaWxlLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICYmICF0aGlzLnBhcmVudFNldHRpbmcuaGlkZGVuS3lTb1NtYXJ0Q0EpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0vDvSBz4buRIGPDoSBuaMOibiAoVVNCKScsIGljb246ICdmYXMgZmEtc2lnbmF0dXJlJyxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2lnbkZpbGUodGhpcy5zZWxlY3RlZEZpbGUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKHRoaXMuX2ZpbGVPYmplY3RTZXJ2aWNlLmlzVHlwZUZpbGVLeVNvKHRoaXMuc2VsZWN0ZWRGaWxlLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc0Rlc2t0b3AoKVxuICAgICAgICAgICAgICAgICAgICAmJiAhdGhpcy5wYXJlbnRTZXR0aW5nLmhpZGRlbkt5U29Vc2JDYU5oYW4pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0vDvSBz4buRIFZOUFRDQScsIGljb246ICdmYXMgZmEtc2lnbmF0dXJlJyxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2lnblZOUFRDQSh0aGlzLnNlbGVjdGVkRmlsZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAodGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuaXNUeXBlRmlsZUt5U28odGhpcy5zZWxlY3RlZEZpbGUubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzRGVza3RvcCgpXG4gICAgICAgICAgICAgICAgICAgICYmICF0aGlzLnBhcmVudFNldHRpbmcuaGlkZGVuS3lTb1ZOUFRDQSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQsO6dCBwaMOqJywgaWNvbjogJ2ZhcyBmYS1jb21tZW50LWRvdHMnLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDb21tZW50KHRoaXMuc2VsZWN0ZWRGaWxlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZpc2libGU6ICh0aGlzLl9maWxlT2JqZWN0U2VydmljZS5pc1R5cGVGaWxlS3lTbyh0aGlzLnNlbGVjdGVkRmlsZS5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKClcbiAgICAgICAgICAgICAgICAgICAgJiYgIXRoaXMucGFyZW50U2V0dGluZy5oaWRkZW5CdXRQaGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0LDunQgcGjDqiB2w6Aga8O9JywgaWNvbjogJ2ZhcyBmYS1jb21tZW50LW1lZGljYWwnLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDb21tZW50QW5kU2lnbih0aGlzLnNlbGVjdGVkRmlsZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAodGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuaXNUeXBlRmlsZUt5U28odGhpcy5zZWxlY3RlZEZpbGUubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzRGVza3RvcCgpXG4gICAgICAgICAgICAgICAgICAgICYmICF0aGlzLnBhcmVudFNldHRpbmcuaGlkZGVuQnV0UGhlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdLw70gc+G7kSDEkcahbiB24buLIChVU0IpJywgaWNvbjogJ2ZhcyBmYS1zaWduYXR1cmUnLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaWduRmlsZURvblZpKHRoaXMuc2VsZWN0ZWRGaWxlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZpc2libGU6ICh0aGlzLl9maWxlT2JqZWN0U2VydmljZS5pc1R5cGVGaWxlS3lTbyh0aGlzLnNlbGVjdGVkRmlsZS5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKClcbiAgICAgICAgICAgICAgICAgICAgJiYgIXRoaXMucGFyZW50U2V0dGluZy5oaWRkZW5LeVNvRG9uVmkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3RDb250ZXh0ICYmICF0aGlzLmNvbnRyb2wuYXV0b1NhdmVkKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgLS0tLS0tLS0tLS0tLS0tLS0+c3Vic2NyaWJlIGV2ZW50ICR7dGhpcy5jb250cm9sLmZpZWxkfV8ke3RoaXMucm9vdENvbnRleHQua2V5fWApO1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlID0gdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5TQVZFX0ZJTEVfSU5fRk9STSwgcnMgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLT5zYXZlIGV2ZW50ICcgKyB0aGlzLmNvbnRyb2wuZmllbGQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2F2ZUZpbGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd1bnN1YnNjcmliZSAnICsgdGhpcy5jb250cm9sLmZpZWxkKTtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZS51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbGVEYXRhU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5maWxlRGF0YVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cblxuICAgIG9uT3BlblNlbGVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsZS5iYXNpY0ZpbGVJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5maWxlLmJhc2ljRmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIG9uU2VsZWN0RmlsZShldnQpIHtcbiAgICAgICAgdGhpcy5oYXNGaWxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsZUlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWxlLmNsZWFyKCk7XG4gICAgICAgIGlmIChldnQuZXJyb3JGaWxlcyAmJiBldnQuZXJyb3JGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dOb3RpID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uID0gYCR7ZXZ0LmVycm9yTWVzc2FnZXNbMF0uc3VtbWFyeX0ke2V2dC5lcnJvck1lc3NhZ2VzWzBdLmRldGFpbH1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBldnQuc3VjY2Vzc0ZpbGVzWzBdO1xuICAgICAgICAgICAgdGhpcy5zZXRGaWxlTmFtZSh0aGlzLnNlbGVjdGVkRmlsZSA/IHRoaXMuc2VsZWN0ZWRGaWxlLm5hbWUgOiBudWxsKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wuYXV0b1NhdmVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTYXZlRmlsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNGaWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlQmFzZSgnaGFzLXZhbHVlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRGaWxlKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlZC5lbWl0KHRoaXMuc2VsZWN0ZWRGaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2wuaGFzRmlsZSA9IHRoaXMuaGFzRmlsZTtcbiAgICAgICAgdGhpcy5zZXRNZW51KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgaGFuZGxlU2F2ZUZpbGUoKSB7XG4gICAgICAgIC8vIMSQw6MgbMawdSBmaWxlLlxuICAgICAgICBpZiAodGhpcy5maWxlSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyxrDhu51uZyBo4bujcCBraMO0bmcgY8OzIMSR4bunIGtleXMuXG4gICAgICAgIGlmICghdGhpcy5oYXNLZXlzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnQ2jGsGEgY+G6pXUgaMOsbmgga2V5cycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2jGsGEgY2jhu41uIGZpbGUuXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnc2VydmljZUNvZGUnLCB0aGlzLnNlcnZpY2VDb2RlKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdlbnRpdHknLCB0aGlzLmVudGl0eSk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZW50aXR5S2V5JywgdGhpcy5lbnRpdHlLZXkpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2lzTXVsdGlwbGUnLCAnZmFsc2UnKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdpc1B1YmxpYycsIGAke3RoaXMuY29udHJvbC5pc1B1YmxpY31gKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgdGhpcy5zZWxlY3RlZEZpbGUpO1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0Tm90aSgnxJBhbmcgdOG6o2kgZmlsZSBsw6puLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2ZpbGVPYmplY3RTZXJ2aWNlLmNyZWF0ZVNlcnZpY2VGaWxlKGZvcm1EYXRhKVxuICAgICAgICAgICAgLnRoZW4ocnMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Tm90aShudWxsKTtcblxuICAgICAgICAgICAgICAgIGlmIChycy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gdGhpcy5zZWxlY3RlZEZpbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlTmFtZSA9IHRoaXMuc2VsZWN0ZWRGaWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZUlkID0gcnMuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUuaWQgPSBycy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc0ZpbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuaGFzRmlsZSA9IHRoaXMuaGFzRmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZWQuZW1pdCh7IGZpbGVJZDogdGhpcy5maWxlSWQsIHNlbGVjdGVkRmlsZTogdGhpcy5zZWxlY3RlZEZpbGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuZ2V0U2lnbmF0dXJlSW5mb0J5RmlsZUlkKHRoaXMuZmlsZUlkKS50aGVuKHJzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChycy5zdWNjZXNzICYmIHJzLmRhdGE/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlLnNpZ25hdHVyZXMgPSBycy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlLnByb2Nlc3NFcnJvclJlc3BvbnNlKHJzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Tm90aShudWxsKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnVXBsb2FkIGZpbGUgY2jGsGEgdGjDoG5oIGPDtG5nJyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXROb3RpKG1zZykge1xuICAgICAgICBpZiAobXNnKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dOb3RpID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uID0gbXNnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93Tm90aSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RmlsZU5hbWUoZmlsZU5hbWUpIHtcbiAgICAgICAgaWYgKGZpbGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gdGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuZ2V0RmlsZUV4dGVuc2lvbihmaWxlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZU5hbWVTaG9ydCA9IGZpbGVOYW1lLnN1YnN0cigwLCBmaWxlTmFtZS5sZW5ndGggLSB0aGlzLmV4dGVuc2lvbi5sZW5ndGggLSAxKTtcblxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlTmFtZVNob3J0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3TGlzdFNpZ24oZTogRXZlbnQsIHNpZ25hdHVyZXM6IGFueSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmZvcm1zW3RoaXMuZm9ybUlkcy5zaWduYXR1cmVEZXRhaWxdLnNob3cgPSB0cnVlO1xuICAgICAgICB0aGlzLm1vZGVsLmFkdmFuY2VEYXRhID0gc2lnbmF0dXJlcztcbiAgICB9XG4gICAgc2hvd0NvbnRleHRNZW51KGV2dCkge1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnRvZ2dsZShldnQpO1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgb25SZW1vdmVGaWxlKCkge1xuICAgICAgICB0aGlzLl9maWxlT2JqZWN0U2VydmljZS5kZWxldGVCeUlkKHRoaXMuZmlsZUlkKTtcbiAgICAgICAgY29uc3QgZmlsZURhdGEgPSB7IC4uLnRoaXMuZmlsZU9iaiB9O1xuICAgICAgICB0aGlzLmZpbGVPYmogPSBudWxsO1xuICAgICAgICB0aGlzLmZpbGVJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZXRGaWxlTmFtZShudWxsKTtcbiAgICAgICAgdGhpcy5oYXNGaWxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udHJvbC5oYXNGaWxlID0gdGhpcy5oYXNGaWxlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlQmFzZShudWxsKTtcbiAgICAgICAgdGhpcy5vblJlbW92ZS5lbWl0KGZpbGVEYXRhKTtcbiAgICB9XG5cbiAgICBvbkRvd25sb2FkRmlsZSgpIHtcbiAgICAgICAgdGhpcy5kb3dubG9hZCgpO1xuICAgIH1cblxuICAgIHNjYW5GaWxlKGV2dCkge1xuICAgICAgICAvLyBzZW5kIHRuIGNvbW1hbmRcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UucmFuZG9tU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgVG5DbGllbnRDb21tYW5kKCk7XG4gICAgICAgIGNvbW1hbmQuY29tbWFuZFR5cGUgPSBDb21tYW5kVHlwZS5TY2FuO1xuICAgICAgICAvLyBjb21tYW5kLmtleSA9IHRoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5zaWduYWxyLmNsaWVudEtleTtcbiAgICAgICAgY29tbWFuZC5rZXkgPSB0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuc2lnbmFsci5jbGllbnRLZXk7XG5cbiAgICAgICAgY29uc3Qgc2NhbkZpbGVDb21tYW5kID0ge1xuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHVwbG9hZEZpbGVBcGk6IHRoaXMuX2ZpbGVPYmplY3RTZXJ2aWNlLmdldFNjYW5GaWxlVXBsb2FkRW5kcG9pbnQoY29ycmVsYXRpb25JZCksXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogdGhpcy5fYXV0aGVuU2VydmljZS5nZXRBY2Nlc3NUb2tlbigpLFxuICAgICAgICAgICAgZGVmYXVsdEZpbGVOYW1lOiB0aGlzLmRlZmF1bHRTY2FuRmlsZU5hbWVcbiAgICAgICAgfTtcbiAgICAgICAgY29tbWFuZC5kYXRhID0gc2NhbkZpbGVDb21tYW5kO1xuXG4gICAgICAgIHRoaXMuX3RuQ2xpZW50U2VydmljZS5zZW5kQ29tbWFuZChjb21tYW5kKTtcblxuICAgICAgICB0aGlzLl9zaWduYWxSU2VydmljZS51blN1YnNjcmliZVZpZXdDb2RlKG51bGwsIGBGSUxFLlNDQU5ORUQuJHtjb3JyZWxhdGlvbklkfWApO1xuICAgICAgICB0aGlzLl9zaWduYWxSU2VydmljZS5zdGFydChudWxsLCBgRklMRS5TQ0FOTkVELiR7Y29ycmVsYXRpb25JZH1gLCBkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9iajogYW55O1xuICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZUlkID0gb2JqLm1lc3NhZ2UuY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlT2JqLm5hbWUgPSBvYmoubWVzc2FnZS50aXRsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZUlkID0gb2JqLm1lc3NhZ2UuY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlT2JqLm5hbWUgPSBvYmoubWVzc2FnZS50aXRsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZpZXdPbmxpbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9maWxlT2JqZWN0U2VydmljZS5pc1N1cHBvcnRlZFZpZXdPbmxpbmUodGhpcy5maWxlT2JqLm5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbC5maWxlVmlld2VyLmRhdGEgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsLmZpbGVWaWV3ZXIuZGF0YS5maWxlSWQgPSB0aGlzLmZpbGVJZDtcbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGVsLmZpbGVWaWV3ZXIuZGF0YS5maWxlTmFtZSA9IHRoaXMuZmlsZU9iai5uYW1lO1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWwuZmlsZVZpZXdlci5kYXRhLnNlcnZpY2UgPSB0aGlzLnNlcnZpY2VDb2RlO1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWwuZmlsZVZpZXdlci5kYXRhLmVudGl0eSA9IHRoaXMuZW50aXR5O1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWwuZmlsZVZpZXdlci5kYXRhLmVudGl0eUtleSA9IHRoaXMuZW50aXR5S2V5O1xuXG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RlbC5maWxlVmlld2VyLmRhdGEuaXNGaWxlVmVyc2lvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5kYXRhTW9kZWwuZmlsZVZpZXdlci5zaG93ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRvd25sb2FkKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsZUlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbCA9IG5ldyBHZW5lcmF0ZUxpbmtEb3dubG9hZERUTyh7XG4gICAgICAgICAgICBmaWxlSWQ6IHRoaXMuZmlsZUlkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2Rvd25sb2FkTGlua1NlcnZpY2UuZG93bmxvYWRMaW5rKG1vZGVsKTtcbiAgICB9XG5cbiAgICB1cGxvYWRGaWxlRnJvbURyaXZlKCkge1xuICAgICAgICAvLyB0aGlzLmRhdGFNb2RlbC5kcml2ZUZpbGVEaWFsb2cgPSB7XG4gICAgICAgIC8vICAgICBzaG93OiB0cnVlXG4gICAgICAgIC8vIH07XG4gICAgfVxuXG4gICAgY29weUZpbGVUb0RyaXZlKCkge1xuICAgICAgICAvLyB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmdldEZvbGRlcklkKHRoaXMudXNlcklkKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgLy8gICAgIHZhciBjb3B5RmlsZUR0byA9IG5ldyBDb3B5RmlsZUR0bygpO1xuICAgICAgICAvLyAgICAgY29weUZpbGVEdG8uaWQgPSB0aGlzLmZpbGVJZDtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmZpbGVOYW1lID09IFwiXCIpIHtcbiAgICAgICAgLy8gICAgICAgICBpZiAodGhpcy5maWxlT2JqICE9IG51bGwpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29weUZpbGVEdG8ubmFtZSA9IHRoaXMuZmlsZU9iai5uYW1lO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgY29weUZpbGVEdG8ubmFtZSA9IHRoaXMuZmlsZU5hbWU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICBjb3B5RmlsZUR0by5vd25lclR5cGUgPSB0aGlzLnVzZXJJZDtcbiAgICAgICAgLy8gICAgIGNvcHlGaWxlRHRvLmZvbGRlcklkID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgICAvLyAgICAgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jb3B5RmlsZShjb3B5RmlsZUR0bykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdTYW8gY2jDqXAgdMOgaSBsaeG7h3UgduG7gSB0aMawIG3hu6VjIGPDoSBuaMOibiB0aMOgbmggY8O0bmcnKTtcbiAgICAgICAgLy8gICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0J1c2luZXNzRXJyb3IoZXJyb3IuZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlQmFzZSA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlbkZpbGVWaWV3ZXIoKSB7XG4gICAgICAgIC8vIGNvbnN0IGZpbGVFeHBsb3JlclJlcyA9IGF3YWl0IHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuZ2V0U2VydmljZUZpbGVFeHBsb3Jlcih0aGlzLnNlcnZpY2VDb2RlLCB0aGlzLmVudGl0eSwgdGhpcy5lbnRpdHlLZXkpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmNvbnRyb2wpO1xuICAgICAgICAvLyBpZiAoIWZpbGVFeHBsb3JlclJlcy5zdWNjZXNzIHx8IGZpbGVFeHBsb3JlclJlcy5kYXRhKSB7XG4gICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc3QgZXhwbG9yZXJJdGVtID0gZmlsZUV4cGxvcmVyUmVzLmRhdGE7XG4gICAgICAgIC8vIGNvbnN0IGNhblZpZXdPbmxpbmUgPSB0aGlzLl9maWxlT2JqZWN0U2VydmljZS5pc1N1cHBvcnRlZFZpZXdPbmxpbmUoZXhwbG9yZXJJdGVtLm5hbWUpO1xuICAgICAgICBjb25zdCBmaWxlQmluYXJ5ID0gYXdhaXQgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jaGVja1BoeXNpY2FsRmlsZSh0aGlzLmZpbGVJZCk7XG4gICAgICAgIGlmICghZmlsZUJpbmFyeS5zdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0ZpbGUga2jDtG5nIHThu5NuIHThuqFpLCB2dWkgbMOybmcgbGnDqm4gaOG7hyBxdeG6o24gdHLhu4sgdmnDqm4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWxlT2JqZWN0ID0gYXdhaXQgdGhpcy5fZmlsZU9iamVjdFNlcnZpY2UuZ2V0RGV0YWlsKHRoaXMuZmlsZUlkKTtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gJyc7XG4gICAgICAgIGlmICghZmlsZU9iamVjdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0PDsyBs4buXaSB0cm9uZyBsw7pjIGzhuqV5IGThu68gbGnhu4d1IGZpbGUsIHZ1aSBsw7JuZyBsacOqbiBo4buHIHF14bqjbiB0cuG7iyB2acOqbicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZpbGVOYW1lID0gZmlsZU9iamVjdD8ubmFtZTtcbiAgICAgICAgdGhpcy5mb3Jtcy5maWxlVmlld2VyLmZvcm1EYXRhLmRhdGEgPSB7XG4gICAgICAgICAgICBmaWxlSWQ6IHRoaXMuZmlsZUlkLFxuICAgICAgICAgICAgaXNGaWxlVmVyc2lvbjogZmFsc2UsXG4gICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgIHNlcnZpY2U6IHRoaXMuc2VydmljZUNvZGUsXG4gICAgICAgICAgICBlbnRpdHk6IHRoaXMuZW50aXR5LFxuICAgICAgICAgICAgZW50aXR5S2V5OiB0aGlzLmVudGl0eUtleSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb3Jtcy5maWxlVmlld2VyLnNob3cgPSB0cnVlO1xuICAgIH1cbiAgICBhc3luYyBzaWduRmlsZVNtYXJ0Q0EoZGF0YUt5U28pIHtcbiAgICAgICAgdGhpcy5zaWduYXR1cmVGb3JtTW9kZWwuc2hvdyA9IGZhbHNlO1xuICAgICAgICBsZXQgc291cmNlRmlsZUlkID0gdGhpcy5zZWxlY3RlZEZpbGUuaWQ7XG4gICAgICAgIGlmICh0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLm5lZWRDb252ZXJ0QmVmb3JlU2lnbih0aGlzLnNlbGVjdGVkRmlsZS5uYW1lKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByc0NvbnZlcnQgPSBhd2FpdCB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmNvbnZlcnREb2N1bWVudFRvUGRmQW5kU2F2ZSh7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IHNvdXJjZUZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jaGFuZ2VGaWxlRXh0ZW5zaW9uKHRoaXMuc2VsZWN0ZWRGaWxlLm5hbWUsICdwZGYnKSxcbiAgICAgICAgICAgICAgICAgICAgZm9sZGVySW5zdGFuY2VJZDogdGhpcy5zZWxlY3RlZEZpbGUucGFyZW50Rm9sZGVySWQgPz8gdGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCksXG4gICAgICAgICAgICAgICAgICAgIG93bmVyVHlwZTogdGhpcy5fdXNlclNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKS51c2VySWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJzQ29udmVydCB8fCAhcnNDb252ZXJ0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKGBDw7MgbOG7l2kgeOG6o3kgcmEga2hpIGNodXnhu4NuIMSR4buVaSB0w6BpIGxp4buHdSAke3RoaXMuc2VsZWN0ZWRGaWxlLm5hbWV9IHRow6BuaCBwZGYgxJHhu4Mga8O9LiBWdWkgbMOybmcgdGjhu60gbOG6oWkgc2F1YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcyhgQ2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7dGhpcy5zZWxlY3RlZEZpbGUubmFtZX0gdGjDoG5oIHBkZiB0aMOgbmggY8O0bmdgKTtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZUlkID0gcnNDb252ZXJ0LmRhdGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYEPDsyBs4buXaSB44bqjeSByYSBraGkgY2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7dGhpcy5zZWxlY3RlZEZpbGUubmFtZX0gdGjDoG5oIHBkZiDEkeG7gyBrw70uIFZ1aSBsw7JuZyB0aOG7rSBs4bqhaSBzYXVgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYXRhS3lTbykge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdOZ8aw4budaSBkw7luZyBjaMawYSBj4bqldSBow6xuaCB0aMO0bmcgdGluIGvDvSBz4buRJyk7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdnZXI7XG4gICAgICAgIHRoaXMuZm9ybXMuZmlsZVZpZXdlci5mb3JtRGF0YS5kYXRhID0ge1xuICAgICAgICAgICAgZmlsZUlkOiBzb3VyY2VGaWxlSWQsXG4gICAgICAgICAgICBpc0ZpbGVWZXJzaW9uOiBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVOYW1lOiB0aGlzLnNlbGVjdGVkRmlsZS5uYW1lLFxuICAgICAgICAgICAgc2VydmljZTogdGhpcy5zZXJ2aWNlQ29kZSxcbiAgICAgICAgICAgIGVudGl0eTogdGhpcy5lbnRpdHksXG4gICAgICAgICAgICBlbnRpdHlLZXk6IHRoaXMuZW50aXR5S2V5LFxuICAgICAgICAgICAgZmlsZUJhc2U2NENvbnRlbnQ6IGRhdGFLeVNvLmZpbGVCYXNlNjRDb250ZW50LFxuICAgICAgICAgICAgdXNlckNodUt5U29JZDogZGF0YUt5U28uaWQsXG4gICAgICAgICAgICBzaG93S3lTb0J1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgIHdpZHRoOiBkYXRhS3lTby53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogZGF0YUt5U28uaGVpZ2h0LFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmZvcm1zLmZpbGVWaWV3ZXIuc2hvdyA9IHRydWU7XG4gICAgfVxuXG4gICAgc2lnbkt5U2ltRmlsZShmaWxlOiBGaWxlRXhwbG9yZXJJdGVtKSB7XG4gICAgICAgIHRoaXMuZm9ybXMua3lTb1NpbS5zaG93ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5tb2RlbC5hZHZhbmNlRGF0YSA9IGZpbGU7XG4gICAgfVxuICAgIHNpZ25GaWxlKGZpbGU6IEZpbGVFeHBsb3Jlckl0ZW0pIHtcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dDb25maXJtKCdC4bqhbiBjw7MgY2jhuq9jIGNo4bqvbiBtdeG7kW4ga8O9IHPhu5EgdsSDbiBi4bqjbiBuw6B5PycpLnRoZW4oYXN5bmMgcnMgPT4ge1xuICAgICAgICAgICAgaWYgKHJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGVJZCA9IGZpbGUuaWQ7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGUgPSBmaWxlO1xuICAgICAgICAgICAgICAgIC8vIEvDvSBz4buRIGZpbGUgd29yZCAtIGPhuqduIGNvbnZlcnQgc2FuZyBwZGYgdHLGsOG7m2NcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5uZWVkQ29udmVydEJlZm9yZVNpZ24oZmlsZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IGZpbGUgYmVmb3JlIHNpZ25cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJzQ29udmVydCA9IGF3YWl0IHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuY29udmVydERvY3VtZW50VG9QZGZBbmRTYXZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBzb3VyY2VGaWxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jaGFuZ2VGaWxlRXh0ZW5zaW9uKGZpbGUubmFtZSwgJ3BkZicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlckluc3RhbmNlSWQ6IGZpbGUucGFyZW50Rm9sZGVySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJUeXBlOiB0aGlzLl91c2VyU2VydmljZS5nZXRDdXJyZW50VXNlcigpLnVzZXJJZC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJzQ29udmVydCB8fCAhcnNDb252ZXJ0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYEPDsyBs4buXaSB44bqjeSByYSBraGkgY2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7ZmlsZS5uYW1lfSB0aMOgbmggcGRmIMSR4buDIGvDvS4gVnVpIGzDsm5nIHRo4butIGzhuqFpIHNhdWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcyhgQ2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7ZmlsZS5uYW1lfSB0aMOgbmggcGRmIHRow6BuaCBjw7RuZ2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVJZCA9IHJzQ29udmVydC5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGUgPSB7IGlkOiBzb3VyY2VGaWxlSWQgfSBhcyBGaWxlRXhwbG9yZXJJdGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZUZpbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKGBDw7MgbOG7l2kgeOG6o3kgcmEga2hpIGNodXnhu4NuIMSR4buVaSB0w6BpIGxp4buHdSAke2ZpbGUubmFtZX0gdGjDoG5oIHBkZiDEkeG7gyBrw70uIFZ1aSBsw7JuZyB0aOG7rSBs4bqhaSBzYXVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuZ2VuZXJhdGVMaW5rRG93bmxvYWQoe1xuICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHNvdXJjZUZpbGVJZCxcbiAgICAgICAgICAgICAgICB9IGFzIEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPKS50aGVuKHJzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fZG93bmxvYWRMaW5rU2VydmljZS5nZXREb3dubG9hZEZvclNpZ25VcmwocnMuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcHJtc1snRmlsZVVwbG9hZEhhbmRsZXInXSA9IGAke3RoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5hcGlEb21haW4uZmlsZUVuZHBvaW50fS8ke3RoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5hcGlWZXJzaW9ufS9LeVNvRmlsZS9TYXZlUGh5c2ljYWxTaWduZWRGaWxlYDtcbiAgICAgICAgICAgICAgICAgICAgcHJtc1snU2Vzc2lvbklkJ10gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcHJtc1snRmlsZU5hbWUnXSA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb25fcHJtcyA9IEpTT04uc3RyaW5naWZ5KHBybXMpO1xuICAgICAgICAgICAgICAgICAgICB2Z2NhX3NpZ25fYXBwcm92ZWQoanNvbl9wcm1zLCAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdE9iaiA9IEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRPYmouRmlsZVNlcnZlciAhPSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2Uuc2F2ZVNpZ25lZEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlOiBzb3VyY2VGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZUlkOiByZXN1bHRPYmouRmlsZVNlcnZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKHJzcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZUZpbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdLw70gc+G7kSB0aMOgbmggY8O0bmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIHNpZ25WTlBUQ0EoaXRlbSkge1xuICAgICAgICBsZXQgc291cmNlRmlsZUlkID0gaXRlbS5pZDtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UubmVlZENvbnZlcnRCZWZvcmVTaWduKGl0ZW0ubmFtZSkpIHtcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgZmlsZSBiZWZvcmUgc2lnblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByc0NvbnZlcnQgPSBhd2FpdCB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmNvbnZlcnREb2N1bWVudFRvUGRmQW5kU2F2ZSh7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuY2hhbmdlRmlsZUV4dGVuc2lvbihpdGVtLm5hbWUsICdwZGYnKSxcbiAgICAgICAgICAgICAgICAgICAgZm9sZGVySW5zdGFuY2VJZDogaXRlbS5wYXJlbnRGb2xkZXJJZCA/PyB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKSxcbiAgICAgICAgICAgICAgICAgICAgb3duZXJUeXBlOiB0aGlzLl91c2VyU2VydmljZS5nZXRDdXJyZW50VXNlcigpLnVzZXJJZC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFyc0NvbnZlcnQgfHwgIXJzQ29udmVydC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhgQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBjaHV54buDbiDEkeG7lWkgdMOgaSBsaeG7h3UgJHtpdGVtLm5hbWV9IHRow6BuaCBwZGYgxJHhu4Mga8O9LiBWdWkgbMOybmcgdGjhu60gbOG6oWkgc2F1YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoYENodXnhu4NuIMSR4buVaSB0w6BpIGxp4buHdSAke2l0ZW0ubmFtZX0gdGjDoG5oIHBkZiB0aMOgbmggY8O0bmdgKTtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZUlkID0gcnNDb252ZXJ0LmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtLmlkID0gcnNDb252ZXJ0LmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZUZpbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKGBDw7MgbOG7l2kgeOG6o3kgcmEga2hpIGNodXnhu4NuIMSR4buVaSB0w6BpIGxp4buHdSAke2l0ZW0ubmFtZX0gdGjDoG5oIHBkZiDEkeG7gyBrw70uIFZ1aSBsw7JuZyB0aOG7rSBs4bqhaSBzYXVgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlucHV0ID0gKGF3YWl0IHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuZ2V0QmFzZTY0RnJvbUZpbGVJZChzb3VyY2VGaWxlSWQpKS5zcGxpdCgnLCcpWzFdO1xuXG4gICAgICAgIGNvbnN0IHNpZ09wdGlvbnMgPSBuZXcgUGRmU2lnbmVyKCk7XG4gICAgICAgIHNpZ09wdGlvbnMucGFnZSA9IDE7XG4gICAgICAgIHNpZ09wdGlvbnMuQWR2YW5jZWRDdXN0b20gPSB0cnVlO1xuICAgICAgICBzaWdPcHRpb25zLlNpZ1R5cGUgPSAxO1xuICAgICAgICBjb25zdCBkYXRhSlMgPSB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhSW5wdXQsXG4gICAgICAgICAgICB0eXBlOiAncGRmJyxcbiAgICAgICAgICAgIHNpZ09wdGlvbnM6IEpTT04uc3RyaW5naWZ5KHNpZ09wdGlvbnMpXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB2bnB0X3BsdWdpbi5zaWduQXJyRGF0YUFkdmFuY2VkKFxuICAgICAgICAgICAgICAgIFtKU09OLnN0cmluZ2lmeShkYXRhSlMpXSxcbiAgICAgICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5oYW5kZVJlc3VsdChkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGhhbmRlUmVzdWx0KGRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBKU09OLnBhcnNlKGRhdGEpLmNvZGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB2YXIganNPYiA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIganNPYiA9IEpTT04ucGFyc2UoSlNPTi5wYXJzZShkYXRhKVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChqc09iLmNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmt5U2ltU2F2ZVNpZ25lZEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlOiB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUNvbnRlbnRzOiBqc09iLmRhdGEsXG4gICAgICAgICAgICAgICAgfSkudGhlbigocnNzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcyhcIkvDvSB0aMOgbmggY8O0bmdcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZUZpbGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoXCJE4buvIGxp4buHdSDEkeG6p3UgdsOgbyBraMO0bmcgxJHDum5nIMSR4buLbmggZOG6oW5nXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhcIktow7RuZyBs4bqleSDEkcaw4bujYyB0aMO0bmcgdGluIGNo4bupbmcgdGjGsCBz4buRXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhcIkPDsyBs4buXaSB0cm9uZyBxdcOhIHRyw6xuaCBrw70gc+G7kVwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoXCJDaOG7qW5nIHRoxrAgc+G7kSBraMO0bmcgY8OzIGtow7NhIGLDrSBt4bqtdFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoXCJM4buXaSBraMO0bmcgeMOhYyDEkeG7i25oXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcyhcIkvDvSBwZGY6IGtow7RuZyB0w6xtIHRo4bqleSB0aGFtIHPhu5Egc+G7kSB0cmFuZyBj4bqnbiBrw71cIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKFwiS8O9IHBkZjogdHJhbmcgxJHhurd0IGNo4buvIGvDvSBraMO0bmcgdOG7k24gdOG6oWlcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKFwiS8O9IHhtbDoga2jDtG5nIHTDrG0gdGjhuqV5IHRo4bq7IGvDvSBz4buRXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcyhcIkvDvSBwZGY6IGtow7RuZyB0w6xtIHRo4bqleSBpZCBj4bunYSB0aOG6uyBrw70gc+G7kVwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKFwiROG7ryBsaeG7h3Uga8O9IMSRw6MgY2jhu6lhIG3hu5l0IGhv4bq3YyBuaGnhu4F1IGNo4buvIGvDvSBraMO0bmcgaOG7o3AgbOG7h1wiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKFwiTmfGsOG7nWkgZMO5bmcgaOG7p3kgYuG7j1wiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKFwiROG7ryBsaeG7h3Uga8O9IHLhu5duZ1wiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKFwiTOG7l2kga2jDtG5nIHjDoWMgxJHhu4tuaFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZENvbW1lbnQoZmlsZTogRmlsZUV4cGxvcmVySXRlbSkge1xuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0NvbmZpcm0oJ0LhuqFuIGPDsyBjaOG6r2MgY2jhuq9uIG114buRbiBiw7p0IHBow6ogdsSDbiBi4bqjbiBuw6B5PycpLnRoZW4oYXN5bmMgcnMgPT4ge1xuICAgICAgICAgICAgaWYgKHJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGVJZCA9IGZpbGUuaWQ7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGUgPSBmaWxlO1xuICAgICAgICAgICAgICAgIC8vIEvDvSBz4buRIGZpbGUgd29yZCAtIGPhuqduIGNvbnZlcnQgc2FuZyBwZGYgdHLGsOG7m2NcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5uZWVkQ29udmVydEJlZm9yZVNpZ24oZmlsZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IGZpbGUgYmVmb3JlIHNpZ25cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJzQ29udmVydCA9IGF3YWl0IHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuY29udmVydERvY3VtZW50VG9QZGZBbmRTYXZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBzb3VyY2VGaWxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jaGFuZ2VGaWxlRXh0ZW5zaW9uKGZpbGUubmFtZSwgJ3BkZicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlckluc3RhbmNlSWQ6IGZpbGUucGFyZW50Rm9sZGVySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJUeXBlOiB0aGlzLl91c2VyU2VydmljZS5nZXRDdXJyZW50VXNlcigpLnVzZXJJZC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJzQ29udmVydCB8fCAhcnNDb252ZXJ0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYEPDsyBs4buXaSB44bqjeSByYSBraGkgY2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7ZmlsZS5uYW1lfSB0aMOgbmggcGRmIMSR4buDIGvDvS4gVnVpIGzDsm5nIHRo4butIGzhuqFpIHNhdWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcyhgQ2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7ZmlsZS5uYW1lfSB0aMOgbmggcGRmIHRow6BuaCBjw7RuZ2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVJZCA9IHJzQ29udmVydC5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGUgPSB7IGlkOiBzb3VyY2VGaWxlSWQgfSBhcyBGaWxlRXhwbG9yZXJJdGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZUZpbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKGBDw7MgbOG7l2kgeOG6o3kgcmEga2hpIGNodXnhu4NuIMSR4buVaSB0w6BpIGxp4buHdSAke2ZpbGUubmFtZX0gdGjDoG5oIHBkZiDEkeG7gyBrw70uIFZ1aSBsw7JuZyB0aOG7rSBs4bqhaSBzYXVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UuZ2VuZXJhdGVMaW5rRG93bmxvYWQoe1xuICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHNvdXJjZUZpbGVJZCxcbiAgICAgICAgICAgICAgICB9IGFzIEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPKS50aGVuKHJzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fZG93bmxvYWRMaW5rU2VydmljZS5nZXREb3dubG9hZEZvclNpZ25VcmwocnMuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcHJtc1snRmlsZVVwbG9hZEhhbmRsZXInXSA9IGAke3RoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5hcGlEb21haW4uZmlsZUVuZHBvaW50fS8ke3RoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5hcGlWZXJzaW9ufS9LeVNvRmlsZS9TYXZlUGh5c2ljYWxTaWduZWRGaWxlYDtcbiAgICAgICAgICAgICAgICAgICAgcHJtc1snU2Vzc2lvbklkJ10gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcHJtc1snRmlsZU5hbWUnXSA9IHVybDtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbl9wcm1zID0gSlNPTi5zdHJpbmdpZnkocHJtcyk7XG4gICAgICAgICAgICAgICAgICAgIHZnY2FfY29tbWVudChqc29uX3BybXMsIChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0T2JqID0gSlNPTi5wYXJzZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE9iai5GaWxlU2VydmVyICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5zYXZlU2lnbmVkRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGU6IHNvdXJjZUZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBGaWxlSWQ6IHJlc3VsdE9iai5GaWxlU2VydmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4ocnNzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTZXJ2aWNlRmlsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1ThuqFvIGLDunQgcGjDqiB0aMOgbmggY8O0bmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBhZGRDb21tZW50QW5kU2lnbihmaWxlOiBGaWxlRXhwbG9yZXJJdGVtKSB7XG4gICAgICAgIGNvbnN0IHJzID0gYXdhaXQgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dDb25maXJtKCdC4bqhbiBjw7MgY2jhuq9jIGNo4bqvbiBtdeG7kW4gdOG6oW8gYsO6dCBwaMOqIHbDoCBrw70gdsSDbiBi4bqjbiBuw6B5PycpO1xuXG4gICAgICAgIGlmIChycykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGVJZCA9IGZpbGUuaWQ7XG4gICAgICAgICAgICBsZXQgc291cmNlRmlsZSA9IGZpbGU7XG5cbiAgICAgICAgICAgIC8vIEvDvSBz4buRIGZpbGUgd29yZCAtIGPhuqduIGNvbnZlcnQgc2FuZyBwZGYgdHLGsOG7m2NcbiAgICAgICAgICAgIGlmICh0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLm5lZWRDb252ZXJ0QmVmb3JlU2lnbihmaWxlLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gY29udmVydCBmaWxlIGJlZm9yZSBzaWduXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnNDb252ZXJ0ID0gYXdhaXQgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jb252ZXJ0RG9jdW1lbnRUb1BkZkFuZFNhdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogc291cmNlRmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jaGFuZ2VGaWxlRXh0ZW5zaW9uKGZpbGUubmFtZSwgJ3BkZicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVySW5zdGFuY2VJZDogZmlsZS5wYXJlbnRGb2xkZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyVHlwZTogdGhpcy5fdXNlclNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKS51c2VySWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyc0NvbnZlcnQgfHwgIXJzQ29udmVydC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYEPDsyBs4buXaSB44bqjeSByYSBraGkgY2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7ZmlsZS5uYW1lfSB0aMOgbmggcGRmIMSR4buDIGvDvS4gVnVpIGzDsm5nIHRo4butIGzhuqFpIHNhdWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKGBDaHV54buDbiDEkeG7lWkgdMOgaSBsaeG7h3UgJHtmaWxlLm5hbWV9IHRow6BuaCBwZGYgdGjDoG5oIGPDtG5nYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlSWQgPSByc0NvbnZlcnQuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGUgPSB7IGlkOiBzb3VyY2VGaWxlSWQgfSBhcyBGaWxlRXhwbG9yZXJJdGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTZXJ2aWNlRmlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYEPDsyBs4buXaSB44bqjeSByYSBraGkgY2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7ZmlsZS5uYW1lfSB0aMOgbmggcGRmIMSR4buDIGvDvS4gVnVpIGzDsm5nIHRo4butIGzhuqFpIHNhdWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZExpbmsgPSBhd2FpdCB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmdlbmVyYXRlTGlua0Rvd25sb2FkKHtcbiAgICAgICAgICAgICAgICBmaWxlSWQ6IHNvdXJjZUZpbGVJZCxcbiAgICAgICAgICAgIH0gYXMgR2VuZXJhdGVMaW5rRG93bmxvYWREVE8pO1xuXG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl9kb3dubG9hZExpbmtTZXJ2aWNlLmdldERvd25sb2FkRm9yU2lnblVybChkb3dubG9hZExpbmsuZGF0YSk7XG4gICAgICAgICAgICBjb25zdCBwcm1zID0ge1xuICAgICAgICAgICAgICAgIEZpbGVVcGxvYWRIYW5kbGVyOiBgJHt0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBpRG9tYWluLmZpbGVFbmRwb2ludH0vJHt0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBpVmVyc2lvbn0vS3lTb0ZpbGUvU2F2ZVBoeXNpY2FsU2lnbmVkRmlsZWAsXG4gICAgICAgICAgICAgICAgU2Vzc2lvbklkOiAnJyxcbiAgICAgICAgICAgICAgICBGaWxlTmFtZTogdXJsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBqc29uX3BybXMgPSBKU09OLnN0cmluZ2lmeShwcm1zKTtcblxuICAgICAgICAgICAgLy8gV3JhcCBjYWxsYmFjay1iYXNlZCBmdW5jdGlvbnMgaW4gUHJvbWlzZXNcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRSZXN1bHQgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgdmdjYV9jb21tZW50KGpzb25fcHJtcywgKHJlc3VsdDogYW55KSA9PiByZXNvbHZlKHJlc3VsdCkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdE9iaiA9IEpTT04ucGFyc2UoY29tbWVudFJlc3VsdCk7XG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZExpbmsyID0gYXdhaXQgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5nZW5lcmF0ZUxpbmtEb3dubG9hZCh7XG4gICAgICAgICAgICAgICAgZmlsZUlkOiByZXN1bHRPYmouRmlsZVNlcnZlcixcbiAgICAgICAgICAgIH0gYXMgR2VuZXJhdGVMaW5rRG93bmxvYWREVE8pO1xuXG4gICAgICAgICAgICBjb25zdCB1cmwyID0gdGhpcy5fZG93bmxvYWRMaW5rU2VydmljZS5nZXREb3dubG9hZEZvclNpZ25VcmwoZG93bmxvYWRMaW5rMi5kYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHBybXMyID0ge1xuICAgICAgICAgICAgICAgIEZpbGVVcGxvYWRIYW5kbGVyOiBgJHt0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBpRG9tYWluLmZpbGVFbmRwb2ludH0vJHt0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBpVmVyc2lvbn0vS3lTb0ZpbGUvU2F2ZVBoeXNpY2FsU2lnbmVkRmlsZWAsXG4gICAgICAgICAgICAgICAgU2Vzc2lvbklkOiAnJyxcbiAgICAgICAgICAgICAgICBGaWxlTmFtZTogdXJsMlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QganNvbl9wcm1zMiA9IEpTT04uc3RyaW5naWZ5KHBybXMyKTtcblxuICAgICAgICAgICAgY29uc3Qgc2lnblJlc3VsdCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICB2Z2NhX3NpZ25fYXBwcm92ZWQoanNvbl9wcm1zMiwgKHJlc3VsdDogYW55KSA9PiByZXNvbHZlKHJlc3VsdCkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNpZ25SZXN1bHRPYmogPSBKU09OLnBhcnNlKHNpZ25SZXN1bHQpO1xuXG4gICAgICAgICAgICBpZiAoc2lnblJlc3VsdE9iai5GaWxlU2VydmVyICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5zYXZlU2lnbmVkRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGU6IHNvdXJjZUZpbGUsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBGaWxlSWQ6IHNpZ25SZXN1bHRPYmouRmlsZVNlcnZlcixcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZUZpbGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1ThuqFvIGLDunQgcGjDqiB2w6Aga8O9IHRow6BuaCBjw7RuZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNpZ25GaWxlRG9uVmkoZmlsZTogRmlsZUV4cGxvcmVySXRlbSkge1xuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2VcbiAgICAgICAgICAgIC5zaG93Q29uZmlybSgnQuG6oW4gY8OzIGNo4bqvYyBjaOG6r24gbXXhu5FuIGvDvSBz4buRIMSRxqFuIHbhu4sgdsSDbiBi4bqjbiBuw6B5PycpXG4gICAgICAgICAgICAudGhlbihhc3luYyAocnMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGVJZCA9IGZpbGUuaWQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2VGaWxlID0gZmlsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2UubmVlZENvbnZlcnRCZWZvcmVTaWduKGZpbGUubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgZmlsZSBiZWZvcmUgc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByc0NvbnZlcnQgPSBhd2FpdCB0aGlzLl9maWxlRXhwbG9yZXJTZXJ2aWNlLmNvbnZlcnREb2N1bWVudFRvUGRmQW5kU2F2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IHNvdXJjZUZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5fZmlsZUV4cGxvcmVyU2VydmljZS5jaGFuZ2VGaWxlRXh0ZW5zaW9uKGZpbGUubmFtZSwgJ3BkZicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJJbnN0YW5jZUlkOiBmaWxlLnBhcmVudEZvbGRlcklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lclR5cGU6IHRoaXMuX3VzZXJTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCkudXNlcklkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyc0NvbnZlcnQgfHwgIXJzQ29udmVydC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhgQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBjaHV54buDbiDEkeG7lWkgdMOgaSBsaeG7h3UgJHtmaWxlLm5hbWV9IHRow6BuaCBwZGYgxJHhu4Mga8O9LiBWdWkgbMOybmcgdGjhu60gbOG6oWkgc2F1YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcyhgQ2h1eeG7g24gxJHhu5VpIHTDoGkgbGnhu4d1ICR7ZmlsZS5uYW1lfSB0aMOgbmggcGRmIHRow6BuaCBjw7RuZ2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZpY2VGaWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVJZCA9IHJzQ29udmVydC5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlID0geyBpZDogc291cmNlRmlsZUlkIH0gYXMgRmlsZUV4cGxvcmVySXRlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhgQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBjaHV54buDbiDEkeG7lWkgdMOgaSBsaeG7h3UgJHtmaWxlLm5hbWV9IHRow6BuaCBwZGYgxJHhu4Mga8O9LiBWdWkgbMOybmcgdGjhu60gbOG6oWkgc2F1YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUxpbmtEb3dubG9hZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGaWxlVmVyc2lvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBzb3VyY2VGaWxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fZG93bmxvYWRMaW5rU2VydmljZS5nZXREb3dubG9hZEZvclNpZ25VcmwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm1zWydGaWxlVXBsb2FkSGFuZGxlciddID0gYCR7dGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwaURvbWFpbi5maWxlRW5kcG9pbnR9LyR7dGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwaVZlcnNpb259L0t5U29GaWxlL1NhdmVQaHlzaWNhbFNpZ25lZEZpbGVgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBybXNbJ1Nlc3Npb25JZCddID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJtc1snRmlsZU5hbWUnXSA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnV54buBbiBz4buRLCBuZ8OgeSBrw70gc+G7kSBwaMOybmcgYmFuIG7hur91IGPhuqduXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuY29udHJvbCAmJiB0aGF0LmNvbnRyb2wuZGF0YUt5U29Eb25WaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhS3lTb0RvblZpID0gKDxGdW5jdGlvbj50aGF0LmNvbnRyb2wuZGF0YUt5U29Eb25WaSkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFLeVNvRG9uVmkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGzhuqV5IHPhu5EgRG9jTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YUt5U29Eb25WaS5kb2NOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm1zWydEb2NOdW1iZXInXSA9IGRhdGFLeVNvRG9uVmkuZG9jTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbOG6pXkgbmfDoHkgYmFuIGjDoG5oIHZiIMSRaVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFLeVNvRG9uVmkuaXNzdWVkRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBybXNbJ0lzc3VlZERhdGUnXSA9IGRhdGFLeVNvRG9uVmkuaXNzdWVkRGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb25fcHJtcyA9IEpTT04uc3RyaW5naWZ5KHBybXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnY2Ffc2lnbl9pc3N1ZWQoanNvbl9wcm1zLCAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0T2JqID0gSlNPTi5wYXJzZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0T2JqLkZpbGVTZXJ2ZXIgIT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVFeHBsb3JlclNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2F2ZVNpZ25lZEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlOiBzb3VyY2VGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZUlkOiByZXN1bHRPYmouRmlsZVNlcnZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChyc3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTZXJ2aWNlRmlsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ0vDvSBz4buRIHRow6BuaCBjw7RuZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=