@pmcretail/mapper-library 0.0.43 → 0.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/bundles/pmcretail-mapper-library.umd.js +4165 -0
  2. package/bundles/pmcretail-mapper-library.umd.js.map +1 -0
  3. package/esm2015/lib/RJ-mapper.class.js +877 -0
  4. package/esm2015/lib/TransactionDocumentBuilder.js +1244 -0
  5. package/esm2015/lib/WebReturn-mapper.class.js +326 -0
  6. package/esm2015/lib/WebReturnSalesforceMapper.class.js +409 -0
  7. package/esm2015/lib/basket.service.js +527 -0
  8. package/esm2015/lib/mapper-library.component.js +26 -0
  9. package/esm2015/lib/mapper-library.module.js +21 -0
  10. package/esm2015/lib/number-util.service.js +42 -0
  11. package/{fesm2022/pmcretail-mapper-library.mjs → fesm2015/pmcretail-mapper-library.js} +173 -154
  12. package/fesm2015/pmcretail-mapper-library.js.map +1 -0
  13. package/lib/RJ-mapper.class.d.ts +1 -0
  14. package/lib/RJ-mapper.class.d.ts.map +1 -1
  15. package/lib/TransactionDocumentBuilder.d.ts +1 -0
  16. package/lib/TransactionDocumentBuilder.d.ts.map +1 -1
  17. package/lib/WebReturn-mapper.class.d.ts +1 -0
  18. package/lib/WebReturn-mapper.class.d.ts.map +1 -1
  19. package/lib/WebReturnSalesforceMapper.class.d.ts +1 -0
  20. package/lib/WebReturnSalesforceMapper.class.d.ts.map +1 -1
  21. package/lib/basket.service.d.ts +1 -0
  22. package/lib/basket.service.d.ts.map +1 -1
  23. package/lib/mapper-library.component.d.ts +1 -1
  24. package/lib/number-util.service.d.ts +1 -0
  25. package/lib/number-util.service.d.ts.map +1 -1
  26. package/package.json +9 -16
  27. package/esm2022/lib/RJ-mapper.class.mjs +0 -875
  28. package/esm2022/lib/TransactionDocumentBuilder.mjs +0 -1240
  29. package/esm2022/lib/WebReturn-mapper.class.mjs +0 -324
  30. package/esm2022/lib/WebReturnSalesforceMapper.class.mjs +0 -410
  31. package/esm2022/lib/basket.service.mjs +0 -516
  32. package/esm2022/lib/mapper-library.component.mjs +0 -22
  33. package/esm2022/lib/mapper-library.module.mjs +0 -21
  34. package/esm2022/lib/number-util.service.mjs +0 -40
  35. package/fesm2022/pmcretail-mapper-library.mjs.map +0 -1
  36. /package/{esm2022/lib/mapper-library.model.mjs → esm2015/lib/mapper-library.model.js} +0 -0
  37. /package/{esm2022/pmcretail-mapper-library.mjs → esm2015/pmcretail-mapper-library.js} +0 -0
  38. /package/{esm2022/public-api.mjs → esm2015/public-api.js} +0 -0
  39. /package/{index.d.ts → pmcretail-mapper-library.d.ts} +0 -0
@@ -0,0 +1,877 @@
1
+ import { DISCOUNTTYPE, TRANSACTION_TYPE } from "./mapper-library.model";
2
+ import { TransactionDocumentBuilder } from "./TransactionDocumentBuilder";
3
+ import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
4
+ export class RJMapperBuilderClass {
5
+ constructor(transactionDoc) {
6
+ this.className = "RJMapperBuilderClass";
7
+ this.itemCount = 0;
8
+ this.largestNumber = 0;
9
+ this.rjObject = {};
10
+ if (transactionDoc) {
11
+ this.transactionDocument = transactionDoc;
12
+ }
13
+ else {
14
+ this.transactionDocument = {
15
+ transactionId: "",
16
+ offlineTransactionId: "",
17
+ transactionRef: "",
18
+ dateTime: "",
19
+ orgCode: "",
20
+ storeId: "",
21
+ storeNodeId: "",
22
+ storeNodeStructure: "",
23
+ deviceId: "",
24
+ terminalId: "",
25
+ userId: "",
26
+ initiatingModule: "eBasket",
27
+ export: false,
28
+ basket: {},
29
+ basketSummary: {},
30
+ baseCurrency: "",
31
+ type: "",
32
+ operationStatus: "",
33
+ createdAt: "",
34
+ updatedAt: "",
35
+ id: "",
36
+ currentTransactionDetails: {},
37
+ saleTotal: 0,
38
+ };
39
+ }
40
+ this.initilizeItemCount();
41
+ this.setLineNumberForProducts();
42
+ this.createdAt = this.getDate(this.transactionDocument.createdAt);
43
+ this.updatedAt = this.getDate(this.transactionDocument.updatedAt);
44
+ }
45
+ getPosbasketInfo() {
46
+ this.rjObject['Keyword'] = this.generateKeyword();
47
+ this.rjObject['ID'] = this.generateId(this.createdAt);
48
+ this.rjObject['XMLSchemaVersion'] = '2';
49
+ this.rjObject['LastUpdated'] = this.updatedAt;
50
+ this.rjObject['MajorVersion'] = this.majorVersion;
51
+ this.rjObject['MinorVersion'] = this.minorVersion;
52
+ this.rjObject['ManifestVersion'] = this.manifestVersion;
53
+ this.rjObject['DatabaseSchemaVersion'] = this.databaseSchemaVersion;
54
+ this.rjObject['BasketType'] = this.basketType;
55
+ this.rjObject['State'] = this.getState();
56
+ this.rjObject['ExternalState'] = this.externalState;
57
+ return this;
58
+ }
59
+ getheaderInfo() {
60
+ this.rjObject['Header'] = {};
61
+ this.rjObject['Header'].TimeZoneOffset = this.convertToString(this.generateTimezoneoffset(this.transactionDocument.createdAt));
62
+ this.rjObject['Header'].DateTimeCreated = this.createdAt;
63
+ this.rjObject['Header'].OriginatedBy = {};
64
+ this.rjObject['Header'].OriginatedBy.DeviceID = this.deviceId;
65
+ this.rjObject['Header'].OriginatedBy.CashierID = this.cashierId;
66
+ this.rjObject['Header'].OriginatedBy.CompanyID = this.companyId;
67
+ this.rjObject['Header'].OriginatedBy.StoreID = this.transactionDocument.storeId;
68
+ this.rjObject['Header'].OriginatedBy.BranchID = this.branchId;
69
+ this.rjObject['Header'].OriginatedBy.TerminalNumber = this.terminalNumber;
70
+ this.rjObject['Header'].OriginatedBy.TransactionNumber = this.transactionNumber;
71
+ this.rjObject['Header'].TaxMethodID = this.taxMethodId;
72
+ this.rjObject['Header'].DynamicStockLookup = this.generateDynamicStockLookUp();
73
+ this.rjObject['Header'].BasketLanguageID = this.basketLanguageId; //todo
74
+ this.rjObject['Header'].BasketCountryID = this.basketCountryId; //todo
75
+ this.rjObject['Header'].BasketCurrencyID = this.transactionDocument.baseCurrency;
76
+ this.rjObject['Header'].TradingRegionID = this.tradingRegionId;
77
+ this.rjObject['Header'].Eurozone = " "; //unknown
78
+ this.rjObject['Header'].EuroBaseExchangeRate = ""; //unknown
79
+ this.rjObject['Header'].PrintableName = this.transactionDocument.userName; //unknown
80
+ return this;
81
+ }
82
+ rjMapper() {
83
+ var transactionDiscount = [];
84
+ if (this.transactionDocument.basket.transactionDiscount && this.transactionDocument.basket.transactionDiscount.length > 0) {
85
+ transactionDiscount = this.transactionDocument.basket.transactionDiscount;
86
+ }
87
+ if (this.transactionDocument.type === TRANSACTION_TYPE.SALE) {
88
+ this.rjObject['ProductSale'] = [];
89
+ this.rjObject['ModifierItem'] = [];
90
+ this.transactionDocument.basket.products.forEach((element) => {
91
+ let lineDiscount = [];
92
+ if (this.transactionDocument.basket.lineDiscount && this.transactionDocument.basket.lineDiscount.length > 0) {
93
+ lineDiscount = this.transactionDocument.basket.lineDiscount.filter((x) => x.itemLineId === element.itemLineId);
94
+ if (lineDiscount.length > 0) {
95
+ const index = this.transactionDocument.basket.lineDiscount.indexOf(lineDiscount[0]);
96
+ if (index > -1) {
97
+ this.transactionDocument.basket.lineDiscount.splice(index, 1);
98
+ }
99
+ }
100
+ }
101
+ let data = this.addProduct(element, (lineDiscount.length > 0 ? lineDiscount[0] : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
102
+ this.rjObject['ProductSale'].push(data);
103
+ this.getModifierItem(lineDiscount.length > 0 ? lineDiscount[0] : null, element.itemLineId);
104
+ });
105
+ let transactionPromotion = [];
106
+ if (this.transactionDocument.basket.transactionPromotion && this.transactionDocument.basket.transactionPromotion.length > 0) {
107
+ transactionPromotion = this.transactionDocument.basket.transactionPromotion;
108
+ this.getTransactionPromotion(transactionPromotion);
109
+ }
110
+ }
111
+ else if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {
112
+ this.rjObject['ProductReturn'] = [];
113
+ this.rjObject['ModifierItem'] = [];
114
+ this.transactionDocument.basket.products.forEach((element) => {
115
+ let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
116
+ this.rjObject['ProductReturn'].push(data);
117
+ this.getModifierItem(element.lineDiscount, element.itemLineId);
118
+ });
119
+ }
120
+ else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {
121
+ this.rjObject['ProductReturn'] = [];
122
+ this.rjObject['ModifierItem'] = [];
123
+ let transactionDoc = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();
124
+ transactionDoc.basket.products.forEach((element) => {
125
+ let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
126
+ let obj = {
127
+ "OriginalReceiptSupplied": 0,
128
+ "OriginalBranchID": 0,
129
+ "OriginalTerminalNumber": 0,
130
+ "OriginalTransactionNumber": 0,
131
+ "OriginalCashierNumber": 0
132
+ };
133
+ data['Return'] = Object.assign(Object.assign({}, data['Return']), obj);
134
+ this.rjObject['ProductReturn'].push(data);
135
+ this.getModifierItem(element.lineDiscount, element.itemLineId);
136
+ });
137
+ }
138
+ else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {
139
+ this.rjObject['ProductReturn'] = [];
140
+ this.rjObject['ProductSale'] = [];
141
+ this.rjObject['ModifierItem'] = [];
142
+ let transactionDoc = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();
143
+ transactionDoc.basket.products.forEach((element) => {
144
+ if (element.refundedQuantity > 0) {
145
+ let returnProduct = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
146
+ let obj = {
147
+ "OriginalReceiptSupplied": 0,
148
+ "OriginalBranchID": 0,
149
+ "OriginalTerminalNumber": 0,
150
+ "OriginalTransactionNumber": 0,
151
+ "OriginalCashierNumber": 0
152
+ };
153
+ returnProduct['Return'] = Object.assign(Object.assign({}, returnProduct['Return']), obj);
154
+ this.rjObject['ProductReturn'].push(returnProduct);
155
+ }
156
+ else {
157
+ let addProduct = this.addProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
158
+ this.rjObject['ProductSale'].push(addProduct);
159
+ }
160
+ this.getModifierItem(element.lineDiscount, element.itemLineId);
161
+ });
162
+ }
163
+ return this;
164
+ }
165
+ getBasketDiscount() {
166
+ if (!this.transactionDocument.basket.transactionDiscount)
167
+ return this;
168
+ this.rjObject['BasketDiscount'] = [];
169
+ this.transactionDocument.basket.transactionDiscount.forEach((element) => {
170
+ let obj = {};
171
+ obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
172
+ obj['DeviceID'] = this.deviceId;
173
+ obj['DateTimeCreated'] = this.updatedAt;
174
+ obj['NetValue'] = this.convertToString(element.discountAmount * -1);
175
+ obj['EffectiveNetValue'] = this.convertToString(element.discountAmount * -1);
176
+ obj['Description'] = element.reasonDisplayText;
177
+ obj['UserID'] = this.transactionDocument.userName;
178
+ obj['ReasonCodeID'] = element.reasonCode;
179
+ obj['DiscountType'] = this.convertToString(element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase() ? 0 : 1);
180
+ obj['RoundingRule'] = this.convertToString(2);
181
+ obj['ModifiedLineNumber'] = element.itemLineIds;
182
+ obj['LineNumber'] = this.convertToString(this.generateLineNumber());
183
+ obj['DiscountedValue'] = this.transactionDocument.basketSummary.basketTotal + this.transactionDocument.basketSummary.discountTotal;
184
+ if (element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase()) {
185
+ obj['DiscountPercentage'] = this.convertToString((element.discountAmount / this.transactionDocument.basketSummary.basketTotal).toFixed(1));
186
+ }
187
+ if (this.transactionDocument.type === 'REFUND') {
188
+ obj['NetValue'] = this.convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);
189
+ obj['EffectiveNetValue'] = this.convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);
190
+ }
191
+ this.rjObject['BasketDiscount'].push(obj);
192
+ });
193
+ return this;
194
+ }
195
+ getModifierItem(data, lineNo) {
196
+ if (data && lineNo) {
197
+ let obj = {};
198
+ obj.XMLSchemaVersion = 1;
199
+ obj.LineNumber = this.generateLineNumber();
200
+ obj.NetValue = 0;
201
+ obj.EffectiveNetValue = 0;
202
+ obj.Description = data.percentageDiscountReasonName ? data.percentageDiscountReasonName : data.priceOverrideReasonName;
203
+ obj.DeviceID = this.deviceId;
204
+ obj.UserID = this.transactionDocument.userName;
205
+ obj.DateTimeCreated = this.updatedAt;
206
+ obj.AuthorisingUserID = this.transactionDocument.userName;
207
+ obj.ReasonCodeID = data.percentageDiscountReasonCode ? data.percentageDiscountReasonCode : data.priceOverrideReasonCode;
208
+ obj.ModifiedLineNumber = lineNo;
209
+ obj.ModifiedIndex = 1;
210
+ this.rjObject['ModifierItem'].push(obj);
211
+ }
212
+ }
213
+ getTrailerInfo() {
214
+ this.rjObject['Trailer'] = {};
215
+ this.rjObject.Trailer.DateTimeCompleted = this.updatedAt;
216
+ this.rjObject.Trailer.CompletedBy = {};
217
+ this.rjObject.Trailer.CompletedBy.DeviceID = this.deviceId;
218
+ this.rjObject.Trailer.CompletedBy.CashierID = this.cashierId;
219
+ this.rjObject.Trailer.CompletedBy.StoreID = this.transactionDocument.storeId;
220
+ this.rjObject.Trailer.CompletedBy.BranchID = this.branchId;
221
+ this.rjObject.Trailer.CompletedBy.TerminalNumber = this.terminalNumber;
222
+ this.rjObject.Trailer.CompletedBy.TransactionNumber = this.transactionNumber;
223
+ this.rjObject.Trailer.Total = this.convertToString(this.transactionDocument.basketSummary.basketTotal * 100);
224
+ this.rjObject.Trailer.ItemCount = this.itemCount; //gives total count for product
225
+ this.rjObject.Trailer.ItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);
226
+ this.rjObject.Trailer.NetItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);
227
+ this.rjObject.Trailer.TaxTotal = this.convertToString(this.removeDecimal(this.transactionDocument.basketSummary.VATTotal));
228
+ this.rjObject.Trailer.SequenceDeviceID = this.deviceId;
229
+ this.rjObject.Trailer.SequenceNumber = 'snsn'; //static for now
230
+ this.rjObject['Trailer']['TaxItem'] = [];
231
+ this.transactionDocument.basket.taxBreakdown.taxLines.forEach((element) => {
232
+ let obj = {};
233
+ obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
234
+ obj['TaxRate'] = this.convertToString(element.VATCode);
235
+ obj['TaxableTotal'] = this.convertToString(this.removeDecimal(element.taxableAmount));
236
+ obj['TaxTotal'] = this.convertToString(this.removeDecimal(this.removeDecimal(element.taxLineTotal)));
237
+ obj['TaxDescription'] = this.convertToString(element.VATCode);
238
+ obj['TaxIncluded'] = '1';
239
+ obj['TaxPercentage'] = this.addDecimal(element.VAT.toFixed(2)).toFixed(2);
240
+ this.rjObject['Trailer']['TaxItem'].push(obj);
241
+ });
242
+ if (this.transactionDocument.basket.linePromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {
243
+ this.rjObject['Trailer']['PromotionItem'] = [];
244
+ if (this.transactionDocument.basket.linePromotion.length > 0) {
245
+ this.transactionDocument.basket.linePromotion.forEach((element) => {
246
+ let obj = {};
247
+ obj['PromotionID'] = element.promotionId;
248
+ obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
249
+ obj['PromotionQuantity'] = "1";
250
+ obj['PromotionDescription'] = element.displayText;
251
+ obj['PromotionHit'] = {};
252
+ obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;
253
+ obj['PromotionHit']['HitNumber'] = "1";
254
+ obj['PromotionHit']['HitQuantity'] = "1";
255
+ obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
256
+ obj['PromotionHit']['PromotionTrigger'] = {};
257
+ let product = this.transactionDocument.basket.products.find((item) => item.itemLineId == element.itemLineId);
258
+ obj['PromotionHit']['PromotionTrigger']['XMLSchemaVersion'] = this.xmlSchemaVersion;
259
+ obj['PromotionHit']['PromotionTrigger']['ProductID'] = product.SKU;
260
+ obj['PromotionHit']['PromotionTrigger']['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);
261
+ obj['PromotionHit']['PromotionTrigger']['LineNumber'] = this.getNumber(product.SKU);
262
+ obj['PromotionHit']['PromotionTrigger']['Quantity'] = this.convertToString(product.quantity.toFixed(1));
263
+ obj['PromotionHit']['PromotionTrigger']['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item) => item.itemLineId == element.itemLineId).VATCode;
264
+ this.rjObject['Trailer']['PromotionItem'].push(obj);
265
+ });
266
+ }
267
+ if (this.transactionDocument.basket.transactionPromotion.length > 0) {
268
+ this.transactionDocument.basket.transactionPromotion.forEach((element) => {
269
+ let obj = {};
270
+ obj['PromotionID'] = element.promotionId;
271
+ obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
272
+ obj['PromotionQuantity'] = "1";
273
+ obj['PromotionDescription'] = element.displayText;
274
+ obj['PromotionHit'] = {};
275
+ obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;
276
+ obj['PromotionHit']['HitNumber'] = "1";
277
+ obj['PromotionHit']['HitQuantity'] = "1";
278
+ obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
279
+ obj['PromotionHit']['PromotionTrigger'] = [];
280
+ this.transactionDocument.basket.products.forEach((product) => {
281
+ let promotionTrigger = {};
282
+ element.itemLineIds.forEach((itemLineId) => {
283
+ if (JSON.stringify(itemLineId) === product.itemLineId) {
284
+ promotionTrigger['XMLSchemaVersion'] = this.xmlSchemaVersion;
285
+ promotionTrigger['ProductID'] = product.SKU;
286
+ promotionTrigger['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);
287
+ promotionTrigger['LineNumber'] = this.getNumber(product.SKU);
288
+ promotionTrigger['Quantity'] = this.convertToString(product.quantity);
289
+ promotionTrigger['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item) => item.itemLineId == product.itemLineId).VATCode;
290
+ obj['PromotionHit']['PromotionTrigger'].push(promotionTrigger);
291
+ }
292
+ });
293
+ });
294
+ this.rjObject['Trailer']['PromotionItem'].push(obj);
295
+ });
296
+ }
297
+ }
298
+ return this;
299
+ }
300
+ getTenderInfo() {
301
+ if (this.transactionDocument.paymentDetails && this.transactionDocument.paymentDetails.length > 0) {
302
+ this.transactionDocument.paymentDetails.forEach((element) => {
303
+ if (element.externalTenderKey) {
304
+ this.rjObject[element.externalTenderKey] = [];
305
+ if (element.paymentType.toUpperCase() === 'GIFT CARD') {
306
+ let obj = {
307
+ XMLSchemaVersion: this.xmlSchemaVersion,
308
+ LineNumber: this.generateLineNumber(),
309
+ NetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
310
+ EffectiveNetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
311
+ Description: this.getDescription(element),
312
+ DeviceID: this.deviceId,
313
+ UserID: this.transactionDocument.userName,
314
+ DateTimeCreated: this.updatedAt,
315
+ TenderType: element.externalTenderType ? element.externalTenderType : '',
316
+ TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
317
+ TenderAmount: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
318
+ CurrencyID: this.transactionDocument.baseCurrency,
319
+ CurrencyDescription: this.transactionDocument.baseCurrency,
320
+ GiftVoucherSalesAllowed: '',
321
+ AllowRechargeableVoucherSales: '',
322
+ GiftVoucherID: ''
323
+ };
324
+ this.rjObject[element.externalTenderKey].push(obj);
325
+ }
326
+ else {
327
+ let obj1 = {
328
+ XMLSchemaVersion: "1",
329
+ LineNumber: this.generateLineNumber(),
330
+ NetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
331
+ EffectiveNetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
332
+ Description: this.getDescription(element),
333
+ DeviceID: this.deviceId,
334
+ UserID: this.transactionDocument.userName,
335
+ DateTimeCreated: this.updatedAt,
336
+ TenderType: element.externalTenderType ? element.externalTenderType : '',
337
+ TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
338
+ TenderAmount: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
339
+ CurrencyID: this.transactionDocument.baseCurrency,
340
+ CurrencyDescription: this.transactionDocument.baseCurrency,
341
+ IncludeInTransactionTotalCheck: "1",
342
+ AllowRechargeableVoucherSales: "1",
343
+ OpenDrawerAtEnd: "1"
344
+ };
345
+ this.rjObject[element.externalTenderKey].push(obj1);
346
+ }
347
+ }
348
+ else {
349
+ this.rjObject['CashTender'] = [];
350
+ if (element.paymentType.toUpperCase() === 'GIFT CARD') {
351
+ let obj = {
352
+ XMLSchemaVersion: this.xmlSchemaVersion,
353
+ LineNumber: this.generateLineNumber(),
354
+ NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
355
+ EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
356
+ Description: this.getDescription(element),
357
+ DeviceID: this.deviceId,
358
+ UserID: this.transactionDocument.userName,
359
+ DateTimeCreated: this.updatedAt,
360
+ TenderType: element.externalTenderType ? element.externalTenderType : '',
361
+ TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
362
+ TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
363
+ CurrencyID: this.transactionDocument.baseCurrency,
364
+ CurrencyDescription: this.transactionDocument.baseCurrency,
365
+ GiftVoucherSalesAllowed: '',
366
+ AllowRechargeableVoucherSales: '',
367
+ GiftVoucherID: ''
368
+ };
369
+ this.rjObject['CashTender'].push(obj);
370
+ }
371
+ else {
372
+ let obj1 = {
373
+ XMLSchemaVersion: "1",
374
+ LineNumber: this.generateLineNumber(),
375
+ NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
376
+ EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
377
+ Description: this.getDescription(element),
378
+ DeviceID: this.deviceId,
379
+ UserID: this.transactionDocument.userName,
380
+ DateTimeCreated: this.updatedAt,
381
+ TenderType: element.externalTenderType ? element.externalTenderType : '',
382
+ TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
383
+ TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
384
+ CurrencyID: this.transactionDocument.baseCurrency,
385
+ CurrencyDescription: this.transactionDocument.baseCurrency,
386
+ IncludeInTransactionTotalCheck: "1",
387
+ AllowRechargeableVoucherSales: "1",
388
+ OpenDrawerAtEnd: "1"
389
+ };
390
+ this.rjObject['CashTender'].push(obj1);
391
+ }
392
+ }
393
+ });
394
+ }
395
+ return this;
396
+ }
397
+ getNumber(productId) {
398
+ let lineNumber;
399
+ for (let i = 0; i < this.rjObject['ProductSale'].length; i++) {
400
+ const element = this.rjObject['ProductSale'][i];
401
+ if (JSON.stringify(productId) === JSON.stringify(element.ProductID)) {
402
+ lineNumber = element.LineNumber;
403
+ break;
404
+ }
405
+ }
406
+ return lineNumber;
407
+ }
408
+ setLineNumberForProducts() {
409
+ let itemLineIdArray = [];
410
+ itemLineIdArray = this.transactionDocument.basket.products.map((product) => {
411
+ return parseInt(product.itemLineId);
412
+ });
413
+ this.largestNumber = itemLineIdArray.reduce((a, b) => Math.max(a, b));
414
+ }
415
+ generateLineNumber() {
416
+ this.largestNumber += 1;
417
+ this.itemCount += 1;
418
+ return this.largestNumber;
419
+ }
420
+ initilizeItemCount() {
421
+ this.itemCount = this.transactionDocument.basket.products.length;
422
+ }
423
+ build() {
424
+ return this.rjObject;
425
+ }
426
+ getDescription(element) {
427
+ if (element.paymentType.toUpperCase() === 'CARD') {
428
+ return element.cardType;
429
+ }
430
+ else {
431
+ return element.paymentType;
432
+ }
433
+ }
434
+ getMMGROUPID(attributes) {
435
+ if (attributes && attributes.length > 0) {
436
+ let filterValue = attributes.filter((attribute) => attribute.name === "MMGROUPID");
437
+ if (filterValue && filterValue.length > 0) {
438
+ return filterValue[0].value;
439
+ }
440
+ }
441
+ }
442
+ setDeviceInfo(id) {
443
+ this.deviceId = id;
444
+ return this;
445
+ }
446
+ removeDecimal(value) {
447
+ return value * 100;
448
+ }
449
+ addDecimal(value) {
450
+ return value / 100;
451
+ }
452
+ setTransactionNumber(value) {
453
+ this.transactionNumber = value;
454
+ return this;
455
+ }
456
+ setManifestVersion(value) {
457
+ this.manifestVersion = value;
458
+ return this;
459
+ }
460
+ setDatabaseSchemaVersion(value) {
461
+ this.databaseSchemaVersion = value;
462
+ return this;
463
+ }
464
+ setBasketType(value) {
465
+ this.basketType = value;
466
+ return this;
467
+ }
468
+ setTradingRegionID(value) {
469
+ this.tradingRegionId = value;
470
+ return this;
471
+ }
472
+ setCompanyID(value) {
473
+ this.companyId = value;
474
+ return this;
475
+ }
476
+ setTaxMethodID(value) {
477
+ this.taxMethodId = value;
478
+ return this;
479
+ }
480
+ setMajorVersion(value) {
481
+ this.majorVersion = value;
482
+ return this;
483
+ }
484
+ setMinorVersion(value) {
485
+ this.minorVersion = value;
486
+ return this;
487
+ }
488
+ setXMLSchemaVersion(value) {
489
+ this.xmlSchemaVersion = value;
490
+ return this;
491
+ }
492
+ setExternalState(value) {
493
+ this.externalState = value;
494
+ return this;
495
+ }
496
+ setCashierID() {
497
+ this.cashierId = (this.transactionDocument && this.transactionDocument.userName) ? this.transactionDocument.userName : '';
498
+ return this;
499
+ }
500
+ setTerminalNumber(value) {
501
+ this.terminalNumber = value;
502
+ return this;
503
+ }
504
+ setBasketLanguageID(value) {
505
+ this.basketLanguageId = value;
506
+ return this;
507
+ }
508
+ setBasketCountryID(value) {
509
+ this.basketCountryId = value;
510
+ return this;
511
+ }
512
+ setBasketCurrencyID(value) {
513
+ this.basketCurrencyId = value;
514
+ return this;
515
+ }
516
+ setBranchID(value) {
517
+ this.branchId = value;
518
+ return this;
519
+ }
520
+ setSalesPersonName(value) {
521
+ this.salesPersonName = value;
522
+ return this;
523
+ }
524
+ generateId(date) {
525
+ let newDateTime = date.replace(/[^0-9]/g, '');
526
+ let id = (this.deviceId + '|' + newDateTime + '|' + this.transactionNumber).toString();
527
+ return id;
528
+ }
529
+ generateTimezoneoffset(date) {
530
+ let x = date ? date : '';
531
+ return new Date(x).getTimezoneOffset();
532
+ }
533
+ generateKeyword() {
534
+ let x = (this.companyId + '|' + this.transactionDocument.storeId + '|' + this.terminalNumber + '|' + this.transactionNumber).toString();
535
+ return x;
536
+ }
537
+ getState() {
538
+ if (this.transactionDocument.operationStatus === 'PAY_SUCCESS') {
539
+ return 'Completed';
540
+ }
541
+ else {
542
+ return 'Cancelled';
543
+ }
544
+ }
545
+ returnProduct(element, lineDiscount, transactionDiscount) {
546
+ let obj = {};
547
+ let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']);
548
+ obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
549
+ obj['LineNumber'] = element['itemLineId'];
550
+ obj['NetValue'] = this.removeDecimal(element['refundedTotal']);
551
+ obj['EffectiveNetValue'] = this.removeDecimal(element['refundedTotal']);
552
+ obj['Description'] = element['description'];
553
+ obj['DeviceID'] = this.transactionDocument['terminalId'];
554
+ obj['UserID'] = this.transactionDocument.userName;
555
+ obj['DateTimeCreated'] = this.createdAt;
556
+ obj['ExtendedValue'] = this.removeDecimal(element['totalLinePrice'] * -1);
557
+ obj['UnitPrice'] = this.removeDecimal(element['price']);
558
+ obj['Quantity'] = this.getQuantity(element);
559
+ obj['OriginalTaxAmountSet'] = 1;
560
+ obj['ProductID'] = element['SKU'];
561
+ obj['HandKeyed'] = 1;
562
+ obj['LongDescription'] = element['description'];
563
+ obj['Return'] = {};
564
+ obj['Return']['ReturnReasonID'] = element['refundedReason'];
565
+ obj['Return']['ReturnDescription'] = element['refundedReasonDescription'];
566
+ obj['Return']['ReturnToStock'] = this.getQuantity(element);
567
+ obj['TaxCode'] = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']).VATCode;
568
+ obj['DisplayTaxCode'] = ''; // todo
569
+ obj['ProductAttributes'] = ''; //todo - not required
570
+ obj['Perishable'] = this.getMMGROUPID(element.attributes);
571
+ //obj['MMGroupID'] = this.getCaregories(element);
572
+ obj['MMGroupID'] = this.getMMGROUPID(element.attributes);
573
+ obj['CustomerDetails'] = ""; // todo - blank
574
+ obj['TotalPromotionSaving'] = element['promotionAmount'] || -1; // TODO
575
+ obj['OriginalTaxAmount'] = this.convertToString((this.removeDecimal(this.getOriginalTax(element, taxTotal.VAT) * -1)).toFixed(2));
576
+ obj['taxAmount'] = this.removeDecimal(taxTotal.taxLineTotal < 0 ? (taxTotal.taxLineTotal) : (-taxTotal.taxLineTotal));
577
+ if (lineDiscount) {
578
+ if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
579
+ // line discount
580
+ obj['Discount'] = {};
581
+ obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
582
+ obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
583
+ obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
584
+ obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
585
+ obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;
586
+ obj['Discount'].DiscountType = lineDiscount.discountType;
587
+ obj['Discount'].XMLSchemaVersion = 1;
588
+ obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
589
+ obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
590
+ obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
591
+ obj['Discount'].RoundingRule = 2;
592
+ }
593
+ if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
594
+ //price override
595
+ obj['PriceOverride'] = {};
596
+ obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
597
+ obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
598
+ obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
599
+ obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
600
+ obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;
601
+ obj['PriceOverride'].XMLSchemaVersion = 1;
602
+ obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
603
+ obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
604
+ }
605
+ //update the product price
606
+ obj.NetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
607
+ obj.EffectiveNetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
608
+ obj.ExtendedValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
609
+ obj.UnitPrice = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
610
+ }
611
+ if (transactionDiscount) {
612
+ obj['BasketDiscountModifier'] = [];
613
+ this.transactionDocument.basket.transactionDiscount.forEach((e) => {
614
+ let discountObj = {};
615
+ e.itemLineIds.forEach((x) => {
616
+ if (x == element.itemLineId) {
617
+ var discountAmount = this.convertToString(e.discountAmount * -1);
618
+ discountObj.BasketDiscountLineNumber = this.getLineNumber(e, discountAmount);
619
+ discountObj.XMLSchemaVersion = this.xmlSchemaVersion;
620
+ discountObj.DiscountedValue = this.getDiscountedValue(element.totalLinePrice, e.discountAmount);
621
+ obj['BasketDiscountModifier'].push(discountObj);
622
+ }
623
+ });
624
+ });
625
+ var totaltransactionDiscount = 0;
626
+ obj['BasketDiscountModifier'].forEach((value) => {
627
+ totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;
628
+ });
629
+ //update the product price
630
+ obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;
631
+ }
632
+ if (this.transactionDocument.basket.transactionPromotion.length > 0) {
633
+ obj['PromotionSaving'] = [];
634
+ this.transactionDocument.basket.transactionPromotion.forEach((transactionPromo) => {
635
+ let promotionObj = {};
636
+ transactionPromo.itemLineIds.forEach((itemLineId) => {
637
+ if (itemLineId == element.itemLineId) {
638
+ promotionObj.ModifierValue = transactionPromo.promotionAmount;
639
+ promotionObj.ModifierDateTime = this.transactionDocument.createdAt;
640
+ promotionObj.ModifierDescription = transactionPromo.displayText;
641
+ promotionObj.XMLSchemaVersion = this.xmlSchemaVersion;
642
+ promotionObj.PromotionID = transactionPromo.promotionId;
643
+ promotionObj.PromotionDescription = transactionPromo.displayText;
644
+ promotionObj.HitNumber = '1';
645
+ promotionObj.PromotionHitProductQuantity = this.getQuantity(element);
646
+ promotionObj.PromotionHitQuantity = this.getQuantity(element) * -1;
647
+ obj['PromotionSaving'].push(promotionObj);
648
+ }
649
+ });
650
+ });
651
+ }
652
+ return obj;
653
+ }
654
+ addProduct(element, lineDiscount, transactionDiscount) {
655
+ let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']);
656
+ let obj = {
657
+ XMLSchemaVersion: this.xmlSchemaVersion,
658
+ LineNumber: element.itemLineId,
659
+ NetValue: this.removeDecimal(element.totalLinePrice),
660
+ EffectiveNetValue: this.removeDecimal(element.totalLinePrice),
661
+ Description: element.description,
662
+ DeviceID: this.deviceId,
663
+ UserID: this.transactionDocument.userName,
664
+ DateTimeCreated: this.createdAt,
665
+ ExtendedValue: this.removeDecimal(element.price),
666
+ UnitPrice: this.removeDecimal(element.price),
667
+ //MMGroupID: this.getCaregories(element),
668
+ Quantity: element.quantity,
669
+ SalespersonID: this.transactionDocument.userName,
670
+ SalespersonName: this.salesPersonName,
671
+ TaxCode: this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']).VATCode,
672
+ TaxModifiable: "1",
673
+ OriginalTaxAmount: this.convertToString((this.removeDecimal(this.getOriginalTax(element, taxTotal.VAT)).toFixed(2))),
674
+ TaxAmount: this.convertToString(this.removeDecimal(taxTotal.taxLineTotal)),
675
+ OriginalTaxAmountSet: "1",
676
+ ProductID: element.SKU,
677
+ HandKeyed: "1",
678
+ CustomerDetails: "",
679
+ Perishable: this.getMMGROUPID(element.attributes),
680
+ MMGroupID: this.getMMGROUPID(element.attributes)
681
+ };
682
+ if (lineDiscount) {
683
+ if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
684
+ // line discount
685
+ obj['Discount'] = {};
686
+ obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
687
+ obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
688
+ obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
689
+ obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
690
+ obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;
691
+ obj['Discount'].DiscountType = lineDiscount.discountType;
692
+ obj['Discount'].XMLSchemaVersion = 1;
693
+ obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
694
+ obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
695
+ obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
696
+ obj['Discount'].RoundingRule = 2;
697
+ }
698
+ if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
699
+ //price override
700
+ obj['PriceOverride'] = {};
701
+ obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
702
+ obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
703
+ obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
704
+ obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
705
+ obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;
706
+ obj['PriceOverride'].XMLSchemaVersion = this.xmlSchemaVersion;
707
+ obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
708
+ obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
709
+ }
710
+ //update the product price
711
+ obj['NetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
712
+ obj['EffectiveNetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
713
+ obj['ExtendedValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
714
+ obj['UnitPrice'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
715
+ }
716
+ if (transactionDiscount) {
717
+ obj['BasketDiscountModifier'] = [];
718
+ this.transactionDocument.basket.transactionDiscount.forEach((e) => {
719
+ let discountObj = {};
720
+ e.itemLineIds.forEach((itemLineId) => {
721
+ if (itemLineId == element.itemLineId) {
722
+ let discountAmount = this.convertToString(e.discountAmount * -1);
723
+ discountObj.XMLSchemaVersion = this.xmlSchemaVersion;
724
+ discountObj.DiscountedValue = -(this.getDiscountedValue(element.totalLinePrice, e.discountAmount));
725
+ discountObj.BasketDiscountLineNumber = this.getLineNumber(e, discountAmount);
726
+ obj['BasketDiscountModifier'].push(discountObj);
727
+ }
728
+ });
729
+ });
730
+ let totaltransactionDiscount = 0;
731
+ obj['BasketDiscountModifier'].forEach((value) => {
732
+ totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;
733
+ });
734
+ //update the product price
735
+ obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;
736
+ }
737
+ if (this.transactionDocument.basket.transactionPromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {
738
+ obj['DistributedPromotionSaving'] = [];
739
+ if (this.transactionDocument.basket.transactionPromotion.length > 0) {
740
+ this.transactionDocument.basket.transactionPromotion.forEach((e) => {
741
+ let promotionObj = {};
742
+ e.itemLineIds.forEach((itemLineId) => {
743
+ if (itemLineId == element.itemLineId) {
744
+ promotionObj.PromotionID = e.promotionId;
745
+ promotionObj.Hit = '1';
746
+ promotionObj.Saving = this.getSaving(element.totalLinePrice, e.promotionAmount);
747
+ promotionObj.ISaving = this.getSaving(element.totalLinePrice, e.promotionAmount);
748
+ obj['DistributedPromotionSaving'].push(promotionObj);
749
+ }
750
+ });
751
+ });
752
+ }
753
+ if (this.transactionDocument.basket.linePromotion.length > 0) {
754
+ this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
755
+ let promotionObj = {};
756
+ if (element.itemLineId == linePromotion.itemLineId) {
757
+ promotionObj.PromotionID = linePromotion.promotionId;
758
+ promotionObj.Hit = "1";
759
+ promotionObj.Saving = linePromotion.promotionLinePrice;
760
+ promotionObj.ISaving = linePromotion.promotionLinePrice;
761
+ obj['DistributedPromotionSaving'].push(promotionObj);
762
+ }
763
+ });
764
+ }
765
+ let transactionPromotion = 0;
766
+ obj['DistributedPromotionSaving'].forEach((value) => {
767
+ transactionPromotion = transactionPromotion + value.Saving;
768
+ });
769
+ obj['EffectiveNetValue'] = obj.EffectiveNetValue + transactionPromotion;
770
+ }
771
+ return obj;
772
+ }
773
+ getSaving(price, promotionAmount) {
774
+ let Saving = (price * promotionAmount) / this.transactionDocument.basketSummary.saleTotal;
775
+ return Saving;
776
+ }
777
+ getLineNumber(value, discountAmount) {
778
+ let lineNumber;
779
+ for (let i = 0; i < this.rjObject['BasketDiscount'].length; i++) {
780
+ const element = this.rjObject['BasketDiscount'][i];
781
+ if (value.reasonCode === element.ReasonCodeID && discountAmount === element.NetValue) {
782
+ lineNumber = element.LineNumber;
783
+ break;
784
+ }
785
+ }
786
+ return lineNumber;
787
+ }
788
+ getDiscountedValue(price, discountAmount) {
789
+ let DiscountedValue = ((price * discountAmount) / this.transactionDocument.basketSummary.saleTotal) * 100;
790
+ return DiscountedValue;
791
+ }
792
+ getOriginalTax(element, VAT) {
793
+ let pricebeforetax = (element.price * 100) / (100 + VAT);
794
+ let originaltax = element.price - pricebeforetax;
795
+ return originaltax;
796
+ }
797
+ convertToString(value) {
798
+ try {
799
+ value = JSON.stringify(value);
800
+ return value;
801
+ }
802
+ catch (e) {
803
+ AppLoggerService.logError(this.className, "convertToString", 'can not be converted in string', e);
804
+ }
805
+ }
806
+ generateDynamicStockLookUp() {
807
+ let x = '0';
808
+ this.transactionDocument.basket.products.forEach((element) => {
809
+ if (element.deliveryMethod === '1' || element.deliveryMethod === '2') {
810
+ x = '1';
811
+ }
812
+ });
813
+ return x;
814
+ }
815
+ // getAttributes(){
816
+ // let name: string | any[] = []
817
+ // this.transactionDocument.basket.products.forEach((element: any) => {
818
+ // if (element && element.attributes && element.attributes.length > 0) {
819
+ // name = element.attributes.filter((x: any) => x.name.toUpperCase() === element.name.toUpperCase());
820
+ // }
821
+ // });
822
+ // if (name.length > 0) {
823
+ // return name[0].value
824
+ // }
825
+ // else{
826
+ // return ""
827
+ // }
828
+ // }
829
+ // getCaregories(element) {
830
+ // let MMGroupId = " ";
831
+ // if (element.categories && element.categories.length > 0) {
832
+ // let categories = element.categories.filter((x) => x.parentId != '');
833
+ // let value = categories.filter((x) => x.id != x.parentId);
834
+ // MMGroupId = value[0].name;
835
+ // }
836
+ // return MMGroupId;
837
+ // }
838
+ getDate(date) {
839
+ let offset = this.generateTimezoneoffset(date) * -1;
840
+ let offsetHours = Math.abs(Math.floor(offset / 60));
841
+ let offsetMinutes = Math.abs(offset) - offsetHours * 60;
842
+ let offsetSign = '+';
843
+ if (offset < 0) {
844
+ offsetSign = '-';
845
+ }
846
+ let newdate = date.substring(0, 19);
847
+ const x = (newdate + offsetSign + String(offsetHours).padStart(2, '0') + ':' + String(offsetMinutes).padStart(2, '0')).toString();
848
+ return x;
849
+ }
850
+ getTransactionPromotion(transactionPromotion) {
851
+ if (transactionPromotion && transactionPromotion.length > 0) {
852
+ this.rjObject['PromoVoucherItem'] = {};
853
+ this.rjObject['PromoVoucherItem']['XMLSchemaVersion'] = this.xmlSchemaVersion;
854
+ this.rjObject['PromoVoucherItem']['LineNumber'] = this.generateLineNumber();
855
+ this.rjObject['PromoVoucherItem']['NetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;
856
+ this.rjObject['PromoVoucherItem']['EffectiveNetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;
857
+ this.rjObject['PromoVoucherItem']['Description'] = transactionPromotion[0].promotionInfo;
858
+ this.rjObject['PromoVoucherItem']['DeviceID'] = this.deviceId;
859
+ this.rjObject['PromoVoucherItem']['UserID'] = this.transactionDocument.userName;
860
+ this.rjObject['PromoVoucherItem']['DateTimeCreated'] = this.createdAt;
861
+ this.rjObject['PromoVoucherItem']['ProductId'] = ""; //todo
862
+ this.rjObject['PromoVoucherItem']['SerialNumber'] = ""; //todo
863
+ this.rjObject['PromoVoucherItem']['MMGroupId'] = "";
864
+ }
865
+ }
866
+ getQuantity(element) {
867
+ let quantity;
868
+ if (this.transactionDocument.unreferencedRefund) {
869
+ quantity = element['quantity'] < 0 ? element['quantity'] : (-element['quantity']);
870
+ }
871
+ else {
872
+ quantity = element['refundedQuantity'] < 0 ? element['refundedQuantity'] : (-element['refundedQuantity']);
873
+ }
874
+ return quantity;
875
+ }
876
+ }
877
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUkotbWFwcGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWFwcGVyLWxpYnJhcnkvc3JjL2xpYi9SSi1tYXBwZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBb0UsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUN6SSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUN0RixNQUFNLE9BQU8sb0JBQW9CO0lBNkI3QixZQUFZLGNBQW9DO1FBM0JoRCxjQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFtQjNCLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUtsQixhQUFRLEdBQVEsRUFBRSxDQUFBO1FBR3RCLElBQUksY0FBYyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxjQUFjLENBQUM7U0FDN0M7YUFBTTtZQUNILElBQUksQ0FBQyxtQkFBbUIsR0FBRztnQkFDdkIsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ3hCLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixRQUFRLEVBQUUsRUFBRTtnQkFDWixPQUFPLEVBQUUsRUFBRTtnQkFDWCxPQUFPLEVBQUUsRUFBRTtnQkFDWCxXQUFXLEVBQUUsRUFBRTtnQkFDZixrQkFBa0IsRUFBRSxFQUFFO2dCQUN0QixRQUFRLEVBQUUsRUFBRTtnQkFDWixVQUFVLEVBQUUsRUFBRTtnQkFDZCxNQUFNLEVBQUUsRUFBRTtnQkFDVixnQkFBZ0IsRUFBRSxTQUFTO2dCQUMzQixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsRUFBUztnQkFDakIsYUFBYSxFQUFFLEVBQVM7Z0JBQ3hCLFlBQVksRUFBRSxFQUFFO2dC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QUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBRSxDQUFDLE1BQU07WUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUN2RDtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBWTtRQUNwQixJQUFJLFFBQVEsQ0FBQTtRQUNaLElBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFDO1lBQzNDLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUNyRjthQUNHO1lBQ0EsUUFBUSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1NBQzdHO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRElTQ09VTlRUWVBFLCBMaW5lRGlzY291bnQsIFRQcm9kdWN0LCBUcmFuc2FjdGlvbkRpc2NvdW50LCBUcmFuc2FjdGlvbkRvY3VtZW50LCBUUkFOU0FDVElPTl9UWVBFIH0gZnJvbSBcIi4vbWFwcGVyLWxpYnJhcnkubW9kZWxcIlxuaW1wb3J0IHsgVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIgfSBmcm9tIFwiLi9UcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlclwiO1xuaW1wb3J0IHtBcHBMb2dnZXJTZXJ2aWNlfSBmcm9tICdAcG1jcmV0YWlsL2NvbW1vbi1zZXJ2aWNlcy9jb21tb24vYXBwLWxvZ2dlci5zZXJ2aWNlJztcbmV4cG9ydCBjbGFzcyBSSk1hcHBlckJ1aWxkZXJDbGFzcyB7XG5cbiAgICBjbGFzc05hbWUgPSBcIlJKTWFwcGVyQnVpbGRlckNsYXNzXCI7XG4gICAgcHJpdmF0ZSB0cmFuc2FjdGlvbkRvY3VtZW50OiBUcmFuc2FjdGlvbkRvY3VtZW50O1xuICAgIHByaXZhdGUgZGV2aWNlSWQ6IGFueTtcbiAgICBwcml2YXRlIHRyYW5zYWN0aW9uTnVtYmVyOiBhbnk7XG4gICAgcHJpdmF0ZSBtYW5pZmVzdFZlcnNpb246IGFueTtcbiAgICBwcml2YXRlIGRhdGFiYXNlU2NoZW1hVmVyc2lvbjogYW55O1xuICAgIHByaXZhdGUgYmFza2V0VHlwZTogYW55O1xuICAgIHByaXZhdGUgeG1sU2NoZW1hVmVyc2lvbjogYW55O1xuICAgIHByaXZhdGUgbWFqb3JWZXJzaW9uOiBhbnk7XG4gICAgcHJpdmF0ZSBtaW5vclZlcnNpb246IGFueTtcbiAgICBwcml2YXRlIGV4dGVybmFsU3RhdGU6IGFueTtcbiAgICBwcml2YXRlIGNhc2hpZXJJZDogYW55O1xuICAgIHByaXZhdGUgY29tcGFueUlkOiBhbnk7XG4gICAgcHJpdmF0ZSB0ZXJtaW5hbE51bWJlcjogYW55O1xuICAgIHByaXZhdGUgdGF4TWV0aG9kSWQ6IGFueTtcbiAgICBwcml2YXRlIHRyYWRpbmdSZWdpb25JZDogYW55O1xuICAgIHByaXZhdGUgYmFza2V0Q3VycmVuY3lJZDogYW55O1xuICAgIHByaXZhdGUgYmFza2V0Q291bnRyeUlkOiBhbnk7XG4gICAgcHJpdmF0ZSBiYXNrZXRMYW5ndWFnZUlkOiBhbnk7XG4gICAgcHJpdmF0ZSBpdGVtQ291bnQgPSAwO1xuICAgIHByaXZhdGUgbGFyZ2VzdE51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBicmFuY2hJZDogYW55O1xuICAgIHByaXZhdGUgY3JlYXRlZEF0OiBhbnk7XG4gICAgcHJpdmF0ZSB1cGRhdGVkQXQgOmFueTtcbiAgICBwcml2YXRlIHNhbGVzUGVyc29uTmFtZTogYW55O1xuICAgIHByaXZhdGUgcmpPYmplY3Q6IGFueSA9IHt9XG5cbiAgICBjb25zdHJ1Y3Rvcih0cmFuc2FjdGlvbkRvYz86IFRyYW5zYWN0aW9uRG9jdW1lbnQpIHtcbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uRG9jKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQgPSB0cmFuc2FjdGlvbkRvYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCA9IHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkOiBcIlwiLFxuICAgICAgICAgICAgICAgIG9mZmxpbmVUcmFuc2FjdGlvbklkOiBcIlwiLFxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUmVmOiBcIlwiLFxuICAgICAgICAgICAgICAgIGRhdGVUaW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgIG9yZ0NvZGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgc3RvcmVJZDogXCJcIixcbiAgICAgICAgICAgICAgICBzdG9yZU5vZGVJZDogXCJcIixcbiAgICAgICAgICAgICAgICBzdG9yZU5vZGVTdHJ1Y3R1cmU6IFwiXCIsXG4gICAgICAgICAgICAgICAgZGV2aWNlSWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgdGVybWluYWxJZDogXCJcIixcbiAgICAgICAgICAgICAgICB1c2VySWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgaW5pdGlhdGluZ01vZHVsZTogXCJlQmFza2V0XCIsXG4gICAgICAgICAgICAgICAgZXhwb3J0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBiYXNrZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICAgICAgICBiYXNrZXRTdW1tYXJ5OiB7fSBhcyBhbnksXG4gICAgICAgICAgICAgICAgYmFzZUN1cnJlbmN5OiBcIlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3RhdHVzOiBcIlwiLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogXCJcIixcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsczoge30gYXMgYW55LFxuICAgICAgICAgICAgICAgIHNhbGVUb3RhbDogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0aWxpemVJdGVtQ291bnQoKTtcbiAgICAgICAgdGhpcy5zZXRMaW5lTnVtYmVyRm9yUHJvZHVjdHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVkQXQgPSB0aGlzLmdldERhdGUodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmNyZWF0ZWRBdCk7XG4gICAgICAgIHRoaXMudXBkYXRlZEF0ID0gdGhpcy5nZXREYXRlKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51cGRhdGVkQXQpO1xuICAgIH1cblxuICAgIGdldFBvc2Jhc2tldEluZm8oKSB7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0tleXdvcmQnXSA9IHRoaXMuZ2VuZXJhdGVLZXl3b3JkKCk7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0lEJ10gPSB0aGlzLmdlbmVyYXRlSWQodGhpcy5jcmVhdGVkQXQpO1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydYTUxTY2hlbWFWZXJzaW9uJ10gPSAnMic7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0xhc3RVcGRhdGVkJ10gPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTWFqb3JWZXJzaW9uJ10gPSB0aGlzLm1ham9yVmVyc2lvbjtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTWlub3JWZXJzaW9uJ10gPSB0aGlzLm1pbm9yVmVyc2lvbjtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTWFuaWZlc3RWZXJzaW9uJ10gPSB0aGlzLm1hbmlmZXN0VmVyc2lvbjtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnRGF0YWJhc2VTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLmRhdGFiYXNlU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnQmFza2V0VHlwZSddID0gdGhpcy5iYXNrZXRUeXBlO1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydTdGF0ZSddID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydFeHRlcm5hbFN0YXRlJ10gPSB0aGlzLmV4dGVybmFsU3RhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICBnZXRoZWFkZXJJbmZvKCkge1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXSA9IHt9O1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5UaW1lWm9uZU9mZnNldCA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMuZ2VuZXJhdGVUaW1lem9uZW9mZnNldCh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3JlYXRlZEF0KSk7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkRhdGVUaW1lQ3JlYXRlZCA9IHRoaXMuY3JlYXRlZEF0O1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkgPSB7fTtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LkRldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LkNhc2hpZXJJRCA9IHRoaXMuY2FzaGllcklkO1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkuQ29tcGFueUlEID0gdGhpcy5jb21wYW55SWQ7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5TdG9yZUlEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN0b3JlSWQ7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5CcmFuY2hJRCA9IHRoaXMuYnJhbmNoSWQ7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5UZXJtaW5hbE51bWJlciA9IHRoaXMudGVybWluYWxOdW1iZXI7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5UcmFuc2FjdGlvbk51bWJlciA9IHRoaXMudHJhbnNhY3Rpb25OdW1iZXI7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLlRheE1ldGhvZElEID0gdGhpcy50YXhNZXRob2RJZDtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uRHluYW1pY1N0b2NrTG9va3VwID0gdGhpcy5nZW5lcmF0ZUR5bmFtaWNTdG9ja0xvb2tVcCgpO1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5CYXNrZXRMYW5ndWFnZUlEID0gdGhpcy5iYXNrZXRMYW5ndWFnZUlkOyAvL3RvZG9cbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uQmFza2V0Q291bnRyeUlEID0gdGhpcy5iYXNrZXRDb3VudHJ5SWQ7IC8vdG9kb1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5CYXNrZXRDdXJyZW5jeUlEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeTtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uVHJhZGluZ1JlZ2lvbklEID0gdGhpcy50cmFkaW5nUmVnaW9uSWQ7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkV1cm96b25lID0gXCIgXCI7Ly91bmtub3duXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkV1cm9CYXNlRXhjaGFuZ2VSYXRlID0gXCJcIjsgLy91bmtub3duXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLlByaW50YWJsZU5hbWUgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7IC8vdW5rbm93blxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJqTWFwcGVyKCkge1xuICAgICAgICB2YXIgdHJhbnNhY3Rpb25EaXNjb3VudDphbnkgPSBbXSA7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICB0cmFuc2FjdGlvbkRpc2NvdW50ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEUpIHtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ10gPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ01vZGlmaWVySXRlbSddID0gW107XG5cbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmVEaXNjb3VudCA9IFtdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVEaXNjb3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LmZpbHRlcigoeDogYW55KSA9PiB4Lml0ZW1MaW5lSWQgPT09IGVsZW1lbnQuaXRlbUxpbmVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5pbmRleE9mKGxpbmVEaXNjb3VudFswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmFkZFByb2R1Y3QoZWxlbWVudCwgKGxpbmVEaXNjb3VudC5sZW5ndGggPiAwID8gbGluZURpc2NvdW50WzBdIDogbnVsbCksKHRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCA/IHRyYW5zYWN0aW9uRGlzY291bnQgOiBudWxsKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXS5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TW9kaWZpZXJJdGVtKGxpbmVEaXNjb3VudC5sZW5ndGggPiAwID8gbGluZURpc2NvdW50WzBdIDogbnVsbCwgZWxlbWVudC5pdGVtTGluZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uUHJvbW90aW9uID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbiA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb247XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUcmFuc2FjdGlvblByb21vdGlvbih0cmFuc2FjdGlvblByb21vdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuUkVGVU5EKSB7XG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0UmV0dXJuJ10gPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ01vZGlmaWVySXRlbSddID0gW107ICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5yZXR1cm5Qcm9kdWN0KGVsZW1lbnQsIChlbGVtZW50Lmhhc093blByb3BlcnR5KCdsaW5lRGlzY291bnQnKSA/IGVsZW1lbnQubGluZURpc2NvdW50IDogbnVsbCksKHRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCA/IHRyYW5zYWN0aW9uRGlzY291bnQgOiBudWxsKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNb2RpZmllckl0ZW0oZWxlbWVudC5saW5lRGlzY291bnQsIGVsZW1lbnQuaXRlbUxpbmVJZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX1JFRlVORCkge1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddID0gW107XG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXSA9IFtdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25Eb2M6IGFueSA9IG5ldyBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcigpLmJhc2tldCh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscykuYnVpbGQoKTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uRG9jLmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMucmV0dXJuUHJvZHVjdChlbGVtZW50LCAoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSgnbGluZURpc2NvdW50JykgPyBlbGVtZW50LmxpbmVEaXNjb3VudCA6IG51bGwpLCh0cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDAgPyB0cmFuc2FjdGlvbkRpc2NvdW50IDogbnVsbCkpO1xuICAgICAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxSZWNlaXB0U3VwcGxpZWRcIjogMCxcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbEJyYW5jaElEXCI6IDAsXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxUZXJtaW5hbE51bWJlclwiOiAwLFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsVHJhbnNhY3Rpb25OdW1iZXJcIjogMCxcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbENhc2hpZXJOdW1iZXJcIjogMFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZGF0YVsnUmV0dXJuJ10gPSB7Li4uZGF0YVsnUmV0dXJuJ10sIC4uLm9ian07XG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNb2RpZmllckl0ZW0oZWxlbWVudC5saW5lRGlzY291bnQsIGVsZW1lbnQuaXRlbUxpbmVJZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfRVhDSEFOR0UpIHtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnTW9kaWZpZXJJdGVtJ10gPSBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uRG9jOiBhbnkgPSBuZXcgVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIoKS5iYXNrZXQodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMpLmJ1aWxkKCk7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbkRvYy5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucmVmdW5kZWRRdWFudGl0eSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHVyblByb2R1Y3QgPSB0aGlzLnJldHVyblByb2R1Y3QoZWxlbWVudCwgKGVsZW1lbnQuaGFzT3duUHJvcGVydHkoJ2xpbmVEaXNjb3VudCcpID8gZWxlbWVudC5saW5lRGlzY291bnQgOiBudWxsKSwodHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwID8gdHJhbnNhY3Rpb25EaXNjb3VudCA6IG51bGwpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxSZWNlaXB0U3VwcGxpZWRcIjogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxCcmFuY2hJRFwiOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbFRlcm1pbmFsTnVtYmVyXCI6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsVHJhbnNhY3Rpb25OdW1iZXJcIjogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxDYXNoaWVyTnVtYmVyXCI6IDBcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuUHJvZHVjdFsnUmV0dXJuJ10gPSB7Li4ucmV0dXJuUHJvZHVjdFsnUmV0dXJuJ10sIC4uLm9ian07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXS5wdXNoKHJldHVyblByb2R1Y3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZGRQcm9kdWN0ID0gdGhpcy5hZGRQcm9kdWN0KGVsZW1lbnQsIChlbGVtZW50Lmhhc093blByb3BlcnR5KCdsaW5lRGlzY291bnQnKSA/IGVsZW1lbnQubGluZURpc2NvdW50IDogbnVsbCkgLCh0cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDAgPyB0cmFuc2FjdGlvbkRpc2NvdW50IDogbnVsbCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddLnB1c2goYWRkUHJvZHVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TW9kaWZpZXJJdGVtKGVsZW1lbnQubGluZURpc2NvdW50LCBlbGVtZW50Lml0ZW1MaW5lSWQpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGdldEJhc2tldERpc2NvdW50KCkge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCkgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J10gPSBbXTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge31cbiAgICAgICAgICAgIG9ialsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xuICAgICAgICAgICAgb2JqWydEZXZpY2VJRCddPXRoaXMuZGV2aWNlSWQ7XG4gICAgICAgICAgICBvYmpbJ0RhdGVUaW1lQ3JlYXRlZCddPXRoaXMudXBkYXRlZEF0O1xuICAgICAgICAgICAgb2JqWydOZXRWYWx1ZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5kaXNjb3VudEFtb3VudCAqIC0xKTtcbiAgICAgICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9dGhpcy5jb252ZXJ0VG9TdHJpbmcoIGVsZW1lbnQuZGlzY291bnRBbW91bnQgKiAtMSk7XG4gICAgICAgICAgICBvYmpbJ0Rlc2NyaXB0aW9uJ10gPSBlbGVtZW50LnJlYXNvbkRpc3BsYXlUZXh0O1xuICAgICAgICAgICAgb2JqWydVc2VySUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcbiAgICAgICAgICAgIG9ialsnUmVhc29uQ29kZUlEJ10gPSBlbGVtZW50LnJlYXNvbkNvZGU7XG4gICAgICAgICAgICBvYmpbJ0Rpc2NvdW50VHlwZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5kaXNjb3VudFR5cGUudG9VcHBlckNhc2UoKSA9PSBESVNDT1VOVFRZUEUuUEVSQ0VOVC50b1VwcGVyQ2FzZSgpID8gMCA6IDEpOyBcbiAgICAgICAgICAgIG9ialsnUm91bmRpbmdSdWxlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZygyKTtcbiAgICAgICAgICAgIG9ialsnTW9kaWZpZWRMaW5lTnVtYmVyJ10gPSBlbGVtZW50Lml0ZW1MaW5lSWRzOyAgICAgICAgICAgXG4gICAgICAgICAgICBvYmpbJ0xpbmVOdW1iZXInXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCkpOyBcbiAgICAgICAgICAgIG9ialsnRGlzY291bnRlZFZhbHVlJ10gPSAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgKyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsO1xuICAgICAgICAgICAgaWYoZWxlbWVudC5kaXNjb3VudFR5cGUudG9VcHBlckNhc2UoKSA9PSBESVNDT1VOVFRZUEUuUEVSQ0VOVC50b1VwcGVyQ2FzZSgpKXtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50UGVyY2VudGFnZSddID0gIHRoaXMuY29udmVydFRvU3RyaW5nKChlbGVtZW50LmRpc2NvdW50QW1vdW50IC8gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwpLnRvRml4ZWQoMSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gJ1JFRlVORCcpe1xuICAgICAgICAgICAgICAgIG9ialsnTmV0VmFsdWUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQuZGlzY291bnRBbW91bnQgPCAwID8gLWVsZW1lbnQuZGlzY291bnRBbW91bnQgOiBlbGVtZW50LmRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPXRoaXMuY29udmVydFRvU3RyaW5nKCBlbGVtZW50LmRpc2NvdW50QW1vdW50IDwgMCA/IC1lbGVtZW50LmRpc2NvdW50QW1vdW50IDogZWxlbWVudC5kaXNjb3VudEFtb3VudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J10ucHVzaChvYmopO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZ2V0TW9kaWZpZXJJdGVtKGRhdGE6IGFueSwgbGluZU5vOiBhbnkpIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgbGluZU5vKSB7XG4gICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIG9iai5YTUxTY2hlbWFWZXJzaW9uID0gMTtcbiAgICAgICAgICAgIG9iai5MaW5lTnVtYmVyID0gdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKTtcbiAgICAgICAgICAgIG9iai5OZXRWYWx1ZSA9IDA7XG4gICAgICAgICAgICBvYmouRWZmZWN0aXZlTmV0VmFsdWUgPSAwO1xuICAgICAgICAgICAgb2JqLkRlc2NyaXB0aW9uID0gZGF0YS5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lID8gZGF0YS5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lIDogZGF0YS5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcbiAgICAgICAgICAgIG9iai5EZXZpY2VJRCA9IHRoaXMuZGV2aWNlSWQ7XG4gICAgICAgICAgICBvYmouVXNlcklEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xuICAgICAgICAgICAgb2JqLkRhdGVUaW1lQ3JlYXRlZCA9IHRoaXMudXBkYXRlZEF0O1xuICAgICAgICAgICAgb2JqLkF1dGhvcmlzaW5nVXNlcklEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xuICAgICAgICAgICAgb2JqLlJlYXNvbkNvZGVJRCA9IGRhdGEucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSA/IGRhdGEucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSA6IGRhdGEucHJpY2VPdmVycmlkZVJlYXNvbkNvZGU7XG4gICAgICAgICAgICBvYmouTW9kaWZpZWRMaW5lTnVtYmVyID0gbGluZU5vO1xuICAgICAgICAgICAgb2JqLk1vZGlmaWVkSW5kZXggPSAxO1xuXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXS5wdXNoKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRUcmFpbGVySW5mbygpIHtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddID0ge307XG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5EYXRlVGltZUNvbXBsZXRlZCA9IHRoaXMudXBkYXRlZEF0O1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkgPSB7fTtcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LkRldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LkNhc2hpZXJJRCA9IHRoaXMuY2FzaGllcklkO1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuU3RvcmVJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkO1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuQnJhbmNoSUQgPSB0aGlzLmJyYW5jaElkO1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuVGVybWluYWxOdW1iZXIgPSB0aGlzLnRlcm1pbmFsTnVtYmVyO1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuVHJhbnNhY3Rpb25OdW1iZXIgPSB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyO1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuVG90YWwgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCAqIDEwMCk7XG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5JdGVtQ291bnQgPSB0aGlzLml0ZW1Db3VudDsgLy9naXZlcyB0b3RhbCBjb3VudCBmb3IgcHJvZHVjdFxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuSXRlbVF1YW50aXR5ID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyk7XG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5OZXRJdGVtUXVhbnRpdHkgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLlRheFRvdGFsID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5yZW1vdmVEZWNpbWFsKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LlZBVFRvdGFsKSk7XG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5TZXF1ZW5jZURldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLlNlcXVlbmNlTnVtYmVyID0gJ3Nuc24nIC8vc3RhdGljIGZvciBub3dcblxuICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1RheEl0ZW0nXSA9IFtdO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xuXG4gICAgICAgICAgICBvYmpbJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgICAgIG9ialsnVGF4UmF0ZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5WQVRDb2RlKTtcbiAgICAgICAgICAgIG9ialsnVGF4YWJsZVRvdGFsJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC50YXhhYmxlQW1vdW50KSk7XG4gICAgICAgICAgICBvYmpbJ1RheFRvdGFsJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnJlbW92ZURlY2ltYWwodGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQudGF4TGluZVRvdGFsKSkpO1xuICAgICAgICAgICAgb2JqWydUYXhEZXNjcmlwdGlvbiddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5WQVRDb2RlKTtcbiAgICAgICAgICAgIG9ialsnVGF4SW5jbHVkZWQnXSA9ICcxJztcbiAgICAgICAgICAgIG9ialsnVGF4UGVyY2VudGFnZSddID0gdGhpcy5hZGREZWNpbWFsKGVsZW1lbnQuVkFULnRvRml4ZWQoMikpLnRvRml4ZWQoMik7XG5cbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXVsnVGF4SXRlbSddLnB1c2gob2JqKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwIHx8IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1Byb21vdGlvbkl0ZW0nXSA9IFtdO1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcblxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbklEJ10gPSBlbGVtZW50LnByb21vdGlvbklkO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvblNhdmluZyddID0gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgPCAwID8gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgOiAtZWxlbWVudC5wcm9tb3Rpb25BbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uUXVhbnRpdHknXSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkRlc2NyaXB0aW9uJ10gPSBlbGVtZW50LmRpc3BsYXlUZXh0O1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddID0ge31cbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXROdW1iZXInXSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXRRdWFudGl0eSddID0gXCIxXCI7XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ0hpdFNhdmluZyddID0gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgPCAwID8gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgOiAtZWxlbWVudC5wcm9tb3Rpb25BbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudC5pdGVtTGluZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXVsnUHJvZHVjdElEJ10gPSBwcm9kdWN0LlNLVTtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddWydVbml0VmFsdWUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQucHJvbW90aW9uTGluZVByaWNlIC8gcHJvZHVjdC5xdWFudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXVsnTGluZU51bWJlciddID0gdGhpcy5nZXROdW1iZXIocHJvZHVjdC5TS1UpO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ11bJ1F1YW50aXR5J10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhwcm9kdWN0LnF1YW50aXR5LnRvRml4ZWQoMSkpO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ11bJ1RheENvZGUnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pdGVtTGluZUlkID09IGVsZW1lbnQuaXRlbUxpbmVJZCkuVkFUQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddWydQcm9tb3Rpb25JdGVtJ10ucHVzaChvYmopO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25JRCddID0gZWxlbWVudC5wcm9tb3Rpb25JZDtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25TYXZpbmcnXSA9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDwgMCA/IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDogLWVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvblF1YW50aXR5J10gPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25EZXNjcmlwdGlvbiddID0gZWxlbWVudC5kaXNwbGF5VGV4dDtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXSA9IHt9XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0TnVtYmVyJ10gPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0UXVhbnRpdHknXSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXRTYXZpbmcnXSA9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDwgMCA/IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDogLWVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25UcmlnZ2VyID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lml0ZW1MaW5lSWRzLmZvckVhY2goKGl0ZW1MaW5lSWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShpdGVtTGluZUlkKSA9PT0gcHJvZHVjdC5pdGVtTGluZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvblRyaWdnZXJbJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnUHJvZHVjdElEJ10gPSBwcm9kdWN0LlNLVTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnVW5pdFZhbHVlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlbGVtZW50LnByb21vdGlvbkxpbmVQcmljZSAvIHByb2R1Y3QucXVhbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25UcmlnZ2VyWydMaW5lTnVtYmVyJ10gPSB0aGlzLmdldE51bWJlcihwcm9kdWN0LlNLVSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvblRyaWdnZXJbJ1F1YW50aXR5J10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhwcm9kdWN0LnF1YW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnVGF4Q29kZSddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gcHJvZHVjdC5pdGVtTGluZUlkKS5WQVRDb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ10ucHVzaChwcm9tb3Rpb25UcmlnZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXVsnUHJvbW90aW9uSXRlbSddLnB1c2gob2JqKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXRUZW5kZXJJbmZvKCkge1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnBheW1lbnREZXRhaWxzICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5wYXltZW50RGV0YWlscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQucGF5bWVudERldGFpbHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZihlbGVtZW50LmV4dGVybmFsVGVuZGVyS2V5KXtcbiAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0W2VsZW1lbnQuZXh0ZXJuYWxUZW5kZXJLZXldID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0dJRlQgQ0FSRCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IHRoaXMueG1sU2NoZW1hVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXI6IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy51cGRhdGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJUeXBlOiBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJTdWJUeXBlOiBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJBbW91bnQ6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5SUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJTYWxlc0FsbG93ZWQ6ICcnLC8vdG9kb1xuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dSZWNoYXJnZWFibGVWb3VjaGVyU2FsZXM6ICcnLC8vdG9kb1xuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJJRDogJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0W2VsZW1lbnQuZXh0ZXJuYWxUZW5kZXJLZXldLnB1c2gob2JqKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iajEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBYTUxTY2hlbWFWZXJzaW9uOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXI6IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCksLy90b2RvXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdGl2ZU5ldFZhbHVlOiB0aGlzLmNvbnZlcnRUb1N0cmluZygtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IHRoaXMuZ2V0RGVzY3JpcHRpb24oZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VJRDogdGhpcy5kZXZpY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVDcmVhdGVkOiB0aGlzLnVwZGF0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclN1YlR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlckFtb3VudDogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5SUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZUluVHJhbnNhY3Rpb25Ub3RhbENoZWNrOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93UmVjaGFyZ2VhYmxlVm91Y2hlclNhbGVzOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5EcmF3ZXJBdEVuZDogXCIxXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0W2VsZW1lbnQuZXh0ZXJuYWxUZW5kZXJLZXldLnB1c2gob2JqMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnQ2FzaFRlbmRlciddID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0dJRlQgQ0FSRCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IHRoaXMueG1sU2NoZW1hVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXI6IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IEpTT04uc3RyaW5naWZ5KC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy51cGRhdGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJUeXBlOiBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJTdWJUeXBlOiBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJBbW91bnQ6IEpTT04uc3RyaW5naWZ5KC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5SUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJTYWxlc0FsbG93ZWQ6ICcnLC8vdG9kb1xuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dSZWNoYXJnZWFibGVWb3VjaGVyU2FsZXM6ICcnLC8vdG9kb1xuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJJRDogJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydDYXNoVGVuZGVyJ10ucHVzaChvYmopXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqMSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgTGluZU51bWJlcjogdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE5ldFZhbHVlOiBKU09OLnN0cmluZ2lmeSgtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RpdmVOZXRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IHRoaXMuZ2V0RGVzY3JpcHRpb24oZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VJRDogdGhpcy5kZXZpY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVDcmVhdGVkOiB0aGlzLnVwZGF0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclN1YlR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlckFtb3VudDogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5RGVzY3JpcHRpb246IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlSW5UcmFuc2FjdGlvblRvdGFsQ2hlY2s6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dSZWNoYXJnZWFibGVWb3VjaGVyU2FsZXM6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgT3BlbkRyYXdlckF0RW5kOiBcIjFcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ0Nhc2hUZW5kZXInXS5wdXNoKG9iajEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZ2V0TnVtYmVyKHByb2R1Y3RJZCkge1xuICAgICAgICBsZXQgbGluZU51bWJlcjsgXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ11baV07XG4gICAgICAgICAgICBpZihKU09OLnN0cmluZ2lmeShwcm9kdWN0SWQpID09PSBKU09OLnN0cmluZ2lmeShlbGVtZW50LlByb2R1Y3RJRCkpe1xuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBlbGVtZW50LkxpbmVOdW1iZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7XG4gICAgfVxuXG4gICAgc2V0TGluZU51bWJlckZvclByb2R1Y3RzKCkge1xuICAgICAgICBsZXQgaXRlbUxpbmVJZEFycmF5ID0gW107XG4gICAgICAgIGl0ZW1MaW5lSWRBcnJheSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMubWFwKChwcm9kdWN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0Lml0ZW1MaW5lSWQpO1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLmxhcmdlc3ROdW1iZXIgPSBpdGVtTGluZUlkQXJyYXkucmVkdWNlKChhOiBhbnksIGI6IGFueSkgPT4gTWF0aC5tYXgoYSwgYikpO1xuICAgIH1cblxuICAgIGdlbmVyYXRlTGluZU51bWJlcigpIHtcbiAgICAgICAgdGhpcy5sYXJnZXN0TnVtYmVyICs9IDE7XG4gICAgICAgIHRoaXMuaXRlbUNvdW50ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzLmxhcmdlc3ROdW1iZXI7XG4gICAgfVxuXG4gICAgaW5pdGlsaXplSXRlbUNvdW50KCkge1xuICAgICAgICB0aGlzLml0ZW1Db3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMubGVuZ3RoO1xuICAgIH1cblxuICAgIGJ1aWxkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yak9iamVjdDtcbiAgICB9XG5cbiAgICBnZXREZXNjcmlwdGlvbihlbGVtZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQucGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0NBUkQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5jYXJkVHlwZVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucGF5bWVudFR5cGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRNTUdST1VQSUQoYXR0cmlidXRlcykge1xuICAgICAgICBpZiAoYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBmaWx0ZXJWYWx1ZSA9IGF0dHJpYnV0ZXMuZmlsdGVyKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZS5uYW1lID09PSBcIk1NR1JPVVBJRFwiKTtcbiAgICAgICAgICAgIGlmKGZpbHRlclZhbHVlICYmIGZpbHRlclZhbHVlLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlclZhbHVlWzBdLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RGV2aWNlSW5mbyhpZDogYW55KSB7XG4gICAgICAgIHRoaXMuZGV2aWNlSWQgPSBpZFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHJlbW92ZURlY2ltYWwodmFsdWU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdmFsdWUgKiAxMDA7XG4gICAgfVxuXG4gICAgYWRkRGVjaW1hbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAvMTAwO1xuICAgIH1cblxuICAgIHNldFRyYW5zYWN0aW9uTnVtYmVyKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbk51bWJlciA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHNldE1hbmlmZXN0VmVyc2lvbih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubWFuaWZlc3RWZXJzaW9uID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgc2V0RGF0YWJhc2VTY2hlbWFWZXJzaW9uKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5kYXRhYmFzZVNjaGVtYVZlcnNpb24gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzZXRCYXNrZXRUeXBlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5iYXNrZXRUeXBlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgc2V0VHJhZGluZ1JlZ2lvbklEKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy50cmFkaW5nUmVnaW9uSWQgPSB2YWx1ZVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHNldENvbXBhbnlJRCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuY29tcGFueUlkID0gdmFsdWVcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzZXRUYXhNZXRob2RJRCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMudGF4TWV0aG9kSWQgPSB2YWx1ZVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHNldE1ham9yVmVyc2lvbih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubWFqb3JWZXJzaW9uID0gdmFsdWVcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzZXRNaW5vclZlcnNpb24odmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLm1pbm9yVmVyc2lvbiA9IHZhbHVlXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgc2V0WE1MU2NoZW1hVmVyc2lvbih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMueG1sU2NoZW1hVmVyc2lvbiA9IHZhbHVlXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgc2V0RXh0ZXJuYWxTdGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxTdGF0ZSA9IHZhbHVlXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgc2V0Q2FzaGllcklEKCkge1xuICAgICAgICB0aGlzLmNhc2hpZXJJZCA9ICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lKSA/ICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUgOiAnJztcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzZXRUZXJtaW5hbE51bWJlcih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMudGVybWluYWxOdW1iZXIgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc2V0QmFza2V0TGFuZ3VhZ2VJRCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYmFza2V0TGFuZ3VhZ2VJZCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0QmFza2V0Q291bnRyeUlEKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5iYXNrZXRDb3VudHJ5SWQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc2V0QmFza2V0Q3VycmVuY3lJRCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYmFza2V0Q3VycmVuY3lJZCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzZXRCcmFuY2hJRCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYnJhbmNoSWQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc2V0U2FsZXNQZXJzb25OYW1lKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zYWxlc1BlcnNvbk5hbWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVJZChkYXRlOiBhbnkpIHtcbiAgICAgICAgbGV0IG5ld0RhdGVUaW1lID0gZGF0ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpXG4gICAgICAgIGxldCBpZCA9ICh0aGlzLmRldmljZUlkICsgJ3wnICsgbmV3RGF0ZVRpbWUgKyAnfCcgKyB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyKS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfSBcblxuICAgIGdlbmVyYXRlVGltZXpvbmVvZmZzZXQoZGF0ZTogYW55KSB7XG4gICAgICAgIGxldCB4ID0gZGF0ZSA/IGRhdGUgOiAnJztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHgpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVLZXl3b3JkKCkge1xuICAgICAgICBsZXQgeCA9ICh0aGlzLmNvbXBhbnlJZCArICd8JyArIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkICsgJ3wnICsgdGhpcy50ZXJtaW5hbE51bWJlciArICd8JyArIHRoaXMudHJhbnNhY3Rpb25OdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cblxuICAgIGdldFN0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9wZXJhdGlvblN0YXR1cyA9PT0gJ1BBWV9TVUNDRVNTJykge1xuICAgICAgICAgICAgcmV0dXJuICdDb21wbGV0ZWQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdDYW5jZWxsZWQnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuUHJvZHVjdChlbGVtZW50OiBhbnksIGxpbmVEaXNjb3VudDogTGluZURpc2NvdW50ICwgdHJhbnNhY3Rpb25EaXNjb3VudDogVHJhbnNhY3Rpb25EaXNjb3VudCkge1xuICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcbiAgICAgICAgbGV0IHRheFRvdGFsID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFsndGF4QnJlYWtkb3duJ11bJ3RheExpbmVzJ10uZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudFsnaXRlbUxpbmVJZCddKTtcbiAgICAgICAgb2JqWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XG4gICAgICAgIG9ialsnTGluZU51bWJlciddID0gZWxlbWVudFsnaXRlbUxpbmVJZCddO1xuICAgICAgICBvYmpbJ05ldFZhbHVlJ10gPSB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudFsncmVmdW5kZWRUb3RhbCddKTtcbiAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3JlZnVuZGVkVG90YWwnXSk7XG4gICAgICAgIG9ialsnRGVzY3JpcHRpb24nXSA9IGVsZW1lbnRbJ2Rlc2NyaXB0aW9uJ107XG4gICAgICAgIG9ialsnRGV2aWNlSUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudFsndGVybWluYWxJZCddO1xuICAgICAgICBvYmpbJ1VzZXJJRCddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xuICAgICAgICBvYmpbJ0RhdGVUaW1lQ3JlYXRlZCddID0gdGhpcy5jcmVhdGVkQXQ7XG4gICAgICAgIG9ialsnRXh0ZW5kZWRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3RvdGFsTGluZVByaWNlJ10qLTEpO1xuICAgICAgICBvYmpbJ1VuaXRQcmljZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3ByaWNlJ10pO1xuICAgICAgICBvYmpbJ1F1YW50aXR5J10gPSB0aGlzLmdldFF1YW50aXR5KGVsZW1lbnQpO1xuICAgICAgICBvYmpbJ09yaWdpbmFsVGF4QW1vdW50U2V0J10gPSAxO1xuICAgICAgICBvYmpbJ1Byb2R1Y3RJRCddID0gZWxlbWVudFsnU0tVJ107XG4gICAgICAgIG9ialsnSGFuZEtleWVkJ10gPSAxO1xuICAgICAgICBvYmpbJ0xvbmdEZXNjcmlwdGlvbiddID0gZWxlbWVudFsnZGVzY3JpcHRpb24nXTtcbiAgICAgICAgb2JqWydSZXR1cm4nXSA9IHt9O1xuICAgICAgICBvYmpbJ1JldHVybiddWydSZXR1cm5SZWFzb25JRCddID0gZWxlbWVudFsncmVmdW5kZWRSZWFzb24nXTtcbiAgICAgICAgb2JqWydSZXR1cm4nXVsnUmV0dXJuRGVzY3JpcHRpb24nXSA9IGVsZW1lbnRbJ3JlZnVuZGVkUmVhc29uRGVzY3JpcHRpb24nXTtcbiAgICAgICAgb2JqWydSZXR1cm4nXVsnUmV0dXJuVG9TdG9jayddID0gdGhpcy5nZXRRdWFudGl0eShlbGVtZW50KTtcbiAgICAgICAgb2JqWydUYXhDb2RlJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pLlZBVENvZGU7XG5cbiAgICAgICAgb2JqWydEaXNwbGF5VGF4Q29kZSddID0gJyc7IC8vIHRvZG9cbiAgICAgICAgb2JqWydQcm9kdWN0QXR0cmlidXRlcyddID0gJyc7IC8vdG9kbyAtIG5vdCByZXF1aXJlZFxuICAgICAgICBvYmpbJ1BlcmlzaGFibGUnXSA9IHRoaXMuZ2V0TU1HUk9VUElEKGVsZW1lbnQuYXR0cmlidXRlcyk7XG4gICAgICAgIC8vb2JqWydNTUdyb3VwSUQnXSA9IHRoaXMuZ2V0Q2FyZWdvcmllcyhlbGVtZW50KTtcbiAgICAgICAgb2JqWydNTUdyb3VwSUQnXSA9IHRoaXMuZ2V0TU1HUk9VUElEKGVsZW1lbnQuYXR0cmlidXRlcyk7XG4gICAgICAgIG9ialsnQ3VzdG9tZXJEZXRhaWxzJ10gPSBcIlwiOyAvLyB0b2RvIC0gYmxhbmtcbiAgICAgICAgb2JqWydUb3RhbFByb21vdGlvblNhdmluZyddID0gZWxlbWVudFsncHJvbW90aW9uQW1vdW50J10gfHwgLTE7IC8vIFRPRE9cbiAgICAgICAgb2JqWydPcmlnaW5hbFRheEFtb3VudCddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoKHRoaXMucmVtb3ZlRGVjaW1hbCh0aGlzLmdldE9yaWdpbmFsVGF4KGVsZW1lbnQsdGF4VG90YWwuVkFUKSAqIC0xKSkudG9GaXhlZCgyKSk7XG4gICAgICAgIG9ialsndGF4QW1vdW50J10gPSB0aGlzLnJlbW92ZURlY2ltYWwodGF4VG90YWwudGF4TGluZVRvdGFsIDwgMCA/KHRheFRvdGFsLnRheExpbmVUb3RhbCkgOiAoLXRheFRvdGFsLnRheExpbmVUb3RhbCkpO1xuXG4gICAgICAgIGlmIChsaW5lRGlzY291bnQpIHtcbiAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZSAmJiBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSkge1xuICAgICAgICAgICAgICAgIC8vIGxpbmUgZGlzY291bnRcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10gPSB7fTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllclJlYXNvbklEID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGVzY3JpcHRpb24gPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50VHlwZSA9IGxpbmVEaXNjb3VudC5kaXNjb3VudFR5cGU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLlhNTFNjaGVtYVZlcnNpb24gPSAxO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCArIChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSk7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50ZWRWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRQZXJjZW50YWdlID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFZhbHVlO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Sb3VuZGluZ1J1bGUgPSAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlICYmIGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZSkge1xuICAgICAgICAgICAgICAgIC8vcHJpY2Ugb3ZlcnJpZGVcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXSA9IHt9O1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyUmVhc29uSUQgPSBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbkNvZGU7XG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJSZWFzb25EZXNjcmlwdGlvbiA9IGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5BdXRob3Jpc2luZ1VzZXJJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5YTUxTY2hlbWFWZXJzaW9uID0gMTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5OZXdQcmljZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDAgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3VwZGF0ZSB0aGUgcHJvZHVjdCBwcmljZVxuICAgICAgICAgICAgb2JqLk5ldFZhbHVlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcbiAgICAgICAgICAgIG9iai5FZmZlY3RpdmVOZXRWYWx1ZSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XG4gICAgICAgICAgICBvYmouRXh0ZW5kZWRWYWx1ZSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XG4gICAgICAgICAgICBvYmouVW5pdFByaWNlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRyYW5zYWN0aW9uRGlzY291bnQpIHtcbiAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddID0gW107XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZTogYW55KSA9PiB7ICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgZGlzY291bnRPYmo6IGFueSA9e31cbiAgICAgICAgICAgICAgICAgZS5pdGVtTGluZUlkcy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0gZWxlbWVudC5pdGVtTGluZUlkKSB7ICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXNjb3VudEFtb3VudCA9IHRoaXMuY29udmVydFRvU3RyaW5nKGUuZGlzY291bnRBbW91bnQgKiAtMSk7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50T2JqLkJhc2tldERpc2NvdW50TGluZU51bWJlciA9IHRoaXMuZ2V0TGluZU51bWJlcihlLGRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50T2JqLlhNTFNjaGVtYVZlcnNpb24gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5EaXNjb3VudGVkVmFsdWUgPSB0aGlzLmdldERpc2NvdW50ZWRWYWx1ZShlbGVtZW50LnRvdGFsTGluZVByaWNlLCBlLmRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddLnB1c2goZGlzY291bnRPYmopO1xuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ID0gMDtcbiAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddLmZvckVhY2goKHZhbHVlOmFueSk9PntcbiAgICAgICAgICAgICAgICB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQgPSB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQgKyB2YWx1ZS5EaXNjb3VudGVkVmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBwcm9kdWN0IHByaWNlXG4gICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPSBvYmouRWZmZWN0aXZlTmV0VmFsdWUgKyAgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25TYXZpbmcnXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKCh0cmFuc2FjdGlvblByb21vOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uT2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vLml0ZW1MaW5lSWRzLmZvckVhY2goKGl0ZW1MaW5lSWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUxpbmVJZCA9PSBlbGVtZW50Lml0ZW1MaW5lSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Nb2RpZmllclZhbHVlID0gdHJhbnNhY3Rpb25Qcm9tby5wcm9tb3Rpb25BbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouTW9kaWZpZXJEYXRlVGltZSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jcmVhdGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouTW9kaWZpZXJEZXNjcmlwdGlvbiA9IHRyYW5zYWN0aW9uUHJvbW8uZGlzcGxheVRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouWE1MU2NoZW1hVmVyc2lvbiA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25JRCA9IHRyYW5zYWN0aW9uUHJvbW8ucHJvbW90aW9uSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouUHJvbW90aW9uRGVzY3JpcHRpb24gPSB0cmFuc2FjdGlvblByb21vLmRpc3BsYXlUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLkhpdE51bWJlciA9ICcxJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25IaXRQcm9kdWN0UXVhbnRpdHkgPSB0aGlzLmdldFF1YW50aXR5KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlByb21vdGlvbkhpdFF1YW50aXR5ID0gdGhpcy5nZXRRdWFudGl0eShlbGVtZW50KSAqIC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25TYXZpbmcnXS5wdXNoKHByb21vdGlvbk9iaik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICBhZGRQcm9kdWN0KGVsZW1lbnQ6IFRQcm9kdWN0LCBsaW5lRGlzY291bnQ6IExpbmVEaXNjb3VudCwgdHJhbnNhY3Rpb25EaXNjb3VudDogVHJhbnNhY3Rpb25EaXNjb3VudCkge1xuICAgICAgICBsZXQgdGF4VG90YWwgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pO1xuICAgICAgICBsZXQgb2JqOiBhbnkgPSB7XG4gICAgICAgICAgICBYTUxTY2hlbWFWZXJzaW9uOiB0aGlzLnhtbFNjaGVtYVZlcnNpb24sXG4gICAgICAgICAgICBMaW5lTnVtYmVyOiBlbGVtZW50Lml0ZW1MaW5lSWQsXG4gICAgICAgICAgICBOZXRWYWx1ZTogdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQudG90YWxMaW5lUHJpY2UpLFxuICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnRvdGFsTGluZVByaWNlKSxcbiAgICAgICAgICAgIERlc2NyaXB0aW9uOiBlbGVtZW50LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcbiAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy5jcmVhdGVkQXQsXG4gICAgICAgICAgICBFeHRlbmRlZFZhbHVlOiB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC5wcmljZSksXG4gICAgICAgICAgICBVbml0UHJpY2U6IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnByaWNlKSxcbiAgICAgICAgICAgIC8vTU1Hcm91cElEOiB0aGlzLmdldENhcmVnb3JpZXMoZWxlbWVudCksXG4gICAgICAgICAgICBRdWFudGl0eTogZWxlbWVudC5xdWFudGl0eSxcbiAgICAgICAgICAgIFNhbGVzcGVyc29uSUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcbiAgICAgICAgICAgIFNhbGVzcGVyc29uTmFtZTogdGhpcy5zYWxlc1BlcnNvbk5hbWUsXG4gICAgICAgICAgICBUYXhDb2RlOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pLlZBVENvZGUsXG4gICAgICAgICAgICBUYXhNb2RpZmlhYmxlOiBcIjFcIiwgLy90b2RvXG4gICAgICAgICAgICBPcmlnaW5hbFRheEFtb3VudCA6IHRoaXMuY29udmVydFRvU3RyaW5nKCh0aGlzLnJlbW92ZURlY2ltYWwodGhpcy5nZXRPcmlnaW5hbFRheChlbGVtZW50LHRheFRvdGFsLlZBVCkpLnRvRml4ZWQoMikpKSxcbiAgICAgICAgICAgIFRheEFtb3VudCA6IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMucmVtb3ZlRGVjaW1hbCh0YXhUb3RhbC50YXhMaW5lVG90YWwpKSxcbiAgICAgICAgICAgIE9yaWdpbmFsVGF4QW1vdW50U2V0OiBcIjFcIiwvL3RvZG9cbiAgICAgICAgICAgIFByb2R1Y3RJRDogZWxlbWVudC5TS1UsXG4gICAgICAgICAgICBIYW5kS2V5ZWQ6IFwiMVwiLC8vdG9kb1xuICAgICAgICAgICAgQ3VzdG9tZXJEZXRhaWxzOiBcIlwiLFxuICAgICAgICAgICAgUGVyaXNoYWJsZTogdGhpcy5nZXRNTUdST1VQSUQoZWxlbWVudC5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgIE1NR3JvdXBJRDogdGhpcy5nZXRNTUdST1VQSUQoZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lRGlzY291bnQpIHtcbiAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZSAmJiBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSkge1xuICAgICAgICAgICAgICAgIC8vIGxpbmUgZGlzY291bnRcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10gPSB7fTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllclJlYXNvbklEID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGVzY3JpcHRpb24gPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50VHlwZSA9IGxpbmVEaXNjb3VudC5kaXNjb3VudFR5cGU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLlhNTFNjaGVtYVZlcnNpb24gPSAxO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCArIChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSk7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50ZWRWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRQZXJjZW50YWdlID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFZhbHVlO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Sb3VuZGluZ1J1bGUgPSAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlICYmIGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZSkge1xuICAgICAgICAgICAgICAgIC8vcHJpY2Ugb3ZlcnJpZGVcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXSA9IHt9O1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyUmVhc29uSUQgPSBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbkNvZGU7XG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJSZWFzb25EZXNjcmlwdGlvbiA9IGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5BdXRob3Jpc2luZ1VzZXJJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5YTUxTY2hlbWFWZXJzaW9uID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk5ld1ByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC51bml0UHJpY2UpO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk9yaWdpbmFsUHJpY2UgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBwcm9kdWN0IHByaWNlXG4gICAgICAgICAgICBvYmpbJ05ldFZhbHVlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xuICAgICAgICAgICAgb2JqWydFeHRlbmRlZFZhbHVlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgICAgIG9ialsnVW5pdFByaWNlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRyYW5zYWN0aW9uRGlzY291bnQpIHtcbiAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddID0gW107XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZTphbnkpID0+IHsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGRpc2NvdW50T2JqOiBhbnkgPXt9O1xuICAgICAgICAgICAgICAgICBlLml0ZW1MaW5lSWRzLmZvckVhY2goKGl0ZW1MaW5lSWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUxpbmVJZCA9PSBlbGVtZW50Lml0ZW1MaW5lSWQpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlzY291bnRBbW91bnQgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlLmRpc2NvdW50QW1vdW50ICogLTEpOyAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5YTUxTY2hlbWFWZXJzaW9uID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRPYmouRGlzY291bnRlZFZhbHVlID0gLSh0aGlzLmdldERpc2NvdW50ZWRWYWx1ZShlbGVtZW50LnRvdGFsTGluZVByaWNlLCBlLmRpc2NvdW50QW1vdW50KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5CYXNrZXREaXNjb3VudExpbmVOdW1iZXIgPSB0aGlzLmdldExpbmVOdW1iZXIoZSxkaXNjb3VudEFtb3VudCkgO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqWydCYXNrZXREaXNjb3VudE1vZGlmaWVyJ10ucHVzaChkaXNjb3VudE9iaik7IFxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudCA9IDA7XG4gICAgICAgICAgICBvYmpbJ0Jhc2tldERpc2NvdW50TW9kaWZpZXInXS5mb3JFYWNoKCh2YWx1ZTphbnkpPT57XG4gICAgICAgICAgICAgICAgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ID0gdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ICsgdmFsdWUuRGlzY291bnRlZFZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvL3VwZGF0ZSB0aGUgcHJvZHVjdCBwcmljZVxuICAgICAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gb2JqLkVmZmVjdGl2ZU5ldFZhbHVlICsgIHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudDsgICAgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwIHx8IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBvYmpbJ0Rpc3RyaWJ1dGVkUHJvbW90aW9uU2F2aW5nJ10gPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uT2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZS5pdGVtTGluZUlkcy5mb3JFYWNoKChpdGVtTGluZUlkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtTGluZUlkID09IGVsZW1lbnQuaXRlbUxpbmVJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25JRCA9IGUucHJvbW90aW9uSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLkhpdCA9ICcxJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouU2F2aW5nID0gdGhpcy5nZXRTYXZpbmcoZWxlbWVudC50b3RhbExpbmVQcmljZSwgZS5wcm9tb3Rpb25BbW91bnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5JU2F2aW5nID0gdGhpcy5nZXRTYXZpbmcoZWxlbWVudC50b3RhbExpbmVQcmljZSwgZS5wcm9tb3Rpb25BbW91bnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialsnRGlzdHJpYnV0ZWRQcm9tb3Rpb25TYXZpbmcnXS5wdXNoKHByb21vdGlvbk9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24uZm9yRWFjaCgobGluZVByb21vdGlvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25PYmo6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pdGVtTGluZUlkID09IGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlByb21vdGlvbklEID0gbGluZVByb21vdGlvbi5wcm9tb3Rpb25JZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5IaXQgPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5TYXZpbmcgPSBsaW5lUHJvbW90aW9uLnByb21vdGlvbkxpbmVQcmljZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5JU2F2aW5nID0gbGluZVByb21vdGlvbi5wcm9tb3Rpb25MaW5lUHJpY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbJ0Rpc3RyaWJ1dGVkUHJvbW90aW9uU2F2aW5nJ10ucHVzaChwcm9tb3Rpb25PYmopO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSAwO1xuICAgICAgICAgICAgb2JqWydEaXN0cmlidXRlZFByb21vdGlvblNhdmluZyddLmZvckVhY2goKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbiA9IHRyYW5zYWN0aW9uUHJvbW90aW9uICsgdmFsdWUuU2F2aW5nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPSBvYmouRWZmZWN0aXZlTmV0VmFsdWUgKyB0cmFuc2FjdGlvblByb21vdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIGdldFNhdmluZyhwcmljZSxwcm9tb3Rpb25BbW91bnQpOiBhbnkge1xuICAgICAgICBsZXQgU2F2aW5nID0gKHByaWNlKnByb21vdGlvbkFtb3VudCkvdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsO1xuICAgICAgICByZXR1cm4gU2F2aW5nO1xuICAgIH1cblxuICAgIGdldExpbmVOdW1iZXIodmFsdWU6IGFueSxkaXNjb3VudEFtb3VudDpzdHJpbmcgKXtcbiAgICAgICAgbGV0IGxpbmVOdW1iZXI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yak9iamVjdFsnQmFza2V0RGlzY291bnQnXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J11baV07XG4gICAgICAgICAgICBpZiggdmFsdWUucmVhc29uQ29kZSA9PT0gZWxlbWVudC5SZWFzb25Db2RlSUQgJiYgZGlzY291bnRBbW91bnQgPT09IGVsZW1lbnQuTmV0VmFsdWUpe1xuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBlbGVtZW50LkxpbmVOdW1iZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7ICAgICAgICBcbiAgICB9XG5cblxuICAgIGdldERpc2NvdW50ZWRWYWx1ZShwcmljZTphbnkgLGRpc2NvdW50QW1vdW50OmFueSApIHtcbiAgICAgICAgbGV0IERpc2NvdW50ZWRWYWx1ZSA9KChwcmljZSAqIGRpc2NvdW50QW1vdW50KS90aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwpKjEwMCA7XG4gICAgICAgIHJldHVybiBEaXNjb3VudGVkVmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0T3JpZ2luYWxUYXgoZWxlbWVudDogVFByb2R1Y3QsIFZBVCkge1xuICAgICAgICBsZXQgcHJpY2ViZWZvcmV0YXggPSAoZWxlbWVudC5wcmljZSAqIDEwMCkvKDEwMCArIFZBVCApXG4gICAgICAgIGxldCBvcmlnaW5hbHRheD0gZWxlbWVudC5wcmljZSAtIHByaWNlYmVmb3JldGF4XG4gICAgICAgIHJldHVybiBvcmlnaW5hbHRheDtcbiAgICB9XG5cbiAgICBjb252ZXJ0VG9TdHJpbmcodmFsdWU6IGFueSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRXJyb3IodGhpcy5jbGFzc05hbWUsIFwiY29udmVydFRvU3RyaW5nXCIsICAnY2FuIG5vdCBiZSBjb252ZXJ0ZWQgaW4gc3RyaW5nJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZUR5bmFtaWNTdG9ja0xvb2tVcCgpIHtcbiAgICAgICAgbGV0IHggPSAnMCc7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kZWxpdmVyeU1ldGhvZCA9PT0gJzEnIHx8IGVsZW1lbnQuZGVsaXZlcnlNZXRob2QgPT09ICcyJykge1xuICAgICAgICAgICAgICAgIHggPSAnMSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG5cbiAgICAvLyBnZXRBdHRyaWJ1dGVzKCl7XG4gICAgLy8gICAgIGxldCBuYW1lOiBzdHJpbmcgfCBhbnlbXSA9IFtdXG4gICAgLy8gICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgLy8gICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LmF0dHJpYnV0ZXMgJiYgZWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgICAgICAgICAgICBuYW1lID0gZWxlbWVudC5hdHRyaWJ1dGVzLmZpbHRlcigoeDogYW55KSA9PiB4Lm5hbWUudG9VcHBlckNhc2UoKSA9PT0gZWxlbWVudC5uYW1lLnRvVXBwZXJDYXNlKCkpO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgaWYgKG5hbWUubGVuZ3RoID4gMCkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIG5hbWVbMF0udmFsdWVcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBlbHNle1xuICAgIC8vICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIC8vIGdldENhcmVnb3JpZXMoZWxlbWVudCkge1xuICAgIC8vICAgICBsZXQgTU1Hcm91cElkID0gXCIgXCI7XG4gICAgLy8gICAgIGlmIChlbGVtZW50LmNhdGVnb3JpZXMgJiYgZWxlbWVudC5jYXRlZ29yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgICAgICAgIGxldCBjYXRlZ29yaWVzID0gZWxlbWVudC5jYXRlZ29yaWVzLmZpbHRlcigoeCkgPT4geC5wYXJlbnRJZCAhPSAnJyk7XG4gICAgLy8gICAgICAgICBsZXQgdmFsdWUgPSBjYXRlZ29yaWVzLmZpbHRlcigoeCkgPT4geC5pZCAhPSB4LnBhcmVudElkKTtcbiAgICAvLyAgICAgICAgIE1NR3JvdXBJZCA9IHZhbHVlWzBdLm5hbWU7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIE1NR3JvdXBJZDtcbiAgICAvLyB9XG5cbiAgICBnZXREYXRlKGRhdGU6c3RyaW5nKXtcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuZ2VuZXJhdGVUaW1lem9uZW9mZnNldChkYXRlKSAqIC0xO1xuICAgICAgICBsZXQgb2Zmc2V0SG91cnMgPSBNYXRoLmFicyhNYXRoLmZsb29yKG9mZnNldCAvIDYwKSk7ICAgICAgICBcblx0ICAgIGxldCBvZmZzZXRNaW51dGVzID0gTWF0aC5hYnMob2Zmc2V0KSAtIG9mZnNldEhvdXJzICogNjA7XG5cbiAgICAgICAgbGV0IG9mZnNldFNpZ24gPSAnKyc7XG4gICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICBvZmZzZXRTaWduID0gJy0nO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5ld2RhdGUgPSBkYXRlLnN1YnN0cmluZygwLDE5KTtcbiAgICAgICAgY29uc3QgeCA9IChuZXdkYXRlKyBvZmZzZXRTaWduICtTdHJpbmcob2Zmc2V0SG91cnMpLnBhZFN0YXJ0KDIsICcwJykrJzonK1N0cmluZyhvZmZzZXRNaW51dGVzKS5wYWRTdGFydCgyLCAnMCcpKS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4geDsgICAgICAgIFxuICAgIH1cbiAgICBcbiAgICBnZXRUcmFuc2FjdGlvblByb21vdGlvbih0cmFuc2FjdGlvblByb21vdGlvbil7XG4gICAgICAgIGlmKHRyYW5zYWN0aW9uUHJvbW90aW9uICYmIHRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddID0ge307XG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnTGluZU51bWJlciddID0gdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnTmV0VmFsdWUnXSA9ICB0aGlzLnJlbW92ZURlY2ltYWwodHJhbnNhY3Rpb25Qcm9tb3Rpb25bMF0ucHJvbW90aW9uTGluZVByaWNlKSAqIC0xO1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKHRyYW5zYWN0aW9uUHJvbW90aW9uWzBdLnByb21vdGlvbkxpbmVQcmljZSkgKiAtMTtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnRGVzY3JpcHRpb24nXSA9IHRyYW5zYWN0aW9uUHJvbW90aW9uWzBdLnByb21vdGlvbkluZm87XG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ0RldmljZUlEJ10gPSB0aGlzLmRldmljZUlkO1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydVc2VySUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnRGF0ZVRpbWVDcmVhdGVkJ10gPSB0aGlzLmNyZWF0ZWRBdDtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnUHJvZHVjdElkJ10gPSBcIlwiOyAvL3RvZG9cbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnU2VyaWFsTnVtYmVyJ10gPSBcIlwiIDsgLy90b2RvXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ01NR3JvdXBJZCddID0gXCJcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBnZXRRdWFudGl0eShlbGVtZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IHF1YW50aXR5XG4gICAgICAgIGlmKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51bnJlZmVyZW5jZWRSZWZ1bmQpe1xuICAgICAgICAgICAgcXVhbnRpdHkgPSBlbGVtZW50WydxdWFudGl0eSddIDwgMCA/IGVsZW1lbnRbJ3F1YW50aXR5J10gOiAoLWVsZW1lbnRbJ3F1YW50aXR5J10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBxdWFudGl0eSA9IGVsZW1lbnRbJ3JlZnVuZGVkUXVhbnRpdHknXSA8IDAgPyBlbGVtZW50WydyZWZ1bmRlZFF1YW50aXR5J10gOiAoLWVsZW1lbnRbJ3JlZnVuZGVkUXVhbnRpdHknXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHF1YW50aXR5O1xuICAgIH1cbn1cbiJdfQ==