@sachin9822/reports-lib 0.0.183 → 0.0.185
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.
- package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +2 -2
- package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +3 -3
- package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +78 -334
- package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +94 -355
- package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +67 -99
- package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +213 -0
- package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +618 -0
- package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +40 -43
- package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +10 -2
- package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +2 -0
- package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +2 -0
- package/esm2020/lib/reports-lib.module.mjs +9 -1
- package/esm2020/lib/services/report.service.mjs +56 -25
- package/esm2020/lib/shared/metadata/metadata.component.mjs +4 -4
- package/esm2020/lib/shared/search-filter/search-filter.component.mjs +173 -28
- package/esm2020/public-api.mjs +5 -1
- package/fesm2015/sachin9822-reports-lib.mjs +1454 -993
- package/fesm2015/sachin9822-reports-lib.mjs.map +1 -1
- package/fesm2020/sachin9822-reports-lib.mjs +1464 -1014
- package/fesm2020/sachin9822-reports-lib.mjs.map +1 -1
- package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +6 -6
- package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +8 -18
- package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +23 -14
- package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +50 -0
- package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +104 -0
- package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +12 -2
- package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +1 -1
- package/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.d.ts +33 -0
- package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +18 -0
- package/lib/reports-lib.module.d.ts +13 -11
- package/lib/services/report.service.d.ts +19 -10
- package/lib/shared/search-filter/search-filter.component.d.ts +6 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -0
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { finalize, takeUntil } from 'rxjs/operators';
|
|
4
|
+
import { ComponentLoadingStates } from '../../models/component-loading-states';
|
|
5
|
+
import { formatDate } from '@angular/common';
|
|
6
|
+
import jsPDF from 'jspdf';
|
|
7
|
+
import 'jspdf-autotable';
|
|
8
|
+
import * as ExcelJS from 'exceljs';
|
|
9
|
+
import * as FileSaver from 'file-saver';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "../../services/report.service";
|
|
12
|
+
import * as i2 from "ag-grid-angular";
|
|
13
|
+
import * as i3 from "@angular/common";
|
|
14
|
+
import * as i4 from "../../shared/metadata/metadata.component";
|
|
15
|
+
import * as i5 from "../../shared/loader/loader.component";
|
|
16
|
+
import * as i6 from "../../shared/search-filter/search-filter.component";
|
|
17
|
+
export class StatementOfAccountsReportComponent {
|
|
18
|
+
constructor(reportService) {
|
|
19
|
+
this.reportService = reportService;
|
|
20
|
+
this.ReportName = "Statement of Accounts";
|
|
21
|
+
this.ComponentLoadingState = ComponentLoadingStates;
|
|
22
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
23
|
+
this.destroy$ = new Subject();
|
|
24
|
+
this.openingBalAndFunding = [];
|
|
25
|
+
this.sendDetails = [];
|
|
26
|
+
this.receiveDetails = [];
|
|
27
|
+
this.currentDateTime = new Date();
|
|
28
|
+
this.sendPinnedBottomRow = [];
|
|
29
|
+
this.receivePinnedBottomRow = [];
|
|
30
|
+
this.closingBalance = 0;
|
|
31
|
+
this.closingBalanceCurrency = 'USD';
|
|
32
|
+
this.closingBalanceUSDInWords = '';
|
|
33
|
+
this.selectedClientType = '';
|
|
34
|
+
this.showTables = false;
|
|
35
|
+
this.closingBalanceInSettlment = 0;
|
|
36
|
+
this.closingBalanceSettlmentCurrency = '';
|
|
37
|
+
this.closingBalanceSettlmentInWords = '';
|
|
38
|
+
this.closingBalanceSettlmentFormatted = '0.000';
|
|
39
|
+
this.closingBalanceInUsdFormatted = '0.000';
|
|
40
|
+
this.columnDefs = [
|
|
41
|
+
// { headerName: 'ID', field: 'id', width: 100 },
|
|
42
|
+
{ headerName: 'Description', field: 'description', flex: 4, tooltipField: 'description', cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
|
|
43
|
+
{ headerName: 'Settlment Ccy', field: 'settlmentCcy', flex: 1, tooltipField: 'settlmentCcy', cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
|
|
44
|
+
{ headerName: 'Amount In Settlment Ccy', field: 'amountInSettlmentCcy', flex: 2.1, cellClass: 'ag-right-aligned-cell', valueFormatter: this.currencyFormatter, tooltipValueGetter: (params) => this.currencyFormatter(params), cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
|
|
45
|
+
{ headerName: 'Amount In USD', field: 'amountInUSD', flex: 2.1, cellClass: 'ag-right-aligned-cell', valueFormatter: this.currencyFormatter, tooltipValueGetter: (params) => this.currencyFormatter(params), cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } }
|
|
46
|
+
];
|
|
47
|
+
this.defaultColDef = {
|
|
48
|
+
sortable: true,
|
|
49
|
+
filter: false,
|
|
50
|
+
resizable: true,
|
|
51
|
+
minwidth: 40,
|
|
52
|
+
wrapHeaderText: true,
|
|
53
|
+
autoHeaderHeight: true,
|
|
54
|
+
suppressSizeToFit: false,
|
|
55
|
+
wrapText: true,
|
|
56
|
+
autoHeight: true
|
|
57
|
+
};
|
|
58
|
+
// Helper arrays
|
|
59
|
+
this.ones = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"];
|
|
60
|
+
this.teens = ["Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"];
|
|
61
|
+
this.tens = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"];
|
|
62
|
+
}
|
|
63
|
+
async ngOnInit() {
|
|
64
|
+
this.logoBase64 = await this.loadImageAsBase64('assets/reports-lib/assets/images/XMLogo.png');
|
|
65
|
+
}
|
|
66
|
+
currencyFormatter(params) {
|
|
67
|
+
if (params.value == null)
|
|
68
|
+
return '0.000';
|
|
69
|
+
const num = Number(params.value);
|
|
70
|
+
return num.toFixed(3); // rounds to 3 decimals
|
|
71
|
+
}
|
|
72
|
+
async handleSearch(criteria) {
|
|
73
|
+
const modal = criteria.modal;
|
|
74
|
+
const payload = {
|
|
75
|
+
businessPartnerID: Number(modal.client),
|
|
76
|
+
fromDate: new Date(modal.fromDate).toISOString(),
|
|
77
|
+
toDate: new Date(modal.toDate).toISOString(),
|
|
78
|
+
clientType: criteria.clientType
|
|
79
|
+
};
|
|
80
|
+
this.user = criteria.sysUserID;
|
|
81
|
+
this.metaDataOne = {
|
|
82
|
+
'Report User': this.user,
|
|
83
|
+
'Report Time': formatDate(this.currentDateTime, 'dd/MM/yyyy hh:mm a', 'en-US'),
|
|
84
|
+
'Client': criteria.clientName
|
|
85
|
+
};
|
|
86
|
+
console.log(criteria.clientName);
|
|
87
|
+
this.loadingState = ComponentLoadingStates.Loading;
|
|
88
|
+
this.errorMessage = '';
|
|
89
|
+
this.showTables = false;
|
|
90
|
+
this.selectedClientType = criteria.clientType;
|
|
91
|
+
this.reportService.getStatementOfAccount(payload)
|
|
92
|
+
.pipe(finalize(() => {
|
|
93
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
94
|
+
this.hasSearched = true;
|
|
95
|
+
this.showTables = true;
|
|
96
|
+
}), takeUntil(this.destroy$))
|
|
97
|
+
.subscribe({
|
|
98
|
+
next: (data) => {
|
|
99
|
+
console.log(data);
|
|
100
|
+
this.openingBalAndFunding = data.openingBalAndFunding ?? [];
|
|
101
|
+
this.sendDetails = data.sendDetails ?? [];
|
|
102
|
+
this.receiveDetails = data.receiveDetails ?? [];
|
|
103
|
+
// add pinned totals
|
|
104
|
+
if (this.selectedClientType == "SendClient") {
|
|
105
|
+
this.sendPinnedBottomRow = [this.buildTotalRow(this.sendDetails)];
|
|
106
|
+
this.receivePinnedBottomRow = [];
|
|
107
|
+
}
|
|
108
|
+
else if (this.selectedClientType == "ReceiveClient") {
|
|
109
|
+
this.receivePinnedBottomRow = [this.buildTotalRow(this.receiveDetails)];
|
|
110
|
+
this.sendPinnedBottomRow = [];
|
|
111
|
+
}
|
|
112
|
+
else if (this.selectedClientType === "Both") {
|
|
113
|
+
this.sendPinnedBottomRow = [this.buildTotalRow(this.sendDetails)];
|
|
114
|
+
this.receivePinnedBottomRow = [this.buildTotalRow(this.receiveDetails)];
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
this.sendPinnedBottomRow = [];
|
|
118
|
+
this.receivePinnedBottomRow = [];
|
|
119
|
+
}
|
|
120
|
+
this.calculateClosingBalance();
|
|
121
|
+
this.noDataFromApi =
|
|
122
|
+
this.openingBalAndFunding.length === 0 &&
|
|
123
|
+
this.sendDetails.length === 0 &&
|
|
124
|
+
(!this.receiveDetails || this.receiveDetails.length === 0);
|
|
125
|
+
},
|
|
126
|
+
error: (err) => {
|
|
127
|
+
console.error('Error fetching Statement of Accounts:', err);
|
|
128
|
+
this.errorMessage = 'Failed to load Statement of Accounts';
|
|
129
|
+
this.openingBalAndFunding = [];
|
|
130
|
+
this.sendDetails = [];
|
|
131
|
+
this.receiveDetails = [];
|
|
132
|
+
this.loadingState = ComponentLoadingStates.Error;
|
|
133
|
+
this.showTables = false;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
buildTotalRow(rows) {
|
|
138
|
+
const totalSettle = (rows || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
|
|
139
|
+
const totalUsd = (rows || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
|
|
140
|
+
return {
|
|
141
|
+
id: null,
|
|
142
|
+
description: 'Total',
|
|
143
|
+
settlmentCcy: '',
|
|
144
|
+
amountInSettlmentCcy: Number(totalSettle.toFixed(3)),
|
|
145
|
+
amountInUSD: Number(totalUsd.toFixed(3))
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
onOpeningGridReady(params) {
|
|
149
|
+
this.openingGridApi = params.api;
|
|
150
|
+
}
|
|
151
|
+
onSendGridReady(params) {
|
|
152
|
+
this.sendGridApi = params.api;
|
|
153
|
+
}
|
|
154
|
+
onReceiveGridReady(params) {
|
|
155
|
+
this.receiveGridApi = params.api;
|
|
156
|
+
}
|
|
157
|
+
filter(text) {
|
|
158
|
+
this.searchText = text;
|
|
159
|
+
if (this.openingGridApi) {
|
|
160
|
+
this.openingGridApi.setQuickFilter(this.searchText);
|
|
161
|
+
}
|
|
162
|
+
if (this.sendGridApi) {
|
|
163
|
+
this.sendGridApi.setQuickFilter(this.searchText);
|
|
164
|
+
}
|
|
165
|
+
if (this.receiveGridApi) {
|
|
166
|
+
this.receiveGridApi.setQuickFilter(this.searchText);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
calculateClosingBalance() {
|
|
170
|
+
// USD totals (existing logic)
|
|
171
|
+
const openingBalTotalUsd = (this.openingBalAndFunding || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
|
|
172
|
+
const sendTotalUsd = (this.sendDetails || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
|
|
173
|
+
const receiveTotalUsd = (this.receiveDetails || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
|
|
174
|
+
const rawClosingUsd = openingBalTotalUsd + sendTotalUsd + receiveTotalUsd;
|
|
175
|
+
this.closingBalance = Number(rawClosingUsd.toFixed(3)); // numeric USD
|
|
176
|
+
// Settlement currency totals (new)
|
|
177
|
+
const openingSettle = (this.openingBalAndFunding || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
|
|
178
|
+
const sendSettle = (this.sendDetails || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
|
|
179
|
+
const receiveSettle = (this.receiveDetails || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
|
|
180
|
+
const rawClosingSettle = openingSettle + sendSettle + receiveSettle;
|
|
181
|
+
this.closingBalanceInSettlment = Number(rawClosingSettle.toFixed(3));
|
|
182
|
+
// pick a settlement currency to display (first non-empty)
|
|
183
|
+
this.closingBalanceSettlmentCurrency = this.getFirstSettlementCurrency();
|
|
184
|
+
// formatted strings (no-thousand-comma, 3 decimals)
|
|
185
|
+
this.closingBalanceInUsdFormatted = this.formatNoComma(this.closingBalance);
|
|
186
|
+
this.closingBalanceSettlmentFormatted = this.formatNoComma(this.closingBalanceInSettlment);
|
|
187
|
+
this.closingBalanceUSDInWords = this.numberToWords(this.closingBalance);
|
|
188
|
+
this.closingBalanceSettlmentInWords =
|
|
189
|
+
this.closingBalanceInSettlment !== null &&
|
|
190
|
+
this.closingBalanceInSettlment !== undefined &&
|
|
191
|
+
!isNaN(Number(this.closingBalanceInSettlment))
|
|
192
|
+
? this.numberToWords(this.closingBalanceInSettlment)
|
|
193
|
+
: '';
|
|
194
|
+
}
|
|
195
|
+
formatNoComma(value) {
|
|
196
|
+
if (value === null || value === undefined || isNaN(Number(value)))
|
|
197
|
+
return '0.000';
|
|
198
|
+
const num = Number(value);
|
|
199
|
+
const truncated = Math.trunc(num * 1000) / 1000;
|
|
200
|
+
return truncated.toFixed(3);
|
|
201
|
+
}
|
|
202
|
+
getFirstSettlementCurrency() {
|
|
203
|
+
const tryGet = (arr) => {
|
|
204
|
+
if (!arr || arr.length === 0)
|
|
205
|
+
return '';
|
|
206
|
+
for (const r of arr) {
|
|
207
|
+
if (r && r.settlmentCcy)
|
|
208
|
+
return r.settlmentCcy;
|
|
209
|
+
}
|
|
210
|
+
return '';
|
|
211
|
+
};
|
|
212
|
+
return tryGet(this.openingBalAndFunding) || tryGet(this.sendDetails) || tryGet(this.receiveDetails) || '';
|
|
213
|
+
}
|
|
214
|
+
numberToWords(num) {
|
|
215
|
+
if (num === 0)
|
|
216
|
+
return "Zero Point Zero Zero Zero Only";
|
|
217
|
+
let result = "";
|
|
218
|
+
// Handle negative numbers
|
|
219
|
+
if (num < 0) {
|
|
220
|
+
result = "Negative ";
|
|
221
|
+
num = Math.abs(num);
|
|
222
|
+
}
|
|
223
|
+
// Split integer and decimal parts
|
|
224
|
+
const integerPart = Math.floor(num);
|
|
225
|
+
const decimalPart = Math.round((num - integerPart) * 1000); // up to 3 decimal places
|
|
226
|
+
result += this.convertNumber(integerPart);
|
|
227
|
+
if (decimalPart > 0) {
|
|
228
|
+
result += " Point";
|
|
229
|
+
const decimalStr = decimalPart.toString().padStart(3, "0"); // keep 3 digits
|
|
230
|
+
for (const digit of decimalStr) {
|
|
231
|
+
result += " " + this.ones[+digit];
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return result + " Only";
|
|
235
|
+
}
|
|
236
|
+
// Convert whole numbers (Indian/International system)
|
|
237
|
+
convertNumber(num) {
|
|
238
|
+
if (num === 0)
|
|
239
|
+
return "";
|
|
240
|
+
if (num < 10)
|
|
241
|
+
return this.ones[num];
|
|
242
|
+
if (num < 20)
|
|
243
|
+
return this.teens[num - 10];
|
|
244
|
+
if (num < 100)
|
|
245
|
+
return this.tens[Math.floor(num / 10)] + (num % 10 !== 0 ? " " + this.ones[num % 10] : "");
|
|
246
|
+
if (num < 1000)
|
|
247
|
+
return this.convertNumber(Math.floor(num / 100)) + " Hundred" + (num % 100 !== 0 ? " " + this.convertNumber(num % 100) : "");
|
|
248
|
+
if (num < 1000000)
|
|
249
|
+
return this.convertNumber(Math.floor(num / 1000)) + " Thousand" + (num % 1000 !== 0 ? " " + this.convertNumber(num % 1000) : "");
|
|
250
|
+
if (num < 1000000000)
|
|
251
|
+
return this.convertNumber(Math.floor(num / 1000000)) + " Million" + (num % 1000000 !== 0 ? " " + this.convertNumber(num % 1000000) : "");
|
|
252
|
+
return this.convertNumber(Math.floor(num / 1000000000)) + " Billion" + (num % 1000000000 !== 0 ? " " + this.convertNumber(num % 1000000000) : "");
|
|
253
|
+
}
|
|
254
|
+
onExportChange(value) {
|
|
255
|
+
this.selectedExportOption = value;
|
|
256
|
+
}
|
|
257
|
+
handleExport(option) {
|
|
258
|
+
this.selectedExportOption = option;
|
|
259
|
+
switch ((this.selectedExportOption || '').toLowerCase()) {
|
|
260
|
+
case 'pdf':
|
|
261
|
+
this.exportToPDF();
|
|
262
|
+
break;
|
|
263
|
+
case 'excel':
|
|
264
|
+
this.exportToExcel();
|
|
265
|
+
break;
|
|
266
|
+
case 'csv':
|
|
267
|
+
this.exportToCSV();
|
|
268
|
+
break;
|
|
269
|
+
default: console.warn('Unknown export type:', this.selectedExportOption);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
exportToPDF() {
|
|
273
|
+
const sections = this.getVisibleGrids()
|
|
274
|
+
.map(s => {
|
|
275
|
+
const data = this.getDisplayedData(s.api);
|
|
276
|
+
const headers = this.getHeaders();
|
|
277
|
+
let rows = this.buildRows(data);
|
|
278
|
+
if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
|
|
279
|
+
rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
|
|
280
|
+
}
|
|
281
|
+
if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
|
|
282
|
+
rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
|
|
283
|
+
}
|
|
284
|
+
return rows.length ? { title: s.title, headers, rows } : null;
|
|
285
|
+
})
|
|
286
|
+
.filter(Boolean);
|
|
287
|
+
if (!sections.length)
|
|
288
|
+
return;
|
|
289
|
+
const doc = new jsPDF({ orientation: 'landscape', unit: 'mm', format: 'a4' });
|
|
290
|
+
if (this.logoBase64) {
|
|
291
|
+
doc.addImage(this.logoBase64, 'PNG', 15, 10, 38, 18);
|
|
292
|
+
}
|
|
293
|
+
const pageWidth = doc.internal.pageSize.getWidth();
|
|
294
|
+
const pageHeight = doc.internal.pageSize.getHeight();
|
|
295
|
+
doc.setFont('helvetica', 'bold');
|
|
296
|
+
doc.setFontSize(15);
|
|
297
|
+
doc.text(this.ReportName, pageWidth / 2, 18, { align: 'center' });
|
|
298
|
+
let y = 34;
|
|
299
|
+
doc.setFontSize(10);
|
|
300
|
+
Object.entries(this.metaDataOne || {}).forEach(([k, v]) => {
|
|
301
|
+
doc.setFont('helvetica', 'bold');
|
|
302
|
+
doc.text(`${k}: `, 15, y);
|
|
303
|
+
const w = doc.getTextWidth(`${k}: `);
|
|
304
|
+
doc.setFont('helvetica', 'normal');
|
|
305
|
+
doc.text(String(v ?? ''), 15 + w, y);
|
|
306
|
+
y += 6;
|
|
307
|
+
});
|
|
308
|
+
const HEAD = this.getHeaders();
|
|
309
|
+
const margin = { left: 15, right: 15 };
|
|
310
|
+
const avail = pageWidth - margin.left - margin.right;
|
|
311
|
+
const weights = [4, 1, 2, 2];
|
|
312
|
+
const sum = weights.reduce((a, b) => a + b, 0);
|
|
313
|
+
const widths = weights.map(w => (w / sum) * avail);
|
|
314
|
+
const sharedColumnStyles = {
|
|
315
|
+
0: { cellWidth: widths[0] },
|
|
316
|
+
1: { cellWidth: widths[1] },
|
|
317
|
+
2: { cellWidth: widths[2], halign: 'right' },
|
|
318
|
+
3: { cellWidth: widths[3], halign: 'right' }
|
|
319
|
+
};
|
|
320
|
+
const titleGapAboveFirst = 0;
|
|
321
|
+
const titleGapAboveDefault = 4;
|
|
322
|
+
const titleGapAboveBig = 6;
|
|
323
|
+
const titleToTableGap = 2;
|
|
324
|
+
const topStartY = 20;
|
|
325
|
+
const bottomReserve = 20;
|
|
326
|
+
sections.forEach((s, idx) => {
|
|
327
|
+
const isFirst = idx === 0;
|
|
328
|
+
const isSendOrReceive = s.title === 'Send Details' || s.title === 'Receive Details';
|
|
329
|
+
const preTitleGap = isFirst ? 0 : (isSendOrReceive ? titleGapAboveBig : titleGapAboveDefault);
|
|
330
|
+
if (y + preTitleGap + titleToTableGap > pageHeight - bottomReserve) {
|
|
331
|
+
doc.addPage();
|
|
332
|
+
y = topStartY;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
y += preTitleGap;
|
|
336
|
+
}
|
|
337
|
+
doc.setFont('helvetica', 'bold');
|
|
338
|
+
doc.setFontSize(11);
|
|
339
|
+
doc.text(s.title, margin.left, y);
|
|
340
|
+
const startYForTable = y + (isFirst ? 0 : titleToTableGap);
|
|
341
|
+
doc.autoTable({
|
|
342
|
+
head: [HEAD],
|
|
343
|
+
body: s.rows,
|
|
344
|
+
startY: startYForTable,
|
|
345
|
+
theme: 'grid',
|
|
346
|
+
margin,
|
|
347
|
+
tableWidth: avail,
|
|
348
|
+
columnStyles: sharedColumnStyles,
|
|
349
|
+
headStyles: { fillColor: [220, 220, 220], textColor: 0, fontStyle: 'bold', fontSize: 9, halign: 'center' },
|
|
350
|
+
bodyStyles: { fontSize: 8 },
|
|
351
|
+
styles: { cellPadding: 2, overflow: 'linebreak', minCellHeight: 6 }
|
|
352
|
+
});
|
|
353
|
+
y = doc.lastAutoTable.finalY;
|
|
354
|
+
});
|
|
355
|
+
if (y + 30 > pageHeight - bottomReserve) {
|
|
356
|
+
doc.addPage();
|
|
357
|
+
y = topStartY;
|
|
358
|
+
}
|
|
359
|
+
const closingBody = [
|
|
360
|
+
[
|
|
361
|
+
{ content: 'Closing Balance', colSpan: 2, styles: { halign: 'left', fontStyle: 'bold' } },
|
|
362
|
+
{ content: Number(this.closingBalanceInSettlment || 0).toFixed(3), styles: { halign: 'right' } },
|
|
363
|
+
{ content: Number(this.closingBalance || 0).toFixed(3), styles: { halign: 'right' } }
|
|
364
|
+
],
|
|
365
|
+
[
|
|
366
|
+
{ content: `${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}`, colSpan: 4, styles: { halign: 'left' } }
|
|
367
|
+
],
|
|
368
|
+
[
|
|
369
|
+
{ content: `${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}`, colSpan: 4, styles: { halign: 'left' } }
|
|
370
|
+
]
|
|
371
|
+
];
|
|
372
|
+
doc.autoTable({
|
|
373
|
+
body: closingBody,
|
|
374
|
+
startY: y,
|
|
375
|
+
theme: 'grid',
|
|
376
|
+
margin,
|
|
377
|
+
tableWidth: avail,
|
|
378
|
+
columnStyles: sharedColumnStyles,
|
|
379
|
+
styles: { cellPadding: 2, fontSize: 9 }
|
|
380
|
+
});
|
|
381
|
+
doc.save('Statement_of_Accounts.pdf');
|
|
382
|
+
}
|
|
383
|
+
exportToExcel() {
|
|
384
|
+
const sections = this.getVisibleGrids()
|
|
385
|
+
.map(s => {
|
|
386
|
+
const data = this.getDisplayedData(s.api);
|
|
387
|
+
const headers = this.getHeaders();
|
|
388
|
+
let rows = this.buildRows(data);
|
|
389
|
+
if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
|
|
390
|
+
rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
|
|
391
|
+
}
|
|
392
|
+
if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
|
|
393
|
+
rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
|
|
394
|
+
}
|
|
395
|
+
return rows.length ? { title: s.title, headers, rows } : null;
|
|
396
|
+
})
|
|
397
|
+
.filter(Boolean);
|
|
398
|
+
if (!sections.length)
|
|
399
|
+
return;
|
|
400
|
+
const wb = new ExcelJS.Workbook();
|
|
401
|
+
const ws = wb.addWorksheet('Statement of Accounts');
|
|
402
|
+
let r = 1;
|
|
403
|
+
if (this.logoBase64) {
|
|
404
|
+
const imgId = wb.addImage({ base64: this.logoBase64, extension: 'png' });
|
|
405
|
+
ws.addImage(imgId, { tl: { col: 0, row: 0 }, ext: { width: 145, height: 66 }, editAs: 'oneCell' });
|
|
406
|
+
}
|
|
407
|
+
ws.getRow(r).getCell(2).value = this.ReportName;
|
|
408
|
+
ws.getRow(r).getCell(2).font = { bold: true, size: 16 };
|
|
409
|
+
r += 3;
|
|
410
|
+
Object.entries(this.metaDataOne || {}).forEach(([k, v]) => {
|
|
411
|
+
ws.getRow(r++).getCell(1).value = `${k}: ${v ?? ''}`;
|
|
412
|
+
});
|
|
413
|
+
const writeSection = (sec) => {
|
|
414
|
+
ws.getRow(r++).getCell(1).value = sec.title;
|
|
415
|
+
const headerRow = ws.getRow(r++);
|
|
416
|
+
sec.headers.forEach((h, i) => {
|
|
417
|
+
const c = headerRow.getCell(i + 1);
|
|
418
|
+
c.value = h;
|
|
419
|
+
c.font = { bold: true };
|
|
420
|
+
c.alignment = { vertical: 'middle', horizontal: 'center' };
|
|
421
|
+
c.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'D9D9D9' } };
|
|
422
|
+
c.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' }, right: { style: 'thin' } };
|
|
423
|
+
});
|
|
424
|
+
const dataStart = r;
|
|
425
|
+
sec.rows.forEach(rowData => {
|
|
426
|
+
const row = ws.getRow(r++);
|
|
427
|
+
rowData.forEach((v, i) => {
|
|
428
|
+
const c = row.getCell(i + 1);
|
|
429
|
+
if (sec.headers[i] === 'Amount In Settlment Ccy' || sec.headers[i] === 'Amount In USD') {
|
|
430
|
+
const num = typeof v === 'string' ? Number(v.replace(/[, ]+/g, '')) : Number(v);
|
|
431
|
+
c.value = isNaN(num) ? (v ?? '') : num;
|
|
432
|
+
c.alignment = { horizontal: 'right' };
|
|
433
|
+
if (!isNaN(num))
|
|
434
|
+
c.numFmt = '0.000';
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
c.value = v ?? '';
|
|
438
|
+
}
|
|
439
|
+
c.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' }, right: { style: 'thin' } };
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
for (let col = 1; col <= sec.headers.length; col++) {
|
|
443
|
+
let max = (sec.headers[col - 1] || '').toString().length;
|
|
444
|
+
for (let rr = dataStart - 1; rr < r; rr++) {
|
|
445
|
+
const val = (ws.getRow(rr).getCell(col).value ?? '').toString();
|
|
446
|
+
if (val)
|
|
447
|
+
max = Math.max(max, val.length + 2);
|
|
448
|
+
}
|
|
449
|
+
ws.getColumn(col).width = Math.min(Math.max(max, 8), 60);
|
|
450
|
+
}
|
|
451
|
+
};
|
|
452
|
+
sections.forEach((sec, idx) => {
|
|
453
|
+
writeSection(sec);
|
|
454
|
+
if (idx < sections.length - 1) {
|
|
455
|
+
r++;
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
const totalCols = sections.length
|
|
459
|
+
? Math.max(...sections.map(s => s.headers.length))
|
|
460
|
+
: this.columnDefs.length;
|
|
461
|
+
const cols = Math.max(totalCols, 4);
|
|
462
|
+
const labelColsEnd = 2;
|
|
463
|
+
const settleCol = 3;
|
|
464
|
+
const usdCol = 4;
|
|
465
|
+
const row1 = ws.getRow(r++);
|
|
466
|
+
ws.mergeCells(row1.number, 1, row1.number, labelColsEnd);
|
|
467
|
+
row1.getCell(1).value = 'Closing Balance';
|
|
468
|
+
row1.getCell(1).font = { bold: true };
|
|
469
|
+
row1.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
|
|
470
|
+
const settleValue = Number(this.closingBalanceInSettlment ?? 0);
|
|
471
|
+
const usdValue = Number(this.closingBalance ?? 0);
|
|
472
|
+
const settleCell = row1.getCell(settleCol);
|
|
473
|
+
settleCell.value = isNaN(settleValue) ? '' : settleValue;
|
|
474
|
+
settleCell.alignment = { horizontal: 'right' };
|
|
475
|
+
if (!isNaN(settleValue))
|
|
476
|
+
settleCell.numFmt = '0.000';
|
|
477
|
+
const usdCell = row1.getCell(usdCol);
|
|
478
|
+
usdCell.value = isNaN(usdValue) ? '' : usdValue;
|
|
479
|
+
usdCell.alignment = { horizontal: 'right' };
|
|
480
|
+
if (!isNaN(usdValue))
|
|
481
|
+
usdCell.numFmt = '0.000';
|
|
482
|
+
for (let c = 1; c <= cols; c++) {
|
|
483
|
+
row1.getCell(c).border = {
|
|
484
|
+
top: { style: 'thin' },
|
|
485
|
+
bottom: { style: 'thin' },
|
|
486
|
+
left: { style: 'thin' },
|
|
487
|
+
right: { style: 'thin' }
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
const row2 = ws.getRow(r++);
|
|
491
|
+
ws.mergeCells(row2.number, 1, row2.number, cols);
|
|
492
|
+
row2.getCell(1).value = `${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}`;
|
|
493
|
+
row2.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
|
|
494
|
+
row2.getCell(1).font = { italic: false };
|
|
495
|
+
for (let c = 1; c <= cols; c++) {
|
|
496
|
+
const edge = { top: { style: 'thin' }, bottom: { style: 'thin' } };
|
|
497
|
+
if (c === 1)
|
|
498
|
+
edge.left = { style: 'thin' };
|
|
499
|
+
if (c === cols)
|
|
500
|
+
edge.right = { style: 'thin' };
|
|
501
|
+
row2.getCell(c).border = edge;
|
|
502
|
+
}
|
|
503
|
+
const row3 = ws.getRow(r++);
|
|
504
|
+
ws.mergeCells(row3.number, 1, row3.number, cols);
|
|
505
|
+
row3.getCell(1).value = `${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}`;
|
|
506
|
+
row3.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
|
|
507
|
+
for (let c = 1; c <= cols; c++) {
|
|
508
|
+
const edge = { top: { style: 'thin' }, bottom: { style: 'thin' } };
|
|
509
|
+
if (c === 1)
|
|
510
|
+
edge.left = { style: 'thin' };
|
|
511
|
+
if (c === cols)
|
|
512
|
+
edge.right = { style: 'thin' };
|
|
513
|
+
row3.getCell(c).border = edge;
|
|
514
|
+
}
|
|
515
|
+
wb.xlsx.writeBuffer().then(buf => {
|
|
516
|
+
FileSaver.saveAs(new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }), 'Statement_of_Accounts.xlsx');
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
exportToCSV() {
|
|
520
|
+
const sections = this.getVisibleGrids()
|
|
521
|
+
.map(s => {
|
|
522
|
+
const data = this.getDisplayedData(s.api);
|
|
523
|
+
let rows = this.buildRows(data);
|
|
524
|
+
if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
|
|
525
|
+
rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
|
|
526
|
+
}
|
|
527
|
+
if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
|
|
528
|
+
rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
|
|
529
|
+
}
|
|
530
|
+
return rows.length ? { title: s.title, headers: this.getHeaders(), rows } : null;
|
|
531
|
+
})
|
|
532
|
+
.filter(Boolean);
|
|
533
|
+
if (!sections.length)
|
|
534
|
+
return;
|
|
535
|
+
const lines = [];
|
|
536
|
+
lines.push(this.ReportName);
|
|
537
|
+
Object.entries(this.metaDataOne || {}).forEach(([k, v]) => lines.push(`${k}: ${v ?? ''}`));
|
|
538
|
+
sections.forEach((sec, idx) => {
|
|
539
|
+
lines.push(sec.title);
|
|
540
|
+
lines.push(sec.headers.join(','));
|
|
541
|
+
sec.rows.forEach(r => lines.push(r.map(v => `"${v ?? ''}"`).join(',')));
|
|
542
|
+
if (idx < sections.length - 1) {
|
|
543
|
+
lines.push('');
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
lines.push(`"Closing Balance",,"${Number(this.closingBalanceInSettlment || 0).toFixed(3)}","${Number(this.closingBalance || 0).toFixed(3)}"`);
|
|
547
|
+
lines.push(`"${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}"`);
|
|
548
|
+
lines.push(`"${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}"`);
|
|
549
|
+
const csv = lines.join('\n');
|
|
550
|
+
FileSaver.saveAs(new Blob([csv], { type: 'text/csv;charset=utf-8' }), 'Statement_of_Accounts.csv');
|
|
551
|
+
}
|
|
552
|
+
loadImageAsBase64(src) {
|
|
553
|
+
return new Promise((resolve, reject) => {
|
|
554
|
+
const img = new Image();
|
|
555
|
+
img.crossOrigin = 'anonymous';
|
|
556
|
+
img.src = src;
|
|
557
|
+
img.onload = () => {
|
|
558
|
+
const canvas = document.createElement('canvas');
|
|
559
|
+
canvas.width = img.width;
|
|
560
|
+
canvas.height = img.height;
|
|
561
|
+
const ctx = canvas.getContext('2d');
|
|
562
|
+
if (!ctx)
|
|
563
|
+
return reject('Canvas context failed');
|
|
564
|
+
ctx.drawImage(img, 0, 0);
|
|
565
|
+
resolve(canvas.toDataURL('image/png'));
|
|
566
|
+
};
|
|
567
|
+
img.onerror = () => reject('Failed to load image: ' + src);
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
getDisplayedData(api) {
|
|
571
|
+
if (!api)
|
|
572
|
+
return [];
|
|
573
|
+
const rows = [];
|
|
574
|
+
const count = api.getDisplayedRowCount();
|
|
575
|
+
for (let i = 0; i < count; i++) {
|
|
576
|
+
const node = api.getDisplayedRowAtIndex(i);
|
|
577
|
+
if (node && !node.group && !node.rowPinned)
|
|
578
|
+
rows.push(node.data);
|
|
579
|
+
}
|
|
580
|
+
return rows;
|
|
581
|
+
}
|
|
582
|
+
getHeaders() {
|
|
583
|
+
return this.columnDefs.map(c => c.headerName || c.field);
|
|
584
|
+
}
|
|
585
|
+
format3(n) {
|
|
586
|
+
if (n == null || n === '')
|
|
587
|
+
return '';
|
|
588
|
+
const num = Number(n);
|
|
589
|
+
return num.toFixed(3);
|
|
590
|
+
}
|
|
591
|
+
buildRows(data) {
|
|
592
|
+
return data.map(row => this.columnDefs.map(col => {
|
|
593
|
+
const f = col.field;
|
|
594
|
+
if (f === 'amountInSettlmentCcy' || f === 'amountInUSD') {
|
|
595
|
+
return this.format3(row[f]);
|
|
596
|
+
}
|
|
597
|
+
return row[f] ?? '';
|
|
598
|
+
}));
|
|
599
|
+
}
|
|
600
|
+
getVisibleGrids() {
|
|
601
|
+
const out = [];
|
|
602
|
+
out.push({ title: '', api: this.openingGridApi });
|
|
603
|
+
if (this.selectedClientType === 'SendClient' || this.selectedClientType === 'Both') {
|
|
604
|
+
out.push({ title: 'Send Details', api: this.sendGridApi });
|
|
605
|
+
}
|
|
606
|
+
if (this.selectedClientType === 'ReceiveClient' || this.selectedClientType === 'Both') {
|
|
607
|
+
out.push({ title: 'Receive Details', api: this.receiveGridApi });
|
|
608
|
+
}
|
|
609
|
+
return out;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
StatementOfAccountsReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StatementOfAccountsReportComponent, deps: [{ token: i1.ReportService }], target: i0.ɵɵFactoryTarget.Component });
|
|
613
|
+
StatementOfAccountsReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StatementOfAccountsReportComponent, selector: "lib-statement-of-accounts-report", ngImport: i0, template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\">\r\n</lib-search-filter>\r\n\r\n<app-loader *ngIf=\"loadingState === ComponentLoadingState.Loading\"></app-loader>\r\n<span *ngIf=\"loadingState === ComponentLoadingState.Error\">{{ errorMessage }}</span>\r\n<div *ngIf=\"showTables\">\r\n<lib-metadata \r\n [reportName]=\"ReportName\" \r\n [showmetaDataOne]=\"true\" \r\n [showmetaDataTwo]=\"false\" \r\n [metaDataOne]=\"metaDataOne\"\r\n [metaDataTwo]=\"\" \r\n (exportEvent)=\"handleExport($event)\" \r\n (searchEvent)=\"filter($event)\">\r\n </lib-metadata>\r\n\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"openingBalAndFunding\"\r\n [columnDefs]=\"columnDefs\"\r\n [pinnedBottomRowData]=\"[]\"\r\n [headerHeight]=\"32\" \r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n (gridReady)=\"onOpeningGridReady($event)\"\r\n style=\"width: 100%; height: 91px;\">\r\n</ag-grid-angular>\r\n\r\n<div *ngIf=\"(selectedClientType === 'SendClient' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Send Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"sendDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"sendPinnedBottomRow\"\r\n (gridReady)=\"onSendGridReady($event)\" \r\n style=\"width: 100%; height: 203px;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n<div *ngIf=\"(selectedClientType === 'ReceiveClient' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Receive Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"receiveDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"receivePinnedBottomRow\"\r\n (gridReady)=\"onReceiveGridReady($event)\" \r\n style=\"width: 100%; height: 203px;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n\r\n<!-- Closing balance row -->\r\n<div class=\"closing-balance-row\">\r\n <div class=\"label\" title=\"Closing Balance\">\r\n Closing Balance\r\n </div>\r\n\r\n <div class=\"settlement\" \r\n [title]=\"closingBalanceSettlmentFormatted\">\r\n {{ closingBalanceSettlmentFormatted }}\r\n </div>\r\n\r\n <div class=\"value\" [title]=\"closingBalanceInUsdFormatted\">\r\n {{ closingBalanceInUsdFormatted }}\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- settlement currency words row -->\r\n<div class=\"closing-balance-row closing-balance-words\"\r\n *ngIf=\"closingBalanceSettlmentInWords\">\r\n <div class=\"label\"\r\n [title]=\"closingBalanceSettlmentCurrency + ' - ' + closingBalanceSettlmentInWords\">\r\n {{ closingBalanceSettlmentCurrency }} - {{ closingBalanceSettlmentInWords }}\r\n </div>\r\n</div>\r\n\r\n<!-- existing USD words row (keep as-is) -->\r\n<div class=\"closing-balance-row closing-balance-words\">\r\n <div class=\"label\" [title]=\"closingBalanceCurrency + ' - ' + closingBalanceUSDInWords\">\r\n {{ closingBalanceCurrency }} - {{ closingBalanceUSDInWords }}\r\n </div>\r\n</div>\r\n", styles: [".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;height:auto!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}::ng-deep .compact-grid .ag-cell{cursor:default!important;border-right:1px solid #e0e0e0;padding:2px 3px!important;font-size:9px!important;display:flex!important;align-items:center!important}::ng-deep .compact-grid .ag-cell-value{cursor:text!important;font-size:9px!important;padding:0 3px 0 2px!important}::ng-deep .compact-grid .ag-right-aligned-cell{text-align:right!important;justify-content:flex-end!important;text-overflow:ellipsis}::ng-deep .ag-theme-alpine .pinned-total-cell{font-weight:700!important}.details-table{background-color:#d3d3d3;margin-bottom:0;height:32px;align-content:center}.closing-balance-row{display:flex;border:1px solid #ccc;border-top:none;font-size:10px!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-weight:700;height:28px;align-items:center}.closing-balance-row .label{flex:4.9;padding:6px;text-align:left;border-right:1px solid #ccc}.closing-balance-row .settlement{flex:2;padding:6px;text-align:right;border-right:1px solid #ccc}.closing-balance-row .value{flex:2;padding:6px;text-align:right}\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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MetadataComponent, selector: "lib-metadata", inputs: ["metaDataOne", "metaDataTwo", "showmetaDataOne", "showmetaDataTwo", "reportName"], outputs: ["searchEvent", "exportEvent"] }, { kind: "component", type: i5.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i6.SearchFilterComponent, selector: "lib-search-filter", inputs: ["ReportName"], outputs: ["searchClicked"] }] });
|
|
614
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StatementOfAccountsReportComponent, decorators: [{
|
|
615
|
+
type: Component,
|
|
616
|
+
args: [{ selector: 'lib-statement-of-accounts-report', template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\">\r\n</lib-search-filter>\r\n\r\n<app-loader *ngIf=\"loadingState === ComponentLoadingState.Loading\"></app-loader>\r\n<span *ngIf=\"loadingState === ComponentLoadingState.Error\">{{ errorMessage }}</span>\r\n<div *ngIf=\"showTables\">\r\n<lib-metadata \r\n [reportName]=\"ReportName\" \r\n [showmetaDataOne]=\"true\" \r\n [showmetaDataTwo]=\"false\" \r\n [metaDataOne]=\"metaDataOne\"\r\n [metaDataTwo]=\"\" \r\n (exportEvent)=\"handleExport($event)\" \r\n (searchEvent)=\"filter($event)\">\r\n </lib-metadata>\r\n\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"openingBalAndFunding\"\r\n [columnDefs]=\"columnDefs\"\r\n [pinnedBottomRowData]=\"[]\"\r\n [headerHeight]=\"32\" \r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n (gridReady)=\"onOpeningGridReady($event)\"\r\n style=\"width: 100%; height: 91px;\">\r\n</ag-grid-angular>\r\n\r\n<div *ngIf=\"(selectedClientType === 'SendClient' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Send Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"sendDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"sendPinnedBottomRow\"\r\n (gridReady)=\"onSendGridReady($event)\" \r\n style=\"width: 100%; height: 203px;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n<div *ngIf=\"(selectedClientType === 'ReceiveClient' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Receive Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"receiveDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"receivePinnedBottomRow\"\r\n (gridReady)=\"onReceiveGridReady($event)\" \r\n style=\"width: 100%; height: 203px;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n\r\n<!-- Closing balance row -->\r\n<div class=\"closing-balance-row\">\r\n <div class=\"label\" title=\"Closing Balance\">\r\n Closing Balance\r\n </div>\r\n\r\n <div class=\"settlement\" \r\n [title]=\"closingBalanceSettlmentFormatted\">\r\n {{ closingBalanceSettlmentFormatted }}\r\n </div>\r\n\r\n <div class=\"value\" [title]=\"closingBalanceInUsdFormatted\">\r\n {{ closingBalanceInUsdFormatted }}\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- settlement currency words row -->\r\n<div class=\"closing-balance-row closing-balance-words\"\r\n *ngIf=\"closingBalanceSettlmentInWords\">\r\n <div class=\"label\"\r\n [title]=\"closingBalanceSettlmentCurrency + ' - ' + closingBalanceSettlmentInWords\">\r\n {{ closingBalanceSettlmentCurrency }} - {{ closingBalanceSettlmentInWords }}\r\n </div>\r\n</div>\r\n\r\n<!-- existing USD words row (keep as-is) -->\r\n<div class=\"closing-balance-row closing-balance-words\">\r\n <div class=\"label\" [title]=\"closingBalanceCurrency + ' - ' + closingBalanceUSDInWords\">\r\n {{ closingBalanceCurrency }} - {{ closingBalanceUSDInWords }}\r\n </div>\r\n</div>\r\n", styles: [".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;height:auto!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}::ng-deep .compact-grid .ag-cell{cursor:default!important;border-right:1px solid #e0e0e0;padding:2px 3px!important;font-size:9px!important;display:flex!important;align-items:center!important}::ng-deep .compact-grid .ag-cell-value{cursor:text!important;font-size:9px!important;padding:0 3px 0 2px!important}::ng-deep .compact-grid .ag-right-aligned-cell{text-align:right!important;justify-content:flex-end!important;text-overflow:ellipsis}::ng-deep .ag-theme-alpine .pinned-total-cell{font-weight:700!important}.details-table{background-color:#d3d3d3;margin-bottom:0;height:32px;align-content:center}.closing-balance-row{display:flex;border:1px solid #ccc;border-top:none;font-size:10px!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-weight:700;height:28px;align-items:center}.closing-balance-row .label{flex:4.9;padding:6px;text-align:left;border-right:1px solid #ccc}.closing-balance-row .settlement{flex:2;padding:6px;text-align:right;border-right:1px solid #ccc}.closing-balance-row .value{flex:2;padding:6px;text-align:right}\n"] }]
|
|
617
|
+
}], ctorParameters: function () { return [{ type: i1.ReportService }]; } });
|
|
618
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvc3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0L3N0YXRlbWVudC1vZi1hY2NvdW50cy1yZXBvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDOzs7Ozs7OztBQVF4QyxNQUFNLE9BQU8sa0NBQWtDO0lBc0M3QyxZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXBDaEQsZUFBVSxHQUFHLHVCQUF1QixDQUFDO1FBQ25DLDBCQUFxQixHQUFHLHNCQUFzQixDQUFDO1FBQy9DLGlCQUFZLEdBQTJCLHNCQUFzQixDQUFDLFFBQVEsQ0FB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QyxJQUFJLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxHQUFHLEdBQXVDLEVBQUUsQ0FBQztRQUNuRCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssWUFBWSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxNQUFNLEVBQUU7WUFDbEYsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssZUFBZSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxNQUFNLEVBQUU7WUFDckYsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDbEU7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7OytIQXJyQlUsa0NBQWtDO21IQUFsQyxrQ0FBa0Msd0VDbkIvQywwd0dBNkZBOzJGRDFFYSxrQ0FBa0M7a0JBTjlDLFNBQVM7K0JBQ0Usa0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgR3JpZEFwaSB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaW5hbGl6ZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkaW5nU3RhdGVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbXBvbmVudC1sb2FkaW5nLXN0YXRlcyc7XHJcbmltcG9ydCB7IFJlcG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBTdGF0ZW1lbnRPZkFjY291bnRJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3N0YXRlbWVudC1vZi1hY2NvdW50LXJlcG9ydC9zdGF0ZW1lbnQtb2YtYWNjb3VudHMubW9kZWwnO1xyXG5pbXBvcnQganNQREYgZnJvbSAnanNwZGYnO1xyXG5pbXBvcnQgJ2pzcGRmLWF1dG90YWJsZSc7XHJcbmltcG9ydCAqIGFzIEV4Y2VsSlMgZnJvbSAnZXhjZWxqcyc7XHJcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXN0YXRlbWVudC1vZi1hY2NvdW50cy1yZXBvcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBTdGF0ZW1lbnRPZkFjY291bnRzUmVwb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgUmVwb3J0TmFtZSA9IFwiU3RhdGVtZW50IG9mIEFjY291bnRzXCI7XHJcbiAgICBDb21wb25lbnRMb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzO1xyXG4gICAgbG9hZGluZ1N0YXRlOiBDb21wb25lbnRMb2FkaW5nU3RhdGVzID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gICAgaGFzU2VhcmNoZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIG9wZW5pbmdCYWxBbmRGdW5kaW5nIDogU3RhdGVtZW50T2ZBY2NvdW50SXRlbVtdID1bXTtcclxuICAgIHNlbmREZXRhaWxzOiBTdGF0ZW1lbnRPZkFjY291bnRJdGVtW10gPVtdO1xyXG4gICAgcmVjZWl2ZURldGFpbHM6IFN0YXRlbWVudE9mQWNjb3VudEl0ZW1bXSA9W107XHJcbiAgICBub0RhdGFGcm9tQXBpOiBib29sZWFuO1xyXG4gICAgbWV0YURhdGFPbmU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgICB1c2VyOiBhbnk7XHJcbiAgICBjdXJyZW50RGF0ZVRpbWU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgc2VuZFBpbm5lZEJvdHRvbVJvdzogYW55W10gPSBbXTtcclxuICAgIHJlY2VpdmVQaW5uZWRCb3R0b21Sb3c6IGFueVtdID0gW107XHJcbiAgICBwcml2YXRlIHNlbmRHcmlkQXBpITogR3JpZEFwaTtcclxuICAgIHByaXZhdGUgcmVjZWl2ZUdyaWRBcGkhOiBHcmlkQXBpO1xyXG4gICAgcHJpdmF0ZSBvcGVuaW5nR3JpZEFwaSE6IEdyaWRBcGk7XHJcbiAgICBzZWFyY2hUZXh0OiBzdHJpbmc7XHJcbiAgICBjbG9zaW5nQmFsYW5jZTogbnVtYmVyID0gMDtcclxuXHJcbiAgY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSA9ICdVU0QnO1xyXG4gIGNsb3NpbmdCYWxhbmNlVVNESW5Xb3Jkczogc3RyaW5nID0gJyc7XHJcblxyXG4gIHNlbGVjdGVkQ2xpZW50VHlwZTogc3RyaW5nID0gJyc7XHJcbiAgc2hvd1RhYmxlcyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9nb0Jhc2U2ND86IHN0cmluZztcclxuICBzZWxlY3RlZEV4cG9ydE9wdGlvbjogc3RyaW5nO1xyXG5cclxuICBjbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50OiBudW1iZXIgPSAwO1xyXG4gIGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Q3VycmVuY3k6IHN0cmluZyA9ICcnO1xyXG4gIGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3Jkczogc3RyaW5nID0gJyc7XHJcbiAgY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRGb3JtYXR0ZWQ6IHN0cmluZyA9ICcwLjAwMCc7XHJcbiAgY2xvc2luZ0JhbGFuY2VJblVzZEZvcm1hdHRlZDogc3RyaW5nID0gJzAuMDAwJztcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVwb3J0U2VydmljZTogUmVwb3J0U2VydmljZSkgeyB9XHJcblxyXG4gICAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmxvZ29CYXNlNjQgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUFzQmFzZTY0KCdhc3NldHMvcmVwb3J0cy1saWIvYXNzZXRzL2ltYWdlcy9YTUxvZ28ucG5nJyk7XHJcbiAgfVxyXG4gIFxyXG4gICAgY29sdW1uRGVmcyA9IFtcclxuICAgICAgLy8geyBoZWFkZXJOYW1lOiAnSUQnLCBmaWVsZDogJ2lkJywgd2lkdGg6IDEwMCB9LFxyXG4gICAgICB7IGhlYWRlck5hbWU6ICdEZXNjcmlwdGlvbicsIGZpZWxkOiAnZGVzY3JpcHRpb24nLCBmbGV4OiA0LCB0b29sdGlwRmllbGQ6ICdkZXNjcmlwdGlvbicsIGNlbGxDbGFzc1J1bGVzOiB7ICdwaW5uZWQtdG90YWwtY2VsbCc6IHBhcmFtcyA9PiBwYXJhbXMubm9kZS5yb3dQaW5uZWQgPT09ICdib3R0b20nIH0gfSxcclxuICAgICAgeyBoZWFkZXJOYW1lOiAnU2V0dGxtZW50IENjeScsIGZpZWxkOiAnc2V0dGxtZW50Q2N5JywgZmxleDogMSwgdG9vbHRpcEZpZWxkOiAnc2V0dGxtZW50Q2N5JywgY2VsbENsYXNzUnVsZXM6IHsgJ3Bpbm5lZC10b3RhbC1jZWxsJzogcGFyYW1zID0+IHBhcmFtcy5ub2RlLnJvd1Bpbm5lZCA9PT0gJ2JvdHRvbScgfSB9LFxyXG4gICAgICB7IGhlYWRlck5hbWU6ICdBbW91bnQgSW4gU2V0dGxtZW50IENjeScsIGZpZWxkOiAnYW1vdW50SW5TZXR0bG1lbnRDY3knLCBmbGV4OiAyLjEsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCcsIHZhbHVlRm9ybWF0dGVyOiB0aGlzLmN1cnJlbmN5Rm9ybWF0dGVyLCB0b29sdGlwVmFsdWVHZXR0ZXI6IChwYXJhbXM6IGFueSkgPT4gdGhpcy5jdXJyZW5jeUZvcm1hdHRlcihwYXJhbXMpLCBjZWxsQ2xhc3NSdWxlczogeyAncGlubmVkLXRvdGFsLWNlbGwnOiBwYXJhbXMgPT4gcGFyYW1zLm5vZGUucm93UGlubmVkID09PSAnYm90dG9tJyB9IH0sXHJcbiAgICAgIHsgaGVhZGVyTmFtZTogJ0Ftb3VudCBJbiBVU0QnLCBmaWVsZDogJ2Ftb3VudEluVVNEJywgZmxleDogMi4xLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwnLCB2YWx1ZUZvcm1hdHRlcjogdGhpcy5jdXJyZW5jeUZvcm1hdHRlciwgdG9vbHRpcFZhbHVlR2V0dGVyOiAocGFyYW1zOiBhbnkpID0+IHRoaXMuY3VycmVuY3lGb3JtYXR0ZXIocGFyYW1zKSwgY2VsbENsYXNzUnVsZXM6IHsgJ3Bpbm5lZC10b3RhbC1jZWxsJzogcGFyYW1zID0+IHBhcmFtcy5ub2RlLnJvd1Bpbm5lZCA9PT0gJ2JvdHRvbScgfSB9XHJcbiAgICBdO1xyXG4gIFxyXG4gICAgZGVmYXVsdENvbERlZiA9IHtcclxuICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgIGZpbHRlcjogZmFsc2UsXHJcbiAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgbWlud2lkdGg6IDQwLFxyXG4gICAgICB3cmFwSGVhZGVyVGV4dDogdHJ1ZSxcclxuICAgICAgYXV0b0hlYWRlckhlaWdodDogdHJ1ZSxcclxuICAgICAgc3VwcHJlc3NTaXplVG9GaXQ6IGZhbHNlLFxyXG4gICAgICB3cmFwVGV4dDogdHJ1ZSxcclxuICAgICAgYXV0b0hlaWdodDogdHJ1ZVxyXG4gICAgfTtcclxuICBcclxuICAgIGN1cnJlbmN5Rm9ybWF0dGVyKHBhcmFtczogYW55KSB7XHJcbiAgICAgIGlmIChwYXJhbXMudmFsdWUgPT0gbnVsbCkgcmV0dXJuICcwLjAwMCc7XHJcbiAgICAgIGNvbnN0IG51bSA9IE51bWJlcihwYXJhbXMudmFsdWUpO1xyXG4gICAgICByZXR1cm4gbnVtLnRvRml4ZWQoMyk7IC8vIHJvdW5kcyB0byAzIGRlY2ltYWxzXHJcbiAgICB9XHJcbiAgXHJcbiAgXHJcbiAgICBhc3luYyBoYW5kbGVTZWFyY2goY3JpdGVyaWE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBtb2RhbCA9IGNyaXRlcmlhLm1vZGFsO1xyXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIGJ1c2luZXNzUGFydG5lcklEOiBOdW1iZXIobW9kYWwuY2xpZW50KSxcclxuICAgICAgICBmcm9tRGF0ZTogbmV3IERhdGUobW9kYWwuZnJvbURhdGUpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgdG9EYXRlOiBuZXcgRGF0ZShtb2RhbC50b0RhdGUpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgY2xpZW50VHlwZTogY3JpdGVyaWEuY2xpZW50VHlwZVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnVzZXIgPSBjcml0ZXJpYS5zeXNVc2VySURcclxuICAgICAgdGhpcy5tZXRhRGF0YU9uZSA9IHtcclxuICAgICAgICAnUmVwb3J0IFVzZXInOiB0aGlzLnVzZXIsXHJcbiAgICAgICAgJ1JlcG9ydCBUaW1lJzogZm9ybWF0RGF0ZSh0aGlzLmN1cnJlbnREYXRlVGltZSwgJ2RkL01NL3l5eXkgaGg6bW0gYScsICdlbi1VUycpLFxyXG4gICAgICAgICdDbGllbnQnOiBjcml0ZXJpYS5jbGllbnROYW1lXHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coY3JpdGVyaWEuY2xpZW50TmFtZSlcclxuICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkxvYWRpbmc7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgICAgIHRoaXMuc2hvd1RhYmxlcyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9IGNyaXRlcmlhLmNsaWVudFR5cGU7XHJcbiAgXHJcbiAgICAgIHRoaXMucmVwb3J0U2VydmljZS5nZXRTdGF0ZW1lbnRPZkFjY291bnQocGF5bG9hZClcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gICAgICAgICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zaG93VGFibGVzID0gdHJ1ZTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgICAgICAgICAgdGhpcy5vcGVuaW5nQmFsQW5kRnVuZGluZyA9IGRhdGEub3BlbmluZ0JhbEFuZEZ1bmRpbmcgPz8gW107XHJcbiAgICAgICAgICAgIHRoaXMuc2VuZERldGFpbHMgPSBkYXRhLnNlbmREZXRhaWxzID8/IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVEZXRhaWxzID0gZGF0YS5yZWNlaXZlRGV0YWlscyA/PyBbXTtcclxuICBcclxuICAgICAgICAgICAgLy8gYWRkIHBpbm5lZCB0b3RhbHNcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDbGllbnRUeXBlID09IFwiU2VuZENsaWVudFwiKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZW5kUGlubmVkQm90dG9tUm93ID0gW3RoaXMuYnVpbGRUb3RhbFJvdyh0aGlzLnNlbmREZXRhaWxzKV07XHJcbiAgICAgICAgICAgICAgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93ID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZENsaWVudFR5cGUgPT0gXCJSZWNlaXZlQ2xpZW50XCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cgPSBbdGhpcy5idWlsZFRvdGFsUm93KHRoaXMucmVjZWl2ZURldGFpbHMpXTtcclxuICAgICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gXCJCb3RoXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbdGhpcy5idWlsZFRvdGFsUm93KHRoaXMuc2VuZERldGFpbHMpXTtcclxuICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cgPSBbdGhpcy5idWlsZFRvdGFsUm93KHRoaXMucmVjZWl2ZURldGFpbHMpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbXTtcclxuICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNsb3NpbmdCYWxhbmNlKCk7XHJcbiAgXHJcbiAgICAgICAgICAgIHRoaXMubm9EYXRhRnJvbUFwaSA9XHJcbiAgICAgICAgICAgICAgdGhpcy5vcGVuaW5nQmFsQW5kRnVuZGluZy5sZW5ndGggPT09IDAgJiZcclxuICAgICAgICAgICAgICB0aGlzLnNlbmREZXRhaWxzLmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgICAgICAgICAgICghdGhpcy5yZWNlaXZlRGV0YWlscyB8fCB0aGlzLnJlY2VpdmVEZXRhaWxzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgU3RhdGVtZW50IG9mIEFjY291bnRzOicsIGVycik7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ0ZhaWxlZCB0byBsb2FkIFN0YXRlbWVudCBvZiBBY2NvdW50cyc7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5zZW5kRGV0YWlscyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVEZXRhaWxzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5FcnJvcjtcclxuICAgICAgICAgICAgdGhpcy5zaG93VGFibGVzID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIGJ1aWxkVG90YWxSb3cocm93czogeyBhbW91bnRJblNldHRsbWVudENjeTogbnVtYmVyOyBhbW91bnRJblVTRDogbnVtYmVyIH1bXSkge1xyXG4gICAgICBjb25zdCB0b3RhbFNldHRsZSA9IChyb3dzIHx8IFtdKS5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKE51bWJlcihyLmFtb3VudEluU2V0dGxtZW50Q2N5KSB8fCAwKSwgMCk7XHJcbiAgICAgIGNvbnN0IHRvdGFsVXNkID0gKHJvd3MgfHwgW10pLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5VU0QpIHx8IDApLCAwKTtcclxuICBcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpZDogbnVsbCxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsJyxcclxuICAgICAgICBzZXR0bG1lbnRDY3k6ICcnLFxyXG4gICAgICAgIGFtb3VudEluU2V0dGxtZW50Q2N5OiBOdW1iZXIodG90YWxTZXR0bGUudG9GaXhlZCgzKSksXHJcbiAgICAgICAgYW1vdW50SW5VU0Q6IE51bWJlcih0b3RhbFVzZC50b0ZpeGVkKDMpKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIFxyXG4gICAgb25PcGVuaW5nR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICAgIHRoaXMub3BlbmluZ0dyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgfVxyXG4gICAgb25TZW5kR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICAgIHRoaXMuc2VuZEdyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgfVxyXG4gICAgb25SZWNlaXZlR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICAgIHRoaXMucmVjZWl2ZUdyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgZmlsdGVyKHRleHQ6IHN0cmluZykge1xyXG4gICAgICB0aGlzLnNlYXJjaFRleHQgPSB0ZXh0O1xyXG4gICAgICBpZiAodGhpcy5vcGVuaW5nR3JpZEFwaSkge1xyXG4gICAgICAgIHRoaXMub3BlbmluZ0dyaWRBcGkuc2V0UXVpY2tGaWx0ZXIodGhpcy5zZWFyY2hUZXh0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zZW5kR3JpZEFwaSkge1xyXG4gICAgICAgIHRoaXMuc2VuZEdyaWRBcGkuc2V0UXVpY2tGaWx0ZXIodGhpcy5zZWFyY2hUZXh0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5yZWNlaXZlR3JpZEFwaSkge1xyXG4gICAgICAgIHRoaXMucmVjZWl2ZUdyaWRBcGkuc2V0UXVpY2tGaWx0ZXIodGhpcy5zZWFyY2hUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIFxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDbG9zaW5nQmFsYW5jZSgpOiB2b2lkIHtcclxuICAgIC8vIFVTRCB0b3RhbHMgKGV4aXN0aW5nIGxvZ2ljKVxyXG4gICAgY29uc3Qgb3BlbmluZ0JhbFRvdGFsVXNkID0gKHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcgfHwgW10pLnJlZHVjZShcclxuICAgICAgKHN1bSwgcjogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5VU0QpIHx8IDApLCAwXHJcbiAgICApO1xyXG4gICAgY29uc3Qgc2VuZFRvdGFsVXNkID0gKHRoaXMuc2VuZERldGFpbHMgfHwgW10pLnJlZHVjZShcclxuICAgICAgKHN1bSwgcjogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5VU0QpIHx8IDApLCAwXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmVjZWl2ZVRvdGFsVXNkID0gKHRoaXMucmVjZWl2ZURldGFpbHMgfHwgW10pLnJlZHVjZShcclxuICAgICAgKHN1bSwgcjogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5VU0QpIHx8IDApLCAwXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmF3Q2xvc2luZ1VzZCA9IG9wZW5pbmdCYWxUb3RhbFVzZCArIHNlbmRUb3RhbFVzZCArIHJlY2VpdmVUb3RhbFVzZDtcclxuICAgIHRoaXMuY2xvc2luZ0JhbGFuY2UgPSBOdW1iZXIocmF3Q2xvc2luZ1VzZC50b0ZpeGVkKDMpKTsgLy8gbnVtZXJpYyBVU0RcclxuICBcclxuICAgIC8vIFNldHRsZW1lbnQgY3VycmVuY3kgdG90YWxzIChuZXcpXHJcbiAgICBjb25zdCBvcGVuaW5nU2V0dGxlID0gKHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcgfHwgW10pLnJlZHVjZShcclxuICAgICAgKHN1bSwgcjogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5TZXR0bG1lbnRDY3kpIHx8IDApLCAwXHJcbiAgICApO1xyXG4gICAgY29uc3Qgc2VuZFNldHRsZSA9ICh0aGlzLnNlbmREZXRhaWxzIHx8IFtdKS5yZWR1Y2UoXHJcbiAgICAgIChzdW0sIHI6IGFueSkgPT4gc3VtICsgKE51bWJlcihyLmFtb3VudEluU2V0dGxtZW50Q2N5KSB8fCAwKSwgMFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHJlY2VpdmVTZXR0bGUgPSAodGhpcy5yZWNlaXZlRGV0YWlscyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoc3VtLCByOiBhbnkpID0+IHN1bSArIChOdW1iZXIoci5hbW91bnRJblNldHRsbWVudENjeSkgfHwgMCksIDBcclxuICAgICk7XHJcbiAgICBjb25zdCByYXdDbG9zaW5nU2V0dGxlID0gb3BlbmluZ1NldHRsZSArIHNlbmRTZXR0bGUgKyByZWNlaXZlU2V0dGxlO1xyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50ID0gTnVtYmVyKHJhd0Nsb3NpbmdTZXR0bGUudG9GaXhlZCgzKSk7XHJcbiAgXHJcbiAgICAvLyBwaWNrIGEgc2V0dGxlbWVudCBjdXJyZW5jeSB0byBkaXNwbGF5IChmaXJzdCBub24tZW1wdHkpXHJcbiAgICB0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Q3VycmVuY3kgPSB0aGlzLmdldEZpcnN0U2V0dGxlbWVudEN1cnJlbmN5KCk7XHJcblxyXG4gICAgLy8gZm9ybWF0dGVkIHN0cmluZ3MgKG5vLXRob3VzYW5kLWNvbW1hLCAzIGRlY2ltYWxzKVxyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZUluVXNkRm9ybWF0dGVkID0gdGhpcy5mb3JtYXROb0NvbW1hKHRoaXMuY2xvc2luZ0JhbGFuY2UpO1xyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0Tm9Db21tYSh0aGlzLmNsb3NpbmdCYWxhbmNlSW5TZXR0bG1lbnQpO1xyXG4gIFxyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZVVTREluV29yZHMgPSB0aGlzLm51bWJlclRvV29yZHModGhpcy5jbG9zaW5nQmFsYW5jZSk7XHJcbiAgICB0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3JkcyA9XHJcbiAgICAgIHRoaXMuY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudCAhPT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLmNsb3NpbmdCYWxhbmNlSW5TZXR0bG1lbnQgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAhaXNOYU4oTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudCkpXHJcbiAgICAgICAgPyB0aGlzLm51bWJlclRvV29yZHModGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50KVxyXG4gICAgICAgIDogJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdE5vQ29tbWEodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHJldHVybiAnMC4wMDAnO1xyXG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcclxuICAgIGNvbnN0IHRydW5jYXRlZCA9IE1hdGgudHJ1bmMobnVtICogMTAwMCkgLyAxMDAwO1xyXG4gICAgcmV0dXJuIHRydW5jYXRlZC50b0ZpeGVkKDMpO1xyXG4gIH1cclxuICBcclxuICBcclxuICBwcml2YXRlIGdldEZpcnN0U2V0dGxlbWVudEN1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0cnlHZXQgPSAoYXJyOiBhbnlbXSkgPT4ge1xyXG4gICAgICBpZiAoIWFyciB8fCBhcnIubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XHJcbiAgICAgIGZvciAoY29uc3QgciBvZiBhcnIpIHtcclxuICAgICAgICBpZiAociAmJiByLnNldHRsbWVudENjeSkgcmV0dXJuIHIuc2V0dGxtZW50Q2N5O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH07XHJcbiAgXHJcbiAgICByZXR1cm4gdHJ5R2V0KHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcpIHx8IHRyeUdldCh0aGlzLnNlbmREZXRhaWxzKSB8fCB0cnlHZXQodGhpcy5yZWNlaXZlRGV0YWlscykgfHwgJyc7XHJcbiAgfVxyXG4gIFxyXG4gICAgbnVtYmVyVG9Xb3JkcyhudW06IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgIGlmIChudW0gPT09IDApIHJldHVybiBcIlplcm8gUG9pbnQgWmVybyBaZXJvIFplcm8gT25seVwiO1xyXG4gIFxyXG4gICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICBcclxuICAgICAgLy8gSGFuZGxlIG5lZ2F0aXZlIG51bWJlcnNcclxuICAgICAgaWYgKG51bSA8IDApIHtcclxuICAgICAgICByZXN1bHQgPSBcIk5lZ2F0aXZlIFwiO1xyXG4gICAgICAgIG51bSA9IE1hdGguYWJzKG51bSk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgLy8gU3BsaXQgaW50ZWdlciBhbmQgZGVjaW1hbCBwYXJ0c1xyXG4gICAgICBjb25zdCBpbnRlZ2VyUGFydCA9IE1hdGguZmxvb3IobnVtKTtcclxuICAgICAgY29uc3QgZGVjaW1hbFBhcnQgPSBNYXRoLnJvdW5kKChudW0gLSBpbnRlZ2VyUGFydCkgKiAxMDAwKTsgLy8gdXAgdG8gMyBkZWNpbWFsIHBsYWNlc1xyXG4gIFxyXG4gICAgICByZXN1bHQgKz0gdGhpcy5jb252ZXJ0TnVtYmVyKGludGVnZXJQYXJ0KTtcclxuICBcclxuICAgICAgaWYgKGRlY2ltYWxQYXJ0ID4gMCkge1xyXG4gICAgICAgIHJlc3VsdCArPSBcIiBQb2ludFwiO1xyXG4gICAgICAgIGNvbnN0IGRlY2ltYWxTdHIgPSBkZWNpbWFsUGFydC50b1N0cmluZygpLnBhZFN0YXJ0KDMsIFwiMFwiKTsgLy8ga2VlcCAzIGRpZ2l0c1xyXG4gICAgICAgIGZvciAoY29uc3QgZGlnaXQgb2YgZGVjaW1hbFN0cikge1xyXG4gICAgICAgICAgcmVzdWx0ICs9IFwiIFwiICsgdGhpcy5vbmVzWytkaWdpdF07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIHJldHVybiByZXN1bHQgKyBcIiBPbmx5XCI7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBIZWxwZXIgYXJyYXlzXHJcbiAgICBwcml2YXRlIG9uZXMgPSBbXCJaZXJvXCIsIFwiT25lXCIsIFwiVHdvXCIsIFwiVGhyZWVcIiwgXCJGb3VyXCIsIFwiRml2ZVwiLCBcIlNpeFwiLCBcIlNldmVuXCIsIFwiRWlnaHRcIiwgXCJOaW5lXCJdO1xyXG4gICAgcHJpdmF0ZSB0ZWVucyA9IFtcIlRlblwiLCBcIkVsZXZlblwiLCBcIlR3ZWx2ZVwiLCBcIlRoaXJ0ZWVuXCIsIFwiRm91cnRlZW5cIiwgXCJGaWZ0ZWVuXCIsIFwiU2l4dGVlblwiLCBcIlNldmVudGVlblwiLCBcIkVpZ2h0ZWVuXCIsIFwiTmluZXRlZW5cIl07XHJcbiAgICBwcml2YXRlIHRlbnMgPSBbXCJcIiwgXCJcIiwgXCJUd2VudHlcIiwgXCJUaGlydHlcIiwgXCJGb3J0eVwiLCBcIkZpZnR5XCIsIFwiU2l4dHlcIiwgXCJTZXZlbnR5XCIsIFwiRWlnaHR5XCIsIFwiTmluZXR5XCJdO1xyXG4gIFxyXG4gICAgLy8gQ29udmVydCB3aG9sZSBudW1iZXJzIChJbmRpYW4vSW50ZXJuYXRpb25hbCBzeXN0ZW0pXHJcbiAgICBwcml2YXRlIGNvbnZlcnROdW1iZXIobnVtOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICBpZiAobnVtID09PSAwKSByZXR1cm4gXCJcIjtcclxuICAgICAgaWYgKG51bSA8IDEwKSByZXR1cm4gdGhpcy5vbmVzW251bV07XHJcbiAgICAgIGlmIChudW0gPCAyMCkgcmV0dXJuIHRoaXMudGVlbnNbbnVtIC0gMTBdO1xyXG4gICAgICBpZiAobnVtIDwgMTAwKSByZXR1cm4gdGhpcy50ZW5zW01hdGguZmxvb3IobnVtIC8gMTApXSArIChudW0gJSAxMCAhPT0gMCA/IFwiIFwiICsgdGhpcy5vbmVzW251bSAlIDEwXSA6IFwiXCIpO1xyXG4gICAgICBpZiAobnVtIDwgMTAwMCkgcmV0dXJuIHRoaXMuY29udmVydE51bWJlcihNYXRoLmZsb29yKG51bSAvIDEwMCkpICsgXCIgSHVuZHJlZFwiICsgKG51bSAlIDEwMCAhPT0gMCA/IFwiIFwiICsgdGhpcy5jb252ZXJ0TnVtYmVyKG51bSAlIDEwMCkgOiBcIlwiKTtcclxuICAgICAgaWYgKG51bSA8IDEwMDAwMDApIHJldHVybiB0aGlzLmNvbnZlcnROdW1iZXIoTWF0aC5mbG9vcihudW0gLyAxMDAwKSkgKyBcIiBUaG91c2FuZFwiICsgKG51bSAlIDEwMDAgIT09IDAgPyBcIiBcIiArIHRoaXMuY29udmVydE51bWJlcihudW0gJSAxMDAwKSA6IFwiXCIpO1xyXG4gICAgICBpZiAobnVtIDwgMTAwMDAwMDAwMCkgcmV0dXJuIHRoaXMuY29udmVydE51bWJlcihNYXRoLmZsb29yKG51bSAvIDEwMDAwMDApKSArIFwiIE1pbGxpb25cIiArIChudW0gJSAxMDAwMDAwICE9PSAwID8gXCIgXCIgKyB0aGlzLmNvbnZlcnROdW1iZXIobnVtICUgMTAwMDAwMCkgOiBcIlwiKTtcclxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydE51bWJlcihNYXRoLmZsb29yKG51bSAvIDEwMDAwMDAwMDApKSArIFwiIEJpbGxpb25cIiArIChudW0gJSAxMDAwMDAwMDAwICE9PSAwID8gXCIgXCIgKyB0aGlzLmNvbnZlcnROdW1iZXIobnVtICUgMTAwMDAwMDAwMCkgOiBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgb25FeHBvcnRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEV4cG9ydE9wdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXhwb3J0KG9wdGlvbjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uID0gb3B0aW9uO1xyXG4gICAgc3dpdGNoICgodGhpcy5zZWxlY3RlZEV4cG9ydE9wdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdwZGYnOiB0aGlzLmV4cG9ydFRvUERGKCk7IGJyZWFrO1xyXG4gICAgICBjYXNlICdleGNlbCc6IHRoaXMuZXhwb3J0VG9FeGNlbCgpOyBicmVhaztcclxuICAgICAgY2FzZSAnY3N2JzogdGhpcy5leHBvcnRUb0NTVigpOyBicmVhaztcclxuICAgICAgZGVmYXVsdDogY29uc29sZS53YXJuKCdVbmtub3duIGV4cG9ydCB0eXBlOicsIHRoaXMuc2VsZWN0ZWRFeHBvcnRPcHRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9QREYoKTogdm9pZCB7XHJcbiAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLmdldFZpc2libGVHcmlkcygpXHJcbiAgICAubWFwKHMgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREaXNwbGF5ZWREYXRhKHMuYXBpKTtcclxuICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG4gICAgICBsZXQgcm93cyA9IHRoaXMuYnVpbGRSb3dzKGRhdGEpO1xyXG5cclxuICAgICAgaWYgKHMudGl0bGUgPT09ICdTZW5kIERldGFpbHMnICYmIHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzLnRpdGxlID09PSAnUmVjZWl2ZSBEZXRhaWxzJyAmJiB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgIHJvd3MgPSByb3dzLmNvbmNhdCh0aGlzLmJ1aWxkUm93cyh0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHJvd3MubGVuZ3RoID8geyB0aXRsZTogcy50aXRsZSwgaGVhZGVycywgcm93cyB9IDogbnVsbDtcclxuICAgIH0pXHJcbiAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHsgdGl0bGU6IHN0cmluZzsgaGVhZGVyczogc3RyaW5nW107IHJvd3M6IGFueVtdW10gfVtdO1xyXG4gIGlmICghc2VjdGlvbnMubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gIGNvbnN0IGRvYyA9IG5ldyBqc1BERih7IG9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJywgdW5pdDogJ21tJywgZm9ybWF0OiAnYTQnIH0pO1xyXG5cclxuICBpZiAodGhpcy5sb2dvQmFzZTY0KSB7XHJcbiAgICBkb2MuYWRkSW1hZ2UodGhpcy5sb2dvQmFzZTY0LCAnUE5HJywgMTUsIDEwLCAzOCwgMTgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgcGFnZVdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCk7XHJcbiAgY29uc3QgcGFnZUhlaWdodCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKTtcclxuICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICBkb2Muc2V0Rm9udFNpemUoMTUpO1xyXG4gIGRvYy50ZXh0KHRoaXMuUmVwb3J0TmFtZSwgcGFnZVdpZHRoIC8gMiwgMTgsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xyXG5cclxuICBsZXQgeSA9IDM0OyBcclxuICBkb2Muc2V0Rm9udFNpemUoMTApO1xyXG4gIE9iamVjdC5lbnRyaWVzKHRoaXMubWV0YURhdGFPbmUgfHwge30pLmZvckVhY2goKFtrLCB2XSkgPT4ge1xyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICBkb2MudGV4dChgJHtrfTogYCwgMTUsIHkpO1xyXG4gICAgY29uc3QgdyA9IGRvYy5nZXRUZXh0V2lkdGgoYCR7a306IGApO1xyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgIGRvYy50ZXh0KFN0cmluZyh2ID8/ICcnKSwgMTUgKyB3LCB5KTtcclxuICAgIHkgKz0gNjtcclxuICB9KTtcclxuXHJcbiAgY29uc3QgSEVBRCA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG5cclxuICBjb25zdCBtYXJnaW4gPSB7IGxlZnQ6IDE1LCByaWdodDogMTUgfTtcclxuICBjb25zdCBhdmFpbCA9IHBhZ2VXaWR0aCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xyXG4gIGNvbnN0IHdlaWdodHMgPSBbNCwgMSwgMiwgMl07XHJcbiAgY29uc3Qgc3VtID0gd2VpZ2h0cy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcclxuICBjb25zdCB3aWR0aHMgPSB3ZWlnaHRzLm1hcCh3ID0+ICh3IC8gc3VtKSAqIGF2YWlsKTtcclxuXHJcbiAgY29uc3Qgc2hhcmVkQ29sdW1uU3R5bGVzID0ge1xyXG4gICAgMDogeyBjZWxsV2lkdGg6IHdpZHRoc1swXSB9LFxyXG4gICAgMTogeyBjZWxsV2lkdGg6IHdpZHRoc1sxXSB9LCAgICAgICAgICAgICAgICAgIFxyXG4gICAgMjogeyBjZWxsV2lkdGg6IHdpZHRoc1syXSwgaGFsaWduOiAncmlnaHQnIH0sIFxyXG4gICAgMzogeyBjZWxsV2lkdGg6IHdpZHRoc1szXSwgaGFsaWduOiAncmlnaHQnIH0gIFxyXG4gIH07XHJcblxyXG4gIGNvbnN0IHRpdGxlR2FwQWJvdmVGaXJzdCA9IDA7XHJcbiAgY29uc3QgdGl0bGVHYXBBYm92ZURlZmF1bHQgPSA0O1xyXG4gIGNvbnN0IHRpdGxlR2FwQWJvdmVCaWcgPSA2O1xyXG4gIGNvbnN0IHRpdGxlVG9UYWJsZUdhcCA9IDI7XHJcbiAgY29uc3QgdG9wU3RhcnRZID0gMjA7XHJcbiAgY29uc3QgYm90dG9tUmVzZXJ2ZSA9IDIwO1xyXG5cclxuICBzZWN0aW9ucy5mb3JFYWNoKChzLCBpZHgpID0+IHtcclxuICAgIGNvbnN0IGlzRmlyc3QgPSBpZHggPT09IDA7XHJcbiAgICBjb25zdCBpc1NlbmRPclJlY2VpdmUgPSBzLnRpdGxlID09PSAnU2VuZCBEZXRhaWxzJyB8fCBzLnRpdGxlID09PSAnUmVjZWl2ZSBEZXRhaWxzJztcclxuICAgIGNvbnN0IHByZVRpdGxlR2FwID0gaXNGaXJzdCA/IDAgOiAoaXNTZW5kT3JSZWNlaXZlID8gdGl0bGVHYXBBYm92ZUJpZyA6IHRpdGxlR2FwQWJvdmVEZWZhdWx0KTtcclxuXHJcbiAgICBpZiAoeSArIHByZVRpdGxlR2FwICsgdGl0bGVUb1RhYmxlR2FwID4gcGFnZUhlaWdodCAtIGJvdHRvbVJlc2VydmUpIHtcclxuICAgICAgZG9jLmFkZFBhZ2UoKTtcclxuICAgICAgeSA9IHRvcFN0YXJ0WTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHkgKz0gcHJlVGl0bGVHYXA7XHJcbiAgICB9XHJcblxyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICBkb2Muc2V0Rm9udFNpemUoMTEpO1xyXG4gICAgZG9jLnRleHQocy50aXRsZSwgbWFyZ2luLmxlZnQsIHkpO1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0WUZvclRhYmxlID0geSArIChpc0ZpcnN0ID8gMCA6IHRpdGxlVG9UYWJsZUdhcCk7XHJcblxyXG4gICAgZG9jLmF1dG9UYWJsZSh7XHJcbiAgICAgIGhlYWQ6IFtIRUFEXSxcclxuICAgICAgYm9keTogcy5yb3dzLFxyXG4gICAgICBzdGFydFk6IHN0YXJ0WUZvclRhYmxlLFxyXG4gICAgICB0aGVtZTogJ2dyaWQnLFxyXG4gICAgICBtYXJnaW4sXHJcbiAgICAgIHRhYmxlV2lkdGg6IGF2YWlsLFxyXG4gICAgICBjb2x1bW5TdHlsZXM6IHNoYXJlZENvbHVtblN0eWxlcyxcclxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6IFsyMjAsIDIyMCwgMjIwXSwgdGV4dENvbG9yOiAwLCBmb250U3R5bGU6ICdib2xkJywgZm9udFNpemU6IDksIGhhbGlnbjogJ2NlbnRlcicgfSxcclxuICAgICAgYm9keVN0eWxlczogeyBmb250U2l6ZTogOCB9LFxyXG4gICAgICBzdHlsZXM6IHsgY2VsbFBhZGRpbmc6IDIsIG92ZXJmbG93OiAnbGluZWJyZWFrJywgbWluQ2VsbEhlaWdodDogNiB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB5ID0gKGRvYyBhcyBhbnkpLmxhc3RBdXRvVGFibGUuZmluYWxZO1xyXG4gIH0pO1xyXG4gIGlmICh5ICsgMzAgPiBwYWdlSGVpZ2h0IC0gYm90dG9tUmVzZXJ2ZSkge1xyXG4gICAgZG9jLmFkZFBhZ2UoKTtcclxuICAgIHkgPSB0b3BTdGFydFk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBjbG9zaW5nQm9keSA9IFtcclxuICAgIFtcclxuICAgICAgeyBjb250ZW50OiAnQ2xvc2luZyBCYWxhbmNlJywgY29sU3BhbjogMiwgc3R5bGVzOiB7IGhhbGlnbjogJ2xlZnQnLCBmb250U3R5bGU6ICdib2xkJyB9IH0sXHJcbiAgICAgIHsgY29udGVudDogTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudCB8fCAwKS50b0ZpeGVkKDMpLCBzdHlsZXM6IHsgaGFsaWduOiAncmlnaHQnIH0gfSxcclxuICAgICAgeyBjb250ZW50OiBOdW1iZXIodGhpcy5jbG9zaW5nQmFsYW5jZSB8fCAwKS50b0ZpeGVkKDMpLCBzdHlsZXM6IHsgaGFsaWduOiAncmlnaHQnIH0gfVxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgeyBjb250ZW50OiBgJHt0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Q3VycmVuY3kgfHwgJyd9IC0gJHt0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3JkcyB8fCAnJ31gLCBjb2xTcGFuOiA0LCBzdHlsZXM6IHsgaGFsaWduOiAnbGVmdCcgfSB9XHJcbiAgICBdLFxyXG4gICAgW1xyXG4gICAgICB7IGNvbnRlbnQ6IGAke3RoaXMuY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VVU0RJbldvcmRzIHx8ICcnfWAsIGNvbFNwYW46IDQsIHN0eWxlczogeyBoYWxpZ246ICdsZWZ0JyB9IH1cclxuICAgIF1cclxuICBdO1xyXG5cclxuICBkb2MuYXV0b1RhYmxlKHtcclxuICAgIGJvZHk6IGNsb3NpbmdCb2R5LFxyXG4gICAgc3RhcnRZOiB5LFxyXG4gICAgdGhlbWU6ICdncmlkJyxcclxuICAgIG1hcmdpbixcclxuICAgIHRhYmxlV2lkdGg6IGF2YWlsLFxyXG4gICAgY29sdW1uU3R5bGVzOiBzaGFyZWRDb2x1bW5TdHlsZXMsXHJcbiAgICBzdHlsZXM6IHsgY2VsbFBhZGRpbmc6IDIsIGZvbnRTaXplOiA5IH1cclxuICB9KTtcclxuXHJcbiAgZG9jLnNhdmUoJ1N0YXRlbWVudF9vZl9BY2NvdW50cy5wZGYnKTtcclxufVxyXG5cclxuICBleHBvcnRUb0V4Y2VsKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLmdldFZpc2libGVHcmlkcygpXHJcbiAgICAgIC5tYXAocyA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGlzcGxheWVkRGF0YShzLmFwaSk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG4gICAgICAgIGxldCByb3dzID0gdGhpcy5idWlsZFJvd3MoZGF0YSk7XHJcbiAgXHJcbiAgICAgICAgaWYgKHMudGl0bGUgPT09ICdTZW5kIERldGFpbHMnICYmIHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByb3dzID0gcm93cy5jb25jYXQodGhpcy5idWlsZFJvd3ModGhpcy5zZW5kUGlubmVkQm90dG9tUm93KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzLnRpdGxlID09PSAnUmVjZWl2ZSBEZXRhaWxzJyAmJiB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMucmVjZWl2ZVBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICByZXR1cm4gcm93cy5sZW5ndGggPyB7IHRpdGxlOiBzLnRpdGxlLCBoZWFkZXJzLCByb3dzIH0gOiBudWxsO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHsgdGl0bGU6IHN0cmluZzsgaGVhZGVyczogc3RyaW5nW107IHJvd3M6IGFueVtdW10gfVtdO1xyXG4gIFxyXG4gICAgaWYgKCFzZWN0aW9ucy5sZW5ndGgpIHJldHVybjtcclxuICBcclxuICAgIGNvbnN0IHdiID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdzID0gd2IuYWRkV29ya3NoZWV0KCdTdGF0ZW1lbnQgb2YgQWNjb3VudHMnKTtcclxuICAgIGxldCByID0gMTtcclxuICBcclxuICAgIGlmICh0aGlzLmxvZ29CYXNlNjQpIHtcclxuICAgICAgY29uc3QgaW1nSWQgPSB3Yi5hZGRJbWFnZSh7IGJhc2U2NDogdGhpcy5sb2dvQmFzZTY0LCBleHRlbnNpb246ICdwbmcnIH0pO1xyXG4gICAgICB3cy5hZGRJbWFnZShpbWdJZCwgeyB0bDogeyBjb2w6IDAsIHJvdzogMCB9LCBleHQ6IHsgd2lkdGg6IDE0NSwgaGVpZ2h0OiA2NiB9LCBlZGl0QXM6ICdvbmVDZWxsJyB9KTtcclxuICAgIH1cclxuICBcclxuICAgIHdzLmdldFJvdyhyKS5nZXRDZWxsKDIpLnZhbHVlID0gdGhpcy5SZXBvcnROYW1lO1xyXG4gICAgd3MuZ2V0Um93KHIpLmdldENlbGwoMikuZm9udCA9IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTYgfTtcclxuICAgIHIgKz0gMztcclxuICBcclxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMubWV0YURhdGFPbmUgfHwge30pLmZvckVhY2goKFtrLCB2XSkgPT4ge1xyXG4gICAgICB3cy5nZXRSb3cocisrKS5nZXRDZWxsKDEpLnZhbHVlID0gYCR7a306ICR7diA/PyAnJ31gO1xyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBjb25zdCB3cml0ZVNlY3Rpb24gPSAoc2VjOiB7IHRpdGxlOiBzdHJpbmc7IGhlYWRlcnM6IHN0cmluZ1tdOyByb3dzOiBhbnlbXVtdIH0pID0+IHtcclxuICAgICAgd3MuZ2V0Um93KHIrKykuZ2V0Q2VsbCgxKS52YWx1ZSA9IHNlYy50aXRsZTtcclxuICBcclxuICAgICAgY29uc3QgaGVhZGVyUm93ID0gd3MuZ2V0Um93KHIrKyk7XHJcbiAgICAgIHNlYy5oZWFkZXJzLmZvckVhY2goKGgsIGkpID0+IHtcclxuICAgICAgICBjb25zdCBjID0gaGVhZGVyUm93LmdldENlbGwoaSArIDEpO1xyXG4gICAgICAgIGMudmFsdWUgPSBoO1xyXG4gICAgICAgIGMuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG4gICAgICAgIGMuYWxpZ25tZW50ID0geyB2ZXJ0aWNhbDogJ21pZGRsZScsIGhvcml6b250YWw6ICdjZW50ZXInIH07XHJcbiAgICAgICAgYy5maWxsID0geyB0eXBlOiAncGF0dGVybicsIHBhdHRlcm46ICdzb2xpZCcsIGZnQ29sb3I6IHsgYXJnYjogJ0Q5RDlEOScgfSB9O1xyXG4gICAgICAgIGMuYm9yZGVyID0geyB0b3A6IHsgc3R5bGU6ICd0aGluJyB9LCBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LCBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSwgcmlnaHQ6IHsgc3R5bGU6ICd0aGluJyB9IH07XHJcbiAgICAgIH0pO1xyXG4gIFxyXG4gICAgICBjb25zdCBkYXRhU3RhcnQgPSByO1xyXG4gIFxyXG4gICAgICBzZWMucm93cy5mb3JFYWNoKHJvd0RhdGEgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHdzLmdldFJvdyhyKyspO1xyXG4gICAgICAgIHJvd0RhdGEuZm9yRWFjaCgodiwgaSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYyA9IHJvdy5nZXRDZWxsKGkgKyAxKTtcclxuICAgICAgICAgIGlmIChzZWMuaGVhZGVyc1tpXSA9PT0gJ0Ftb3VudCBJbiBTZXR0bG1lbnQgQ2N5JyB8fCBzZWMuaGVhZGVyc1tpXSA9PT0gJ0Ftb3VudCBJbiBVU0QnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IE51bWJlcih2LnJlcGxhY2UoL1ssIF0rL2csICcnKSkgOiBOdW1iZXIodik7XHJcbiAgICAgICAgICAgIGMudmFsdWUgPSBpc05hTihudW0pID8gKHYgPz8gJycpIDogbnVtO1xyXG4gICAgICAgICAgICBjLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JyB9O1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGMubnVtRm10ID0gJzAuMDAwJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGMudmFsdWUgPSB2ID8/ICcnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYy5ib3JkZXIgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LCByaWdodDogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgXHJcbiAgICAgIGZvciAobGV0IGNvbCA9IDE7IGNvbCA8PSBzZWMuaGVhZGVycy5sZW5ndGg7IGNvbCsrKSB7XHJcbiAgICAgICAgbGV0IG1heCA9IChzZWMuaGVhZGVyc1tjb2wgLSAxXSB8fCAnJykudG9TdHJpbmcoKS5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgcnIgPSBkYXRhU3RhcnQgLSAxOyByciA8IHI7IHJyKyspIHtcclxuICAgICAgICAgIGNvbnN0IHZhbCA9ICh3cy5nZXRSb3cocnIpLmdldENlbGwoY29sKS52YWx1ZSA/PyAnJykudG9TdHJpbmcoKTtcclxuICAgICAgICAgIGlmICh2YWwpIG1heCA9IE1hdGgubWF4KG1heCwgdmFsLmxlbmd0aCArIDIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3cy5nZXRDb2x1bW4oY29sKS53aWR0aCA9IE1hdGgubWluKE1hdGgubWF4KG1heCwgOCksIDYwKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICBcclxuICAgIHNlY3Rpb25zLmZvckVhY2goKHNlYywgaWR4KSA9PiB7XHJcbiAgICAgIHdyaXRlU2VjdGlvbihzZWMpO1xyXG4gICAgICBpZiAoaWR4IDwgc2VjdGlvbnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIHIrKztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBjb25zdCB0b3RhbENvbHMgPSBzZWN0aW9ucy5sZW5ndGhcclxuICAgICAgPyBNYXRoLm1heCguLi5zZWN0aW9ucy5tYXAocyA9PiBzLmhlYWRlcnMubGVuZ3RoKSlcclxuICAgICAgOiB0aGlzLmNvbHVtbkRlZnMubGVuZ3RoO1xyXG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KHRvdGFsQ29scywgNCk7XHJcbiAgICBjb25zdCBsYWJlbENvbHNFbmQgPSAyO1xyXG4gICAgY29uc3Qgc2V0dGxlQ29sID0gMzsgICAgICBcclxuICAgIGNvbnN0IHVzZENvbCA9IDQ7XHJcbiAgXHJcbiAgICBjb25zdCByb3cxID0gd3MuZ2V0Um93KHIrKyk7XHJcbiAgICB3cy5tZXJnZUNlbGxzKHJvdzEubnVtYmVyLCAxLCByb3cxLm51bWJlciwgbGFiZWxDb2xzRW5kKTtcclxuICAgIHJvdzEuZ2V0Q2VsbCgxKS52YWx1ZSA9ICdDbG9zaW5nIEJhbGFuY2UnO1xyXG4gICAgcm93MS5nZXRDZWxsKDEpLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgIHJvdzEuZ2V0Q2VsbCgxKS5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdsZWZ0JywgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcbiAgXHJcbiAgICBjb25zdCBzZXR0bGVWYWx1ZSA9IE51bWJlcih0aGlzLmNsb3NpbmdCYWxhbmNlSW5TZXR0bG1lbnQgPz8gMCk7XHJcbiAgICBjb25zdCB1c2RWYWx1ZSA9IE51bWJlcih0aGlzLmNsb3NpbmdCYWxhbmNlID8/IDApO1xyXG4gIFxyXG4gICAgY29uc3Qgc2V0dGxlQ2VsbCA9IHJvdzEuZ2V0Q2VsbChzZXR0bGVDb2wpO1xyXG4gICAgc2V0dGxlQ2VsbC52YWx1ZSA9IGlzTmFOKHNldHRsZVZhbHVlKSA/ICcnIDogc2V0dGxlVmFsdWU7XHJcbiAgICBzZXR0bGVDZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JyB9O1xyXG4gICAgaWYgKCFpc05hTihzZXR0bGVWYWx1ZSkpIHNldHRsZUNlbGwubnVtRm10ID0gJzAuMDAwJztcclxuICBcclxuICAgIGNvbnN0IHVzZENlbGwgPSByb3cxLmdldENlbGwodXNkQ29sKTtcclxuICAgIHVzZENlbGwudmFsdWUgPSBpc05hTih1c2RWYWx1ZSkgPyAnJyA6IHVzZFZhbHVlO1xyXG4gICAgdXNkQ2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdyaWdodCcgfTtcclxuICAgIGlmICghaXNOYU4odXNkVmFsdWUpKSB1c2RDZWxsLm51bUZtdCA9ICcwLjAwMCc7XHJcblxyXG4gICAgZm9yIChsZXQgYyA9IDE7IGMgPD0gY29sczsgYysrKSB7XHJcbiAgICAgIHJvdzEuZ2V0Q2VsbChjKS5ib3JkZXIgPSB7XHJcbiAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvdzIgPSB3cy5nZXRSb3cocisrKTtcclxuICAgIHdzLm1lcmdlQ2VsbHMocm93Mi5udW1iZXIsIDEsIHJvdzIubnVtYmVyLCBjb2xzKTtcclxuICAgIHJvdzIuZ2V0Q2VsbCgxKS52YWx1ZSA9IGAke3RoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRJbldvcmRzIHx8ICcnfWA7XHJcbiAgICByb3cyLmdldENlbGwoMSkuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gICAgcm93Mi5nZXRDZWxsKDEpLmZvbnQgPSB7IGl0YWxpYzogZmFsc2UgfTtcclxuICBcclxuICAgIGZvciAobGV0IGMgPSAxOyBjIDw9IGNvbHM7IGMrKykge1xyXG4gICAgICBjb25zdCBlZGdlOiBhbnkgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgICAgaWYgKGMgPT09IDEpIGVkZ2UubGVmdCA9IHsgc3R5bGU6ICd0aGluJyB9O1xyXG4gICAgICBpZiAoYyA9PT0gY29scykgZWRnZS5yaWdodCA9IHsgc3R5bGU6ICd0aGluJyB9O1xyXG4gICAgICByb3cyLmdldENlbGwoYykuYm9yZGVyID0gZWRnZTtcclxuICAgIH1cclxuICBcclxuICAgIGNvbnN0IHJvdzMgPSB3cy5nZXRSb3cocisrKTtcclxuICAgIHdzLm1lcmdlQ2VsbHMocm93My5udW1iZXIsIDEsIHJvdzMubnVtYmVyLCBjb2xzKTtcclxuICAgIHJvdzMuZ2V0Q2VsbCgxKS52YWx1ZSA9IGAke3RoaXMuY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VVU0RJbldvcmRzIHx8ICcnfWA7XHJcbiAgICByb3czLmdldENlbGwoMSkuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gIFxyXG4gICAgZm9yIChsZXQgYyA9IDE7IGMgPD0gY29sczsgYysrKSB7XHJcbiAgICAgIGNvbnN0IGVkZ2U6IGFueSA9IHsgdG9wOiB7IHN0eWxlOiAndGhpbicgfSwgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSB9O1xyXG4gICAgICBpZiAoYyA9PT0gMSkgZWRnZS5sZWZ0ID0geyBzdHlsZTogJ3RoaW4nIH07XHJcbiAgICAgIGlmIChjID09PSBjb2xzKSBlZGdlLnJpZ2h0ID0geyBzdHlsZTogJ3RoaW4nIH07XHJcbiAgICAgIHJvdzMuZ2V0Q2VsbChjKS5ib3JkZXIgPSBlZGdlO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgd2IueGxzeC53cml0ZUJ1ZmZlcigpLnRoZW4oYnVmID0+IHtcclxuICAgICAgRmlsZVNhdmVyLnNhdmVBcyhcclxuICAgICAgICBuZXcgQmxvYihbYnVmXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnIH0pLFxyXG4gICAgICAgICdTdGF0ZW1lbnRfb2ZfQWNjb3VudHMueGxzeCdcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9DU1YoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWN0aW9ucyA9IHRoaXMuZ2V0VmlzaWJsZUdyaWRzKClcclxuICAgICAgLm1hcChzID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREaXNwbGF5ZWREYXRhKHMuYXBpKTtcclxuICAgICAgICBsZXQgcm93cyA9IHRoaXMuYnVpbGRSb3dzKGRhdGEpO1xyXG4gIFxyXG4gICAgICAgIGlmIChzLnRpdGxlID09PSAnU2VuZCBEZXRhaWxzJyAmJiB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocy50aXRsZSA9PT0gJ1JlY2VpdmUgRGV0YWlscycgJiYgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHJvd3MgPSByb3dzLmNvbmNhdCh0aGlzLmJ1aWxkUm93cyh0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cpKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgcmV0dXJuIHJvd3MubGVuZ3RoID8geyB0aXRsZTogcy50aXRsZSwgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIHJvd3MgfSA6IG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgeyB0aXRsZTogc3RyaW5nOyBoZWFkZXJzOiBzdHJpbmdbXTsgcm93czogYW55W11bXSB9W107XHJcbiAgXHJcbiAgICBpZiAoIXNlY3Rpb25zLmxlbmd0aCkgcmV0dXJuO1xyXG4gIFxyXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsaW5lcy5wdXNoKHRoaXMuUmVwb3J0TmFtZSk7XHJcbiAgXHJcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLm1ldGFEYXRhT25lIHx8IHt9KS5mb3JFYWNoKChbaywgdl0pID0+IGxpbmVzLnB1c2goYCR7a306ICR7diA/PyAnJ31gKSk7XHJcbiAgXHJcbiAgICBzZWN0aW9ucy5mb3JFYWNoKChzZWMsIGlkeCkgPT4ge1xyXG4gICAgICBsaW5lcy5wdXNoKHNlYy50aXRsZSk7XHJcbiAgICAgIGxpbmVzLnB1c2goc2VjLmhlYWRlcnMuam9pbignLCcpKTtcclxuICAgICAgc2VjLnJvd3MuZm9yRWFjaChyID0+IGxpbmVzLnB1c2goci5tYXAodiA9PiBgXCIke3YgPz8gJyd9XCJgKS5qb2luKCcsJykpKTtcclxuICBcclxuICAgICAgaWYgKGlkeCA8IHNlY3Rpb25zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBsaW5lcy5wdXNoKCcnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBsaW5lcy5wdXNoKFxyXG4gICAgICBgXCJDbG9zaW5nIEJhbGFuY2VcIiwsXCIke051bWJlcih0aGlzLmNsb3NpbmdCYWxhbmNlSW5TZXR0bG1lbnQgfHwgMCkudG9GaXhlZCgzKX1cIixcIiR7TnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2UgfHwgMCkudG9GaXhlZCgzKX1cImBcclxuICAgICk7XHJcbiAgXHJcbiAgICBsaW5lcy5wdXNoKGBcIiR7dGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEN1cnJlbmN5IHx8ICcnfSAtICR7dGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEluV29yZHMgfHwgJyd9XCJgKTtcclxuICBcclxuICAgIGxpbmVzLnB1c2goYFwiJHt0aGlzLmNsb3NpbmdCYWxhbmNlQ3VycmVuY3kgfHwgJyd9IC0gJHt0aGlzLmNsb3NpbmdCYWxhbmNlVVNESW5Xb3JkcyB8fCAnJ31cImApO1xyXG4gIFxyXG4gICAgY29uc3QgY3N2ID0gbGluZXMuam9pbignXFxuJyk7XHJcbiAgICBGaWxlU2F2ZXIuc2F2ZUFzKFxyXG4gICAgICBuZXcgQmxvYihbY3N2XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtOCcgfSksXHJcbiAgICAgICdTdGF0ZW1lbnRfb2ZfQWNjb3VudHMuY3N2J1xyXG4gICAgKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGxvYWRJbWFnZUFzQmFzZTY0KHNyYzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcclxuICAgICAgaW1nLnNyYyA9IHNyYztcclxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgaWYgKCFjdHgpIHJldHVybiByZWplY3QoJ0NhbnZhcyBjb250ZXh0IGZhaWxlZCcpO1xyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcclxuICAgICAgICByZXNvbHZlKGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpKTtcclxuICAgICAgfTtcclxuICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoJ0ZhaWxlZCB0byBsb2FkIGltYWdlOiAnICsgc3JjKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5ZWREYXRhKGFwaT86IEdyaWRBcGkpOiBhbnlbXSB7XHJcbiAgICBpZiAoIWFwaSkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3Qgcm93czogYW55W10gPSBbXTtcclxuICAgIGNvbnN0IGNvdW50ID0gYXBpLmdldERpc3BsYXllZFJvd0NvdW50KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgY29uc3Qgbm9kZSA9IGFwaS5nZXREaXNwbGF5ZWRSb3dBdEluZGV4KGkpO1xyXG4gICAgICBpZiAobm9kZSAmJiAhbm9kZS5ncm91cCAmJiAhbm9kZS5yb3dQaW5uZWQpIHJvd3MucHVzaChub2RlLmRhdGEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvd3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEhlYWRlcnMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uRGVmcy5tYXAoYyA9PiBjLmhlYWRlck5hbWUgfHwgYy5maWVsZCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZm9ybWF0MyhuOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKG4gPT0gbnVsbCB8fCBuID09PSAnJykgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgbnVtID0gTnVtYmVyKG4pO1xyXG4gICAgcmV0dXJuIG51bS50b0ZpeGVkKDMpO1xyXG4gIH1cclxuICBwcml2YXRlIGJ1aWxkUm93cyhkYXRhOiBhbnlbXSk6IGFueVtdW10ge1xyXG4gICAgcmV0dXJuIGRhdGEubWFwKHJvdyA9PlxyXG4gICAgICB0aGlzLmNvbHVtbkRlZnMubWFwKGNvbCA9PiB7XHJcbiAgICAgICAgY29uc3QgZiA9IGNvbC5maWVsZDtcclxuICAgICAgICBpZiAoZiA9PT0gJ2Ftb3VudEluU2V0dGxtZW50Q2N5JyB8fCBmID09PSAnYW1vdW50SW5VU0QnKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQzKHJvd1tmXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByb3dbZl0gPz8gJyc7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWaXNpYmxlR3JpZHMoKTogeyB0aXRsZTogc3RyaW5nOyBhcGk/OiBHcmlkQXBpIH1bXSB7XHJcbiAgICBjb25zdCBvdXQ6IHsgdGl0bGU6IHN0cmluZzsgYXBpPzogR3JpZEFwaSB9W10gPSBbXTtcclxuICAgIG91dC5wdXNoKHsgdGl0bGU6ICcnLCBhcGk6IHRoaXMub3BlbmluZ0dyaWRBcGkgfSk7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENsaWVudFR5cGUgPT09ICdTZW5kQ2xpZW50JyB8fCB0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gJ0JvdGgnKSB7XHJcbiAgICAgIG91dC5wdXNoKHsgdGl0bGU6ICdTZW5kIERldGFpbHMnLCBhcGk6IHRoaXMuc2VuZEdyaWRBcGkgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENsaWVudFR5cGUgPT09ICdSZWNlaXZlQ2xpZW50JyB8fCB0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gJ0JvdGgnKSB7XHJcbiAgICAgIG91dC5wdXNoKHsgdGl0bGU6ICdSZWNlaXZlIERldGFpbHMnLCBhcGk6IHRoaXMucmVjZWl2ZUdyaWRBcGkgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0O1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGxpYi1zZWFyY2gtZmlsdGVyIFxyXG4gIFtSZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiBcclxuICAoc2VhcmNoQ2xpY2tlZCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiPlxyXG48L2xpYi1zZWFyY2gtZmlsdGVyPlxyXG5cclxuPGFwcC1sb2FkZXIgKm5nSWY9XCJsb2FkaW5nU3RhdGUgPT09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nXCI+PC9hcHAtbG9hZGVyPlxyXG48c3BhbiAqbmdJZj1cImxvYWRpbmdTdGF0ZSA9PT0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkVycm9yXCI+e3sgZXJyb3JNZXNzYWdlIH19PC9zcGFuPlxyXG48ZGl2ICpuZ0lmPVwic2hvd1RhYmxlc1wiPlxyXG48bGliLW1ldGFkYXRhIFxyXG4gICAgW3JlcG9ydE5hbWVdPVwiUmVwb3J0TmFtZVwiIFxyXG4gICAgW3Nob3dtZXRhRGF0YU9uZV09XCJ0cnVlXCIgXHJcbiAgICBbc2hvd21ldGFEYXRhVHdvXT1cImZhbHNlXCIgXHJcbiAgICBbbWV0YURhdGFPbmVdPVwibWV0YURhdGFPbmVcIlxyXG4gICAgW21ldGFEYXRhVHdvXT1cIlwiIFxyXG4gICAgKGV4cG9ydEV2ZW50KT1cImhhbmRsZUV4cG9ydCgkZXZlbnQpXCIgXHJcbiAgICAoc2VhcmNoRXZlbnQpPVwiZmlsdGVyKCRldmVudClcIj5cclxuICA8L2xpYi1tZXRhZGF0YT5cclxuXHJcbjxhZy1ncmlkLWFuZ3VsYXJcclxuICBjbGFzcz1cImFnLXRoZW1lLWFscGluZSB0cmFuc2FjdGlvbi1ncmlkXCJcclxuICBbcm93RGF0YV09XCJvcGVuaW5nQmFsQW5kRnVuZGluZ1wiXHJcbiAgW2NvbHVtbkRlZnNdPVwiY29sdW1uRGVmc1wiXHJcbiAgW3Bpbm5lZEJvdHRvbVJvd0RhdGFdPVwiW11cIlxyXG4gIFtoZWFkZXJIZWlnaHRdPVwiMzJcIiBcclxuICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCJcclxuICBbcm93SGVpZ2h0XT1cIjI4XCJcclxuICAoZ3JpZFJlYWR5KT1cIm9uT3BlbmluZ0dyaWRSZWFkeSgkZXZlbnQpXCJcclxuICBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDkxcHg7XCI+XHJcbjwvYWctZ3JpZC1hbmd1bGFyPlxyXG5cclxuPGRpdiAqbmdJZj1cIihzZWxlY3RlZENsaWVudFR5cGUgPT09ICdTZW5kQ2xpZW50JyB8fCBzZWxlY3RlZENsaWVudFR5cGUgPT09ICdCb3RoJylcIj5cclxuPGgzIGNsYXNzPVwiZGV0YWlscy10YWJsZVwiPjxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDNweDtcIj5TZW5kIERldGFpbHM8L3NwYW4+PC9oMz5cclxuPGFnLWdyaWQtYW5ndWxhclxyXG4gIGNsYXNzPVwiYWctdGhlbWUtYWxwaW5lIHRyYW5zYWN0aW9uLWdyaWRcIlxyXG4gIFtyb3dEYXRhXT1cInNlbmREZXRhaWxzXCJcclxuICBbY29sdW1uRGVmc109XCJjb2x1bW5EZWZzXCJcclxuICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCJcclxuICBbcm93SGVpZ2h0XT1cIjI4XCJcclxuICBbaGVhZGVySGVpZ2h0XT1cIjMyXCIgXHJcbiAgW3Bpbm5lZEJvdHRvbVJvd0RhdGFdPVwic2VuZFBpbm5lZEJvdHRvbVJvd1wiXHJcbiAgKGdyaWRSZWFkeSk9XCJvblNlbmRHcmlkUmVhZHkoJGV2ZW50KVwiIFxyXG4gIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMjAzcHg7XCI+XHJcbjwvYWctZ3JpZC1hbmd1bGFyPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCIoc2VsZWN0ZWRDbGllbnRUeXBlID09PSAnUmVjZWl2ZUNsaWVudCcgfHwgc2VsZWN0ZWRDbGllbnRUeXBlID09PSAnQm90aCcpXCI+XHJcbjxoMyBjbGFzcz1cImRldGFpbHMtdGFibGVcIj48c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAzcHg7XCI+UmVjZWl2ZSBEZXRhaWxzPC9zcGFuPjwvaDM+XHJcbjxhZy1ncmlkLWFuZ3VsYXJcclxuICBjbGFzcz1cImFnLXRoZW1lLWFscGluZSB0cmFuc2FjdGlvbi1ncmlkXCJcclxuICBbcm93RGF0YV09XCJyZWNlaXZlRGV0YWlsc1wiXHJcbiAgW2NvbHVtbkRlZnNdPVwiY29sdW1uRGVmc1wiXHJcbiAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiXHJcbiAgW3Jvd0hlaWdodF09XCIyOFwiXHJcbiAgW2hlYWRlckhlaWdodF09XCIzMlwiIFxyXG4gIFtwaW5uZWRCb3R0b21Sb3dEYXRhXT1cInJlY2VpdmVQaW5uZWRCb3R0b21Sb3dcIlxyXG4gIChncmlkUmVhZHkpPVwib25SZWNlaXZlR3JpZFJlYWR5KCRldmVudClcIiBcclxuICBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDIwM3B4O1wiPlxyXG48L2FnLWdyaWQtYW5ndWxhcj5cclxuPC9kaXY+XHJcblxyXG5cclxuPCEtLSBDbG9zaW5nIGJhbGFuY2Ugcm93IC0tPlxyXG48ZGl2IGNsYXNzPVwiY2xvc2luZy1iYWxhbmNlLXJvd1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJsYWJlbFwiIHRpdGxlPVwiQ2xvc2luZyBCYWxhbmNlXCI+XHJcbiAgICBDbG9zaW5nIEJhbGFuY2VcclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInNldHRsZW1lbnRcIiBcclxuICAgICAgIFt0aXRsZV09XCJjbG9zaW5nQmFsYW5jZVNldHRsbWVudEZvcm1hdHRlZFwiPlxyXG4gICAge3sgY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRGb3JtYXR0ZWQgfX1cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInZhbHVlXCIgW3RpdGxlXT1cImNsb3NpbmdCYWxhbmNlSW5Vc2RGb3JtYXR0ZWRcIj5cclxuICAgIHt7IGNsb3NpbmdCYWxhbmNlSW5Vc2RGb3JtYXR0ZWQgfX1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5cclxuPCEtLSBzZXR0bGVtZW50IGN1cnJlbmN5IHdvcmRzIHJvdyAtLT5cclxuPGRpdiBjbGFzcz1cImNsb3NpbmctYmFsYW5jZS1yb3cgY2xvc2luZy1iYWxhbmNlLXdvcmRzXCJcclxuICAgICAqbmdJZj1cImNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3Jkc1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICBbdGl0bGVdPVwiY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRDdXJyZW5jeSArICcgLSAnICsgY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRJbldvcmRzXCI+XHJcbiAgICB7eyBjbG9zaW5nQmFsYW5jZVNldHRsbWVudEN1cnJlbmN5IH19IC0ge3sgY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRJbldvcmRzIH19XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBleGlzdGluZyBVU0Qgd29yZHMgcm93IChrZWVwIGFzLWlzKSAtLT5cclxuPGRpdiBjbGFzcz1cImNsb3NpbmctYmFsYW5jZS1yb3cgY2xvc2luZy1iYWxhbmNlLXdvcmRzXCI+XHJcbiAgPGRpdiBjbGFzcz1cImxhYmVsXCIgW3RpdGxlXT1cImNsb3NpbmdCYWxhbmNlQ3VycmVuY3kgKyAnIC0gJyArIGNsb3NpbmdCYWxhbmNlVVNESW5Xb3Jkc1wiPlxyXG4gICAge3sgY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSB9fSAtIHt7IGNsb3NpbmdCYWxhbmNlVVNESW5Xb3JkcyB9fVxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|