tango-app-ui-manage-billing 3.3.0-beta.8 → 3.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/billing-groups/billing-group-form/billing-group-form.component.mjs +497 -0
- package/esm2022/lib/components/billing-groups/billing-groups.component.mjs +205 -0
- package/esm2022/lib/components/billing-tabs/billing-tabs.component.mjs +51 -0
- package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +465 -0
- package/esm2022/lib/components/brands-billing/brands-billing.component.mjs +242 -0
- package/esm2022/lib/components/daily-pricing/daily-pricing.component.mjs +292 -0
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +101 -0
- package/esm2022/lib/components/services/billing.service.mjs +67 -1
- package/esm2022/lib/components/setup-billing/setup-billing.component.mjs +320 -0
- package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +464 -0
- package/esm2022/lib/components/tango-manage-billing/tango-manage-billing.component.mjs +3 -3
- package/esm2022/lib/tango-manage-billing-routing.module.mjs +24 -2
- package/esm2022/lib/tango-manage-billing.module.mjs +35 -5
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/tango-app-ui-manage-billing.mjs +2693 -30
- package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
- package/lib/components/billing-groups/billing-group-form/billing-group-form.component.d.ts +91 -0
- package/lib/components/billing-groups/billing-groups.component.d.ts +51 -0
- package/lib/components/billing-tabs/billing-tabs.component.d.ts +16 -0
- package/lib/components/brand-invoices/brand-invoices.component.d.ts +84 -0
- package/lib/components/brands-billing/brands-billing.component.d.ts +63 -0
- package/lib/components/daily-pricing/daily-pricing.component.d.ts +64 -0
- package/lib/components/reactive-select/reactive-select.component.d.ts +31 -0
- package/lib/components/services/billing.service.d.ts +23 -0
- package/lib/components/setup-billing/setup-billing.component.d.ts +130 -0
- package/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.d.ts +67 -0
- package/lib/tango-manage-billing.module.d.ts +21 -12
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
package/esm2022/lib/components/billing-groups/billing-group-form/billing-group-form.component.mjs
ADDED
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
3
|
+
import { BehaviorSubject, Subject, takeUntil, debounceTime, distinctUntilChanged } from 'rxjs';
|
|
4
|
+
import { NgbAccordionDirective } from '@ng-bootstrap/ng-bootstrap';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/forms";
|
|
7
|
+
import * as i2 from "../../services/billing.service";
|
|
8
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
9
|
+
import * as i4 from "tango-app-ui-shared";
|
|
10
|
+
import * as i5 from "@angular/common";
|
|
11
|
+
import * as i6 from "../../reactive-select/reactive-select.component";
|
|
12
|
+
export class BillingGroupFormComponent {
|
|
13
|
+
fb;
|
|
14
|
+
billingService;
|
|
15
|
+
modalRef;
|
|
16
|
+
toastService;
|
|
17
|
+
clientId;
|
|
18
|
+
groupId;
|
|
19
|
+
currentTab;
|
|
20
|
+
billingForm;
|
|
21
|
+
submitted;
|
|
22
|
+
filterData = [];
|
|
23
|
+
subscribedStoreList = [];
|
|
24
|
+
filterCountries = [];
|
|
25
|
+
filterStates = [];
|
|
26
|
+
filterCities = [];
|
|
27
|
+
searchInput = new FormControl('');
|
|
28
|
+
searchTerm;
|
|
29
|
+
sortedColumn;
|
|
30
|
+
sortDirection;
|
|
31
|
+
subscribedStoresApiState = new BehaviorSubject('initial');
|
|
32
|
+
subscribedProducts = [];
|
|
33
|
+
destroy$ = new Subject();
|
|
34
|
+
groupTagOptions = [
|
|
35
|
+
{ value: 'store', label: 'Store' },
|
|
36
|
+
{ value: 'gst', label: 'GST' }
|
|
37
|
+
];
|
|
38
|
+
currencyOptions = [
|
|
39
|
+
{ value: 'dollar', label: 'Dollar' },
|
|
40
|
+
{ value: 'inr', label: 'INR' }
|
|
41
|
+
];
|
|
42
|
+
paymentCycleOptions = [
|
|
43
|
+
{ value: 'monthly', label: 'Monthly' },
|
|
44
|
+
{ value: 'quarter', label: 'Quarterly' },
|
|
45
|
+
{ value: 'halfYearly', label: 'Half yearly' },
|
|
46
|
+
{ value: 'yearly', label: 'Yearly' }
|
|
47
|
+
];
|
|
48
|
+
paymentTermOptions = [
|
|
49
|
+
{ value: 30, label: '30' },
|
|
50
|
+
{ value: 45, label: '45' },
|
|
51
|
+
{ value: 60, label: '60' },
|
|
52
|
+
{ value: 90, label: '90' }
|
|
53
|
+
];
|
|
54
|
+
billingMethodOptions = [
|
|
55
|
+
{ value: 'eachStore', label: 'Each Store Wise' },
|
|
56
|
+
{ value: 'overallStore', label: 'Overall Store Wise' }
|
|
57
|
+
];
|
|
58
|
+
accordion;
|
|
59
|
+
itemsPerPage = 10;
|
|
60
|
+
currentPage = 1;
|
|
61
|
+
totalItems = 0;
|
|
62
|
+
paginationSizes = [10, 20, 30];
|
|
63
|
+
pageSize = 10;
|
|
64
|
+
constructor(fb, billingService, modalRef, toastService) {
|
|
65
|
+
this.fb = fb;
|
|
66
|
+
this.billingService = billingService;
|
|
67
|
+
this.modalRef = modalRef;
|
|
68
|
+
this.toastService = toastService;
|
|
69
|
+
this.createForm();
|
|
70
|
+
}
|
|
71
|
+
ngOnInit() {
|
|
72
|
+
this.getBillingGroups();
|
|
73
|
+
this.getClientProducts();
|
|
74
|
+
}
|
|
75
|
+
ngAfterViewInit() {
|
|
76
|
+
this.getSubscribedStores({ getFilters: true });
|
|
77
|
+
this.searchInput.valueChanges.pipe(takeUntil(this.destroy$), debounceTime(1000), distinctUntilChanged()).subscribe((val) => {
|
|
78
|
+
if (val === null || val === undefined)
|
|
79
|
+
return;
|
|
80
|
+
this.searchTerm = val;
|
|
81
|
+
this.getSubscribedStores({});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
ngOnDestroy() {
|
|
85
|
+
this.destroy$.next(true);
|
|
86
|
+
this.destroy$.complete();
|
|
87
|
+
}
|
|
88
|
+
createForm() {
|
|
89
|
+
this.billingForm = this.fb.group({
|
|
90
|
+
groups: this.fb.array([]),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
getBillingGroups() {
|
|
94
|
+
this.billingService.getAllBillingGroups(this.clientId).pipe(takeUntil(this.destroy$)).subscribe({
|
|
95
|
+
next: (res) => {
|
|
96
|
+
if (res?.data?.length) {
|
|
97
|
+
res.data.forEach((group) => {
|
|
98
|
+
this.patchFormItem({ ...group });
|
|
99
|
+
});
|
|
100
|
+
setTimeout(() => {
|
|
101
|
+
if (this.groupId) {
|
|
102
|
+
this.billingGroups.controls.forEach((control, idx) => {
|
|
103
|
+
if (control.get('_id')?.value === this.groupId) {
|
|
104
|
+
this.accordion.toggle(idx.toString());
|
|
105
|
+
if (this.currentTab) {
|
|
106
|
+
this.billingGroups.at(idx).get('currentTab')?.setValue(this.currentTab);
|
|
107
|
+
this.currentTab = '';
|
|
108
|
+
}
|
|
109
|
+
this.groupId = '';
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
else if (res.data.length > 1) {
|
|
114
|
+
this.accordion.toggle('0');
|
|
115
|
+
}
|
|
116
|
+
}, 0);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
patchFormItem({ groupName, groupTag, registeredCompanyName, gst, addressLineOne, addressLineTwo, city, state, country, pinCode, placeOfSupply, po, stores, proRata, paymentCategory, currency, isInstallationOneTime, installationFee, paymentCycle, paymentTerm, generateInvoiceTo, attachAnnexure, isPrimary, advanceInvoice, products, _id }) {
|
|
122
|
+
const item = this.fb.group({
|
|
123
|
+
groupName: [groupName || '', [Validators.required]],
|
|
124
|
+
groupTag: [groupTag || 'store', [Validators.required]],
|
|
125
|
+
registeredCompanyName: [registeredCompanyName || '', [Validators.required]],
|
|
126
|
+
gst: [gst || ''],
|
|
127
|
+
addressLineOne: [addressLineOne || ''],
|
|
128
|
+
addressLineTwo: [addressLineTwo || ''],
|
|
129
|
+
city: [city || ''],
|
|
130
|
+
state: [state || ''],
|
|
131
|
+
country: [country || ''],
|
|
132
|
+
pinCode: [pinCode || ''],
|
|
133
|
+
placeOfSupply: [placeOfSupply || ''],
|
|
134
|
+
po: [po || ''],
|
|
135
|
+
stores: [stores || []],
|
|
136
|
+
proRata: [proRata || 'before15'],
|
|
137
|
+
paymentCategory: [paymentCategory || 'post'],
|
|
138
|
+
currency: [currency || 'dollar'],
|
|
139
|
+
isInstallationOneTime: [isInstallationOneTime || false],
|
|
140
|
+
installationFee: [{ value: installationFee || '', disabled: true }],
|
|
141
|
+
paymentCycle: [paymentCycle || 'monthly'],
|
|
142
|
+
paymentTerm: [paymentTerm || 30],
|
|
143
|
+
generateInvoiceTo: [generateInvoiceTo || []],
|
|
144
|
+
attachAnnexure: [attachAnnexure || false],
|
|
145
|
+
isPrimary: [isPrimary || false],
|
|
146
|
+
advanceInvoice: [advanceInvoice || false],
|
|
147
|
+
products: [products || []],
|
|
148
|
+
currentTab: ['basic-info'],
|
|
149
|
+
clientId: [this.clientId],
|
|
150
|
+
_id: [_id]
|
|
151
|
+
});
|
|
152
|
+
this.billingGroups.push(item);
|
|
153
|
+
}
|
|
154
|
+
addFormItem({ isPrimary, groupName }) {
|
|
155
|
+
const item = this.fb.group({
|
|
156
|
+
groupName: [groupName, [Validators.required]],
|
|
157
|
+
groupTag: ['store', [Validators.required]],
|
|
158
|
+
registeredCompanyName: ['', [Validators.required]],
|
|
159
|
+
gst: [''],
|
|
160
|
+
addressLineOne: [''],
|
|
161
|
+
addressLineTwo: [''],
|
|
162
|
+
city: [''],
|
|
163
|
+
state: [''],
|
|
164
|
+
country: [''],
|
|
165
|
+
pinCode: [''],
|
|
166
|
+
placeOfSupply: [''],
|
|
167
|
+
po: [''],
|
|
168
|
+
stores: [[]],
|
|
169
|
+
proRata: ['before15'],
|
|
170
|
+
paymentCategory: ['post'],
|
|
171
|
+
currency: ['dollar'],
|
|
172
|
+
isInstallationOneTime: [false],
|
|
173
|
+
installationFee: [{ value: '', disabled: true }],
|
|
174
|
+
paymentCycle: ['monthly'],
|
|
175
|
+
paymentTerm: [30],
|
|
176
|
+
generateInvoiceTo: [[]],
|
|
177
|
+
attachAnnexure: [false],
|
|
178
|
+
isPrimary: [isPrimary],
|
|
179
|
+
advanceInvoice: [false],
|
|
180
|
+
products: [[]],
|
|
181
|
+
currentTab: ['basic-info'],
|
|
182
|
+
clientId: [this.clientId]
|
|
183
|
+
});
|
|
184
|
+
this.billingGroups.push(item);
|
|
185
|
+
setTimeout(() => {
|
|
186
|
+
this.accordion.toggle(`${this.billingGroups.length - 1}`);
|
|
187
|
+
}, 0);
|
|
188
|
+
}
|
|
189
|
+
get billingGroups() {
|
|
190
|
+
return this.billingForm.get('groups');
|
|
191
|
+
}
|
|
192
|
+
onTabChange(idx, val) {
|
|
193
|
+
this.billingGroups.at(idx).get('currentTab')?.setValue(val);
|
|
194
|
+
}
|
|
195
|
+
onDeleteGroup(idx) {
|
|
196
|
+
if (this.billingGroups.at(idx).get('_id')?.value) {
|
|
197
|
+
this.billingService.deleteBillingGroup(this.billingGroups.at(idx).get('_id')?.value).subscribe({
|
|
198
|
+
next: (res) => {
|
|
199
|
+
if (res?.data) {
|
|
200
|
+
this.billingGroups.controls.forEach(group => {
|
|
201
|
+
if (group.get('isPrimary')?.value) {
|
|
202
|
+
group.get('stores')?.setValue([...group.get('stores')?.value, ...this.billingGroups.at(idx).get('stores')?.value]);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
this.billingGroups.removeAt(idx);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
this.billingGroups.controls.forEach(group => {
|
|
212
|
+
if (group.get('isPrimary')?.value) {
|
|
213
|
+
group.get('stores')?.setValue([...group.get('stores')?.value, ...this.billingGroups.at(idx).get('stores')?.value]);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
this.billingGroups.removeAt(idx);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
getSubscribedStores({ getFilters }) {
|
|
220
|
+
this.subscribedStoresApiState.next('loading');
|
|
221
|
+
const data = {
|
|
222
|
+
limit: this.pageSize,
|
|
223
|
+
offset: this.currentPage,
|
|
224
|
+
clientId: this.clientId,
|
|
225
|
+
sortColumn: this.sortedColumn,
|
|
226
|
+
sortBy: this.sortDirection,
|
|
227
|
+
searchValue: this.searchTerm,
|
|
228
|
+
country: this.filterCountries,
|
|
229
|
+
state: this.filterStates,
|
|
230
|
+
city: this.filterCities,
|
|
231
|
+
getFilters: getFilters
|
|
232
|
+
};
|
|
233
|
+
for (const key in data) {
|
|
234
|
+
if (data.hasOwnProperty(key)) {
|
|
235
|
+
if (data[key] === undefined || data[key] === '')
|
|
236
|
+
delete data[key];
|
|
237
|
+
if (Array.isArray(data[key]) && !data[key].length)
|
|
238
|
+
delete data[key];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
this.billingService.getSubscribedStores(data).pipe(takeUntil(this.destroy$)).subscribe({
|
|
242
|
+
next: (res) => {
|
|
243
|
+
this.subscribedStoresApiState.next('loaded');
|
|
244
|
+
if (getFilters) {
|
|
245
|
+
if (res?.data?.countries?.length) {
|
|
246
|
+
this.filterData.push({ Description: 'Country', Issues: res.data.countries.map((val) => ({ text: val._id, id: val._id })) });
|
|
247
|
+
}
|
|
248
|
+
if (res?.data?.states?.length) {
|
|
249
|
+
this.filterData.push({ Description: 'State', Issues: res.data.states.map((val) => ({ text: val._id, id: val._id })) });
|
|
250
|
+
}
|
|
251
|
+
if (res?.data?.cities?.length) {
|
|
252
|
+
this.filterData.push({ Description: 'City', Issues: res.data.cities.map((val) => ({ text: val._id, id: val._id })) });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
this.totalItems = res?.data?.pageInfo?.count || 0;
|
|
256
|
+
this.subscribedStoreList = res?.data?.data || [];
|
|
257
|
+
},
|
|
258
|
+
error: (e) => {
|
|
259
|
+
console.log(e);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
onStoreCheck(event, formArrayIndex, storeId) {
|
|
264
|
+
if (event.target.checked) {
|
|
265
|
+
this.billingGroups.controls.forEach(item => {
|
|
266
|
+
if (item.get('stores')?.value.includes(storeId)) {
|
|
267
|
+
item.get('stores')?.setValue(item.get('stores')?.value.filter((val) => val !== storeId));
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
this.billingGroups.at(formArrayIndex).get('stores')?.setValue([...this.billingGroups.at(formArrayIndex).get('stores')?.value, storeId]);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
this.billingGroups.at(formArrayIndex).get('stores')?.setValue(this.billingGroups.at(formArrayIndex).get('stores')?.value.filter((val) => val !== storeId));
|
|
274
|
+
this.billingGroups.controls.forEach(item => {
|
|
275
|
+
if (item.get('isPrimary')?.value) {
|
|
276
|
+
item.get('stores')?.setValue([...item.get('stores')?.value, storeId]);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
onSelectAllStores(event, formArrayIndex) {
|
|
282
|
+
const subscribedStoreIds = this.subscribedStoreList.map(item => item.storeId);
|
|
283
|
+
if (event.target.checked) {
|
|
284
|
+
this.billingGroups.controls.forEach((group) => {
|
|
285
|
+
group.get('stores')?.value.forEach((store) => {
|
|
286
|
+
if (subscribedStoreIds.includes(store)) {
|
|
287
|
+
group.get('stores')?.setValue(group.get('stores')?.value.filter((item) => item !== store));
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
this.billingGroups.at(formArrayIndex).get('stores')?.setValue([...this.billingGroups.at(formArrayIndex).get('stores')?.value, ...subscribedStoreIds]);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
this.billingGroups.at(formArrayIndex).get('stores')?.setValue(this.billingGroups.at(formArrayIndex).get('stores')?.value.filter((item) => !subscribedStoreIds.includes(item)));
|
|
295
|
+
this.billingGroups.controls.forEach(item => {
|
|
296
|
+
if (item.get('isPrimary')?.value) {
|
|
297
|
+
item.get('stores')?.setValue([...item.get('stores')?.value, ...subscribedStoreIds]);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
isStoreSelectedInGroup(formArrayIndex, storeId) {
|
|
303
|
+
return this.billingGroups.at(formArrayIndex).get('stores')?.value.includes(storeId);
|
|
304
|
+
}
|
|
305
|
+
isAllStoresSelectedInGroup(formArrayIndex) {
|
|
306
|
+
return this.subscribedStoreList.every(item => this.billingGroups.at(formArrayIndex).get('stores')?.value.includes(item.storeId)) && this.subscribedStoreList.length;
|
|
307
|
+
}
|
|
308
|
+
onPageChange(event) {
|
|
309
|
+
this.currentPage = event;
|
|
310
|
+
this.getSubscribedStores({});
|
|
311
|
+
}
|
|
312
|
+
onPageSizeChange(event) {
|
|
313
|
+
this.currentPage = 1;
|
|
314
|
+
this.pageSize = event;
|
|
315
|
+
this.itemsPerPage = event;
|
|
316
|
+
this.getSubscribedStores({});
|
|
317
|
+
}
|
|
318
|
+
omit_special_char(event) {
|
|
319
|
+
var k = event.charCode;
|
|
320
|
+
return (k == 8 || k == 32 || (k >= 48 && k <= 57));
|
|
321
|
+
}
|
|
322
|
+
applyFilters(event) {
|
|
323
|
+
this.currentPage = 1;
|
|
324
|
+
event.forEach((val) => {
|
|
325
|
+
if (val.Description === 'Country')
|
|
326
|
+
this.filterCountries = val.Issues.map((item) => item.id);
|
|
327
|
+
if (val.Description === 'State')
|
|
328
|
+
this.filterStates = val.Issues.map((item) => item.id);
|
|
329
|
+
if (val.Description === 'City')
|
|
330
|
+
this.filterCities = val.Issues.map((item) => item.id);
|
|
331
|
+
});
|
|
332
|
+
this.getSubscribedStores({});
|
|
333
|
+
}
|
|
334
|
+
onEmailKeyDown(event, formArrayIndex) {
|
|
335
|
+
event.stopPropagation();
|
|
336
|
+
if (event.code == 'Backspace' && event.target.value == '') {
|
|
337
|
+
this.billingGroups.at(formArrayIndex).get('generateInvoiceTo')?.setValue(this.billingGroups.at(formArrayIndex).get('generateInvoiceTo')?.value.slice(0, -1));
|
|
338
|
+
}
|
|
339
|
+
if (event.code == 'Enter') {
|
|
340
|
+
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
|
|
341
|
+
if (emailRegex.test(event.target.value)) {
|
|
342
|
+
this.billingGroups.at(formArrayIndex).get('generateInvoiceTo')?.setValue([...this.billingGroups.at(formArrayIndex).get('generateInvoiceTo')?.value, event.target.value]);
|
|
343
|
+
event.target.value = '';
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
removeEmailChip(email, formArrayIndex) {
|
|
348
|
+
this.billingGroups.at(formArrayIndex).get('generateInvoiceTo')?.setValue(this.billingGroups.at(formArrayIndex).get('generateInvoiceTo')?.value.filter((val) => val !== email));
|
|
349
|
+
}
|
|
350
|
+
onSort(column) {
|
|
351
|
+
if (this.sortedColumn === column) {
|
|
352
|
+
this.sortDirection = this.sortDirection === 1 ? -1 : 1;
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
this.sortedColumn = column;
|
|
356
|
+
this.sortDirection = 1;
|
|
357
|
+
}
|
|
358
|
+
this.getSubscribedStores({});
|
|
359
|
+
}
|
|
360
|
+
navigate(formArrayIndex) {
|
|
361
|
+
if (this.billingGroups.at(formArrayIndex).get('isPrimary')?.value) {
|
|
362
|
+
if (this.billingGroups.at(formArrayIndex).get('currentTab')?.value === 'basic-info') {
|
|
363
|
+
this.billingGroups.at(formArrayIndex).get('currentTab')?.setValue('settings');
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
if (this.billingGroups.at(formArrayIndex).get('currentTab')?.value === 'basic-info') {
|
|
368
|
+
this.billingGroups.at(formArrayIndex).get('currentTab')?.setValue('store-selection');
|
|
369
|
+
}
|
|
370
|
+
else if (this.billingGroups.at(formArrayIndex).get('currentTab')?.value === 'store-selection') {
|
|
371
|
+
this.billingGroups.at(formArrayIndex).get('currentTab')?.setValue('settings');
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
addBillingGroup() {
|
|
376
|
+
this.addFormItem({ groupName: `Group ${this.billingGroups.length + 1}`, isPrimary: false });
|
|
377
|
+
}
|
|
378
|
+
onSubmit(formValues, idx) {
|
|
379
|
+
this.submitted = true;
|
|
380
|
+
if (this.billingGroups.at(idx).get('registeredCompanyName')?.invalid) {
|
|
381
|
+
this.billingGroups.at(idx).get('currentTab')?.setValue('basic-info');
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
if (!this.billingGroups.at(idx).get('generateInvoiceTo')?.value.length) {
|
|
385
|
+
this.toastService.getErrorToast('Please add at least one email in Generate Invoice To');
|
|
386
|
+
this.billingGroups.at(idx).get('currentTab')?.setValue('settings');
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
delete formValues.currentTab;
|
|
390
|
+
for (const key in formValues) {
|
|
391
|
+
if (formValues.hasOwnProperty(key)) {
|
|
392
|
+
if (formValues[key] === undefined)
|
|
393
|
+
delete formValues[key];
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
if (formValues._id) {
|
|
397
|
+
this.billingService.updateBillingGroup(formValues).subscribe({
|
|
398
|
+
next: (res) => {
|
|
399
|
+
if (res?.data) {
|
|
400
|
+
this.modalRef.close('success');
|
|
401
|
+
this.toastService.getPrimaryToast('Billing group updated successfully');
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
error: (err) => {
|
|
405
|
+
if (err.error?.code === 400) {
|
|
406
|
+
this.toastService.getErrorToast(err.error.error);
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
this.toastService.getErrorToast('Failed to update billing group');
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
this.billingService.createBillingGroup(formValues).subscribe({
|
|
416
|
+
next: (res) => {
|
|
417
|
+
if (res?.data) {
|
|
418
|
+
this.modalRef.close('success');
|
|
419
|
+
this.toastService.getPrimaryToast('Billing group created successfully');
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
error: (err) => {
|
|
423
|
+
if (err.error?.code === 400) {
|
|
424
|
+
this.toastService.getErrorToast(err.error.error);
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
this.toastService.getErrorToast('Failed to create billing group');
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
getClientProducts() {
|
|
434
|
+
this.billingService.getClientProducts(this.clientId).pipe(takeUntil(this.destroy$)).subscribe({
|
|
435
|
+
next: (res) => {
|
|
436
|
+
if (res?.data?.planDetails?.product?.length) {
|
|
437
|
+
this.subscribedProducts = res.data.planDetails.product.filter((p) => p.status === 'live');
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
onCancel(idx) {
|
|
443
|
+
this.accordion.toggle(idx.toString());
|
|
444
|
+
}
|
|
445
|
+
preventEnter(event) {
|
|
446
|
+
event.preventDefault();
|
|
447
|
+
}
|
|
448
|
+
getProductBillingMethod(formArrayIndex, productName) {
|
|
449
|
+
const products = this.billingGroups.at(formArrayIndex).get('products')?.value || [];
|
|
450
|
+
const found = products.find((p) => p.productName === productName);
|
|
451
|
+
return found?.billingMethod || 'overallStore';
|
|
452
|
+
}
|
|
453
|
+
onBillingMethodChange(formArrayIndex, productName, event) {
|
|
454
|
+
const products = this.billingGroups.at(formArrayIndex).get('products')?.value || [];
|
|
455
|
+
const existing = products.find((p) => p.productName === productName);
|
|
456
|
+
if (existing) {
|
|
457
|
+
existing.billingMethod = event.target.value;
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
products.push({ productName, billingMethod: event.target.value });
|
|
461
|
+
}
|
|
462
|
+
this.billingGroups.at(formArrayIndex).get('products')?.setValue([...products]);
|
|
463
|
+
}
|
|
464
|
+
onBillingMethodSelectChange(formArrayIndex, productName, value) {
|
|
465
|
+
const products = this.billingGroups.at(formArrayIndex).get('products')?.value || [];
|
|
466
|
+
const existing = products.find((p) => p.productName === productName);
|
|
467
|
+
if (existing) {
|
|
468
|
+
existing.billingMethod = value;
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
products.push({ productName, billingMethod: value });
|
|
472
|
+
}
|
|
473
|
+
this.billingGroups.at(formArrayIndex).get('products')?.setValue([...products]);
|
|
474
|
+
}
|
|
475
|
+
formatProductName(name) {
|
|
476
|
+
if (!name)
|
|
477
|
+
return '';
|
|
478
|
+
return name.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
479
|
+
.replace(/^./, (str) => str.toUpperCase());
|
|
480
|
+
}
|
|
481
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingGroupFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BillingService }, { token: i3.NgbActiveModal }, { token: i4.ToastService }], target: i0.ɵɵFactoryTarget.Component });
|
|
482
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingGroupFormComponent, selector: "lib-billing-group-form", inputs: { clientId: "clientId", groupId: "groupId", currentTab: "currentTab" }, viewQueries: [{ propertyName: "accordion", first: true, predicate: NgbAccordionDirective, descendants: true }], ngImport: i0, template: "<div class=\"modal-body\">\r\n<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"groupTagOptions\" [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 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\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 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 </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n 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\r\n <ng-container *ngIf=\"(subscribedStoresApiState | 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 </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"after15\" value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoice_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoice_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\" id=\"after15\"\r\n value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoiceSingle_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoiceSingle_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>\r\n</div>", styles: [":host{display:block}.modal-body{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.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;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.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}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: i3.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i3.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i3.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i3.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i3.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i3.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i4.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "label", "data"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
|
|
483
|
+
}
|
|
484
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingGroupFormComponent, decorators: [{
|
|
485
|
+
type: Component,
|
|
486
|
+
args: [{ selector: 'lib-billing-group-form', template: "<div class=\"modal-body\">\r\n<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"groupTagOptions\" [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 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\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 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 </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n 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\r\n <ng-container *ngIf=\"(subscribedStoresApiState | 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 </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"after15\" value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoice_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoice_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\" id=\"after15\"\r\n value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoiceSingle_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoiceSingle_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>\r\n</div>", styles: [":host{display:block}.modal-body{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.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;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.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}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"] }]
|
|
487
|
+
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.BillingService }, { type: i3.NgbActiveModal }, { type: i4.ToastService }], propDecorators: { clientId: [{
|
|
488
|
+
type: Input
|
|
489
|
+
}], groupId: [{
|
|
490
|
+
type: Input
|
|
491
|
+
}], currentTab: [{
|
|
492
|
+
type: Input
|
|
493
|
+
}], accordion: [{
|
|
494
|
+
type: ViewChild,
|
|
495
|
+
args: [NgbAccordionDirective]
|
|
496
|
+
}] } });
|
|
497
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3VwLWZvcm0vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3VwLWZvcm0vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBMEIsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0YsT0FBTyxFQUFFLHFCQUFxQixFQUFrQixNQUFNLDRCQUE0QixDQUFDOzs7Ozs7OztBQVNuRixNQUFNLE9BQU8seUJBQXlCO0lBcUQxQjtJQUNBO0lBQ0Q7SUFDQztJQXRERCxRQUFRLENBQVM7SUFDakIsT0FBTyxDQUFTO0lBQ2hCLFVBQVUsQ0FBUztJQUM1QixXQUFXLENBQVk7SUFDdkIsU0FBUyxDQUFVO0lBQ25CLFVBQVUsR0FBMEIsRUFBRSxDQUFDO0lBQ3ZDLG1CQUFtQixHQUFVLEVBQUUsQ0FBQztJQUNoQyxlQUFlLEdBQVUsRUFBRSxDQUFDO0lBQzVCLFlBQVksR0FBVSxFQUFFLENBQUM7SUFDekIsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUN6QixX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WTtRQUM1QixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUM7YUFDNUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQzt3R0F6ZlUseUJBQXlCOzRGQUF6Qix5QkFBeUIseUxBNEN6QixxQkFBcUIsZ0RDeERsQyxtbXZEQTJ2Qk07OzRGRC91Qk8seUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHdCQUF3QjtxS0FNekIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkF3QzRCLFNBQVM7c0JBQTFDLFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ2JBY2NvcmRpb25EaXJlY3RpdmUsIE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XG5pbXBvcnQgeyBCaWxsaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1iaWxsaW5nLWdyb3VwLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2JpbGxpbmctZ3JvdXAtZm9ybS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEJpbGxpbmdHcm91cEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgY2xpZW50SWQ6IHN0cmluZztcbiAgQElucHV0KCkgZ3JvdXBJZDogc3RyaW5nO1xuICBASW5wdXQoKSBjdXJyZW50VGFiOiBzdHJpbmc7XG4gIGJpbGxpbmdGb3JtOiBGb3JtR3JvdXA7XG4gIHN1Ym1pdHRlZDogYm9vbGVhbjtcbiAgZmlsdGVyRGF0YTogUmVjb3JkPHN0cmluZywgYW55PltdID0gW107XG4gIHN1YnNjcmliZWRTdG9yZUxpc3Q6IGFueVtdID0gW107XG4gIGZpbHRlckNvdW50cmllczogYW55W10gPSBbXTtcbiAgZmlsdGVyU3RhdGVzOiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJDaXRpZXM6IGFueVtdID0gW107XG4gIHNlYXJjaElucHV0ID0gbmV3IEZvcm1Db250cm9sKCcnKTtcbiAgc2VhcmNoVGVybTogc3RyaW5nO1xuICBzb3J0ZWRDb2x1bW46IHN0cmluZztcbiAgc29ydERpcmVjdGlvbjogbnVtYmVyO1xuICBzdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PCdpbml0aWFsJyB8ICdsb2FkaW5nJyB8ICdsb2FkZWQnPignaW5pdGlhbCcpO1xuICBzdWJzY3JpYmVkUHJvZHVjdHM6IGFueVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGdyb3VwVGFnT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnc3RvcmUnLCBsYWJlbDogJ1N0b3JlJyB9LFxuICAgIHsgdmFsdWU6ICdnc3QnLCBsYWJlbDogJ0dTVCcgfVxuICBdO1xuICBjdXJyZW5jeU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ2RvbGxhcicsIGxhYmVsOiAnRG9sbGFyJyB9LFxuICAgIHsgdmFsdWU6ICdpbnInLCBsYWJlbDogJ0lOUicgfVxuICBdO1xuICBwYXltZW50Q3ljbGVPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdtb250aGx5JywgbGFiZWw6ICdNb250aGx5JyB9LFxuICAgIHsgdmFsdWU6ICdxdWFydGVyJywgbGFiZWw6ICdRdWFydGVybHknIH0sXG4gICAgeyB2YWx1ZTogJ2hhbGZZZWFybHknLCBsYWJlbDogJ0hhbGYgeWVhcmx5JyB9LFxuICAgIHsgdmFsdWU6ICd5ZWFybHknLCBsYWJlbDogJ1llYXJseScgfVxuICBdO1xuICBwYXltZW50VGVybU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogMzAsIGxhYmVsOiAnMzAnIH0sXG4gICAgeyB2YWx1ZTogNDUsIGxhYmVsOiAnNDUnIH0sXG4gICAgeyB2YWx1ZTogNjAsIGxhYmVsOiAnNjAnIH0sXG4gICAgeyB2YWx1ZTogOTAsIGxhYmVsOiAnOTAnIH1cbiAgXTtcbiAgYmlsbGluZ01ldGhvZE9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ2VhY2hTdG9yZScsIGxhYmVsOiAnRWFjaCBTdG9yZSBXaXNlJyB9LFxuICAgIHsgdmFsdWU6ICdvdmVyYWxsU3RvcmUnLCBsYWJlbDogJ092ZXJhbGwgU3RvcmUgV2lzZScgfVxuICBdO1xuICBAVmlld0NoaWxkKE5nYkFjY29yZGlvbkRpcmVjdGl2ZSkgYWNjb3JkaW9uOiBOZ2JBY2NvcmRpb25EaXJlY3RpdmU7XG5cbiAgaXRlbXNQZXJQYWdlID0gMTA7XG4gIGN1cnJlbnRQYWdlID0gMTtcbiAgdG90YWxJdGVtcyA9IDA7XG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcbiAgcGFnZVNpemUgPSAxMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwdWJsaWMgbW9kYWxSZWY6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmdldEJpbGxpbmdHcm91cHMoKTtcbiAgICB0aGlzLmdldENsaWVudFByb2R1Y3RzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHsgZ2V0RmlsdGVyczogdHJ1ZSB9KTtcblxuICAgIHRoaXMuc2VhcmNoSW5wdXQudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICBkZWJvdW5jZVRpbWUoMTAwMCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKS5zdWJzY3JpYmUoKHZhbCkgPT4ge1xuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsO1xuICAgICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBjcmVhdGVGb3JtKCkge1xuICAgIHRoaXMuYmlsbGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGdyb3VwczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgfSk7XG4gIH1cblxuICBnZXRCaWxsaW5nR3JvdXBzKCkge1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0QWxsQmlsbGluZ0dyb3Vwcyh0aGlzLmNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzPy5kYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXMuZGF0YS5mb3JFYWNoKChncm91cDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhdGNoRm9ybUl0ZW0oeyAuLi5ncm91cCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmdldCgnX2lkJyk/LnZhbHVlID09PSB0aGlzLmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShpZHgudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VGFiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSh0aGlzLmN1cnJlbnRUYWIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSAnJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBJZCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5kYXRhLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5hY2NvcmRpb24udG9nZ2xlKCcwJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHBhdGNoRm9ybUl0ZW0oeyBncm91cE5hbWUsIGdyb3VwVGFnLCByZWdpc3RlcmVkQ29tcGFueU5hbWUsIGdzdCwgYWRkcmVzc0xpbmVPbmUsIGFkZHJlc3NMaW5lVHdvLCBjaXR5LCBzdGF0ZSwgY291bnRyeSxcbiAgICBwaW5Db2RlLCBwbGFjZU9mU3VwcGx5LCBwbywgc3RvcmVzLCBwcm9SYXRhLCBwYXltZW50Q2F0ZWdvcnksIGN1cnJlbmN5LCBpc0luc3RhbGxhdGlvbk9uZVRpbWUsIGluc3RhbGxhdGlvbkZlZSwgcGF5bWVudEN5Y2xlLFxuICAgIHBheW1lbnRUZXJtLCBnZW5lcmF0ZUludm9pY2VUbywgYXR0YWNoQW5uZXh1cmUsIGlzUHJpbWFyeSwgYWR2YW5jZUludm9pY2UsIHByb2R1Y3RzLCBfaWQgfTogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGdyb3VwTmFtZTogW2dyb3VwTmFtZSB8fCAnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGdyb3VwVGFnOiBbZ3JvdXBUYWcgfHwgJ3N0b3JlJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHJlZ2lzdGVyZWRDb21wYW55TmFtZTogW3JlZ2lzdGVyZWRDb21wYW55TmFtZSB8fCAnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGdzdDogW2dzdCB8fCAnJ10sXG4gICAgICBhZGRyZXNzTGluZU9uZTogW2FkZHJlc3NMaW5lT25lIHx8ICcnXSxcbiAgICAgIGFkZHJlc3NMaW5lVHdvOiBbYWRkcmVzc0xpbmVUd28gfHwgJyddLFxuICAgICAgY2l0eTogW2NpdHkgfHwgJyddLFxuICAgICAgc3RhdGU6IFtzdGF0ZSB8fCAnJ10sXG4gICAgICBjb3VudHJ5OiBbY291bnRyeSB8fCAnJ10sXG4gICAgICBwaW5Db2RlOiBbcGluQ29kZSB8fCAnJ10sXG4gICAgICBwbGFjZU9mU3VwcGx5OiBbcGxhY2VPZlN1cHBseSB8fCAnJ10sXG4gICAgICBwbzogW3BvIHx8ICcnXSxcbiAgICAgIHN0b3JlczogW3N0b3JlcyB8fCBbXV0sXG4gICAgICBwcm9SYXRhOiBbcHJvUmF0YSB8fCAnYmVmb3JlMTUnXSxcbiAgICAgIHBheW1lbnRDYXRlZ29yeTogW3BheW1lbnRDYXRlZ29yeSB8fCAncG9zdCddLFxuICAgICAgY3VycmVuY3k6IFtjdXJyZW5jeSB8fCAnZG9sbGFyJ10sXG4gICAgICBpc0luc3RhbGxhdGlvbk9uZVRpbWU6IFtpc0luc3RhbGxhdGlvbk9uZVRpbWUgfHwgZmFsc2VdLFxuICAgICAgaW5zdGFsbGF0aW9uRmVlOiBbeyB2YWx1ZTogaW5zdGFsbGF0aW9uRmVlIHx8ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcbiAgICAgIHBheW1lbnRDeWNsZTogW3BheW1lbnRDeWNsZSB8fCAnbW9udGhseSddLFxuICAgICAgcGF5bWVudFRlcm06IFtwYXltZW50VGVybSB8fCAzMF0sXG4gICAgICBnZW5lcmF0ZUludm9pY2VUbzogW2dlbmVyYXRlSW52b2ljZVRvIHx8IFtdXSxcbiAgICAgIGF0dGFjaEFubmV4dXJlOiBbYXR0YWNoQW5uZXh1cmUgfHwgZmFsc2VdLFxuICAgICAgaXNQcmltYXJ5OiBbaXNQcmltYXJ5IHx8IGZhbHNlXSxcbiAgICAgIGFkdmFuY2VJbnZvaWNlOiBbYWR2YW5jZUludm9pY2UgfHwgZmFsc2VdLFxuICAgICAgcHJvZHVjdHM6IFtwcm9kdWN0cyB8fCBbXV0sXG4gICAgICBjdXJyZW50VGFiOiBbJ2Jhc2ljLWluZm8nXSxcbiAgICAgIGNsaWVudElkOiBbdGhpcy5jbGllbnRJZF0sXG4gICAgICBfaWQ6IFtfaWRdXG4gICAgfSk7XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLnB1c2goaXRlbSk7XG4gIH1cblxuICBhZGRGb3JtSXRlbSh7IGlzUHJpbWFyeSwgZ3JvdXBOYW1lIH06IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCBzdHJpbmc+KSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZ3JvdXBOYW1lOiBbZ3JvdXBOYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZ3JvdXBUYWc6IFsnc3RvcmUnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgcmVnaXN0ZXJlZENvbXBhbnlOYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBnc3Q6IFsnJ10sXG4gICAgICBhZGRyZXNzTGluZU9uZTogWycnXSxcbiAgICAgIGFkZHJlc3NMaW5lVHdvOiBbJyddLFxuICAgICAgY2l0eTogWycnXSxcbiAgICAgIHN0YXRlOiBbJyddLFxuICAgICAgY291bnRyeTogWycnXSxcbiAgICAgIHBpbkNvZGU6IFsnJ10sXG4gICAgICBwbGFjZU9mU3VwcGx5OiBbJyddLFxuICAgICAgcG86IFsnJ10sXG4gICAgICBzdG9yZXM6IFtbXV0sXG4gICAgICBwcm9SYXRhOiBbJ2JlZm9yZTE1J10sXG4gICAgICBwYXltZW50Q2F0ZWdvcnk6IFsncG9zdCddLFxuICAgICAgY3VycmVuY3k6IFsnZG9sbGFyJ10sXG4gICAgICBpc0luc3RhbGxhdGlvbk9uZVRpbWU6IFtmYWxzZV0sXG4gICAgICBpbnN0YWxsYXRpb25GZWU6IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXG4gICAgICBwYXltZW50Q3ljbGU6IFsnbW9udGhseSddLFxuICAgICAgcGF5bWVudFRlcm06IFszMF0sXG4gICAgICBnZW5lcmF0ZUludm9pY2VUbzogW1tdXSxcbiAgICAgIGF0dGFjaEFubmV4dXJlOiBbZmFsc2VdLFxuICAgICAgaXNQcmltYXJ5OiBbaXNQcmltYXJ5XSxcbiAgICAgIGFkdmFuY2VJbnZvaWNlOiBbZmFsc2VdLFxuICAgICAgcHJvZHVjdHM6IFtbXV0sXG4gICAgICBjdXJyZW50VGFiOiBbJ2Jhc2ljLWluZm8nXSxcbiAgICAgIGNsaWVudElkOiBbdGhpcy5jbGllbnRJZF1cbiAgICB9KTtcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMucHVzaChpdGVtKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShgJHt0aGlzLmJpbGxpbmdHcm91cHMubGVuZ3RoIC0gMX1gKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGdldCBiaWxsaW5nR3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLmJpbGxpbmdGb3JtLmdldCgnZ3JvdXBzJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgb25UYWJDaGFuZ2UoaWR4OiBudW1iZXIsIHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKHZhbCk7XG4gIH1cblxuICBvbkRlbGV0ZUdyb3VwKGlkeDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnX2lkJyk/LnZhbHVlKSB7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmRlbGV0ZUJpbGxpbmdHcm91cCh0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ19pZCcpPy52YWx1ZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcbiAgICAgICAgICAgICAgICBncm91cC5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4uZ3JvdXAuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnc3RvcmVzJyk/LnZhbHVlXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLnJlbW92ZUF0KGlkeCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICBpZiAoZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcbiAgICAgICAgICBncm91cC5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4uZ3JvdXAuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnc3RvcmVzJyk/LnZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLnJlbW92ZUF0KGlkeCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7IGdldEZpbHRlcnMgfTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4pIHtcbiAgICB0aGlzLnN1YnNjcmliZWRTdG9yZXNBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJyk7XG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplLFxuICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlLFxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBzb3J0Q29sdW1uOiB0aGlzLnNvcnRlZENvbHVtbixcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0RGlyZWN0aW9uLFxuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMuc2VhcmNoVGVybSxcbiAgICAgIGNvdW50cnk6IHRoaXMuZmlsdGVyQ291bnRyaWVzLFxuICAgICAgc3RhdGU6IHRoaXMuZmlsdGVyU3RhdGVzLFxuICAgICAgY2l0eTogdGhpcy5maWx0ZXJDaXRpZXMsXG4gICAgICBnZXRGaWx0ZXJzOiBnZXRGaWx0ZXJzXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKGRhdGFba2V5XSA9PT0gdW5kZWZpbmVkIHx8IGRhdGFba2V5XSA9PT0gJycpIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFba2V5XSkgJiYgIWRhdGFba2V5XS5sZW5ndGgpIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5nZXRTdWJzY3JpYmVkU3RvcmVzKGRhdGEpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlLm5leHQoJ2xvYWRlZCcpO1xuICAgICAgICBpZiAoZ2V0RmlsdGVycykge1xuICAgICAgICAgIGlmIChyZXM/LmRhdGE/LmNvdW50cmllcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckRhdGEucHVzaCh7IERlc2NyaXB0aW9uOiAnQ291bnRyeScsIElzc3VlczogcmVzLmRhdGEuY291bnRyaWVzLm1hcCgodmFsOiBhbnkpID0+ICh7IHRleHQ6IHZhbC5faWQsIGlkOiB2YWwuX2lkIH0pKSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YT8uc3RhdGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YS5wdXNoKHsgRGVzY3JpcHRpb246ICdTdGF0ZScsIElzc3VlczogcmVzLmRhdGEuc3RhdGVzLm1hcCgodmFsOiBhbnkpID0+ICh7IHRleHQ6IHZhbC5faWQsIGlkOiB2YWwuX2lkIH0pKSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YT8uY2l0aWVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YS5wdXNoKHsgRGVzY3JpcHRpb246ICdDaXR5JywgSXNzdWVzOiByZXMuZGF0YS5jaXRpZXMubWFwKCh2YWw6IGFueSkgPT4gKHsgdGV4dDogdmFsLl9pZCwgaWQ6IHZhbC5faWQgfSkpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSByZXM/LmRhdGE/LnBhZ2VJbmZvPy5jb3VudCB8fCAwO1xuICAgICAgICB0aGlzLnN1YnNjcmliZWRTdG9yZUxpc3QgPSByZXM/LmRhdGE/LmRhdGEgfHwgW107XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblN0b3JlQ2hlY2soZXZlbnQ6IGFueSwgZm9ybUFycmF5SW5kZXg6IG51bWJlciwgc3RvcmVJZDogc3RyaW5nKSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uZ2V0KCdzdG9yZXMnKT8udmFsdWUuaW5jbHVkZXMoc3RvcmVJZCkpIHtcbiAgICAgICAgICBpdGVtLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKGl0ZW0uZ2V0KCdzdG9yZXMnKT8udmFsdWUuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICE9PSBzdG9yZUlkKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgc3RvcmVJZF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFxuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZpbHRlcigodmFsOiBzdHJpbmcpID0+IHZhbCAhPT0gc3RvcmVJZClcbiAgICAgICk7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcbiAgICAgICAgICBpdGVtLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5pdGVtLmdldCgnc3RvcmVzJyk/LnZhbHVlLCBzdG9yZUlkXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VsZWN0QWxsU3RvcmVzKGV2ZW50OiBhbnksIGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBzdWJzY3JpYmVkU3RvcmVJZHMgPSB0aGlzLnN1YnNjcmliZWRTdG9yZUxpc3QubWFwKGl0ZW0gPT4gaXRlbS5zdG9yZUlkKTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgICBncm91cC5nZXQoJ3N0b3JlcycpPy52YWx1ZS5mb3JFYWNoKChzdG9yZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKHN1YnNjcmliZWRTdG9yZUlkcy5pbmNsdWRlcyhzdG9yZSkpIHtcbiAgICAgICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKGdyb3VwLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSBzdG9yZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnN1YnNjcmliZWRTdG9yZUlkc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFxuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZpbHRlcigoaXRlbTogYW55KSA9PiAhc3Vic2NyaWJlZFN0b3JlSWRzLmluY2x1ZGVzKGl0ZW0pKVxuICAgICAgKTtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSkge1xuICAgICAgICAgIGl0ZW0uZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLml0ZW0uZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnN1YnNjcmliZWRTdG9yZUlkc10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc1N0b3JlU2VsZWN0ZWRJbkdyb3VwKGZvcm1BcnJheUluZGV4OiBudW1iZXIsIHN0b3JlSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmluY2x1ZGVzKHN0b3JlSWQpO1xuICB9XG5cbiAgaXNBbGxTdG9yZXNTZWxlY3RlZEluR3JvdXAoZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmliZWRTdG9yZUxpc3QuZXZlcnkoaXRlbSA9PiB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmluY2x1ZGVzKGl0ZW0uc3RvcmVJZCkpICYmIHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdC5sZW5ndGg7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldmVudDtcbiAgICB0aGlzLmdldFN1YnNjcmliZWRTdG9yZXMoe30pO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShldmVudDogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50O1xuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gZXZlbnQ7XG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KTtcbiAgfVxuXG4gIG9taXRfc3BlY2lhbF9jaGFyKGV2ZW50OiBhbnkpIHtcbiAgICB2YXIgayA9IGV2ZW50LmNoYXJDb2RlO1xuICAgIHJldHVybiAoayA9PSA4IHx8IGsgPT0gMzIgfHwgKGsgPj0gNDggJiYgayA8PSA1NykpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXJzKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICBldmVudC5mb3JFYWNoKCh2YWw6IGFueSkgPT4ge1xuICAgICAgaWYgKHZhbC5EZXNjcmlwdGlvbiA9PT0gJ0NvdW50cnknKSB0aGlzLmZpbHRlckNvdW50cmllcyA9IHZhbC5Jc3N1ZXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQpO1xuICAgICAgaWYgKHZhbC5EZXNjcmlwdGlvbiA9PT0gJ1N0YXRlJykgdGhpcy5maWx0ZXJTdGF0ZXMgPSB2YWwuSXNzdWVzLm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmlkKTtcbiAgICAgIGlmICh2YWwuRGVzY3JpcHRpb24gPT09ICdDaXR5JykgdGhpcy5maWx0ZXJDaXRpZXMgPSB2YWwuSXNzdWVzLm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmlkKTtcbiAgICB9KTtcbiAgICB0aGlzLmdldFN1YnNjcmliZWRTdG9yZXMoe30pO1xuICB9XG5cbiAgb25FbWFpbEtleURvd24oZXZlbnQ6IGFueSwgZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChldmVudC5jb2RlID09ICdCYWNrc3BhY2UnICYmIGV2ZW50LnRhcmdldC52YWx1ZSA9PSAnJykge1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnNldFZhbHVlKFxuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWUuc2xpY2UoMCwgLTEpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY29kZSA9PSAnRW50ZXInKSB7XG4gICAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xuICAgICAgaWYgKGVtYWlsUmVnZXgudGVzdChldmVudC50YXJnZXQudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy5zZXRWYWx1ZShcbiAgICAgICAgICBbLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlLCBldmVudC50YXJnZXQudmFsdWVdXG4gICAgICAgICk7XG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUVtYWlsQ2hpcChlbWFpbDogc3RyaW5nLCBmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnNldFZhbHVlKFxuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlLmZpbHRlcigodmFsOiBzdHJpbmcpID0+IHZhbCAhPT0gZW1haWwpXG4gICAgKTtcbiAgfVxuXG4gIG9uU29ydChjb2x1bW46IHN0cmluZykge1xuICAgIGlmICh0aGlzLnNvcnRlZENvbHVtbiA9PT0gY29sdW1uKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb24gPT09IDEgPyAtMSA6IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydGVkQ29sdW1uID0gY29sdW1uO1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gMTtcbiAgICB9XG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KTtcbiAgfVxuXG4gIG5hdmlnYXRlKGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUoJ3NldHRpbmdzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdzdG9yZS1zZWxlY3Rpb24nKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzdG9yZS1zZWxlY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdzZXR0aW5ncycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZEJpbGxpbmdHcm91cCgpIHtcbiAgICB0aGlzLmFkZEZvcm1JdGVtKHsgZ3JvdXBOYW1lOiBgR3JvdXAgJHt0aGlzLmJpbGxpbmdHcm91cHMubGVuZ3RoICsgMX1gLCBpc1ByaW1hcnk6IGZhbHNlIH0pO1xuICB9XG5cbiAgb25TdWJtaXQoZm9ybVZhbHVlczogYW55LCBpZHg6IG51bWJlcikge1xuICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUoJ2Jhc2ljLWluZm8nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWUubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdQbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSBlbWFpbCBpbiBHZW5lcmF0ZSBJbnZvaWNlIFRvJyk7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUoJ3NldHRpbmdzJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGVsZXRlIGZvcm1WYWx1ZXMuY3VycmVudFRhYjtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm1WYWx1ZXMpIHtcbiAgICAgIGlmIChmb3JtVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKGZvcm1WYWx1ZXNba2V5XSA9PT0gdW5kZWZpbmVkKSBkZWxldGUgZm9ybVZhbHVlc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb3JtVmFsdWVzLl9pZCkge1xuICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS51cGRhdGVCaWxsaW5nR3JvdXAoZm9ybVZhbHVlcykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tb2RhbFJlZi5jbG9zZSgnc3VjY2VzcycpO1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0UHJpbWFyeVRvYXN0KCdCaWxsaW5nIGdyb3VwIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGVyci5lcnJvcj8uY29kZSA9PT0gNDAwKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVyci5lcnJvci5lcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byB1cGRhdGUgYmlsbGluZyBncm91cCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuY3JlYXRlQmlsbGluZ0dyb3VwKGZvcm1WYWx1ZXMpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXM/LmRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2UoJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFByaW1hcnlUb2FzdCgnQmlsbGluZyBncm91cCBjcmVhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChlcnIuZXJyb3I/LmNvZGUgPT09IDQwMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3IuZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gY3JlYXRlIGJpbGxpbmcgZ3JvdXAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldENsaWVudFByb2R1Y3RzKCkge1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0Q2xpZW50UHJvZHVjdHModGhpcy5jbGllbnRJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcz8uZGF0YT8ucGxhbkRldGFpbHM/LnByb2R1Y3Q/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuc3Vic2NyaWJlZFByb2R1Y3RzID0gcmVzLmRhdGEucGxhbkRldGFpbHMucHJvZHVjdC5maWx0ZXIoKHA6IGFueSkgPT4gcC5zdGF0dXMgPT09ICdsaXZlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uQ2FuY2VsKGlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5hY2NvcmRpb24udG9nZ2xlKGlkeC50b1N0cmluZygpKTtcbiAgfVxuXG4gIHByZXZlbnRFbnRlcihldmVudDogYW55KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIGdldFByb2R1Y3RCaWxsaW5nTWV0aG9kKGZvcm1BcnJheUluZGV4OiBudW1iZXIsIHByb2R1Y3ROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb2R1Y3RzID0gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3Byb2R1Y3RzJyk/LnZhbHVlIHx8IFtdO1xuICAgIGNvbnN0IGZvdW5kID0gcHJvZHVjdHMuZmluZCgocDogYW55KSA9PiBwLnByb2R1Y3ROYW1lID09PSBwcm9kdWN0TmFtZSk7XG4gICAgcmV0dXJuIGZvdW5kPy5iaWxsaW5nTWV0aG9kIHx8ICdvdmVyYWxsU3RvcmUnO1xuICB9XG5cbiAgb25CaWxsaW5nTWV0aG9kQ2hhbmdlKGZvcm1BcnJheUluZGV4OiBudW1iZXIsIHByb2R1Y3ROYW1lOiBzdHJpbmcsIGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBwcm9kdWN0cyA9IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdwcm9kdWN0cycpPy52YWx1ZSB8fCBbXTtcbiAgICBjb25zdCBleGlzdGluZyA9IHByb2R1Y3RzLmZpbmQoKHA6IGFueSkgPT4gcC5wcm9kdWN0TmFtZSA9PT0gcHJvZHVjdE5hbWUpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcuYmlsbGluZ01ldGhvZCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZHVjdHMucHVzaCh7IHByb2R1Y3ROYW1lLCBiaWxsaW5nTWV0aG9kOiBldmVudC50YXJnZXQudmFsdWUgfSk7XG4gICAgfVxuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdwcm9kdWN0cycpPy5zZXRWYWx1ZShbLi4ucHJvZHVjdHNdKTtcbiAgfVxuXG4gIG9uQmlsbGluZ01ldGhvZFNlbGVjdENoYW5nZShmb3JtQXJyYXlJbmRleDogbnVtYmVyLCBwcm9kdWN0TmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvZHVjdHMgPSB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgncHJvZHVjdHMnKT8udmFsdWUgfHwgW107XG4gICAgY29uc3QgZXhpc3RpbmcgPSBwcm9kdWN0cy5maW5kKChwOiBhbnkpID0+IHAucHJvZHVjdE5hbWUgPT09IHByb2R1Y3ROYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGV4aXN0aW5nLmJpbGxpbmdNZXRob2QgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZHVjdHMucHVzaCh7IHByb2R1Y3ROYW1lLCBiaWxsaW5nTWV0aG9kOiB2YWx1ZSB9KTtcbiAgICB9XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3Byb2R1Y3RzJyk/LnNldFZhbHVlKFsuLi5wcm9kdWN0c10pO1xuICB9XG5cbiAgZm9ybWF0UHJvZHVjdE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiAnJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEgJDInKVxuICAgICAgLnJlcGxhY2UoL14uLywgKHN0cikgPT4gc3RyLnRvVXBwZXJDYXNlKCkpO1xuICB9XG59IiwiPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItNVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgICAgIFVwZGF0ZSBCaWxsaW5nIEluZm9ybWF0aW9uXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkQmlsbGluZ0dyb3VwKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIG5lZWRoZWxwXCI+PHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC4wMDEzIDQuMTY2MDJWMTUuODMyN000LjE2Nzk3IDkuOTk5MzVIMTUuODM0NlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+QWRkIEJpbGxpbmcgR3JvdXA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcblxyXG48Zm9ybSBbZm9ybUdyb3VwXT1cImJpbGxpbmdGb3JtXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiYmlsbGluZ0dyb3Vwcy5sZW5ndGggPiAxXCIgZm9ybUFycmF5TmFtZT1cImdyb3Vwc1wiIG5nYkFjY29yZGlvbiBhY2NvcmRpb249XCJOZ2JBY2NvcmRpb25cIlxyXG4gICAgICAgIFtjbG9zZU90aGVyc109XCJ0cnVlXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgYmlsbGluZ0dyb3Vwcy5jb250cm9sczsgbGV0IGkgPSBpbmRleDtcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCJcclxuICAgICAgICAgICAgW25nYkFjY29yZGlvbkl0ZW1dPVwiaS50b1N0cmluZygpXCIgY2xhc3M9XCJtYi01XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1haW5oZWFkaW5nIHAtMFwiIG5nYkFjY29yZGlvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIj57e2dyb3VwLmdldCgnZ3JvdXBOYW1lJyk/LnZhbHVlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiIGNsYXNzPVwicHJpbWFyeS1iYWRnZVwiPlByaW1hcnk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBvbkRlbGV0ZUdyb3VwKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yLjUgNC45OTkzNUg0LjE2NjY3TTQuMTY2NjcgNC45OTkzNUwxNy41IDQuOTk5MzVNNC4xNjY2NyA0Ljk5OTM1TDQuMTY2NjcgMTYuNjY2QzQuMTY2NjcgMTcuMTA4IDQuMzQyMjYgMTcuNTMyIDQuNjU0ODIgMTcuODQ0NUM0Ljk2NzM4IDE4LjE1NzEgNS4zOTEzMSAxOC4zMzI3IDUuODMzMzMgMTguMzMyN0gxNC4xNjY3QzE0LjYwODcgMTguMzMyNyAxNS4wMzI2IDE4LjE1NzEgMTUuMzQ1MiAxNy44NDQ1QzE1LjY1NzcgMTcuNTMyIDE1LjgzMzMgMTcuMTA4IDE1LjgzMzMgMTYuNjY2TDE1LjgzMzMgNC45OTkzNUw0LjE2NjY3IDQuOTk5MzVaTTYuNjY2NjcgNC45OTkzNVYzLjMzMjY4QzYuNjY2NjcgMi44OTA2NSA2Ljg0MjI2IDIuNDY2NzMgNy4xNTQ4MiAyLjE1NDE3QzcuNDY3MzggMS44NDE2MSA3Ljg5MTMxIDEuNjY2MDIgOC4zMzMzMyAxLjY2NjAyTDExLjY2NjcgMS42NjYwMkMxMi4xMDg3IDEuNjY2MDIgMTIuNTMyNiAxLjg0MTYxIDEyLjg0NTIgMi4xNTQxN0MxMy4xNTc3IDIuNDY2NzMgMTMuMzMzMyAyLjg5MDY1IDEzLjMzMzMgMy4zMzI2OFY0Ljk5OTM1TTguMzMzMzMgOS4xNjYwMkw4LjMzMzMzIDE0LjE2Nk0xMS42NjY3IDkuMTY2MDJWMTQuMTY2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5IGNsYXNzPVwicHMtMCBwZS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBbbmdDbGFzc109XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSA/ICdyb3ctY29scy0yJyA6ICcnXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYiByb3cgcm93LWNvbHMtMyAgZy0wIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ2Jhc2ljLWluZm8nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycgPyAnc2VsZWN0ZWQnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbVwiPkJhc2ljIEluZm88L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGksICdzdG9yZS1zZWxlY3Rpb24nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc3RvcmUtc2VsZWN0aW9uJyA/ICdzZWxlY3RlZCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtXCI+U3RvcmUgU2VsZWN0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblRhYkNoYW5nZShpLCAnc2V0dGluZ3MnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnID8gJ3NlbGVjdGVkJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW1cIj5TZXR0aW5nczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ2Jhc2ljLWluZm8nID8gJ2Qtbm9uZScgOiAnJ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdyb3VwTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdyb3VwIE5hbWUqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImdyb3VwTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdncm91cE5hbWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2dyb3VwTmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dyb3VwTmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdncm91cE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBUYWdcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiZ3JvdXBUYWdPcHRpb25zXCIgW2xhYmVsXT1cIidHcm91cCBUYWcqJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnZ3JvdXBUYWcnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3JvdXBUYWcnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCB0YWcgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UmVnaXN0ZXJlZCBDb21wYW55IE5hbWUqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGNvbXBhbnkgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJnc3RcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5HU1Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZ3N0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZ3N0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdnc3QnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdnc3QnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1QgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01IHN1Yi1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgRGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc0xpbmVPbmVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5BZGRyZXNzIGxpbmUgMTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzTGluZU9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVPbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzTGluZVR3b1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkZHJlc3MgbGluZSAyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lVHdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzTGluZVR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DaXR5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNpdHlcIiBmb3JtQ29udHJvbE5hbWU9XCJjaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjaXR5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY2l0eScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjaXR5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2l0eSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGF0ZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0YXRlL3Byb3ZpbmNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInN0YXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnc3RhdGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnc3RhdGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnc3RhdGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb3VudHJ5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q291bnRyeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaW5Db2RlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGluIGNvZGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGluQ29kZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGluIGNvZGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGxhY2VPZlN1cHBseVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBsYWNlIG9mIFN1cHBseTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwbGFjZU9mU3VwcGx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwbGFjZU9mU3VwcGx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Ugb2Ygc3VwcGx5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UE88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicG9cIiBmb3JtQ29udHJvbE5hbWU9XCJwb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncG8nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncG8nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXJjaGFzZSBvcmRlciBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ3N0b3JlLXNlbGVjdGlvbicgPyAnZC1ub25lJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjUgMTBMMTEuNDMgMTAuNzNDMTIuNDEgOS41OSAxMyA4LjExIDEzIDYuNUMxMyAyLjkxIDEwLjA5IDAgNi41IDBDMi45MSAwIDAgMi45MSAwIDYuNUMwIDEwLjA5IDIuOTEgMTMgNi41IDEzQzguMTEgMTMgOS41OSAxMi40MSAxMC43MyAxMS40M0wxMC4yNzYyIDExLjcxTDE2IDE3LjQ5TDE3LjQ5IDE2TDExLjUgMTBaTTYuNSAxMUM0LjAxIDExIDIgOC45OSAyIDYuNUMyIDQuMDEgNC4wMSAyIDYuNSAyQzguOTkgMiAxMSA0LjAxIDExIDYuNUMxMSA4Ljk5IDguOTkgMTEgNi41IDExWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJibGFja1wiIGZpbGwtb3BhY2l0eT1cIjAuNTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgW2Zvcm1Db250cm9sXT1cInNlYXJjaElucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFN0b3JlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZmlsdGVycyAqbmdJZj1cImZpbHRlckRhdGEubGVuZ3RoXCIgY2xhc3M9XCJtZS0yXCIgW2RhdGFPYmplY3RdPVwiZmlsdGVyRGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGVkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1YnNjcmliZWRTdG9yZUxpc3Q/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIHN0b3JlLXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYm90dG9tLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cImlzQWxsU3RvcmVzU2VsZWN0ZWRJbkdyb3VwKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RBbGxTdG9yZXMoJGV2ZW50LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyIG1lLTRcIiB0eXBlPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RvcmUgTmFtZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZU5hbWUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnc3RvcmVOYW1lJyAmJiBzb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TdG9yZSBJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZUlkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnc3RvcmVJZCcgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlByb2R1Y3RzPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBzdWJzY3JpYmVkU3RvcmVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cImlzU3RvcmVTZWxlY3RlZEluR3JvdXAoaSwgZGF0YT8uc3RvcmVJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblN0b3JlQ2hlY2soJGV2ZW50LCBpLCBkYXRhPy5zdG9yZUlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyIG1lLTRcIiB0eXBlPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXRhPy5zdG9yZU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtaWRcIj5JRCA6IHt7ZGF0YT8uc3RvcmVJZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgZGF0YT8ucHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdCA9PT0gJ3RhbmdvVHJhZmZpYydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoaXAgbWUtMiBtYi0yXCI+VHJhZmZpYzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3QgPT09ICd0YW5nb1pvbmUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwIG1lLTIgbWItMlwiPlpvbmU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9kdWN0ID09PSAndGFuZ29UcmF4J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hpcCBtZS0yIG1iLTJcIj5UcmF4PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJzY3JpYmVkU3RvcmVMaXN0Lmxlbmd0aFwiIGNsYXNzPVwibXktM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXN1YnNjcmliZWRTdG9yZUxpc3Q/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGluZydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyLWNhcmQgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdzZXR0aW5ncycgPyAnZC1ub25lJyA6ICcnXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+UHJpY2luZyBNZXRob2RzIChQcm8gUmF0YSk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYmVmb3JlMTVcIiB2YWx1ZT1cImJlZm9yZTE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImJlZm9yZTE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWZvcmUgMTV0aCBvZiBNb250aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhZnRlcjE1XCIgdmFsdWU9XCJhZnRlcjE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImFmdGVyMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFmdGVyIDE1dGggb2YgTW9udGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+QWR2YW5jZSBJbnZvaWNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiIG5nYlRvb2x0aXA9XCJDcmVhdGVzIGFuIGludm9pY2UgZm9yIHRoZSBuZXh0IG1vbnRoIGF1dG9tYXRpY2FsbHkgdXBvbiBzYXZpbmdcIiBwbGFjZW1lbnQ9XCJ0b3BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDEzQzEwLjMxMzcgMTMgMTMgMTAuMzEzNyAxMyA3QzEzIDMuNjg2MjkgMTAuMzEzNyAxIDcgMUMzLjY4NjI5IDEgMSAzLjY4NjI5IDEgN0MxIDEwLjMxMzcgMy42ODYyOSAxMyA3IDEzWlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA5LjRWN003IDQuNkg3LjAwNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidhZHZhbmNlSW52b2ljZV8nICsgaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZHZhbmNlSW52b2ljZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCInYWR2YW5jZUludm9pY2VfJyArIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGZvciBuZXh0IG1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbWItNVwiICpuZ0lmPVwic3Vic2NyaWJlZFByb2R1Y3RzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtYi0zXCI+UHJvZHVjdCBCaWxsaW5nIE1ldGhvZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXNtIGJvdHRvbS1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Qcm9kdWN0PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QmlsbGluZyBNZXRob2Q8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBwcm9kIG9mIHN1YnNjcmliZWRQcm9kdWN0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1wcmltYXJ5XCI+e3sgZm9ybWF0UHJvZHVjdE5hbWUocHJvZC5wcm9kdWN0TmFtZSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRQcm9kdWN0QmlsbGluZ01ldGhvZChpLCBwcm9kLnByb2R1Y3ROYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQmlsbGluZ01ldGhvZFNlbGVjdENoYW5nZShpLCBwcm9kLnByb2R1Y3ROYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiYmlsbGluZ01ldGhvZE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiY3VycmVuY3lPcHRpb25zXCIgW2xhYmVsXT1cIidDdXJyZW5jeSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRDeWNsZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJwYXltZW50Q3ljbGVPcHRpb25zXCIgW2xhYmVsXT1cIidQYXltZW50IEN5Y2xlJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudFRlcm1cIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwicGF5bWVudFRlcm1PcHRpb25zXCIgW2xhYmVsXT1cIidQYXltZW50IFRlcm0nXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ2VtYWlsJyArIGlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5HZW5lcmF0ZSBJbnZvaWNlIFRvKiA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkXCI+PC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbnRhaW5lciBmb3JtLWNvbnRyb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZW1haWwgb2YgZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zXCI+e3sgZW1haWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cInJlbW92ZUVtYWlsQ2hpcChlbWFpbCwgaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBzdHlsZT1cIm1pbi1oZWlnaHQ6IDQ0cHg7XCIgKGtleWRvd24pPVwib25FbWFpbEtleURvd24oJGV2ZW50LCBpKVwiIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZW1haWxWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWlucFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiAhZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvaWNlIGVtYWlsIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5TdG9yZSBMaXN0IEFubmV4dXJlIEF0dGFjaGVkIFdpdGggSW52b2ljZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhdHRhY2hBbm5leHVyZVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJ5ZXNcIiBbdmFsdWVdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cInllc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhdHRhY2hBbm5leHVyZVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJub1wiIFt2YWx1ZV09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cIm5vXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWVuZCBtdC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoaSlcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJyB8fCBncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzdG9yZS1zZWxlY3Rpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJuYXZpZ2F0ZShpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+TmV4dDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3NldHRpbmdzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25TdWJtaXQoZ3JvdXAudmFsdWUsIGkpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDBcIj5TYXZlIENoYW5nZXM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJiaWxsaW5nR3JvdXBzLmxlbmd0aCA9PT0gMVwiIGZvcm1BcnJheU5hbWU9XCJncm91cHNcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBiaWxsaW5nR3JvdXBzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWIgcm93IHJvdy1jb2xzLTIgZy0wIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGksICdiYXNpYy1pbmZvJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycgPyAnc2VsZWN0ZWQnIDogJydcIiBjbGFzcz1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ3NldHRpbmdzJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnID8gJ3NlbGVjdGVkJyA6ICcnXCIgY2xhc3M9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdiYXNpYy1pbmZvJyA/ICdkLW5vbmUnIDogJydcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UmVnaXN0ZXJlZCBDb21wYW55IE5hbWUqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGNvbXBhbnkgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdzdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdTVDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImdzdFwiIGZvcm1Db250cm9sTmFtZT1cImdzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdnc3QnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3N0Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGNvbXBhbnkgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTUgc3ViLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIERldGFpbHNcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NMaW5lT25lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QWRkcmVzcyBsaW5lIDE8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzTGluZU9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzTGluZU9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzTGluZVR3b1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkZHJlc3MgbGluZSAyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiYWRkcmVzc0xpbmVUd29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVUd29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2l0eVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNpdHk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjaXR5XCIgZm9ybUNvbnRyb2xOYW1lPVwiY2l0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjaXR5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2NpdHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnY2l0eScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2l0eSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0YXRlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RhdGUvcHJvdmluY2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3N0YXRlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdzdGF0ZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdzdGF0ZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdzdGF0ZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb3VudHJ5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q291bnRyeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNvdW50cnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY291bnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2NvdW50cnknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnY291bnRyeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpbkNvZGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QaW4gY29kZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIChrZXlwcmVzcyk9XCJvbWl0X3NwZWNpYWxfY2hhcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGluQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3BpbkNvZGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BpbkNvZGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGluQ29kZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW4gY29kZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBsYWNlT2ZTdXBwbHlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QbGFjZSBvZiBTdXBwbHk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwbGFjZU9mU3VwcGx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBsYWNlT2ZTdXBwbHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYWNlIG9mIHN1cHBseSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UE88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwb1wiIGZvcm1Db250cm9sTmFtZT1cInBvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3BvJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwbycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVyY2hhc2Ugb3JkZXIgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ3NldHRpbmdzJyA/ICdkLW5vbmUnIDogJydcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+UHJpY2luZyBNZXRob2RzIChQcm8gUmF0YSk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJiZWZvcmUxNVwiIHZhbHVlPVwiYmVmb3JlMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJiZWZvcmUxNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWZvcmUgMTV0aCBvZiBNb250aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cInByb1JhdGFcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiIHR5cGU9XCJyYWRpb1wiIGlkPVwiYWZ0ZXIxNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiYWZ0ZXIxNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImFmdGVyMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWZ0ZXIgMTV0aCBvZiBNb250aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5BZHZhbmNlIEludm9pY2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIiBuZ2JUb29sdGlwPVwiQ3JlYXRlcyBhbiBpbnZvaWNlIGZvciB0aGUgbmV4dCBtb250aCBhdXRvbWF0aWNhbGx5IHVwb24gc2F2aW5nXCIgcGxhY2VtZW50PVwidG9wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgMTNDMTAuMzEzNyAxMyAxMyAxMC4zMTM3IDEzIDdDMTMgMy42ODYyOSAxMC4zMTM3IDEgNyAxQzMuNjg2MjkgMSAxIDMuNjg2MjkgMSA3QzEgMTAuMzEzNyAzLjY4NjI5IDEzIDcgMTNaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgOS40VjdNNyA0LjZINy4wMDZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCInYWR2YW5jZUludm9pY2VTaW5nbGVfJyArIGlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZHZhbmNlSW52b2ljZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cIidhZHZhbmNlSW52b2ljZVNpbmdsZV8nICsgaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBmb3IgbmV4dCBtb250aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBtYi01XCIgKm5nSWY9XCJzdWJzY3JpYmVkUHJvZHVjdHMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWItM1wiPlByb2R1Y3QgQmlsbGluZyBNZXRob2Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc20gYm90dG9tLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlByb2R1Y3Q8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkJpbGxpbmcgTWV0aG9kPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBwcm9kIG9mIHN1YnNjcmliZWRQcm9kdWN0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtcHJpbWFyeVwiPnt7IGZvcm1hdFByb2R1Y3ROYW1lKHByb2QucHJvZHVjdE5hbWUpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRQcm9kdWN0QmlsbGluZ01ldGhvZChpLCBwcm9kLnByb2R1Y3ROYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkJpbGxpbmdNZXRob2RTZWxlY3RDaGFuZ2UoaSwgcHJvZC5wcm9kdWN0TmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJiaWxsaW5nTWV0aG9kT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJjdXJyZW5jeVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJjdXJyZW5jeU9wdGlvbnNcIiBbbGFiZWxdPVwiJ0N1cnJlbmN5J1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudEN5Y2xlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInBheW1lbnRDeWNsZU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1BheW1lbnQgQ3ljbGUnXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50VGVybVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJwYXltZW50VGVybU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1BheW1lbnQgVGVybSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZW1haWwnICsgaVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdlbmVyYXRlIEludm9pY2UgVG8qIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZFwiPjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyIGZvcm0tY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVtYWlsIG9mIGdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIj57eyBlbWFpbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJyZW1vdmVFbWFpbENoaXAoZW1haWwsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgc3R5bGU9XCJtaW4taGVpZ2h0OiA0NHB4O1wiIChrZXlkb3duKT1cIm9uRW1haWxLZXlEb3duKCRldmVudCwgaSlcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZW1haWxWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWlucFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiAhZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvaWNlIGVtYWlsIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+U3RvcmUgTGlzdCBBbm5leHVyZSBBdHRhY2hlZCBXaXRoIEludm9pY2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiIGlkPVwieWVzXCIgW3ZhbHVlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cInllc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYXR0YWNoQW5uZXh1cmVcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJub1wiIFt2YWx1ZV09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwibm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibW9kYWxSZWYuY2xvc2UoKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nIHx8IGdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3N0b3JlLXNlbGVjdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibmF2aWdhdGUoaSlcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMFwiPk5leHQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU3VibWl0KGdyb3VwLnZhbHVlLCBpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+U2F2ZSBDaGFuZ2VzPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG48L2Zvcm0+XHJcbjwvZGl2PiJdfQ==
|