@hmcts/ccpay-web-component 6.5.14-rc1 → 6.5.15-beta1

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 (179) hide show
  1. package/esm2022/hmcts-ccpay-web-component.mjs +5 -0
  2. package/esm2022/lib/components/add-remission/add-remission.component.mjs +1276 -0
  3. package/esm2022/lib/components/allocate-payments/allocate-payments.component.mjs +423 -0
  4. package/esm2022/lib/components/card-details/card-details.component.mjs +32 -0
  5. package/esm2022/lib/components/case-transactions/case-transactions.component.mjs +885 -0
  6. package/esm2022/lib/components/contact-details/contact-details.component.mjs +338 -0
  7. package/esm2022/lib/components/error-banner/error-banner.component.mjs +18 -0
  8. package/esm2022/lib/components/fee-summary/fee-summary.component.mjs +280 -0
  9. package/esm2022/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.mjs +195 -0
  10. package/esm2022/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.mjs +275 -0
  11. package/esm2022/lib/components/notification-preview/notification-preview.component.mjs +79 -0
  12. package/esm2022/lib/components/page-not-found.component.mjs +17 -0
  13. package/esm2022/lib/components/payment-list/payment-list.component.mjs +36 -0
  14. package/esm2022/lib/components/payment-view/payment-view.component.mjs +467 -0
  15. package/esm2022/lib/components/pba-details/pba-details.component.mjs +18 -0
  16. package/esm2022/lib/components/pba-payment/pba-payment.component.mjs +163 -0
  17. package/esm2022/lib/components/process-refund/process-refund.component.mjs +417 -0
  18. package/esm2022/lib/components/processed-payments/processed-payments.component.mjs +37 -0
  19. package/esm2022/lib/components/refund-list/refund-list.component.mjs +73 -0
  20. package/esm2022/lib/components/refund-status/refund-status.component.mjs +481 -0
  21. package/esm2022/lib/components/reports/reports.component.mjs +337 -0
  22. package/esm2022/lib/components/service-request/service-request.component.mjs +516 -0
  23. package/esm2022/lib/components/status-history/status-history.component.mjs +33 -0
  24. package/esm2022/lib/components/table/table.component.mjs +127 -0
  25. package/esm2022/lib/components/unprocessed-payments/unprocessed-payments.component.mjs +236 -0
  26. package/esm2022/lib/interfaces/AddRemissionRequest.mjs +17 -0
  27. package/esm2022/lib/interfaces/AddRetroRemissionRequest.mjs +9 -0
  28. package/esm2022/lib/interfaces/AllocatePaymentRequest.mjs +41 -0
  29. package/esm2022/lib/interfaces/IAllocationPaymentsRequest.mjs +20 -0
  30. package/esm2022/lib/interfaces/IBSPayments.mjs +2 -0
  31. package/esm2022/lib/interfaces/ICardDetails.mjs +2 -0
  32. package/esm2022/lib/interfaces/IFee.mjs +2 -0
  33. package/esm2022/lib/interfaces/INotificationPreview.mjs +2 -0
  34. package/esm2022/lib/interfaces/IOrderReferenceFee.mjs +2 -0
  35. package/esm2022/lib/interfaces/IPatchRefundAction.mjs +2 -0
  36. package/esm2022/lib/interfaces/IPayment.mjs +2 -0
  37. package/esm2022/lib/interfaces/IPaymentFailure.mjs +2 -0
  38. package/esm2022/lib/interfaces/IPaymentGroup.mjs +2 -0
  39. package/esm2022/lib/interfaces/IPaymentStatus.mjs +12 -0
  40. package/esm2022/lib/interfaces/IPaymentView.mjs +2 -0
  41. package/esm2022/lib/interfaces/IPayments.mjs +2 -0
  42. package/esm2022/lib/interfaces/IPutNotificationRequest.mjs +13 -0
  43. package/esm2022/lib/interfaces/IRefundAction.mjs +2 -0
  44. package/esm2022/lib/interfaces/IRefundContactDetails.mjs +2 -0
  45. package/esm2022/lib/interfaces/IRefundFee.mjs +2 -0
  46. package/esm2022/lib/interfaces/IRefundList.mjs +2 -0
  47. package/esm2022/lib/interfaces/IRefundReasons.mjs +2 -0
  48. package/esm2022/lib/interfaces/IRefundRejectReason.mjs +2 -0
  49. package/esm2022/lib/interfaces/IRefundStatus.mjs +2 -0
  50. package/esm2022/lib/interfaces/IRefundStatusHistory.mjs +2 -0
  51. package/esm2022/lib/interfaces/IRefundsNotifications.mjs +2 -0
  52. package/esm2022/lib/interfaces/IRemission.mjs +2 -0
  53. package/esm2022/lib/interfaces/IResubmitRefundRequest.mjs +13 -0
  54. package/esm2022/lib/interfaces/IStatusHistories.mjs +2 -0
  55. package/esm2022/lib/interfaces/IStatusHistory.mjs +2 -0
  56. package/esm2022/lib/interfaces/IserviceRequestCardPayment.mjs +11 -0
  57. package/esm2022/lib/interfaces/IserviceRequestPbaPayment.mjs +15 -0
  58. package/esm2022/lib/interfaces/IssueRefundRequest.mjs +11 -0
  59. package/esm2022/lib/interfaces/NotificationPreviewRequest.mjs +46 -0
  60. package/esm2022/lib/interfaces/PayhubAntennaRequest.mjs +14 -0
  61. package/esm2022/lib/interfaces/PaymentToPayhubRequest.mjs +17 -0
  62. package/esm2022/lib/interfaces/PostIssueRefundRetroRemission.mjs +9 -0
  63. package/esm2022/lib/interfaces/PostRefundRetroRemission.mjs +18 -0
  64. package/esm2022/lib/interfaces/RefundsRequest.mjs +9 -0
  65. package/esm2022/lib/interfaces/UnidentifiedPaymentsRequest.mjs +16 -0
  66. package/esm2022/lib/interfaces/UnsolicitedPaymentsRequest.mjs +22 -0
  67. package/esm2022/lib/payment-lib.component.mjs +430 -0
  68. package/esm2022/lib/payment-lib.module.mjs +181 -0
  69. package/esm2022/lib/payment-lib.service.mjs +49 -0
  70. package/esm2022/lib/pipes/capitalize.pipe.mjs +18 -0
  71. package/esm2022/lib/pipes/ccd-hyphens.pipe.mjs +22 -0
  72. package/esm2022/lib/pipes/key-value.pipe.mjs +23 -0
  73. package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
  74. package/esm2022/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.mjs +87 -0
  75. package/esm2022/lib/services/card-details/card-details.service.mjs +39 -0
  76. package/esm2022/lib/services/case-transactions/case-transactions.service.mjs +39 -0
  77. package/esm2022/lib/services/notification/notification.service.mjs +70 -0
  78. package/esm2022/lib/services/orderslist.service.mjs +154 -0
  79. package/esm2022/lib/services/payment-list/payment-list.service.mjs +40 -0
  80. package/esm2022/lib/services/payment-view/payment-view.service.mjs +156 -0
  81. package/esm2022/lib/services/refunds/refunds.service.mjs +120 -0
  82. package/esm2022/lib/services/shared/error-handler.service.mjs +76 -0
  83. package/esm2022/lib/services/shared/httpclient/webcomponent.http.client.mjs +64 -0
  84. package/esm2022/lib/services/shared/logger/console-logger.service.mjs +43 -0
  85. package/esm2022/lib/services/shared/logger/logger.service.mjs +23 -0
  86. package/esm2022/lib/services/status-history/status-history.service.mjs +41 -0
  87. package/esm2022/lib/services/xl-file/xl-file.service.mjs +197 -0
  88. package/esm2022/public_api.mjs +7 -0
  89. package/fesm2022/hmcts-ccpay-web-component.mjs +217 -262
  90. package/fesm2022/hmcts-ccpay-web-component.mjs.map +1 -1
  91. package/index.d.ts +5 -2340
  92. package/lib/components/add-remission/add-remission.component.d.ts +208 -0
  93. package/lib/components/allocate-payments/allocate-payments.component.d.ts +115 -0
  94. package/lib/components/card-details/card-details.component.d.ts +18 -0
  95. package/lib/components/case-transactions/case-transactions.component.d.ts +143 -0
  96. package/lib/components/contact-details/contact-details.component.d.ts +54 -0
  97. package/lib/components/error-banner/error-banner.component.d.ts +9 -0
  98. package/lib/components/fee-summary/fee-summary.component.d.ts +72 -0
  99. package/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.d.ts +52 -0
  100. package/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.d.ts +63 -0
  101. package/lib/components/notification-preview/notification-preview.component.d.ts +30 -0
  102. package/lib/components/page-not-found.component.d.ts +5 -0
  103. package/lib/components/payment-list/payment-list.component.d.ts +19 -0
  104. package/lib/components/payment-view/payment-view.component.d.ts +110 -0
  105. package/lib/components/pba-details/pba-details.component.d.ts +10 -0
  106. package/lib/components/pba-payment/pba-payment.component.d.ts +41 -0
  107. package/lib/components/process-refund/process-refund.component.d.ts +82 -0
  108. package/lib/components/processed-payments/processed-payments.component.d.ts +17 -0
  109. package/lib/components/refund-list/refund-list.component.d.ts +26 -0
  110. package/lib/components/refund-status/refund-status.component.d.ts +119 -0
  111. package/lib/components/reports/reports.component.d.ts +49 -0
  112. package/lib/components/service-request/service-request.component.d.ts +141 -0
  113. package/lib/components/status-history/status-history.component.d.ts +19 -0
  114. package/lib/components/table/table.component.d.ts +45 -0
  115. package/lib/components/unprocessed-payments/unprocessed-payments.component.d.ts +61 -0
  116. package/lib/interfaces/AddRemissionRequest.d.ts +11 -0
  117. package/lib/interfaces/AddRetroRemissionRequest.d.ts +5 -0
  118. package/lib/interfaces/AllocatePaymentRequest.d.ts +31 -0
  119. package/lib/interfaces/IAllocationPaymentsRequest.d.ts +9 -0
  120. package/lib/interfaces/IBSPayments.d.ts +19 -0
  121. package/lib/interfaces/ICardDetails.d.ts +7 -0
  122. package/lib/interfaces/IFee.d.ts +29 -0
  123. package/lib/interfaces/INotificationPreview.d.ts +27 -0
  124. package/lib/interfaces/IOrderReferenceFee.d.ts +9 -0
  125. package/lib/interfaces/IPatchRefundAction.d.ts +4 -0
  126. package/lib/interfaces/IPayment.d.ts +35 -0
  127. package/lib/interfaces/IPaymentFailure.d.ts +13 -0
  128. package/lib/interfaces/IPaymentGroup.d.ts +11 -0
  129. package/lib/interfaces/IPaymentStatus.d.ts +11 -0
  130. package/lib/interfaces/IPaymentView.d.ts +5 -0
  131. package/lib/interfaces/IPayments.d.ts +4 -0
  132. package/lib/interfaces/IPutNotificationRequest.d.ts +6 -0
  133. package/lib/interfaces/IRefundAction.d.ts +4 -0
  134. package/lib/interfaces/IRefundContactDetails.d.ts +9 -0
  135. package/lib/interfaces/IRefundFee.d.ts +7 -0
  136. package/lib/interfaces/IRefundList.d.ts +20 -0
  137. package/lib/interfaces/IRefundReasons.d.ts +6 -0
  138. package/lib/interfaces/IRefundRejectReason.d.ts +4 -0
  139. package/lib/interfaces/IRefundStatus.d.ts +8 -0
  140. package/lib/interfaces/IRefundStatusHistory.d.ts +5 -0
  141. package/lib/interfaces/IRefundsNotifications.d.ts +16 -0
  142. package/lib/interfaces/IRemission.d.ts +14 -0
  143. package/lib/interfaces/IResubmitRefundRequest.d.ts +9 -0
  144. package/lib/interfaces/IStatusHistories.d.ts +7 -0
  145. package/lib/interfaces/IStatusHistory.d.ts +7 -0
  146. package/lib/interfaces/IserviceRequestCardPayment.d.ts +6 -0
  147. package/lib/interfaces/IserviceRequestPbaPayment.d.ts +8 -0
  148. package/lib/interfaces/IssueRefundRequest.d.ts +6 -0
  149. package/lib/interfaces/NotificationPreviewRequest.d.ts +25 -0
  150. package/lib/interfaces/PayhubAntennaRequest.d.ts +8 -0
  151. package/lib/interfaces/PaymentToPayhubRequest.d.ts +11 -0
  152. package/lib/interfaces/PostIssueRefundRetroRemission.d.ts +6 -0
  153. package/lib/interfaces/PostRefundRetroRemission.d.ts +11 -0
  154. package/lib/interfaces/RefundsRequest.d.ts +5 -0
  155. package/lib/interfaces/UnidentifiedPaymentsRequest.d.ts +7 -0
  156. package/lib/interfaces/UnsolicitedPaymentsRequest.d.ts +10 -0
  157. package/lib/payment-lib.component.d.ts +156 -0
  158. package/lib/payment-lib.module.d.ts +42 -0
  159. package/lib/payment-lib.service.d.ts +21 -0
  160. package/lib/pipes/capitalize.pipe.d.ts +8 -0
  161. package/lib/pipes/ccd-hyphens.pipe.d.ts +8 -0
  162. package/lib/pipes/key-value.pipe.d.ts +8 -0
  163. package/lib/pipes/sanitize-html.pipe.d.ts +10 -0
  164. package/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.d.ts +27 -0
  165. package/lib/services/card-details/card-details.service.d.ts +17 -0
  166. package/lib/services/case-transactions/case-transactions.service.d.ts +17 -0
  167. package/lib/services/notification/notification.service.d.ts +21 -0
  168. package/lib/services/orderslist.service.d.ts +77 -0
  169. package/lib/services/payment-list/payment-list.service.d.ts +18 -0
  170. package/lib/services/payment-view/payment-view.service.d.ts +61 -0
  171. package/lib/services/refunds/refunds.service.d.ts +36 -0
  172. package/lib/services/shared/error-handler.service.d.ts +14 -0
  173. package/lib/services/shared/httpclient/webcomponent.http.client.d.ts +17 -0
  174. package/lib/services/shared/logger/console-logger.service.d.ts +11 -0
  175. package/lib/services/shared/logger/logger.service.d.ts +14 -0
  176. package/lib/services/status-history/status-history.service.d.ts +17 -0
  177. package/lib/services/xl-file/xl-file.service.d.ts +16 -0
  178. package/package.json +5 -3
  179. package/public_api.d.ts +3 -0
@@ -0,0 +1,430 @@
1
+ import { ChangeDetectorRef, Component, forwardRef, Input } from '@angular/core';
2
+ import { PaymentLibService } from './payment-lib.service';
3
+ import { OrderslistService } from './services/orderslist.service';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./payment-lib.service";
6
+ import * as i2 from "./services/orderslist.service";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "./components/payment-view/payment-view.component";
9
+ import * as i5 from "./components/case-transactions/case-transactions.component";
10
+ import * as i6 from "./components/refund-status/refund-status.component";
11
+ import * as i7 from "./components/pba-payment/pba-payment.component";
12
+ import * as i8 from "./components/payment-list/payment-list.component";
13
+ import * as i9 from "./components/process-refund/process-refund.component";
14
+ import * as i10 from "./components/refund-list/refund-list.component";
15
+ import * as i11 from "./components/mark-unidentified-payment/mark-unidentified-payment.component";
16
+ import * as i12 from "./components/mark-unsolicited-payment/mark-unsolicited-payment.component";
17
+ import * as i13 from "./components/allocate-payments/allocate-payments.component";
18
+ import * as i14 from "./components/fee-summary/fee-summary.component";
19
+ import * as i15 from "./components/reports/reports.component";
20
+ export class PaymentLibComponent {
21
+ paymentLibService;
22
+ cd;
23
+ OrderslistService;
24
+ API_ROOT;
25
+ BULKSCAN_API_ROOT;
26
+ REFUNDS_API_ROOT;
27
+ NOTIFICATION_API_ROOT;
28
+ CARDPAYMENTRETURNURL;
29
+ CCD_CASE_NUMBER;
30
+ EXC_REFERENCE;
31
+ PAYMENT_METHOD;
32
+ VIEW;
33
+ VIEWSERVICE;
34
+ PAYMENT_GROUP_REF;
35
+ TAKEPAYMENT;
36
+ SERVICEREQUEST;
37
+ DCN_NUMBER;
38
+ SELECTED_OPTION;
39
+ ISBSENABLE;
40
+ ISSFENABLE;
41
+ ISTURNOFF;
42
+ CASETYPE;
43
+ ISPAYMENTSTATUSENABLED;
44
+ rootUrl;
45
+ REFUNDLIST;
46
+ USERID;
47
+ LOGGEDINUSERROLES;
48
+ LOGGEDINUSEREMAIL;
49
+ isFromServiceRequestPage;
50
+ telephonySelectionEnable;
51
+ paymentMethod;
52
+ bspaymentdcn;
53
+ unProcessedPaymentServiceId = null;
54
+ paymentGroupReference;
55
+ paymentReference;
56
+ refundReference;
57
+ isFromPayBubble = false;
58
+ refundlistsource;
59
+ viewName;
60
+ isTurnOff;
61
+ caseType;
62
+ unProcessedPayment = null;
63
+ isRefundStatusView;
64
+ isRedirectFromCaseTransactionPage;
65
+ isCallFromRefundList;
66
+ isFromRefundStatusPage;
67
+ iscancelClicked;
68
+ isFromPaymentDetailPage;
69
+ pbaPayOrderRef;
70
+ isTakePayment;
71
+ orderDetail;
72
+ orderRef;
73
+ orderStatus;
74
+ orderParty;
75
+ orderCreated;
76
+ orderCCDEvent;
77
+ serviceRequestValue;
78
+ orderAddBtnEnable;
79
+ orderFeesTotal = 0.00;
80
+ orderRemissionTotal = 0.00;
81
+ orderTotalPayments = 0.00;
82
+ orderPendingPayments = 0.00;
83
+ paymentGroup;
84
+ overPaymentAmount = 0.00;
85
+ refunds;
86
+ constructor(paymentLibService, cd, OrderslistService) {
87
+ this.paymentLibService = paymentLibService;
88
+ this.cd = cd;
89
+ this.OrderslistService = OrderslistService;
90
+ }
91
+ ngAfterContentChecked() {
92
+ this.cd.detectChanges();
93
+ }
94
+ ngOnInit() {
95
+ this.paymentLibService.setApiRootUrl(this.API_ROOT);
96
+ this.paymentLibService.setBulkScanApiRootUrl(this.BULKSCAN_API_ROOT);
97
+ this.paymentLibService.setRefundndsApiRootUrl(this.REFUNDS_API_ROOT);
98
+ this.paymentLibService.setNoticationApiRootUrl(this.NOTIFICATION_API_ROOT);
99
+ this.paymentLibService.setCardPaymentReturnUrl(this.CARDPAYMENTRETURNURL);
100
+ if (this.LOGGEDINUSERROLES.length > 0) {
101
+ this.OrderslistService.setUserRolesList(this.LOGGEDINUSERROLES);
102
+ }
103
+ if (this.PAYMENT_GROUP_REF) {
104
+ this.paymentGroupReference = this.PAYMENT_GROUP_REF;
105
+ }
106
+ if (this.DCN_NUMBER) {
107
+ this.bspaymentdcn = this.DCN_NUMBER;
108
+ }
109
+ if (this.REFUNDLIST === "true") {
110
+ this.VIEW = 'refund-list';
111
+ this.viewName = this.VIEW;
112
+ }
113
+ if (this.VIEW === 'fee-summary') {
114
+ this.viewName = 'fee-summary';
115
+ }
116
+ else if (this.VIEW !== 'reports' && this.VIEW !== 'refund-list') {
117
+ this.viewName = 'case-transactions';
118
+ }
119
+ else {
120
+ this.viewName = this.VIEW;
121
+ }
122
+ if (this.isTakePayment) {
123
+ this.TAKEPAYMENT = true;
124
+ }
125
+ if (this.API_ROOT == 'api/payment-history') {
126
+ this.isFromPayBubble = true;
127
+ }
128
+ }
129
+ /**
130
+ * Adds a remission to the payment group using data from the provided form group.
131
+ *
132
+ * This method checks if the `paymentGroup` is not null before attempting to add the remission.
133
+ * If the `paymentGroup` exists, a new remission is created using the values from the provided
134
+ * form group (`currentRemissionFormGroup`), and it is pushed into the `remissions` array of the payment group.
135
+ *
136
+ * @param {AddRetroRemissionRequest} currentRemissionFormGroup - The form group containing remission data
137
+ * (e.g., `hwf_amount`, `hwf_reference`).
138
+ */
139
+ addRemission(currentRemissionFormGroup) {
140
+ if (this.paymentGroup != null) {
141
+ const remission = {
142
+ remission_reference: null,
143
+ hwf_reference: currentRemissionFormGroup.hwf_reference,
144
+ hwf_amount: currentRemissionFormGroup.hwf_amount,
145
+ beneficiary_name: null,
146
+ ccd_case_number: null,
147
+ fee_code: null,
148
+ date_created: null,
149
+ fee_id: null,
150
+ issue_refund_add_refund_add_remission: false,
151
+ add_refund: false,
152
+ overall_balance: currentRemissionFormGroup.hwf_amount,
153
+ acollection_of_fess: true
154
+ };
155
+ this.paymentGroup.remissions.push(remission);
156
+ }
157
+ }
158
+ /**
159
+ * This method is used to set the paymentGroup for the add remission journey.
160
+ * @param updatedPaymentGroup this is an updated paymentGroup version.
161
+ */
162
+ addPaymentGroup(updatedPaymentGroup) {
163
+ if (this.paymentGroup == null) {
164
+ this.paymentGroup = updatedPaymentGroup;
165
+ }
166
+ }
167
+ /**
168
+ * Calculates the total remission amount for the current payment group.
169
+ *
170
+ * This method checks if the payment group contains any remissions and, if so,
171
+ * sums up the `hwf_amount` of all remissions using the `reduce()` method.
172
+ * If no remissions are found, it returns a default value of 0.
173
+ *
174
+ * @returns {number} The total remission amount, or 0 if no remissions are present.
175
+ */
176
+ getTotalRemission() {
177
+ let remissionTotal = 0;
178
+ if (this.paymentGroup.remissions) {
179
+ remissionTotal = this.paymentGroup.remissions.reduce((totalRemission, remission) => totalRemission + remission.hwf_amount, 0);
180
+ }
181
+ return remissionTotal;
182
+ }
183
+ /**
184
+ * Calculates the total fee amount for the current payment group.
185
+ *
186
+ * This method checks if the payment group contains any fees and, if so,
187
+ * sums up the `calculated_amount` of all fees using the `reduce()` method.
188
+ * If no fees are found, it returns a default value of 0.
189
+ *
190
+ * @returns {number} The total fee amount, or 0 if no fees are present.
191
+ */
192
+ getTotalFees() {
193
+ let feesTotal = 0;
194
+ if (this.paymentGroup.fees) {
195
+ feesTotal = this.paymentGroup.fees.reduce((totalFees, fee) => totalFees + fee.calculated_amount, 0);
196
+ }
197
+ return feesTotal;
198
+ }
199
+ /**
200
+ * Calculates the total payment amount for the current payment group.
201
+ *
202
+ * This method checks if the payment group contains any payments and, if so,
203
+ * sums up the `amount` of all payments using the `reduce()` method.
204
+ * If no payments are found, it returns a default value of 0.
205
+ *
206
+ * @returns {number} The total payment amount, or 0 if no payments are present.
207
+ */
208
+ getTotalPayments() {
209
+ let paymentsTotal = 0;
210
+ if (this.paymentGroup.payments) {
211
+ paymentsTotal = this.paymentGroup.payments.reduce((totalFees, payment) => totalFees + payment.amount, 0);
212
+ }
213
+ return paymentsTotal;
214
+ }
215
+ // Refunds libs section.
216
+ /**
217
+ * This function is used to find out if the current refunds list are in progress for the fee passed as parameter
218
+ * @param fee this is the fee used to find out if the refunds are in progress.
219
+ */
220
+ isTheCurrentRefundInProcessForThisFee(fee) {
221
+ // No refunds
222
+ if (this.refunds == null || this.refunds.length === 0) {
223
+ return false;
224
+ }
225
+ return !this.isTheCurrentRefundRejectedForTheFee(fee.id.toString());
226
+ }
227
+ /**
228
+ * This function is used to find out if in current list of refunds all refunds has been rejected
229
+ * for the fee passed as parameter.
230
+ * @param feeCode this is the fee code used to find out all refunds rejected refunds.
231
+ */
232
+ isTheCurrentRefundRejectedForTheFee(feeCode) {
233
+ let refundsByFee = this.refunds.filter(refund => refund.fee_ids === feeCode);
234
+ let refundsByFeeAndRejected = this.refunds.filter(refund => refund.refund_status.name === 'Rejected');
235
+ // Refunds > 0 and overPayment --> refunds in process or Rejected.
236
+ if (refundsByFee.length === refundsByFeeAndRejected.length) {
237
+ return true;
238
+ }
239
+ return false;
240
+ }
241
+ /**
242
+ * Rounds very small values to zero if they fall below a specified threshold.
243
+ *
244
+ * This is useful for eliminating floating-point precision errors that result in
245
+ * extremely small non-zero values (e.g., 1.1368683772161603e-13) which should
246
+ * logically be treated as zero.
247
+ *
248
+ * @param value - The numeric value to evaluate and potentially round.
249
+ * @param threshold - The minimum absolute value considered significant. Defaults to 1e-10.
250
+ * @returns The original value if it's above the threshold, or 0 if it's below.
251
+ *
252
+ * @example
253
+ * roundTinyValue(1.1368683772161603e-13); // returns 0
254
+ * roundTinyValue(0.00001); // returns 0.00001
255
+ */
256
+ roundTinyValue(value, threshold = 1e-4) {
257
+ return Math.abs(value) < threshold ? 0 : value;
258
+ }
259
+ getRoundedOverPayment() {
260
+ return this.roundTinyValue(this.overPaymentAmount);
261
+ }
262
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaymentLibComponent, deps: [{ token: i1.PaymentLibService }, { token: i0.ChangeDetectorRef }, { token: i2.OrderslistService }], target: i0.ɵɵFactoryTarget.Component });
263
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PaymentLibComponent, selector: "ccpay-payment-lib", inputs: { API_ROOT: "API_ROOT", BULKSCAN_API_ROOT: "BULKSCAN_API_ROOT", REFUNDS_API_ROOT: "REFUNDS_API_ROOT", NOTIFICATION_API_ROOT: "NOTIFICATION_API_ROOT", CARDPAYMENTRETURNURL: "CARDPAYMENTRETURNURL", CCD_CASE_NUMBER: "CCD_CASE_NUMBER", EXC_REFERENCE: "EXC_REFERENCE", PAYMENT_METHOD: "PAYMENT_METHOD", VIEW: "VIEW", VIEWSERVICE: "VIEWSERVICE", PAYMENT_GROUP_REF: "PAYMENT_GROUP_REF", TAKEPAYMENT: "TAKEPAYMENT", SERVICEREQUEST: "SERVICEREQUEST", DCN_NUMBER: "DCN_NUMBER", SELECTED_OPTION: "SELECTED_OPTION", ISBSENABLE: "ISBSENABLE", ISSFENABLE: "ISSFENABLE", ISTURNOFF: "ISTURNOFF", CASETYPE: "CASETYPE", ISPAYMENTSTATUSENABLED: "ISPAYMENTSTATUSENABLED", rootUrl: "rootUrl", REFUNDLIST: "REFUNDLIST", USERID: "USERID", LOGGEDINUSERROLES: "LOGGEDINUSERROLES", LOGGEDINUSEREMAIL: "LOGGEDINUSEREMAIL", isFromServiceRequestPage: "isFromServiceRequestPage", telephonySelectionEnable: "telephonySelectionEnable" }, providers: [{ provide: 'PAYMENT_LIB', useExisting: forwardRef(() => PaymentLibComponent) }], ngImport: i0, template: `
264
+ <ccpay-refund-list [USERID]="USERID" [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" [LOGGEDINUSEREMAIL]="LOGGEDINUSEREMAIL" *ngIf="viewName === 'refund-list'"></ccpay-refund-list>
265
+ <ccpay-payment-list *ngIf="viewName === 'payment-list'"></ccpay-payment-list>
266
+ <ccpay-refund-status
267
+ [LOGGEDINUSERROLES]="LOGGEDINUSERROLES"
268
+ [API_ROOT]="API_ROOT"
269
+ *ngIf="viewName === 'refundstatuslist'"> </ccpay-refund-status >
270
+ <ccpay-payment-view [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" *ngIf="viewName === 'payment-view'"
271
+ [isTurnOff]="ISTURNOFF" [isTakePayment]="TAKEPAYMENT" [caseType]="CASETYPE"
272
+ [ISPAYMENTSTATUSENABLED] = "ISPAYMENTSTATUSENABLED"
273
+ ></ccpay-payment-view>
274
+
275
+ <ccpay-process-refund *ngIf="viewName === 'process-refund'"
276
+ [refundReference]="refundReference"
277
+ [refundlistsource]="refundlistsource"
278
+ ></ccpay-process-refund>
279
+ <ccpay-pba-payment *ngIf="viewName === 'pba-payment'"
280
+ [pbaPayOrderRef]="pbaPayOrderRef"
281
+ ></ccpay-pba-payment>
282
+ <ccpay-case-transactions [isTakePayment]="isTakePayment" [isFromServiceRequestPage]="isFromServiceRequestPage" [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" *ngIf="viewName === 'case-transactions'"></ccpay-case-transactions>
283
+ <app-mark-unidentified-payment *ngIf="viewName === 'unidentifiedPage'"
284
+ [caseType]="CASETYPE"></app-mark-unidentified-payment>
285
+ <app-mark-unsolicited-payment *ngIf="viewName === 'unsolicitedPage'"
286
+ [caseType]="CASETYPE"></app-mark-unsolicited-payment>
287
+ <app-allocate-payments *ngIf="viewName === 'allocate-payments'"
288
+ [isTurnOff]="ISTURNOFF"
289
+ [caseType]="CASETYPE"
290
+ ></app-allocate-payments>
291
+ <ccpay-fee-summary *ngIf="viewName === 'fee-summary'"
292
+ [ccdCaseNumber]="CCD_CASE_NUMBER"
293
+ [paymentGroupRef]="paymentGroupReference"
294
+ [isTurnOff]="ISTURNOFF"
295
+ [caseType]="CASETYPE"
296
+ [telephonySelectionEnable] ="telephonySelectionEnable"
297
+ ></ccpay-fee-summary>
298
+ <ccpay-reports *ngIf="viewName === 'reports'"
299
+ [ISPAYMENTSTATUSENABLED] = "ISPAYMENTSTATUSENABLED"
300
+ ></ccpay-reports>
301
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.PaymentViewComponent, selector: "ccpay-payment-view", inputs: ["isTurnOff", "isTakePayment", "caseType", "orderRef", "orderStatus", "orderTotalPayments", "payment", "LOGGEDINUSERROLES", "ISPAYMENTSTATUSENABLED", "orderParty", "orderCreated", "orderCCDEvent", "orderFeesTotal", "orderRemissionTotal", "orderDetail", "isServiceRequest"] }, { kind: "component", type: i5.CaseTransactionsComponent, selector: "ccpay-case-transactions", inputs: ["LOGGEDINUSERROLES", "isTakePayment", "isFromServiceRequestPage"] }, { kind: "component", type: i6.RefundStatusComponent, selector: "ccpay-refund-status", inputs: ["LOGGEDINUSERROLES", "API_ROOT", "ccdCaseNumber", "isTurnOff", "orderParty"] }, { kind: "component", type: i7.PbaPaymentComponent, selector: "ccpay-pba-payment", inputs: ["pbaPayOrderRef"] }, { kind: "component", type: i8.PaymentListComponent, selector: "ccpay-payment-list" }, { kind: "component", type: i9.ProcessRefundComponent, selector: "ccpay-process-refund", inputs: ["refundReference", "refundlistsource"] }, { kind: "component", type: i10.RefundListComponent, selector: "ccpay-refund-list", inputs: ["USERID", "LOGGEDINUSERROLES", "LOGGEDINUSEREMAIL"] }, { kind: "component", type: i11.MarkUnidentifiedPaymentComponent, selector: "app-mark-unidentified-payment", inputs: ["caseType"] }, { kind: "component", type: i12.MarkUnsolicitedPaymentComponent, selector: "app-mark-unsolicited-payment", inputs: ["caseType"] }, { kind: "component", type: i13.AllocatePaymentsComponent, selector: "app-allocate-payments", inputs: ["isTurnOff", "caseType"], outputs: ["reasonEventEmitter", "explanationEventEmitter"] }, { kind: "component", type: i14.FeeSummaryComponent, selector: "ccpay-fee-summary", inputs: ["paymentGroupRef", "ccdCaseNumber", "isTurnOff", "caseType", "telephonySelectionEnable"] }, { kind: "component", type: i15.ReportsComponent, selector: "ccpay-reports", inputs: ["ISPAYMENTSTATUSENABLED"] }] });
302
+ }
303
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaymentLibComponent, decorators: [{
304
+ type: Component,
305
+ args: [{
306
+ selector: 'ccpay-payment-lib',
307
+ template: `
308
+ <ccpay-refund-list [USERID]="USERID" [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" [LOGGEDINUSEREMAIL]="LOGGEDINUSEREMAIL" *ngIf="viewName === 'refund-list'"></ccpay-refund-list>
309
+ <ccpay-payment-list *ngIf="viewName === 'payment-list'"></ccpay-payment-list>
310
+ <ccpay-refund-status
311
+ [LOGGEDINUSERROLES]="LOGGEDINUSERROLES"
312
+ [API_ROOT]="API_ROOT"
313
+ *ngIf="viewName === 'refundstatuslist'"> </ccpay-refund-status >
314
+ <ccpay-payment-view [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" *ngIf="viewName === 'payment-view'"
315
+ [isTurnOff]="ISTURNOFF" [isTakePayment]="TAKEPAYMENT" [caseType]="CASETYPE"
316
+ [ISPAYMENTSTATUSENABLED] = "ISPAYMENTSTATUSENABLED"
317
+ ></ccpay-payment-view>
318
+
319
+ <ccpay-process-refund *ngIf="viewName === 'process-refund'"
320
+ [refundReference]="refundReference"
321
+ [refundlistsource]="refundlistsource"
322
+ ></ccpay-process-refund>
323
+ <ccpay-pba-payment *ngIf="viewName === 'pba-payment'"
324
+ [pbaPayOrderRef]="pbaPayOrderRef"
325
+ ></ccpay-pba-payment>
326
+ <ccpay-case-transactions [isTakePayment]="isTakePayment" [isFromServiceRequestPage]="isFromServiceRequestPage" [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" *ngIf="viewName === 'case-transactions'"></ccpay-case-transactions>
327
+ <app-mark-unidentified-payment *ngIf="viewName === 'unidentifiedPage'"
328
+ [caseType]="CASETYPE"></app-mark-unidentified-payment>
329
+ <app-mark-unsolicited-payment *ngIf="viewName === 'unsolicitedPage'"
330
+ [caseType]="CASETYPE"></app-mark-unsolicited-payment>
331
+ <app-allocate-payments *ngIf="viewName === 'allocate-payments'"
332
+ [isTurnOff]="ISTURNOFF"
333
+ [caseType]="CASETYPE"
334
+ ></app-allocate-payments>
335
+ <ccpay-fee-summary *ngIf="viewName === 'fee-summary'"
336
+ [ccdCaseNumber]="CCD_CASE_NUMBER"
337
+ [paymentGroupRef]="paymentGroupReference"
338
+ [isTurnOff]="ISTURNOFF"
339
+ [caseType]="CASETYPE"
340
+ [telephonySelectionEnable] ="telephonySelectionEnable"
341
+ ></ccpay-fee-summary>
342
+ <ccpay-reports *ngIf="viewName === 'reports'"
343
+ [ISPAYMENTSTATUSENABLED] = "ISPAYMENTSTATUSENABLED"
344
+ ></ccpay-reports>
345
+ `,
346
+ providers: [{ provide: 'PAYMENT_LIB', useExisting: forwardRef(() => PaymentLibComponent) }]
347
+ }]
348
+ }], ctorParameters: () => [{ type: i1.PaymentLibService }, { type: i0.ChangeDetectorRef }, { type: i2.OrderslistService }], propDecorators: { API_ROOT: [{
349
+ type: Input,
350
+ args: ['API_ROOT']
351
+ }], BULKSCAN_API_ROOT: [{
352
+ type: Input,
353
+ args: ['BULKSCAN_API_ROOT']
354
+ }], REFUNDS_API_ROOT: [{
355
+ type: Input,
356
+ args: ['REFUNDS_API_ROOT']
357
+ }], NOTIFICATION_API_ROOT: [{
358
+ type: Input,
359
+ args: ['NOTIFICATION_API_ROOT']
360
+ }], CARDPAYMENTRETURNURL: [{
361
+ type: Input,
362
+ args: ['CARDPAYMENTRETURNURL']
363
+ }], CCD_CASE_NUMBER: [{
364
+ type: Input,
365
+ args: ['CCD_CASE_NUMBER']
366
+ }], EXC_REFERENCE: [{
367
+ type: Input,
368
+ args: ['EXC_REFERENCE']
369
+ }], PAYMENT_METHOD: [{
370
+ type: Input,
371
+ args: ['PAYMENT_METHOD']
372
+ }], VIEW: [{
373
+ type: Input,
374
+ args: ['VIEW']
375
+ }], VIEWSERVICE: [{
376
+ type: Input,
377
+ args: ['VIEWSERVICE']
378
+ }], PAYMENT_GROUP_REF: [{
379
+ type: Input,
380
+ args: ['PAYMENT_GROUP_REF']
381
+ }], TAKEPAYMENT: [{
382
+ type: Input,
383
+ args: ['TAKEPAYMENT']
384
+ }], SERVICEREQUEST: [{
385
+ type: Input,
386
+ args: ['SERVICEREQUEST']
387
+ }], DCN_NUMBER: [{
388
+ type: Input,
389
+ args: ['DCN_NUMBER']
390
+ }], SELECTED_OPTION: [{
391
+ type: Input,
392
+ args: ['SELECTED_OPTION']
393
+ }], ISBSENABLE: [{
394
+ type: Input,
395
+ args: ['ISBSENABLE']
396
+ }], ISSFENABLE: [{
397
+ type: Input,
398
+ args: ['ISSFENABLE']
399
+ }], ISTURNOFF: [{
400
+ type: Input,
401
+ args: ['ISTURNOFF']
402
+ }], CASETYPE: [{
403
+ type: Input,
404
+ args: ['CASETYPE']
405
+ }], ISPAYMENTSTATUSENABLED: [{
406
+ type: Input,
407
+ args: ['ISPAYMENTSTATUSENABLED']
408
+ }], rootUrl: [{
409
+ type: Input,
410
+ args: ['rootUrl']
411
+ }], REFUNDLIST: [{
412
+ type: Input,
413
+ args: ['REFUNDLIST']
414
+ }], USERID: [{
415
+ type: Input,
416
+ args: ['USERID']
417
+ }], LOGGEDINUSERROLES: [{
418
+ type: Input,
419
+ args: ['LOGGEDINUSERROLES']
420
+ }], LOGGEDINUSEREMAIL: [{
421
+ type: Input,
422
+ args: ['LOGGEDINUSEREMAIL']
423
+ }], isFromServiceRequestPage: [{
424
+ type: Input,
425
+ args: ['isFromServiceRequestPage']
426
+ }], telephonySelectionEnable: [{
427
+ type: Input,
428
+ args: ['telephonySelectionEnable']
429
+ }] } });
430
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1saWIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF5bWVudC1saWIvc3JjL2xpYi9wYXltZW50LWxpYi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQXFEaEUsTUFBTSxPQUFPLG1CQUFtQjtJQXFFVjtJQUNWO0lBQ0E7SUF0RVMsUUFBUSxDQUFTO0lBQ1IsaUJBQWlCLENBQVM7SUFDM0IsZ0JBQWdCLENBQVM7SUFDcEIscUJBQXFCLENBQVM7SUFDL0Isb0JBQW9CLENBQVM7SUFDbEMsZUFBZSxDQUFTO0lBQzFCLGFBQWEsQ0FBUztJQUNyQixjQUFjLENBQVM7SUFDakMsSUFBSSxDQUFTO0lBQ04sV0FBVyxDQUFTO0lBQ2QsaUJBQWlCLENBQVU7SUFDakMsV0FBVyxDQUFVO0lBQ2xCLGNBQWMsQ0FBUztJQUMzQixVQUFVLENBQVM7SUFDZCxlQUFlLENBQVM7SUFDN0IsVUFBVSxDQUFVO0lBQ3BCLFVBQVUsQ0FBVTtJQUNyQixTQUFTLENBQVU7SUFDcEIsUUFBUSxDQUFTO0lBQ0gsc0JBQXNCLENBQVU7SUFDL0MsT0FBTyxDQUFVO0lBQ2QsVUFBVSxDQUFTO0lBQ3ZCLE1BQU0sQ0FBUztJQUNKLGlCQUFpQixDQUFRO0lBQ3pCLGlCQUFpQixDQUFTO0lBQ25CLHdCQUF3QixDQUFVO0lBQ2xDLHdCQUF3QixDQUFVO0lBSXJFLGFBQWEsQ0FBUztJQUN0QixZQUFZLENBQVM7SUFDckIsMkJBQTJCLEdBQVcsSUFBSSxDQUFDO0lBQzNDLHFCQUFxQixDQUFTO0lBQzlCLGdCQUFnQixDQUFTO0lBQ3pCLGVBQWUsQ0FBUztJQUN4QixlQUFlLEdBQVksS0FBSyxDQUFDO0lBQ2pDLGdCQUFnQixDQUFNO0lBQ3RCLFFBQVEsQ0FBUztJQUNqQixTQUFTLENBQVU7SUFDbkIsUUFBUSxDQUFTO0lBQ2pCLGtCQUFrQixHQUFnQixJQUFJLENBQUM7SUFDdkMsa0JBQWtCLENBQVU7SUFDNUIsaUNBQWlDLENBQVM7SUFDMUMsb0JBQW9CLENBQVU7SUFDOUIsc0JBQXNCLENBQVU7SUFDaEMsZUFBZSxDQUFVO0lBQ3pCLHVCQUF1QixDQUFVO0lBQ2pDLGNBQWMsQ0FBVztJQUN6QixhQUFhLENBQVU7SUFFdkIsV0FBVyxDQUFRO0lBQ25CLFFBQVEsQ0FBUztJQUNqQixXQUFXLENBQVM7SUFDcEIsVUFBVSxDQUFTO0lBQ25CLFlBQVksQ0FBTztJQUNuQixhQUFhLENBQVM7SUFDdEIsbUJBQW1CLENBQVM7SUFDNUIsaUJBQWlCLENBQVU7SUFDM0IsY0FBYyxHQUFXLElBQUksQ0FBQztJQUM5QixtQkFBbUIsR0FBVyxJQUFJLENBQUM7SUFDbkMsa0JBQWtCLEdBQVcsSUFBSSxDQUFDO0lBQ2xDLG9CQUFvQixHQUFXLElBQUksQ0FBQztJQUVwQyxZQUFZLENBQWM7SUFDMUIsaUJBQWlCLEdBQVcsSUFBSSxDQUFDO0lBQ2pDLE9BQU8sQ0FBZ0I7SUFFdkIsWUFBb0IsaUJBQW9DLEVBQzlDLEVBQXFCLEVBQ3JCLGlCQUFvQztRQUYxQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQzlDLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3JCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7SUFBSSxDQUFDO0lBQ25ELHFCQUFxQjtRQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFHRCxRQUFRO1FBRU4sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRTFFLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUM7UUFDaEMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUUsQ0FBQztZQUNsRSxJQUFJLENBQUMsUUFBUSxHQUFHLG1CQUFtQixDQUFDO1FBQ3RDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFHRDs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLENBQUMseUJBQW1EO1FBRTlELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUU5QixNQUFNLFNBQVMsR0FBZTtnQkFFNUIsbUJBQW1CLEVBQUUsSUFBSTtnQkFDekIsYUFBYSxFQUFFLHlCQUF5QixDQUFDLGFBQWE7Z0JBQ3RELFVBQVUsRUFBRSx5QkFBeUIsQ0FBQyxVQUFVO2dCQUNoRCxnQkFBZ0IsRUFBRSxJQUFJO2dCQUN0QixlQUFlLEVBQUUsSUFBSTtnQkFDckIsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLE1BQU0sRUFBRSxJQUFJO2dCQUNaLHFDQUFxQyxFQUFFLEtBQUs7Z0JBQzVDLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixlQUFlLEVBQUMseUJBQXlCLENBQUMsVUFBVTtnQkFDcEQsbUJBQW1CLEVBQUUsSUFBSTthQUMxQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZSxDQUFDLG1CQUFpQztRQUMvQyxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxFQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxtQkFBbUIsQ0FBQztRQUM1QyxDQUFDO0lBQ0gsQ0FBQztJQUdEOzs7Ozs7OztPQVFHO0lBRUgsaUJBQWlCO1FBQ2YsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEksQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFlBQVk7UUFDVixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNCLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9CLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUdELHdCQUF3QjtJQUV4Qjs7O09BR0c7SUFDSCxxQ0FBcUMsQ0FBQyxHQUFTO1FBQzdDLGFBQWE7UUFDYixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUNBQW1DLENBQUMsT0FBZTtRQUVqRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDN0UsSUFBSSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDO1FBRXRHLG1FQUFtRTtRQUNuRSxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssdUJBQXVCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBR0Q7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCxjQUFjLENBQUMsS0FBYSxFQUFFLFlBQW9CLElBQUk7UUFDcEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDakQsQ0FBQztJQUdELHFCQUFxQjtRQUNuQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckQsQ0FBQzt3R0ExUVUsbUJBQW1COzRGQUFuQixtQkFBbUIsODdCQUhuQixDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQywwQkF2Q2pGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXNDUDs7NEZBSVEsbUJBQW1CO2tCQTVDL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBc0NQO29CQUNILFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7aUJBQzVGO3NKQUdvQixRQUFRO3NCQUExQixLQUFLO3VCQUFDLFVBQVU7Z0JBQ1csaUJBQWlCO3NCQUE1QyxLQUFLO3VCQUFDLG1CQUFtQjtnQkFDQyxnQkFBZ0I7c0JBQTFDLEtBQUs7dUJBQUMsa0JBQWtCO2dCQUNPLHFCQUFxQjtzQkFBcEQsS0FBSzt1QkFBQyx1QkFBdUI7Z0JBQ0Msb0JBQW9CO3NCQUFsRCxLQUFLO3VCQUFDLHNCQUFzQjtnQkFDSCxlQUFlO3NCQUF4QyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFDQSxhQUFhO3NCQUFwQyxLQUFLO3VCQUFDLGVBQWU7Z0JBQ0csY0FBYztzQkFBdEMsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBQ1IsSUFBSTtzQkFBbEIsS0FBSzt1QkFBQyxNQUFNO2dCQUNTLFdBQVc7c0JBQWhDLEtBQUs7dUJBQUMsYUFBYTtnQkFDUSxpQkFBaUI7c0JBQTVDLEtBQUs7dUJBQUMsbUJBQW1CO2dCQUNKLFdBQVc7c0JBQWhDLEtBQUs7dUJBQUMsYUFBYTtnQkFDSyxjQUFjO3NCQUF0QyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDRixVQUFVO3NCQUE5QixLQUFLO3VCQUFDLFlBQVk7Z0JBQ08sZUFBZTtzQkFBeEMsS0FBSzt1QkFBQyxpQkFBaUI7Z0JBQ0gsVUFBVTtzQkFBOUIsS0FBSzt1QkFBQyxZQUFZO2dCQUNFLFVBQVU7c0JBQTlCLEtBQUs7dUJBQUMsWUFBWTtnQkFDQyxTQUFTO3NCQUE1QixLQUFLO3VCQUFDLFdBQVc7Z0JBQ0MsUUFBUTtzQkFBMUIsS0FBSzt1QkFBQyxVQUFVO2dCQUNnQixzQkFBc0I7c0JBQXRELEtBQUs7dUJBQUMsd0JBQXdCO2dCQUNiLE9BQU87c0JBQXhCLEtBQUs7dUJBQUMsU0FBUztnQkFDSyxVQUFVO3NCQUE5QixLQUFLO3VCQUFDLFlBQVk7Z0JBQ0YsTUFBTTtzQkFBdEIsS0FBSzt1QkFBQyxRQUFRO2dCQUNhLGlCQUFpQjtzQkFBNUMsS0FBSzt1QkFBQyxtQkFBbUI7Z0JBQ0UsaUJBQWlCO3NCQUE1QyxLQUFLO3VCQUFDLG1CQUFtQjtnQkFDUyx3QkFBd0I7c0JBQTFELEtBQUs7dUJBQUMsMEJBQTBCO2dCQUNFLHdCQUF3QjtzQkFBMUQsS0FBSzt1QkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQYXltZW50TGliU2VydmljZX0gZnJvbSAnLi9wYXltZW50LWxpYi5zZXJ2aWNlJztcbmltcG9ydCB7SUJTUGF5bWVudHN9IGZyb20gJy4vaW50ZXJmYWNlcy9JQlNQYXltZW50cyc7XG5pbXBvcnQge09yZGVyc2xpc3RTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL29yZGVyc2xpc3Quc2VydmljZSc7XG5pbXBvcnQge0lQYXltZW50fSBmcm9tICcuL2ludGVyZmFjZXMvSVBheW1lbnQnO1xuaW1wb3J0IHtJUGF5bWVudEdyb3VwfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0lQYXltZW50R3JvdXBcIjtcbmltcG9ydCB7SVJlZnVuZExpc3R9IGZyb20gXCIuL2ludGVyZmFjZXMvSVJlZnVuZExpc3RcIjtcbmltcG9ydCB7SUZlZX0gZnJvbSBcIi4vaW50ZXJmYWNlcy9JRmVlXCI7XG5pbXBvcnQge0lSZW1pc3Npb259IGZyb20gXCIuL2ludGVyZmFjZXMvSVJlbWlzc2lvblwiO1xuaW1wb3J0IHtBZGRSZXRyb1JlbWlzc2lvblJlcXVlc3R9IGZyb20gXCIuL2ludGVyZmFjZXMvQWRkUmV0cm9SZW1pc3Npb25SZXF1ZXN0XCI7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2NwYXktcGF5bWVudC1saWInLFxuICB0ZW1wbGF0ZTogYFxuICA8Y2NwYXktcmVmdW5kLWxpc3QgW1VTRVJJRF09XCJVU0VSSURcIiBbTE9HR0VESU5VU0VSUk9MRVNdPVwiTE9HR0VESU5VU0VSUk9MRVNcIiBbTE9HR0VESU5VU0VSRU1BSUxdPVwiTE9HR0VESU5VU0VSRU1BSUxcIiAqbmdJZj1cInZpZXdOYW1lID09PSAncmVmdW5kLWxpc3QnXCI+PC9jY3BheS1yZWZ1bmQtbGlzdD5cbiAgICA8Y2NwYXktcGF5bWVudC1saXN0ICpuZ0lmPVwidmlld05hbWUgPT09ICdwYXltZW50LWxpc3QnXCI+PC9jY3BheS1wYXltZW50LWxpc3Q+XG4gICAgPGNjcGF5LXJlZnVuZC1zdGF0dXNcbiAgICBbTE9HR0VESU5VU0VSUk9MRVNdPVwiTE9HR0VESU5VU0VSUk9MRVNcIlxuICAgIFtBUElfUk9PVF09XCJBUElfUk9PVFwiXG4gICAgKm5nSWY9XCJ2aWV3TmFtZSA9PT0gJ3JlZnVuZHN0YXR1c2xpc3QnXCI+IDwvY2NwYXktcmVmdW5kLXN0YXR1cyA+XG4gICAgPGNjcGF5LXBheW1lbnQtdmlldyBbTE9HR0VESU5VU0VSUk9MRVNdPVwiTE9HR0VESU5VU0VSUk9MRVNcIiAqbmdJZj1cInZpZXdOYW1lID09PSAncGF5bWVudC12aWV3J1wiXG4gICAgW2lzVHVybk9mZl09XCJJU1RVUk5PRkZcIiBbaXNUYWtlUGF5bWVudF09XCJUQUtFUEFZTUVOVFwiICBbY2FzZVR5cGVdPVwiQ0FTRVRZUEVcIlxuICAgIFtJU1BBWU1FTlRTVEFUVVNFTkFCTEVEXSA9IFwiSVNQQVlNRU5UU1RBVFVTRU5BQkxFRFwiXG4gICAgPjwvY2NwYXktcGF5bWVudC12aWV3PlxuXG4gICAgPGNjcGF5LXByb2Nlc3MtcmVmdW5kICpuZ0lmPVwidmlld05hbWUgPT09ICdwcm9jZXNzLXJlZnVuZCdcIlxuICAgIFtyZWZ1bmRSZWZlcmVuY2VdPVwicmVmdW5kUmVmZXJlbmNlXCJcbiAgICBbcmVmdW5kbGlzdHNvdXJjZV09XCJyZWZ1bmRsaXN0c291cmNlXCJcbiAgICA+PC9jY3BheS1wcm9jZXNzLXJlZnVuZD5cbiAgICA8Y2NwYXktcGJhLXBheW1lbnQgKm5nSWY9XCJ2aWV3TmFtZSA9PT0gJ3BiYS1wYXltZW50J1wiXG4gICAgW3BiYVBheU9yZGVyUmVmXT1cInBiYVBheU9yZGVyUmVmXCJcbiAgICA+PC9jY3BheS1wYmEtcGF5bWVudD5cbiAgICA8Y2NwYXktY2FzZS10cmFuc2FjdGlvbnMgW2lzVGFrZVBheW1lbnRdPVwiaXNUYWtlUGF5bWVudFwiIFtpc0Zyb21TZXJ2aWNlUmVxdWVzdFBhZ2VdPVwiaXNGcm9tU2VydmljZVJlcXVlc3RQYWdlXCIgW0xPR0dFRElOVVNFUlJPTEVTXT1cIkxPR0dFRElOVVNFUlJPTEVTXCIgKm5nSWY9XCJ2aWV3TmFtZSA9PT0gJ2Nhc2UtdHJhbnNhY3Rpb25zJ1wiPjwvY2NwYXktY2FzZS10cmFuc2FjdGlvbnM+XG4gICAgPGFwcC1tYXJrLXVuaWRlbnRpZmllZC1wYXltZW50ICpuZ0lmPVwidmlld05hbWUgPT09ICd1bmlkZW50aWZpZWRQYWdlJ1wiXG4gICAgW2Nhc2VUeXBlXT1cIkNBU0VUWVBFXCI+PC9hcHAtbWFyay11bmlkZW50aWZpZWQtcGF5bWVudD5cbiAgICA8YXBwLW1hcmstdW5zb2xpY2l0ZWQtcGF5bWVudCAqbmdJZj1cInZpZXdOYW1lID09PSAndW5zb2xpY2l0ZWRQYWdlJ1wiXG4gICAgW2Nhc2VUeXBlXT1cIkNBU0VUWVBFXCI+PC9hcHAtbWFyay11bnNvbGljaXRlZC1wYXltZW50PlxuICAgIDxhcHAtYWxsb2NhdGUtcGF5bWVudHMgKm5nSWY9XCJ2aWV3TmFtZSA9PT0gJ2FsbG9jYXRlLXBheW1lbnRzJ1wiXG4gICAgW2lzVHVybk9mZl09XCJJU1RVUk5PRkZcIlxuICAgIFtjYXNlVHlwZV09XCJDQVNFVFlQRVwiXG4gICAgPjwvYXBwLWFsbG9jYXRlLXBheW1lbnRzPlxuICAgIDxjY3BheS1mZWUtc3VtbWFyeSAqbmdJZj1cInZpZXdOYW1lID09PSAnZmVlLXN1bW1hcnknXCJcbiAgICAgIFtjY2RDYXNlTnVtYmVyXT1cIkNDRF9DQVNFX05VTUJFUlwiXG4gICAgICBbcGF5bWVudEdyb3VwUmVmXT1cInBheW1lbnRHcm91cFJlZmVyZW5jZVwiXG4gICAgICBbaXNUdXJuT2ZmXT1cIklTVFVSTk9GRlwiXG4gICAgICBbY2FzZVR5cGVdPVwiQ0FTRVRZUEVcIlxuICAgICAgW3RlbGVwaG9ueVNlbGVjdGlvbkVuYWJsZV0gPVwidGVsZXBob255U2VsZWN0aW9uRW5hYmxlXCJcbiAgICAgID48L2NjcGF5LWZlZS1zdW1tYXJ5PlxuICAgIDxjY3BheS1yZXBvcnRzICpuZ0lmPVwidmlld05hbWUgPT09ICdyZXBvcnRzJ1wiXG4gICAgW0lTUEFZTUVOVFNUQVRVU0VOQUJMRURdID0gXCJJU1BBWU1FTlRTVEFUVVNFTkFCTEVEXCJcbiAgICA+PC9jY3BheS1yZXBvcnRzPlxuICAgIGAsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogJ1BBWU1FTlRfTElCJywgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGF5bWVudExpYkNvbXBvbmVudCkgfV1cbn0pXG5cbmV4cG9ydCBjbGFzcyBQYXltZW50TGliQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCdBUElfUk9PVCcpIEFQSV9ST09UOiBzdHJpbmc7XG4gIEBJbnB1dCgnQlVMS1NDQU5fQVBJX1JPT1QnKSBCVUxLU0NBTl9BUElfUk9PVDogc3RyaW5nO1xuICBASW5wdXQoJ1JFRlVORFNfQVBJX1JPT1QnKSBSRUZVTkRTX0FQSV9ST09UOiBzdHJpbmc7XG4gIEBJbnB1dCgnTk9USUZJQ0FUSU9OX0FQSV9ST09UJykgTk9USUZJQ0FUSU9OX0FQSV9ST09UOiBzdHJpbmc7XG4gIEBJbnB1dCgnQ0FSRFBBWU1FTlRSRVRVUk5VUkwnKSBDQVJEUEFZTUVOVFJFVFVSTlVSTDogc3RyaW5nO1xuICBASW5wdXQoJ0NDRF9DQVNFX05VTUJFUicpIENDRF9DQVNFX05VTUJFUjogc3RyaW5nO1xuICBASW5wdXQoJ0VYQ19SRUZFUkVOQ0UnKSBFWENfUkVGRVJFTkNFOiBzdHJpbmc7XG4gIEBJbnB1dCgnUEFZTUVOVF9NRVRIT0QnKSBQQVlNRU5UX01FVEhPRDogc3RyaW5nO1xuICBASW5wdXQoJ1ZJRVcnKSBWSUVXOiBzdHJpbmc7XG4gIEBJbnB1dCgnVklFV1NFUlZJQ0UnKSBWSUVXU0VSVklDRTogc3RyaW5nO1xuICBASW5wdXQoJ1BBWU1FTlRfR1JPVVBfUkVGJykgUEFZTUVOVF9HUk9VUF9SRUY/OiBzdHJpbmc7XG4gIEBJbnB1dCgnVEFLRVBBWU1FTlQnKSBUQUtFUEFZTUVOVDogYm9vbGVhbjtcbiAgQElucHV0KCdTRVJWSUNFUkVRVUVTVCcpIFNFUlZJQ0VSRVFVRVNUOiBzdHJpbmc7XG4gIEBJbnB1dCgnRENOX05VTUJFUicpIERDTl9OVU1CRVI6IHN0cmluZztcbiAgQElucHV0KCdTRUxFQ1RFRF9PUFRJT04nKSBTRUxFQ1RFRF9PUFRJT046IHN0cmluZztcbiAgQElucHV0KCdJU0JTRU5BQkxFJykgSVNCU0VOQUJMRTogQm9vbGVhbjtcbiAgQElucHV0KCdJU1NGRU5BQkxFJykgSVNTRkVOQUJMRTogYm9vbGVhbjtcbiAgQElucHV0KCdJU1RVUk5PRkYnKSBJU1RVUk5PRkY6IGJvb2xlYW47XG4gIEBJbnB1dCgnQ0FTRVRZUEUnKSBDQVNFVFlQRTogc3RyaW5nO1xuICBASW5wdXQoJ0lTUEFZTUVOVFNUQVRVU0VOQUJMRUQnKSBJU1BBWU1FTlRTVEFUVVNFTkFCTEVEOiBib29sZWFuO1xuICBASW5wdXQoJ3Jvb3RVcmwnKSByb290VXJsOiBib29sZWFuO1xuICBASW5wdXQoJ1JFRlVORExJU1QnKSBSRUZVTkRMSVNUOiBzdHJpbmc7XG4gIEBJbnB1dCgnVVNFUklEJykgVVNFUklEOiBzdHJpbmc7XG4gIEBJbnB1dCgnTE9HR0VESU5VU0VSUk9MRVMnKSBMT0dHRURJTlVTRVJST0xFUzogYW55W107XG4gIEBJbnB1dCgnTE9HR0VESU5VU0VSRU1BSUwnKSBMT0dHRURJTlVTRVJFTUFJTDogc3RyaW5nO1xuICBASW5wdXQoJ2lzRnJvbVNlcnZpY2VSZXF1ZXN0UGFnZScpIGlzRnJvbVNlcnZpY2VSZXF1ZXN0UGFnZTogYm9vbGVhbjtcbiAgQElucHV0KCd0ZWxlcGhvbnlTZWxlY3Rpb25FbmFibGUnKSB0ZWxlcGhvbnlTZWxlY3Rpb25FbmFibGU6IGJvb2xlYW47XG5cblxuXG4gIHBheW1lbnRNZXRob2Q6IHN0cmluZztcbiAgYnNwYXltZW50ZGNuOiBzdHJpbmc7XG4gIHVuUHJvY2Vzc2VkUGF5bWVudFNlcnZpY2VJZDogc3RyaW5nID0gbnVsbDtcbiAgcGF5bWVudEdyb3VwUmVmZXJlbmNlOiBzdHJpbmc7XG4gIHBheW1lbnRSZWZlcmVuY2U6IHN0cmluZztcbiAgcmVmdW5kUmVmZXJlbmNlOiBzdHJpbmc7XG4gIGlzRnJvbVBheUJ1YmJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICByZWZ1bmRsaXN0c291cmNlOiBhbnk7XG4gIHZpZXdOYW1lOiBzdHJpbmc7XG4gIGlzVHVybk9mZjogYm9vbGVhbjtcbiAgY2FzZVR5cGU6IHN0cmluZztcbiAgdW5Qcm9jZXNzZWRQYXltZW50OiBJQlNQYXltZW50cyA9IG51bGw7XG4gIGlzUmVmdW5kU3RhdHVzVmlldzogYm9vbGVhbjtcbiAgaXNSZWRpcmVjdEZyb21DYXNlVHJhbnNhY3Rpb25QYWdlOiBzdHJpbmc7XG4gIGlzQ2FsbEZyb21SZWZ1bmRMaXN0OiBib29sZWFuO1xuICBpc0Zyb21SZWZ1bmRTdGF0dXNQYWdlOiBib29sZWFuO1xuICBpc2NhbmNlbENsaWNrZWQ6IGJvb2xlYW47XG4gIGlzRnJvbVBheW1lbnREZXRhaWxQYWdlOiBib29sZWFuO1xuICBwYmFQYXlPcmRlclJlZjogSVBheW1lbnQ7XG4gIGlzVGFrZVBheW1lbnQ6IGJvb2xlYW47XG5cbiAgb3JkZXJEZXRhaWw6IGFueVtdO1xuICBvcmRlclJlZjogc3RyaW5nO1xuICBvcmRlclN0YXR1czogc3RyaW5nO1xuICBvcmRlclBhcnR5OiBzdHJpbmc7XG4gIG9yZGVyQ3JlYXRlZDogRGF0ZTtcbiAgb3JkZXJDQ0RFdmVudDogc3RyaW5nO1xuICBzZXJ2aWNlUmVxdWVzdFZhbHVlOiBzdHJpbmc7XG4gIG9yZGVyQWRkQnRuRW5hYmxlOiBib29sZWFuO1xuICBvcmRlckZlZXNUb3RhbDogbnVtYmVyID0gMC4wMDtcbiAgb3JkZXJSZW1pc3Npb25Ub3RhbDogbnVtYmVyID0gMC4wMDtcbiAgb3JkZXJUb3RhbFBheW1lbnRzOiBudW1iZXIgPSAwLjAwO1xuICBvcmRlclBlbmRpbmdQYXltZW50czogbnVtYmVyID0gMC4wMDtcblxuICBwYXltZW50R3JvdXA6SVBheW1lbnRHcm91cFxuICBvdmVyUGF5bWVudEFtb3VudDogbnVtYmVyID0gMC4wMDtcbiAgcmVmdW5kczogSVJlZnVuZExpc3RbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBheW1lbnRMaWJTZXJ2aWNlOiBQYXltZW50TGliU2VydmljZSxcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIE9yZGVyc2xpc3RTZXJ2aWNlOiBPcmRlcnNsaXN0U2VydmljZSkgeyB9XG4gIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICB0aGlzLnBheW1lbnRMaWJTZXJ2aWNlLnNldEFwaVJvb3RVcmwodGhpcy5BUElfUk9PVCk7XG4gICAgdGhpcy5wYXltZW50TGliU2VydmljZS5zZXRCdWxrU2NhbkFwaVJvb3RVcmwodGhpcy5CVUxLU0NBTl9BUElfUk9PVCk7XG4gICAgdGhpcy5wYXltZW50TGliU2VydmljZS5zZXRSZWZ1bmRuZHNBcGlSb290VXJsKHRoaXMuUkVGVU5EU19BUElfUk9PVCk7XG4gICAgdGhpcy5wYXltZW50TGliU2VydmljZS5zZXROb3RpY2F0aW9uQXBpUm9vdFVybCh0aGlzLk5PVElGSUNBVElPTl9BUElfUk9PVCk7XG4gICAgdGhpcy5wYXltZW50TGliU2VydmljZS5zZXRDYXJkUGF5bWVudFJldHVyblVybCh0aGlzLkNBUkRQQVlNRU5UUkVUVVJOVVJMKTtcblxuICAgIGlmICh0aGlzLkxPR0dFRElOVVNFUlJPTEVTLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0VXNlclJvbGVzTGlzdCh0aGlzLkxPR0dFRElOVVNFUlJPTEVTKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuUEFZTUVOVF9HUk9VUF9SRUYpIHtcbiAgICAgIHRoaXMucGF5bWVudEdyb3VwUmVmZXJlbmNlID0gdGhpcy5QQVlNRU5UX0dST1VQX1JFRjtcbiAgICB9XG4gICAgaWYgKHRoaXMuRENOX05VTUJFUikge1xuICAgICAgdGhpcy5ic3BheW1lbnRkY24gPSB0aGlzLkRDTl9OVU1CRVI7XG4gICAgfVxuICAgIGlmICh0aGlzLlJFRlVORExJU1QgPT09IFwidHJ1ZVwiKSB7XG4gICAgICB0aGlzLlZJRVcgPSAncmVmdW5kLWxpc3QnO1xuICAgICAgdGhpcy52aWV3TmFtZSA9IHRoaXMuVklFVztcbiAgICB9XG4gICAgaWYgKHRoaXMuVklFVyA9PT0gJ2ZlZS1zdW1tYXJ5Jykge1xuICAgICAgdGhpcy52aWV3TmFtZSA9ICdmZWUtc3VtbWFyeSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLlZJRVcgIT09ICdyZXBvcnRzJyAmJiB0aGlzLlZJRVcgIT09ICdyZWZ1bmQtbGlzdCcpIHtcbiAgICAgIHRoaXMudmlld05hbWUgPSAnY2FzZS10cmFuc2FjdGlvbnMnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpZXdOYW1lID0gdGhpcy5WSUVXO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzVGFrZVBheW1lbnQpIHtcbiAgICAgIHRoaXMuVEFLRVBBWU1FTlQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5BUElfUk9PVCA9PSAnYXBpL3BheW1lbnQtaGlzdG9yeScpIHtcbiAgICAgIHRoaXMuaXNGcm9tUGF5QnViYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVtaXNzaW9uIHRvIHRoZSBwYXltZW50IGdyb3VwIHVzaW5nIGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgZm9ybSBncm91cC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBgcGF5bWVudEdyb3VwYCBpcyBub3QgbnVsbCBiZWZvcmUgYXR0ZW1wdGluZyB0byBhZGQgdGhlIHJlbWlzc2lvbi5cbiAgICogSWYgdGhlIGBwYXltZW50R3JvdXBgIGV4aXN0cywgYSBuZXcgcmVtaXNzaW9uIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIHZhbHVlcyBmcm9tIHRoZSBwcm92aWRlZFxuICAgKiBmb3JtIGdyb3VwIChgY3VycmVudFJlbWlzc2lvbkZvcm1Hcm91cGApLCBhbmQgaXQgaXMgcHVzaGVkIGludG8gdGhlIGByZW1pc3Npb25zYCBhcnJheSBvZiB0aGUgcGF5bWVudCBncm91cC5cbiAgICpcbiAgICogQHBhcmFtIHtBZGRSZXRyb1JlbWlzc2lvblJlcXVlc3R9IGN1cnJlbnRSZW1pc3Npb25Gb3JtR3JvdXAgLSBUaGUgZm9ybSBncm91cCBjb250YWluaW5nIHJlbWlzc2lvbiBkYXRhXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4sIGBod2ZfYW1vdW50YCwgYGh3Zl9yZWZlcmVuY2VgKS5cbiAgICovXG4gIGFkZFJlbWlzc2lvbihjdXJyZW50UmVtaXNzaW9uRm9ybUdyb3VwOiBBZGRSZXRyb1JlbWlzc2lvblJlcXVlc3QpIHtcblxuICAgIGlmICh0aGlzLnBheW1lbnRHcm91cCAhPSBudWxsKSB7XG5cbiAgICAgIGNvbnN0IHJlbWlzc2lvbjogSVJlbWlzc2lvbiA9IHtcblxuICAgICAgICByZW1pc3Npb25fcmVmZXJlbmNlOiBudWxsLFxuICAgICAgICBod2ZfcmVmZXJlbmNlOiBjdXJyZW50UmVtaXNzaW9uRm9ybUdyb3VwLmh3Zl9yZWZlcmVuY2UsXG4gICAgICAgIGh3Zl9hbW91bnQ6IGN1cnJlbnRSZW1pc3Npb25Gb3JtR3JvdXAuaHdmX2Ftb3VudCxcbiAgICAgICAgYmVuZWZpY2lhcnlfbmFtZTogbnVsbCxcbiAgICAgICAgY2NkX2Nhc2VfbnVtYmVyOiBudWxsLFxuICAgICAgICBmZWVfY29kZTogbnVsbCxcbiAgICAgICAgZGF0ZV9jcmVhdGVkOiBudWxsLFxuICAgICAgICBmZWVfaWQ6IG51bGwsXG4gICAgICAgIGlzc3VlX3JlZnVuZF9hZGRfcmVmdW5kX2FkZF9yZW1pc3Npb246IGZhbHNlLFxuICAgICAgICBhZGRfcmVmdW5kOiBmYWxzZSxcbiAgICAgICAgb3ZlcmFsbF9iYWxhbmNlOmN1cnJlbnRSZW1pc3Npb25Gb3JtR3JvdXAuaHdmX2Ftb3VudCxcbiAgICAgICAgYWNvbGxlY3Rpb25fb2ZfZmVzczogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHRoaXMucGF5bWVudEdyb3VwLnJlbWlzc2lvbnMucHVzaChyZW1pc3Npb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgcGF5bWVudEdyb3VwIGZvciB0aGUgYWRkIHJlbWlzc2lvbiBqb3VybmV5LlxuICAgKiBAcGFyYW0gdXBkYXRlZFBheW1lbnRHcm91cCB0aGlzIGlzIGFuIHVwZGF0ZWQgcGF5bWVudEdyb3VwIHZlcnNpb24uXG4gICAqL1xuICBhZGRQYXltZW50R3JvdXAodXBkYXRlZFBheW1lbnRHcm91cDpJUGF5bWVudEdyb3VwKXtcbiAgICBpZiAodGhpcy5wYXltZW50R3JvdXAgPT0gbnVsbCl7XG4gICAgICAgIHRoaXMucGF5bWVudEdyb3VwID0gdXBkYXRlZFBheW1lbnRHcm91cDtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCByZW1pc3Npb24gYW1vdW50IGZvciB0aGUgY3VycmVudCBwYXltZW50IGdyb3VwLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHBheW1lbnQgZ3JvdXAgY29udGFpbnMgYW55IHJlbWlzc2lvbnMgYW5kLCBpZiBzbyxcbiAgICogc3VtcyB1cCB0aGUgYGh3Zl9hbW91bnRgIG9mIGFsbCByZW1pc3Npb25zIHVzaW5nIHRoZSBgcmVkdWNlKClgIG1ldGhvZC5cbiAgICogSWYgbm8gcmVtaXNzaW9ucyBhcmUgZm91bmQsIGl0IHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIG9mIDAuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB0b3RhbCByZW1pc3Npb24gYW1vdW50LCBvciAwIGlmIG5vIHJlbWlzc2lvbnMgYXJlIHByZXNlbnQuXG4gICAqL1xuXG4gIGdldFRvdGFsUmVtaXNzaW9uKCk6IG51bWJlciB7XG4gICAgbGV0IHJlbWlzc2lvblRvdGFsID0gMDtcbiAgICBpZiAodGhpcy5wYXltZW50R3JvdXAucmVtaXNzaW9ucykge1xuICAgICAgcmVtaXNzaW9uVG90YWwgPSB0aGlzLnBheW1lbnRHcm91cC5yZW1pc3Npb25zLnJlZHVjZSgodG90YWxSZW1pc3Npb24sIHJlbWlzc2lvbikgPT4gdG90YWxSZW1pc3Npb24gKyByZW1pc3Npb24uaHdmX2Ftb3VudCwgMCk7XG4gICAgfVxuICAgIHJldHVybiByZW1pc3Npb25Ub3RhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCBmZWUgYW1vdW50IGZvciB0aGUgY3VycmVudCBwYXltZW50IGdyb3VwLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHBheW1lbnQgZ3JvdXAgY29udGFpbnMgYW55IGZlZXMgYW5kLCBpZiBzbyxcbiAgICogc3VtcyB1cCB0aGUgYGNhbGN1bGF0ZWRfYW1vdW50YCBvZiBhbGwgZmVlcyB1c2luZyB0aGUgYHJlZHVjZSgpYCBtZXRob2QuXG4gICAqIElmIG5vIGZlZXMgYXJlIGZvdW5kLCBpdCByZXR1cm5zIGEgZGVmYXVsdCB2YWx1ZSBvZiAwLlxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgdG90YWwgZmVlIGFtb3VudCwgb3IgMCBpZiBubyBmZWVzIGFyZSBwcmVzZW50LlxuICAgKi9cbiAgZ2V0VG90YWxGZWVzKCk6IG51bWJlciB7XG4gICAgbGV0IGZlZXNUb3RhbCA9IDA7XG4gICAgaWYgKHRoaXMucGF5bWVudEdyb3VwLmZlZXMpIHtcbiAgICAgIGZlZXNUb3RhbCA9IHRoaXMucGF5bWVudEdyb3VwLmZlZXMucmVkdWNlKCh0b3RhbEZlZXMsIGZlZSkgPT4gdG90YWxGZWVzICsgZmVlLmNhbGN1bGF0ZWRfYW1vdW50LCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlZXNUb3RhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCBwYXltZW50IGFtb3VudCBmb3IgdGhlIGN1cnJlbnQgcGF5bWVudCBncm91cC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBwYXltZW50IGdyb3VwIGNvbnRhaW5zIGFueSBwYXltZW50cyBhbmQsIGlmIHNvLFxuICAgKiBzdW1zIHVwIHRoZSBgYW1vdW50YCBvZiBhbGwgcGF5bWVudHMgdXNpbmcgdGhlIGByZWR1Y2UoKWAgbWV0aG9kLlxuICAgKiBJZiBubyBwYXltZW50cyBhcmUgZm91bmQsIGl0IHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIG9mIDAuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB0b3RhbCBwYXltZW50IGFtb3VudCwgb3IgMCBpZiBubyBwYXltZW50cyBhcmUgcHJlc2VudC5cbiAgICovXG4gIGdldFRvdGFsUGF5bWVudHMoKTogbnVtYmVyIHtcbiAgICBsZXQgcGF5bWVudHNUb3RhbCA9IDA7XG4gICAgaWYgKHRoaXMucGF5bWVudEdyb3VwLnBheW1lbnRzKSB7XG4gICAgICBwYXltZW50c1RvdGFsID0gdGhpcy5wYXltZW50R3JvdXAucGF5bWVudHMucmVkdWNlKCh0b3RhbEZlZXMsIHBheW1lbnQpID0+IHRvdGFsRmVlcyArIHBheW1lbnQuYW1vdW50LCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHBheW1lbnRzVG90YWw7XG4gIH1cblxuXG4gIC8vIFJlZnVuZHMgbGlicyBzZWN0aW9uLlxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZmluZCBvdXQgaWYgdGhlIGN1cnJlbnQgcmVmdW5kcyBsaXN0IGFyZSBpbiBwcm9ncmVzcyBmb3IgdGhlIGZlZSBwYXNzZWQgYXMgcGFyYW1ldGVyXG4gICAqIEBwYXJhbSBmZWUgdGhpcyBpcyB0aGUgZmVlIHVzZWQgdG8gZmluZCBvdXQgaWYgdGhlIHJlZnVuZHMgYXJlIGluIHByb2dyZXNzLlxuICAgKi9cbiAgaXNUaGVDdXJyZW50UmVmdW5kSW5Qcm9jZXNzRm9yVGhpc0ZlZShmZWU6IElGZWUpOiBib29sZWFue1xuICAgIC8vIE5vIHJlZnVuZHNcbiAgICBpZiAodGhpcy5yZWZ1bmRzID09IG51bGwgfHwgdGhpcy5yZWZ1bmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuaXNUaGVDdXJyZW50UmVmdW5kUmVqZWN0ZWRGb3JUaGVGZWUoZmVlLmlkLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmaW5kIG91dCBpZiBpbiBjdXJyZW50IGxpc3Qgb2YgcmVmdW5kcyBhbGwgcmVmdW5kcyBoYXMgYmVlbiByZWplY3RlZFxuICAgKiBmb3IgdGhlIGZlZSBwYXNzZWQgYXMgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gZmVlQ29kZSB0aGlzIGlzIHRoZSBmZWUgY29kZSB1c2VkIHRvIGZpbmQgb3V0IGFsbCByZWZ1bmRzIHJlamVjdGVkIHJlZnVuZHMuXG4gICAqL1xuICBpc1RoZUN1cnJlbnRSZWZ1bmRSZWplY3RlZEZvclRoZUZlZShmZWVDb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGxldCByZWZ1bmRzQnlGZWUgPSB0aGlzLnJlZnVuZHMuZmlsdGVyKHJlZnVuZCA9PiByZWZ1bmQuZmVlX2lkcyA9PT0gZmVlQ29kZSk7XG4gICAgbGV0IHJlZnVuZHNCeUZlZUFuZFJlamVjdGVkID0gdGhpcy5yZWZ1bmRzLmZpbHRlcihyZWZ1bmQgPT4gcmVmdW5kLnJlZnVuZF9zdGF0dXMubmFtZSA9PT0gJ1JlamVjdGVkJyk7XG5cbiAgICAvLyBSZWZ1bmRzID4gMCAgYW5kIG92ZXJQYXltZW50IC0tPiByZWZ1bmRzIGluIHByb2Nlc3Mgb3IgUmVqZWN0ZWQuXG4gICAgaWYgKHJlZnVuZHNCeUZlZS5sZW5ndGggPT09IHJlZnVuZHNCeUZlZUFuZFJlamVjdGVkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJvdW5kcyB2ZXJ5IHNtYWxsIHZhbHVlcyB0byB6ZXJvIGlmIHRoZXkgZmFsbCBiZWxvdyBhIHNwZWNpZmllZCB0aHJlc2hvbGQuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBlbGltaW5hdGluZyBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gZXJyb3JzIHRoYXQgcmVzdWx0IGluXG4gICAqIGV4dHJlbWVseSBzbWFsbCBub24temVybyB2YWx1ZXMgKGUuZy4sIDEuMTM2ODY4Mzc3MjE2MTYwM2UtMTMpIHdoaWNoIHNob3VsZFxuICAgKiBsb2dpY2FsbHkgYmUgdHJlYXRlZCBhcyB6ZXJvLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbnVtZXJpYyB2YWx1ZSB0byBldmFsdWF0ZSBhbmQgcG90ZW50aWFsbHkgcm91bmQuXG4gICAqIEBwYXJhbSB0aHJlc2hvbGQgLSBUaGUgbWluaW11bSBhYnNvbHV0ZSB2YWx1ZSBjb25zaWRlcmVkIHNpZ25pZmljYW50LiBEZWZhdWx0cyB0byAxZS0xMC5cbiAgICogQHJldHVybnMgVGhlIG9yaWdpbmFsIHZhbHVlIGlmIGl0J3MgYWJvdmUgdGhlIHRocmVzaG9sZCwgb3IgMCBpZiBpdCdzIGJlbG93LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiByb3VuZFRpbnlWYWx1ZSgxLjEzNjg2ODM3NzIxNjE2MDNlLTEzKTsgLy8gcmV0dXJucyAwXG4gICAqIHJvdW5kVGlueVZhbHVlKDAuMDAwMDEpOyAvLyByZXR1cm5zIDAuMDAwMDFcbiAgICovXG4gIHJvdW5kVGlueVZhbHVlKHZhbHVlOiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyID0gMWUtNCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlKSA8IHRocmVzaG9sZCA/IDAgOiB2YWx1ZTtcbiAgfVxuXG5cbiAgZ2V0Um91bmRlZE92ZXJQYXltZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucm91bmRUaW55VmFsdWUodGhpcy5vdmVyUGF5bWVudEFtb3VudCk7XG4gIH1cbn1cblxuXG5cbiJdfQ==