tango-app-ui-manage-settings 3.0.65-dev → 3.3.0-alpha.0

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 (46) hide show
  1. package/esm2022/lib/components/configurations/configurations.component.mjs +1 -3
  2. package/esm2022/lib/components/configurations/feature-configuration/feature-configuration.component.mjs +3 -5
  3. package/esm2022/lib/components/payments-subscription/billing/billing-group-form/billing-group-form.component.mjs +448 -0
  4. package/esm2022/lib/components/payments-subscription/billing/billing-group-view/billing-group-view.component.mjs +20 -0
  5. package/esm2022/lib/components/payments-subscription/billing/billing.component.mjs +200 -0
  6. package/esm2022/lib/components/payments-subscription/billing/request-confirmation/request-confirmation.component.mjs +22 -0
  7. package/esm2022/lib/components/payments-subscription/invoice-credits/invoice-credits.component.mjs +340 -0
  8. package/esm2022/lib/components/payments-subscription/invoice-credits/paynow/paynow.component.mjs +127 -0
  9. package/esm2022/lib/components/payments-subscription/payments-subscription.component.mjs +61 -14
  10. package/esm2022/lib/components/payments-subscription/request-popups/starttrailrequest/starttrailrequest.component.mjs +25 -0
  11. package/esm2022/lib/components/payments-subscription/request-popups/subscribe-request/subscribe-request.component.mjs +25 -0
  12. package/esm2022/lib/components/payments-subscription/subscription-popups/credit-note/credit-note.component.mjs +9 -3
  13. package/esm2022/lib/components/payments-subscription/subscription-popups/multidropdown/multidropdown.component.mjs +6 -6
  14. package/esm2022/lib/components/payments-subscription/subscription-popups/needhelp/needhelp.component.mjs +23 -0
  15. package/esm2022/lib/components/payments-subscription/subscription-popups/unsubscribe-request/unsubscribe-request.component.mjs +8 -5
  16. package/esm2022/lib/components/payments-subscription/subscription-popups/unsubscribeproduct/unsubscribeproduct.component.mjs +27 -0
  17. package/esm2022/lib/components/payments-subscription/subscription-popups/upgrade-plan/upgrade-plan.component.mjs +336 -8
  18. package/esm2022/lib/components/payments-subscription/subscription-popups/viewstores/viewstores.component.mjs +299 -0
  19. package/esm2022/lib/components/tango-manage-settings/tango-manage-settings.component.mjs +313 -11
  20. package/esm2022/lib/services/payment-subscription.service.mjs +64 -3
  21. package/esm2022/lib/services/util.mjs +46 -0
  22. package/esm2022/lib/tango-manage-settings.module.mjs +48 -3
  23. package/fesm2022/tango-app-ui-manage-settings.mjs +4050 -1761
  24. package/fesm2022/tango-app-ui-manage-settings.mjs.map +1 -1
  25. package/lib/components/activity-logs/activity-logs.component.d.ts +1 -1
  26. package/lib/components/contact-directory/contact-directory.component.d.ts +1 -1
  27. package/lib/components/payments-subscription/billing/billing-group-form/billing-group-form.component.d.ts +65 -0
  28. package/lib/components/payments-subscription/billing/billing-group-view/billing-group-view.component.d.ts +9 -0
  29. package/lib/components/payments-subscription/billing/billing.component.d.ts +42 -0
  30. package/lib/components/payments-subscription/billing/request-confirmation/request-confirmation.component.d.ts +10 -0
  31. package/lib/components/payments-subscription/invoice-credits/invoice-credits.component.d.ts +80 -0
  32. package/lib/components/payments-subscription/invoice-credits/paynow/paynow.component.d.ts +29 -0
  33. package/lib/components/payments-subscription/payments-subscription.component.d.ts +8 -0
  34. package/lib/components/payments-subscription/request-popups/starttrailrequest/starttrailrequest.component.d.ts +11 -0
  35. package/lib/components/payments-subscription/request-popups/subscribe-request/subscribe-request.component.d.ts +11 -0
  36. package/lib/components/payments-subscription/subscription-popups/credit-note/credit-note.component.d.ts +3 -1
  37. package/lib/components/payments-subscription/subscription-popups/needhelp/needhelp.component.d.ts +10 -0
  38. package/lib/components/payments-subscription/subscription-popups/unsubscribe-request/unsubscribe-request.component.d.ts +3 -2
  39. package/lib/components/payments-subscription/subscription-popups/unsubscribeproduct/unsubscribeproduct.component.d.ts +13 -0
  40. package/lib/components/payments-subscription/subscription-popups/upgrade-plan/upgrade-plan.component.d.ts +43 -1
  41. package/lib/components/payments-subscription/subscription-popups/viewstores/viewstores.component.d.ts +44 -0
  42. package/lib/components/tango-manage-settings/tango-manage-settings.component.d.ts +35 -4
  43. package/lib/services/payment-subscription.service.d.ts +21 -0
  44. package/lib/services/util.d.ts +14 -0
  45. package/lib/tango-manage-settings.module.d.ts +23 -12
  46. package/package.json +1 -1
@@ -0,0 +1,340 @@
1
+ import { Component } from '@angular/core';
2
+ import { BehaviorSubject, takeUntil, Subject, debounceTime, distinctUntilChanged } from 'rxjs';
3
+ import dayjs from "dayjs";
4
+ import { FormControl } from '@angular/forms';
5
+ import { PaynowComponent } from './paynow/paynow.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../../services/client-api.service";
8
+ import * as i2 from "../../../services/payment-subscription.service";
9
+ import * as i3 from "@ng-bootstrap/ng-bootstrap";
10
+ import * as i4 from "@angular/common";
11
+ import * as i5 from "@angular/forms";
12
+ import * as i6 from "tango-app-ui-shared";
13
+ export class InvoiceCreditsComponent {
14
+ clientService;
15
+ paymentService;
16
+ modalService;
17
+ selectedTab = 'invoice';
18
+ invoiceList;
19
+ transactionList;
20
+ invoiceListApiState = new BehaviorSubject('initial');
21
+ transactionListApiState = new BehaviorSubject('initial');
22
+ clientId;
23
+ destroy$ = new Subject();
24
+ invoiceExpandedRowIndex;
25
+ dayjs = dayjs;
26
+ invoiceFilterObject = [
27
+ { Description: 'Duration', type: 'single', Issues: [{ id: 'current', text: "Current Month" }, { id: 'prev', text: "Previous Month" }, { id: 'last', text: "Last 3 Months" }] },
28
+ ];
29
+ transactionFilterObject = [
30
+ { Description: 'Duration', type: 'single', Issues: [{ id: 'current', text: "Current Month" }, { id: 'prev', text: "Previous Month" }, { id: 'last', text: "Last 3 Months" }] },
31
+ ];
32
+ // pagination variables
33
+ invoiceItemsPerPage = 10;
34
+ invoiceCurrentPage = 1;
35
+ invoiceTotalItems = 0;
36
+ invoicePaginationSizes = [10, 20, 30];
37
+ invoicePageSize = 10;
38
+ invoiceSearchControl = new FormControl();
39
+ invoiceSearchTerm;
40
+ invoiceSortedColumn;
41
+ invoiceSortDirection;
42
+ invoiceFilter = 'last';
43
+ transactionItemsPerPage = 10;
44
+ transactionCurrentPage = 1;
45
+ transactionTotalItems = 0;
46
+ transactionPaginationSizes = [10, 20, 30];
47
+ transactionPageSize = 10;
48
+ transactionSearchControl = new FormControl();
49
+ transactionSearchTerm;
50
+ transactionSortedColumn;
51
+ transactionSortDirection;
52
+ transactionFilter = 'last';
53
+ constructor(clientService, paymentService, modalService) {
54
+ this.clientService = clientService;
55
+ this.paymentService = paymentService;
56
+ this.modalService = modalService;
57
+ this.clientService.clientId.pipe(takeUntil(this.destroy$)).subscribe((e) => {
58
+ if (e) {
59
+ this.clientId = e;
60
+ this.getInvoiceList();
61
+ }
62
+ });
63
+ this.invoiceSearchControl.valueChanges.pipe(takeUntil(this.destroy$)).pipe(debounceTime(1000), distinctUntilChanged()).subscribe((e) => {
64
+ this.invoiceSearchTerm = e;
65
+ this.getInvoiceList();
66
+ });
67
+ this.transactionSearchControl.valueChanges.pipe(takeUntil(this.destroy$)).pipe(debounceTime(1000), distinctUntilChanged()).subscribe((e) => {
68
+ this.transactionSearchTerm = e;
69
+ this.getTransactionList();
70
+ });
71
+ }
72
+ ngOnDestroy() {
73
+ this.destroy$.next(true);
74
+ this.destroy$.complete();
75
+ }
76
+ changeTab(selectedTab) {
77
+ this.selectedTab = selectedTab;
78
+ if (selectedTab === 'invoice') {
79
+ this.getInvoiceList();
80
+ }
81
+ else if (selectedTab === 'credit-transactions') {
82
+ this.getTransactionList();
83
+ }
84
+ }
85
+ showProduct(data) {
86
+ return data.slice(2 - data.length).map((str) => {
87
+ const match = str.match(/[A-Z][a-z]*$/);
88
+ return match ? match[0] : str;
89
+ });
90
+ }
91
+ onInvoicePageChange(event) {
92
+ this.invoiceCurrentPage = event;
93
+ this.getInvoiceList();
94
+ }
95
+ onTransactionPageChange(event) {
96
+ this.transactionCurrentPage = event;
97
+ this.getTransactionList();
98
+ }
99
+ oninvoicePageSizeChange(event) {
100
+ this.invoiceCurrentPage = 1;
101
+ this.invoicePageSize = event;
102
+ this.invoiceItemsPerPage = event;
103
+ this.getInvoiceList();
104
+ }
105
+ onTransactionPageSizeChange(event) {
106
+ this.transactionCurrentPage = 1;
107
+ this.transactionPageSize = event;
108
+ this.transactionItemsPerPage = event;
109
+ this.getTransactionList();
110
+ }
111
+ onInvoiceSort(column) {
112
+ if (this.invoiceSortedColumn === column) {
113
+ this.invoiceSortDirection = this.invoiceSortDirection === 1 ? -1 : 1;
114
+ }
115
+ else {
116
+ this.invoiceSortedColumn = column;
117
+ this.invoiceSortDirection = 1;
118
+ }
119
+ this.getInvoiceList();
120
+ }
121
+ onTransactionSort(column) {
122
+ if (this.transactionSortedColumn === column) {
123
+ this.transactionSortDirection = this.transactionSortDirection === 1 ? -1 : 1;
124
+ }
125
+ else {
126
+ this.transactionSortedColumn = column;
127
+ this.transactionSortDirection = 1;
128
+ }
129
+ this.getTransactionList();
130
+ }
131
+ getInvoiceList() {
132
+ this.invoiceListApiState.next('loading');
133
+ const data = {
134
+ "limit": this.invoicePageSize,
135
+ "offset": this.invoiceCurrentPage,
136
+ "clientId": this.clientId,
137
+ "sortColumn": this.invoiceSortedColumn,
138
+ "sortBy": this.invoiceSortDirection,
139
+ "searchValue": this.invoiceSearchTerm,
140
+ "filter": this.invoiceFilter,
141
+ };
142
+ for (const key in data) {
143
+ if (data.hasOwnProperty(key)) {
144
+ if (data[key] === undefined || data[key] === '') {
145
+ delete data[key];
146
+ }
147
+ if (Array.isArray(data[key])) {
148
+ if (!data[key].length) {
149
+ delete data[key];
150
+ }
151
+ }
152
+ }
153
+ }
154
+ this.paymentService.getInvoiceList(data).pipe(takeUntil(this.destroy$)).subscribe({
155
+ next: (res) => {
156
+ this.invoiceListApiState.next('loaded');
157
+ this.invoiceExpandedRowIndex = null;
158
+ if (res?.data?.pageInfo?.count) {
159
+ this.invoiceTotalItems = res.data.pageInfo.count;
160
+ }
161
+ else {
162
+ this.invoiceTotalItems = 0;
163
+ }
164
+ if (res?.data?.data) {
165
+ this.invoiceList = res.data.data;
166
+ }
167
+ else {
168
+ this.invoiceList = [];
169
+ }
170
+ },
171
+ error: (e) => {
172
+ console.log(e);
173
+ }
174
+ });
175
+ }
176
+ getTransactionList() {
177
+ this.transactionListApiState.next('loading');
178
+ const data = {
179
+ "limit": this.transactionPageSize,
180
+ "offset": this.transactionCurrentPage,
181
+ "clientId": this.clientId,
182
+ "sortColumn": this.transactionSortedColumn,
183
+ "sortBy": this.transactionSortDirection,
184
+ "searchValue": this.transactionSearchTerm,
185
+ "filter": this.transactionFilter,
186
+ };
187
+ for (const key in data) {
188
+ if (data.hasOwnProperty(key)) {
189
+ if (data[key] === undefined || data[key] === '') {
190
+ delete data[key];
191
+ }
192
+ if (Array.isArray(data[key])) {
193
+ if (!data[key].length) {
194
+ delete data[key];
195
+ }
196
+ }
197
+ }
198
+ }
199
+ this.paymentService.getTransactionList(data).pipe(takeUntil(this.destroy$)).subscribe({
200
+ next: (res) => {
201
+ this.transactionListApiState.next('loaded');
202
+ if (res?.data?.pageInfo?.count) {
203
+ this.transactionTotalItems = res.data.pageInfo.count;
204
+ }
205
+ else {
206
+ this.transactionTotalItems = 0;
207
+ }
208
+ if (res?.data?.data) {
209
+ this.transactionList = res.data.data;
210
+ }
211
+ else {
212
+ this.transactionList = [];
213
+ }
214
+ },
215
+ error: (e) => {
216
+ console.log(e);
217
+ }
218
+ });
219
+ }
220
+ onInvoiceListExport() {
221
+ this.invoiceListApiState.next('loading');
222
+ const data = {
223
+ "limit": this.invoicePageSize,
224
+ "offset": this.invoiceCurrentPage,
225
+ "clientId": this.clientId,
226
+ "sortColumn": this.invoiceSortedColumn,
227
+ "sortBy": this.invoiceSortDirection,
228
+ "searchValue": this.invoiceSearchTerm,
229
+ "filter": this.invoiceFilter,
230
+ "isExport": true
231
+ };
232
+ for (const key in data) {
233
+ if (data.hasOwnProperty(key)) {
234
+ if (data[key] === undefined || data[key] === '') {
235
+ delete data[key];
236
+ }
237
+ if (Array.isArray(data[key])) {
238
+ if (!data[key].length) {
239
+ delete data[key];
240
+ }
241
+ }
242
+ }
243
+ }
244
+ this.paymentService.exportInvoiceList(data).pipe(takeUntil(this.destroy$)).subscribe({
245
+ next: (res) => {
246
+ this.invoiceListApiState.next('loaded');
247
+ this.paymentService.saveAsExcelFile(res, 'invoice');
248
+ },
249
+ error: (e) => {
250
+ console.log(e);
251
+ }
252
+ });
253
+ }
254
+ onTransactionListExport() {
255
+ this.invoiceListApiState.next('loading');
256
+ const data = {
257
+ "limit": this.transactionPageSize,
258
+ "offset": this.transactionCurrentPage,
259
+ "clientId": this.clientId,
260
+ "sortColumn": this.transactionSortedColumn,
261
+ "sortBy": this.transactionSortDirection,
262
+ "searchValue": this.transactionSearchTerm,
263
+ "filter": this.transactionFilter,
264
+ "isExport": true
265
+ };
266
+ for (const key in data) {
267
+ if (data.hasOwnProperty(key)) {
268
+ if (data[key] === undefined || data[key] === '') {
269
+ delete data[key];
270
+ }
271
+ if (Array.isArray(data[key])) {
272
+ if (!data[key].length) {
273
+ delete data[key];
274
+ }
275
+ }
276
+ }
277
+ }
278
+ this.paymentService.exportTransactionList(data).pipe(takeUntil(this.destroy$)).subscribe({
279
+ next: (res) => {
280
+ this.transactionListApiState.next('loaded');
281
+ this.paymentService.saveAsExcelFile(res, 'transaction');
282
+ },
283
+ error: (e) => {
284
+ console.log(e);
285
+ }
286
+ });
287
+ }
288
+ toggleRow(index) {
289
+ this.invoiceExpandedRowIndex = this.invoiceExpandedRowIndex === index ? null : index;
290
+ }
291
+ downloadInvoice(data) {
292
+ this.paymentService.invoiceDownload(data).subscribe((res) => {
293
+ if (res) {
294
+ const blob = new Blob([res], { type: 'application/pdf' });
295
+ const link = document.createElement('a');
296
+ link.href = window.URL.createObjectURL(blob);
297
+ link.target = '_blank';
298
+ link.click();
299
+ }
300
+ });
301
+ }
302
+ roundNumber(num) {
303
+ return Math.round(num);
304
+ }
305
+ payNow(invoice) {
306
+ const modalRef = this.modalService.open(PaynowComponent, { size: 'lg', centered: true });
307
+ modalRef.componentInstance.invoice = invoice;
308
+ modalRef.componentInstance.clientId = this.clientId;
309
+ modalRef.result.then((res) => {
310
+ this.getInvoiceList();
311
+ }).catch((err) => { this.getInvoiceList(); });
312
+ }
313
+ applyInvoiceFilters(event) {
314
+ if (event?.length) {
315
+ event.forEach((element) => {
316
+ if (element.Description === "Duration") {
317
+ this.invoiceFilter = element.Issues.id;
318
+ }
319
+ });
320
+ }
321
+ this.getInvoiceList();
322
+ }
323
+ applyTransactionFilters(event) {
324
+ if (event?.length) {
325
+ event.forEach((element) => {
326
+ if (element.Description === "Duration") {
327
+ this.transactionFilter = element.Issues.id;
328
+ }
329
+ });
330
+ }
331
+ this.getTransactionList();
332
+ }
333
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InvoiceCreditsComponent, deps: [{ token: i1.ClientApiService }, { token: i2.PaymentSubscriptionService }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
334
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: InvoiceCreditsComponent, selector: "lib-invoice-credits", ngImport: i0, template: "<div class=\"card-header paymenthistory border-0\">\r\n <div class=\"mt-4\">\r\n <button class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\r\n [ngClass]=\"selectedTab === 'invoice' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\" data-kt-plan=\"invoice\"\r\n (click)=\"changeTab('invoice')\">\r\n Invoice\r\n </button>\r\n\r\n <button class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3\"\r\n [ngClass]=\"selectedTab === 'credit-transactions' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\r\n data-kt-plan=\"credit-transactions\" (click)=\"changeTab('credit-transactions')\">\r\n Credit Transactions\r\n </button>\r\n </div>\r\n\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div [ngClass]=\"selectedTab === 'invoice' ? '' : 'd-none'\" class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n </rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input type=\"text\" [formControl]=\"invoiceSearchControl\" class=\"form-control ps-14 me-4 invoicesearch\" placeholder=\"Search...\"\r\n autocomplete=\"off\" />\r\n\r\n <div class=\"me-3 \">\r\n <div class=\"dropdown invheader\">\r\n <lib-filters [dataObject]=\"invoiceFilterObject\" (appliedFilters)=\"applyInvoiceFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <button (click)=\"onInvoiceListExport()\" type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader me-4\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg><span class=\"ms-2\"></span> Export</button>\r\n\r\n\r\n </div>\r\n <div [ngClass]=\"selectedTab === 'credit-transactions' ? '' : 'd-none'\" class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n </rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input type=\"text\" [formControl]=\"transactionSearchControl\" class=\"form-control ps-14 me-4 invoicesearch\" placeholder=\"Search...\"\r\n autocomplete=\"off\" />\r\n\r\n <div class=\"me-3 \">\r\n <div class=\"dropdown invheader\">\r\n <lib-filters [dataObject]=\"transactionFilterObject\" (appliedFilters)=\"applyTransactionFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <button (click)=\"onTransactionListExport()\" type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader me-4\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg><span class=\"ms-2\"></span> Export</button>\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div *ngIf=\"selectedTab === 'invoice'\">\r\n <ng-container *ngIf=\"(invoiceListApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"invoiceList?.length\">\r\n\r\n <div class=\"table-responsive\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table accordion table bottom-border invoivetable \">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Invoice #</span>\r\n </label>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Products</span>\r\n </label>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Billing date</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onInvoiceSort('billingDate')\"\r\n [ngClass]=\"invoiceSortedColumn === 'billingDate' && invoiceSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Amount</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onInvoiceSort('totalAmount')\"\r\n [ngClass]=\"invoiceSortedColumn === 'totalAmount' && invoiceSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Stores</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onInvoiceSort('stores')\"\r\n [ngClass]=\"invoiceSortedColumn === 'stores' && invoiceSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center justify-content-center\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Status</span>\r\n </label>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Actions</span>\r\n </label>\r\n \r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let invoiceGroup of invoiceList; let i = index\">\r\n <tr>\r\n <td>\r\n <div class=\"table-title invoice\">\r\n {{invoiceGroup?.summary}}\r\n </div>\r\n <span class=\"badge badge-light-success\"\r\n *ngIf=\"invoiceGroup?.paymentStatus === 'paid'\">Paid</span>\r\n <span class=\"badge badge-light-warning\"\r\n *ngIf=\"invoiceGroup?.paymentStatus === 'due'\">Due</span>\r\n <span class=\"badge badge-light-danger\"\r\n *ngIf=\"invoiceGroup?.paymentStatus === 'unpaid'\">Unpaid</span>\r\n </td>\r\n <td><span *ngFor=\"let product of invoiceGroup?.products; let i = index\">\r\n <span class=\"mt-4\" *ngIf=\"i<2\">\r\n <span class=\"badge product-traffic mx-1\"\r\n *ngIf=\"product === 'tangoTraffic'\">Traffic</span>\r\n <span class=\"badge product-zone mx-1\"\r\n *ngIf=\"product === 'tangoZone'\">Zone</span>\r\n <span class=\"badge product-sop mx-1\"\r\n *ngIf=\"product === 'tangoTrax'\">Trax</span>\r\n </span>\r\n </span><span class=\"productextend\" *ngIf=\"invoiceGroup?.products.length>2\"\r\n [ngbTooltip]=\"showProduct(invoiceGroup?.products)\">+{{invoiceGroup?.products.length\r\n - 2 }}</span></td>\r\n <td>\r\n <div class=\"table-title\">{{dayjs(invoiceGroup?.billingDate).format('DD MMM, YYYY')}} </div>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">\r\n <span *ngIf=\"invoiceGroup?.currency === 'inr'\">\u20B9 </span>\r\n <span *ngIf=\"invoiceGroup?.currency === 'dollar'\">$ </span>\r\n <ng-container *ngIf=\"invoiceGroup?.currency === 'inr'\" >{{roundNumber(invoiceGroup?.totalAmount).toLocaleString('en-IN')}}</ng-container>\r\n <ng-container *ngIf=\"invoiceGroup?.currency === 'dollar'\" >{{roundNumber(invoiceGroup?.totalAmount).toLocaleString('en-US')}}</ng-container>\r\n \r\n </div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"table-title\">{{invoiceGroup?.stores}} Stores</div>\r\n </td>\r\n <td style=\"text-align: center;\" >\r\n <a (click)=\"toggleRow(i)\" type=\"view\"\r\n class=\"btn update btn-lg btn-light btn-active-light-primary px-4 ng-star-inserted\"><span>View\r\n Details</span></a>\r\n </td>\r\n </tr>\r\n <ng-container *ngIf=\"invoiceExpandedRowIndex === i\">\r\n <tr *ngFor=\"let invoice of invoiceList?.[invoiceExpandedRowIndex]?.invoices\"\r\n class=\"invoicesubtab\">\r\n <td class=\"expanded-content\">\r\n <div class=\"table-title-primary invoice mb-2\">\r\n {{invoice?.invoice}}\r\n </div>\r\n <span class=\"badge badge-light-success\"\r\n *ngIf=\"['free','Payment Received'].includes(invoice?.status)\">{{invoice?.status\r\n | titlecase}}</span>\r\n <span class=\"badge badge-light-warning\"\r\n *ngIf=\"invoice?.status === 'trial'\">{{invoice?.status |\r\n titlecase}}</span>\r\n </td>\r\n <td><span *ngFor=\"let product of invoice?.products; let i = index\">\r\n <span class=\"mt-4\" *ngIf=\"i<2\">\r\n <span class=\"badge product-traffic mx-1\"\r\n *ngIf=\"product === 'tangoTraffic'\">Traffic</span>\r\n <span class=\"badge product-zone mx-1\"\r\n *ngIf=\"product === 'tangoZone'\">Zone</span>\r\n <span class=\"badge product-sop mx-1\"\r\n *ngIf=\"product === 'tangoTrax'\">Trax</span>\r\n </span>\r\n </span><span class=\"productextend\" *ngIf=\"invoice?.products.length>2\"\r\n [ngbTooltip]=\"showProduct(invoice.products)\">+{{invoice?.products.length\r\n - 2 }}</span></td>\r\n <td>\r\n <div class=\"table-title\">{{dayjs(invoice?.billingDate).format('DD MMM, YYYY')}} </div>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">\r\n <span *ngIf=\"invoice?.currency === 'inr'\">\u20B9 </span>\r\n <span *ngIf=\"invoice?.currency === 'dollar'\">$ </span>\r\n <ng-container *ngIf=\"invoice?.currency === 'inr'\" >{{roundNumber(invoice?.totalAmount).toLocaleString('en-IN')}}</ng-container>\r\n <ng-container *ngIf=\"invoice?.currency === 'dollar'\" >{{roundNumber(invoice?.totalAmount).toLocaleString('en-US')}}</ng-container>\r\n \r\n </div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"table-title\">{{invoice?.stores}} Stores</div>\r\n </td>\r\n <td scope=\"row\" style=\"text-align: center;\" >\r\n <span *ngIf=\"invoice.paymentStatus === 'paid'\" class=\"payment-success-badge\">Paid</span>\r\n <a (click)=\"payNow(invoice?.invoice)\" *ngIf=\"invoice.paymentStatus === 'due' || invoice.paymentStatus === 'unpaid'\" type=\"view\" class=\"btn btn-primary px-4 mt-3 cursor-pointer\"><span>Pay Now</span></a>\r\n </td>\r\n <td>\r\n <span (click)=\"downloadInvoice(invoice)\" class=\"cursor-pointer\"><svg class=\"mt-3\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n </td>\r\n\r\n </tr>\r\n </ng-container>\r\n\r\n </ng-container>\r\n\r\n </tbody>\r\n </table>\r\n <!-- </div> -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"my-3\">\r\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"invoiceItemsPerPage\"\r\n [currentPage]=\"invoiceCurrentPage\" [totalItems]=\"invoiceTotalItems\"\r\n [paginationSizes]=\"invoicePaginationSizes\" [pageSize]=\"invoicePageSize\"\r\n (pageChange)=\"onInvoicePageChange($event)\"\r\n (pageSizeChange)=\"oninvoicePageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!invoiceList?.length\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"(invoiceListApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n</div>\r\n\r\n<div *ngIf=\"selectedTab === 'credit-transactions'\">\r\n <ng-container *ngIf=\"(transactionListApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"transactionList?.length\">\r\n\r\n <div class=\"table-responsive\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table bottom-border invoivetable \">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Billing Date</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onTransactionSort('billingDate')\"\r\n [ngClass]=\"transactionSortedColumn === 'billingDate' && transactionSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Transaction</span>\r\n </label>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Debt</span>\r\n </label>\r\n <!-- <svg class=\"cursor-pointer\" (click)=\"onTransactionSort('amount')\"\r\n [ngClass]=\"transactionSortedColumn === 'amount' && transactionSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Credit</span>\r\n </label>\r\n <!-- <svg class=\"cursor-pointer\" (click)=\"onTransactionSort('amount')\"\r\n [ngClass]=\"transactionSortedColumn === 'amount' && transactionSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Balance credit</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onTransactionSort('balanceCredit')\"\r\n [ngClass]=\"transactionSortedColumn === 'balanceCredit' && transactionSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let transaction of transactionList\">\r\n <td>\r\n <div *ngIf=\"transaction?.billingDate\" class=\"table-title-primary invoice mb-2\">\r\n {{dayjs(transaction?.billingDate).format('DD MMM, YYYY')}}\r\n </div>\r\n </td>\r\n <td class=\"table-title\" >\r\n <span *ngIf=\"transaction?.transactionType === 'debt'\" >\r\n Consumption for {{dayjs(transaction?.billingDate).format('MMM YYYY')}} <ng-container *ngIf=\"transaction?.groupName\" >- {{transaction?.groupName}}</ng-container> \r\n </span>\r\n <span *ngIf=\"transaction?.transactionType === 'credit'\" >\r\n Paid Credit\r\n </span>\r\n </td>\r\n <td>\r\n <div *ngIf=\"transaction?.transactionType === 'debt'\" class=\"table-title debitvalue\">\r\n <span *ngIf=\"transaction?.currency === 'dollar'\">$ </span>\r\n <span *ngIf=\"transaction?.currency === 'inr'\">\u20B9 </span>\r\n <span *ngIf=\"transaction?.currency === 'dollar'\">{{transaction?.amount?.toLocaleString('en-US')}}</span>\r\n <span *ngIf=\"transaction?.currency === 'inr'\">{{transaction?.amount?.toLocaleString('en-IN')}}</span>\r\n </div>\r\n \r\n </td>\r\n <td>\r\n <div *ngIf=\"transaction?.transactionType === 'credit'\" class=\"table-title creditvalue\">\r\n <span *ngIf=\"transaction?.currency === 'dollar'\">$ </span>\r\n <span *ngIf=\"transaction?.currency === 'inr'\">\u20B9 </span>\r\n <span *ngIf=\"transaction?.currency === 'dollar'\">{{transaction?.amount?.toLocaleString('en-US')}}</span>\r\n <span *ngIf=\"transaction?.currency === 'inr'\">{{transaction?.amount?.toLocaleString('en-IN')}}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">\r\n <span *ngIf=\"transaction?.balanceCreditCurrency === 'dollar'\">$ </span>\r\n <span *ngIf=\"transaction?.balanceCreditCurrency === 'inr'\">\u20B9 </span>\r\n <span *ngIf=\"transaction?.balanceCreditCurrency === 'dollar'\">{{transaction?.balanceCredit?.toLocaleString('en-US')}}</span>\r\n <span *ngIf=\"transaction?.balanceCreditCurrency === 'inr'\">{{transaction?.balanceCredit?.toLocaleString('en-IN')}}</span>\r\n </div>\r\n </td>\r\n \r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n <div class=\"my-3\">\r\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"transactionItemsPerPage\"\r\n [currentPage]=\"transactionCurrentPage\" [totalItems]=\"transactionTotalItems\"\r\n [paginationSizes]=\"transactionPaginationSizes\" [pageSize]=\"transactionPageSize\"\r\n (pageChange)=\"onTransactionPageChange($event)\"\r\n (pageSizeChange)=\"onTransactionPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!transactionList?.length\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"(transactionListApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n</div>", styles: [".paymenthistory{padding:0px .25rem!important}.invoice{width:120%}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-size:14px;font-weight:500!important;line-height:20px}.activePlanBtnprimary{border-radius:6px;background:var(--Primary-50, #EAF8FF)!important;color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.activePlanBtn{border-radius:6px;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a!important;color:var(--Gray-700, #344054);font-size:14px!important;font-weight:500!important;line-height:20px}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .shimmer .image-card{height:90px;width:90px;float:right;border-radius:8px}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.invoivetable{overflow-x:scroll!important;overflow-y:scroll!important;width:110%!important}.viewdetails{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);background:var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;color:var(--Primary-700, #009BF3);padding:10px 16px;justify-content:center;align-items:center;gap:10px;font-size:12px;font-style:normal;font-weight:600;line-height:18px;text-transform:capitalize}.invoicesubtab{background:var(--Gray-50, #F9FAFB)}.form-control{display:block;padding:.5rem 1rem;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap}.outer-container .input-container input{all:unset;flex:1;min-width:50px;border:none!important}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.monthwidth{width:70%}.update{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px}.debitvalue{color:var(--Error-500, #F04438);font-size:14px;font-weight:500;line-height:20px}.creditvalue{color:var(--Success-500, #12B76A);font-size:14px;font-weight:500;line-height:20px}.table-title{line-height:3!important}.product-traffic{color:var(--Blue-700, #175CD3);text-align:center;font-family:Inter;font-size:12px;font-weight:500;border-radius:16px;background:var(--Blue-50, #EFF8FF)}.product-zone{border-radius:16px;background:var(--Indigo-50, #EEF4FF);padding:2px 8px;color:var(--Indigo-700, #3538CD);text-align:center;font-family:Inter;font-size:12px;font-weight:500}.product-sop{color:var(--Purple-700, #5925DC);text-align:center;font-family:Inter;font-size:12px;font-weight:500;border-radius:16px;background:var(--Purple-50, #F4F3FF)}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-weight:500!important;line-height:3!important}.rotate{rotate:180deg;transition:1s}td{vertical-align:middle}.payment-success-badge{padding:4px 12px;border-radius:16px;background:#ecfdf3;color:#027a48;font-size:14px;font-weight:500;line-height:20px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i6.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TitleCasePipe, name: "titlecase" }] });
335
+ }
336
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InvoiceCreditsComponent, decorators: [{
337
+ type: Component,
338
+ args: [{ selector: 'lib-invoice-credits', template: "<div class=\"card-header paymenthistory border-0\">\r\n <div class=\"mt-4\">\r\n <button class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\r\n [ngClass]=\"selectedTab === 'invoice' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\" data-kt-plan=\"invoice\"\r\n (click)=\"changeTab('invoice')\">\r\n Invoice\r\n </button>\r\n\r\n <button class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3\"\r\n [ngClass]=\"selectedTab === 'credit-transactions' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\r\n data-kt-plan=\"credit-transactions\" (click)=\"changeTab('credit-transactions')\">\r\n Credit Transactions\r\n </button>\r\n </div>\r\n\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div [ngClass]=\"selectedTab === 'invoice' ? '' : 'd-none'\" class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n </rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input type=\"text\" [formControl]=\"invoiceSearchControl\" class=\"form-control ps-14 me-4 invoicesearch\" placeholder=\"Search...\"\r\n autocomplete=\"off\" />\r\n\r\n <div class=\"me-3 \">\r\n <div class=\"dropdown invheader\">\r\n <lib-filters [dataObject]=\"invoiceFilterObject\" (appliedFilters)=\"applyInvoiceFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <button (click)=\"onInvoiceListExport()\" type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader me-4\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg><span class=\"ms-2\"></span> Export</button>\r\n\r\n\r\n </div>\r\n <div [ngClass]=\"selectedTab === 'credit-transactions' ? '' : 'd-none'\" class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n </rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input type=\"text\" [formControl]=\"transactionSearchControl\" class=\"form-control ps-14 me-4 invoicesearch\" placeholder=\"Search...\"\r\n autocomplete=\"off\" />\r\n\r\n <div class=\"me-3 \">\r\n <div class=\"dropdown invheader\">\r\n <lib-filters [dataObject]=\"transactionFilterObject\" (appliedFilters)=\"applyTransactionFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <button (click)=\"onTransactionListExport()\" type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader me-4\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg><span class=\"ms-2\"></span> Export</button>\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div *ngIf=\"selectedTab === 'invoice'\">\r\n <ng-container *ngIf=\"(invoiceListApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"invoiceList?.length\">\r\n\r\n <div class=\"table-responsive\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table accordion table bottom-border invoivetable \">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Invoice #</span>\r\n </label>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Products</span>\r\n </label>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Billing date</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onInvoiceSort('billingDate')\"\r\n [ngClass]=\"invoiceSortedColumn === 'billingDate' && invoiceSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Amount</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onInvoiceSort('totalAmount')\"\r\n [ngClass]=\"invoiceSortedColumn === 'totalAmount' && invoiceSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Stores</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onInvoiceSort('stores')\"\r\n [ngClass]=\"invoiceSortedColumn === 'stores' && invoiceSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center justify-content-center\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Status</span>\r\n </label>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Actions</span>\r\n </label>\r\n \r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let invoiceGroup of invoiceList; let i = index\">\r\n <tr>\r\n <td>\r\n <div class=\"table-title invoice\">\r\n {{invoiceGroup?.summary}}\r\n </div>\r\n <span class=\"badge badge-light-success\"\r\n *ngIf=\"invoiceGroup?.paymentStatus === 'paid'\">Paid</span>\r\n <span class=\"badge badge-light-warning\"\r\n *ngIf=\"invoiceGroup?.paymentStatus === 'due'\">Due</span>\r\n <span class=\"badge badge-light-danger\"\r\n *ngIf=\"invoiceGroup?.paymentStatus === 'unpaid'\">Unpaid</span>\r\n </td>\r\n <td><span *ngFor=\"let product of invoiceGroup?.products; let i = index\">\r\n <span class=\"mt-4\" *ngIf=\"i<2\">\r\n <span class=\"badge product-traffic mx-1\"\r\n *ngIf=\"product === 'tangoTraffic'\">Traffic</span>\r\n <span class=\"badge product-zone mx-1\"\r\n *ngIf=\"product === 'tangoZone'\">Zone</span>\r\n <span class=\"badge product-sop mx-1\"\r\n *ngIf=\"product === 'tangoTrax'\">Trax</span>\r\n </span>\r\n </span><span class=\"productextend\" *ngIf=\"invoiceGroup?.products.length>2\"\r\n [ngbTooltip]=\"showProduct(invoiceGroup?.products)\">+{{invoiceGroup?.products.length\r\n - 2 }}</span></td>\r\n <td>\r\n <div class=\"table-title\">{{dayjs(invoiceGroup?.billingDate).format('DD MMM, YYYY')}} </div>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">\r\n <span *ngIf=\"invoiceGroup?.currency === 'inr'\">\u20B9 </span>\r\n <span *ngIf=\"invoiceGroup?.currency === 'dollar'\">$ </span>\r\n <ng-container *ngIf=\"invoiceGroup?.currency === 'inr'\" >{{roundNumber(invoiceGroup?.totalAmount).toLocaleString('en-IN')}}</ng-container>\r\n <ng-container *ngIf=\"invoiceGroup?.currency === 'dollar'\" >{{roundNumber(invoiceGroup?.totalAmount).toLocaleString('en-US')}}</ng-container>\r\n \r\n </div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"table-title\">{{invoiceGroup?.stores}} Stores</div>\r\n </td>\r\n <td style=\"text-align: center;\" >\r\n <a (click)=\"toggleRow(i)\" type=\"view\"\r\n class=\"btn update btn-lg btn-light btn-active-light-primary px-4 ng-star-inserted\"><span>View\r\n Details</span></a>\r\n </td>\r\n </tr>\r\n <ng-container *ngIf=\"invoiceExpandedRowIndex === i\">\r\n <tr *ngFor=\"let invoice of invoiceList?.[invoiceExpandedRowIndex]?.invoices\"\r\n class=\"invoicesubtab\">\r\n <td class=\"expanded-content\">\r\n <div class=\"table-title-primary invoice mb-2\">\r\n {{invoice?.invoice}}\r\n </div>\r\n <span class=\"badge badge-light-success\"\r\n *ngIf=\"['free','Payment Received'].includes(invoice?.status)\">{{invoice?.status\r\n | titlecase}}</span>\r\n <span class=\"badge badge-light-warning\"\r\n *ngIf=\"invoice?.status === 'trial'\">{{invoice?.status |\r\n titlecase}}</span>\r\n </td>\r\n <td><span *ngFor=\"let product of invoice?.products; let i = index\">\r\n <span class=\"mt-4\" *ngIf=\"i<2\">\r\n <span class=\"badge product-traffic mx-1\"\r\n *ngIf=\"product === 'tangoTraffic'\">Traffic</span>\r\n <span class=\"badge product-zone mx-1\"\r\n *ngIf=\"product === 'tangoZone'\">Zone</span>\r\n <span class=\"badge product-sop mx-1\"\r\n *ngIf=\"product === 'tangoTrax'\">Trax</span>\r\n </span>\r\n </span><span class=\"productextend\" *ngIf=\"invoice?.products.length>2\"\r\n [ngbTooltip]=\"showProduct(invoice.products)\">+{{invoice?.products.length\r\n - 2 }}</span></td>\r\n <td>\r\n <div class=\"table-title\">{{dayjs(invoice?.billingDate).format('DD MMM, YYYY')}} </div>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">\r\n <span *ngIf=\"invoice?.currency === 'inr'\">\u20B9 </span>\r\n <span *ngIf=\"invoice?.currency === 'dollar'\">$ </span>\r\n <ng-container *ngIf=\"invoice?.currency === 'inr'\" >{{roundNumber(invoice?.totalAmount).toLocaleString('en-IN')}}</ng-container>\r\n <ng-container *ngIf=\"invoice?.currency === 'dollar'\" >{{roundNumber(invoice?.totalAmount).toLocaleString('en-US')}}</ng-container>\r\n \r\n </div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"table-title\">{{invoice?.stores}} Stores</div>\r\n </td>\r\n <td scope=\"row\" style=\"text-align: center;\" >\r\n <span *ngIf=\"invoice.paymentStatus === 'paid'\" class=\"payment-success-badge\">Paid</span>\r\n <a (click)=\"payNow(invoice?.invoice)\" *ngIf=\"invoice.paymentStatus === 'due' || invoice.paymentStatus === 'unpaid'\" type=\"view\" class=\"btn btn-primary px-4 mt-3 cursor-pointer\"><span>Pay Now</span></a>\r\n </td>\r\n <td>\r\n <span (click)=\"downloadInvoice(invoice)\" class=\"cursor-pointer\"><svg class=\"mt-3\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n </td>\r\n\r\n </tr>\r\n </ng-container>\r\n\r\n </ng-container>\r\n\r\n </tbody>\r\n </table>\r\n <!-- </div> -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"my-3\">\r\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"invoiceItemsPerPage\"\r\n [currentPage]=\"invoiceCurrentPage\" [totalItems]=\"invoiceTotalItems\"\r\n [paginationSizes]=\"invoicePaginationSizes\" [pageSize]=\"invoicePageSize\"\r\n (pageChange)=\"onInvoicePageChange($event)\"\r\n (pageSizeChange)=\"oninvoicePageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!invoiceList?.length\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"(invoiceListApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n</div>\r\n\r\n<div *ngIf=\"selectedTab === 'credit-transactions'\">\r\n <ng-container *ngIf=\"(transactionListApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"transactionList?.length\">\r\n\r\n <div class=\"table-responsive\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table bottom-border invoivetable \">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Billing Date</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onTransactionSort('billingDate')\"\r\n [ngClass]=\"transactionSortedColumn === 'billingDate' && transactionSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Transaction</span>\r\n </label>\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Debt</span>\r\n </label>\r\n <!-- <svg class=\"cursor-pointer\" (click)=\"onTransactionSort('amount')\"\r\n [ngClass]=\"transactionSortedColumn === 'amount' && transactionSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Credit</span>\r\n </label>\r\n <!-- <svg class=\"cursor-pointer\" (click)=\"onTransactionSort('amount')\"\r\n [ngClass]=\"transactionSortedColumn === 'amount' && transactionSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n </div>\r\n </th>\r\n <th scope=\"col\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"form-check-label me-2\" for=\"flexCheckDefault\">\r\n <span>Balance credit</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onTransactionSort('balanceCredit')\"\r\n [ngClass]=\"transactionSortedColumn === 'balanceCredit' && transactionSortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let transaction of transactionList\">\r\n <td>\r\n <div *ngIf=\"transaction?.billingDate\" class=\"table-title-primary invoice mb-2\">\r\n {{dayjs(transaction?.billingDate).format('DD MMM, YYYY')}}\r\n </div>\r\n </td>\r\n <td class=\"table-title\" >\r\n <span *ngIf=\"transaction?.transactionType === 'debt'\" >\r\n Consumption for {{dayjs(transaction?.billingDate).format('MMM YYYY')}} <ng-container *ngIf=\"transaction?.groupName\" >- {{transaction?.groupName}}</ng-container> \r\n </span>\r\n <span *ngIf=\"transaction?.transactionType === 'credit'\" >\r\n Paid Credit\r\n </span>\r\n </td>\r\n <td>\r\n <div *ngIf=\"transaction?.transactionType === 'debt'\" class=\"table-title debitvalue\">\r\n <span *ngIf=\"transaction?.currency === 'dollar'\">$ </span>\r\n <span *ngIf=\"transaction?.currency === 'inr'\">\u20B9 </span>\r\n <span *ngIf=\"transaction?.currency === 'dollar'\">{{transaction?.amount?.toLocaleString('en-US')}}</span>\r\n <span *ngIf=\"transaction?.currency === 'inr'\">{{transaction?.amount?.toLocaleString('en-IN')}}</span>\r\n </div>\r\n \r\n </td>\r\n <td>\r\n <div *ngIf=\"transaction?.transactionType === 'credit'\" class=\"table-title creditvalue\">\r\n <span *ngIf=\"transaction?.currency === 'dollar'\">$ </span>\r\n <span *ngIf=\"transaction?.currency === 'inr'\">\u20B9 </span>\r\n <span *ngIf=\"transaction?.currency === 'dollar'\">{{transaction?.amount?.toLocaleString('en-US')}}</span>\r\n <span *ngIf=\"transaction?.currency === 'inr'\">{{transaction?.amount?.toLocaleString('en-IN')}}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">\r\n <span *ngIf=\"transaction?.balanceCreditCurrency === 'dollar'\">$ </span>\r\n <span *ngIf=\"transaction?.balanceCreditCurrency === 'inr'\">\u20B9 </span>\r\n <span *ngIf=\"transaction?.balanceCreditCurrency === 'dollar'\">{{transaction?.balanceCredit?.toLocaleString('en-US')}}</span>\r\n <span *ngIf=\"transaction?.balanceCreditCurrency === 'inr'\">{{transaction?.balanceCredit?.toLocaleString('en-IN')}}</span>\r\n </div>\r\n </td>\r\n \r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n <div class=\"my-3\">\r\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"transactionItemsPerPage\"\r\n [currentPage]=\"transactionCurrentPage\" [totalItems]=\"transactionTotalItems\"\r\n [paginationSizes]=\"transactionPaginationSizes\" [pageSize]=\"transactionPageSize\"\r\n (pageChange)=\"onTransactionPageChange($event)\"\r\n (pageSizeChange)=\"onTransactionPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!transactionList?.length\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"(transactionListApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n</div>", styles: [".paymenthistory{padding:0px .25rem!important}.invoice{width:120%}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-size:14px;font-weight:500!important;line-height:20px}.activePlanBtnprimary{border-radius:6px;background:var(--Primary-50, #EAF8FF)!important;color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.activePlanBtn{border-radius:6px;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a!important;color:var(--Gray-700, #344054);font-size:14px!important;font-weight:500!important;line-height:20px}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .shimmer .image-card{height:90px;width:90px;float:right;border-radius:8px}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.invoivetable{overflow-x:scroll!important;overflow-y:scroll!important;width:110%!important}.viewdetails{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);background:var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;color:var(--Primary-700, #009BF3);padding:10px 16px;justify-content:center;align-items:center;gap:10px;font-size:12px;font-style:normal;font-weight:600;line-height:18px;text-transform:capitalize}.invoicesubtab{background:var(--Gray-50, #F9FAFB)}.form-control{display:block;padding:.5rem 1rem;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap}.outer-container .input-container input{all:unset;flex:1;min-width:50px;border:none!important}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.monthwidth{width:70%}.update{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px}.debitvalue{color:var(--Error-500, #F04438);font-size:14px;font-weight:500;line-height:20px}.creditvalue{color:var(--Success-500, #12B76A);font-size:14px;font-weight:500;line-height:20px}.table-title{line-height:3!important}.product-traffic{color:var(--Blue-700, #175CD3);text-align:center;font-family:Inter;font-size:12px;font-weight:500;border-radius:16px;background:var(--Blue-50, #EFF8FF)}.product-zone{border-radius:16px;background:var(--Indigo-50, #EEF4FF);padding:2px 8px;color:var(--Indigo-700, #3538CD);text-align:center;font-family:Inter;font-size:12px;font-weight:500}.product-sop{color:var(--Purple-700, #5925DC);text-align:center;font-family:Inter;font-size:12px;font-weight:500;border-radius:16px;background:var(--Purple-50, #F4F3FF)}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-weight:500!important;line-height:3!important}.rotate{rotate:180deg;transition:1s}td{vertical-align:middle}.payment-success-badge{padding:4px 12px;border-radius:16px;background:#ecfdf3;color:#027a48;font-size:14px;font-weight:500;line-height:20px}\n"] }]
339
+ }], ctorParameters: () => [{ type: i1.ClientApiService }, { type: i2.PaymentSubscriptionService }, { type: i3.NgbModal }] });
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2ljZS1jcmVkaXRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1zZXR0aW5ncy9zcmMvbGliL2NvbXBvbmVudHMvcGF5bWVudHMtc3Vic2NyaXB0aW9uL2ludm9pY2UtY3JlZGl0cy9pbnZvaWNlLWNyZWRpdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLXNldHRpbmdzL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50cy1zdWJzY3JpcHRpb24vaW52b2ljZS1jcmVkaXRzL2ludm9pY2UtY3JlZGl0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHL0YsT0FBUSxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzNCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7O0FBUzVELE1BQU0sT0FBTyx1QkFBdUI7SUE2Q2Q7SUFBeUM7SUFBb0Q7SUEzQ2pILFdBQVcsR0FBc0MsU0FBUyxDQUFBO0lBQzFELFdBQVcsQ0FBTztJQUNsQixlQUFlLENBQU87SUFDdEIsbUJBQW1CLEdBQUcsSUFBSSxlQUFlLENBQW1DLFNBQVMsQ0FBQyxDQUFBO0lBQ3RGLHVCQUF1QixHQUFHLElBQUksZUFBZSxDQUFtQyxTQUFTLENBQUMsQ0FBQTtJQUMxRixRQUFRLENBQVE7SUFDQyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUMxQyx1QkFBdUIsQ0FBSztJ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QUFFO1lBQ2pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDN0IsSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLFVBQVUsRUFBRTtvQkFDdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztpQkFDeEM7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO1FBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBRXZCLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxLQUFTO1FBQy9CLElBQUksS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUNqQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQzdCLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUU7b0JBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztpQkFDNUM7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7SUFFM0IsQ0FBQzt3R0FsWFUsdUJBQXVCOzRGQUF2Qix1QkFBdUIsMkRDaEJwQyxxMm9DQTRnQk07OzRGRDVmTyx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCB0YWtlVW50aWwsIFN1YmplY3QsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ2xpZW50QXBpU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NsaWVudC1hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IFBheW1lbnRTdWJzY3JpcHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGF5bWVudC1zdWJzY3JpcHRpb24uc2VydmljZSc7XHJcbmltcG9ydCAgZGF5anMgZnJvbSBcImRheWpzXCI7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgUGF5bm93Q29tcG9uZW50IH0gZnJvbSAnLi9wYXlub3cvcGF5bm93LmNvbXBvbmVudCc7XHJcblxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWludm9pY2UtY3JlZGl0cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2ludm9pY2UtY3JlZGl0cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2ludm9pY2UtY3JlZGl0cy5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEludm9pY2VDcmVkaXRzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgc2VsZWN0ZWRUYWI6ICdpbnZvaWNlJyB8ICdjcmVkaXQtdHJhbnNhY3Rpb25zJyA9ICdpbnZvaWNlJ1xyXG4gIGludm9pY2VMaXN0OiBhbnlbXVxyXG4gIHRyYW5zYWN0aW9uTGlzdDogYW55W11cclxuICBpbnZvaWNlTGlzdEFwaVN0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDwnaW5pdGlhbCcgfCAnbG9hZGluZycgfCAnbG9hZGVkJz4oJ2luaXRpYWwnKVxyXG4gIHRyYW5zYWN0aW9uTGlzdEFwaVN0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDwnaW5pdGlhbCcgfCAnbG9hZGluZycgfCAnbG9hZGVkJz4oJ2luaXRpYWwnKVxyXG4gIGNsaWVudElkOiBzdHJpbmdcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICBpbnZvaWNlRXhwYW5kZWRSb3dJbmRleDogYW55XHJcbiAgZGF5anMgPSBkYXlqc1xyXG4gIGludm9pY2VGaWx0ZXJPYmplY3QgPSBbXHJcbiAgICB7IERlc2NyaXB0aW9uOiAnRHVyYXRpb24nLHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6IFt7aWQ6J2N1cnJlbnQnLCB0ZXh0OiBcIkN1cnJlbnQgTW9udGhcIiB9LCB7aWQ6J3ByZXYnLCB0ZXh0OiBcIlByZXZpb3VzIE1vbnRoXCIgfSwge2lkOidsYXN0JywgdGV4dDogXCJMYXN0IDMgTW9udGhzXCIgfV0gfSxcclxuICBdO1xyXG4gIHRyYW5zYWN0aW9uRmlsdGVyT2JqZWN0ID0gW1xyXG4gICAgeyBEZXNjcmlwdGlvbjogJ0R1cmF0aW9uJyx0eXBlOiAnc2luZ2xlJywgSXNzdWVzOiBbe2lkOidjdXJyZW50JywgdGV4dDogXCJDdXJyZW50IE1vbnRoXCIgfSwge2lkOidwcmV2JywgdGV4dDogXCJQcmV2aW91cyBNb250aFwiIH0sIHtpZDonbGFzdCcsIHRleHQ6IFwiTGFzdCAzIE1vbnRoc1wiIH1dIH0sXHJcbiAgXTtcclxuXHJcblxyXG5cclxuXHJcbiAgLy8gcGFnaW5hdGlvbiB2YXJpYWJsZXNcclxuICBpbnZvaWNlSXRlbXNQZXJQYWdlID0gMTBcclxuICBpbnZvaWNlQ3VycmVudFBhZ2UgPSAxXHJcbiAgaW52b2ljZVRvdGFsSXRlbXMgPSAwXHJcbiAgaW52b2ljZVBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXVxyXG4gIGludm9pY2VQYWdlU2l6ZSA9IDEwXHJcbiAgaW52b2ljZVNlYXJjaENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKVxyXG4gIGludm9pY2VTZWFyY2hUZXJtOnN0cmluZ1xyXG4gIGludm9pY2VTb3J0ZWRDb2x1bW46IHN0cmluZ1xyXG4gIGludm9pY2VTb3J0RGlyZWN0aW9uOiBudW1iZXJcclxuICBpbnZvaWNlRmlsdGVyOiAnY3VycmVudCcgfCAncHJldicgfCAnbGFzdCcgPSAnbGFzdCdcclxuXHJcbiAgdHJhbnNhY3Rpb25JdGVtc1BlclBhZ2UgPSAxMFxyXG4gIHRyYW5zYWN0aW9uQ3VycmVudFBhZ2UgPSAxXHJcbiAgdHJhbnNhY3Rpb25Ub3RhbEl0ZW1zID0gMFxyXG4gIHRyYW5zYWN0aW9uUGFnaW5hdGlvblNpemVzID0gWzEwLCAyMCwgMzBdXHJcbiAgdHJhbnNhY3Rpb25QYWdlU2l6ZSA9IDEwXHJcbiAgdHJhbnNhY3Rpb25TZWFyY2hDb250cm9sID0gbmV3IEZvcm1Db250cm9sKClcclxuICB0cmFuc2FjdGlvblNlYXJjaFRlcm06c3RyaW5nXHJcbiAgdHJhbnNhY3Rpb25Tb3J0ZWRDb2x1bW46IHN0cmluZ1xyXG4gIHRyYW5zYWN0aW9uU29ydERpcmVjdGlvbjogbnVtYmVyXHJcbiAgdHJhbnNhY3Rpb25GaWx0ZXI6ICdjdXJyZW50JyB8ICdwcmV2JyB8ICdsYXN0JyA9ICdsYXN0J1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnRTZXJ2aWNlOiBDbGllbnRBcGlTZXJ2aWNlLCBwcml2YXRlIHBheW1lbnRTZXJ2aWNlOiBQYXltZW50U3Vic2NyaXB0aW9uU2VydmljZSwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsKSB7XHJcbiAgICB0aGlzLmNsaWVudFNlcnZpY2UuY2xpZW50SWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBlXHJcbiAgICAgICAgdGhpcy5nZXRJbnZvaWNlTGlzdCgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5pbnZvaWNlU2VhcmNoQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnBpcGUoZGVib3VuY2VUaW1lKDEwMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKGUpPT57ICAgICAgXHJcbiAgICAgICAgdGhpcy5pbnZvaWNlU2VhcmNoVGVybSA9IGVcclxuICAgICAgICB0aGlzLmdldEludm9pY2VMaXN0KClcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy50cmFuc2FjdGlvblNlYXJjaENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5waXBlKGRlYm91bmNlVGltZSgxMDAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSkuc3Vic2NyaWJlKChlKT0+eyAgICAgIFxyXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uU2VhcmNoVGVybSA9IGVcclxuICAgICAgdGhpcy5nZXRUcmFuc2FjdGlvbkxpc3QoKVxyXG4gIH0pXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG5cclxuICBjaGFuZ2VUYWIoc2VsZWN0ZWRUYWI6ICdpbnZvaWNlJyB8ICdjcmVkaXQtdHJhbnNhY3Rpb25zJykge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRhYiA9IHNlbGVjdGVkVGFiXHJcblxyXG4gICAgaWYoc2VsZWN0ZWRUYWIgPT09ICdpbnZvaWNlJyl7XHJcbiAgICAgIHRoaXMuZ2V0SW52b2ljZUxpc3QoKVxyXG4gICAgfWVsc2UgaWYoc2VsZWN0ZWRUYWIgPT09ICdjcmVkaXQtdHJhbnNhY3Rpb25zJyl7XHJcbiAgICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25MaXN0KClcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBzaG93UHJvZHVjdChkYXRhOiBhbnkpIHtcclxuICAgIHJldHVybiBkYXRhLnNsaWNlKDItZGF0YS5sZW5ndGgpLm1hcCgoc3RyOnN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaCgvW0EtWl1bYS16XSokLyk7XHJcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogc3RyO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkludm9pY2VQYWdlQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMuaW52b2ljZUN1cnJlbnRQYWdlID0gZXZlbnRcclxuICAgIHRoaXMuZ2V0SW52b2ljZUxpc3QoKVxyXG5cclxuICB9XHJcblxyXG4gIG9uVHJhbnNhY3Rpb25QYWdlQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25DdXJyZW50UGFnZSA9IGV2ZW50XHJcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uTGlzdCgpXHJcblxyXG4gIH1cclxuXHJcbiAgb25pbnZvaWNlUGFnZVNpemVDaGFuZ2UoZXZlbnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5pbnZvaWNlQ3VycmVudFBhZ2UgPSAxXHJcbiAgICB0aGlzLmludm9pY2VQYWdlU2l6ZSA9IGV2ZW50XHJcbiAgICB0aGlzLmludm9pY2VJdGVtc1BlclBhZ2UgPSBldmVudFxyXG4gICAgdGhpcy5nZXRJbnZvaWNlTGlzdCgpXHJcbiAgfVxyXG5cclxuICBvblRyYW5zYWN0aW9uUGFnZVNpemVDaGFuZ2UoZXZlbnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkN1cnJlbnRQYWdlID0gMVxyXG4gICAgdGhpcy50cmFuc2FjdGlvblBhZ2VTaXplID0gZXZlbnRcclxuICAgIHRoaXMudHJhbnNhY3Rpb25JdGVtc1BlclBhZ2UgPSBldmVudFxyXG4gICAgdGhpcy5nZXRUcmFuc2FjdGlvbkxpc3QoKVxyXG4gIH1cclxuXHJcbiAgb25JbnZvaWNlU29ydChjb2x1bW46IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuaW52b2ljZVNvcnRlZENvbHVtbiA9PT0gY29sdW1uKSB7XHJcbiAgICAgIHRoaXMuaW52b2ljZVNvcnREaXJlY3Rpb24gPSB0aGlzLmludm9pY2VTb3J0RGlyZWN0aW9uID09PSAxID8gLTEgOiAxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnZvaWNlU29ydGVkQ29sdW1uID0gY29sdW1uO1xyXG4gICAgICB0aGlzLmludm9pY2VTb3J0RGlyZWN0aW9uID0gMTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0SW52b2ljZUxpc3QoKVxyXG4gIH1cclxuXHJcbiAgb25UcmFuc2FjdGlvblNvcnQoY29sdW1uOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uU29ydGVkQ29sdW1uID09PSBjb2x1bW4pIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvblNvcnREaXJlY3Rpb24gPSB0aGlzLnRyYW5zYWN0aW9uU29ydERpcmVjdGlvbiA9PT0gMSA/IC0xIDogMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Tb3J0ZWRDb2x1bW4gPSBjb2x1bW47XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Tb3J0RGlyZWN0aW9uID0gMTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25MaXN0KClcclxuICB9XHJcblxyXG4gIGdldEludm9pY2VMaXN0KCkge1xyXG4gICAgdGhpcy5pbnZvaWNlTGlzdEFwaVN0YXRlLm5leHQoJ2xvYWRpbmcnKVxyXG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcclxuICAgICAgXCJsaW1pdFwiOiB0aGlzLmludm9pY2VQYWdlU2l6ZSxcclxuICAgICAgXCJvZmZzZXRcIjogdGhpcy5pbnZvaWNlQ3VycmVudFBhZ2UsXHJcbiAgICAgIFwiY2xpZW50SWRcIjogdGhpcy5jbGllbnRJZCxcclxuICAgICAgXCJzb3J0Q29sdW1uXCI6IHRoaXMuaW52b2ljZVNvcnRlZENvbHVtbixcclxuICAgICAgXCJzb3J0QnlcIjogdGhpcy5pbnZvaWNlU29ydERpcmVjdGlvbixcclxuICAgICAgXCJzZWFyY2hWYWx1ZVwiOiB0aGlzLmludm9pY2VTZWFyY2hUZXJtLFxyXG4gICAgICBcImZpbHRlclwiOiB0aGlzLmludm9pY2VGaWx0ZXIsXHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xyXG4gICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgaWYgKGRhdGFba2V5XSA9PT0gdW5kZWZpbmVkIHx8IGRhdGFba2V5XSA9PT0gJycpIHtcclxuICAgICAgICAgIGRlbGV0ZSBkYXRhW2tleV1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFba2V5XSkpIHtcclxuICAgICAgICAgIGlmICghZGF0YVtrZXldLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0YVtrZXldXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLnBheW1lbnRTZXJ2aWNlLmdldEludm9pY2VMaXN0KGRhdGEpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbnZvaWNlTGlzdEFwaVN0YXRlLm5leHQoJ2xvYWRlZCcpXHJcbiAgICAgICAgdGhpcy5pbnZvaWNlRXhwYW5kZWRSb3dJbmRleCA9IG51bGxcclxuICAgICAgICBpZiAocmVzPy5kYXRhPy5wYWdlSW5mbz8uY291bnQpIHtcclxuICAgICAgICAgIHRoaXMuaW52b2ljZVRvdGFsSXRlbXMgPSByZXMuZGF0YS5wYWdlSW5mby5jb3VudFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmludm9pY2VUb3RhbEl0ZW1zID0gMFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzPy5kYXRhPy5kYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLmludm9pY2VMaXN0ID0gcmVzLmRhdGEuZGF0YVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmludm9pY2VMaXN0ID0gW11cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG5cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldFRyYW5zYWN0aW9uTGlzdCgpIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25MaXN0QXBpU3RhdGUubmV4dCgnbG9hZGluZycpXHJcbiAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xyXG4gICAgICBcImxpbWl0XCI6IHRoaXMudHJhbnNhY3Rpb25QYWdlU2l6ZSxcclxuICAgICAgXCJvZmZzZXRcIjogdGhpcy50cmFuc2FjdGlvbkN1cnJlbnRQYWdlLFxyXG4gICAgICBcImNsaWVudElkXCI6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIFwic29ydENvbHVtblwiOiB0aGlzLnRyYW5zYWN0aW9uU29ydGVkQ29sdW1uLFxyXG4gICAgICBcInNvcnRCeVwiOiB0aGlzLnRyYW5zYWN0aW9uU29ydERpcmVjdGlvbixcclxuICAgICAgXCJzZWFyY2hWYWx1ZVwiOiB0aGlzLnRyYW5zYWN0aW9uU2VhcmNoVGVybSxcclxuICAgICAgXCJmaWx0ZXJcIjogdGhpcy50cmFuc2FjdGlvbkZpbHRlcixcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBpZiAoZGF0YVtrZXldID09PSB1bmRlZmluZWQgfHwgZGF0YVtrZXldID09PSAnJykge1xyXG4gICAgICAgICAgZGVsZXRlIGRhdGFba2V5XVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSkge1xyXG4gICAgICAgICAgaWYgKCFkYXRhW2tleV0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2tleV1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRoaXMucGF5bWVudFNlcnZpY2UuZ2V0VHJhbnNhY3Rpb25MaXN0KGRhdGEpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkxpc3RBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAgIGlmIChyZXM/LmRhdGE/LnBhZ2VJbmZvPy5jb3VudCkge1xyXG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvblRvdGFsSXRlbXMgPSByZXMuZGF0YS5wYWdlSW5mby5jb3VudFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVG90YWxJdGVtcyA9IDBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcz8uZGF0YT8uZGF0YSkge1xyXG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkxpc3QgPSByZXMuZGF0YS5kYXRhXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25MaXN0ID0gW11cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG5cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuICBvbkludm9pY2VMaXN0RXhwb3J0KCkge1xyXG4gICAgdGhpcy5pbnZvaWNlTGlzdEFwaVN0YXRlLm5leHQoJ2xvYWRpbmcnKVxyXG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcclxuICAgICAgXCJsaW1pdFwiOiB0aGlzLmludm9pY2VQYWdlU2l6ZSxcclxuICAgICAgXCJvZmZzZXRcIjogdGhpcy5pbnZvaWNlQ3VycmVudFBhZ2UsXHJcbiAgICAgIFwiY2xpZW50SWRcIjogdGhpcy5jbGllbnRJZCxcclxuICAgICAgXCJzb3J0Q29sdW1uXCI6IHRoaXMuaW52b2ljZVNvcnRlZENvbHVtbixcclxuICAgICAgXCJzb3J0QnlcIjogdGhpcy5pbnZvaWNlU29ydERpcmVjdGlvbixcclxuICAgICAgXCJzZWFyY2hWYWx1ZVwiOiB0aGlzLmludm9pY2VTZWFyY2hUZXJtLFxyXG4gICAgICBcImZpbHRlclwiOiB0aGlzLmludm9pY2VGaWx0ZXIsXHJcbiAgICAgIFwiaXNFeHBvcnRcIjogdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcclxuICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgIGlmIChkYXRhW2tleV0gPT09IHVuZGVmaW5lZCB8fCBkYXRhW2tleV0gPT09ICcnKSB7XHJcbiAgICAgICAgICBkZWxldGUgZGF0YVtrZXldXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2tleV0pKSB7XHJcbiAgICAgICAgICBpZiAoIWRhdGFba2V5XS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGRhdGFba2V5XVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy5wYXltZW50U2VydmljZS5leHBvcnRJbnZvaWNlTGlzdChkYXRhKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuaW52b2ljZUxpc3RBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAgIHRoaXMucGF5bWVudFNlcnZpY2Uuc2F2ZUFzRXhjZWxGaWxlKHJlcywgJ2ludm9pY2UnKVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGUpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlKTtcclxuXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBvblRyYW5zYWN0aW9uTGlzdEV4cG9ydCgpIHtcclxuICAgIHRoaXMuaW52b2ljZUxpc3RBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJylcclxuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XHJcbiAgICAgIFwibGltaXRcIjogdGhpcy50cmFuc2FjdGlvblBhZ2VTaXplLFxyXG4gICAgICBcIm9mZnNldFwiOiB0aGlzLnRyYW5zYWN0aW9uQ3VycmVudFBhZ2UsXHJcbiAgICAgIFwiY2xpZW50SWRcIjogdGhpcy5jbGllbnRJZCxcclxuICAgICAgXCJzb3J0Q29sdW1uXCI6IHRoaXMudHJhbnNhY3Rpb25Tb3J0ZWRDb2x1bW4sXHJcbiAgICAgIFwic29ydEJ5XCI6IHRoaXMudHJhbnNhY3Rpb25Tb3J0RGlyZWN0aW9uLFxyXG4gICAgICBcInNlYXJjaFZhbHVlXCI6IHRoaXMudHJhbnNhY3Rpb25TZWFyY2hUZXJtLFxyXG4gICAgICBcImZpbHRlclwiOiB0aGlzLnRyYW5zYWN0aW9uRmlsdGVyLFxyXG4gICAgICBcImlzRXhwb3J0XCI6IHRydWVcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBpZiAoZGF0YVtrZXldID09PSB1bmRlZmluZWQgfHwgZGF0YVtrZXldID09PSAnJykge1xyXG4gICAgICAgICAgZGVsZXRlIGRhdGFba2V5XVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSkge1xyXG4gICAgICAgICAgaWYgKCFkYXRhW2tleV0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2tleV1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRoaXMucGF5bWVudFNlcnZpY2UuZXhwb3J0VHJhbnNhY3Rpb25MaXN0KGRhdGEpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkxpc3RBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAgIHRoaXMucGF5bWVudFNlcnZpY2Uuc2F2ZUFzRXhjZWxGaWxlKHJlcywgJ3RyYW5zYWN0aW9uJylcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZSk7XHJcblxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuaW52b2ljZUV4cGFuZGVkUm93SW5kZXggPSB0aGlzLmludm9pY2VFeHBhbmRlZFJvd0luZGV4ID09PSBpbmRleCA/IG51bGwgOiBpbmRleDtcclxuICB9XHJcblxyXG4gIGRvd25sb2FkSW52b2ljZShkYXRhOmFueSkgeyAgICBcclxuICAgIHRoaXMucGF5bWVudFNlcnZpY2UuaW52b2ljZURvd25sb2FkKGRhdGEpLnN1YnNjcmliZSgocmVzOmFueSk9PiB7XHJcbiAgICAgIGlmKHJlcykge1xyXG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbcmVzXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vcGRmJyB9KTtcclxuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgIGxpbmsuaHJlZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgICAgIGxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XHJcbiAgICAgICAgbGluay5jbGljaygpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJvdW5kTnVtYmVyKG51bTpudW1iZXIpe1xyXG4gICByZXR1cm4gTWF0aC5yb3VuZChudW0pXHJcbiAgfVxyXG5cclxuICBwYXlOb3coaW52b2ljZTpzdHJpbmcpe1xyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFBheW5vd0NvbXBvbmVudCwgeyBzaXplOiAnbGcnLCBjZW50ZXJlZDogdHJ1ZSB9KTtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmludm9pY2UgPSBpbnZvaWNlXHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWRcclxuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXMpID0+IHtcclxuICAgICAgdGhpcy5nZXRJbnZvaWNlTGlzdCgpXHJcbiAgICB9KS5jYXRjaCgoZXJyKT0+e3RoaXMuZ2V0SW52b2ljZUxpc3QoKX0pXHJcbiAgfVxyXG5cclxuICBhcHBseUludm9pY2VGaWx0ZXJzKGV2ZW50OmFueSl7ICAgIFxyXG4gICAgaWYgKGV2ZW50Py5sZW5ndGgpIHtcclxuICAgICAgZXZlbnQuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuRGVzY3JpcHRpb24gPT09IFwiRHVyYXRpb25cIikge1xyXG4gICAgICAgICAgdGhpcy5pbnZvaWNlRmlsdGVyID0gZWxlbWVudC5Jc3N1ZXMuaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfSBcclxuICAgIFxyXG4gICAgdGhpcy5nZXRJbnZvaWNlTGlzdCgpXHJcbiAgICBcclxuICB9XHJcblxyXG4gIGFwcGx5VHJhbnNhY3Rpb25GaWx0ZXJzKGV2ZW50OmFueSl7ICAgIFxyXG4gICAgaWYgKGV2ZW50Py5sZW5ndGgpIHtcclxuICAgICAgZXZlbnQuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuRGVzY3JpcHRpb24gPT09IFwiRHVyYXRpb25cIikge1xyXG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkZpbHRlciA9IGVsZW1lbnQuSXNzdWVzLmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH0gIFxyXG4gICAgXHJcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uTGlzdCgpXHJcbiAgICBcclxuICB9XHJcbn1cclxuXHJcbiIsIjxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwYXltZW50aGlzdG9yeSBib3JkZXItMFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktMyBtZS0yXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdpbnZvaWNlJyA/ICdhY3RpdmVQbGFuQnRucHJpbWFyeScgOiAnaW5hY3RpdmVQbGFuQnRuJ1wiIGRhdGEta3QtcGxhbj1cImludm9pY2VcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFiKCdpbnZvaWNlJylcIj5cclxuICAgICAgICAgICAgSW52b2ljZVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktM1wiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSAnY3JlZGl0LXRyYW5zYWN0aW9ucycgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxyXG4gICAgICAgICAgICBkYXRhLWt0LXBsYW49XCJjcmVkaXQtdHJhbnNhY3Rpb25zXCIgKGNsaWNrKT1cImNoYW5nZVRhYignY3JlZGl0LXRyYW5zYWN0aW9ucycpXCI+XHJcbiAgICAgICAgICAgIENyZWRpdCBUcmFuc2FjdGlvbnNcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdpbnZvaWNlJyA/ICcnIDogJ2Qtbm9uZSdcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gaW52b2ljZXNlYXJjaCBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIG10LTYgIG1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgb3BhY2l0eT1cIjAuNVwiIHg9XCIxNy4wMzY1XCIgeT1cIjE1LjEyMjNcIiB3aWR0aD1cIjguMTU1NDZcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbZm9ybUNvbnRyb2xdPVwiaW52b2ljZVNlYXJjaENvbnRyb2xcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBtZS00IGludm9pY2VzZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMyBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24gaW52aGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZmlsdGVycyBbZGF0YU9iamVjdF09XCJpbnZvaWNlRmlsdGVyT2JqZWN0XCIgKGFwcGxpZWRGaWx0ZXJzKT1cImFwcGx5SW52b2ljZUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uSW52b2ljZUxpc3RFeHBvcnQoKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTRcIj48c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPjxzcGFuIGNsYXNzPVwibXMtMlwiPjwvc3Bhbj4gRXhwb3J0PC9idXR0b24+XHJcblxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdjcmVkaXQtdHJhbnNhY3Rpb25zJyA/ICcnIDogJ2Qtbm9uZSdcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gaW52b2ljZXNlYXJjaCBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIG10LTYgIG1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgb3BhY2l0eT1cIjAuNVwiIHg9XCIxNy4wMzY1XCIgeT1cIjE1LjEyMjNcIiB3aWR0aD1cIjguMTU1NDZcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbZm9ybUNvbnRyb2xdPVwidHJhbnNhY3Rpb25TZWFyY2hDb250cm9sXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHMtMTQgbWUtNCBpbnZvaWNlc2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIlxyXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTMgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duIGludmhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwidHJhbnNhY3Rpb25GaWx0ZXJPYmplY3RcIiAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlUcmFuc2FjdGlvbkZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uVHJhbnNhY3Rpb25MaXN0RXhwb3J0KClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS00XCI+PHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz48c3BhbiBjbGFzcz1cIm1zLTJcIj48L3NwYW4+IEV4cG9ydDwvYnV0dG9uPlxyXG5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdpbnZvaWNlJ1wiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihpbnZvaWNlTGlzdEFwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGVkJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbnZvaWNlTGlzdD8ubGVuZ3RoXCI+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhY2NvcmRpb24gdGFibGUgYm90dG9tLWJvcmRlciBpbnZvaXZldGFibGUgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+SW52b2ljZSAjPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UHJvZHVjdHM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwiZmxleENoZWNrRGVmYXVsdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkJpbGxpbmcgZGF0ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25JbnZvaWNlU29ydCgnYmlsbGluZ0RhdGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW52b2ljZVNvcnRlZENvbHVtbiA9PT0gJ2JpbGxpbmdEYXRlJyAmJiBpbnZvaWNlU29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImZsZXhDaGVja0RlZmF1bHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BbW91bnQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uSW52b2ljZVNvcnQoJ3RvdGFsQW1vdW50JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImludm9pY2VTb3J0ZWRDb2x1bW4gPT09ICd0b3RhbEFtb3VudCcgJiYgaW52b2ljZVNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvbkludm9pY2VTb3J0KCdzdG9yZXMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW52b2ljZVNvcnRlZENvbHVtbiA9PT0gJ3N0b3JlcycgJiYgaW52b2ljZVNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhdHVzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWN0aW9uczwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGludm9pY2VHcm91cCBvZiBpbnZvaWNlTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlIGludm9pY2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ludm9pY2VHcm91cD8uc3VtbWFyeX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtc3VjY2Vzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbnZvaWNlR3JvdXA/LnBheW1lbnRTdGF0dXMgPT09ICdwYWlkJ1wiPlBhaWQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LXdhcm5pbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaW52b2ljZUdyb3VwPy5wYXltZW50U3RhdHVzID09PSAnZHVlJ1wiPkR1ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImludm9pY2VHcm91cD8ucGF5bWVudFN0YXR1cyA9PT0gJ3VucGFpZCdcIj5VbnBhaWQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3BhbiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBpbnZvaWNlR3JvdXA/LnByb2R1Y3RzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJpPDJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBwcm9kdWN0LXRyYWZmaWMgbXgtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2R1Y3QgPT09ICd0YW5nb1RyYWZmaWMnXCI+VHJhZmZpYzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBwcm9kdWN0LXpvbmUgbXgtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2R1Y3QgPT09ICd0YW5nb1pvbmUnXCI+Wm9uZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBwcm9kdWN0LXNvcCBteC0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvZHVjdCA9PT0gJ3RhbmdvVHJheCdcIj5UcmF4PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj48c3BhbiBjbGFzcz1cInByb2R1Y3RleHRlbmRcIiAqbmdJZj1cImludm9pY2VHcm91cD8ucHJvZHVjdHMubGVuZ3RoPjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cInNob3dQcm9kdWN0KGludm9pY2VHcm91cD8ucHJvZHVjdHMpXCI+K3t7aW52b2ljZUdyb3VwPy5wcm9kdWN0cy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDIgfX08L3NwYW4+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+e3tkYXlqcyhpbnZvaWNlR3JvdXA/LmJpbGxpbmdEYXRlKS5mb3JtYXQoJ0REIE1NTSwgWVlZWScpfX0gPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaW52b2ljZUdyb3VwPy5jdXJyZW5jeSA9PT0gJ2lucidcIj7igrkgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaW52b2ljZUdyb3VwPy5jdXJyZW5jeSA9PT0gJ2RvbGxhcidcIj4kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW52b2ljZUdyb3VwPy5jdXJyZW5jeSA9PT0gJ2lucidcIiA+e3tyb3VuZE51bWJlcihpbnZvaWNlR3JvdXA/LnRvdGFsQW1vdW50KS50b0xvY2FsZVN0cmluZygnZW4tSU4nKX19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImludm9pY2VHcm91cD8uY3VycmVuY3kgPT09ICdkb2xsYXInXCIgPnt7cm91bmROdW1iZXIoaW52b2ljZUdyb3VwPy50b3RhbEFtb3VudCkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyl9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57e2ludm9pY2VHcm91cD8uc3RvcmVzfX0gU3RvcmVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwidG9nZ2xlUm93KGkpXCIgdHlwZT1cInZpZXdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIHVwZGF0ZSBidG4tbGcgYnRuLWxpZ2h0IGJ0bi1hY3RpdmUtbGlnaHQtcHJpbWFyeSBweC00IG5nLXN0YXItaW5zZXJ0ZWRcIj48c3Bhbj5WaWV3XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbHM8L3NwYW4+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImludm9pY2VFeHBhbmRlZFJvd0luZGV4ID09PSBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaW52b2ljZSBvZiBpbnZvaWNlTGlzdD8uW2ludm9pY2VFeHBhbmRlZFJvd0luZGV4XT8uaW52b2ljZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZvaWNlc3VidGFiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJleHBhbmRlZC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlLXByaW1hcnkgaW52b2ljZSBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aW52b2ljZT8uaW52b2ljZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1zdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJbJ2ZyZWUnLCdQYXltZW50IFJlY2VpdmVkJ10uaW5jbHVkZXMoaW52b2ljZT8uc3RhdHVzKVwiPnt7aW52b2ljZT8uc3RhdHVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGl0bGVjYXNlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC13YXJuaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbnZvaWNlPy5zdGF0dXMgPT09ICd0cmlhbCdcIj57e2ludm9pY2U/LnN0YXR1cyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3BhbiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBpbnZvaWNlPy5wcm9kdWN0czsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImk8MlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBwcm9kdWN0LXRyYWZmaWMgbXgtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9kdWN0ID09PSAndGFuZ29UcmFmZmljJ1wiPlRyYWZmaWM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIHByb2R1Y3Qtem9uZSBteC0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2R1Y3QgPT09ICd0YW5nb1pvbmUnXCI+Wm9uZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgcHJvZHVjdC1zb3AgbXgtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9kdWN0ID09PSAndGFuZ29UcmF4J1wiPlRyYXg8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PHNwYW4gY2xhc3M9XCJwcm9kdWN0ZXh0ZW5kXCIgKm5nSWY9XCJpbnZvaWNlPy5wcm9kdWN0cy5sZW5ndGg+MlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cInNob3dQcm9kdWN0KGludm9pY2UucHJvZHVjdHMpXCI+K3t7aW52b2ljZT8ucHJvZHVjdHMubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMiB9fTwvc3Bhbj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7ZGF5anMoaW52b2ljZT8uYmlsbGluZ0RhdGUpLmZvcm1hdCgnREQgTU1NLCBZWVlZJyl9fSA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaW52b2ljZT8uY3VycmVuY3kgPT09ICdpbnInXCI+4oK5IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpbnZvaWNlPy5jdXJyZW5jeSA9PT0gJ2RvbGxhcidcIj4kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImludm9pY2U/LmN1cnJlbmN5ID09PSAnaW5yJ1wiID57e3JvdW5kTnVtYmVyKGludm9pY2U/LnRvdGFsQW1vdW50KS50b0xvY2FsZVN0cmluZygnZW4tSU4nKX19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbnZvaWNlPy5jdXJyZW5jeSA9PT0gJ2RvbGxhcidcIiA+e3tyb3VuZE51bWJlcihpbnZvaWNlPy50b3RhbEFtb3VudCkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyl9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7aW52b2ljZT8uc3RvcmVzfX0gU3RvcmVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHNjb3BlPVwicm93XCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCIgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImludm9pY2UucGF5bWVudFN0YXR1cyA9PT0gJ3BhaWQnXCIgY2xhc3M9XCJwYXltZW50LXN1Y2Nlc3MtYmFkZ2VcIj5QYWlkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJwYXlOb3coaW52b2ljZT8uaW52b2ljZSlcIiAqbmdJZj1cImludm9pY2UucGF5bWVudFN0YXR1cyA9PT0gJ2R1ZScgfHwgaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAndW5wYWlkJ1wiIHR5cGU9XCJ2aWV3XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcHgtNCBtdC0zIGN1cnNvci1wb2ludGVyXCI+PHNwYW4+UGF5IE5vdzwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJkb3dubG9hZEludm9pY2UoaW52b2ljZSlcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+PHN2ZyBjbGFzcz1cIm10LTNcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNNS44MzMzMyA4LjMzMzMzTDEwIDEyLjVNMTAgMTIuNUwxNC4xNjY3IDguMzMzMzNNMTAgMTIuNVYyLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS0zXCI+XHJcbiAgICAgICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gY2xhc3M9XCJ0ZXh0LXN0YXJ0XCIgW2l0ZW1zUGVyUGFnZV09XCJpbnZvaWNlSXRlbXNQZXJQYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICBbY3VycmVudFBhZ2VdPVwiaW52b2ljZUN1cnJlbnRQYWdlXCIgW3RvdGFsSXRlbXNdPVwiaW52b2ljZVRvdGFsSXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0aW9uU2l6ZXNdPVwiaW52b2ljZVBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJpbnZvaWNlUGFnZVNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uSW52b2ljZVBhZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uaW52b2ljZVBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpbnZvaWNlTGlzdD8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGludm9pY2VMaXN0QXBpU3RhdGUgfCBhc3luYykgPT09ICdsb2FkaW5nJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyLWNhcmQgdy0xMDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdjcmVkaXQtdHJhbnNhY3Rpb25zJ1wiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIih0cmFuc2FjdGlvbkxpc3RBcGlTdGF0ZSB8IGFzeW5jKSA9PT0gJ2xvYWRlZCdcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHJhbnNhY3Rpb25MaXN0Py5sZW5ndGhcIj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGJvdHRvbS1ib3JkZXIgaW52b2l2ZXRhYmxlIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QmlsbGluZyBEYXRlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblRyYW5zYWN0aW9uU29ydCgnYmlsbGluZ0RhdGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidHJhbnNhY3Rpb25Tb3J0ZWRDb2x1bW4gPT09ICdiaWxsaW5nRGF0ZScgJiYgdHJhbnNhY3Rpb25Tb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwiZmxleENoZWNrRGVmYXVsdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlRyYW5zYWN0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImZsZXhDaGVja0RlZmF1bHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5EZWJ0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHN2ZyBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uVHJhbnNhY3Rpb25Tb3J0KCdhbW91bnQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidHJhbnNhY3Rpb25Tb3J0ZWRDb2x1bW4gPT09ICdhbW91bnQnICYmIHRyYW5zYWN0aW9uU29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q3JlZGl0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHN2ZyBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uVHJhbnNhY3Rpb25Tb3J0KCdhbW91bnQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidHJhbnNhY3Rpb25Tb3J0ZWRDb2x1bW4gPT09ICdhbW91bnQnICYmIHRyYW5zYWN0aW9uU29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QmFsYW5jZSBjcmVkaXQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uVHJhbnNhY3Rpb25Tb3J0KCdiYWxhbmNlQ3JlZGl0JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInRyYW5zYWN0aW9uU29ydGVkQ29sdW1uID09PSAnYmFsYW5jZUNyZWRpdCcgJiYgdHJhbnNhY3Rpb25Tb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCB0cmFuc2FjdGlvbiBvZiB0cmFuc2FjdGlvbkxpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFuc2FjdGlvbj8uYmlsbGluZ0RhdGVcIiBjbGFzcz1cInRhYmxlLXRpdGxlLXByaW1hcnkgaW52b2ljZSBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2RheWpzKHRyYW5zYWN0aW9uPy5iaWxsaW5nRGF0ZSkuZm9ybWF0KCdERCBNTU0sIFlZWVknKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGFibGUtdGl0bGVcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidHJhbnNhY3Rpb24/LnRyYW5zYWN0aW9uVHlwZSA9PT0gJ2RlYnQnXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtcHRpb24gZm9yIHt7ZGF5anModHJhbnNhY3Rpb24/LmJpbGxpbmdEYXRlKS5mb3JtYXQoJ01NTSBZWVlZJyl9fSA8bmctY29udGFpbmVyICpuZ0lmPVwidHJhbnNhY3Rpb24/Lmdyb3VwTmFtZVwiID4tIHt7dHJhbnNhY3Rpb24/Lmdyb3VwTmFtZX19PC9uZy1jb250YWluZXI+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidHJhbnNhY3Rpb24/LnRyYW5zYWN0aW9uVHlwZSA9PT0gJ2NyZWRpdCdcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlkIENyZWRpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFuc2FjdGlvbj8udHJhbnNhY3Rpb25UeXBlID09PSAnZGVidCdcIiBjbGFzcz1cInRhYmxlLXRpdGxlIGRlYml0dmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidHJhbnNhY3Rpb24/LmN1cnJlbmN5ID09PSAnZG9sbGFyJ1wiPiQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0cmFuc2FjdGlvbj8uY3VycmVuY3kgPT09ICdpbnInXCI+4oK5IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidHJhbnNhY3Rpb24/LmN1cnJlbmN5ID09PSAnZG9sbGFyJ1wiPnt7dHJhbnNhY3Rpb24/LmFtb3VudD8udG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidHJhbnNhY3Rpb24/LmN1cnJlbmN5ID09PSAnaW5yJ1wiPnt7dHJhbnNhY3Rpb24/LmFtb3VudD8udG9Mb2NhbGVTdHJpbmcoJ2VuLUlOJyl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFuc2FjdGlvbj8udHJhbnNhY3Rpb25UeXBlID09PSAnY3JlZGl0J1wiIGNsYXNzPVwidGFibGUtdGl0bGUgY3JlZGl0dmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidHJhbnNhY3Rpb24/LmN1cnJlbmN5ID09PSAnZG9sbGFyJ1wiPiQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0cmFuc2FjdGlvbj8uY3VycmVuY3kgPT09ICdpbnInXCI+4oK5IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidHJhbnNhY3Rpb24/LmN1cnJlbmN5ID09PSAnZG9sbGFyJ1wiPnt7dHJhbnNhY3Rpb24/LmFtb3VudD8udG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidHJhbnNhY3Rpb24/LmN1cnJlbmN5ID09PSAnaW5yJ1wiPnt7dHJhbnNhY3Rpb24/LmFtb3VudD8udG9Mb2NhbGVTdHJpbmcoJ2VuLUlOJyl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0cmFuc2FjdGlvbj8uYmFsYW5jZUNyZWRpdEN1cnJlbmN5ID09PSAnZG9sbGFyJ1wiPiQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0cmFuc2FjdGlvbj8uYmFsYW5jZUNyZWRpdEN1cnJlbmN5ID09PSAnaW5yJ1wiPuKCuSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRyYW5zYWN0aW9uPy5iYWxhbmNlQ3JlZGl0Q3VycmVuY3kgPT09ICdkb2xsYXInXCI+e3t0cmFuc2FjdGlvbj8uYmFsYW5jZUNyZWRpdD8udG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidHJhbnNhY3Rpb24/LmJhbGFuY2VDcmVkaXRDdXJyZW5jeSA9PT0gJ2lucidcIj57e3RyYW5zYWN0aW9uPy5iYWxhbmNlQ3JlZGl0Py50b0xvY2FsZVN0cmluZygnZW4tSU4nKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTNcIj5cclxuICAgICAgICAgICAgICAgIDxsaWItcGFnaW5hdGlvbiBjbGFzcz1cInRleHQtc3RhcnRcIiBbaXRlbXNQZXJQYWdlXT1cInRyYW5zYWN0aW9uSXRlbXNQZXJQYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICBbY3VycmVudFBhZ2VdPVwidHJhbnNhY3Rpb25DdXJyZW50UGFnZVwiIFt0b3RhbEl0ZW1zXT1cInRyYW5zYWN0aW9uVG90YWxJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRpb25TaXplc109XCJ0cmFuc2FjdGlvblBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJ0cmFuc2FjdGlvblBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblRyYW5zYWN0aW9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25UcmFuc2FjdGlvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0cmFuc2FjdGlvbkxpc3Q/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyYyB3LTI1XCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIih0cmFuc2FjdGlvbkxpc3RBcGlTdGF0ZSB8IGFzeW5jKSA9PT0gJ2xvYWRpbmcnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXItY2FyZCB3LTEwMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG48L2Rpdj4iXX0=