@sachin9822/reports-lib 0.0.209 → 0.0.211

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +13 -12
  2. package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +4 -3
  3. package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +1 -1
  4. package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +1 -1
  5. package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +700 -0
  6. package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +1 -1
  7. package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +3 -3
  8. package/esm2020/lib/components/funding-report/funding-report.component.mjs +3 -3
  9. package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +4 -3
  10. package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +3 -3
  11. package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +1 -1
  12. package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +311 -0
  13. package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +7 -6
  14. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +1 -1
  15. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +6 -0
  16. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +5 -0
  17. package/esm2020/lib/reports-lib.module.mjs +15 -5
  18. package/esm2020/lib/services/report.service.mjs +62 -4
  19. package/esm2020/lib/shared/export-generic.service.mjs +10 -1
  20. package/esm2020/lib/shared/search-filter/search-filter.component.mjs +525 -189
  21. package/esm2020/public-api.mjs +5 -1
  22. package/fesm2015/sachin9822-reports-lib.mjs +1715 -330
  23. package/fesm2015/sachin9822-reports-lib.mjs.map +1 -1
  24. package/fesm2020/sachin9822-reports-lib.mjs +1721 -329
  25. package/fesm2020/sachin9822-reports-lib.mjs.map +1 -1
  26. package/lib/assets/images/Search.svg +9 -9
  27. package/lib/assets/svg-loaders/blue-tail-spin.svg +31 -31
  28. package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +78 -0
  29. package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +68 -0
  30. package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +1 -1
  31. package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +4 -0
  32. package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +13 -0
  33. package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +23 -0
  34. package/lib/reports-lib.module.d.ts +12 -10
  35. package/lib/services/report.service.d.ts +11 -1
  36. package/lib/shared/search-filter/search-filter.component.d.ts +7 -5
  37. package/package.json +1 -1
  38. package/public-api.d.ts +4 -0
@@ -0,0 +1,700 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { themeAlpine } from '@ag-grid-community/theming';
3
+ import { ComponentLoadingStates } from '../../models/component-loading-states';
4
+ import { GenericExportService } from '../../shared/export-generic.service';
5
+ // import { formatDate } from '@angular/common';
6
+ // import { ComponentLoadingStates } from 'src/app/models/component-loading-states';
7
+ // import { GenericExportService } from 'src/app/shared/export-generic.service';
8
+ // import { ExportOptions } from 'projects/reports-lib/src/lib/shared/export-generic.service';
9
+ // import { Injectable } from '@angular/core';
10
+ // import jsPDF from 'jspdf';
11
+ // import 'jspdf-autotable';
12
+ import * as ExcelJS from 'exceljs';
13
+ import * as FileSaver from 'file-saver';
14
+ import { formatDate } from '@angular/common';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "../../services/report.service";
17
+ import * as i2 from "ag-grid-angular";
18
+ import * as i3 from "@angular/common";
19
+ import * as i4 from "../../shared/page-size-selector/page-size-selector.component";
20
+ import * as i5 from "../../shared/metadata/metadata.component";
21
+ import * as i6 from "@ng-bootstrap/ng-bootstrap";
22
+ import * as i7 from "../../shared/loader/loader.component";
23
+ import * as i8 from "../../shared/search-filter/search-filter.component";
24
+ export class BranchActivitySendSummaryReportComponent {
25
+ constructor(reportService, ngZone) {
26
+ this.reportService = reportService;
27
+ this.ngZone = ngZone;
28
+ this.dataMap = {};
29
+ this.filteredData = {};
30
+ this.proxyData = {};
31
+ this.selectedExportOption = 'excel';
32
+ this.gridApis = [];
33
+ this.user = "";
34
+ this.ComponentLoadingState = ComponentLoadingStates;
35
+ this.loadingState = ComponentLoadingStates.Loading;
36
+ this.ReportName = "Branch Activity Send Summary";
37
+ this.exportService = inject(GenericExportService);
38
+ this.searchCriteria = [];
39
+ // flags
40
+ this.showMessage = false;
41
+ this.noDataFound = false;
42
+ this.isFormValid = false;
43
+ this.clearSearch = false;
44
+ this.isTotalSummary = false;
45
+ this.columnDefs = [
46
+ {
47
+ field: 'businessDateTime', headerName: 'Business Date', flex: 1, wrapText: true, autoHeight: true, headerClass: 'ag-left-aligned-header', minWidth: 70, width: 70, tooltipField: 'businessDateTime',
48
+ valueFormatter: (params) => {
49
+ const row = params.data;
50
+ if (row && row.payinCCcode === 'Total') {
51
+ return ''; // hide date for total row
52
+ }
53
+ return params.value;
54
+ }
55
+ },
56
+ { field: 'product', headerName: 'Product', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, width: 120, tooltipField: 'product' },
57
+ { field: 'payoutCCcode', headerName: 'Receive Currency', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, width: 110, tooltipField: 'payoutCCcode' },
58
+ { field: 'payoutAmount', headerName: 'Receive Amount', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 120, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'payoutAmount' },
59
+ { field: 'payinCCcode', headerName: 'Send Currency', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 90, tooltipField: 'payinCCcode' },
60
+ { field: 'payinAmount', headerName: 'Send Amount', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 120, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'payinAmount' },
61
+ { field: 'transactionCommissionAmount', headerName: 'Service Fee', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'transactionCommissionAmount' },
62
+ { field: 'tax', headerName: 'Tax', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'tax' },
63
+ { field: 'totalPayinAmount', headerName: 'Total Send Amount', minWidth: 100, flex: 1, wrapText: true, autoHeight: true, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'totalPayinAmount' },
64
+ { field: 'transactionCount', headerName: 'Transaction Count', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'txnCount' },
65
+ { field: 'status', headerName: 'Transaction Status', minWidth: 100, flex: 1, wrapText: true, autoHeight: true, tooltipField: 'status' }
66
+ ];
67
+ this.defaultColDef = {
68
+ sortable: true,
69
+ filter: true,
70
+ resizable: true,
71
+ minwidth: 40,
72
+ wrapHeaderText: true,
73
+ autoHeaderHeight: true,
74
+ suppressSizeToFit: false,
75
+ wrapText: true
76
+ };
77
+ // rowClassRules = {
78
+ // debugger
79
+ // 'total-row': params => params.data?.isTotalRow
80
+ // };
81
+ this.rowClassRules = {
82
+ 'total-row': (params) => {
83
+ console.log('Row Data:', params.data.isTotalRow);
84
+ if (params.data.isTotalRow) {
85
+ return params.data?.isTotalRow;
86
+ }
87
+ }
88
+ };
89
+ this.rowData = [];
90
+ this.reportTheme = themeAlpine.withParams({
91
+ headerFontSize: '10px',
92
+ fontFamily: ['Arial', 'sans-serif'],
93
+ fontSize: '9px'
94
+ });
95
+ }
96
+ ngOnInit() {
97
+ this.loadingState = ComponentLoadingStates.Complete;
98
+ // Check if User is falcon user or fossilUser
99
+ if (sessionStorage.getItem('fossilusername')) {
100
+ this.sysUserId = sessionStorage.getItem('fossilusername');
101
+ }
102
+ else {
103
+ this.sysUserId = sessionStorage.getItem('ezremitusername');
104
+ }
105
+ this.sysUserId = this.sysUserId.replace(/^["'](.*)["']$/, '$1');
106
+ this.user = this.sysUserId;
107
+ console.log("System User Id : " + this.sysUserId);
108
+ }
109
+ filter(text) {
110
+ this.searchText = text;
111
+ if (this.searchText == null) {
112
+ return;
113
+ }
114
+ if (this.searchText?.length === 0) {
115
+ this.filteredData = structuredClone(this.dataMap);
116
+ return;
117
+ }
118
+ this.searchText = this.searchText?.trim()?.toLowerCase();
119
+ for (const [key, entries] of Object.entries(this.proxyData)) {
120
+ const filteredData = entries.filter(entry => Object.values(entry)
121
+ .some(val => {
122
+ let a = val?.toString().toLowerCase();
123
+ if (a == null) {
124
+ return false;
125
+ }
126
+ return a?.search(this.searchText) == -1 ? false : true;
127
+ }));
128
+ this.filteredData[key] = filteredData;
129
+ }
130
+ this.filteredData;
131
+ }
132
+ onGridReady(params, id) {
133
+ params.api.sizeColumnsToFit();
134
+ this.gridColumnApi = params.columnApi;
135
+ this.gridApis[id] = params.api;
136
+ params.columnApi.setColumnVisible('businessDateTime', !this.isTotalSummary);
137
+ params.api.sizeColumnsToFit();
138
+ }
139
+ handleExport(option) {
140
+ this.selectedExportOption = option;
141
+ if (!this.hasAnyGroups()) {
142
+ alert("There is no data to export based on your current filter.");
143
+ return;
144
+ }
145
+ // If no data, do nothing.
146
+ if (!this.filteredData || Object.keys(this.filteredData).length === 0) {
147
+ alert("No data to export");
148
+ return;
149
+ }
150
+ const title = "Branch Activity Send Summary";
151
+ const reportTimeFormatter = this.dateValueFormatter('dd/MM/yyyy hh:mm a');
152
+ const metadata = [
153
+ ['Report Period ', this.fromDate + " - " + this.toDate],
154
+ ['Report User & Time', this.user ? this.user + " @ " + this.reportDate : '' + " @ " + this.reportDate],
155
+ ];
156
+ // --- search criteria ---
157
+ const searchCriteria = this.searchCriteria;
158
+ //const columns = this.columnDefs;
159
+ //exclude Business Date col for Total Summary Report.
160
+ let columns = [...this.columnDefs];
161
+ const summaryReport = this.searchCriteria.find(x => x[0] === 'Summary Report:')?.[1];
162
+ if (summaryReport === 'Total Summary') {
163
+ columns = columns.filter(col => col.field !== 'businessDateTime');
164
+ }
165
+ // const data = this.dataMap;
166
+ const cleanedData = {};
167
+ Object.keys(this.dataMap).forEach(key => {
168
+ cleanedData[key] = this.dataMap[key].map(row => {
169
+ if (row.isTotalRow) {
170
+ return {
171
+ ...row,
172
+ businessDateTime: '',
173
+ product: '',
174
+ receiveCurrency: '',
175
+ receiveAmount: ''
176
+ };
177
+ }
178
+ return row;
179
+ });
180
+ });
181
+ const data = cleanedData;
182
+ const options = {
183
+ currencyFields: [
184
+ 'payoutAmount', 'payinAmount', 'transactionCommissionAmount', 'tax', 'totalPayinAmount'
185
+ ],
186
+ // specify all date fields expected
187
+ dateFields: [],
188
+ dateFieldFormats: {
189
+ txnDateAndTime: 'dd/MM/yyyy hh:mm a',
190
+ cancellationBranchDateTime: 'dd/MM/yyyy HH:mm',
191
+ cancellationBusinessDate: 'dd/MM/yyyy'
192
+ },
193
+ specialDecimalFields: {
194
+ rate: 8 // future field with 8 decimal places
195
+ },
196
+ groupByKey: true
197
+ };
198
+ switch (this.selectedExportOption) {
199
+ case 'excel':
200
+ this.exportToExcel({ title, metadata, searchCriteria, columns, data, options });
201
+ break;
202
+ case 'pdf':
203
+ this.exportService.exportToPdf({ title, metadata, searchCriteria, columns, data, options });
204
+ break;
205
+ case 'csv':
206
+ this.exportService.exportToCsv({ title, metadata, searchCriteria, columns, data, options });
207
+ break;
208
+ default:
209
+ alert("Please select an export format.");
210
+ }
211
+ }
212
+ async exportToExcel({ title, metadata, searchCriteria, columns, data, options = {} }) {
213
+ const workbook = new ExcelJS.Workbook();
214
+ const worksheet = workbook.addWorksheet(title);
215
+ // ===================== PRE CALC =====================
216
+ const headerLabels = ['Sr No', ...columns.map(col => col.headerName || col.field)];
217
+ const totalCols = headerLabels.length;
218
+ const titleStartCol = 4;
219
+ const titleColLetter = String.fromCharCode(64 + titleStartCol);
220
+ const titleMergeEnd = String.fromCharCode(64 + totalCols);
221
+ // ===================== LOGO =====================
222
+ if (this.logoBase64) {
223
+ const base64Data = this.logoBase64.replace(/^data:image\/\w+;base64,/, '');
224
+ const imageId = workbook.addImage({
225
+ base64: base64Data,
226
+ extension: 'png',
227
+ });
228
+ worksheet.addImage(imageId, {
229
+ tl: { col: 0, row: 0 },
230
+ ext: { width: 145, height: 66 }
231
+ });
232
+ worksheet.getRow(1).height = 24;
233
+ worksheet.getRow(2).height = 22;
234
+ worksheet.getRow(3).height = 22;
235
+ }
236
+ // ===================== TITLE =====================
237
+ worksheet.mergeCells(`${titleColLetter}1:${titleMergeEnd}1`);
238
+ const titleCell = worksheet.getRow(1).getCell(titleStartCol);
239
+ titleCell.value = title;
240
+ titleCell.font = { bold: true, size: 16 };
241
+ titleCell.alignment = { vertical: 'middle', horizontal: 'left' };
242
+ // ===================== METADATA =====================
243
+ let metaRowStart = 4;
244
+ metadata.forEach(([label, value], idx) => {
245
+ const row = worksheet.getRow(metaRowStart + idx);
246
+ row.getCell(1).value = {
247
+ richText: [
248
+ { text: `${label} : `, font: { bold: true } },
249
+ { text: value ?? '', font: { bold: false } }
250
+ ]
251
+ };
252
+ worksheet.mergeCells(`A${row.number}:${titleMergeEnd}${row.number}`);
253
+ });
254
+ let currentRow = metaRowStart + metadata.length;
255
+ worksheet.getRow(++currentRow).height = 6;
256
+ currentRow++;
257
+ // ===================== SEARCH CRITERIA =====================
258
+ worksheet.mergeCells(currentRow, 1, currentRow, 6);
259
+ worksheet.getCell(currentRow, 1).value = 'Search Criteria:-';
260
+ worksheet.getCell(currentRow, 1).font = { bold: true };
261
+ currentRow += 2;
262
+ for (let i = 0; i < searchCriteria.length; i += 2) {
263
+ const left = searchCriteria[i];
264
+ const right = searchCriteria[i + 1];
265
+ const row = worksheet.getRow(currentRow++);
266
+ worksheet.mergeCells(row.number, 1, row.number, 3);
267
+ row.getCell(1).value = {
268
+ richText: [
269
+ { text: (left?.[0] ?? '') + ' ', font: { bold: true } },
270
+ { text: left?.[1] ?? '' }
271
+ ]
272
+ };
273
+ row.getCell(1).alignment = { wrapText: true, vertical: 'middle' };
274
+ if (right) {
275
+ worksheet.mergeCells(row.number, 4, row.number, 6);
276
+ row.getCell(4).value = {
277
+ richText: [
278
+ { text: (right?.[0] ?? '') + ' ', font: { bold: true } },
279
+ { text: right?.[1] ?? '' }
280
+ ]
281
+ };
282
+ row.getCell(4).alignment = { wrapText: true, vertical: 'middle' };
283
+ }
284
+ }
285
+ currentRow++;
286
+ // ===================== HEADER ROW =====================
287
+ const headerRow = worksheet.getRow(currentRow++);
288
+ headerLabels.forEach((header, i) => {
289
+ const cell = headerRow.getCell(i + 1);
290
+ cell.value = header;
291
+ cell.font = { bold: true };
292
+ cell.fill = {
293
+ type: 'pattern',
294
+ pattern: 'solid',
295
+ fgColor: { argb: 'D9D9D9' }
296
+ };
297
+ cell.alignment = { vertical: 'middle', horizontal: 'center' };
298
+ cell.border = {
299
+ top: { style: 'thin' },
300
+ bottom: { style: 'thin' },
301
+ left: { style: 'thin' },
302
+ right: { style: 'thin' }
303
+ };
304
+ });
305
+ headerRow.eachCell((cell) => {
306
+ if (cell.value === 'Transaction Count') {
307
+ cell.value = 'Transaction\nCount';
308
+ cell.alignment = {
309
+ horizontal: 'center',
310
+ vertical: 'middle',
311
+ wrapText: true
312
+ };
313
+ }
314
+ });
315
+ // ===================== DATA SECTION =====================
316
+ let rowIdx = currentRow;
317
+ let serialNumber = 1;
318
+ if (options.groupByKey && !Array.isArray(data)) {
319
+ for (const [group, items] of Object.entries(data)) {
320
+ const groupRow = worksheet.getRow(rowIdx++);
321
+ groupRow.getCell(1).value = group;
322
+ groupRow.font = { bold: true };
323
+ worksheet.mergeCells(`A${groupRow.number}:${titleMergeEnd}${groupRow.number}`);
324
+ items.forEach((item) => {
325
+ const rowData = this.prepareTableRows([item], columns, options)[0];
326
+ const dataRow = worksheet.getRow(rowIdx++);
327
+ const fullRow = [
328
+ !item?.isTotalRow ? serialNumber++ : '',
329
+ ...rowData
330
+ ];
331
+ fullRow.forEach((val, cIdx) => {
332
+ const cell = dataRow.getCell(cIdx + 1);
333
+ // cell.value = val;
334
+ //added by bharati for
335
+ const field = columns[cIdx - 1]?.field;
336
+ // ✅ Amount fields (Receive Amount, Send Amount, Total Send Amount etc.)
337
+ /*
338
+ if (
339
+ field=='totalPayinAmount'||
340
+ field=='payinAmount'||
341
+ field === 'transactionCommissionAmount' ||
342
+ field === 'tax'
343
+ ) {
344
+ if (val !== '' && val !== null && val !== undefined) {
345
+ cell.value = Number(val);
346
+ cell.numFmt = '#,##0.000';
347
+ cell.alignment = { horizontal: 'right', vertical: 'middle' };
348
+ } else {
349
+ cell.value = '';
350
+ }
351
+ }
352
+ else {
353
+ cell.value = val;
354
+ } */
355
+ if (item?.isTotalRow && field === 'receiveAmount') {
356
+ cell.value = '';
357
+ }
358
+ else if (field?.toLowerCase().includes('amount') ||
359
+ field === 'serviceFee' ||
360
+ field === 'tax') {
361
+ if (val !== '' && val !== null && val !== undefined) {
362
+ cell.value = val; // already number
363
+ cell.numFmt = '#,##0.000'; // Excel formatting
364
+ cell.alignment = { horizontal: 'right', vertical: 'middle' };
365
+ }
366
+ else {
367
+ cell.value = '';
368
+ }
369
+ }
370
+ else {
371
+ cell.value = val;
372
+ }
373
+ cell.border = {
374
+ top: { style: 'thin' },
375
+ bottom: { style: 'thin' },
376
+ left: { style: 'thin' },
377
+ right: { style: 'thin' }
378
+ };
379
+ });
380
+ if (item?.isTotalRow) {
381
+ dataRow.eachCell(cell => {
382
+ cell.font = {
383
+ ...cell.font,
384
+ bold: true,
385
+ size: 12
386
+ };
387
+ });
388
+ }
389
+ });
390
+ }
391
+ }
392
+ else {
393
+ this.prepareTableRows(data, columns, options)
394
+ .forEach((rowData, index) => {
395
+ const dataRow = worksheet.getRow(rowIdx++);
396
+ const originalItem = data[index];
397
+ const fullRow = [
398
+ !originalItem?.isTotalRow ? serialNumber++ : '',
399
+ ...rowData
400
+ ];
401
+ fullRow.forEach((val, cIdx) => {
402
+ const cell = dataRow.getCell(cIdx + 1);
403
+ //cell.value = val;
404
+ /* if (cIdx === 0) {
405
+ cell.value = val;
406
+ } else {
407
+
408
+ const field = columns[cIdx - 1]?.field;
409
+
410
+ if (
411
+ field=='totalPayinAmount'||
412
+ field=='payinAmount'||
413
+ field === 'transactionCommissionAmount' ||
414
+ field === 'tax'
415
+ ) {
416
+ cell.value = Number(val);
417
+ cell.numFmt = '#,##0.000';
418
+ cell.alignment = { horizontal: 'right', vertical: 'middle' };
419
+ }
420
+ else {
421
+ cell.value = val;
422
+ }
423
+ } */
424
+ const field = columns[cIdx - 1]?.field;
425
+ if (cIdx === 0) {
426
+ cell.value = val;
427
+ }
428
+ else if (originalItem?.isTotalRow && field === 'receiveAmount') {
429
+ cell.value = '';
430
+ }
431
+ else if (field?.toLowerCase().includes('amount') ||
432
+ field === 'serviceFee' ||
433
+ field === 'tax') {
434
+ if (val !== '' && val !== null && val !== undefined) {
435
+ cell.value = val; // already number
436
+ cell.numFmt = '#,##0.000'; // Excel formatting
437
+ cell.alignment = { horizontal: 'right', vertical: 'middle' };
438
+ }
439
+ else {
440
+ cell.value = '';
441
+ }
442
+ }
443
+ else {
444
+ cell.value = val;
445
+ }
446
+ cell.border = {
447
+ top: { style: 'thin' },
448
+ bottom: { style: 'thin' },
449
+ left: { style: 'thin' },
450
+ right: { style: 'thin' }
451
+ };
452
+ });
453
+ if (originalItem?.isTotalRow) {
454
+ dataRow.eachCell(cell => {
455
+ cell.font = {
456
+ ...cell.font,
457
+ bold: true,
458
+ size: 12
459
+ };
460
+ });
461
+ }
462
+ });
463
+ }
464
+ // ===================== AUTO WIDTH =====================
465
+ for (let i = 1; i <= totalCols; i++) {
466
+ let maxLength = 10;
467
+ worksheet.eachRow({ includeEmpty: true }, (row) => {
468
+ const cell = row.getCell(i);
469
+ if (cell.isMerged)
470
+ return;
471
+ let cellValue = '';
472
+ if (cell.value == null) {
473
+ cellValue = '';
474
+ }
475
+ else if (typeof cell.value === 'object' && 'richText' in cell.value) {
476
+ cellValue = cell.value.richText.map(rt => rt.text).join('');
477
+ }
478
+ else {
479
+ cellValue = cell.value.toString();
480
+ }
481
+ maxLength = Math.max(maxLength, cellValue.length);
482
+ });
483
+ worksheet.getColumn(i).width = Math.min(maxLength, 50);
484
+ }
485
+ //new code:bharati
486
+ worksheet.columns.forEach((column, index) => {
487
+ if (index === 0)
488
+ return; // skip Sr No
489
+ const field = columns[index - 1]?.field;
490
+ if (field === 'payinAmount') {
491
+ column.width = 14;
492
+ }
493
+ if (field === 'payoutAmount') {
494
+ column.width = 15;
495
+ }
496
+ if (field === 'transactionCount') {
497
+ column.width = 14;
498
+ }
499
+ });
500
+ // worksheet.columns.forEach((column) => {
501
+ // if (column.header === 'Send Amount') {
502
+ // column.width = 25;
503
+ // }
504
+ // });
505
+ // ===================== SAVE FILE =====================
506
+ const buffer = await workbook.xlsx.writeBuffer();
507
+ FileSaver.saveAs(new Blob([buffer], {
508
+ type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
509
+ }), title.replace(/\s/g, '-') + '.xlsx');
510
+ }
511
+ // private prepareTableRows(data: any[], columns: any[], options: ExportOptions = {}): any[][] {
512
+ // const {
513
+ // excludeFields = [],
514
+ // currencyFields = [],
515
+ // dateFields = [],
516
+ // dateFieldFormats = {},
517
+ // specialDecimalFields = {}
518
+ // } = options;
519
+ // const filtered = columns.filter(c =>
520
+ // c.field && !excludeFields.some(f => c.field.toLowerCase().includes(f))
521
+ // );
522
+ // return data.map((row) => ([
523
+ // ...filtered.map(col => {
524
+ // let value = row[col.field];
525
+ // // Format date fields with custom formats if specified
526
+ // if (col.field && (dateFields.includes(col.field) || col.field in dateFieldFormats)) {
527
+ // const format = dateFieldFormats[col.field] || 'dd/MM/yyyy';
528
+ // value = this.formatDateByFormat(value, format);
529
+ // }
530
+ // // Format special decimal fields with specific decimals
531
+ // else if (col.field && col.field in specialDecimalFields && value != null) {
532
+ // const decimals = specialDecimalFields[col.field];
533
+ // value = parseFloat(value).toFixed(decimals);
534
+ // }
535
+ // // Format regular currency fields with 3 decimals
536
+ // else if (col.field && currencyFields.includes(col.field) && value != null) {
537
+ // value = parseFloat(value).toFixed(3);
538
+ // }
539
+ // return value ?? '';
540
+ // })
541
+ // ]));
542
+ // }
543
+ prepareTableRows(data, columns, options = {}) {
544
+ const { excludeFields = [], currencyFields = [], dateFields = [], dateFieldFormats = {}, specialDecimalFields = {} } = options;
545
+ const filtered = columns.filter(c => c.field && !excludeFields.some(f => c.field.toLowerCase().includes(f)));
546
+ return data.map((row) => ([
547
+ ...filtered.map(col => {
548
+ let value = row[col.field];
549
+ // ✅ Date formatting (keep as string)
550
+ if (col.field &&
551
+ (dateFields.includes(col.field) || col.field in dateFieldFormats)) {
552
+ const format = dateFieldFormats[col.field] || 'dd/MM/yyyy';
553
+ value = this.formatDateByFormat(value, format);
554
+ }
555
+ // ✅ Special decimal fields → return NUMBER (no toFixed)
556
+ else if (col.field &&
557
+ col.field in specialDecimalFields &&
558
+ value != null) {
559
+ value = Number(value);
560
+ }
561
+ // ✅ Currency fields → return NUMBER (no toFixed)
562
+ else if (col.field &&
563
+ currencyFields.includes(col.field) &&
564
+ value != null) {
565
+ value = Number(value);
566
+ }
567
+ return value ?? '';
568
+ })
569
+ ]));
570
+ }
571
+ formatDateByFormat(val, format) {
572
+ // Helper to pad single digits
573
+ const pad = (n) => n.toString().padStart(2, '0');
574
+ // Parse date for "DD/MM/YYYY hh:mm AM/PM" format manually
575
+ if (typeof val === 'string' && /^\d{2}\/\d{2}\/\d{4} \d{2}:\d{2} [AP]M$/.test(val)) {
576
+ const parts = val.match(/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}) ([AP]M)$/);
577
+ if (!parts)
578
+ return '';
579
+ let [, dd, mm, yyyy, hh, min, ampm] = parts;
580
+ let hours = parseInt(hh, 10);
581
+ if (ampm === 'PM' && hours !== 12)
582
+ hours += 12;
583
+ if (ampm === 'AM' && hours === 12)
584
+ hours = 0;
585
+ val = new Date(parseInt(yyyy, 10), parseInt(mm, 10) - 1, parseInt(dd, 10), hours, parseInt(min, 10));
586
+ }
587
+ else {
588
+ val = new Date(val);
589
+ }
590
+ if (isNaN(val.getTime()))
591
+ return '';
592
+ const dt = val;
593
+ switch (format) {
594
+ case 'dd/MM/yyyy hh:mm a': { // 11/07/2025 10:56 PM
595
+ let hours12 = dt.getHours() % 12 || 12;
596
+ let ampm = dt.getHours() >= 12 ? 'PM' : 'AM';
597
+ return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()} ${pad(hours12)}:${pad(dt.getMinutes())} ${ampm}`;
598
+ }
599
+ case 'dd/MM/yyyy HH:mm': { // 28/07/2025 13:08
600
+ return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()} ${pad(dt.getHours())}:${pad(dt.getMinutes())}`;
601
+ }
602
+ case 'dd/MM/yyyy': { // 28/07/2025
603
+ return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()}`;
604
+ }
605
+ default:
606
+ return dt.toLocaleString();
607
+ }
608
+ }
609
+ dateValueFormatter(format) {
610
+ return (params) => {
611
+ if (!params.value)
612
+ return '';
613
+ try {
614
+ return formatDate(params.value, format, 'en-US');
615
+ }
616
+ catch {
617
+ return '';
618
+ }
619
+ };
620
+ }
621
+ getKeys(obj) {
622
+ return obj ? Object.keys(obj) : [];
623
+ }
624
+ hasAnyGroups() {
625
+ return this.filteredData && this.getKeys(this.filteredData).length > 0;
626
+ }
627
+ formatAmount(params) {
628
+ const value = params?.value;
629
+ if (value !== null && value !== undefined && value !== '') {
630
+ const num = Number(value);
631
+ return (Math.trunc(num * 1000) / 1000).toFixed(3);
632
+ }
633
+ return '';
634
+ }
635
+ handleSearch(criteria) {
636
+ this.searchCriteria = criteria.searchCriteria;
637
+ this.reportDate = new Date().toISOString();
638
+ this.reportDate = formatDate(this.reportDate, 'dd/MM/yyyy hh:mm a', 'en-US');
639
+ const modal = criteria.modal;
640
+ this.user = criteria.sysUserID;
641
+ this.fromDate = formatDate(modal.fromDate, 'dd/MM/yyyy hh:mm a', 'en-US').slice(0, 10);
642
+ this.toDate = formatDate(modal.toDate, 'dd/MM/yyyy hh:mm a', 'en-US').slice(0, 10);
643
+ console.log(modal);
644
+ // Code For Meta Data
645
+ this.leftData = {
646
+ 'Report Period': this.fromDate + " - " + this.toDate,
647
+ };
648
+ this.metaDataTwo = {
649
+ 'Report User & Time': this.user + " @ " + this.reportDate,
650
+ };
651
+ const isTotalSummary = modal.summaryReport === 'Total Summary';
652
+ this.isTotalSummary = isTotalSummary;
653
+ const searchData = {
654
+ "StartDate": modal.fromDate,
655
+ "EndDate": modal.toDate,
656
+ "SendCountryCode": modal.sendCountry,
657
+ "RecvCountryCode": modal.receiveCountry,
658
+ "BusinessPartnerCode": modal.client,
659
+ "TransactionStatus": modal.transactionStatus.join(","),
660
+ "PayoutCurrency": modal.receiveCurrency,
661
+ "TransactionType": modal.product,
662
+ "BranchCode": modal.branch,
663
+ "SummaryReport": modal.summaryReport
664
+ };
665
+ this.showMessage = true;
666
+ this.clearSearch = true;
667
+ this.loadingState = ComponentLoadingStates.Loading;
668
+ this.reportService.getBranchActivitySendSummaryReport(searchData).subscribe({
669
+ next: (data) => {
670
+ console.log(data);
671
+ this.dataMap = JSON.parse(JSON.stringify(data));
672
+ this.filteredData = data;
673
+ this.noDataFound = Object.keys(this.filteredData).length == 0 ? true : false;
674
+ this.proxyData = structuredClone(data);
675
+ this.paginationArray = new Array(Object.keys(this.filteredData).length).fill(15);
676
+ this.showMessage = Object.keys(this.filteredData).length == 0 ? true : false;
677
+ this.showReport = true;
678
+ },
679
+ error: (err) => {
680
+ this.loadingState = ComponentLoadingStates.Complete;
681
+ this.clearSearch = false;
682
+ },
683
+ complete: () => {
684
+ this.loadingState = ComponentLoadingStates.Complete;
685
+ this.showReport = true;
686
+ this.clearSearch = false;
687
+ }
688
+ });
689
+ }
690
+ handleFormValid(isValid) {
691
+ this.isFormValid = isValid;
692
+ }
693
+ }
694
+ BranchActivitySendSummaryReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BranchActivitySendSummaryReportComponent, deps: [{ token: i1.ReportService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
695
+ BranchActivitySendSummaryReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BranchActivitySendSummaryReportComponent, selector: "lib-branch-activity-send-summary-report", ngImport: i0, template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\">\r\n</lib-search-filter >\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<section *ngIf=\"showReport && isFormValid && !clearSearch\" class=\"my-2\">\r\n <ng-container *ngIf=\"!noDataFound\">\r\n <lib-metadata [reportName]=\"ReportName\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\" [metaDataOne]=\"leftData\" [metaDataTwo]=\"metaDataTwo\"(exportEvent)=\"handleExport($event)\" (searchEvent)=\"filter($event)\"></lib-metadata>\r\n\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\">\r\n <ng-container *ngFor=\"let item of filteredData | keyvalue; let i = index\">\r\n <ngb-panel *ngIf=\"item.value.length > 0\" [id]=\"'panel-' + i\">\r\n\r\n <ng-template ngbPanelTitle style=\"height: 10%;\">\r\n <label\r\n class=\"panel-cls\">{{\r\n item.key\r\n }}</label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"item?.value?.length\"\r\n [defaultSize]=\"'15'\" [gridApi]=\"gridApis[i]\">\r\n ></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"width: 100%;height: 380px;\"\r\n [columnDefs]=\"columnDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [rowData]=\"item.value\" \r\n [rowHeight]=\"20\"\r\n [headerHeight]=\"22\"\r\n [pagination]=\"true\" \r\n [paginationPageSize]=\"paginationArray[i]\" \r\n [rowClassRules]=\"rowClassRules\"\r\n (gridReady)=\"onGridReady($event,i)\"\r\n >\r\n </ag-grid-angular>\r\n </div>\r\n </ng-template>\r\n\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n </ng-container>\r\n <div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound\">\r\n No Data found matching your search criteria.\r\n </div>\r\n</section>", styles: [".btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}.transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important;font-size:11px!important}\n"], dependencies: [{ kind: "component", type: i2.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.PageSizeSelectorComponent, selector: "lib-page-size-selector", inputs: ["pageSizeArray", "defaultSize", "totalEntries", "gridApi"] }, { kind: "component", type: i5.MetadataComponent, selector: "lib-metadata", inputs: ["metaDataOne", "metaDataTwo", "showmetaDataOne", "showmetaDataTwo", "reportName"], outputs: ["searchEvent", "exportEvent"] }, { kind: "component", type: i6.NgbAccordion, selector: "ngb-accordion", inputs: ["animation", "activeIds", "closeOthers", "destroyOnHide", "type"], outputs: ["panelChange", "shown", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i6.NgbPanel, selector: "ngb-panel", inputs: ["disabled", "id", "title", "type", "cardClass"], outputs: ["shown", "hidden"] }, { kind: "directive", type: i6.NgbPanelTitle, selector: "ng-template[ngbPanelTitle]" }, { kind: "directive", type: i6.NgbPanelContent, selector: "ng-template[ngbPanelContent]" }, { kind: "component", type: i7.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i8.SearchFilterComponent, selector: "lib-search-filter", inputs: ["ReportName", "initialFilters"], outputs: ["searchClicked", "formValid"] }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }] });
696
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BranchActivitySendSummaryReportComponent, decorators: [{
697
+ type: Component,
698
+ args: [{ selector: 'lib-branch-activity-send-summary-report', template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\">\r\n</lib-search-filter >\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<section *ngIf=\"showReport && isFormValid && !clearSearch\" class=\"my-2\">\r\n <ng-container *ngIf=\"!noDataFound\">\r\n <lib-metadata [reportName]=\"ReportName\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\" [metaDataOne]=\"leftData\" [metaDataTwo]=\"metaDataTwo\"(exportEvent)=\"handleExport($event)\" (searchEvent)=\"filter($event)\"></lib-metadata>\r\n\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\">\r\n <ng-container *ngFor=\"let item of filteredData | keyvalue; let i = index\">\r\n <ngb-panel *ngIf=\"item.value.length > 0\" [id]=\"'panel-' + i\">\r\n\r\n <ng-template ngbPanelTitle style=\"height: 10%;\">\r\n <label\r\n class=\"panel-cls\">{{\r\n item.key\r\n }}</label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"item?.value?.length\"\r\n [defaultSize]=\"'15'\" [gridApi]=\"gridApis[i]\">\r\n ></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"width: 100%;height: 380px;\"\r\n [columnDefs]=\"columnDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [rowData]=\"item.value\" \r\n [rowHeight]=\"20\"\r\n [headerHeight]=\"22\"\r\n [pagination]=\"true\" \r\n [paginationPageSize]=\"paginationArray[i]\" \r\n [rowClassRules]=\"rowClassRules\"\r\n (gridReady)=\"onGridReady($event,i)\"\r\n >\r\n </ag-grid-angular>\r\n </div>\r\n </ng-template>\r\n\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n </ng-container>\r\n <div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound\">\r\n No Data found matching your search criteria.\r\n </div>\r\n</section>", styles: [".btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}.transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important;font-size:11px!important}\n"] }]
699
+ }], ctorParameters: function () { return [{ type: i1.ReportService }, { type: i0.NgZone }]; } });
700
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmNoLWFjdGl2aXR5LXNlbmQtc3VtbWFyeS1yZXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0L2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydC9icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFrQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBaUIsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUUxRixnREFBZ0Q7QUFDaEQsb0ZBQW9GO0FBQ3BGLGdGQUFnRjtBQUNoRiw4RkFBOEY7QUFDOUYsOENBQThDO0FBQzlDLDZCQUE2QjtBQUM3Qiw0QkFBNEI7QUFDM0IsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7O0FBTzdDLE1BQU0sT0FBTyx3Q0FBd0M7SUFzRm5ELFlBQW9CLGFBQTRCLEVBQVUsTUFBYztRQUFwRCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLFdB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O2tCQUxwRCxTQUFTOytCQUNFLHlDQUF5QyIsInNvdXJjZXNDb250ZW50IjpbIiBpbXBvcnQgeyBDb21wb25lbnQsIE5nWm9uZSwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuIC8vIGltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuIGltcG9ydCB7IENvbERlZiwgR3JpZEFwaSwgR3JpZFJlYWR5RXZlbnQgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcbiBpbXBvcnQgeyB0aGVtZUFscGluZSB9IGZyb20gJ0BhZy1ncmlkLWNvbW11bml0eS90aGVtaW5nJztcclxuaW1wb3J0IHsgQnJhbmNoQWN0aXZpdHlSZXBvcnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvYnJhbmNoLWFjdGl2aXR5LXJlcG9ydC9icmFuY2gtYWN0aXZpdHktc2VuZC1yZXBvcnQnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkaW5nU3RhdGVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbXBvbmVudC1sb2FkaW5nLXN0YXRlcyc7XHJcbmltcG9ydCB7IEV4cG9ydE9wdGlvbnMsIEdlbmVyaWNFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2V4cG9ydC1nZW5lcmljLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuLy8gaW1wb3J0IHsgQ29tcG9uZW50TG9hZGluZ1N0YXRlcyB9IGZyb20gJ3NyYy9hcHAvbW9kZWxzL2NvbXBvbmVudC1sb2FkaW5nLXN0YXRlcyc7XHJcbi8vIGltcG9ydCB7IEdlbmVyaWNFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnc3JjL2FwcC9zaGFyZWQvZXhwb3J0LWdlbmVyaWMuc2VydmljZSc7XHJcbi8vIGltcG9ydCB7IEV4cG9ydE9wdGlvbnMgfSBmcm9tICdwcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL3NoYXJlZC9leHBvcnQtZ2VuZXJpYy5zZXJ2aWNlJztcclxuLy8gaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG4vLyBpbXBvcnQganNQREYgZnJvbSAnanNwZGYnO1xyXG4vLyBpbXBvcnQgJ2pzcGRmLWF1dG90YWJsZSc7XHJcbiBpbXBvcnQgKiBhcyBFeGNlbEpTIGZyb20gJ2V4Y2VsanMnO1xyXG4gaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWJyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYnJhbmNoLWFjdGl2aXR5LXNlbmQtc3VtbWFyeS1yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEJyYW5jaEFjdGl2aXR5U2VuZFN1bW1hcnlSZXBvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGRhdGFNYXA6IFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVwb3J0W10+ID0ge31cclxuICBmaWx0ZXJlZERhdGE6IFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVwb3J0W10+ID0ge31cclxuICBwcm94eURhdGE6IFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVwb3J0W10+ID0ge31cclxuICBzaG93UmVwb3J0OiBib29sZWFuO1xyXG4gIHBhZ2luYXRpb25BcnJheTogYW55W107XHJcbiAgc2VsZWN0ZWRFeHBvcnRPcHRpb24gPSAnZXhjZWwnO1xyXG4gIGdyaWRBcGlzOiBHcmlkQXBpW10gPSBbXTtcclxuICBncmlkQ29sdW1uQXBpO1xyXG4gIHVzZXI6IHN0cmluZyA9IFwiXCI7XHJcbiAgcmVwb3J0RGF0ZTogc3RyaW5nO1xyXG4gIGZyb21EYXRlOiBzdHJpbmc7XHJcbiAgdG9EYXRlOiBzdHJpbmc7XHJcbiAgc2VhcmNoVGV4dDogc3RyaW5nO1xyXG4gIGJ1ZmZlcjogYW55O1xyXG4gIHN5c1VzZXJJZDogc3RyaW5nO1xyXG4gIHByaXZhdGUgbG9nb0Jhc2U2NDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIENvbXBvbmVudExvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXM7XHJcbiAgbG9hZGluZ1N0YXRlOiBDb21wb25lbnRMb2FkaW5nU3RhdGVzID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Mb2FkaW5nO1xyXG4gIFJlcG9ydE5hbWU6IHN0cmluZyA9IFwiQnJhbmNoIEFjdGl2aXR5IFNlbmQgU3VtbWFyeVwiO1xyXG4gIGxlZnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIG1ldGFEYXRhVHdvOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIGV4cG9ydFNlcnZpY2U6IEdlbmVyaWNFeHBvcnRTZXJ2aWNlID0gaW5qZWN0KEdlbmVyaWNFeHBvcnRTZXJ2aWNlKTtcclxuICBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gW107XHJcblxyXG4gIC8vIGZsYWdzXHJcbiAgc2hvd01lc3NhZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBub0RhdGFGb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzRm9ybVZhbGlkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2xlYXJTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1RvdGFsU3VtbWFyeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvbHVtbkRlZnM6IENvbERlZjxCcmFuY2hBY3Rpdml0eVJlcG9ydD5bXSA9IFtcclxuXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAnYnVzaW5lc3NEYXRlVGltZScsIGhlYWRlck5hbWU6ICdCdXNpbmVzcyBEYXRlJywgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIGhlYWRlckNsYXNzOiAnYWctbGVmdC1hbGlnbmVkLWhlYWRlcicsIG1pbldpZHRoOiA3MCwgd2lkdGg6IDcwLCB0b29sdGlwRmllbGQ6ICdidXNpbmVzc0RhdGVUaW1lJyxcclxuICAgICAgdmFsdWVGb3JtYXR0ZXI6IChwYXJhbXMpID0+IHtcclxuICAgICAgICBjb25zdCByb3cgPSBwYXJhbXMuZGF0YSBhcyBCcmFuY2hBY3Rpdml0eVJlcG9ydCB8IG51bGw7XHJcblxyXG4gICAgICAgIGlmIChyb3cgJiYgcm93LnBheWluQ0Njb2RlID09PSAnVG90YWwnKSB7XHJcbiAgICAgICAgICByZXR1cm4gJyc7IC8vIGhpZGUgZGF0ZSBmb3IgdG90YWwgcm93XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcGFyYW1zLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgeyBmaWVsZDogJ3Byb2R1Y3QnLCBoZWFkZXJOYW1lOiAnUHJvZHVjdCcsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogODAsIHdpZHRoOiAxMjAsIHRvb2x0aXBGaWVsZDogJ3Byb2R1Y3QnIH0sXHJcbiAgICB7IGZpZWxkOiAncGF5b3V0Q0Njb2RlJywgaGVhZGVyTmFtZTogJ1JlY2VpdmUgQ3VycmVuY3knLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDkwLCB3aWR0aDogMTEwLCB0b29sdGlwRmllbGQ6ICdwYXlvdXRDQ2NvZGUnIH0sXHJcbiAgICB7IGZpZWxkOiAncGF5b3V0QW1vdW50JywgaGVhZGVyTmFtZTogJ1JlY2VpdmUgQW1vdW50JywgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIG1pbldpZHRoOiA5MCwgbWF4V2lkdGg6IDEyMCwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3BheW91dEFtb3VudCcgfSxcclxuICAgIHsgZmllbGQ6ICdwYXlpbkNDY29kZScsIGhlYWRlck5hbWU6ICdTZW5kIEN1cnJlbmN5JywgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIG1pbldpZHRoOiA5MCwgbWF4V2lkdGg6IDkwLCB0b29sdGlwRmllbGQ6ICdwYXlpbkNDY29kZScgfSxcclxuICAgIHsgZmllbGQ6ICdwYXlpbkFtb3VudCcsIGhlYWRlck5hbWU6ICdTZW5kIEFtb3VudCcsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogODAsIG1heFdpZHRoOiAxMjAsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCBjb21wYWN0LWNlbGwnLCB0b29sdGlwRmllbGQ6ICdwYXlpbkFtb3VudCcgfSxcclxuICAgIHsgZmllbGQ6ICd0cmFuc2FjdGlvbkNvbW1pc3Npb25BbW91bnQnLCBoZWFkZXJOYW1lOiAnU2VydmljZSBGZWUnLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDkwLCBtYXhXaWR0aDogMTAwLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwgY29tcGFjdC1jZWxsJywgdG9vbHRpcEZpZWxkOiAndHJhbnNhY3Rpb25Db21taXNzaW9uQW1vdW50JyB9LFxyXG4gICAgeyBmaWVsZDogJ3RheCcsIGhlYWRlck5hbWU6ICdUYXgnLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDgwLCBtYXhXaWR0aDogMTAwLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwgY29tcGFjdC1jZWxsJywgdG9vbHRpcEZpZWxkOiAndGF4JyB9LFxyXG4gICAgeyBmaWVsZDogJ3RvdGFsUGF5aW5BbW91bnQnLCBoZWFkZXJOYW1lOiAnVG90YWwgU2VuZCBBbW91bnQnLCBtaW5XaWR0aDogMTAwLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3RvdGFsUGF5aW5BbW91bnQnIH0sXHJcbiAgICB7IGZpZWxkOiAndHJhbnNhY3Rpb25Db3VudCcsIGhlYWRlck5hbWU6ICdUcmFuc2FjdGlvbiBDb3VudCcsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogODAsIG1heFdpZHRoOiAxMDAsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCBjb21wYWN0LWNlbGwnLCB0b29sdGlwRmllbGQ6ICd0eG5Db3VudCcgfSxcclxuICAgIHsgZmllbGQ6ICdzdGF0dXMnLCBoZWFkZXJOYW1lOiAnVHJhbnNhY3Rpb24gU3RhdHVzJywgbWluV2lkdGg6IDEwMCwgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIHRvb2x0aXBGaWVsZDogJ3N0YXR1cycgfVxyXG4gIF07XHJcblxyXG5cclxuICBkZWZhdWx0Q29sRGVmID0ge1xyXG4gICAgc29ydGFibGU6IHRydWUsXHJcbiAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICBtaW53aWR0aDogNDAsXHJcbiAgICB3cmFwSGVhZGVyVGV4dDogdHJ1ZSxcclxuICAgIGF1dG9IZWFkZXJIZWlnaHQ6IHRydWUsXHJcbiAgICBzdXBwcmVzc1NpemVUb0ZpdDogZmFsc2UsXHJcbiAgICB3cmFwVGV4dDogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIC8vIHJvd0NsYXNzUnVsZXMgPSB7XHJcbiAgLy8gICBkZWJ1Z2dlclxyXG4gIC8vICAgJ3RvdGFsLXJvdyc6IHBhcmFtcyA9PiBwYXJhbXMuZGF0YT8uaXNUb3RhbFJvd1xyXG4gIC8vIH07XHJcblxyXG4gIHJvd0NsYXNzUnVsZXMgPSB7XHJcbiAgICAndG90YWwtcm93JzogKHBhcmFtcykgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnUm93IERhdGE6JywgcGFyYW1zLmRhdGEuaXNUb3RhbFJvdyk7XHJcbiAgICAgIGlmIChwYXJhbXMuZGF0YS5pc1RvdGFsUm93KSB7XHJcbiAgICAgICAgcmV0dXJuIHBhcmFtcy5kYXRhPy5pc1RvdGFsUm93O1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJvd0RhdGE6IEJyYW5jaEFjdGl2aXR5UmVwb3J0W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZXBvcnRTZXJ2aWNlOiBSZXBvcnRTZXJ2aWNlLCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7IH1cclxuXHJcbiAgcmVwb3J0VGhlbWUgPSB0aGVtZUFscGluZS53aXRoUGFyYW1zKHtcclxuICAgIGhlYWRlckZvbnRTaXplOiAnMTBweCcsXHJcbiAgICBmb250RmFtaWx5OiBbJ0FyaWFsJywgJ3NhbnMtc2VyaWYnXSxcclxuICAgIGZvbnRTaXplOiAnOXB4J1xyXG4gIH0pO1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgIC8vIENoZWNrIGlmIFVzZXIgaXMgZmFsY29uIHVzZXIgb3IgZm9zc2lsVXNlclxyXG4gICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvc3NpbHVzZXJuYW1lJykpIHtcclxuICAgICAgdGhpcy5zeXNVc2VySWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3NzaWx1c2VybmFtZScpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zeXNVc2VySWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdlenJlbWl0dXNlcm5hbWUnKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3lzVXNlcklkID0gdGhpcy5zeXNVc2VySWQucmVwbGFjZSgvXltcIiddKC4qKVtcIiddJC8sICckMScpO1xyXG4gICAgdGhpcy51c2VyID0gdGhpcy5zeXNVc2VySWQ7XHJcbiAgICBjb25zb2xlLmxvZyhcIlN5c3RlbSBVc2VyIElkIDogXCIgKyB0aGlzLnN5c1VzZXJJZCk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXIodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB0ZXh0O1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlYXJjaFRleHQ/Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLmRhdGFNYXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaFRleHQ/LnRyaW0oKT8udG9Mb3dlckNhc2UoKTtcclxuICAgIGZvciAoY29uc3QgW2tleSwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wcm94eURhdGEpKSB7XHJcbiAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGVudHJpZXMuZmlsdGVyKGVudHJ5ID0+IE9iamVjdC52YWx1ZXMoZW50cnkpXHJcbiAgICAgICAgLnNvbWUodmFsID0+IHtcclxuICAgICAgICAgIGxldCBhOiBzdHJpbmcgPSB2YWw/LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgIGlmKGEgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBhPy5zZWFyY2godGhpcy5zZWFyY2hUZXh0KSA9PSAtMSA/IGZhbHNlIDogdHJ1ZTtcclxuICAgICAgICB9KSlcclxuXHJcbiAgICAgIHRoaXMuZmlsdGVyZWREYXRhW2tleV0gPSBmaWx0ZXJlZERhdGE7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZpbHRlcmVkRGF0YTtcclxuICB9XHJcblxyXG4gIG9uR3JpZFJlYWR5KHBhcmFtczogR3JpZFJlYWR5RXZlbnQsIGlkOiBudW1iZXIpIHtcclxuICAgIHBhcmFtcy5hcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gICAgdGhpcy5ncmlkQ29sdW1uQXBpID0gcGFyYW1zLmNvbHVtbkFwaTtcclxuICAgIHRoaXMuZ3JpZEFwaXNbaWRdID0gcGFyYW1zLmFwaTtcclxuICAgIHBhcmFtcy5jb2x1bW5BcGkuc2V0Q29sdW1uVmlzaWJsZSgnYnVzaW5lc3NEYXRlVGltZScsICF0aGlzLmlzVG90YWxTdW1tYXJ5KTtcclxuICAgIHBhcmFtcy5hcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXhwb3J0KG9wdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uID0gb3B0aW9uO1xyXG4gICAgaWYgKCF0aGlzLmhhc0FueUdyb3VwcygpKSB7XHJcbiAgICAgIGFsZXJ0KFwiVGhlcmUgaXMgbm8gZGF0YSB0byBleHBvcnQgYmFzZWQgb24geW91ciBjdXJyZW50IGZpbHRlci5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIElmIG5vIGRhdGEsIGRvIG5vdGhpbmcuXHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWREYXRhIHx8IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWREYXRhKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgYWxlcnQoXCJObyBkYXRhIHRvIGV4cG9ydFwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGl0bGUgPSBcIkJyYW5jaCBBY3Rpdml0eSBTZW5kIFN1bW1hcnlcIjtcclxuICAgIGNvbnN0IHJlcG9ydFRpbWVGb3JtYXR0ZXIgPSB0aGlzLmRhdGVWYWx1ZUZvcm1hdHRlcignZGQvTU0veXl5eSBoaDptbSBhJyk7XHJcbiAgICBjb25zdCBtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICBbJ1JlcG9ydCBQZXJpb2QgJywgdGhpcy5mcm9tRGF0ZSArIFwiIC0gXCIgKyB0aGlzLnRvRGF0ZV0sXHJcbiAgICAgIFsnUmVwb3J0IFVzZXIgJiBUaW1lJywgdGhpcy51c2VyID8gdGhpcy51c2VyICsgXCIgQCBcIiArIHRoaXMucmVwb3J0RGF0ZSA6ICcnICsgXCIgQCBcIiArIHRoaXMucmVwb3J0RGF0ZV0sXHJcbiAgICBdO1xyXG4gICAgLy8gLS0tIHNlYXJjaCBjcml0ZXJpYSAtLS1cclxuICAgIGNvbnN0IHNlYXJjaENyaXRlcmlhOiBbc3RyaW5nLCBzdHJpbmddW10gPSB0aGlzLnNlYXJjaENyaXRlcmlhO1xyXG4gICAgLy9jb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5EZWZzO1xyXG5cclxuICAgIC8vZXhjbHVkZSBCdXNpbmVzcyBEYXRlIGNvbCBmb3IgVG90YWwgU3VtbWFyeSBSZXBvcnQuXHJcbiAgICBsZXQgY29sdW1ucyA9IFsuLi50aGlzLmNvbHVtbkRlZnNdO1xyXG4gICAgY29uc3Qgc3VtbWFyeVJlcG9ydCA9IHRoaXMuc2VhcmNoQ3JpdGVyaWEuZmluZCh4ID0+IHhbMF0gPT09ICdTdW1tYXJ5IFJlcG9ydDonKT8uWzFdO1xyXG4gICAgIFxyXG4gICAgaWYgKHN1bW1hcnlSZXBvcnQgPT09ICdUb3RhbCBTdW1tYXJ5Jykge1xyXG4gICAgICBjb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5maWVsZCAhPT0gJ2J1c2luZXNzRGF0ZVRpbWUnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb25zdCBkYXRhID0gdGhpcy5kYXRhTWFwO1xyXG4gICAgY29uc3QgY2xlYW5lZERhdGEgPSB7fTtcclxuXHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLmRhdGFNYXApLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgY2xlYW5lZERhdGFba2V5XSA9IHRoaXMuZGF0YU1hcFtrZXldLm1hcChyb3cgPT4ge1xyXG4gICAgICAgIGlmIChyb3cuaXNUb3RhbFJvdykge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICBidXNpbmVzc0RhdGVUaW1lOiAnJyxcclxuICAgICAgICAgICAgcHJvZHVjdDogJycsXHJcbiAgICAgICAgICAgIHJlY2VpdmVDdXJyZW5jeTogJycsXHJcbiAgICAgICAgICAgIHJlY2VpdmVBbW91bnQ6ICcnXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcm93O1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGRhdGEgPSBjbGVhbmVkRGF0YTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIGN1cnJlbmN5RmllbGRzOiBbXHJcbiAgICAgICAgJ3BheW91dEFtb3VudCcsICdwYXlpbkFtb3VudCcsICd0cmFuc2FjdGlvbkNvbW1pc3Npb25BbW91bnQnLCAndGF4JywgJ3RvdGFsUGF5aW5BbW91bnQnXHJcbiAgICAgIF0sXHJcbiAgICAgIC8vIHNwZWNpZnkgYWxsIGRhdGUgZmllbGRzIGV4cGVjdGVkXHJcbiAgICAgIGRhdGVGaWVsZHM6IFtdLFxyXG5cclxuICAgICAgZGF0ZUZpZWxkRm9ybWF0czoge1xyXG4gICAgICAgIHR4bkRhdGVBbmRUaW1lOiAnZGQvTU0veXl5eSBoaDptbSBhJyxcclxuICAgICAgICBjYW5jZWxsYXRpb25CcmFuY2hEYXRlVGltZTogJ2RkL01NL3l5eXkgSEg6bW0nLFxyXG4gICAgICAgIGNhbmNlbGxhdGlvbkJ1c2luZXNzRGF0ZTogJ2RkL01NL3l5eXknXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBzcGVjaWFsRGVjaW1hbEZpZWxkczoge1xyXG4gICAgICAgIHJhdGU6IDggICAgICAgLy8gZnV0dXJlIGZpZWxkIHdpdGggOCBkZWNpbWFsIHBsYWNlc1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgZ3JvdXBCeUtleTogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRFeHBvcnRPcHRpb24pIHtcclxuICAgICAgY2FzZSAnZXhjZWwnOlxyXG4gICAgICAgIHRoaXMuZXhwb3J0VG9FeGNlbCh7IHRpdGxlLCBtZXRhZGF0YSwgc2VhcmNoQ3JpdGVyaWEsIGNvbHVtbnMsIGRhdGEsIG9wdGlvbnMgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3BkZic6XHJcbiAgICAgICAgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydFRvUGRmKHsgdGl0bGUsIG1ldGFkYXRhLCBzZWFyY2hDcml0ZXJpYSwgY29sdW1ucywgZGF0YSwgb3B0aW9ucyB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY3N2JzpcclxuICAgICAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0VG9Dc3YoeyB0aXRsZSwgbWV0YWRhdGEsIHNlYXJjaENyaXRlcmlhLCBjb2x1bW5zLCBkYXRhLCBvcHRpb25zIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGFsZXJ0KFwiUGxlYXNlIHNlbGVjdCBhbiBleHBvcnQgZm9ybWF0LlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGV4cG9ydFRvRXhjZWwoe1xyXG4gICAgdGl0bGUsXHJcbiAgICBtZXRhZGF0YSxcclxuICAgIHNlYXJjaENyaXRlcmlhLFxyXG4gICAgY29sdW1ucyxcclxuICAgIGRhdGEsXHJcbiAgICBvcHRpb25zID0ge31cclxuICB9OiB7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgbWV0YWRhdGE6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuICAgIHNlYXJjaENyaXRlcmlhOiBbc3RyaW5nLCBzdHJpbmddW107XHJcbiAgICBjb2x1bW5zOiBhbnlbXTtcclxuICAgIGRhdGE6IGFueVtdIHwgUmVjb3JkPHN0cmluZywgYW55W10+O1xyXG4gICAgb3B0aW9ucz86IEV4cG9ydE9wdGlvbnM7XHJcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGNvbnN0IHdvcmtib29rID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldCh0aXRsZSk7XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IFBSRSBDQUxDID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgY29uc3QgaGVhZGVyTGFiZWxzID0gWydTciBObycsIC4uLmNvbHVtbnMubWFwKGNvbCA9PiBjb2wuaGVhZGVyTmFtZSB8fCBjb2wuZmllbGQpXTtcclxuICAgIGNvbnN0IHRvdGFsQ29scyA9IGhlYWRlckxhYmVscy5sZW5ndGg7XHJcblxyXG4gICAgY29uc3QgdGl0bGVTdGFydENvbCA9IDQ7XHJcbiAgICBjb25zdCB0aXRsZUNvbExldHRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNjQgKyB0aXRsZVN0YXJ0Q29sKTtcclxuICAgIGNvbnN0IHRpdGxlTWVyZ2VFbmQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDY0ICsgdG90YWxDb2xzKTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gTE9HTyA9PT09PT09PT09PT09PT09PT09PT1cclxuICAgIGlmICh0aGlzLmxvZ29CYXNlNjQpIHtcclxuICAgICAgY29uc3QgYmFzZTY0RGF0YSA9IHRoaXMubG9nb0Jhc2U2NC5yZXBsYWNlKC9eZGF0YTppbWFnZVxcL1xcdys7YmFzZTY0LC8sICcnKTtcclxuXHJcbiAgICAgIGNvbnN0IGltYWdlSWQgPSB3b3JrYm9vay5hZGRJbWFnZSh7XHJcbiAgICAgICAgYmFzZTY0OiBiYXNlNjREYXRhLFxyXG4gICAgICAgIGV4dGVuc2lvbjogJ3BuZycsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgd29ya3NoZWV0LmFkZEltYWdlKGltYWdlSWQsIHtcclxuICAgICAgICB0bDogeyBjb2w6IDAsIHJvdzogMCB9LFxyXG4gICAgICAgIGV4dDogeyB3aWR0aDogMTQ1LCBoZWlnaHQ6IDY2IH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB3b3Jrc2hlZXQuZ2V0Um93KDEpLmhlaWdodCA9IDI0O1xyXG4gICAgICB3b3Jrc2hlZXQuZ2V0Um93KDIpLmhlaWdodCA9IDIyO1xyXG4gICAgICB3b3Jrc2hlZXQuZ2V0Um93KDMpLmhlaWdodCA9IDIyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBUSVRMRSA9PT09PT09PT09PT09PT09PT09PT1cclxuICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKGAke3RpdGxlQ29sTGV0dGVyfTE6JHt0aXRsZU1lcmdlRW5kfTFgKTtcclxuICAgIGNvbnN0IHRpdGxlQ2VsbCA9IHdvcmtzaGVldC5nZXRSb3coMSkuZ2V0Q2VsbCh0aXRsZVN0YXJ0Q29sKTtcclxuICAgIHRpdGxlQ2VsbC52YWx1ZSA9IHRpdGxlO1xyXG4gICAgdGl0bGVDZWxsLmZvbnQgPSB7IGJvbGQ6IHRydWUsIHNpemU6IDE2IH07XHJcbiAgICB0aXRsZUNlbGwuYWxpZ25tZW50ID0geyB2ZXJ0aWNhbDogJ21pZGRsZScsIGhvcml6b250YWw6ICdsZWZ0JyB9O1xyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBNRVRBREFUQSA9PT09PT09PT09PT09PT09PT09PT1cclxuICAgIGxldCBtZXRhUm93U3RhcnQgPSA0O1xyXG5cclxuICAgIG1ldGFkYXRhLmZvckVhY2goKFtsYWJlbCwgdmFsdWVdLCBpZHgpID0+IHtcclxuICAgICAgY29uc3Qgcm93ID0gd29ya3NoZWV0LmdldFJvdyhtZXRhUm93U3RhcnQgKyBpZHgpO1xyXG5cclxuICAgICAgcm93LmdldENlbGwoMSkudmFsdWUgPSB7XHJcbiAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgIHsgdGV4dDogYCR7bGFiZWx9IDogYCwgZm9udDogeyBib2xkOiB0cnVlIH0gfSxcclxuICAgICAgICAgIHsgdGV4dDogdmFsdWUgPz8gJycsIGZvbnQ6IHsgYm9sZDogZmFsc2UgfSB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMoYEEke3Jvdy5udW1iZXJ9OiR7dGl0bGVNZXJnZUVuZH0ke3Jvdy5udW1iZXJ9YCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgY3VycmVudFJvdyA9IG1ldGFSb3dTdGFydCArIG1ldGFkYXRhLmxlbmd0aDtcclxuXHJcbiAgICB3b3Jrc2hlZXQuZ2V0Um93KCsrY3VycmVudFJvdykuaGVpZ2h0ID0gNjtcclxuICAgIGN1cnJlbnRSb3crKztcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU0VBUkNIIENSSVRFUklBID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMoY3VycmVudFJvdywgMSwgY3VycmVudFJvdywgNik7XHJcbiAgICB3b3Jrc2hlZXQuZ2V0Q2VsbChjdXJyZW50Um93LCAxKS52YWx1ZSA9ICdTZWFyY2ggQ3JpdGVyaWE6LSc7XHJcbiAgICB3b3Jrc2hlZXQuZ2V0Q2VsbChjdXJyZW50Um93LCAxKS5mb250ID0geyBib2xkOiB0cnVlIH07XHJcbiAgICBjdXJyZW50Um93ICs9IDI7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWFyY2hDcml0ZXJpYS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgICBjb25zdCBsZWZ0ID0gc2VhcmNoQ3JpdGVyaWFbaV07XHJcbiAgICAgIGNvbnN0IHJpZ2h0ID0gc2VhcmNoQ3JpdGVyaWFbaSArIDFdO1xyXG5cclxuICAgICAgY29uc3Qgcm93ID0gd29ya3NoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG5cclxuICAgICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMocm93Lm51bWJlciwgMSwgcm93Lm51bWJlciwgMyk7XHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6IChsZWZ0Py5bMF0gPz8gJycpICsgJyAnLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LFxyXG4gICAgICAgICAgeyB0ZXh0OiBsZWZ0Py5bMV0gPz8gJycgfVxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuICAgICAgcm93LmdldENlbGwoMSkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogdHJ1ZSwgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcblxyXG4gICAgICBpZiAocmlnaHQpIHtcclxuICAgICAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhyb3cubnVtYmVyLCA0LCByb3cubnVtYmVyLCA2KTtcclxuICAgICAgICByb3cuZ2V0Q2VsbCg0KS52YWx1ZSA9IHtcclxuICAgICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICAgIHsgdGV4dDogKHJpZ2h0Py5bMF0gPz8gJycpICsgJyAnLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LFxyXG4gICAgICAgICAgICB7IHRleHQ6IHJpZ2h0Py5bMV0gPz8gJycgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcm93LmdldENlbGwoNCkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogdHJ1ZSwgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50Um93Kys7XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IEhFQURFUiBST1cgPT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBjb25zdCBoZWFkZXJSb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KGN1cnJlbnRSb3crKyk7XHJcblxyXG4gICAgaGVhZGVyTGFiZWxzLmZvckVhY2goKGhlYWRlciwgaSkgPT4ge1xyXG4gICAgICBjb25zdCBjZWxsID0gaGVhZGVyUm93LmdldENlbGwoaSArIDEpO1xyXG4gICAgICBjZWxsLnZhbHVlID0gaGVhZGVyO1xyXG4gICAgICBjZWxsLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgICAgY2VsbC5maWxsID0ge1xyXG4gICAgICAgIHR5cGU6ICdwYXR0ZXJuJyxcclxuICAgICAgICBwYXR0ZXJuOiAnc29saWQnLFxyXG4gICAgICAgIGZnQ29sb3I6IHsgYXJnYjogJ0Q5RDlEOScgfVxyXG4gICAgICB9O1xyXG4gICAgICBjZWxsLmFsaWdubWVudCA9IHsgdmVydGljYWw6ICdtaWRkbGUnLCBob3Jpem9udGFsOiAnY2VudGVyJyB9O1xyXG4gICAgICBjZWxsLmJvcmRlciA9IHtcclxuICAgICAgICB0b3A6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgbGVmdDogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgcmlnaHQ6IHsgc3R5bGU6ICd0aGluJyB9XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIGhlYWRlclJvdy5lYWNoQ2VsbCgoY2VsbCkgPT4ge1xyXG4gICAgICBpZiAoY2VsbC52YWx1ZSA9PT0gJ1RyYW5zYWN0aW9uIENvdW50Jykge1xyXG4gICAgICAgIGNlbGwudmFsdWUgPSAnVHJhbnNhY3Rpb25cXG5Db3VudCc7XHJcbiAgICAgICAgY2VsbC5hbGlnbm1lbnQgPSB7XHJcbiAgICAgICAgICBob3Jpem9udGFsOiAnY2VudGVyJyxcclxuICAgICAgICAgIHZlcnRpY2FsOiAnbWlkZGxlJyxcclxuICAgICAgICAgIHdyYXBUZXh0OiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gREFUQSBTRUNUSU9OID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgbGV0IHJvd0lkeCA9IGN1cnJlbnRSb3c7XHJcbiAgICBsZXQgc2VyaWFsTnVtYmVyID0gMTtcclxuXHJcbiAgICBpZiAob3B0aW9ucy5ncm91cEJ5S2V5ICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IFtncm91cCwgaXRlbXNdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGdyb3VwUm93ID0gd29ya3NoZWV0LmdldFJvdyhyb3dJZHgrKyk7XHJcbiAgICAgICAgZ3JvdXBSb3cuZ2V0Q2VsbCgxKS52YWx1ZSA9IGdyb3VwO1xyXG4gICAgICAgIGdyb3VwUm93LmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgICAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhgQSR7Z3JvdXBSb3cubnVtYmVyfToke3RpdGxlTWVyZ2VFbmR9JHtncm91cFJvdy5udW1iZXJ9YCk7XHJcblxyXG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuXHJcbiAgICAgICAgICBjb25zdCByb3dEYXRhID0gdGhpcy5wcmVwYXJlVGFibGVSb3dzKFtpdGVtXSwgY29sdW1ucywgb3B0aW9ucylbMF07XHJcbiAgICAgICAgICBjb25zdCBkYXRhUm93ID0gd29ya3NoZWV0LmdldFJvdyhyb3dJZHgrKyk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFJvdyA9IFtcclxuICAgICAgICAgICAgIWl0ZW0/LmlzVG90YWxSb3cgPyBzZXJpYWxOdW1iZXIrKyA6ICcnLFxyXG4gICAgICAgICAgICAuLi5yb3dEYXRhXHJcbiAgICAgICAgICBdO1xyXG5cclxuICAgICAgICAgIGZ1bGxSb3cuZm9yRWFjaCgodmFsLCBjSWR4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkYXRhUm93LmdldENlbGwoY0lkeCArIDEpO1xyXG4gICAgICAgICAgICAvLyAgIGNlbGwudmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICAgIC8vYWRkZWQgYnkgYmhhcmF0aSBmb3IgXHJcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uc1tjSWR4IC0gMV0/LmZpZWxkO1xyXG5cclxuICAgICAgICAgICAgLy8g4pyFIEFtb3VudCBmaWVsZHMgKFJlY2VpdmUgQW1vdW50LCBTZW5kIEFtb3VudCwgVG90YWwgU2VuZCBBbW91bnQgZXRjLilcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIGZpZWxkPT0ndG90YWxQYXlpbkFtb3VudCd8fFxyXG4gICAgICAgICAgICAgIGZpZWxkPT0ncGF5aW5BbW91bnQnfHxcclxuICAgICAgICAgICAgICBmaWVsZCA9PT0gJ3RyYW5zYWN0aW9uQ29tbWlzc2lvbkFtb3VudCcgfHxcclxuICAgICAgICAgICAgICBmaWVsZCA9PT0gJ3RheCdcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgIT09ICcnICYmIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IE51bWJlcih2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5udW1GbXQgPSAnIywjIzAuMDAwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgfSAqL1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0/LmlzVG90YWxSb3cgJiYgZmllbGQgPT09ICdyZWNlaXZlQW1vdW50Jykge1xyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgICAgICBmaWVsZD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYW1vdW50JykgfHxcclxuICAgICAgICAgICAgICBmaWVsZCA9PT0gJ3NlcnZpY2VGZWUnIHx8XHJcbiAgICAgICAgICAgICAgZmllbGQgPT09ICd0YXgnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGlmICh2YWwgIT09ICcnICYmIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDsgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBudW1iZXJcclxuICAgICAgICAgICAgICAgIGNlbGwubnVtRm10ID0gJyMsIyMwLjAwMCc7ICAgICAgIC8vIEV4Y2VsIGZvcm1hdHRpbmdcclxuICAgICAgICAgICAgICAgIGNlbGwuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNlbGwuYm9yZGVyID0ge1xyXG4gICAgICAgICAgICAgIHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgICAgICAgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICAgICAgICBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICAgICAgICByaWdodDogeyBzdHlsZTogJ3RoaW4nIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGlmIChpdGVtPy5pc1RvdGFsUm93KSB7XHJcbiAgICAgICAgICAgIGRhdGFSb3cuZWFjaENlbGwoY2VsbCA9PiB7XHJcbiAgICAgICAgICAgICAgIGNlbGwuZm9udCA9IHtcclxuICAgICAgICAgICAgICAgIC4uLmNlbGwuZm9udCxcclxuICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaXplOiAxMlxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIHRoaXMucHJlcGFyZVRhYmxlUm93cyhkYXRhIGFzIGFueVtdLCBjb2x1bW5zLCBvcHRpb25zKVxyXG4gICAgICAgIC5mb3JFYWNoKChyb3dEYXRhLCBpbmRleCkgPT4ge1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRhdGFSb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KHJvd0lkeCsrKTtcclxuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSXRlbSA9IChkYXRhIGFzIGFueVtdKVtpbmRleF07XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFJvdyA9IFtcclxuICAgICAgICAgICAgIW9yaWdpbmFsSXRlbT8uaXNUb3RhbFJvdyA/IHNlcmlhbE51bWJlcisrIDogJycsXHJcbiAgICAgICAgICAgIC4uLnJvd0RhdGFcclxuICAgICAgICAgIF07XHJcblxyXG4gICAgICAgICAgZnVsbFJvdy5mb3JFYWNoKCh2YWwsIGNJZHgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGRhdGFSb3cuZ2V0Q2VsbChjSWR4ICsgMSk7XHJcbiAgICAgICAgICAgIC8vY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgLyogICBpZiAoY0lkeCA9PT0gMCkge1xyXG4gY2VsbC52YWx1ZSA9IHZhbDtcclxufSBlbHNlIHtcclxuXHJcbiBjb25zdCBmaWVsZCA9IGNvbHVtbnNbY0lkeCAtIDFdPy5maWVsZDtcclxuXHJcbiBpZiAoXHJcbiAgICAgZmllbGQ9PSd0b3RhbFBheWluQW1vdW50J3x8XHJcbiAgICAgZmllbGQ9PSdwYXlpbkFtb3VudCd8fFxyXG4gICAgIGZpZWxkID09PSAndHJhbnNhY3Rpb25Db21taXNzaW9uQW1vdW50JyB8fFxyXG4gICAgIGZpZWxkID09PSAndGF4J1xyXG4gKSB7XHJcbiAgICAgY2VsbC52YWx1ZSA9IE51bWJlcih2YWwpO1xyXG4gICAgIGNlbGwubnVtRm10ID0gJyMsIyMwLjAwMCc7XHJcbiAgICAgY2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gfVxyXG4gZWxzZSB7XHJcbiAgICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuIH1cclxufSAqL1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW5zW2NJZHggLSAxXT8uZmllbGQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoY0lkeCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAob3JpZ2luYWxJdGVtPy5pc1RvdGFsUm93ICYmIGZpZWxkID09PSAncmVjZWl2ZUFtb3VudCcpIHtcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgZmllbGQ/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2Ftb3VudCcpIHx8XHJcbiAgICAgICAgICAgICAgZmllbGQgPT09ICdzZXJ2aWNlRmVlJyB8fFxyXG4gICAgICAgICAgICAgIGZpZWxkID09PSAndGF4J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBpZiAodmFsICE9PSAnJyAmJiB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNlbGwudmFsdWUgPSB2YWw7ICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgbnVtYmVyXHJcbiAgICAgICAgICAgICAgICBjZWxsLm51bUZtdCA9ICcjLCMjMC4wMDAnOyAgICAgICAvLyBFeGNlbCBmb3JtYXR0aW5nXHJcbiAgICAgICAgICAgICAgICBjZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JywgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNlbGwudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2VsbC5ib3JkZXIgPSB7XHJcbiAgICAgICAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICAgICAgICBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgICAgIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbT8uaXNUb3RhbFJvdykge1xyXG4gICAgICAgICAgICBkYXRhUm93LmVhY2hDZWxsKGNlbGwgPT4ge1xyXG4gICAgICAgICAgICAgICBjZWxsLmZvbnQgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5jZWxsLmZvbnQsXHJcbiAgICAgICAgICAgICAgICBib2xkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogMTJcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gQVVUTyBXSURUSCA9PT09PT09PT09PT09PT09PT09PT1cclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRvdGFsQ29sczsgaSsrKSB7XHJcbiAgICAgIGxldCBtYXhMZW5ndGggPSAxMDtcclxuXHJcbiAgICAgIHdvcmtzaGVldC5lYWNoUm93KHsgaW5jbHVkZUVtcHR5OiB0cnVlIH0sIChyb3cpID0+IHtcclxuICAgICAgICBjb25zdCBjZWxsID0gcm93LmdldENlbGwoaSk7XHJcbiAgICAgICAgaWYgKGNlbGwuaXNNZXJnZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNlbGxWYWx1ZSA9ICcnO1xyXG5cclxuICAgICAgICBpZiAoY2VsbC52YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBjZWxsVmFsdWUgPSAnJztcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjZWxsLnZhbHVlID09PSAnb2JqZWN0JyAmJiAncmljaFRleHQnIGluIGNlbGwudmFsdWUpIHtcclxuICAgICAgICAgIGNlbGxWYWx1ZSA9IGNlbGwudmFsdWUucmljaFRleHQubWFwKHJ0ID0+IHJ0LnRleHQpLmpvaW4oJycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjZWxsVmFsdWUgPSBjZWxsLnZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBtYXhMZW5ndGggPSBNYXRoLm1heChtYXhMZW5ndGgsIGNlbGxWYWx1ZS5sZW5ndGgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHdvcmtzaGVldC5nZXRDb2x1bW4oaSkud2lkdGggPSBNYXRoLm1pbihtYXhMZW5ndGgsIDUwKTtcclxuICAgIH1cclxuICAgIC8vbmV3IGNvZGU6YmhhcmF0aVxyXG5cclxuICAgIHdvcmtzaGVldC5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuXHJcbiAgICAgIGlmIChpbmRleCA9PT0gMCkgcmV0dXJuOyAvLyBza2lwIFNyIE5vXHJcblxyXG4gICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbnNbaW5kZXggLSAxXT8uZmllbGQ7XHJcblxyXG4gICAgICBpZiAoZmllbGQgPT09ICdwYXlpbkFtb3VudCcpIHtcclxuICAgICAgICBjb2x1bW4ud2lkdGggPSAxNDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZmllbGQgPT09ICdwYXlvdXRBbW91bnQnKSB7XHJcbiAgICAgICAgY29sdW1uLndpZHRoID0gMTU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZpZWxkID09PSAndHJhbnNhY3Rpb25Db3VudCcpIHtcclxuICAgICAgICBjb2x1bW4ud2lkdGggPSAxNDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gd29ya3NoZWV0LmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAvLyAgIGlmIChjb2x1bW4uaGVhZGVyID09PSAnU2VuZCBBbW91bnQnKSB7XHJcbiAgICAvLyAgICAgY29sdW1uLndpZHRoID0gMjU7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pO1xyXG5cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU0FWRSBGSUxFID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgd29ya2Jvb2sueGxzeC53cml0ZUJ1ZmZlcigpO1xyXG5cclxuICAgIEZpbGVTYXZlci5zYXZlQXMoXHJcbiAgICAgIG5ldyBCbG9iKFtidWZmZXJdLCB7XHJcbiAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0J1xyXG4gICAgICB9KSxcclxuICAgICAgdGl0bGUucmVwbGFjZSgvXFxzL2csICctJykgKyAnLnhsc3gnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gICBwcml2YXRlIHByZXBhcmVUYWJsZVJvd3MoZGF0YTogYW55W10sIGNvbHVtbnM6IGFueVtdLCBvcHRpb25zOiBFeHBvcnRPcHRpb25zID0ge30pOiBhbnlbXVtdIHtcclxuICAvLyAgICAgICAgICAgY29uc3Qge1xyXG4gIC8vICAgICAgICAgICAgICAgZXhjbHVkZUZpZWxkcyA9IFtdLFxyXG4gIC8vICAgICAgICAgICAgICAgY3VycmVuY3lGaWVsZHMgPSBbXSxcclxuICAvLyAgICAgICAgICAgICAgIGRhdGVGaWVsZHMgPSBbXSxcclxuICAvLyAgICAgICAgICAgICAgIGRhdGVGaWVsZEZvcm1hdHMgPSB7fSxcclxuICAvLyAgICAgICAgICAgICAgIHNwZWNpYWxEZWNpbWFsRmllbGRzID0ge31cclxuICAvLyAgICAgICAgICAgfSA9IG9wdGlvbnM7XHJcblxyXG4gIC8vICAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGNvbHVtbnMuZmlsdGVyKGMgPT5cclxuICAvLyAgICAgICAgICAgICAgIGMuZmllbGQgJiYgIWV4Y2x1ZGVGaWVsZHMuc29tZShmID0+IGMuZmllbGQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmKSlcclxuICAvLyAgICAgICAgICAgKTtcclxuXHJcbiAgLy8gICAgICAgICByZXR1cm4gZGF0YS5tYXAoKHJvdykgPT4gKFtcclxuICAvLyAuLi5maWx0ZXJlZC5tYXAoY29sID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSByb3dbY29sLmZpZWxkXTtcclxuICAvLyAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXQgZGF0ZSBmaWVsZHMgd2l0aCBjdXN0b20gZm9ybWF0cyBpZiBzcGVjaWZpZWRcclxuICAvLyAgICAgICAgICAgICAgICAgICBpZiAoY29sLmZpZWxkICYmIChkYXRlRmllbGRzLmluY2x1ZGVzKGNvbC5maWVsZCkgfHwgY29sLmZpZWxkIGluIGRhdGVGaWVsZEZvcm1hdHMpKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IGRhdGVGaWVsZEZvcm1hdHNbY29sLmZpZWxkXSB8fCAnZGQvTU0veXl5eSc7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5mb3JtYXREYXRlQnlGb3JtYXQodmFsdWUsIGZvcm1hdCk7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdCBzcGVjaWFsIGRlY2ltYWwgZmllbGRzIHdpdGggc3BlY2lmaWMgZGVjaW1hbHNcclxuICAvLyAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZmllbGQgJiYgY29sLmZpZWxkIGluIHNwZWNpYWxEZWNpbWFsRmllbGRzICYmIHZhbHVlICE9IG51bGwpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjaW1hbHMgPSBzcGVjaWFsRGVjaW1hbEZpZWxkc1tjb2wuZmllbGRdO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpLnRvRml4ZWQoZGVjaW1hbHMpO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXQgcmVndWxhciBjdXJyZW5jeSBmaWVsZHMgd2l0aCAzIGRlY2ltYWxzXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmZpZWxkICYmIGN1cnJlbmN5RmllbGRzLmluY2x1ZGVzKGNvbC5maWVsZCkgJiYgdmFsdWUgIT0gbnVsbCkge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpLnRvRml4ZWQoMyk7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAvLyAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPz8gJyc7XHJcbiAgLy8gICAgICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgICBdKSk7XHJcbiAgLy8gICAgICAgfVxyXG4gIHByaXZhdGUgcHJlcGFyZVRhYmxlUm93cyhcclxuICAgIGRhdGE6IGFueVtdLFxyXG4gICAgY29sdW1uczogYW55W10sXHJcbiAgICBvcHRpb25zOiBFeHBvcnRPcHRpb25zID0ge31cclxuICApOiBhbnlbXVtdIHtcclxuXHJcbiAgICBjb25zdCB7XHJcbiAgICAgIGV4Y2x1ZGVGaWVsZHMgPSBbXSxcclxuICAgICAgY3VycmVuY3lGaWVsZHMgPSBbXSxcclxuICAgICAgZGF0ZUZpZWxkcyA9IFtdLFxyXG4gICAgICBkYXRlRmllbGRGb3JtYXRzID0ge30sXHJcbiAgICAgIHNwZWNpYWxEZWNpbWFsRmllbGRzID0ge31cclxuICAgIH0gPSBvcHRpb25zO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkID0gY29sdW1ucy5maWx0ZXIoYyA9PlxyXG4gICAgICBjLmZpZWxkICYmICFleGNsdWRlRmllbGRzLnNvbWUoZiA9PiBjLmZpZWxkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZikpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBkYXRhLm1hcCgocm93KSA9PiAoW1xyXG4gICAgICAuLi5maWx0ZXJlZC5tYXAoY29sID0+IHtcclxuXHJcbiAgICAgICAgbGV0IHZhbHVlID0gcm93W2NvbC5maWVsZF07XHJcblxyXG4gICAgICAgIC8vIOKchSBEYXRlIGZvcm1hdHRpbmcgKGtlZXAgYXMgc3RyaW5nKVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNvbC5maWVsZCAmJlxyXG4gICAgICAgICAgKGRhdGVGaWVsZHMuaW5jbHVkZXMoY29sLmZpZWxkKSB8fCBjb2wuZmllbGQgaW4gZGF0ZUZpZWxkRm9ybWF0cylcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IGRhdGVGaWVsZEZvcm1hdHNbY29sLmZpZWxkXSB8fCAnZGQvTU0veXl5eSc7XHJcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZUJ5Rm9ybWF0KHZhbHVlLCBmb3JtYXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g4pyFIFNwZWNpYWwgZGVjaW1hbCBmaWVsZHMg4oaSIHJldHVybiBOVU1CRVIgKG5vIHRvRml4ZWQpXHJcbiAgICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgICBjb2wuZmllbGQgJiZcclxuICAgICAgICAgIGNvbC5maWVsZCBpbiBzcGVjaWFsRGVjaW1hbEZpZWxkcyAmJlxyXG4gICAgICAgICAgdmFsdWUgIT0gbnVsbFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g4pyFIEN1cnJlbmN5IGZpZWxkcyDihpIgcmV0dXJuIE5VTUJFUiAobm8gdG9GaXhlZClcclxuICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgIGNvbC5maWVsZCAmJlxyXG4gICAgICAgICAgY3VycmVuY3lGaWVsZHMuaW5jbHVkZXMoY29sLmZpZWxkKSAmJlxyXG4gICAgICAgICAgdmFsdWUgIT0gbnVsbFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlID8/ICcnO1xyXG4gICAgICB9KVxyXG4gICAgXSkpO1xyXG4gIH1cclxuICBwcml2YXRlIGZvcm1hdERhdGVCeUZvcm1hdCh2YWw6IGFueSwgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgLy8gSGVscGVyIHRvIHBhZCBzaW5nbGUgZGlnaXRzXHJcbiAgICBjb25zdCBwYWQgPSAobjogbnVtYmVyKSA9PiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuXHJcbiAgICAvLyBQYXJzZSBkYXRlIGZvciBcIkREL01NL1lZWVkgaGg6bW0gQU0vUE1cIiBmb3JtYXQgbWFudWFsbHlcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiAvXlxcZHsyfVxcL1xcZHsyfVxcL1xcZHs0fSBcXGR7Mn06XFxkezJ9IFtBUF1NJC8udGVzdCh2YWwpKSB7XHJcblxyXG4gICAgICBjb25zdCBwYXJ0cyA9IHZhbC5tYXRjaCgvXihcXGR7Mn0pXFwvKFxcZHsyfSlcXC8oXFxkezR9KSAoXFxkezJ9KTooXFxkezJ9KSAoW0FQXU0pJC8pO1xyXG4gICAgICBpZiAoIXBhcnRzKSByZXR1cm4gJyc7XHJcbiAgICAgIGxldCBbLCBkZCwgbW0sIHl5eXksIGhoLCBtaW4sIGFtcG1dID0gcGFydHM7XHJcbiAgICAgIGxldCBob3VycyA9IHBhcnNlSW50KGhoLCAxMCk7XHJcbiAgICAgIGlmIChhbXBtID09PSAnUE0nICYmIGhvdXJzICE9PSAxMikgaG91cnMgKz0gMTI7XHJcbiAgICAgIGlmIChhbXBtID09PSAnQU0nICYmIGhvdXJzID09PSAxMikgaG91cnMgPSAwO1xyXG4gICAgICB2YWwgPSBuZXcgRGF0ZShwYXJzZUludCh5eXl5LCAxMCksIHBhcnNlSW50KG1tLCAxMCkgLSAxLCBwYXJzZUludChkZCwgMTApLCBob3VycywgcGFyc2VJbnQobWluLCAxMCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsID0gbmV3IERhdGUodmFsKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNOYU4odmFsLmdldFRpbWUoKSkpIHJldHVybiAnJztcclxuXHJcbiAgICBjb25zdCBkdCA9IHZhbDtcclxuXHJcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xyXG4gICAgICBjYXNlICdkZC9NTS95eXl5IGhoOm1tIGEnOiB7IC8vIDExLzA3LzIwMjUgMTA6NTYgUE1cclxuICAgICAgICBsZXQgaG91cnMxMiA9IGR0LmdldEhvdXJzKCkgJSAxMiB8fCAxMjtcclxuICAgICAgICBsZXQgYW1wbSA9IGR0LmdldEhvdXJzKCkgPj0gMTIgPyAnUE0nIDogJ0FNJztcclxuICAgICAgICByZXR1cm4gYCR7cGFkKGR0LmdldERhdGUoKSl9LyR7cGFkKGR0LmdldE1vbnRoKCkgKyAxKX0vJHtkdC5nZXRGdWxsWWVhcigpfSAke3BhZChob3VyczEyKX06JHtwYWQoZHQuZ2V0TWludXRlcygpKX0gJHthbXBtfWA7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnZGQvTU0veXl5eSBISDptbSc6IHsgLy8gMjgvMDcvMjAyNSAxMzowOFxyXG4gICAgICAgIHJldHVybiBgJHtwYWQoZHQuZ2V0RGF0ZSgpKX0vJHtwYWQoZHQuZ2V0TW9udGgoKSArIDEpfS8ke2R0LmdldEZ1bGxZZWFyKCl9ICR7cGFkKGR0LmdldEhvdXJzKCkpfToke3BhZChkdC5nZXRNaW51dGVzKCkpfWA7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnZGQvTU0veXl5eSc6IHsgLy8gMjgvMDcvMjAyNVxyXG4gICAgICAgIHJldHVybiBgJHtwYWQoZHQuZ2V0RGF0ZSgpKX0vJHtwYWQoZHQuZ2V0TW9udGgoKSArIDEpfS8ke2R0LmdldEZ1bGxZZWFyKCl9YDtcclxuICAgICAgfVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBkdC50b0xvY2FsZVN0cmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF0ZVZhbHVlRm9ybWF0dGVyKGZvcm1hdDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gKHBhcmFtczogYW55KSA9PiB7XHJcbiAgICAgIGlmICghcGFyYW1zLnZhbHVlKSByZXR1cm4gJyc7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdERhdGUocGFyYW1zLnZhbHVlLCBmb3JtYXQsICdlbi1VUycpO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEtleXMob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBvYmogPyBPYmplY3Qua2V5cyhvYmopIDogW107XHJcbiAgfVxyXG5cclxuICBoYXNBbnlHcm91cHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGEgJiYgdGhpcy5nZXRLZXlzKHRoaXMuZmlsdGVyZWREYXRhKS5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0QW1vdW50KHBhcmFtczogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zPy52YWx1ZTtcclxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJykge1xyXG4gICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgICByZXR1cm4gKE1hdGgudHJ1bmMobnVtICogMTAwMCkgLyAxMDAwKS50b0ZpeGVkKDMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VhcmNoKGNyaXRlcmlhOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoQ3JpdGVyaWEgPSBjcml0ZXJpYS5zZWFyY2hDcml0ZXJpYTtcclxuICAgIHRoaXMucmVwb3J0RGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcclxuICAgIHRoaXMucmVwb3J0RGF0ZSA9IGZvcm1hdERhdGUodGhpcy5yZXBvcnREYXRlLCAnZGQvTU0veXl5eSBoaDptbSBhJywgJ2VuLVVTJyk7XHJcbiAgICBjb25zdCBtb2RhbCA9IGNyaXRlcmlhLm1vZGFsO1xyXG4gICAgdGhpcy51c2VyID0gY3JpdGVyaWEuc3lzVXNlcklEO1xyXG4gICAgdGhpcy5mcm9tRGF0ZSA9IGZvcm1hdERhdGUobW9kYWwuZnJvbURhdGUsICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKS5zbGljZSgwLCAxMCk7XHJcbiAgICB0aGlzLnRvRGF0ZSA9IGZvcm1hdERhdGUobW9kYWwudG9EYXRlLCAnZGQvTU0veXl5eSBoaDptbSBhJywgJ2VuLVVTJykuc2xpY2UoMCwgMTApO1xyXG4gICAgY29uc29sZS5sb2cobW9kYWwpO1xyXG4gICAgLy8gQ29kZSBGb3IgTWV0YSBEYXRhXHJcbiAgICB0aGlzLmxlZnREYXRhID0ge1xyXG4gICAgICAnUmVwb3J0IFBlcmlvZCc6IHRoaXMuZnJvbURhdGUgKyBcIiAtIFwiICsgdGhpcy50b0RhdGUsXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tZXRhRGF0YVR3byA9IHtcclxuICAgICAgJ1JlcG9ydCBVc2VyICYgVGltZSc6IHRoaXMudXNlciArIFwiIEAgXCIgKyB0aGlzLnJlcG9ydERhdGUsXHJcbiAgICB9XHJcbiAgICBjb25zdCBpc1RvdGFsU3VtbWFyeSA9IG1vZGFsLnN1bW1hcnlSZXBvcnQgPT09ICdUb3RhbCBTdW1tYXJ5JztcclxuICAgIHRoaXMuaXNUb3RhbFN1bW1hcnkgPSBpc1RvdGFsU3VtbWFyeTtcclxuXHJcbiAgICBjb25zdCBzZWFyY2hEYXRhID0ge1xyXG4gICAgICBcIlN0YXJ0RGF0ZVwiOiBtb2RhbC5mcm9tRGF0ZSxcclxuICAgICAgXCJFbmREYXRlXCI6IG1vZGFsLnRvRGF0ZSxcclxuICAgICAgXCJTZW5kQ291bnRyeUNvZGVcIjogbW9kYWwuc2VuZENvdW50cnksXHJcbiAgICAgIFwiUmVjdkNvdW50cnlDb2RlXCI6IG1vZGFsLnJlY2VpdmVDb3VudHJ5LFxyXG4gICAgICBcIkJ1c2luZXNzUGFydG5lckNvZGVcIjogbW9kYWwuY2xpZW50LFxyXG4gICAgICBcIlRyYW5zYWN0aW9uU3RhdHVzXCI6IG1vZGFsLnRyYW5zYWN0aW9uU3RhdHVzLmpvaW4oXCIsXCIpLFxyXG4gICAgICBcIlBheW91dEN1cnJlbmN5XCI6IG1vZGFsLnJlY2VpdmVDdXJyZW5jeSxcclxuICAgICAgXCJUcmFuc2FjdGlvblR5cGVcIjogbW9kYWwucHJvZHVjdCxcclxuICAgICAgXCJCcmFuY2hDb2RlXCI6IG1vZGFsLmJyYW5jaCxcclxuICAgICAgXCJTdW1tYXJ5UmVwb3J0XCI6IG1vZGFsLnN1bW1hcnlSZXBvcnRcclxuXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zaG93TWVzc2FnZSA9IHRydWU7XHJcbiAgICB0aGlzLmNsZWFyU2VhcmNoID0gdHJ1ZTtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Mb2FkaW5nO1xyXG4gICAgdGhpcy5yZXBvcnRTZXJ2aWNlLmdldEJyYW5jaEFjdGl2aXR5U2VuZFN1bW1hcnlSZXBvcnQoc2VhcmNoRGF0YSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcclxuICAgICAgICB0aGlzLmRhdGFNYXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWREYXRhKS5sZW5ndGggPT0gMCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICB0aGlzLnByb3h5RGF0YSA9IHN0cnVjdHVyZWRDbG9uZShkYXRhKTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25BcnJheSA9IG5ldyBBcnJheShPYmplY3Qua2V5cyh0aGlzLmZpbHRlcmVkRGF0YSkubGVuZ3RoKS5maWxsKDE1KTtcclxuICAgICAgICB0aGlzLnNob3dNZXNzYWdlID0gT2JqZWN0LmtleXModGhpcy5maWx0ZXJlZERhdGEpLmxlbmd0aCA9PSAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd1JlcG9ydCA9IHRydWU7XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgICAgICB0aGlzLmNsZWFyU2VhcmNoID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgICAgICB0aGlzLnNob3dSZXBvcnQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2xlYXJTZWFyY2ggPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGhhbmRsZUZvcm1WYWxpZChpc1ZhbGlkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRm9ybVZhbGlkID0gaXNWYWxpZDtcclxuICB9XHJcblxyXG59XHJcblxyXG4iLCI8bGliLXNlYXJjaC1maWx0ZXIgXHJcbiAgICBbUmVwb3J0TmFtZV09XCJSZXBvcnROYW1lXCIgXHJcbiAgICAoc2VhcmNoQ2xpY2tlZCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiXHJcbiAgICAoZm9ybVZhbGlkKT1cImhhbmRsZUZvcm1WYWxpZCgkZXZlbnQpXCI+XHJcbjwvbGliLXNlYXJjaC1maWx0ZXIgPlxyXG48YXBwLWxvYWRlciBjbGFzcz1cIlwiICpuZ0lmPVwibG9hZGluZ1N0YXRlID09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nXCI+PC9hcHAtbG9hZGVyPlxyXG5cclxuPHNlY3Rpb24gKm5nSWY9XCJzaG93UmVwb3J0ICYmIGlzRm9ybVZhbGlkICYmICFjbGVhclNlYXJjaFwiIGNsYXNzPVwibXktMlwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbm9EYXRhRm91bmRcIj5cclxuICAgICA8bGliLW1ldGFkYXRhIFtyZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiBbc2hvd21ldGFEYXRhT25lXT1cInRydWVcIiBbc2hvd21ldGFEYXRhVHdvXT1cInRydWVcIiBbbWV0YURhdGFPbmVdPVwibGVmdERhdGFcIiBbbWV0YURhdGFUd29dPVwibWV0YURhdGFUd29cIihleHBvcnRFdmVudCk9XCJoYW5kbGVFeHBvcnQoJGV2ZW50KVwiIChzZWFyY2hFdmVudCk9XCJmaWx0ZXIoJGV2ZW50KVwiPjwvbGliLW1ldGFkYXRhPlxyXG5cclxuICA8bmdiLWFjY29yZGlvbiAjYWNjPVwibmdiQWNjb3JkaW9uXCIgW2Nsb3NlT3RoZXJzXT1cImZhbHNlXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkRGF0YSB8IGtleXZhbHVlOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgIDxuZ2ItcGFuZWwgKm5nSWY9XCJpdGVtLnZhbHVlLmxlbmd0aCA+IDBcIiBbaWRdPVwiJ3BhbmVsLScgKyBpXCI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBuZ2JQYW5lbFRpdGxlIHN0eWxlPVwiaGVpZ2h0OiAxMCU7XCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJwYW5lbC1jbHNcIj57e1xyXG4gICAgICAgICAgICBpdGVtLmtleVxyXG4gICAgICAgICAgICB9fTwvbGFiZWw+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nYlBhbmVsQ29udGVudD5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgIDxsaWItcGFnZS1zaXplLXNlbGVjdG9yIFt0b3RhbEVudHJpZXNdPVwiaXRlbT8udmFsdWU/Lmxlbmd0aFwiXHJcbiAgICAgICAgICAgIFtkZWZhdWx0U2l6ZV09XCInMTUnXCIgW2dyaWRBcGldPVwiZ3JpZEFwaXNbaV1cIj5cclxuICAgICAgICAgICAgPjwvbGliLXBhZ2Utc2l6ZS1zZWxlY3Rvcj5cclxuXHJcbiAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgY2xhc3M9XCJhZy10aGVtZS1hbHBpbmUgdHJhbnNhY3Rpb24tZ3JpZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7aGVpZ2h0OiAzODBweDtcIlxyXG4gICAgICAgICAgICAgIFtjb2x1bW5EZWZzXT1cImNvbHVtbkRlZnNcIiBcclxuICAgICAgICAgICAgICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCIgXHJcbiAgICAgICAgICAgICAgW3Jvd0RhdGFdPVwiaXRlbS52YWx1ZVwiIFxyXG4gICAgICAgICAgICAgIFtyb3dIZWlnaHRdPVwiMjBcIlxyXG4gICAgICAgICAgICAgIFtoZWFkZXJIZWlnaHRdPVwiMjJcIlxyXG4gICAgICAgICAgICAgIFtwYWdpbmF0aW9uXT1cInRydWVcIiBcclxuICAgICAgICAgICAgICBbcGFnaW5hdGlvblBhZ2VTaXplXT1cInBhZ2luYXRpb25BcnJheVtpXVwiIFxyXG4gICAgICAgICAgICAgIFtyb3dDbGFzc1J1bGVzXT1cInJvd0NsYXNzUnVsZXNcIlxyXG4gICAgICAgICAgICAgIChncmlkUmVhZHkpPVwib25HcmlkUmVhZHkoJGV2ZW50LGkpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDwvbmdiLXBhbmVsPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZ2ItYWNjb3JkaW9uPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nIG10LTNcIiAqbmdJZj1cIm5vRGF0YUZvdW5kXCI+XHJcbiAgICBObyBEYXRhIGZvdW5kIG1hdGNoaW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhLlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+Il19