@sachin9822/reports-lib 0.0.212 → 0.0.214

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +240 -0
  2. package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +596 -0
  3. package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +218 -0
  4. package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +243 -0
  5. package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +700 -0
  6. package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +255 -0
  7. package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +192 -0
  8. package/esm2020/lib/components/funding-report/funding-report.component.mjs +198 -0
  9. package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +244 -0
  10. package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +776 -0
  11. package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +266 -0
  12. package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +311 -0
  13. package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +658 -0
  14. package/esm2020/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.mjs +2 -0
  15. package/esm2020/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.mjs +2 -0
  16. package/esm2020/lib/models/accounting-report/accounting-report-branch-group.mjs +2 -0
  17. package/esm2020/lib/models/accounting-report/accounting-report-entry-model.mjs +2 -0
  18. package/esm2020/lib/models/accounting-report/accounting-report-model.mjs +2 -0
  19. package/esm2020/lib/models/accounting-report/accounting-report-sub-group.mjs +2 -0
  20. package/esm2020/lib/models/app-config.model.mjs +2 -0
  21. package/esm2020/lib/models/branch-activity-receive-report/branch-activity-receive.model.mjs +2 -0
  22. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.mjs +6 -0
  23. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +3 -0
  24. package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +10 -0
  25. package/esm2020/lib/models/component-loading-states.mjs +7 -0
  26. package/esm2020/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.mjs +5 -0
  27. package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +2 -0
  28. package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +2 -0
  29. package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +8 -0
  30. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +6 -0
  31. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +5 -0
  32. package/esm2020/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.mjs +3 -0
  33. package/esm2020/lib/reports-lib-routing.module.mjs +24 -0
  34. package/esm2020/lib/reports-lib.component.mjs +22 -0
  35. package/esm2020/lib/reports-lib.module.mjs +172 -0
  36. package/esm2020/lib/reports-lib.service.mjs +14 -0
  37. package/esm2020/lib/services/config.service.mjs +39 -0
  38. package/esm2020/lib/services/report.service.mjs +374 -0
  39. package/esm2020/lib/shared/export-generic.service.mjs +443 -0
  40. package/esm2020/lib/shared/export.service.mjs +379 -0
  41. package/esm2020/lib/shared/loader/loader.component.mjs +11 -0
  42. package/esm2020/lib/shared/metadata/metadata.component.mjs +51 -0
  43. package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +44 -0
  44. package/esm2020/lib/shared/search-filter/search-filter.component.mjs +2134 -0
  45. package/esm2020/lib/shared/shared.module.mjs +21 -0
  46. package/esm2020/public-api.mjs +41 -0
  47. package/esm2020/sachin9822-reports-lib.mjs +5 -0
  48. package/fesm2015/sachin9822-reports-lib.mjs +8429 -0
  49. package/fesm2015/sachin9822-reports-lib.mjs.map +1 -0
  50. package/fesm2020/sachin9822-reports-lib.mjs +8411 -0
  51. package/fesm2020/sachin9822-reports-lib.mjs.map +1 -0
  52. package/index.d.ts +5 -0
  53. package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +70 -0
  54. package/lib/components/accounting-report/accounting-report.component.d.ts +76 -0
  55. package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +58 -0
  56. package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +69 -0
  57. package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +78 -0
  58. package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +95 -0
  59. package/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.d.ts +55 -0
  60. package/lib/components/funding-report/funding-report.component.d.ts +55 -0
  61. package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +57 -0
  62. package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +109 -0
  63. package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +76 -0
  64. package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +68 -0
  65. package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +72 -0
  66. package/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.d.ts +8 -0
  67. package/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.d.ts +18 -0
  68. package/lib/models/accounting-report/accounting-report-branch-group.d.ts +6 -0
  69. package/lib/models/accounting-report/accounting-report-entry-model.d.ts +24 -0
  70. package/lib/models/accounting-report/accounting-report-model.d.ts +6 -0
  71. package/{src/lib/models/accounting-report/accounting-report-sub-group.ts → lib/models/accounting-report/accounting-report-sub-group.d.ts} +2 -3
  72. package/{src/lib/models/app-config.model.ts → lib/models/app-config.model.d.ts} +7 -8
  73. package/lib/models/branch-activity-receive-report/branch-activity-receive.model.d.ts +18 -0
  74. package/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.d.ts +13 -0
  75. package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +24 -0
  76. package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +44 -0
  77. package/lib/models/component-loading-states.d.ts +5 -0
  78. package/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.d.ts +26 -0
  79. package/{src/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.ts → lib/models/revenue-per-transaction-report/revenue-per-transaction.model.d.ts} +1 -1
  80. package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +18 -0
  81. package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +113 -0
  82. package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +13 -0
  83. package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +23 -0
  84. package/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.d.ts +39 -0
  85. package/lib/reports-lib-routing.module.d.ts +7 -0
  86. package/lib/reports-lib.component.d.ts +8 -0
  87. package/lib/reports-lib.module.d.ts +33 -0
  88. package/lib/reports-lib.service.d.ts +6 -0
  89. package/lib/services/config.service.d.ts +20 -0
  90. package/lib/services/report.service.d.ts +80 -0
  91. package/lib/shared/export-generic.service.d.ts +50 -0
  92. package/lib/shared/export.service.d.ts +32 -0
  93. package/lib/shared/loader/loader.component.d.ts +5 -0
  94. package/lib/shared/metadata/metadata.component.d.ts +24 -0
  95. package/lib/shared/page-size-selector/page-size-selector.component.d.ts +15 -0
  96. package/lib/shared/search-filter/search-filter.component.d.ts +127 -0
  97. package/lib/shared/shared.module.d.ts +11 -0
  98. package/package.json +31 -16
  99. package/{src/public-api.ts → public-api.d.ts} +7 -17
  100. package/karma.conf.js +0 -44
  101. package/ng-package.json +0 -17
  102. package/src/assets/images/BreadcrumbArrow.png +0 -0
  103. package/src/assets/images/XMCoral.png +0 -0
  104. package/src/lib/assets/images/Search.svg +0 -10
  105. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.html +0 -27
  106. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.scss +0 -46
  107. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.spec.ts +0 -23
  108. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.ts +0 -292
  109. package/src/lib/components/accounting-report/accounting-report.component.html +0 -64
  110. package/src/lib/components/accounting-report/accounting-report.component.scss +0 -24
  111. package/src/lib/components/accounting-report/accounting-report.component.spec.ts +0 -23
  112. package/src/lib/components/accounting-report/accounting-report.component.ts +0 -738
  113. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.html +0 -46
  114. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.scss +0 -2
  115. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.spec.ts +0 -23
  116. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.ts +0 -247
  117. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.html +0 -46
  118. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.scss +0 -3
  119. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.spec.ts +0 -23
  120. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.ts +0 -276
  121. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.html +0 -51
  122. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.scss +0 -7
  123. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.spec.ts +0 -23
  124. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.ts +0 -840
  125. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.html +0 -68
  126. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.scss +0 -65
  127. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.spec.ts +0 -23
  128. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.ts +0 -290
  129. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.html +0 -25
  130. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.scss +0 -1
  131. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.spec.ts +0 -23
  132. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.ts +0 -213
  133. package/src/lib/components/funding-report/funding-report.component.html +0 -49
  134. package/src/lib/components/funding-report/funding-report.component.scss +0 -1
  135. package/src/lib/components/funding-report/funding-report.component.spec.ts +0 -23
  136. package/src/lib/components/funding-report/funding-report.component.ts +0 -221
  137. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.html +0 -26
  138. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.scss +0 -1
  139. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.spec.ts +0 -23
  140. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.ts +0 -267
  141. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.html +0 -95
  142. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.scss +0 -54
  143. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.spec.ts +0 -23
  144. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.ts +0 -904
  145. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.html +0 -49
  146. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.scss +0 -2
  147. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.spec.ts +0 -32
  148. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.ts +0 -304
  149. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.html +0 -46
  150. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.scss +0 -7
  151. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.ts +0 -343
  152. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.html +0 -25
  153. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.scss +0 -23
  154. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.spec.ts +0 -23
  155. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.ts +0 -745
  156. package/src/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.ts +0 -10
  157. package/src/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.ts +0 -20
  158. package/src/lib/models/accounting-report/accounting-report-branch-group.ts +0 -7
  159. package/src/lib/models/accounting-report/accounting-report-entry-model.ts +0 -25
  160. package/src/lib/models/accounting-report/accounting-report-model.ts +0 -7
  161. package/src/lib/models/branch-activity-receive-report/branch-activity-receive.model.ts +0 -18
  162. package/src/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.ts +0 -16
  163. package/src/lib/models/branch-activity-report/branch-activity-send-report.ts +0 -26
  164. package/src/lib/models/cancellation-transaction-report/cancellation-transaction.model.ts +0 -65
  165. package/src/lib/models/component-loading-states.ts +0 -5
  166. package/src/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.ts +0 -28
  167. package/src/lib/models/statement-of-account-report/statement-of-accounts.model.ts +0 -21
  168. package/src/lib/models/transaction-enquiry-report/transaction-enquiry.model.ts +0 -127
  169. package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.ts +0 -16
  170. package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report.ts +0 -29
  171. package/src/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.ts +0 -46
  172. package/src/lib/reports-lib-routing.module.ts +0 -20
  173. package/src/lib/reports-lib.component.spec.ts +0 -23
  174. package/src/lib/reports-lib.component.ts +0 -20
  175. package/src/lib/reports-lib.module.ts +0 -102
  176. package/src/lib/reports-lib.service.spec.ts +0 -16
  177. package/src/lib/reports-lib.service.ts +0 -9
  178. package/src/lib/services/config.service.ts +0 -43
  179. package/src/lib/services/report.service.spec.ts +0 -16
  180. package/src/lib/services/report.service.ts +0 -463
  181. package/src/lib/shared/export-generic.service.ts +0 -557
  182. package/src/lib/shared/export.service.spec.ts +0 -16
  183. package/src/lib/shared/export.service.ts +0 -457
  184. package/src/lib/shared/loader/loader.component.html +0 -8
  185. package/src/lib/shared/loader/loader.component.scss +0 -52
  186. package/src/lib/shared/loader/loader.component.ts +0 -10
  187. package/src/lib/shared/metadata/metadata.component.html +0 -42
  188. package/src/lib/shared/metadata/metadata.component.scss +0 -95
  189. package/src/lib/shared/metadata/metadata.component.spec.ts +0 -23
  190. package/src/lib/shared/metadata/metadata.component.ts +0 -38
  191. package/src/lib/shared/page-size-selector/page-size-selector.component.html +0 -7
  192. package/src/lib/shared/page-size-selector/page-size-selector.component.scss +0 -42
  193. package/src/lib/shared/page-size-selector/page-size-selector.component.spec.ts +0 -23
  194. package/src/lib/shared/page-size-selector/page-size-selector.component.ts +0 -38
  195. package/src/lib/shared/search-filter/search-filter.component.html +0 -601
  196. package/src/lib/shared/search-filter/search-filter.component.scss +0 -203
  197. package/src/lib/shared/search-filter/search-filter.component.spec.ts +0 -23
  198. package/src/lib/shared/search-filter/search-filter.component.ts +0 -2387
  199. package/src/lib/shared/shared.module.ts +0 -13
  200. package/src/styles/ag-grid-report-style.scss +0 -71
  201. package/src/styles/common-ag-grid-style.scss +0 -146
  202. package/src/styles/common-report-style.scss +0 -395
  203. package/src/styles/common-style.scss +0 -615
  204. package/src/test.ts +0 -27
  205. package/tsconfig.lib.json +0 -15
  206. package/tsconfig.lib.prod.json +0 -10
  207. package/tsconfig.spec.json +0 -17
  208. /package/{src/lib → lib}/assets/config/app-config.json +0 -0
  209. /package/{src → lib}/assets/images/Search.svg +0 -0
  210. /package/{src/lib → lib}/assets/images/XMLogo.png +0 -0
  211. /package/{src/lib → lib}/assets/svg-loaders/blue-tail-spin.svg +0 -0
@@ -0,0 +1,776 @@
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.isFormValid = false;
41
+ this.columnDefs = [
42
+ // { headerName: 'ID', field: 'id', width: 100 },
43
+ { headerName: 'Description', field: 'description', flex: 4, tooltipField: 'description', cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
44
+ { headerName: 'Settlment Ccy', field: 'settlmentCcy', flex: 1, tooltipField: 'settlmentCcy', cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
45
+ { 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' } },
46
+ { 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' } }
47
+ ];
48
+ this.defaultColDef = {
49
+ sortable: true,
50
+ filter: true,
51
+ resizable: true,
52
+ minwidth: 40,
53
+ wrapHeaderText: true,
54
+ autoHeaderHeight: true,
55
+ suppressSizeToFit: false,
56
+ wrapText: true,
57
+ autoHeight: true
58
+ };
59
+ // Helper arrays
60
+ this.ones = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"];
61
+ this.teens = ["Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"];
62
+ this.tens = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"];
63
+ }
64
+ async ngOnInit() {
65
+ this.logoBase64 = await this.loadImageAsBase64('assets/reports-lib/assets/images/XMLogo.png');
66
+ }
67
+ currencyFormatter(params) {
68
+ if (params.value == null)
69
+ return '0.000';
70
+ const num = Number(params.value);
71
+ return num.toFixed(3); // rounds to 3 decimals
72
+ }
73
+ async handleSearch(criteria) {
74
+ this.searchCriteria = criteria.searchCriteria;
75
+ const modal = criteria.modal;
76
+ this.reportUserandTime = `${criteria.sysUserID} @ ${formatDate(this.currentDateTime, 'dd/MM/yyyy hh:mm a', 'en-US')}`;
77
+ const payload = {
78
+ businessPartnerID: Number(modal.client),
79
+ fromDate: new Date(modal.fromDate).toISOString(),
80
+ toDate: new Date(modal.toDate).toISOString(),
81
+ clientType: criteria.clientType
82
+ };
83
+ this.user = criteria.sysUserID;
84
+ this.metaDataOne = {
85
+ 'Report Period ': criteria.reportPeriod
86
+ };
87
+ this.metaDataTwo = {
88
+ 'Report User & Time ': this.reportUserandTime
89
+ };
90
+ try {
91
+ const sdate = new Date(payload?.fromDate);
92
+ const edate = new Date(payload?.toDate);
93
+ payload.fromDate = sdate.toISOString().split("T")[0];
94
+ payload.toDate = edate.toISOString().split("T")[0];
95
+ }
96
+ catch (err) {
97
+ throw new Error("Invalid Date");
98
+ }
99
+ this.searchCriteria = criteria.searchCriteria;
100
+ console.log(criteria.clientName);
101
+ this.loadingState = ComponentLoadingStates.Loading;
102
+ this.errorMessage = '';
103
+ this.showTables = false;
104
+ this.selectedClientType = criteria.clientType;
105
+ this.reportService.getStatementOfAccount(payload)
106
+ .pipe(finalize(() => {
107
+ this.loadingState = ComponentLoadingStates.Complete;
108
+ this.hasSearched = true;
109
+ this.showTables = true;
110
+ }), takeUntil(this.destroy$))
111
+ .subscribe({
112
+ next: (data) => {
113
+ console.log(data);
114
+ this.openingBalAndFunding = data.openingBalAndFunding ?? [];
115
+ this.sendDetails = data.sendDetails ?? [];
116
+ this.receiveDetails = data.receiveDetails ?? [];
117
+ // add pinned totals
118
+ if (this.selectedClientType == "PayIn") {
119
+ this.sendPinnedBottomRow = [this.buildTotalRow(this.sendDetails)];
120
+ this.receivePinnedBottomRow = [];
121
+ }
122
+ else if (this.selectedClientType == "PayOut") {
123
+ this.receivePinnedBottomRow = [this.buildTotalRow(this.receiveDetails)];
124
+ this.sendPinnedBottomRow = [];
125
+ }
126
+ else if (this.selectedClientType === "Both") {
127
+ this.sendPinnedBottomRow = [this.buildTotalRow(this.sendDetails)];
128
+ this.receivePinnedBottomRow = [this.buildTotalRow(this.receiveDetails)];
129
+ }
130
+ else {
131
+ this.sendPinnedBottomRow = [];
132
+ this.receivePinnedBottomRow = [];
133
+ }
134
+ this.calculateClosingBalance();
135
+ this.noDataFromApi =
136
+ this.openingBalAndFunding.length === 0 &&
137
+ this.sendDetails.length === 0 &&
138
+ (!this.receiveDetails || this.receiveDetails.length === 0);
139
+ },
140
+ error: (err) => {
141
+ console.error('Error fetching Statement of Accounts:', err);
142
+ this.errorMessage = 'Failed to load Statement of Accounts';
143
+ this.openingBalAndFunding = [];
144
+ this.sendDetails = [];
145
+ this.receiveDetails = [];
146
+ this.loadingState = ComponentLoadingStates.Error;
147
+ this.showTables = false;
148
+ }
149
+ });
150
+ }
151
+ buildTotalRow(rows) {
152
+ const totalSettle = (rows || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
153
+ const totalUsd = (rows || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
154
+ return {
155
+ id: null,
156
+ description: 'Total',
157
+ settlmentCcy: '',
158
+ amountInSettlmentCcy: Number(totalSettle.toFixed(3)),
159
+ amountInUSD: Number(totalUsd.toFixed(3))
160
+ };
161
+ }
162
+ onOpeningGridReady(params) {
163
+ this.openingGridApi = params.api;
164
+ }
165
+ onSendGridReady(params) {
166
+ this.sendGridApi = params.api;
167
+ }
168
+ onReceiveGridReady(params) {
169
+ this.receiveGridApi = params.api;
170
+ }
171
+ filter(text) {
172
+ this.searchText = text;
173
+ if (this.openingGridApi) {
174
+ this.openingGridApi.setQuickFilter(this.searchText);
175
+ }
176
+ if (this.sendGridApi) {
177
+ this.sendGridApi.setQuickFilter(this.searchText);
178
+ }
179
+ if (this.receiveGridApi) {
180
+ this.receiveGridApi.setQuickFilter(this.searchText);
181
+ }
182
+ }
183
+ calculateClosingBalance() {
184
+ // USD totals (existing logic)
185
+ const openingBalTotalUsd = (this.openingBalAndFunding || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
186
+ const sendTotalUsd = (this.sendDetails || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
187
+ const receiveTotalUsd = (this.receiveDetails || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
188
+ const rawClosingUsd = openingBalTotalUsd + sendTotalUsd + receiveTotalUsd;
189
+ this.closingBalance = Number(rawClosingUsd.toFixed(3)); // numeric USD
190
+ // Settlement currency totals (new)
191
+ const openingSettle = (this.openingBalAndFunding || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
192
+ const sendSettle = (this.sendDetails || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
193
+ const receiveSettle = (this.receiveDetails || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
194
+ const rawClosingSettle = openingSettle + sendSettle + receiveSettle;
195
+ this.closingBalanceInSettlment = Number(rawClosingSettle.toFixed(3));
196
+ // pick a settlement currency to display (first non-empty)
197
+ this.closingBalanceSettlmentCurrency = this.getFirstSettlementCurrency();
198
+ // formatted strings (no-thousand-comma, 3 decimals)
199
+ this.closingBalanceInUsdFormatted = this.formatNoComma(this.closingBalance);
200
+ this.closingBalanceSettlmentFormatted = this.formatNoComma(this.closingBalanceInSettlment);
201
+ this.closingBalanceUSDInWords = this.numberToWords(this.closingBalance);
202
+ this.closingBalanceSettlmentInWords =
203
+ this.closingBalanceInSettlment !== null &&
204
+ this.closingBalanceInSettlment !== undefined &&
205
+ !isNaN(Number(this.closingBalanceInSettlment))
206
+ ? this.numberToWords(this.closingBalanceInSettlment)
207
+ : '';
208
+ }
209
+ formatNoComma(value) {
210
+ if (value === null || value === undefined || isNaN(Number(value)))
211
+ return '0.000';
212
+ const num = Number(value);
213
+ const truncated = Math.trunc(num * 1000) / 1000;
214
+ return truncated.toFixed(3);
215
+ }
216
+ getFirstSettlementCurrency() {
217
+ const tryGet = (arr) => {
218
+ if (!arr || arr.length === 0)
219
+ return '';
220
+ for (const r of arr) {
221
+ if (r && r.settlmentCcy)
222
+ return r.settlmentCcy;
223
+ }
224
+ return '';
225
+ };
226
+ return tryGet(this.openingBalAndFunding) || tryGet(this.sendDetails) || tryGet(this.receiveDetails) || '';
227
+ }
228
+ numberToWords(num) {
229
+ if (num === 0)
230
+ return "Zero Point Zero Zero Zero Only";
231
+ let result = "";
232
+ // Handle negative numbers
233
+ if (num < 0) {
234
+ result = "Negative ";
235
+ num = Math.abs(num);
236
+ }
237
+ // Split integer and decimal parts
238
+ const integerPart = Math.floor(num);
239
+ const decimalPart = Math.round((num - integerPart) * 1000); // up to 3 decimal places
240
+ result += this.convertNumber(integerPart);
241
+ if (decimalPart > 0) {
242
+ result += " Point";
243
+ const decimalStr = decimalPart.toString().padStart(3, "0"); // keep 3 digits
244
+ for (const digit of decimalStr) {
245
+ result += " " + this.ones[+digit];
246
+ }
247
+ }
248
+ return result + " Only";
249
+ }
250
+ // Convert whole numbers (Indian/International system)
251
+ convertNumber(num) {
252
+ if (num === 0)
253
+ return "";
254
+ if (num < 10)
255
+ return this.ones[num];
256
+ if (num < 20)
257
+ return this.teens[num - 10];
258
+ if (num < 100)
259
+ return this.tens[Math.floor(num / 10)] + (num % 10 !== 0 ? " " + this.ones[num % 10] : "");
260
+ if (num < 1000)
261
+ return this.convertNumber(Math.floor(num / 100)) + " Hundred" + (num % 100 !== 0 ? " " + this.convertNumber(num % 100) : "");
262
+ if (num < 1000000)
263
+ return this.convertNumber(Math.floor(num / 1000)) + " Thousand" + (num % 1000 !== 0 ? " " + this.convertNumber(num % 1000) : "");
264
+ if (num < 1000000000)
265
+ return this.convertNumber(Math.floor(num / 1000000)) + " Million" + (num % 1000000 !== 0 ? " " + this.convertNumber(num % 1000000) : "");
266
+ return this.convertNumber(Math.floor(num / 1000000000)) + " Billion" + (num % 1000000000 !== 0 ? " " + this.convertNumber(num % 1000000000) : "");
267
+ }
268
+ onExportChange(value) {
269
+ this.selectedExportOption = value;
270
+ }
271
+ handleExport(option) {
272
+ this.selectedExportOption = option;
273
+ switch ((this.selectedExportOption || '').toLowerCase()) {
274
+ case 'pdf':
275
+ this.exportToPDF();
276
+ break;
277
+ case 'excel':
278
+ this.exportToExcel();
279
+ break;
280
+ case 'csv':
281
+ this.exportToCSV();
282
+ break;
283
+ default: console.warn('Unknown export type:', this.selectedExportOption);
284
+ }
285
+ }
286
+ exportToPDF() {
287
+ const sections = this.getVisibleGrids()
288
+ .map(s => {
289
+ const data = this.getDisplayedData(s.api);
290
+ const headers = this.getHeaders();
291
+ let rows = this.buildRows(data);
292
+ if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
293
+ rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
294
+ }
295
+ if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
296
+ rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
297
+ }
298
+ return rows.length ? { title: s.title, headers, rows } : null;
299
+ })
300
+ .filter(Boolean);
301
+ if (!sections.length)
302
+ return;
303
+ const doc = new jsPDF({ orientation: 'landscape', unit: 'mm', format: 'a4' });
304
+ if (this.logoBase64) {
305
+ doc.addImage(this.logoBase64, 'PNG', 15, 10, 38, 18);
306
+ }
307
+ const pageWidth = doc.internal.pageSize.getWidth();
308
+ const pageHeight = doc.internal.pageSize.getHeight();
309
+ doc.setFont('helvetica', 'bold');
310
+ doc.setFontSize(15);
311
+ doc.text(this.ReportName, pageWidth / 2, 18, { align: 'center' });
312
+ let y = 34;
313
+ doc.setFontSize(10);
314
+ Object.entries(this.metaDataOne || {}).forEach(([k, v]) => {
315
+ doc.setFont('helvetica', 'bold');
316
+ doc.text(`${k}: `, 15, y);
317
+ const w = doc.getTextWidth(`${k}: `);
318
+ doc.setFont('helvetica', 'normal');
319
+ doc.text(String(v ?? ''), 15 + w, y);
320
+ y += 6;
321
+ });
322
+ Object.entries(this.metaDataTwo || {}).forEach(([k, v]) => {
323
+ doc.setFont('helvetica', 'bold');
324
+ doc.text(`${k}: `, 15, y);
325
+ const w = doc.getTextWidth(`${k}: `);
326
+ doc.setFont('helvetica', 'normal');
327
+ doc.text(String(v ?? ''), 15 + w, y);
328
+ y += 6;
329
+ });
330
+ // --- search criteria ---
331
+ const searchCriteria = this.searchCriteria || [];
332
+ // ===================== Search Criteria Section =====================
333
+ // Start just below metadata
334
+ let marginLeft = 15;
335
+ let currentY = y + 5; // continue below metadata
336
+ // --- heading ---
337
+ doc.setFont('helvetica', 'bold');
338
+ doc.text('Search Criteria:-', marginLeft, currentY);
339
+ currentY += 8;
340
+ const rowHeightPerLine = 6;
341
+ const minGap = 2; // gap between key and value
342
+ const betweenColumnsGap = 15; // gap between left and right columns
343
+ const pageContentWidth = doc.internal.pageSize.width - 2 * marginLeft;
344
+ // --- helper to measure pair width ---
345
+ const measurePairWidth = (key, value) => {
346
+ doc.setFont('helvetica', 'bold');
347
+ const keyWidth = doc.getTextWidth(key + ' ');
348
+ doc.setFont('helvetica', 'normal');
349
+ const valueWidth = doc.getTextWidth(value);
350
+ return keyWidth + minGap + valueWidth;
351
+ };
352
+ // --- compute max width of left column ---
353
+ let maxLeftPairWidth = 0;
354
+ for (let i = 0; i < searchCriteria.length; i += 2) {
355
+ if (searchCriteria[i]) {
356
+ const [key, value] = searchCriteria[i];
357
+ const width = measurePairWidth(key, value);
358
+ if (width > maxLeftPairWidth)
359
+ maxLeftPairWidth = width;
360
+ }
361
+ }
362
+ // --- calculate where right column starts ---
363
+ const leftColumnStart = marginLeft;
364
+ const rightColumnStart = leftColumnStart + maxLeftPairWidth + betweenColumnsGap;
365
+ // --- print pairs dynamically ---
366
+ for (let i = 0; i < searchCriteria.length; i += 2) {
367
+ // Left column
368
+ if (searchCriteria[i]) {
369
+ const [key, value] = searchCriteria[i];
370
+ doc.setFont('helvetica', 'bold');
371
+ doc.text(key, leftColumnStart, currentY);
372
+ doc.setFont('helvetica', 'normal');
373
+ const keyWidth = doc.getTextWidth(key + ' ');
374
+ const valueX = leftColumnStart + keyWidth + minGap;
375
+ doc.text(value, valueX, currentY);
376
+ }
377
+ // Right column
378
+ if (searchCriteria[i + 1]) {
379
+ const [key, value] = searchCriteria[i + 1];
380
+ doc.setFont('helvetica', 'bold');
381
+ doc.text(key, rightColumnStart, currentY);
382
+ doc.setFont('helvetica', 'normal');
383
+ const keyWidth = doc.getTextWidth(key + ' ');
384
+ const valueX = rightColumnStart + keyWidth + minGap;
385
+ doc.text(value, valueX, currentY);
386
+ }
387
+ currentY += rowHeightPerLine;
388
+ }
389
+ // Update Y position for next sections
390
+ y = currentY + 4;
391
+ const HEAD = this.getHeaders();
392
+ const margin = { left: 15, right: 15 };
393
+ const avail = pageWidth - margin.left - margin.right;
394
+ const weights = [4, 1, 2, 2];
395
+ const sum = weights.reduce((a, b) => a + b, 0);
396
+ const widths = weights.map(w => (w / sum) * avail);
397
+ const sharedColumnStyles = {
398
+ 0: { cellWidth: widths[0] },
399
+ 1: { cellWidth: widths[1] },
400
+ 2: { cellWidth: widths[2], halign: 'right' },
401
+ 3: { cellWidth: widths[3], halign: 'right' }
402
+ };
403
+ const titleGapAboveFirst = 0;
404
+ const titleGapAboveDefault = 4;
405
+ const titleGapAboveBig = 6;
406
+ const titleToTableGap = 2;
407
+ const topStartY = 20;
408
+ const bottomReserve = 20;
409
+ sections.forEach((s, idx) => {
410
+ const isFirst = idx === 0;
411
+ const isSendOrReceive = s.title === 'Send Details' || s.title === 'Receive Details';
412
+ const preTitleGap = isFirst ? 0 : (isSendOrReceive ? titleGapAboveBig : titleGapAboveDefault);
413
+ if (y + preTitleGap + titleToTableGap > pageHeight - bottomReserve) {
414
+ doc.addPage();
415
+ y = topStartY;
416
+ }
417
+ else {
418
+ y += preTitleGap;
419
+ }
420
+ doc.setFont('helvetica', 'bold');
421
+ doc.setFontSize(11);
422
+ doc.text(s.title, margin.left, y);
423
+ const startYForTable = y + (isFirst ? 0 : titleToTableGap);
424
+ doc.autoTable({
425
+ head: [HEAD],
426
+ body: s.rows,
427
+ startY: startYForTable,
428
+ theme: 'grid',
429
+ margin,
430
+ tableWidth: avail,
431
+ columnStyles: sharedColumnStyles,
432
+ headStyles: { fillColor: [220, 220, 220], textColor: 0, fontStyle: 'bold', fontSize: 9, halign: 'center' },
433
+ bodyStyles: { fontSize: 8 },
434
+ styles: { cellPadding: 2, overflow: 'linebreak', minCellHeight: 6 }
435
+ });
436
+ y = doc.lastAutoTable.finalY;
437
+ });
438
+ if (y + 30 > pageHeight - bottomReserve) {
439
+ doc.addPage();
440
+ y = topStartY;
441
+ }
442
+ const closingBody = [
443
+ [
444
+ { content: 'Closing Balance', colSpan: 2, styles: { halign: 'left', fontStyle: 'bold' } },
445
+ { content: Number(this.closingBalanceInSettlment || 0).toFixed(3), styles: { halign: 'right' } },
446
+ { content: Number(this.closingBalance || 0).toFixed(3), styles: { halign: 'right' } }
447
+ ],
448
+ [
449
+ { content: `${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}`, colSpan: 4, styles: { halign: 'left' } }
450
+ ],
451
+ [
452
+ { content: `${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}`, colSpan: 4, styles: { halign: 'left' } }
453
+ ]
454
+ ];
455
+ doc.autoTable({
456
+ body: closingBody,
457
+ startY: y,
458
+ theme: 'grid',
459
+ margin,
460
+ tableWidth: avail,
461
+ columnStyles: sharedColumnStyles,
462
+ styles: { cellPadding: 2, fontSize: 9 }
463
+ });
464
+ doc.save('Statement_of_Accounts.pdf');
465
+ }
466
+ exportToExcel() {
467
+ const sections = this.getVisibleGrids()
468
+ .map(s => {
469
+ const data = this.getDisplayedData(s.api);
470
+ const headers = this.getHeaders();
471
+ let rows = this.buildRows(data);
472
+ if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
473
+ rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
474
+ }
475
+ if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
476
+ rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
477
+ }
478
+ return rows.length ? { title: s.title, headers, rows } : null;
479
+ })
480
+ .filter(Boolean);
481
+ if (!sections.length)
482
+ return;
483
+ const wb = new ExcelJS.Workbook();
484
+ const ws = wb.addWorksheet('Statement of Accounts');
485
+ let r = 1;
486
+ if (this.logoBase64) {
487
+ const imgId = wb.addImage({ base64: this.logoBase64, extension: 'png' });
488
+ ws.addImage(imgId, { tl: { col: 0, row: 0 }, ext: { width: 145, height: 66 }, editAs: 'oneCell' });
489
+ }
490
+ ws.getRow(r).getCell(2).value = this.ReportName;
491
+ ws.getRow(r).getCell(2).font = { bold: true, size: 16 };
492
+ r += 3;
493
+ Object.entries(this.metaDataOne || {}).forEach(([k, v]) => {
494
+ const row = ws.getRow(r++);
495
+ row.getCell(1).value = {
496
+ richText: [
497
+ { text: k + ': ', font: { bold: true } },
498
+ { text: v ?? '' } // value normal
499
+ ]
500
+ };
501
+ row.getCell(1).alignment = { wrapText: false, vertical: 'middle' };
502
+ });
503
+ Object.entries(this.metaDataTwo || {}).forEach(([k, v]) => {
504
+ const row = ws.getRow(r++);
505
+ row.getCell(1).value = {
506
+ richText: [
507
+ { text: k + ': ', font: { bold: true } },
508
+ { text: v ?? '' } // value normal
509
+ ]
510
+ };
511
+ row.getCell(1).alignment = { wrapText: false, vertical: 'middle' };
512
+ });
513
+ r++;
514
+ // --- search criteria ---
515
+ const searchCriteria = this.searchCriteria || [];
516
+ ws.mergeCells(r, 1, r, 4); // previously 1..6
517
+ ws.getCell(r, 1).value = 'Search Criteria:-';
518
+ ws.getCell(r, 1).font = { bold: true };
519
+ r += 2;
520
+ for (let i = 0; i < searchCriteria.length; i += 2) {
521
+ const left = searchCriteria[i];
522
+ const right = searchCriteria[i + 1];
523
+ const row = ws.getRow(r++);
524
+ // Left column (reduced merge)
525
+ ws.mergeCells(row.number, 1, row.number, 1); // was 1..3
526
+ row.getCell(1).value = {
527
+ richText: [
528
+ { text: left[0] + ' ', font: { bold: true } },
529
+ { text: left[1] }
530
+ ]
531
+ };
532
+ row.getCell(1).alignment = { wrapText: true, vertical: 'middle' };
533
+ // Right column (start closer to left)
534
+ if (right) {
535
+ ws.mergeCells(row.number, 2, row.number, 3); // was 4..6
536
+ row.getCell(3).value = {
537
+ richText: [
538
+ { text: right[0] + ' ', font: { bold: true } },
539
+ { text: right[1] }
540
+ ]
541
+ };
542
+ row.getCell(3).alignment = { wrapText: true, vertical: 'middle' };
543
+ }
544
+ }
545
+ r++;
546
+ const writeSection = (sec) => {
547
+ const titleRow = ws.getRow(r++);
548
+ const titleCell = titleRow.getCell(1);
549
+ titleCell.value = sec.title;
550
+ titleCell.font = { bold: true, size: 12 };
551
+ titleCell.alignment = { horizontal: 'left', vertical: 'middle' };
552
+ const headerRow = ws.getRow(r++);
553
+ sec.headers.forEach((h, i) => {
554
+ const c = headerRow.getCell(i + 1);
555
+ c.value = h;
556
+ c.font = { bold: true };
557
+ c.alignment = { vertical: 'middle', horizontal: 'center' };
558
+ c.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'D9D9D9' } };
559
+ c.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' }, right: { style: 'thin' } };
560
+ });
561
+ const dataStart = r;
562
+ sec.rows.forEach(rowData => {
563
+ const row = ws.getRow(r++);
564
+ rowData.forEach((v, i) => {
565
+ const c = row.getCell(i + 1);
566
+ if (sec.headers[i] === 'Amount In Settlment Ccy' || sec.headers[i] === 'Amount In USD') {
567
+ const num = typeof v === 'string' ? Number(v.replace(/[, ]+/g, '')) : Number(v);
568
+ c.value = isNaN(num) ? (v ?? '') : num;
569
+ c.alignment = { horizontal: 'right' };
570
+ if (!isNaN(num))
571
+ c.numFmt = '0.000';
572
+ }
573
+ else {
574
+ c.value = v ?? '';
575
+ }
576
+ c.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' }, right: { style: 'thin' } };
577
+ });
578
+ });
579
+ for (let col = 1; col <= sec.headers.length; col++) {
580
+ let max = (sec.headers[col - 1] || '').toString().length;
581
+ for (let rr = dataStart - 1; rr < r; rr++) {
582
+ const val = (ws.getRow(rr).getCell(col).value ?? '').toString();
583
+ if (val)
584
+ max = Math.max(max, val.length + 2);
585
+ }
586
+ ws.getColumn(col).width = Math.min(Math.max(max, 8), 60);
587
+ }
588
+ };
589
+ sections.forEach((sec, idx) => {
590
+ writeSection(sec);
591
+ if (idx < sections.length - 1) {
592
+ r++;
593
+ }
594
+ });
595
+ const totalCols = sections.length
596
+ ? Math.max(...sections.map(s => s.headers.length))
597
+ : this.columnDefs.length;
598
+ const cols = Math.max(totalCols, 4);
599
+ const labelColsEnd = 2;
600
+ const settleCol = 3;
601
+ const usdCol = 4;
602
+ const row1 = ws.getRow(r++);
603
+ ws.mergeCells(row1.number, 1, row1.number, labelColsEnd);
604
+ row1.getCell(1).value = 'Closing Balance';
605
+ row1.getCell(1).font = { bold: true };
606
+ row1.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
607
+ const settleValue = Number(this.closingBalanceInSettlment ?? 0);
608
+ const usdValue = Number(this.closingBalance ?? 0);
609
+ const settleCell = row1.getCell(settleCol);
610
+ settleCell.value = isNaN(settleValue) ? '' : settleValue;
611
+ settleCell.alignment = { horizontal: 'right' };
612
+ if (!isNaN(settleValue))
613
+ settleCell.numFmt = '0.000';
614
+ const usdCell = row1.getCell(usdCol);
615
+ usdCell.value = isNaN(usdValue) ? '' : usdValue;
616
+ usdCell.alignment = { horizontal: 'right' };
617
+ if (!isNaN(usdValue))
618
+ usdCell.numFmt = '0.000';
619
+ for (let c = 1; c <= cols; c++) {
620
+ row1.getCell(c).border = {
621
+ top: { style: 'thin' },
622
+ bottom: { style: 'thin' },
623
+ left: { style: 'thin' },
624
+ right: { style: 'thin' }
625
+ };
626
+ }
627
+ const row2 = ws.getRow(r++);
628
+ ws.mergeCells(row2.number, 1, row2.number, cols);
629
+ row2.getCell(1).value = `${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}`;
630
+ row2.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
631
+ row2.getCell(1).font = { italic: false };
632
+ for (let c = 1; c <= cols; c++) {
633
+ const edge = { top: { style: 'thin' }, bottom: { style: 'thin' } };
634
+ if (c === 1)
635
+ edge.left = { style: 'thin' };
636
+ if (c === cols)
637
+ edge.right = { style: 'thin' };
638
+ row2.getCell(c).border = edge;
639
+ }
640
+ const row3 = ws.getRow(r++);
641
+ ws.mergeCells(row3.number, 1, row3.number, cols);
642
+ row3.getCell(1).value = `${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}`;
643
+ row3.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
644
+ for (let c = 1; c <= cols; c++) {
645
+ const edge = { top: { style: 'thin' }, bottom: { style: 'thin' } };
646
+ if (c === 1)
647
+ edge.left = { style: 'thin' };
648
+ if (c === cols)
649
+ edge.right = { style: 'thin' };
650
+ row3.getCell(c).border = edge;
651
+ }
652
+ wb.xlsx.writeBuffer().then(buf => {
653
+ FileSaver.saveAs(new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }), 'Statement_of_Accounts.xlsx');
654
+ });
655
+ }
656
+ exportToCSV() {
657
+ const sections = this.getVisibleGrids()
658
+ .map(s => {
659
+ const data = this.getDisplayedData(s.api);
660
+ let rows = this.buildRows(data);
661
+ if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
662
+ rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
663
+ }
664
+ if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
665
+ rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
666
+ }
667
+ return rows.length ? { title: s.title, headers: this.getHeaders(), rows } : null;
668
+ })
669
+ .filter(Boolean);
670
+ if (!sections.length)
671
+ return;
672
+ const lines = [];
673
+ lines.push(this.ReportName);
674
+ Object.entries(this.metaDataOne || {}).forEach(([k, v]) => lines.push(`${k}: ${v ?? ''}`));
675
+ Object.entries(this.metaDataTwo || {}).forEach(([k, v]) => lines.push(`${k}: ${v ?? ''}`));
676
+ // --- SEARCH CRITERIA BLOCK ---
677
+ const searchCriteria = this.searchCriteria || [];
678
+ if (searchCriteria?.length) {
679
+ lines.push('');
680
+ lines.push('Search Criteria:-');
681
+ // Determine max length of left column for padding
682
+ const maxLeftLength = Math.max(...searchCriteria.map(([k, v]) => (k + ' ' + v).length));
683
+ for (let i = 0; i < searchCriteria.length; i += 2) {
684
+ const left = searchCriteria[i];
685
+ const right = searchCriteria[i + 1];
686
+ const leftText = left ? `${left[0]} ${left[1]}`.padEnd(maxLeftLength + 5, ' ') : '';
687
+ const rightText = right ? `${right[0]} ${right[1]}` : '';
688
+ // Each pair stays in its own column
689
+ lines.push(`"${leftText}${rightText}"`);
690
+ }
691
+ lines.push(''); // blank line after search criteria
692
+ }
693
+ sections.forEach((sec, idx) => {
694
+ lines.push(sec.title);
695
+ lines.push(sec.headers.join(','));
696
+ sec.rows.forEach(r => lines.push(r.map(v => `"${v ?? ''}"`).join(',')));
697
+ if (idx < sections.length - 1) {
698
+ lines.push('');
699
+ }
700
+ });
701
+ lines.push(`"Closing Balance",,"${Number(this.closingBalanceInSettlment || 0).toFixed(3)}","${Number(this.closingBalance || 0).toFixed(3)}"`);
702
+ lines.push(`"${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}"`);
703
+ lines.push(`"${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}"`);
704
+ const csv = lines.join('\n');
705
+ FileSaver.saveAs(new Blob([csv], { type: 'text/csv;charset=utf-8' }), 'Statement_of_Accounts.csv');
706
+ }
707
+ loadImageAsBase64(src) {
708
+ return new Promise((resolve, reject) => {
709
+ const img = new Image();
710
+ img.crossOrigin = 'anonymous';
711
+ img.src = src;
712
+ img.onload = () => {
713
+ const canvas = document.createElement('canvas');
714
+ canvas.width = img.width;
715
+ canvas.height = img.height;
716
+ const ctx = canvas.getContext('2d');
717
+ if (!ctx)
718
+ return reject('Canvas context failed');
719
+ ctx.drawImage(img, 0, 0);
720
+ resolve(canvas.toDataURL('image/png'));
721
+ };
722
+ img.onerror = () => reject('Failed to load image: ' + src);
723
+ });
724
+ }
725
+ getDisplayedData(api) {
726
+ if (!api)
727
+ return [];
728
+ const rows = [];
729
+ const count = api.getDisplayedRowCount();
730
+ for (let i = 0; i < count; i++) {
731
+ const node = api.getDisplayedRowAtIndex(i);
732
+ if (node && !node.group && !node.rowPinned)
733
+ rows.push(node.data);
734
+ }
735
+ return rows;
736
+ }
737
+ getHeaders() {
738
+ return this.columnDefs.map(c => c.headerName || c.field);
739
+ }
740
+ format3(n) {
741
+ if (n == null || n === '')
742
+ return '';
743
+ const num = Number(n);
744
+ return num.toFixed(3);
745
+ }
746
+ buildRows(data) {
747
+ return data.map(row => this.columnDefs.map(col => {
748
+ const f = col.field;
749
+ if (f === 'amountInSettlmentCcy' || f === 'amountInUSD') {
750
+ return this.format3(row[f]);
751
+ }
752
+ return row[f] ?? '';
753
+ }));
754
+ }
755
+ getVisibleGrids() {
756
+ const out = [];
757
+ out.push({ title: '', api: this.openingGridApi });
758
+ if (this.selectedClientType === 'PayIn' || this.selectedClientType === 'Both') {
759
+ out.push({ title: 'Send Details', api: this.sendGridApi });
760
+ }
761
+ if (this.selectedClientType === 'PayOut' || this.selectedClientType === 'Both') {
762
+ out.push({ title: 'Receive Details', api: this.receiveGridApi });
763
+ }
764
+ return out;
765
+ }
766
+ handleFormValid(isValid) {
767
+ this.isFormValid = isValid;
768
+ }
769
+ }
770
+ StatementOfAccountsReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StatementOfAccountsReportComponent, deps: [{ token: i1.ReportService }], target: i0.ɵɵFactoryTarget.Component });
771
+ 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 (formValid)=\"handleFormValid($event)\"\r\n >\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 && isFormValid\">\r\n<lib-metadata \r\n [reportName]=\"ReportName\" \r\n [showmetaDataOne]=\"true\" \r\n [showmetaDataTwo]=\"true\" \r\n [metaDataOne]=\"metaDataOne\"\r\n [metaDataTwo]=\"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: 80%; height: 91px; margin: 0 auto; display: block;\">\r\n</ag-grid-angular>\r\n\r\n<div *ngIf=\"(selectedClientType === 'PayIn' || 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: 80%; height: 204px; margin: 0 auto; display: block;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n<div *ngIf=\"(selectedClientType === 'PayOut' || 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: 80%; height: 204px; margin: 0 auto; display: block;\">\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}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}::ng-deep .ag-theme-alpine .pinned-total-cell{font-weight:700!important}.details-table{background-color:#d3d3d3;margin:0 auto;height:32px;align-content:center;width:80%;text-align:left}.transaction-grid{display:block;margin:0 auto;width:80%}.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;width:80%;margin:0 auto}.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", "initialFilters"], outputs: ["searchClicked", "formValid"] }] });
772
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StatementOfAccountsReportComponent, decorators: [{
773
+ type: Component,
774
+ args: [{ selector: 'lib-statement-of-accounts-report', template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\"\r\n >\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 && isFormValid\">\r\n<lib-metadata \r\n [reportName]=\"ReportName\" \r\n [showmetaDataOne]=\"true\" \r\n [showmetaDataTwo]=\"true\" \r\n [metaDataOne]=\"metaDataOne\"\r\n [metaDataTwo]=\"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: 80%; height: 91px; margin: 0 auto; display: block;\">\r\n</ag-grid-angular>\r\n\r\n<div *ngIf=\"(selectedClientType === 'PayIn' || 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: 80%; height: 204px; margin: 0 auto; display: block;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n<div *ngIf=\"(selectedClientType === 'PayOut' || 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: 80%; height: 204px; margin: 0 auto; display: block;\">\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}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}::ng-deep .ag-theme-alpine .pinned-total-cell{font-weight:700!important}.details-table{background-color:#d3d3d3;margin:0 auto;height:32px;align-content:center;width:80%;text-align:left}.transaction-grid{display:block;margin:0 auto;width:80%}.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;width:80%;margin:0 auto}.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"] }]
775
+ }], ctorParameters: function () { return [{ type: i1.ReportService }]; } });
776
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvc3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0L3N0YXRlbWVudC1vZi1hY2NvdW50cy1yZXBvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDOzs7Ozs7OztBQVF4QyxNQUFNLE9BQU8sa0NBQWtDO0lBeUM3QyxZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXZDaEQsZUFBVSxHQUFHLHVCQUF1QixDQUFDO1FBQ3JDLDBCQUFxQixHQUFHLHNCQUFzQixDQUFDO1FBQy9DLGlCQUFZLEdBQTJCLHNCQUFzQixDQUFDLFFBQVEsQ0FB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QUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdCO1lBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU8sZUFBZTtRQUNyQixNQUFNLEdBQUcsR0FBdUMsRUFBRSxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLE1BQU0sRUFBRTtZQUM3RSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDNUQ7UUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLE1BQU0sRUFBRTtZQUM5RSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztTQUNsRTtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFnQjtRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztJQUM3QixDQUFDOzsrSEFsM0JVLGtDQUFrQzttSEFBbEMsa0NBQWtDLHdFQ25CL0MsdTZHQStGQTsyRkQ1RWEsa0NBQWtDO2tCQU45QyxTQUFTOytCQUNFLGtDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEdyaWRBcGkgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmluYWxpemUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50TG9hZGluZ1N0YXRlcyB9IGZyb20gJy4uLy4uL21vZGVscy9jb21wb25lbnQtbG9hZGluZy1zdGF0ZXMnO1xyXG5pbXBvcnQgeyBSZXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgU3RhdGVtZW50T2ZBY2NvdW50SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9zdGF0ZW1lbnQtb2YtYWNjb3VudC1yZXBvcnQvc3RhdGVtZW50LW9mLWFjY291bnRzLm1vZGVsJztcclxuaW1wb3J0IGpzUERGIGZyb20gJ2pzcGRmJztcclxuaW1wb3J0ICdqc3BkZi1hdXRvdGFibGUnO1xyXG5pbXBvcnQgKiBhcyBFeGNlbEpTIGZyb20gJ2V4Y2VsanMnO1xyXG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgU3RhdGVtZW50T2ZBY2NvdW50c1JlcG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIFJlcG9ydE5hbWUgPSBcIlN0YXRlbWVudCBvZiBBY2NvdW50c1wiO1xyXG4gIENvbXBvbmVudExvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXM7XHJcbiAgbG9hZGluZ1N0YXRlOiBDb21wb25lbnRMb2FkaW5nU3RhdGVzID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICBoYXNTZWFyY2hlZDogYm9vbGVhbjtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBvcGVuaW5nQmFsQW5kRnVuZGluZzogU3RhdGVtZW50T2ZBY2NvdW50SXRlbVtdID0gW107XHJcbiAgc2VuZERldGFpbHM6IFN0YXRlbWVudE9mQWNjb3VudEl0ZW1bXSA9IFtdO1xyXG4gIHJlY2VpdmVEZXRhaWxzOiBTdGF0ZW1lbnRPZkFjY291bnRJdGVtW10gPSBbXTtcclxuICBub0RhdGFGcm9tQXBpOiBib29sZWFuO1xyXG4gIG1ldGFEYXRhT25lOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIG1ldGFEYXRhVHdvOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIHVzZXI6IGFueTtcclxuICBjdXJyZW50RGF0ZVRpbWU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIHNlbmRQaW5uZWRCb3R0b21Sb3c6IGFueVtdID0gW107XHJcbiAgcmVjZWl2ZVBpbm5lZEJvdHRvbVJvdzogYW55W10gPSBbXTtcclxuICBwcml2YXRlIHNlbmRHcmlkQXBpITogR3JpZEFwaTtcclxuICBwcml2YXRlIHJlY2VpdmVHcmlkQXBpITogR3JpZEFwaTtcclxuICBwcml2YXRlIG9wZW5pbmdHcmlkQXBpITogR3JpZEFwaTtcclxuICBzZWFyY2hUZXh0OiBzdHJpbmc7XHJcbiAgY2xvc2luZ0JhbGFuY2U6IG51bWJlciA9IDA7XHJcblxyXG4gIGNsb3NpbmdCYWxhbmNlQ3VycmVuY3kgPSAnVVNEJztcclxuICBjbG9zaW5nQmFsYW5jZVVTREluV29yZHM6IHN0cmluZyA9ICcnO1xyXG5cclxuICBzZWxlY3RlZENsaWVudFR5cGU6IHN0cmluZyA9ICcnO1xyXG4gIHNob3dUYWJsZXMgPSBmYWxzZTtcclxuICBwcml2YXRlIGxvZ29CYXNlNjQ/OiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRFeHBvcnRPcHRpb246IHN0cmluZztcclxuXHJcbiAgY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudDogbnVtYmVyID0gMDtcclxuICBjbG9zaW5nQmFsYW5jZVNldHRsbWVudEN1cnJlbmN5OiBzdHJpbmcgPSAnJztcclxuICBjbG9zaW5nQmFsYW5jZVNldHRsbWVudEluV29yZHM6IHN0cmluZyA9ICcnO1xyXG4gIGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Rm9ybWF0dGVkOiBzdHJpbmcgPSAnMC4wMDAnO1xyXG4gIGNsb3NpbmdCYWxhbmNlSW5Vc2RGb3JtYXR0ZWQ6IHN0cmluZyA9ICcwLjAwMCc7XHJcbiAgcmVwb3J0VXNlcmFuZFRpbWU6IHN0cmluZztcclxuICBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdO1xyXG4gIGlzRm9ybVZhbGlkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVwb3J0U2VydmljZTogUmVwb3J0U2VydmljZSkgeyB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5sb2dvQmFzZTY0ID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VBc0Jhc2U2NCgnYXNzZXRzL3JlcG9ydHMtbGliL2Fzc2V0cy9pbWFnZXMvWE1Mb2dvLnBuZycpO1xyXG4gIH1cclxuXHJcbiAgY29sdW1uRGVmcyA9IFtcclxuICAgIC8vIHsgaGVhZGVyTmFtZTogJ0lEJywgZmllbGQ6ICdpZCcsIHdpZHRoOiAxMDAgfSxcclxuICAgIHsgaGVhZGVyTmFtZTogJ0Rlc2NyaXB0aW9uJywgZmllbGQ6ICdkZXNjcmlwdGlvbicsIGZsZXg6IDQsIHRvb2x0aXBGaWVsZDogJ2Rlc2NyaXB0aW9uJywgY2VsbENsYXNzUnVsZXM6IHsgJ3Bpbm5lZC10b3RhbC1jZWxsJzogcGFyYW1zID0+IHBhcmFtcy5ub2RlLnJvd1Bpbm5lZCA9PT0gJ2JvdHRvbScgfSB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnU2V0dGxtZW50IENjeScsIGZpZWxkOiAnc2V0dGxtZW50Q2N5JywgZmxleDogMSwgdG9vbHRpcEZpZWxkOiAnc2V0dGxtZW50Q2N5JywgY2VsbENsYXNzUnVsZXM6IHsgJ3Bpbm5lZC10b3RhbC1jZWxsJzogcGFyYW1zID0+IHBhcmFtcy5ub2RlLnJvd1Bpbm5lZCA9PT0gJ2JvdHRvbScgfSB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnQW1vdW50IEluIFNldHRsbWVudCBDY3knLCBmaWVsZDogJ2Ftb3VudEluU2V0dGxtZW50Q2N5JywgZmxleDogMi4xLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwnLCB2YWx1ZUZvcm1hdHRlcjogdGhpcy5jdXJyZW5jeUZvcm1hdHRlciwgdG9vbHRpcFZhbHVlR2V0dGVyOiAocGFyYW1zOiBhbnkpID0+IHRoaXMuY3VycmVuY3lGb3JtYXR0ZXIocGFyYW1zKSwgY2VsbENsYXNzUnVsZXM6IHsgJ3Bpbm5lZC10b3RhbC1jZWxsJzogcGFyYW1zID0+IHBhcmFtcy5ub2RlLnJvd1Bpbm5lZCA9PT0gJ2JvdHRvbScgfSB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnQW1vdW50IEluIFVTRCcsIGZpZWxkOiAnYW1vdW50SW5VU0QnLCBmbGV4OiAyLjEsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCcsIHZhbHVlRm9ybWF0dGVyOiB0aGlzLmN1cnJlbmN5Rm9ybWF0dGVyLCB0b29sdGlwVmFsdWVHZXR0ZXI6IChwYXJhbXM6IGFueSkgPT4gdGhpcy5jdXJyZW5jeUZvcm1hdHRlcihwYXJhbXMpLCBjZWxsQ2xhc3NSdWxlczogeyAncGlubmVkLXRvdGFsLWNlbGwnOiBwYXJhbXMgPT4gcGFyYW1zLm5vZGUucm93UGlubmVkID09PSAnYm90dG9tJyB9IH1cclxuICBdO1xyXG5cclxuICBkZWZhdWx0Q29sRGVmID0ge1xyXG4gICAgc29ydGFibGU6IHRydWUsXHJcbiAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICBtaW53aWR0aDogNDAsXHJcbiAgICB3cmFwSGVhZGVyVGV4dDogdHJ1ZSxcclxuICAgIGF1dG9IZWFkZXJIZWlnaHQ6IHRydWUsXHJcbiAgICBzdXBwcmVzc1NpemVUb0ZpdDogZmFsc2UsXHJcbiAgICB3cmFwVGV4dDogdHJ1ZSxcclxuICAgIGF1dG9IZWlnaHQ6IHRydWVcclxuICB9O1xyXG5cclxuICBjdXJyZW5jeUZvcm1hdHRlcihwYXJhbXM6IGFueSkge1xyXG4gICAgaWYgKHBhcmFtcy52YWx1ZSA9PSBudWxsKSByZXR1cm4gJzAuMDAwJztcclxuICAgIGNvbnN0IG51bSA9IE51bWJlcihwYXJhbXMudmFsdWUpO1xyXG4gICAgcmV0dXJuIG51bS50b0ZpeGVkKDMpOyAvLyByb3VuZHMgdG8gMyBkZWNpbWFsc1xyXG4gIH1cclxuXHJcblxyXG4gIGFzeW5jIGhhbmRsZVNlYXJjaChjcml0ZXJpYTogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNlYXJjaENyaXRlcmlhID0gY3JpdGVyaWEuc2VhcmNoQ3JpdGVyaWE7XHJcbiAgICBjb25zdCBtb2RhbCA9IGNyaXRlcmlhLm1vZGFsO1xyXG4gICAgdGhpcy5yZXBvcnRVc2VyYW5kVGltZSA9IGAke2NyaXRlcmlhLnN5c1VzZXJJRH0gQCAke2Zvcm1hdERhdGUodGhpcy5jdXJyZW50RGF0ZVRpbWUsICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKX1gO1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgYnVzaW5lc3NQYXJ0bmVySUQ6IE51bWJlcihtb2RhbC5jbGllbnQpLFxyXG4gICAgICBmcm9tRGF0ZTogbmV3IERhdGUobW9kYWwuZnJvbURhdGUpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgIHRvRGF0ZTogbmV3IERhdGUobW9kYWwudG9EYXRlKS50b0lTT1N0cmluZygpLFxyXG4gICAgICBjbGllbnRUeXBlOiBjcml0ZXJpYS5jbGllbnRUeXBlXHJcbiAgICB9O1xyXG4gICAgdGhpcy51c2VyID0gY3JpdGVyaWEuc3lzVXNlcklEXHJcbiAgICB0aGlzLm1ldGFEYXRhT25lID0ge1xyXG4gICAgICAnUmVwb3J0IFBlcmlvZCAnOiBjcml0ZXJpYS5yZXBvcnRQZXJpb2RcclxuICAgIH1cclxuICAgIHRoaXMubWV0YURhdGFUd28gPSB7XHJcbiAgICAgICdSZXBvcnQgVXNlciAmIFRpbWUgJzogdGhpcy5yZXBvcnRVc2VyYW5kVGltZVxyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc2RhdGUgPSBuZXcgRGF0ZShwYXlsb2FkPy5mcm9tRGF0ZSk7XHJcbiAgICAgIGNvbnN0IGVkYXRlID0gbmV3IERhdGUocGF5bG9hZD8udG9EYXRlKTtcclxuICAgICAgcGF5bG9hZC5mcm9tRGF0ZSA9IHNkYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdO1xyXG4gICAgICBwYXlsb2FkLnRvRGF0ZSA9IGVkYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgRGF0ZVwiKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VhcmNoQ3JpdGVyaWEgPSBjcml0ZXJpYS5zZWFyY2hDcml0ZXJpYTtcclxuICAgIGNvbnNvbGUubG9nKGNyaXRlcmlhLmNsaWVudE5hbWUpXHJcbiAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuTG9hZGluZztcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgICB0aGlzLnNob3dUYWJsZXMgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRDbGllbnRUeXBlID0gY3JpdGVyaWEuY2xpZW50VHlwZTtcclxuXHJcbiAgICB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0U3RhdGVtZW50T2ZBY2NvdW50KHBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgICAgICAgIHRoaXMuaGFzU2VhcmNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5zaG93VGFibGVzID0gdHJ1ZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgICAgICAgIHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcgPSBkYXRhLm9wZW5pbmdCYWxBbmRGdW5kaW5nID8/IFtdO1xyXG4gICAgICAgICAgdGhpcy5zZW5kRGV0YWlscyA9IGRhdGEuc2VuZERldGFpbHMgPz8gW107XHJcbiAgICAgICAgICB0aGlzLnJlY2VpdmVEZXRhaWxzID0gZGF0YS5yZWNlaXZlRGV0YWlscyA/PyBbXTtcclxuXHJcbiAgICAgICAgICAvLyBhZGQgcGlubmVkIHRvdGFsc1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDbGllbnRUeXBlID09IFwiUGF5SW5cIikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbdGhpcy5idWlsZFRvdGFsUm93KHRoaXMuc2VuZERldGFpbHMpXTtcclxuICAgICAgICAgICAgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93ID0gW107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9PSBcIlBheU91dFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVBpbm5lZEJvdHRvbVJvdyA9IFt0aGlzLmJ1aWxkVG90YWxSb3codGhpcy5yZWNlaXZlRGV0YWlscyldO1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDbGllbnRUeXBlID09PSBcIkJvdGhcIikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbdGhpcy5idWlsZFRvdGFsUm93KHRoaXMuc2VuZERldGFpbHMpXTtcclxuICAgICAgICAgICAgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93ID0gW3RoaXMuYnVpbGRUb3RhbFJvdyh0aGlzLnJlY2VpdmVEZXRhaWxzKV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZW5kUGlubmVkQm90dG9tUm93ID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVBpbm5lZEJvdHRvbVJvdyA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDbG9zaW5nQmFsYW5jZSgpO1xyXG5cclxuICAgICAgICAgIHRoaXMubm9EYXRhRnJvbUFwaSA9XHJcbiAgICAgICAgICAgIHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcubGVuZ3RoID09PSAwICYmXHJcbiAgICAgICAgICAgIHRoaXMuc2VuZERldGFpbHMubGVuZ3RoID09PSAwICYmXHJcbiAgICAgICAgICAgICghdGhpcy5yZWNlaXZlRGV0YWlscyB8fCB0aGlzLnJlY2VpdmVEZXRhaWxzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgU3RhdGVtZW50IG9mIEFjY291bnRzOicsIGVycik7XHJcbiAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICdGYWlsZWQgdG8gbG9hZCBTdGF0ZW1lbnQgb2YgQWNjb3VudHMnO1xyXG4gICAgICAgICAgdGhpcy5vcGVuaW5nQmFsQW5kRnVuZGluZyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5zZW5kRGV0YWlscyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5yZWNlaXZlRGV0YWlscyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkVycm9yO1xyXG4gICAgICAgICAgdGhpcy5zaG93VGFibGVzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRUb3RhbFJvdyhyb3dzOiB7IGFtb3VudEluU2V0dGxtZW50Q2N5OiBudW1iZXI7IGFtb3VudEluVVNEOiBudW1iZXIgfVtdKSB7XHJcbiAgICBjb25zdCB0b3RhbFNldHRsZSA9IChyb3dzIHx8IFtdKS5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKE51bWJlcihyLmFtb3VudEluU2V0dGxtZW50Q2N5KSB8fCAwKSwgMCk7XHJcbiAgICBjb25zdCB0b3RhbFVzZCA9IChyb3dzIHx8IFtdKS5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKE51bWJlcihyLmFtb3VudEluVVNEKSB8fCAwKSwgMCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IG51bGwsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwnLFxyXG4gICAgICBzZXR0bG1lbnRDY3k6ICcnLFxyXG4gICAgICBhbW91bnRJblNldHRsbWVudENjeTogTnVtYmVyKHRvdGFsU2V0dGxlLnRvRml4ZWQoMykpLFxyXG4gICAgICBhbW91bnRJblVTRDogTnVtYmVyKHRvdGFsVXNkLnRvRml4ZWQoMykpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb25PcGVuaW5nR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICB0aGlzLm9wZW5pbmdHcmlkQXBpID0gcGFyYW1zLmFwaTtcclxuICB9XHJcbiAgb25TZW5kR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICB0aGlzLnNlbmRHcmlkQXBpID0gcGFyYW1zLmFwaTtcclxuICB9XHJcbiAgb25SZWNlaXZlR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICB0aGlzLnJlY2VpdmVHcmlkQXBpID0gcGFyYW1zLmFwaTtcclxuICB9XHJcblxyXG4gIGZpbHRlcih0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRleHQ7XHJcbiAgICBpZiAodGhpcy5vcGVuaW5nR3JpZEFwaSkge1xyXG4gICAgICB0aGlzLm9wZW5pbmdHcmlkQXBpLnNldFF1aWNrRmlsdGVyKHRoaXMuc2VhcmNoVGV4dCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZW5kR3JpZEFwaSkge1xyXG4gICAgICB0aGlzLnNlbmRHcmlkQXBpLnNldFF1aWNrRmlsdGVyKHRoaXMuc2VhcmNoVGV4dCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yZWNlaXZlR3JpZEFwaSkge1xyXG4gICAgICB0aGlzLnJlY2VpdmVHcmlkQXBpLnNldFF1aWNrRmlsdGVyKHRoaXMuc2VhcmNoVGV4dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZUNsb3NpbmdCYWxhbmNlKCk6IHZvaWQge1xyXG4gICAgLy8gVVNEIHRvdGFscyAoZXhpc3RpbmcgbG9naWMpXHJcbiAgICBjb25zdCBvcGVuaW5nQmFsVG90YWxVc2QgPSAodGhpcy5vcGVuaW5nQmFsQW5kRnVuZGluZyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoc3VtLCByOiBhbnkpID0+IHN1bSArIChOdW1iZXIoci5hbW91bnRJblVTRCkgfHwgMCksIDBcclxuICAgICk7XHJcbiAgICBjb25zdCBzZW5kVG90YWxVc2QgPSAodGhpcy5zZW5kRGV0YWlscyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoc3VtLCByOiBhbnkpID0+IHN1bSArIChOdW1iZXIoci5hbW91bnRJblVTRCkgfHwgMCksIDBcclxuICAgICk7XHJcbiAgICBjb25zdCByZWNlaXZlVG90YWxVc2QgPSAodGhpcy5yZWNlaXZlRGV0YWlscyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoc3VtLCByOiBhbnkpID0+IHN1bSArIChOdW1iZXIoci5hbW91bnRJblVTRCkgfHwgMCksIDBcclxuICAgICk7XHJcbiAgICBjb25zdCByYXdDbG9zaW5nVXNkID0gb3BlbmluZ0JhbFRvdGFsVXNkICsgc2VuZFRvdGFsVXNkICsgcmVjZWl2ZVRvdGFsVXNkO1xyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZSA9IE51bWJlcihyYXdDbG9zaW5nVXNkLnRvRml4ZWQoMykpOyAvLyBudW1lcmljIFVTRFxyXG5cclxuICAgIC8vIFNldHRsZW1lbnQgY3VycmVuY3kgdG90YWxzIChuZXcpXHJcbiAgICBjb25zdCBvcGVuaW5nU2V0dGxlID0gKHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcgfHwgW10pLnJlZHVjZShcclxuICAgICAgKHN1bSwgcjogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5TZXR0bG1lbnRDY3kpIHx8IDApLCAwXHJcbiAgICApO1xyXG4gICAgY29uc3Qgc2VuZFNldHRsZSA9ICh0aGlzLnNlbmREZXRhaWxzIHx8IFtdKS5yZWR1Y2UoXHJcbiAgICAgIChzdW0sIHI6IGFueSkgPT4gc3VtICsgKE51bWJlcihyLmFtb3VudEluU2V0dGxtZW50Q2N5KSB8fCAwKSwgMFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHJlY2VpdmVTZXR0bGUgPSAodGhpcy5yZWNlaXZlRGV0YWlscyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoc3VtLCByOiBhbnkpID0+IHN1bSArIChOdW1iZXIoci5hbW91bnRJblNldHRsbWVudENjeSkgfHwgMCksIDBcclxuICAgICk7XHJcbiAgICBjb25zdCByYXdDbG9zaW5nU2V0dGxlID0gb3BlbmluZ1NldHRsZSArIHNlbmRTZXR0bGUgKyByZWNlaXZlU2V0dGxlO1xyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50ID0gTnVtYmVyKHJhd0Nsb3NpbmdTZXR0bGUudG9GaXhlZCgzKSk7XHJcblxyXG4gICAgLy8gcGljayBhIHNldHRsZW1lbnQgY3VycmVuY3kgdG8gZGlzcGxheSAoZmlyc3Qgbm9uLWVtcHR5KVxyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEN1cnJlbmN5ID0gdGhpcy5nZXRGaXJzdFNldHRsZW1lbnRDdXJyZW5jeSgpO1xyXG5cclxuICAgIC8vIGZvcm1hdHRlZCBzdHJpbmdzIChuby10aG91c2FuZC1jb21tYSwgMyBkZWNpbWFscylcclxuICAgIHRoaXMuY2xvc2luZ0JhbGFuY2VJblVzZEZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0Tm9Db21tYSh0aGlzLmNsb3NpbmdCYWxhbmNlKTtcclxuICAgIHRoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRGb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdE5vQ29tbWEodGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50KTtcclxuXHJcbiAgICB0aGlzLmNsb3NpbmdCYWxhbmNlVVNESW5Xb3JkcyA9IHRoaXMubnVtYmVyVG9Xb3Jkcyh0aGlzLmNsb3NpbmdCYWxhbmNlKTtcclxuICAgIHRoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRJbldvcmRzID1cclxuICAgICAgdGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50ICE9PSBudWxsICYmXHJcbiAgICAgICAgdGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50ICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAhaXNOYU4oTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudCkpXHJcbiAgICAgICAgPyB0aGlzLm51bWJlclRvV29yZHModGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50KVxyXG4gICAgICAgIDogJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdE5vQ29tbWEodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHJldHVybiAnMC4wMDAnO1xyXG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcclxuICAgIGNvbnN0IHRydW5jYXRlZCA9IE1hdGgudHJ1bmMobnVtICogMTAwMCkgLyAxMDAwO1xyXG4gICAgcmV0dXJuIHRydW5jYXRlZC50b0ZpeGVkKDMpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZ2V0Rmlyc3RTZXR0bGVtZW50Q3VycmVuY3koKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRyeUdldCA9IChhcnI6IGFueVtdKSA9PiB7XHJcbiAgICAgIGlmICghYXJyIHx8IGFyci5sZW5ndGggPT09IDApIHJldHVybiAnJztcclxuICAgICAgZm9yIChjb25zdCByIG9mIGFycikge1xyXG4gICAgICAgIGlmIChyICYmIHIuc2V0dGxtZW50Q2N5KSByZXR1cm4gci5zZXR0bG1lbnRDY3k7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdHJ5R2V0KHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcpIHx8IHRyeUdldCh0aGlzLnNlbmREZXRhaWxzKSB8fCB0cnlHZXQodGhpcy5yZWNlaXZlRGV0YWlscykgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBudW1iZXJUb1dvcmRzKG51bTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmIChudW0gPT09IDApIHJldHVybiBcIlplcm8gUG9pbnQgWmVybyBaZXJvIFplcm8gT25seVwiO1xyXG5cclxuICAgIGxldCByZXN1bHQgPSBcIlwiO1xyXG5cclxuICAgIC8vIEhhbmRsZSBuZWdhdGl2ZSBudW1iZXJzXHJcbiAgICBpZiAobnVtIDwgMCkge1xyXG4gICAgICByZXN1bHQgPSBcIk5lZ2F0aXZlIFwiO1xyXG4gICAgICBudW0gPSBNYXRoLmFicyhudW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNwbGl0IGludGVnZXIgYW5kIGRlY2ltYWwgcGFydHNcclxuICAgIGNvbnN0IGludGVnZXJQYXJ0ID0gTWF0aC5mbG9vcihudW0pO1xyXG4gICAgY29uc3QgZGVjaW1hbFBhcnQgPSBNYXRoLnJvdW5kKChudW0gLSBpbnRlZ2VyUGFydCkgKiAxMDAwKTsgLy8gdXAgdG8gMyBkZWNpbWFsIHBsYWNlc1xyXG5cclxuICAgIHJlc3VsdCArPSB0aGlzLmNvbnZlcnROdW1iZXIoaW50ZWdlclBhcnQpO1xyXG5cclxuICAgIGlmIChkZWNpbWFsUGFydCA+IDApIHtcclxuICAgICAgcmVzdWx0ICs9IFwiIFBvaW50XCI7XHJcbiAgICAgIGNvbnN0IGRlY2ltYWxTdHIgPSBkZWNpbWFsUGFydC50b1N0cmluZygpLnBhZFN0YXJ0KDMsIFwiMFwiKTsgLy8ga2VlcCAzIGRpZ2l0c1xyXG4gICAgICBmb3IgKGNvbnN0IGRpZ2l0IG9mIGRlY2ltYWxTdHIpIHtcclxuICAgICAgICByZXN1bHQgKz0gXCIgXCIgKyB0aGlzLm9uZXNbK2RpZ2l0XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQgKyBcIiBPbmx5XCI7XHJcbiAgfVxyXG5cclxuICAvLyBIZWxwZXIgYXJyYXlzXHJcbiAgcHJpdmF0ZSBvbmVzID0gW1wiWmVyb1wiLCBcIk9uZVwiLCBcIlR3b1wiLCBcIlRocmVlXCIsIFwiRm91clwiLCBcIkZpdmVcIiwgXCJTaXhcIiwgXCJTZXZlblwiLCBcIkVpZ2h0XCIsIFwiTmluZVwiXTtcclxuICBwcml2YXRlIHRlZW5zID0gW1wiVGVuXCIsIFwiRWxldmVuXCIsIFwiVHdlbHZlXCIsIFwiVGhpcnRlZW5cIiwgXCJGb3VydGVlblwiLCBcIkZpZnRlZW5cIiwgXCJTaXh0ZWVuXCIsIFwiU2V2ZW50ZWVuXCIsIFwiRWlnaHRlZW5cIiwgXCJOaW5ldGVlblwiXTtcclxuICBwcml2YXRlIHRlbnMgPSBbXCJcIiwgXCJcIiwgXCJUd2VudHlcIiwgXCJUaGlydHlcIiwgXCJGb3J0eVwiLCBcIkZpZnR5XCIsIFwiU2l4dHlcIiwgXCJTZXZlbnR5XCIsIFwiRWlnaHR5XCIsIFwiTmluZXR5XCJdO1xyXG5cclxuICAvLyBDb252ZXJ0IHdob2xlIG51bWJlcnMgKEluZGlhbi9JbnRlcm5hdGlvbmFsIHN5c3RlbSlcclxuICBwcml2YXRlIGNvbnZlcnROdW1iZXIobnVtOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKG51bSA9PT0gMCkgcmV0dXJuIFwiXCI7XHJcbiAgICBpZiAobnVtIDwgMTApIHJldHVybiB0aGlzLm9uZXNbbnVtXTtcclxuICAgIGlmIChudW0gPCAyMCkgcmV0dXJuIHRoaXMudGVlbnNbbnVtIC0gMTBdO1xyXG4gICAgaWYgKG51bSA8IDEwMCkgcmV0dXJuIHRoaXMudGVuc1tNYXRoLmZsb29yKG51bSAvIDEwKV0gKyAobnVtICUgMTAgIT09IDAgPyBcIiBcIiArIHRoaXMub25lc1tudW0gJSAxMF0gOiBcIlwiKTtcclxuICAgIGlmIChudW0gPCAxMDAwKSByZXR1cm4gdGhpcy5jb252ZXJ0TnVtYmVyKE1hdGguZmxvb3IobnVtIC8gMTAwKSkgKyBcIiBIdW5kcmVkXCIgKyAobnVtICUgMTAwICE9PSAwID8gXCIgXCIgKyB0aGlzLmNvbnZlcnROdW1iZXIobnVtICUgMTAwKSA6IFwiXCIpO1xyXG4gICAgaWYgKG51bSA8IDEwMDAwMDApIHJldHVybiB0aGlzLmNvbnZlcnROdW1iZXIoTWF0aC5mbG9vcihudW0gLyAxMDAwKSkgKyBcIiBUaG91c2FuZFwiICsgKG51bSAlIDEwMDAgIT09IDAgPyBcIiBcIiArIHRoaXMuY29udmVydE51bWJlcihudW0gJSAxMDAwKSA6IFwiXCIpO1xyXG4gICAgaWYgKG51bSA8IDEwMDAwMDAwMDApIHJldHVybiB0aGlzLmNvbnZlcnROdW1iZXIoTWF0aC5mbG9vcihudW0gLyAxMDAwMDAwKSkgKyBcIiBNaWxsaW9uXCIgKyAobnVtICUgMTAwMDAwMCAhPT0gMCA/IFwiIFwiICsgdGhpcy5jb252ZXJ0TnVtYmVyKG51bSAlIDEwMDAwMDApIDogXCJcIik7XHJcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0TnVtYmVyKE1hdGguZmxvb3IobnVtIC8gMTAwMDAwMDAwMCkpICsgXCIgQmlsbGlvblwiICsgKG51bSAlIDEwMDAwMDAwMDAgIT09IDAgPyBcIiBcIiArIHRoaXMuY29udmVydE51bWJlcihudW0gJSAxMDAwMDAwMDAwKSA6IFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgb25FeHBvcnRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEV4cG9ydE9wdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXhwb3J0KG9wdGlvbjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uID0gb3B0aW9uO1xyXG4gICAgc3dpdGNoICgodGhpcy5zZWxlY3RlZEV4cG9ydE9wdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdwZGYnOiB0aGlzLmV4cG9ydFRvUERGKCk7IGJyZWFrO1xyXG4gICAgICBjYXNlICdleGNlbCc6IHRoaXMuZXhwb3J0VG9FeGNlbCgpOyBicmVhaztcclxuICAgICAgY2FzZSAnY3N2JzogdGhpcy5leHBvcnRUb0NTVigpOyBicmVhaztcclxuICAgICAgZGVmYXVsdDogY29uc29sZS53YXJuKCdVbmtub3duIGV4cG9ydCB0eXBlOicsIHRoaXMuc2VsZWN0ZWRFeHBvcnRPcHRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9QREYoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWN0aW9ucyA9IHRoaXMuZ2V0VmlzaWJsZUdyaWRzKClcclxuICAgICAgLm1hcChzID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREaXNwbGF5ZWREYXRhKHMuYXBpKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKCk7XHJcbiAgICAgICAgbGV0IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyhkYXRhKTtcclxuXHJcbiAgICAgICAgaWYgKHMudGl0bGUgPT09ICdTZW5kIERldGFpbHMnICYmIHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByb3dzID0gcm93cy5jb25jYXQodGhpcy5idWlsZFJvd3ModGhpcy5zZW5kUGlubmVkQm90dG9tUm93KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzLnRpdGxlID09PSAnUmVjZWl2ZSBEZXRhaWxzJyAmJiB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMucmVjZWl2ZVBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJvd3MubGVuZ3RoID8geyB0aXRsZTogcy50aXRsZSwgaGVhZGVycywgcm93cyB9IDogbnVsbDtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyB7IHRpdGxlOiBzdHJpbmc7IGhlYWRlcnM6IHN0cmluZ1tdOyByb3dzOiBhbnlbXVtdIH1bXTtcclxuICAgIGlmICghc2VjdGlvbnMubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZG9jID0gbmV3IGpzUERGKHsgb3JpZW50YXRpb246ICdsYW5kc2NhcGUnLCB1bml0OiAnbW0nLCBmb3JtYXQ6ICdhNCcgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMubG9nb0Jhc2U2NCkge1xyXG4gICAgICBkb2MuYWRkSW1hZ2UodGhpcy5sb2dvQmFzZTY0LCAnUE5HJywgMTUsIDEwLCAzOCwgMTgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpO1xyXG4gICAgY29uc3QgcGFnZUhlaWdodCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKTtcclxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgZG9jLnNldEZvbnRTaXplKDE1KTtcclxuICAgIGRvYy50ZXh0KHRoaXMuUmVwb3J0TmFtZSwgcGFnZVdpZHRoIC8gMiwgMTgsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xyXG5cclxuICAgIGxldCB5ID0gMzQ7XHJcbiAgICBkb2Muc2V0Rm9udFNpemUoMTApO1xyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5tZXRhRGF0YU9uZSB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICBkb2MudGV4dChgJHtrfTogYCwgMTUsIHkpO1xyXG4gICAgICBjb25zdCB3ID0gZG9jLmdldFRleHRXaWR0aChgJHtrfTogYCk7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgIGRvYy50ZXh0KFN0cmluZyh2ID8/ICcnKSwgMTUgKyB3LCB5KTtcclxuICAgICAgeSArPSA2O1xyXG4gICAgfSk7XHJcblxyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5tZXRhRGF0YVR3byB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICBkb2MudGV4dChgJHtrfTogYCwgMTUsIHkpO1xyXG4gICAgICBjb25zdCB3ID0gZG9jLmdldFRleHRXaWR0aChgJHtrfTogYCk7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgIGRvYy50ZXh0KFN0cmluZyh2ID8/ICcnKSwgMTUgKyB3LCB5KTtcclxuICAgICAgeSArPSA2O1xyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgLS0tXHJcbiAgICBjb25zdCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gdGhpcy5zZWFyY2hDcml0ZXJpYSB8fCBbXTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoIENyaXRlcmlhIFNlY3Rpb24gPT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gICAgLy8gU3RhcnQganVzdCBiZWxvdyBtZXRhZGF0YVxyXG4gICAgbGV0IG1hcmdpbkxlZnQgPSAxNTtcclxuICAgIGxldCBjdXJyZW50WSA9IHkgKyA1OyAvLyBjb250aW51ZSBiZWxvdyBtZXRhZGF0YVxyXG5cclxuICAgIC8vIC0tLSBoZWFkaW5nIC0tLVxyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICBkb2MudGV4dCgnU2VhcmNoIENyaXRlcmlhOi0nLCBtYXJnaW5MZWZ0LCBjdXJyZW50WSk7XHJcbiAgICBjdXJyZW50WSArPSA4O1xyXG5cclxuICAgIGNvbnN0IHJvd0hlaWdodFBlckxpbmUgPSA2O1xyXG4gICAgY29uc3QgbWluR2FwID0gMjsgLy8gZ2FwIGJldHdlZW4ga2V5IGFuZCB2YWx1ZVxyXG4gICAgY29uc3QgYmV0d2VlbkNvbHVtbnNHYXAgPSAxNTsgLy8gZ2FwIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgY29sdW1uc1xyXG4gICAgY29uc3QgcGFnZUNvbnRlbnRXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIDIgKiBtYXJnaW5MZWZ0O1xyXG5cclxuICAgIC8vIC0tLSBoZWxwZXIgdG8gbWVhc3VyZSBwYWlyIHdpZHRoIC0tLVxyXG4gICAgY29uc3QgbWVhc3VyZVBhaXJXaWR0aCA9IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IG51bWJlciA9PiB7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICBjb25zdCBrZXlXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoa2V5ICsgJyAnKTtcclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgY29uc3QgdmFsdWVXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodmFsdWUpO1xyXG4gICAgICByZXR1cm4ga2V5V2lkdGggKyBtaW5HYXAgKyB2YWx1ZVdpZHRoO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyAtLS0gY29tcHV0ZSBtYXggd2lkdGggb2YgbGVmdCBjb2x1bW4gLS0tXHJcbiAgICBsZXQgbWF4TGVmdFBhaXJXaWR0aCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGlmIChzZWFyY2hDcml0ZXJpYVtpXSkge1xyXG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHNlYXJjaENyaXRlcmlhW2ldO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gbWVhc3VyZVBhaXJXaWR0aChrZXksIHZhbHVlKTtcclxuICAgICAgICBpZiAod2lkdGggPiBtYXhMZWZ0UGFpcldpZHRoKSBtYXhMZWZ0UGFpcldpZHRoID0gd2lkdGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0gY2FsY3VsYXRlIHdoZXJlIHJpZ2h0IGNvbHVtbiBzdGFydHMgLS0tXHJcbiAgICBjb25zdCBsZWZ0Q29sdW1uU3RhcnQgPSBtYXJnaW5MZWZ0O1xyXG4gICAgY29uc3QgcmlnaHRDb2x1bW5TdGFydCA9IGxlZnRDb2x1bW5TdGFydCArIG1heExlZnRQYWlyV2lkdGggKyBiZXR3ZWVuQ29sdW1uc0dhcDtcclxuXHJcbiAgICAvLyAtLS0gcHJpbnQgcGFpcnMgZHluYW1pY2FsbHkgLS0tXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIC8vIExlZnQgY29sdW1uXHJcbiAgICAgIGlmIChzZWFyY2hDcml0ZXJpYVtpXSkge1xyXG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHNlYXJjaENyaXRlcmlhW2ldO1xyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICAgIGRvYy50ZXh0KGtleSwgbGVmdENvbHVtblN0YXJ0LCBjdXJyZW50WSk7XHJcblxyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgICAgY29uc3Qga2V5V2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKGtleSArICcgJyk7XHJcbiAgICAgICAgY29uc3QgdmFsdWVYID0gbGVmdENvbHVtblN0YXJ0ICsga2V5V2lkdGggKyBtaW5HYXA7XHJcbiAgICAgICAgZG9jLnRleHQodmFsdWUsIHZhbHVlWCwgY3VycmVudFkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSaWdodCBjb2x1bW5cclxuICAgICAgaWYgKHNlYXJjaENyaXRlcmlhW2kgKyAxXSkge1xyXG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHNlYXJjaENyaXRlcmlhW2kgKyAxXTtcclxuICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICAgICAgICBkb2MudGV4dChrZXksIHJpZ2h0Q29sdW1uU3RhcnQsIGN1cnJlbnRZKTtcclxuXHJcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgICBjb25zdCBrZXlXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoa2V5ICsgJyAnKTtcclxuICAgICAgICBjb25zdCB2YWx1ZVggPSByaWdodENvbHVtblN0YXJ0ICsga2V5V2lkdGggKyBtaW5HYXA7XHJcbiAgICAgICAgZG9jLnRleHQodmFsdWUsIHZhbHVlWCwgY3VycmVudFkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjdXJyZW50WSArPSByb3dIZWlnaHRQZXJMaW5lO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBZIHBvc2l0aW9uIGZvciBuZXh0IHNlY3Rpb25zXHJcbiAgICB5ID0gY3VycmVudFkgKyA0O1xyXG5cclxuICAgIGNvbnN0IEhFQUQgPSB0aGlzLmdldEhlYWRlcnMoKTtcclxuXHJcbiAgICBjb25zdCBtYXJnaW4gPSB7IGxlZnQ6IDE1LCByaWdodDogMTUgfTtcclxuICAgIGNvbnN0IGF2YWlsID0gcGFnZVdpZHRoIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XHJcbiAgICBjb25zdCB3ZWlnaHRzID0gWzQsIDEsIDIsIDJdO1xyXG4gICAgY29uc3Qgc3VtID0gd2VpZ2h0cy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcclxuICAgIGNvbnN0IHdpZHRocyA9IHdlaWdodHMubWFwKHcgPT4gKHcgLyBzdW0pICogYXZhaWwpO1xyXG5cclxuICAgIGNvbnN0IHNoYXJlZENvbHVtblN0eWxlcyA9IHtcclxuICAgICAgMDogeyBjZWxsV2lkdGg6IHdpZHRoc1swXSB9LFxyXG4gICAgICAxOiB7IGNlbGxXaWR0aDogd2lkdGhzWzFdIH0sXHJcbiAgICAgIDI6IHsgY2VsbFdpZHRoOiB3aWR0aHNbMl0sIGhhbGlnbjogJ3JpZ2h0JyB9LFxyXG4gICAgICAzOiB7IGNlbGxXaWR0aDogd2lkdGhzWzNdLCBoYWxpZ246ICdyaWdodCcgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB0aXRsZUdhcEFib3ZlRmlyc3QgPSAwO1xyXG4gICAgY29uc3QgdGl0bGVHYXBBYm92ZURlZmF1bHQgPSA0O1xyXG4gICAgY29uc3QgdGl0bGVHYXBBYm92ZUJpZyA9IDY7XHJcbiAgICBjb25zdCB0aXRsZVRvVGFibGVHYXAgPSAyO1xyXG4gICAgY29uc3QgdG9wU3RhcnRZID0gMjA7XHJcbiAgICBjb25zdCBib3R0b21SZXNlcnZlID0gMjA7XHJcblxyXG4gICAgc2VjdGlvbnMuZm9yRWFjaCgocywgaWR4KSA9PiB7XHJcbiAgICAgIGNvbnN0IGlzRmlyc3QgPSBpZHggPT09IDA7XHJcbiAgICAgIGNvbnN0IGlzU2VuZE9yUmVjZWl2ZSA9IHMudGl0bGUgPT09ICdTZW5kIERldGFpbHMnIHx8IHMudGl0bGUgPT09ICdSZWNlaXZlIERldGFpbHMnO1xyXG4gICAgICBjb25zdCBwcmVUaXRsZUdhcCA9IGlzRmlyc3QgPyAwIDogKGlzU2VuZE9yUmVjZWl2ZSA/IHRpdGxlR2FwQWJvdmVCaWcgOiB0aXRsZUdhcEFib3ZlRGVmYXVsdCk7XHJcblxyXG4gICAgICBpZiAoeSArIHByZVRpdGxlR2FwICsgdGl0bGVUb1RhYmxlR2FwID4gcGFnZUhlaWdodCAtIGJvdHRvbVJlc2VydmUpIHtcclxuICAgICAgICBkb2MuYWRkUGFnZSgpO1xyXG4gICAgICAgIHkgPSB0b3BTdGFydFk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgeSArPSBwcmVUaXRsZUdhcDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XHJcbiAgICAgIGRvYy50ZXh0KHMudGl0bGUsIG1hcmdpbi5sZWZ0LCB5KTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0WUZvclRhYmxlID0geSArIChpc0ZpcnN0ID8gMCA6IHRpdGxlVG9UYWJsZUdhcCk7XHJcblxyXG4gICAgICBkb2MuYXV0b1RhYmxlKHtcclxuICAgICAgICBoZWFkOiBbSEVBRF0sXHJcbiAgICAgICAgYm9keTogcy5yb3dzLFxyXG4gICAgICAgIHN0YXJ0WTogc3RhcnRZRm9yVGFibGUsXHJcbiAgICAgICAgdGhlbWU6ICdncmlkJyxcclxuICAgICAgICBtYXJnaW4sXHJcbiAgICAgICAgdGFibGVXaWR0aDogYXZhaWwsXHJcbiAgICAgICAgY29sdW1uU3R5bGVzOiBzaGFyZWRDb2x1bW5TdHlsZXMsXHJcbiAgICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6IFsyMjAsIDIyMCwgMjIwXSwgdGV4dENvbG9yOiAwLCBmb250U3R5bGU6ICdib2xkJywgZm9udFNpemU6IDksIGhhbGlnbjogJ2NlbnRlcicgfSxcclxuICAgICAgICBib2R5U3R5bGVzOiB7IGZvbnRTaXplOiA4IH0sXHJcbiAgICAgICAgc3R5bGVzOiB7IGNlbGxQYWRkaW5nOiAyLCBvdmVyZmxvdzogJ2xpbmVicmVhaycsIG1pbkNlbGxIZWlnaHQ6IDYgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHkgPSAoZG9jIGFzIGFueSkubGFzdEF1dG9UYWJsZS5maW5hbFk7XHJcbiAgICB9KTtcclxuICAgIGlmICh5ICsgMzAgPiBwYWdlSGVpZ2h0IC0gYm90dG9tUmVzZXJ2ZSkge1xyXG4gICAgICBkb2MuYWRkUGFnZSgpO1xyXG4gICAgICB5ID0gdG9wU3RhcnRZO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNsb3NpbmdCb2R5ID0gW1xyXG4gICAgICBbXHJcbiAgICAgICAgeyBjb250ZW50OiAnQ2xvc2luZyBCYWxhbmNlJywgY29sU3BhbjogMiwgc3R5bGVzOiB7IGhhbGlnbjogJ2xlZnQnLCBmb250U3R5bGU6ICdib2xkJyB9IH0sXHJcbiAgICAgICAgeyBjb250ZW50OiBOdW1iZXIodGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50IHx8IDApLnRvRml4ZWQoMyksIHN0eWxlczogeyBoYWxpZ246ICdyaWdodCcgfSB9LFxyXG4gICAgICAgIHsgY29udGVudDogTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2UgfHwgMCkudG9GaXhlZCgzKSwgc3R5bGVzOiB7IGhhbGlnbjogJ3JpZ2h0JyB9IH1cclxuICAgICAgXSxcclxuICAgICAgW1xyXG4gICAgICAgIHsgY29udGVudDogYCR7dGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEN1cnJlbmN5IHx8ICcnfSAtICR7dGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEluV29yZHMgfHwgJyd9YCwgY29sU3BhbjogNCwgc3R5bGVzOiB7IGhhbGlnbjogJ2xlZnQnIH0gfVxyXG4gICAgICBdLFxyXG4gICAgICBbXHJcbiAgICAgICAgeyBjb250ZW50OiBgJHt0aGlzLmNsb3NpbmdCYWxhbmNlQ3VycmVuY3kgfHwgJyd9IC0gJHt0aGlzLmNsb3NpbmdCYWxhbmNlVVNESW5Xb3JkcyB8fCAnJ31gLCBjb2xTcGFuOiA0LCBzdHlsZXM6IHsgaGFsaWduOiAnbGVmdCcgfSB9XHJcbiAgICAgIF1cclxuICAgIF07XHJcblxyXG4gICAgZG9jLmF1dG9UYWJsZSh7XHJcbiAgICAgIGJvZHk6IGNsb3NpbmdCb2R5LFxyXG4gICAgICBzdGFydFk6IHksXHJcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXHJcbiAgICAgIG1hcmdpbixcclxuICAgICAgdGFibGVXaWR0aDogYXZhaWwsXHJcbiAgICAgIGNvbHVtblN0eWxlczogc2hhcmVkQ29sdW1uU3R5bGVzLFxyXG4gICAgICBzdHlsZXM6IHsgY2VsbFBhZGRpbmc6IDIsIGZvbnRTaXplOiA5IH1cclxuICAgIH0pO1xyXG5cclxuICAgIGRvYy5zYXZlKCdTdGF0ZW1lbnRfb2ZfQWNjb3VudHMucGRmJyk7XHJcbiAgfVxyXG5cclxuICBleHBvcnRUb0V4Y2VsKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLmdldFZpc2libGVHcmlkcygpXHJcbiAgICAgIC5tYXAocyA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGlzcGxheWVkRGF0YShzLmFwaSk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG4gICAgICAgIGxldCByb3dzID0gdGhpcy5idWlsZFJvd3MoZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChzLnRpdGxlID09PSAnU2VuZCBEZXRhaWxzJyAmJiB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocy50aXRsZSA9PT0gJ1JlY2VpdmUgRGV0YWlscycgJiYgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHJvd3MgPSByb3dzLmNvbmNhdCh0aGlzLmJ1aWxkUm93cyh0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByb3dzLmxlbmd0aCA/IHsgdGl0bGU6IHMudGl0bGUsIGhlYWRlcnMsIHJvd3MgfSA6IG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgeyB0aXRsZTogc3RyaW5nOyBoZWFkZXJzOiBzdHJpbmdbXTsgcm93czogYW55W11bXSB9W107XHJcblxyXG4gICAgaWYgKCFzZWN0aW9ucy5sZW5ndGgpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB3YiA9IG5ldyBFeGNlbEpTLldvcmtib29rKCk7XHJcbiAgICBjb25zdCB3cyA9IHdiLmFkZFdvcmtzaGVldCgnU3RhdGVtZW50IG9mIEFjY291bnRzJyk7XHJcbiAgICBsZXQgciA9IDE7XHJcblxyXG4gICAgaWYgKHRoaXMubG9nb0Jhc2U2NCkge1xyXG4gICAgICBjb25zdCBpbWdJZCA9IHdiLmFkZEltYWdlKHsgYmFzZTY0OiB0aGlzLmxvZ29CYXNlNjQsIGV4dGVuc2lvbjogJ3BuZycgfSk7XHJcbiAgICAgIHdzLmFkZEltYWdlKGltZ0lkLCB7IHRsOiB7IGNvbDogMCwgcm93OiAwIH0sIGV4dDogeyB3aWR0aDogMTQ1LCBoZWlnaHQ6IDY2IH0sIGVkaXRBczogJ29uZUNlbGwnIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHdzLmdldFJvdyhyKS5nZXRDZWxsKDIpLnZhbHVlID0gdGhpcy5SZXBvcnROYW1lO1xyXG4gICAgd3MuZ2V0Um93KHIpLmdldENlbGwoMikuZm9udCA9IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTYgfTtcclxuICAgIHIgKz0gMztcclxuXHJcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLm1ldGFEYXRhT25lIHx8IHt9KS5mb3JFYWNoKChbaywgdl0pID0+IHtcclxuICAgICAgY29uc3Qgcm93ID0gd3MuZ2V0Um93KHIrKyk7XHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6IGsgKyAnOiAnLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LCAvLyBrZXkgYm9sZFxyXG4gICAgICAgICAgeyB0ZXh0OiB2ID8/ICcnIH0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBub3JtYWxcclxuICAgICAgICBdXHJcbiAgICAgIH07XHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLmFsaWdubWVudCA9IHsgd3JhcFRleHQ6IGZhbHNlLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMubWV0YURhdGFUd28gfHwge30pLmZvckVhY2goKFtrLCB2XSkgPT4ge1xyXG4gICAgICBjb25zdCByb3cgPSB3cy5nZXRSb3cocisrKTtcclxuICAgICAgcm93LmdldENlbGwoMSkudmFsdWUgPSB7XHJcbiAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgIHsgdGV4dDogayArICc6ICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sIC8vIGtleSBib2xkXHJcbiAgICAgICAgICB7IHRleHQ6IHYgPz8gJycgfSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIG5vcm1hbFxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuICAgICAgcm93LmdldENlbGwoMSkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogZmFsc2UsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgcisrO1xyXG4gICAgLy8gLS0tIHNlYXJjaCBjcml0ZXJpYSAtLS1cclxuICAgIGNvbnN0IHNlYXJjaENyaXRlcmlhOiBbc3RyaW5nLCBzdHJpbmddW10gPSB0aGlzLnNlYXJjaENyaXRlcmlhIHx8IFtdO1xyXG5cclxuICAgIHdzLm1lcmdlQ2VsbHMociwgMSwgciwgNCk7IC8vIHByZXZpb3VzbHkgMS4uNlxyXG4gICAgd3MuZ2V0Q2VsbChyLCAxKS52YWx1ZSA9ICdTZWFyY2ggQ3JpdGVyaWE6LSc7XHJcbiAgICB3cy5nZXRDZWxsKHIsIDEpLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgIHIgKz0gMjtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGNvbnN0IGxlZnQgPSBzZWFyY2hDcml0ZXJpYVtpXTtcclxuICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07XHJcbiAgICAgIGNvbnN0IHJvdyA9IHdzLmdldFJvdyhyKyspO1xyXG5cclxuICAgICAgLy8gTGVmdCBjb2x1bW4gKHJlZHVjZWQgbWVyZ2UpXHJcbiAgICAgIHdzLm1lcmdlQ2VsbHMocm93Lm51bWJlciwgMSwgcm93Lm51bWJlciwgMSk7IC8vIHdhcyAxLi4zXHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6IGxlZnRbMF0gKyAnICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICB7IHRleHQ6IGxlZnRbMV0gfVxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuICAgICAgcm93LmdldENlbGwoMSkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogdHJ1ZSwgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcblxyXG4gICAgICAvLyBSaWdodCBjb2x1bW4gKHN0YXJ0IGNsb3NlciB0byBsZWZ0KVxyXG4gICAgICBpZiAocmlnaHQpIHtcclxuICAgICAgICB3cy5tZXJnZUNlbGxzKHJvdy5udW1iZXIsIDIsIHJvdy5udW1iZXIsIDMpOyAvLyB3YXMgNC4uNlxyXG4gICAgICAgIHJvdy5nZXRDZWxsKDMpLnZhbHVlID0ge1xyXG4gICAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgICAgeyB0ZXh0OiByaWdodFswXSArICcgJywgZm9udDogeyBib2xkOiB0cnVlIH0gfSxcclxuICAgICAgICAgICAgeyB0ZXh0OiByaWdodFsxXSB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfTtcclxuICAgICAgICByb3cuZ2V0Q2VsbCgzKS5hbGlnbm1lbnQgPSB7IHdyYXBUZXh0OiB0cnVlLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHIrKztcclxuXHJcbiAgICBjb25zdCB3cml0ZVNlY3Rpb24gPSAoc2VjOiB7IHRpdGxlOiBzdHJpbmc7IGhlYWRlcnM6IHN0cmluZ1tdOyByb3dzOiBhbnlbXVtdIH0pID0+IHtcclxuICAgICAgY29uc3QgdGl0bGVSb3cgPSB3cy5nZXRSb3cocisrKTtcclxuICAgICAgY29uc3QgdGl0bGVDZWxsID0gdGl0bGVSb3cuZ2V0Q2VsbCgxKTtcclxuICAgICAgdGl0bGVDZWxsLnZhbHVlID0gc2VjLnRpdGxlO1xyXG4gICAgICB0aXRsZUNlbGwuZm9udCA9IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTIgfTtcclxuICAgICAgdGl0bGVDZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ2xlZnQnLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuXHJcbiAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHdzLmdldFJvdyhyKyspO1xyXG4gICAgICBzZWMuaGVhZGVycy5mb3JFYWNoKChoLCBpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYyA9IGhlYWRlclJvdy5nZXRDZWxsKGkgKyAxKTtcclxuICAgICAgICBjLnZhbHVlID0gaDtcclxuICAgICAgICBjLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgICAgICBjLmFsaWdubWVudCA9IHsgdmVydGljYWw6ICdtaWRkbGUnLCBob3Jpem9udGFsOiAnY2VudGVyJyB9O1xyXG4gICAgICAgIGMuZmlsbCA9IHsgdHlwZTogJ3BhdHRlcm4nLCBwYXR0ZXJuOiAnc29saWQnLCBmZ0NvbG9yOiB7IGFyZ2I6ICdEOUQ5RDknIH0gfTtcclxuICAgICAgICBjLmJvcmRlciA9IHsgdG9wOiB7IHN0eWxlOiAndGhpbicgfSwgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSwgbGVmdDogeyBzdHlsZTogJ3RoaW4nIH0sIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfSB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGRhdGFTdGFydCA9IHI7XHJcblxyXG4gICAgICBzZWMucm93cy5mb3JFYWNoKHJvd0RhdGEgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHdzLmdldFJvdyhyKyspO1xyXG4gICAgICAgIHJvd0RhdGEuZm9yRWFjaCgodiwgaSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYyA9IHJvdy5nZXRDZWxsKGkgKyAxKTtcclxuICAgICAgICAgIGlmIChzZWMuaGVhZGVyc1tpXSA9PT0gJ0Ftb3VudCBJbiBTZXR0bG1lbnQgQ2N5JyB8fCBzZWMuaGVhZGVyc1tpXSA9PT0gJ0Ftb3VudCBJbiBVU0QnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IE51bWJlcih2LnJlcGxhY2UoL1ssIF0rL2csICcnKSkgOiBOdW1iZXIodik7XHJcbiAgICAgICAgICAgIGMudmFsdWUgPSBpc05hTihudW0pID8gKHYgPz8gJycpIDogbnVtO1xyXG4gICAgICAgICAgICBjLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JyB9O1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGMubnVtRm10ID0gJzAuMDAwJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGMudmFsdWUgPSB2ID8/ICcnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYy5ib3JkZXIgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LCByaWdodDogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBjb2wgPSAxOyBjb2wgPD0gc2VjLmhlYWRlcnMubGVuZ3RoOyBjb2wrKykge1xyXG4gICAgICAgIGxldCBtYXggPSAoc2VjLmhlYWRlcnNbY29sIC0gMV0gfHwgJycpLnRvU3RyaW5nKCkubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IHJyID0gZGF0YVN0YXJ0IC0gMTsgcnIgPCByOyBycisrKSB7XHJcbiAgICAgICAgICBjb25zdCB2YWwgPSAod3MuZ2V0Um93KHJyKS5nZXRDZWxsKGNvbCkudmFsdWUgPz8gJycpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICBpZiAodmFsKSBtYXggPSBNYXRoLm1heChtYXgsIHZhbC5sZW5ndGggKyAyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd3MuZ2V0Q29sdW1uKGNvbCkud2lkdGggPSBNYXRoLm1pbihNYXRoLm1heChtYXgsIDgpLCA2MCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgc2VjdGlvbnMuZm9yRWFjaCgoc2VjLCBpZHgpID0+IHtcclxuICAgICAgd3JpdGVTZWN0aW9uKHNlYyk7XHJcbiAgICAgIGlmIChpZHggPCBzZWN0aW9ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgcisrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0b3RhbENvbHMgPSBzZWN0aW9ucy5sZW5ndGhcclxuICAgICAgPyBNYXRoLm1heCguLi5zZWN0aW9ucy5tYXAocyA9PiBzLmhlYWRlcnMubGVuZ3RoKSlcclxuICAgICAgOiB0aGlzLmNvbHVtbkRlZnMubGVuZ3RoO1xyXG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KHRvdGFsQ29scywgNCk7XHJcbiAgICBjb25zdCBsYWJlbENvbHNFbmQgPSAyO1xyXG4gICAgY29uc3Qgc2V0dGxlQ29sID0gMztcclxuICAgIGNvbnN0IHVzZENvbCA9IDQ7XHJcblxyXG4gICAgY29uc3Qgcm93MSA9IHdzLmdldFJvdyhyKyspO1xyXG4gICAgd3MubWVyZ2VDZWxscyhyb3cxLm51bWJlciwgMSwgcm93MS5udW1iZXIsIGxhYmVsQ29sc0VuZCk7XHJcbiAgICByb3cxLmdldENlbGwoMSkudmFsdWUgPSAnQ2xvc2luZyBCYWxhbmNlJztcclxuICAgIHJvdzEuZ2V0Q2VsbCgxKS5mb250ID0geyBib2xkOiB0cnVlIH07XHJcbiAgICByb3cxLmdldENlbGwoMSkuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG5cclxuICAgIGNvbnN0IHNldHRsZVZhbHVlID0gTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudCA/PyAwKTtcclxuICAgIGNvbnN0IHVzZFZhbHVlID0gTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2UgPz8gMCk7XHJcblxyXG4gICAgY29uc3Qgc2V0dGxlQ2VsbCA9IHJvdzEuZ2V0Q2VsbChzZXR0bGVDb2wpO1xyXG4gICAgc2V0dGxlQ2VsbC52YWx1ZSA9IGlzTmFOKHNldHRsZVZhbHVlKSA/ICcnIDogc2V0dGxlVmFsdWU7XHJcbiAgICBzZXR0bGVDZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JyB9O1xyXG4gICAgaWYgKCFpc05hTihzZXR0bGVWYWx1ZSkpIHNldHRsZUNlbGwubnVtRm10ID0gJzAuMDAwJztcclxuXHJcbiAgICBjb25zdCB1c2RDZWxsID0gcm93MS5nZXRDZWxsKHVzZENvbCk7XHJcbiAgICB1c2RDZWxsLnZhbHVlID0gaXNOYU4odXNkVmFsdWUpID8gJycgOiB1c2RWYWx1ZTtcclxuICAgIHVzZENlbGwuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAncmlnaHQnIH07XHJcbiAgICBpZiAoIWlzTmFOKHVzZFZhbHVlKSkgdXNkQ2VsbC5udW1GbXQgPSAnMC4wMDAnO1xyXG5cclxuICAgIGZvciAobGV0IGMgPSAxOyBjIDw9IGNvbHM7IGMrKykge1xyXG4gICAgICByb3cxLmdldENlbGwoYykuYm9yZGVyID0ge1xyXG4gICAgICAgIHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICByaWdodDogeyBzdHlsZTogJ3RoaW4nIH1cclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByb3cyID0gd3MuZ2V0Um93KHIrKyk7XHJcbiAgICB3cy5tZXJnZUNlbGxzKHJvdzIubnVtYmVyLCAxLCByb3cyLm51bWJlciwgY29scyk7XHJcbiAgICByb3cyLmdldENlbGwoMSkudmFsdWUgPSBgJHt0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Q3VycmVuY3kgfHwgJyd9IC0gJHt0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3JkcyB8fCAnJ31gO1xyXG4gICAgcm93Mi5nZXRDZWxsKDEpLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ2xlZnQnLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgIHJvdzIuZ2V0Q2VsbCgxKS5mb250ID0geyBpdGFsaWM6IGZhbHNlIH07XHJcblxyXG4gICAgZm9yIChsZXQgYyA9IDE7IGMgPD0gY29sczsgYysrKSB7XHJcbiAgICAgIGNvbnN0IGVkZ2U6IGFueSA9IHsgdG9wOiB7IHN0eWxlOiAndGhpbicgfSwgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSB9O1xyXG4gICAgICBpZiAoYyA9PT0gMSkgZWRnZS5sZWZ0ID0geyBzdHlsZTogJ3RoaW4nIH07XHJcbiAgICAgIGlmIChjID09PSBjb2xzKSBlZGdlLnJpZ2h0ID0geyBzdHlsZTogJ3RoaW4nIH07XHJcbiAgICAgIHJvdzIuZ2V0Q2VsbChjKS5ib3JkZXIgPSBlZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvdzMgPSB3cy5nZXRSb3cocisrKTtcclxuICAgIHdzLm1lcmdlQ2VsbHMocm93My5udW1iZXIsIDEsIHJvdzMubnVtYmVyLCBjb2xzKTtcclxuICAgIHJvdzMuZ2V0Q2VsbCgxKS52YWx1ZSA9IGAke3RoaXMuY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VVU0RJbldvcmRzIHx8ICcnfWA7XHJcbiAgICByb3czLmdldENlbGwoMSkuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG5cclxuICAgIGZvciAobGV0IGMgPSAxOyBjIDw9IGNvbHM7IGMrKykge1xyXG4gICAgICBjb25zdCBlZGdlOiBhbnkgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgICAgaWYgKGMgPT09IDEpIGVkZ2UubGVmdCA9IHsgc3R5bGU6ICd0aGluJyB9O1xyXG4gICAgICBpZiAoYyA9PT0gY29scykgZWRnZS5yaWdodCA9IHsgc3R5bGU6ICd0aGluJyB9O1xyXG4gICAgICByb3czLmdldENlbGwoYykuYm9yZGVyID0gZWRnZTtcclxuICAgIH1cclxuXHJcbiAgICB3Yi54bHN4LndyaXRlQnVmZmVyKCkudGhlbihidWYgPT4ge1xyXG4gICAgICBGaWxlU2F2ZXIuc2F2ZUFzKFxyXG4gICAgICAgIG5ldyBCbG9iKFtidWZdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcgfSksXHJcbiAgICAgICAgJ1N0YXRlbWVudF9vZl9BY2NvdW50cy54bHN4J1xyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnRUb0NTVigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlY3Rpb25zID0gdGhpcy5nZXRWaXNpYmxlR3JpZHMoKVxyXG4gICAgICAubWFwKHMgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERpc3BsYXllZERhdGEocy5hcGkpO1xyXG4gICAgICAgIGxldCByb3dzID0gdGhpcy5idWlsZFJvd3MoZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChzLnRpdGxlID09PSAnU2VuZCBEZXRhaWxzJyAmJiB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocy50aXRsZSA9PT0gJ1JlY2VpdmUgRGV0YWlscycgJiYgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHJvd3MgPSByb3dzLmNvbmNhdCh0aGlzLmJ1aWxkUm93cyh0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByb3dzLmxlbmd0aCA/IHsgdGl0bGU6IHMudGl0bGUsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLCByb3dzIH0gOiBudWxsO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHsgdGl0bGU6IHN0cmluZzsgaGVhZGVyczogc3RyaW5nW107IHJvd3M6IGFueVtdW10gfVtdO1xyXG5cclxuICAgIGlmICghc2VjdGlvbnMubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsaW5lcy5wdXNoKHRoaXMuUmVwb3J0TmFtZSk7XHJcblxyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5tZXRhRGF0YU9uZSB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiBsaW5lcy5wdXNoKGAke2t9OiAke3YgPz8gJyd9YCkpO1xyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5tZXRhRGF0YVR3byB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiBsaW5lcy5wdXNoKGAke2t9OiAke3YgPz8gJyd9YCkpO1xyXG5cclxuICAgIC8vIC0tLSBTRUFSQ0ggQ1JJVEVSSUEgQkxPQ0sgLS0tXHJcbiAgICBjb25zdCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gdGhpcy5zZWFyY2hDcml0ZXJpYSB8fCBbXTtcclxuXHJcbiAgICBpZiAoc2VhcmNoQ3JpdGVyaWE/Lmxlbmd0aCkge1xyXG4gICAgICBsaW5lcy5wdXNoKCcnKTtcclxuICAgICAgbGluZXMucHVzaCgnU2VhcmNoIENyaXRlcmlhOi0nKTtcclxuXHJcbiAgICAgIC8vIERldGVybWluZSBtYXggbGVuZ3RoIG9mIGxlZnQgY29sdW1uIGZvciBwYWRkaW5nXHJcbiAgICAgIGNvbnN0IG1heExlZnRMZW5ndGggPSBNYXRoLm1heCguLi5zZWFyY2hDcml0ZXJpYS5tYXAoKFtrLCB2XSkgPT4gKGsgKyAnICcgKyB2KS5sZW5ndGgpKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoQ3JpdGVyaWEubGVuZ3RoOyBpICs9IDIpIHtcclxuICAgICAgICBjb25zdCBsZWZ0ID0gc2VhcmNoQ3JpdGVyaWFbaV07XHJcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07XHJcblxyXG4gICAgICAgIGNvbnN0IGxlZnRUZXh0ID0gbGVmdCA/IGAke2xlZnRbMF19ICR7bGVmdFsxXX1gLnBhZEVuZChtYXhMZWZ0TGVuZ3RoICsgNSwgJyAnKSA6ICcnO1xyXG4gICAgICAgIGNvbnN0IHJpZ2h0VGV4dCA9IHJpZ2h0ID8gYCR7cmlnaHRbMF19ICR7cmlnaHRbMV19YCA6ICcnO1xyXG5cclxuICAgICAgICAvLyBFYWNoIHBhaXIgc3RheXMgaW4gaXRzIG93biBjb2x1bW5cclxuICAgICAgICBsaW5lcy5wdXNoKGBcIiR7bGVmdFRleHR9JHtyaWdodFRleHR9XCJgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGluZXMucHVzaCgnJyk7IC8vIGJsYW5rIGxpbmUgYWZ0ZXIgc2VhcmNoIGNyaXRlcmlhXHJcbiAgICB9XHJcblxyXG4gICAgc2VjdGlvbnMuZm9yRWFjaCgoc2VjLCBpZHgpID0+IHtcclxuICAgICAgbGluZXMucHVzaChzZWMudGl0bGUpO1xyXG4gICAgICBsaW5lcy5wdXNoKHNlYy5oZWFkZXJzLmpvaW4oJywnKSk7XHJcbiAgICAgIHNlYy5yb3dzLmZvckVhY2gociA9PiBsaW5lcy5wdXNoKHIubWFwKHYgPT4gYFwiJHt2ID8/ICcnfVwiYCkuam9pbignLCcpKSk7XHJcblxyXG4gICAgICBpZiAoaWR4IDwgc2VjdGlvbnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBsaW5lcy5wdXNoKFxyXG4gICAgICBgXCJDbG9zaW5nIEJhbGFuY2VcIiwsXCIke051bWJlcih0aGlzLmNsb3NpbmdCYWxhbmNlSW5TZXR0bG1lbnQgfHwgMCkudG9GaXhlZCgzKX1cIixcIiR7TnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2UgfHwgMCkudG9GaXhlZCgzKX1cImBcclxuICAgICk7XHJcblxyXG4gICAgbGluZXMucHVzaChgXCIke3RoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRJbldvcmRzIHx8ICcnfVwiYCk7XHJcblxyXG4gICAgbGluZXMucHVzaChgXCIke3RoaXMuY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VVU0RJbldvcmRzIHx8ICcnfVwiYCk7XHJcblxyXG4gICAgY29uc3QgY3N2ID0gbGluZXMuam9pbignXFxuJyk7XHJcbiAgICBGaWxlU2F2ZXIuc2F2ZUFzKFxyXG4gICAgICBuZXcgQmxvYihbY3N2XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtOCcgfSksXHJcbiAgICAgICdTdGF0ZW1lbnRfb2ZfQWNjb3VudHMuY3N2J1xyXG4gICAgKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGxvYWRJbWFnZUFzQmFzZTY0KHNyYzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcclxuICAgICAgaW1nLnNyYyA9IHNyYztcclxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgaWYgKCFjdHgpIHJldHVybiByZWplY3QoJ0NhbnZhcyBjb250ZXh0IGZhaWxlZCcpO1xyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcclxuICAgICAgICByZXNvbHZlKGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpKTtcclxuICAgICAgfTtcclxuICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoJ0ZhaWxlZCB0byBsb2FkIGltYWdlOiAnICsgc3JjKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5ZWREYXRhKGFwaT86IEdyaWRBcGkpOiBhbnlbXSB7XHJcbiAgICBpZiAoIWFwaSkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3Qgcm93czogYW55W10gPSBbXTtcclxuICAgIGNvbnN0IGNvdW50ID0gYXBpLmdldERpc3BsYXllZFJvd0NvdW50KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgY29uc3Qgbm9kZSA9IGFwaS5nZXREaXNwbGF5ZWRSb3dBdEluZGV4KGkpO1xyXG4gICAgICBpZiAobm9kZSAmJiAhbm9kZS5ncm91cCAmJiAhbm9kZS5yb3dQaW5uZWQpIHJvd3MucHVzaChub2RlLmRhdGEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvd3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEhlYWRlcnMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uRGVmcy5tYXAoYyA9PiBjLmhlYWRlck5hbWUgfHwgYy5maWVsZCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZm9ybWF0MyhuOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKG4gPT0gbnVsbCB8fCBuID09PSAnJykgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgbnVtID0gTnVtYmVyKG4pO1xyXG4gICAgcmV0dXJuIG51bS50b0ZpeGVkKDMpO1xyXG4gIH1cclxuICBwcml2YXRlIGJ1aWxkUm93cyhkYXRhOiBhbnlbXSk6IGFueVtdW10ge1xyXG4gICAgcmV0dXJuIGRhdGEubWFwKHJvdyA9PlxyXG4gICAgICB0aGlzLmNvbHVtbkRlZnMubWFwKGNvbCA9PiB7XHJcbiAgICAgICAgY29uc3QgZiA9IGNvbC5maWVsZDtcclxuICAgICAgICBpZiAoZiA9PT0gJ2Ftb3VudEluU2V0dGxtZW50Q2N5JyB8fCBmID09PSAnYW1vdW50SW5VU0QnKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQzKHJvd1tmXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByb3dbZl0gPz8gJyc7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWaXNpYmxlR3JpZHMoKTogeyB0aXRsZTogc3RyaW5nOyBhcGk/OiBHcmlkQXBpIH1bXSB7XHJcbiAgICBjb25zdCBvdXQ6IHsgdGl0bGU6IHN0cmluZzsgYXBpPzogR3JpZEFwaSB9W10gPSBbXTtcclxuICAgIG91dC5wdXNoKHsgdGl0bGU6ICcnLCBhcGk6IHRoaXMub3BlbmluZ0dyaWRBcGkgfSk7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENsaWVudFR5cGUgPT09ICdQYXlJbicgfHwgdGhpcy5zZWxlY3RlZENsaWVudFR5cGUgPT09ICdCb3RoJykge1xyXG4gICAgICBvdXQucHVzaCh7IHRpdGxlOiAnU2VuZCBEZXRhaWxzJywgYXBpOiB0aGlzLnNlbmRHcmlkQXBpIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDbGllbnRUeXBlID09PSAnUGF5T3V0JyB8fCB0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gJ0JvdGgnKSB7XHJcbiAgICAgIG91dC5wdXNoKHsgdGl0bGU6ICdSZWNlaXZlIERldGFpbHMnLCBhcGk6IHRoaXMucmVjZWl2ZUdyaWRBcGkgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0O1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRm9ybVZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNGb3JtVmFsaWQgPSBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGxpYi1zZWFyY2gtZmlsdGVyIFxyXG4gIFtSZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiBcclxuICAoc2VhcmNoQ2xpY2tlZCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiXHJcbiAgKGZvcm1WYWxpZCk9XCJoYW5kbGVGb3JtVmFsaWQoJGV2ZW50KVwiXHJcbiAgPlxyXG48L2xpYi1zZWFyY2gtZmlsdGVyPlxyXG5cclxuPGFwcC1sb2FkZXIgKm5nSWY9XCJsb2FkaW5nU3RhdGUgPT09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nXCI+PC9hcHAtbG9hZGVyPlxyXG48c3BhbiAqbmdJZj1cImxvYWRpbmdTdGF0ZSA9PT0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkVycm9yXCI+e3sgZXJyb3JNZXNzYWdlIH19PC9zcGFuPlxyXG48ZGl2ICpuZ0lmPVwic2hvd1RhYmxlcyAmJiBpc0Zvcm1WYWxpZFwiPlxyXG48bGliLW1ldGFkYXRhIFxyXG4gICAgW3JlcG9ydE5hbWVdPVwiUmVwb3J0TmFtZVwiIFxyXG4gICAgW3Nob3dtZXRhRGF0YU9uZV09XCJ0cnVlXCIgXHJcbiAgICBbc2hvd21ldGFEYXRhVHdvXT1cInRydWVcIiBcclxuICAgIFttZXRhRGF0YU9uZV09XCJtZXRhRGF0YU9uZVwiXHJcbiAgICBbbWV0YURhdGFUd29dPVwibWV0YURhdGFUd29cIiBcclxuICAgIChleHBvcnRFdmVudCk9XCJoYW5kbGVFeHBvcnQoJGV2ZW50KVwiIFxyXG4gICAgKHNlYXJjaEV2ZW50KT1cImZpbHRlcigkZXZlbnQpXCI+XHJcbiAgPC9saWItbWV0YWRhdGE+XHJcblxyXG48YWctZ3JpZC1hbmd1bGFyXHJcbiAgY2xhc3M9XCJhZy10aGVtZS1hbHBpbmUgdHJhbnNhY3Rpb24tZ3JpZFwiXHJcbiAgW3Jvd0RhdGFdPVwib3BlbmluZ0JhbEFuZEZ1bmRpbmdcIlxyXG4gIFtjb2x1bW5EZWZzXT1cImNvbHVtbkRlZnNcIlxyXG4gIFtwaW5uZWRCb3R0b21Sb3dEYXRhXT1cIltdXCJcclxuICBbaGVhZGVySGVpZ2h0XT1cIjMyXCIgXHJcbiAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiXHJcbiAgW3Jvd0hlaWdodF09XCIyOFwiXHJcbiAgKGdyaWRSZWFkeSk9XCJvbk9wZW5pbmdHcmlkUmVhZHkoJGV2ZW50KVwiXHJcbiAgc3R5bGU9XCJ3aWR0aDogODAlOyBoZWlnaHQ6IDkxcHg7IG1hcmdpbjogMCBhdXRvOyBkaXNwbGF5OiBibG9jaztcIj5cclxuPC9hZy1ncmlkLWFuZ3VsYXI+XHJcblxyXG48ZGl2ICpuZ0lmPVwiKHNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gJ1BheUluJyB8fCBzZWxlY3RlZENsaWVudFR5cGUgPT09ICdCb3RoJylcIj5cclxuPGgzIGNsYXNzPVwiZGV0YWlscy10YWJsZVwiPjxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDNweDtcIj5TZW5kIERldGFpbHM8L3NwYW4+PC9oMz5cclxuPGFnLWdyaWQtYW5ndWxhclxyXG4gIGNsYXNzPVwiYWctdGhlbWUtYWxwaW5lIHRyYW5zYWN0aW9uLWdyaWRcIlxyXG4gIFtyb3dEYXRhXT1cInNlbmREZXRhaWxzXCJcclxuICBbY29sdW1uRGVmc109XCJjb2x1bW5EZWZzXCJcclxuICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCJcclxuICBbcm93SGVpZ2h0XT1cIjI4XCJcclxuICBbaGVhZGVySGVpZ2h0XT1cIjMyXCIgXHJcbiAgW3Bpbm5lZEJvdHRvbVJvd0RhdGFdPVwic2VuZFBpbm5lZEJvdHRvbVJvd1wiXHJcbiAgKGdyaWRSZWFkeSk9XCJvblNlbmRHcmlkUmVhZHkoJGV2ZW50KVwiIFxyXG4gIHN0eWxlPVwid2lkdGg6IDgwJTsgaGVpZ2h0OiAyMDRweDsgbWFyZ2luOiAwIGF1dG87IGRpc3BsYXk6IGJsb2NrO1wiPlxyXG48L2FnLWdyaWQtYW5ndWxhcj5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiKHNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gJ1BheU91dCcgfHwgc2VsZWN0ZWRDbGllbnRUeXBlID09PSAnQm90aCcpXCI+XHJcbjxoMyBjbGFzcz1cImRldGFpbHMtdGFibGVcIj48c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAzcHg7XCI+UmVjZWl2ZSBEZXRhaWxzPC9zcGFuPjwvaDM+XHJcbjxhZy1ncmlkLWFuZ3VsYXJcclxuICBjbGFzcz1cImFnLXRoZW1lLWFscGluZSB0cmFuc2FjdGlvbi1ncmlkXCJcclxuICBbcm93RGF0YV09XCJyZWNlaXZlRGV0YWlsc1wiXHJcbiAgW2NvbHVtbkRlZnNdPVwiY29sdW1uRGVmc1wiXHJcbiAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiXHJcbiAgW3Jvd0hlaWdodF09XCIyOFwiXHJcbiAgW2hlYWRlckhlaWdodF09XCIzMlwiIFxyXG4gIFtwaW5uZWRCb3R0b21Sb3dEYXRhXT1cInJlY2VpdmVQaW5uZWRCb3R0b21Sb3dcIlxyXG4gIChncmlkUmVhZHkpPVwib25SZWNlaXZlR3JpZFJlYWR5KCRldmVudClcIiBcclxuICBzdHlsZT1cIndpZHRoOiA4MCU7IGhlaWdodDogMjA0cHg7IG1hcmdpbjogMCBhdXRvOyBkaXNwbGF5OiBibG9jaztcIj5cclxuPC9hZy1ncmlkLWFuZ3VsYXI+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjwhLS0gQ2xvc2luZyBiYWxhbmNlIHJvdyAtLT5cclxuPGRpdiBjbGFzcz1cImNsb3NpbmctYmFsYW5jZS1yb3dcIj5cclxuICA8ZGl2IGNsYXNzPVwibGFiZWxcIiB0aXRsZT1cIkNsb3NpbmcgQmFsYW5jZVwiPlxyXG4gICAgQ2xvc2luZyBCYWxhbmNlXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJzZXR0bGVtZW50XCIgXHJcbiAgICAgICBbdGl0bGVdPVwiY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRGb3JtYXR0ZWRcIj5cclxuICAgIHt7IGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Rm9ybWF0dGVkIH19XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiIFt0aXRsZV09XCJjbG9zaW5nQmFsYW5jZUluVXNkRm9ybWF0dGVkXCI+XHJcbiAgICB7eyBjbG9zaW5nQmFsYW5jZUluVXNkRm9ybWF0dGVkIH19XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjwhLS0gc2V0dGxlbWVudCBjdXJyZW5jeSB3b3JkcyByb3cgLS0+XHJcbjxkaXYgY2xhc3M9XCJjbG9zaW5nLWJhbGFuY2Utcm93IGNsb3NpbmctYmFsYW5jZS13b3Jkc1wiXHJcbiAgICAgKm5nSWY9XCJjbG9zaW5nQmFsYW5jZVNldHRsbWVudEluV29yZHNcIj5cclxuICA8ZGl2IGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgW3RpdGxlXT1cImNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Q3VycmVuY3kgKyAnIC0gJyArIGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3Jkc1wiPlxyXG4gICAge3sgY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRDdXJyZW5jeSB9fSAtIHt7IGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3JkcyB9fVxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gZXhpc3RpbmcgVVNEIHdvcmRzIHJvdyAoa2VlcCBhcy1pcykgLS0+XHJcbjxkaXYgY2xhc3M9XCJjbG9zaW5nLWJhbGFuY2Utcm93IGNsb3NpbmctYmFsYW5jZS13b3Jkc1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJsYWJlbFwiIFt0aXRsZV09XCJjbG9zaW5nQmFsYW5jZUN1cnJlbmN5ICsgJyAtICcgKyBjbG9zaW5nQmFsYW5jZVVTREluV29yZHNcIj5cclxuICAgIHt7IGNsb3NpbmdCYWxhbmNlQ3VycmVuY3kgfX0gLSB7eyBjbG9zaW5nQmFsYW5jZVVTREluV29yZHMgfX1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==