@pmcretail/mapper-library 0.0.49 → 0.0.52

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 (32) hide show
  1. package/README.md +24 -24
  2. package/bundles/pmcretail-mapper-library.umd.js +4379 -4373
  3. package/bundles/pmcretail-mapper-library.umd.js.map +1 -1
  4. package/esm2015/lib/RJ-mapper.class.js +877 -877
  5. package/esm2015/lib/TransactionDocumentBuilder.js +1244 -1244
  6. package/esm2015/lib/WebReturn-mapper.class.js +326 -326
  7. package/esm2015/lib/WebReturnMagento2RestV1.class.js +275 -269
  8. package/esm2015/lib/WebReturnSalesforceMapper.class.js +409 -409
  9. package/esm2015/lib/basket.service.js +527 -527
  10. package/esm2015/lib/mapper-library.component.js +26 -26
  11. package/esm2015/lib/mapper-library.model.js +41 -41
  12. package/esm2015/lib/mapper-library.module.js +21 -21
  13. package/esm2015/lib/number-util.service.js +42 -42
  14. package/esm2015/pmcretail-mapper-library.js +4 -4
  15. package/esm2015/public-api.js +10 -10
  16. package/fesm2015/pmcretail-mapper-library.js +3743 -3737
  17. package/fesm2015/pmcretail-mapper-library.js.map +1 -1
  18. package/lib/RJ-mapper.class.d.ts +80 -80
  19. package/lib/TransactionDocumentBuilder.d.ts +271 -271
  20. package/lib/WebReturn-mapper.class.d.ts +27 -27
  21. package/lib/WebReturnMagento2RestV1.class.d.ts +30 -30
  22. package/lib/WebReturnMagento2RestV1.class.d.ts.map +1 -1
  23. package/lib/WebReturnSalesforceMapper.class.d.ts +35 -35
  24. package/lib/basket.service.d.ts +105 -105
  25. package/lib/mapper-library.component.d.ts +8 -8
  26. package/lib/mapper-library.model.d.ts +702 -701
  27. package/lib/mapper-library.model.d.ts.map +1 -1
  28. package/lib/mapper-library.module.d.ts +7 -7
  29. package/lib/number-util.service.d.ts +13 -13
  30. package/package.json +2 -2
  31. package/pmcretail-mapper-library.d.ts +5 -5
  32. package/public-api.d.ts +6 -6
@@ -1,527 +1,527 @@
1
- import { BehaviorSubject } from 'rxjs';
2
- import { DELIVERY_METHODS } from './mapper-library.model';
3
- import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
4
- export class BasketService {
5
- constructor(numberUtilService) {
6
- this.numberUtilService = numberUtilService;
7
- this.currentBasket = {
8
- products: [],
9
- transactionDiscount: [],
10
- quantity: 0,
11
- total: 0,
12
- saleTotal: 0,
13
- baseCurrency: ''
14
- };
15
- this.basketSource = new BehaviorSubject(null);
16
- this.basket = this.basketSource.asObservable();
17
- this.productSource = new BehaviorSubject(null);
18
- this.product = this.productSource.asObservable();
19
- this.peerSource = new BehaviorSubject(false);
20
- this.peerSync = this.peerSource.asObservable();
21
- this.scanSource = new BehaviorSubject(false);
22
- this.scanner = this.scanSource.asObservable();
23
- this.className = "BasketService";
24
- }
25
- get isMixedBasketSales() {
26
- return this._isMixedBasketSales;
27
- }
28
- set isMixedBasketSales(v) {
29
- this._isMixedBasketSales = v;
30
- }
31
- updateBasket(basket) {
32
- this.currentBasket = basket;
33
- this.isMixedBasketSales = this.filterProductListWithWebOrder(true).length > 0;
34
- this.basketSource.next(basket);
35
- }
36
- /**
37
- * calculates the total basket value and quantity
38
- * @param null
39
- * @returns void
40
- */
41
- updateBasketTotal(basketDetails, basketState) {
42
- basketDetails.quantity = 0;
43
- basketDetails.total = 0;
44
- for (const p of basketDetails.products) {
45
- basketDetails.quantity = basketDetails.quantity + p.quantity;
46
- basketDetails.total =
47
- this.numberUtilService.trimTo2Decimal(basketDetails.total) +
48
- this.numberUtilService.trimTo2Decimal(p.total);
49
- }
50
- AppLoggerService.logDebug(this.className, "updateBasketTotal", `basketDetails updated values for transaction id
51
- ${basketDetails.transactionId}, basketDetails
52
- ${JSON.stringify(basketDetails)}`);
53
- basketDetails.basketTotal = basketDetails.total;
54
- basketState.updateBasket(basketDetails);
55
- }
56
- /**
57
- * add Line promotion
58
- * @param null
59
- * @returns basketDetails
60
- */
61
- addlinePromotion(promotionList, basketDetails) {
62
- AppLoggerService.logDebug(this.className, "addlinePromotion", `promotionList ${JSON.stringify(promotionList)} and
63
- basketDetails
64
- ${JSON.stringify(basketDetails)} for linePromotions`);
65
- if (promotionList &&
66
- promotionList.result &&
67
- promotionList.result.linePromotions &&
68
- promotionList.result.linePromotions.length > 0) {
69
- for (var element of basketDetails.products) {
70
- for (var promotionelement of promotionList.result.linePromotions) {
71
- if (element.itemLineId.toString() ===
72
- promotionelement.itemLineId.toString()) {
73
- element.linePromotions = promotionelement;
74
- }
75
- }
76
- }
77
- }
78
- return basketDetails;
79
- }
80
- /**
81
- * add Transaction promotion
82
- * @param null
83
- * @returns basketDetails
84
- */
85
- addTransactionPromotion(promotionList, basketdetails) {
86
- AppLoggerService.logDebug(this.className, "addTransactionPromotion", `promotionList ${JSON.stringify(promotionList)} and
87
- basketDetails
88
- ${JSON.stringify(basketdetails)} for transactionPromotions ${JSON.stringify(basketdetails.transactionPromotion)}`);
89
- if (promotionList &&
90
- promotionList.result &&
91
- promotionList.result.transactionPromotion &&
92
- promotionList.result.transactionPromotion.length > 0) {
93
- promotionList.result.transactionPromotion.forEach((tPromotion) => {
94
- let transactionPromotionEntryUpdated = Object.assign({}, tPromotion);
95
- transactionPromotionEntryUpdated.itemLineIds = basketdetails.products.map((product) => {
96
- return product.itemLineId;
97
- });
98
- if (!basketdetails.transactionPromotion) {
99
- basketdetails.transactionPromotion = [];
100
- }
101
- basketdetails.transactionPromotion.push(transactionPromotionEntryUpdated);
102
- basketdetails = this.transactionPromotionProductPortionCalc(basketdetails, transactionPromotionEntryUpdated);
103
- });
104
- }
105
- AppLoggerService.logDebug(this.className, "addTransactionPromotion", "basket details in refund calculation file", basketdetails);
106
- return basketdetails;
107
- }
108
- updateProductTotalForSummary(basketDetails) {
109
- /*sale- product refundedQuantity = undefined
110
- partial refund - product refundedQuantity is > 0
111
- total refund - proudct refundedQuantity is > 0
112
- exchange - exchange product refundedQuantity is > 0
113
- new product refundedQuantity = undefined
114
- old product without exchange refundedQuantity = 0
115
- unreference refund-product refundedQuantity is > 0 */
116
- basketDetails.total = 0;
117
- basketDetails.quantity = 0;
118
- for (var product of basketDetails.products) {
119
- if (product.linePromotions) {
120
- product.total = product.linePromotions.promotionLinePrice;
121
- }
122
- else if (product.lineDiscount && !product.linePromotions) {
123
- product.total = product.lineDiscount.discountedLinePrice;
124
- }
125
- else {
126
- product.total = product.totalLinePrice;
127
- }
128
- product.total =
129
- product.total -
130
- Math.abs(product.refundedTotal ? product.refundedTotal : 0);
131
- basketDetails.total += product.total;
132
- basketDetails.quantity =
133
- basketDetails.quantity +
134
- (product.quantity -
135
- (product.refundedQuantity ? product.refundedQuantity : 0));
136
- AppLoggerService.logDebug(this.className, "updateProductTotalForSummary", "update basketdetails total :" +
137
- basketDetails.total +
138
- " Product line ID : " +
139
- product.itemLineId +
140
- " product total : " +
141
- product.total, "quantity : " + basketDetails.quantity);
142
- }
143
- return this.updateBasketTotalForSummary(basketDetails);
144
- }
145
- updateBasketTotalForSummary(basketDetails) {
146
- basketDetails.basketTotal = basketDetails.total;
147
- AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total for transaction transactionDiscount ", basketDetails.transactionDiscount);
148
- AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total for transaction transactionPromotion ", basketDetails.transactionPromotion);
149
- basketDetails = this.updateTransactionPromotion(basketDetails);
150
- basketDetails = this.updateTransactionDiscount(basketDetails);
151
- basketDetails.basketTotal = Number(basketDetails.basketTotal.toFixed(2));
152
- AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total: basketTotal after promotion applied for basketTotal", basketDetails.basketTotal);
153
- return basketDetails;
154
- }
155
- updateTransactionDiscount(basketDetails) {
156
- if (basketDetails.transactionDiscount &&
157
- basketDetails.transactionDiscount.length > 0) {
158
- const discountTotal = basketDetails.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
159
- AppLoggerService.logDebug(this.className, "updateTransactionDiscount", "discountTotal ", discountTotal);
160
- basketDetails.basketTotal =
161
- basketDetails.basketTotal - Math.abs(discountTotal);
162
- }
163
- return basketDetails;
164
- }
165
- updateTransactionPromotion(basketDetails) {
166
- if (basketDetails.transactionPromotion &&
167
- basketDetails.transactionPromotion.length > 0) {
168
- const discountTotal = basketDetails.transactionPromotion.reduce((n, { promotionAmount }) => n + promotionAmount, 0);
169
- basketDetails.basketTotal =
170
- basketDetails.basketTotal - Math.abs(discountTotal);
171
- }
172
- return basketDetails;
173
- }
174
- updateBasketTotalWithoutDiscount(basket) {
175
- basket.total = 0;
176
- basket.quantity = 0;
177
- for (var product of basket.products) {
178
- if (product.linePromotions) {
179
- product.total = product.linePromotions.promotionLinePrice;
180
- }
181
- else if (product.lineDiscount && !product.linePromotions) {
182
- product.total = product.lineDiscount.discountedLinePrice || 0;
183
- }
184
- else {
185
- product.total = product.totalLinePrice;
186
- }
187
- product.total =
188
- product.total -
189
- Math.abs(product.refundedTotal ? product.refundedTotal : 0);
190
- basket.total += product.total;
191
- basket.quantity =
192
- basket.quantity +
193
- (product.quantity -
194
- (product.refundedQuantity ? product.refundedQuantity : 0));
195
- AppLoggerService.logDebug(this.className, "updateBasketTotalWithoutDiscount", "e-basket:basket service:update basketdetails total :" +
196
- JSON.stringify(basket) +
197
- basket.total +
198
- " Product line ID : " +
199
- product.itemLineId +
200
- " product total : " +
201
- product.total);
202
- }
203
- basket.basketTotal = basket.total;
204
- return basket;
205
- }
206
- updateBasketTotalWithDiscounts(basket) {
207
- AppLoggerService.logDebug(this.className, "updateBasketTotalWithDiscounts", `this.basketDetails new values ${basket},
208
- ${JSON.stringify(basket.basketTotal)}`);
209
- if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
210
- const discountTotal = basket.transactionPromotion.reduce((n, { promotionAmount }) => n + promotionAmount, 0);
211
- basket.basketTotal = basket.basketTotal - discountTotal;
212
- }
213
- if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
214
- const discountTotal = basket.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
215
- basket.basketTotal = basket.basketTotal - discountTotal;
216
- }
217
- AppLoggerService.logDebug(this.className, "updateBasketTotalWithDiscounts", "basket new values", basket);
218
- return basket;
219
- }
220
- transactionDiscountAndPromotionProductortionCalculation(basket) {
221
- if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
222
- basket.transactionDiscount.forEach((discount) => (basket = this.transactionDiscountProductPortionCalc(basket, discount)));
223
- }
224
- if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
225
- basket.transactionPromotion.forEach((promotion) => {
226
- basket = this.transactionPromotionProductPortionCalc(basket, promotion);
227
- });
228
- }
229
- AppLoggerService.logDebug(this.className, "transactionDiscountAndPromotionProductortionCalculation", `basket item discount protion calculation ,
230
- ${basket},
231
- ${basket.products}`);
232
- return basket;
233
- }
234
- transactionPromotionProductPortionCalc(basket, promotion) {
235
- let total = 0;
236
- let percentage = 0;
237
- {
238
- basket.products.forEach((p) => {
239
- if (promotion.itemLineIds.includes(p.itemLineId)) {
240
- p = this.validateProductItemDiscount(p);
241
- const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
242
- this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
243
- this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
244
- total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
245
- }
246
- });
247
- AppLoggerService.logDebug(this.className, "transactionPromotionProductPortionCalc", `ebasket: trnsactionPromotion: ${JSON.stringify(promotion)}, selected products total: ${total}`);
248
- basket.products.forEach((product) => {
249
- product = this.validateProductItemDiscount(product);
250
- const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
251
- this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
252
- this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
253
- if (promotion.itemLineIds.includes(product.itemLineId)) {
254
- percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
255
- product.itemDiscounts.trnPromotionsPortion +=
256
- (promotion.promotionAmount * percentage) / 100;
257
- product.itemDiscounts.trnPromotionsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion);
258
- }
259
- });
260
- }
261
- return basket;
262
- }
263
- transactionDiscountProductPortionCalc(basket, discount) {
264
- let total = 0;
265
- let percentage = 0;
266
- basket.products.forEach((p) => {
267
- if (discount.itemLineIds.includes(p.itemLineId)) {
268
- p = this.validateProductItemDiscount(p);
269
- const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
270
- this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
271
- this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
272
- total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
273
- }
274
- });
275
- AppLoggerService.logDebug(this.className, "transactionDiscountProductPortionCalc", `ebasket: trnsactionDiscount: ${JSON.stringify(discount)}, selected products total: ${total}`);
276
- basket.products.forEach((product) => {
277
- product = this.validateProductItemDiscount(product);
278
- AppLoggerService.logDebug(this.className, "transactionDiscountProductPortionCalc", "discountable in basket service", product.discountable);
279
- const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
280
- this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
281
- this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
282
- if (discount.itemLineIds.includes(product.itemLineId) && product.discountable == true) {
283
- percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
284
- product.itemDiscounts.trnDiscountsPortion +=
285
- (discount.discountAmount * percentage) / 100;
286
- product.itemDiscounts.trnDiscountsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion);
287
- }
288
- });
289
- return basket;
290
- }
291
- validateProductItemDiscount(product) {
292
- if (!product.itemDiscounts) {
293
- product.itemDiscounts = {
294
- trnDiscountsPortion: 0,
295
- trnPromotionsPortion: 0,
296
- refundPortion: 0,
297
- };
298
- }
299
- return product;
300
- }
301
- markProduct(product) {
302
- this.productSource.next(product);
303
- }
304
- stopPeerSyncProcess(peerSync) {
305
- this.peerSource.next(peerSync);
306
- }
307
- scanStart(isScanning) {
308
- this.scanSource.next(isScanning);
309
- }
310
- promotionRemainingCalculation(promotion) {
311
- var promotionValue = 0;
312
- promotion.forEach((element) => {
313
- promotionValue += element.promotionAmount;
314
- });
315
- return promotionValue;
316
- }
317
- discountRemainingCalculation(discount) {
318
- var discountValue = 0;
319
- discount.forEach((element) => {
320
- discountValue += element.discountAmount;
321
- });
322
- return discountValue;
323
- }
324
- discountRefundedCalculation(discount) {
325
- var discountValue = 0;
326
- discount.forEach((element) => {
327
- if (element.discountAmount < 0) {
328
- discountValue += element.discountAmount;
329
- }
330
- });
331
- return discountValue;
332
- }
333
- generateNewItemLineId(products) {
334
- let largestNumber = 0;
335
- if (products.length > 0) {
336
- let itemLineIdArray = products.map((product) => {
337
- return product.itemLineId;
338
- });
339
- largestNumber = itemLineIdArray.reduce((a, b) => Math.max(a, b));
340
- }
341
- return largestNumber + 1;
342
- }
343
- updateBasketProductDataAsPerQuantity(product, quantity) {
344
- AppLoggerService.logDebug(this.className, "updateBasketProductDataAsPerQuantity", `ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);
345
- product.quantity = quantity;
346
- if (product.hasOwnProperty("lineDiscount")) {
347
- // && this.product.quantity !== this.productDetailForm.controls.quantity.value
348
- product.lineDiscount.discountedLinePrice = Number(this.numberUtilService.getFlooredFixed(product.lineDiscount.unitPrice * quantity, 2));
349
- product.lineDiscount.discountAmount =
350
- product.totalLinePrice - product.lineDiscount.discountedLinePrice;
351
- }
352
- else {
353
- product.totalLinePrice =
354
- quantity * this.numberUtilService.trimTo2Decimal(product.selectedPrice);
355
- }
356
- if (product.lineDiscount) {
357
- product.total = product.lineDiscount.discountedLinePrice;
358
- }
359
- else {
360
- product.total = product.totalLinePrice;
361
- }
362
- AppLoggerService.logDebug(this.className, "updateBasketProductDataAsPerQuantity", `ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);
363
- return product;
364
- }
365
- filterProductListWithWebOrder(isWebOrder) {
366
- AppLoggerService.logDebug(this.className, "filterProductListWithWebOrder", "filterProductListWithWebOrder hit", this.currentBasket.products);
367
- if (isWebOrder)
368
- return this.currentBasket.products.filter((x) => x.isWebOrder);
369
- else {
370
- return this.currentBasket.products.filter((x) => !x.isWebOrder);
371
- }
372
- }
373
- filterProductListWithDelivery() {
374
- AppLoggerService.logDebug(this.className, "filterProductListWithDelivery", "filterProductListWithDelivery hit", this.currentBasket.products);
375
- return this.currentBasket.products.filter((x) => x.deliveryMethod === DELIVERY_METHODS.DELIVERY.toString());
376
- }
377
- filterProductListWithDeliveryGroup(group, products) {
378
- AppLoggerService.logDebug(this.className, "filterProductListWithDeliveryGroup", "filterProductListWithDeliveryGroup hit", products);
379
- return products.filter((x) => x.deliveryGroup === group);
380
- }
381
- generateNewDeliveryGroupNumber(products) {
382
- let largestNumber = 0;
383
- if (products.length > 0) {
384
- let deliveryGroupArr = products.map((product) => {
385
- if (product.deliveryGroup) {
386
- return parseInt(product.deliveryGroup);
387
- }
388
- return 0;
389
- });
390
- largestNumber = deliveryGroupArr.reduce((a, b) => Math.max(a, b));
391
- }
392
- return (largestNumber + 1).toString();
393
- }
394
- getDeliveryGroupNumbers(products) {
395
- AppLoggerService.logDebug(this.className, "getDeliveryGroupNumbers", "getDeliveryGroupNumbers initiating : ", products);
396
- let uniqueAndsortedResult = [];
397
- if (products.length > 0) {
398
- let deliveryGroupArr = products.map((product) => {
399
- if (product.deliveryGroup) {
400
- return parseInt(product.deliveryGroup);
401
- }
402
- else if (product.deliveryMethod === "1") {
403
- return 1;
404
- }
405
- return 0;
406
- });
407
- uniqueAndsortedResult = Array.from(new Set(deliveryGroupArr)).sort((a, b) => a - b);
408
- AppLoggerService.logDebug(this.className, "getDeliveryGroupNumbers", "getDeliveryGroupNumbers : uniqueAndsortedResult", uniqueAndsortedResult);
409
- }
410
- return uniqueAndsortedResult;
411
- }
412
- updateProductsWithNewDeliveryGroupNumber(products) {
413
- AppLoggerService.logDebug(this.className, "updateProductsWithNewDeliveryGroupNumber", "initiating : ", products);
414
- let newGroupNumber = this.generateNewDeliveryGroupNumber(this.currentBasket.products);
415
- if (products.length > 0) {
416
- this.currentBasket.products.forEach(cBProducts => {
417
- products.forEach(element => {
418
- if (cBProducts.itemLineId === element.itemLineId) {
419
- cBProducts.deliveryGroup = newGroupNumber;
420
- }
421
- });
422
- });
423
- }
424
- this.updateBasket(this.currentBasket);
425
- return;
426
- }
427
- calculateEstimatedTime(products) {
428
- try {
429
- let time;
430
- let estmatedTime = 0;
431
- let estimatedDays = "Hours";
432
- products.forEach((element) => {
433
- if (element.leadTime.type.toLocaleLowerCase() === "weeks") {
434
- time = Number(element.leadTime.value) * 24 * 7;
435
- estmatedTime = Math.max(estmatedTime, time);
436
- estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
437
- AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `week ${estmatedTime} ${estimatedDays}`);
438
- }
439
- else if (element.leadTime.type.toLocaleLowerCase() === "days") {
440
- time = Number(element.leadTime.value) * 24;
441
- estmatedTime = Math.max(estmatedTime, time);
442
- estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
443
- AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `days ${estmatedTime} ${estimatedDays}`);
444
- }
445
- else if (element.leadTime.type.toLocaleLowerCase() === "months") {
446
- time = Number(element.leadTime.value) * 24 * 30;
447
- estmatedTime = Math.max(estmatedTime, time);
448
- estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
449
- AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `months ${estmatedTime} ${estimatedDays}`);
450
- }
451
- else if (element.leadTime.type.toLocaleLowerCase() === "years") {
452
- time = Number(element.leadTime.value) * 24 * 365;
453
- estmatedTime = Math.max(estmatedTime, time);
454
- estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
455
- AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `years ${estmatedTime} ${estimatedDays}`);
456
- }
457
- else {
458
- time = Number(element.leadTime.value);
459
- estmatedTime = Math.max(estmatedTime, time);
460
- estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
461
- AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `hours ${estmatedTime} ${estimatedDays}`);
462
- }
463
- });
464
- if (estimatedDays.toLocaleLowerCase() === "days") {
465
- estmatedTime = estmatedTime / 24;
466
- }
467
- else if (estimatedDays.toLocaleLowerCase() === "weeks") {
468
- estmatedTime = estmatedTime / (24 * 7);
469
- }
470
- else if (estimatedDays.toLocaleLowerCase() === "months") {
471
- estmatedTime = estmatedTime / (24 * 30);
472
- }
473
- else if (estimatedDays.toLocaleLowerCase() === "years") {
474
- estmatedTime = estmatedTime / (24 * 365);
475
- }
476
- let estimate = {
477
- value: estmatedTime.toString(),
478
- type: estimatedDays
479
- };
480
- return estimate;
481
- }
482
- catch (error) {
483
- AppLoggerService.logError(this.className, "calculateEstimatedTime", "error in calculateEstimatedTime", error);
484
- }
485
- return 0;
486
- }
487
- updateProductsWithDeliveryGroupNumber(oldGroup, newGroup) {
488
- AppLoggerService.logDebug(this.className, "updateProductsWithDeliveryGroupNumber initiating");
489
- this.currentBasket.products.forEach(cBProducts => {
490
- if (cBProducts.deliveryGroup === oldGroup) {
491
- cBProducts.deliveryGroup = newGroup;
492
- }
493
- });
494
- this.updateBasket(this.currentBasket);
495
- return;
496
- }
497
- getDeliveryInfo() {
498
- AppLoggerService.logDebug(this.className, "getDeliveryInfo", "getDeliveryGroupInfor initiating");
499
- try {
500
- let groupInfo = {
501
- groups: []
502
- };
503
- this.getDeliveryGroupNumbers(this.currentBasket.products).forEach((groupNumber) => {
504
- let group = {
505
- groupNumber: groupNumber,
506
- items: [],
507
- estimate: {
508
- type: "Hours",
509
- value: "0"
510
- }
511
- };
512
- this.currentBasket.products.forEach(cBProducts => {
513
- if (cBProducts.deliveryGroup === groupNumber.toString()) {
514
- group.items.push(cBProducts);
515
- }
516
- });
517
- group.estimate = this.calculateEstimatedTime(group.items);
518
- groupInfo.groups.push(group);
519
- });
520
- return groupInfo;
521
- }
522
- catch (error) {
523
- AppLoggerService.logError(this.className, "getDeliveryInfo", "error while getting delivery info", error);
524
- }
525
- }
526
- }
527
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBwZXItbGlicmFyeS9zcmMvbGliL2Jhc2tldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFFdEYsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBOUJ4RCxrQkFBYSxHQUFXO1lBQ3RCLFFBQVEsRUFBRSxFQUFFO1lBQ1osbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFLENBQUM7WUFDWixZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFDO1FBRU0saUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztRQUN0RCxXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3ZELFlBQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBDLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDekQsWUFBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7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ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgREVMSVZFUllfTUVUSE9EUyB9IGZyb20gJy4vbWFwcGVyLWxpYnJhcnkubW9kZWwnO1xyXG5pbXBvcnQgeyBCYXNrZXQsIERlbGl2ZXJ5R3JvdXBJbmZvLCBEZWxpdmVyeUluZm8sIFByb2R1Y3QsIFRyYW5zYWN0aW9uUHJvbW90aW9uIH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XHJcbmltcG9ydCB7IFRyYW5zYWN0aW9uRGlzY291bnQgfSBmcm9tICcuL21hcHBlci1saWJyYXJ5Lm1vZGVsJztcclxuaW1wb3J0IHsgTnVtYmVyVXRpbFNlcnZpY2UgfSBmcm9tICcuL251bWJlci11dGlsLnNlcnZpY2UnO1xyXG5pbXBvcnQge0FwcExvZ2dlclNlcnZpY2V9IGZyb20gJ0BwbWNyZXRhaWwvY29tbW9uLXNlcnZpY2VzL2NvbW1vbi9hcHAtbG9nZ2VyLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2tldFNlcnZpY2Uge1xyXG4gIGN1cnJlbnRCYXNrZXQ6IEJhc2tldCA9IHtcclxuICAgIHByb2R1Y3RzOiBbXSxcclxuICAgIHRyYW5zYWN0aW9uRGlzY291bnQ6IFtdLFxyXG4gICAgcXVhbnRpdHk6IDAsXHJcbiAgICB0b3RhbDogMCxcclxuICAgIHNhbGVUb3RhbDogMCxcclxuICAgIGJhc2VDdXJyZW5jeTogJydcclxuICB9O1xyXG5cclxuICBwcml2YXRlIGJhc2tldFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcclxuICBiYXNrZXQgPSB0aGlzLmJhc2tldFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBwcm9kdWN0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xyXG4gIHByb2R1Y3QgPSB0aGlzLnByb2R1Y3RTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgcGVlclNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHBlZXJTeW5jID0gdGhpcy5wZWVyU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIHNjYW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBzY2FubmVyID0gdGhpcy5zY2FuU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9pc01peGVkQmFza2V0U2FsZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGdldCBpc01peGVkQmFza2V0U2FsZXMoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLl9pc01peGVkQmFza2V0U2FsZXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgaXNNaXhlZEJhc2tldFNhbGVzKHY6IGFueSkge1xyXG4gICAgdGhpcy5faXNNaXhlZEJhc2tldFNhbGVzID0gdjtcclxuICB9XHJcbiAgY2xhc3NOYW1lID0gXCJCYXNrZXRTZXJ2aWNlXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbnVtYmVyVXRpbFNlcnZpY2U6IE51bWJlclV0aWxTZXJ2aWNlKSB7IH1cclxuXHJcbiAgdXBkYXRlQmFza2V0KGJhc2tldDogQmFza2V0KSB7XHJcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXQgPSBiYXNrZXQ7XHJcbiAgICB0aGlzLmlzTWl4ZWRCYXNrZXRTYWxlcyA9IHRoaXMuZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXIodHJ1ZSkubGVuZ3RoID4gMDtcclxuICAgIHRoaXMuYmFza2V0U291cmNlLm5leHQoYmFza2V0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGJhc2tldCB2YWx1ZSBhbmQgcXVhbnRpdHlcclxuICAgKiBAcGFyYW0gIG51bGxcclxuICAgKiBAcmV0dXJucyB2b2lkXHJcbiAgICovXHJcbiAgdXBkYXRlQmFza2V0VG90YWwoYmFza2V0RGV0YWlsczogeyBxdWFudGl0eTogbnVtYmVyOyB0b3RhbDogbnVtYmVyOyBwcm9kdWN0czogYW55OyB0cmFuc2FjdGlvbklkOiBhbnk7IGJhc2tldFRvdGFsOiBhbnk7IH0sIGJhc2tldFN0YXRlOiB7IHVwZGF0ZUJhc2tldDogKGFyZzA6IGFueSkgPT4gdm9pZDsgfSkge1xyXG4gICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IDA7XHJcbiAgICBiYXNrZXREZXRhaWxzLnRvdGFsID0gMDtcclxuICAgIGZvciAoY29uc3QgcCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XHJcbiAgICAgIGJhc2tldERldGFpbHMucXVhbnRpdHkgPSBiYXNrZXREZXRhaWxzLnF1YW50aXR5ICsgcC5xdWFudGl0eTtcclxuICAgICAgYmFza2V0RGV0YWlscy50b3RhbCA9XHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChiYXNrZXREZXRhaWxzLnRvdGFsKSArXHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChwLnRvdGFsKTtcclxuICAgIH1cclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQmFza2V0VG90YWxcIixcclxuICAgICAgYGJhc2tldERldGFpbHMgdXBkYXRlZCB2YWx1ZXMgZm9yIHRyYW5zYWN0aW9uIGlkXHJcbiAgICAgICR7YmFza2V0RGV0YWlscy50cmFuc2FjdGlvbklkfSwgIGJhc2tldERldGFpbHNcclxuICAgICAgJHtKU09OLnN0cmluZ2lmeShiYXNrZXREZXRhaWxzKX1gXHJcbiAgICApO1xyXG4gICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCA9IGJhc2tldERldGFpbHMudG90YWw7XHJcbiAgICBiYXNrZXRTdGF0ZS51cGRhdGVCYXNrZXQoYmFza2V0RGV0YWlscyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBhZGQgTGluZSBwcm9tb3Rpb25cclxuICAgKiBAcGFyYW0gIG51bGxcclxuICAgKiBAcmV0dXJucyBiYXNrZXREZXRhaWxzXHJcbiAgICovXHJcbiAgYWRkbGluZVByb21vdGlvbihwcm9tb3Rpb25MaXN0OiB7IHJlc3VsdDogeyBsaW5lUHJvbW90aW9uczogc3RyaW5nIHwgYW55W107IH07IH0sIGJhc2tldERldGFpbHM6IHsgcHJvZHVjdHM6IGFueTsgfSkge1xyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJhZGRsaW5lUHJvbW90aW9uXCIsXHJcbiAgICAgIGBwcm9tb3Rpb25MaXN0ICR7SlNPTi5zdHJpbmdpZnkocHJvbW90aW9uTGlzdCl9IGFuZCBcclxuICAgICAgIGJhc2tldERldGFpbHNcclxuICAgICAgJHtKU09OLnN0cmluZ2lmeShiYXNrZXREZXRhaWxzKX0gZm9yIGxpbmVQcm9tb3Rpb25zYFxyXG4gICAgKTtcclxuICAgIGlmIChcclxuICAgICAgcHJvbW90aW9uTGlzdCAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdCAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC5saW5lUHJvbW90aW9ucyAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC5saW5lUHJvbW90aW9ucy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgZm9yICh2YXIgZWxlbWVudCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XHJcbiAgICAgICAgZm9yICh2YXIgcHJvbW90aW9uZWxlbWVudCBvZiBwcm9tb3Rpb25MaXN0LnJlc3VsdC5saW5lUHJvbW90aW9ucykge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBlbGVtZW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSA9PT1cclxuICAgICAgICAgICAgcHJvbW90aW9uZWxlbWVudC5pdGVtTGluZUlkLnRvU3RyaW5nKClcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBlbGVtZW50LmxpbmVQcm9tb3Rpb25zID0gcHJvbW90aW9uZWxlbWVudDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogYWRkIFRyYW5zYWN0aW9uIHByb21vdGlvblxyXG4gICAqIEBwYXJhbSAgbnVsbFxyXG4gICAqIEByZXR1cm5zIGJhc2tldERldGFpbHNcclxuICAgKi9cclxuXHJcbiAgYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb24ocHJvbW90aW9uTGlzdDogeyByZXN1bHQ6IHsgdHJhbnNhY3Rpb25Qcm9tb3Rpb246IGFueSB9OyB9LCBiYXNrZXRkZXRhaWxzOiBCYXNrZXQpIHtcclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcclxuICAgICAgYHByb21vdGlvbkxpc3QgJHtKU09OLnN0cmluZ2lmeShwcm9tb3Rpb25MaXN0KX0gYW5kIFxyXG4gICAgICAgYmFza2V0RGV0YWlsc1xyXG4gICAgICAke0pTT04uc3RyaW5naWZ5KGJhc2tldGRldGFpbHMpfSBmb3IgdHJhbnNhY3Rpb25Qcm9tb3Rpb25zICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0ZGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbil9YFxyXG4gICAgKTtcclxuICAgIGlmIChcclxuICAgICAgcHJvbW90aW9uTGlzdCAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdCAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbiAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQudHJhbnNhY3Rpb25Qcm9tb3Rpb24uZm9yRWFjaCgodFByb21vdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uUHJvbW90aW9uRW50cnlVcGRhdGVkOiBhbnkgPSBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAge30sXHJcbiAgICAgICAgICB0UHJvbW90aW9uXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb25FbnRyeVVwZGF0ZWQuaXRlbUxpbmVJZHMgPSBiYXNrZXRkZXRhaWxzLnByb2R1Y3RzLm1hcChcclxuICAgICAgICAgIChwcm9kdWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9kdWN0Lml0ZW1MaW5lSWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKCFiYXNrZXRkZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uKSB7XHJcbiAgICAgICAgICBiYXNrZXRkZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24ucHVzaChcclxuICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uRW50cnlVcGRhdGVkXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgYmFza2V0ZGV0YWlscyA9IHRoaXMudHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGMoXHJcbiAgICAgICAgICBiYXNrZXRkZXRhaWxzLFxyXG4gICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb25FbnRyeVVwZGF0ZWRcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcclxuICAgICAgXCJiYXNrZXQgZGV0YWlscyBpbiByZWZ1bmQgY2FsY3VsYXRpb24gZmlsZVwiLFxyXG4gICAgICBiYXNrZXRkZXRhaWxzXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGJhc2tldGRldGFpbHM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcm9kdWN0VG90YWxGb3JTdW1tYXJ5KGJhc2tldERldGFpbHM6IHsgdG90YWw6IHN0cmluZyB8IG51bWJlcjsgcXVhbnRpdHk6IHN0cmluZyB8IG51bWJlcjsgcHJvZHVjdHM6IGFueTsgfSkge1xyXG4gICAgLypzYWxlLSAgICAgICAgICAgIHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSA9IHVuZGVmaW5lZFxyXG4gICAgcGFydGlhbCByZWZ1bmQgLSAgIHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSBpcyA+IDBcclxuICAgIHRvdGFsIHJlZnVuZCAtICAgICBwcm91ZGN0IHJlZnVuZGVkUXVhbnRpdHkgaXMgPiAwXHJcbiAgICBleGNoYW5nZSAtICAgICAgICAgZXhjaGFuZ2UgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMCAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSA9IHVuZGVmaW5lZCAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgb2xkIHByb2R1Y3Qgd2l0aG91dCBleGNoYW5nZSByZWZ1bmRlZFF1YW50aXR5ID0gMFxyXG4gICAgdW5yZWZlcmVuY2UgcmVmdW5kLXByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSBpcyA+IDAgKi9cclxuXHJcbiAgICBiYXNrZXREZXRhaWxzLnRvdGFsID0gMDtcclxuICAgIGJhc2tldERldGFpbHMucXVhbnRpdHkgPSAwO1xyXG4gICAgZm9yICh2YXIgcHJvZHVjdCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XHJcbiAgICAgIGlmIChwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QubGluZVByb21vdGlvbnMucHJvbW90aW9uTGluZVByaWNlO1xyXG4gICAgICB9IGVsc2UgaWYgKHByb2R1Y3QubGluZURpc2NvdW50ICYmICFwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XHJcbiAgICAgIH1cclxuICAgICAgcHJvZHVjdC50b3RhbCA9XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbCAtXHJcbiAgICAgICAgTWF0aC5hYnMocHJvZHVjdC5yZWZ1bmRlZFRvdGFsID8gcHJvZHVjdC5yZWZ1bmRlZFRvdGFsIDogMCk7XHJcblxyXG4gICAgICBiYXNrZXREZXRhaWxzLnRvdGFsICs9IHByb2R1Y3QudG90YWw7XHJcbiAgICAgIGJhc2tldERldGFpbHMucXVhbnRpdHkgPVxyXG4gICAgICAgIGJhc2tldERldGFpbHMucXVhbnRpdHkgK1xyXG4gICAgICAgIChwcm9kdWN0LnF1YW50aXR5IC1cclxuICAgICAgICAgIChwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgPyBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgOiAwKSk7XHJcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlUHJvZHVjdFRvdGFsRm9yU3VtbWFyeVwiLFxyXG4gICAgICAgIFwidXBkYXRlIGJhc2tldGRldGFpbHMgdG90YWwgOlwiICtcclxuICAgICAgICBiYXNrZXREZXRhaWxzLnRvdGFsICtcclxuICAgICAgICBcIiBQcm9kdWN0IGxpbmUgSUQgOiBcIiArXHJcbiAgICAgICAgcHJvZHVjdC5pdGVtTGluZUlkICtcclxuICAgICAgICBcIiBwcm9kdWN0IHRvdGFsIDogXCIgK1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwsXHJcbiAgICAgICAgXCJxdWFudGl0eSAgOiBcIiArIGJhc2tldERldGFpbHMucXVhbnRpdHlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzOiBhbnkpIHtcclxuICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPSBiYXNrZXREZXRhaWxzLnRvdGFsO1xyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dJbmZvKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeVwiLFxyXG4gICAgICBcInVwZGF0ZSBCYXNrZXQgVG90YWwgZm9yIHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uRGlzY291bnQgIFwiLFxyXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnRcclxuICAgICk7XHJcblxyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dJbmZvKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeVwiLFxyXG4gICAgICBcInVwZGF0ZSBCYXNrZXQgVG90YWwgZm9yIHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uUHJvbW90aW9uICBcIixcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvblxyXG4gICAgKTtcclxuXHJcbiAgICBiYXNrZXREZXRhaWxzID0gdGhpcy51cGRhdGVUcmFuc2FjdGlvblByb21vdGlvbihiYXNrZXREZXRhaWxzKTtcclxuICAgIGJhc2tldERldGFpbHMgPSB0aGlzLnVwZGF0ZVRyYW5zYWN0aW9uRGlzY291bnQoYmFza2V0RGV0YWlscyk7XHJcbiAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsID0gTnVtYmVyKGJhc2tldERldGFpbHMuYmFza2V0VG90YWwudG9GaXhlZCgyKSk7XHJcblxyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dJbmZvKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeVwiLFxyXG4gICAgICBcInVwZGF0ZSBCYXNrZXQgVG90YWw6IGJhc2tldFRvdGFsIGFmdGVyIHByb21vdGlvbiBhcHBsaWVkICBmb3IgYmFza2V0VG90YWxcIixcclxuICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbFxyXG4gICAgKTtcclxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVHJhbnNhY3Rpb25EaXNjb3VudChiYXNrZXREZXRhaWxzOiB7IHRyYW5zYWN0aW9uRGlzY291bnQ6IGFueVtdOyBiYXNrZXRUb3RhbDogbnVtYmVyOyB9KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudCAmJlxyXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGRpc2NvdW50VG90YWwgPSBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQucmVkdWNlKFxyXG4gICAgICAgIChuOiBhbnksIHsgZGlzY291bnRBbW91bnQgfTogYW55KSA9PiBuICsgZGlzY291bnRBbW91bnQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZVRyYW5zYWN0aW9uRGlzY291bnRcIiwgIFwiZGlzY291bnRUb3RhbCBcIiwgZGlzY291bnRUb3RhbCk7XHJcbiAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPVxyXG4gICAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgLSBNYXRoLmFicyhkaXNjb3VudFRvdGFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVHJhbnNhY3Rpb25Qcm9tb3Rpb24oYmFza2V0RGV0YWlsczogeyB0cmFuc2FjdGlvblByb21vdGlvbjogYW55W107IGJhc2tldFRvdGFsOiBudW1iZXI7IH0pIHtcclxuICAgIGlmIChcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbiAmJlxyXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5yZWR1Y2UoXHJcbiAgICAgICAgKG46IGFueSwgeyBwcm9tb3Rpb25BbW91bnQgfTogYW55KSA9PiBuICsgcHJvbW90aW9uQW1vdW50LFxyXG4gICAgICAgIDBcclxuICAgICAgKTtcclxuICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCA9XHJcbiAgICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCAtIE1hdGguYWJzKGRpc2NvdW50VG90YWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVCYXNrZXRUb3RhbFdpdGhvdXREaXNjb3VudChiYXNrZXQ6IEJhc2tldCk6IEJhc2tldCB7XHJcbiAgICBiYXNrZXQudG90YWwgPSAwO1xyXG4gICAgYmFza2V0LnF1YW50aXR5ID0gMDtcclxuXHJcbiAgICBmb3IgKHZhciBwcm9kdWN0IG9mIGJhc2tldC5wcm9kdWN0cykge1xyXG4gICAgICBpZiAocHJvZHVjdC5saW5lUHJvbW90aW9ucykge1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVQcm9tb3Rpb25zLnByb21vdGlvbkxpbmVQcmljZTtcclxuICAgICAgfSBlbHNlIGlmIChwcm9kdWN0LmxpbmVEaXNjb3VudCAmJiAhcHJvZHVjdC5saW5lUHJvbW90aW9ucykge1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHByb2R1Y3QudG90YWwgPVxyXG4gICAgICAgIHByb2R1Y3QudG90YWwgLVxyXG4gICAgICAgIE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCA/IHByb2R1Y3QucmVmdW5kZWRUb3RhbCA6IDApO1xyXG4gICAgICBiYXNrZXQudG90YWwgKz0gcHJvZHVjdC50b3RhbDtcclxuICAgICAgYmFza2V0LnF1YW50aXR5ID1cclxuICAgICAgICBiYXNrZXQucXVhbnRpdHkgK1xyXG4gICAgICAgIChwcm9kdWN0LnF1YW50aXR5IC1cclxuICAgICAgICAgIChwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgPyBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgOiAwKSk7XHJcblxyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsV2l0aG91dERpc2NvdW50XCIsXHJcbiAgICAgICAgXCJlLWJhc2tldDpiYXNrZXQgc2VydmljZTp1cGRhdGUgYmFza2V0ZGV0YWlscyB0b3RhbCA6XCIgK1xyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldCkgK1xyXG4gICAgICAgIGJhc2tldC50b3RhbCArXHJcbiAgICAgICAgXCIgUHJvZHVjdCBsaW5lIElEIDogXCIgK1xyXG4gICAgICAgIHByb2R1Y3QuaXRlbUxpbmVJZCArXHJcbiAgICAgICAgXCIgcHJvZHVjdCB0b3RhbCA6IFwiICtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYmFza2V0LmJhc2tldFRvdGFsID0gYmFza2V0LnRvdGFsO1xyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50cyhiYXNrZXQ6IGFueSk6IEJhc2tldCB7XHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50c1wiLFxyXG4gICAgICBgdGhpcy5iYXNrZXREZXRhaWxzIG5ldyB2YWx1ZXMgICR7YmFza2V0fSwgXHJcbiAgICAgICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0LmJhc2tldFRvdGFsKX1gXHJcbiAgICApO1xyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLnJlZHVjZShcclxuICAgICAgICAobjogYW55LCB7IHByb21vdGlvbkFtb3VudCB9OiBhbnkpID0+IG4gKyBwcm9tb3Rpb25BbW91bnQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG4gICAgICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQuYmFza2V0VG90YWwgLSBkaXNjb3VudFRvdGFsO1xyXG4gICAgfVxyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LnJlZHVjZShcclxuICAgICAgICAobjogYW55LCB7IGRpc2NvdW50QW1vdW50IH06IGFueSkgPT4gbiArIGRpc2NvdW50QW1vdW50LFxyXG4gICAgICAgIDBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGJhc2tldC5iYXNrZXRUb3RhbCA9IGJhc2tldC5iYXNrZXRUb3RhbCAtIGRpc2NvdW50VG90YWw7XHJcbiAgICB9XHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50c1wiLFxyXG4gICAgICBcImJhc2tldCBuZXcgdmFsdWVzXCIsXHJcbiAgICAgIGJhc2tldFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gYmFza2V0O1xyXG4gIH1cclxuXHJcbiAgdHJhbnNhY3Rpb25EaXNjb3VudEFuZFByb21vdGlvblByb2R1Y3RvcnRpb25DYWxjdWxhdGlvbihiYXNrZXQ6IEJhc2tldCkge1xyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaChcclxuICAgICAgICAoZGlzY291bnQpID0+XHJcbiAgICAgICAgKGJhc2tldCA9IHRoaXMudHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhcclxuICAgICAgICAgIGJhc2tldCxcclxuICAgICAgICAgIGRpc2NvdW50XHJcbiAgICAgICAgKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKChwcm9tb3Rpb24pID0+IHtcclxuICAgICAgICBiYXNrZXQgPSB0aGlzLnRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgcHJvbW90aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRBbmRQcm9tb3Rpb25Qcm9kdWN0b3J0aW9uQ2FsY3VsYXRpb25cIixcclxuICAgICAgYGJhc2tldCBpdGVtIGRpc2NvdW50IHByb3Rpb24gY2FsY3VsYXRpb24gLFxyXG4gICAgICAke2Jhc2tldH0sXHJcbiAgICAgICR7YmFza2V0LnByb2R1Y3RzfWBcclxuICAgICk7XHJcbiAgICByZXR1cm4gYmFza2V0O1xyXG4gIH1cclxuXHJcbiAgdHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGMoXHJcbiAgICBiYXNrZXQ6IGFueSxcclxuICAgIHByb21vdGlvbjogYW55XHJcbiAgKSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xyXG4gICAge1xyXG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocDphbnkpID0+IHtcclxuICAgICAgICBpZiAocHJvbW90aW9uLml0ZW1MaW5lSWRzLmluY2x1ZGVzKHAuaXRlbUxpbmVJZCkpIHtcclxuICAgICAgICAgIHAgPSB0aGlzLnZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwKTtcclxuICAgICAgICAgIGNvbnN0IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsID1cclxuICAgICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcclxuICAgICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXHJcbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy5yZWZ1bmRQb3J0aW9uKTtcclxuICAgICAgICAgIHRvdGFsICs9IChwLnRvdGFsIC0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjXCIsXHJcbiAgICAgICAgYGViYXNrZXQ6IHRybnNhY3Rpb25Qcm9tb3Rpb246ICR7SlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICBwcm9tb3Rpb25cclxuICAgICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxyXG4gICAgICApO1xyXG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgcHJvZHVjdCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xyXG5cclxuICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XHJcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbikgK1xyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXHJcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XHJcblxyXG4gICAgICAgIGlmIChwcm9tb3Rpb24uaXRlbUxpbmVJZHMuaW5jbHVkZXMocHJvZHVjdC5pdGVtTGluZUlkKSkge1xyXG4gICAgICAgICAgcGVyY2VudGFnZSA9ICgocHJvZHVjdC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSkgLyB0b3RhbCkgKiAxMDA7XHJcbiAgICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24gKz1cclxuICAgICAgICAgICAgKHByb21vdGlvbi5wcm9tb3Rpb25BbW91bnQgKiBwZXJjZW50YWdlKSAvIDEwMDtcclxuICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbiA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNrZXQ7XHJcbiAgfVxyXG5cclxuICB0cmFuc2FjdGlvbkRpc2NvdW50UHJvZHVjdFBvcnRpb25DYWxjKFxyXG4gICAgYmFza2V0OiBhbnksXHJcbiAgICBkaXNjb3VudDogYW55XHJcbiAgKSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xyXG5cclxuICAgIGJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHAuaXRlbUxpbmVJZCkpIHtcclxuICAgICAgICBwID0gdGhpcy52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocCk7XHJcbiAgICAgICAgY29uc3QgcHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwgPVxyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcclxuICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbikgLVxyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnJlZnVuZFBvcnRpb24pO1xyXG5cclxuXHJcbiAgICAgICAgdG90YWwgKz0gKHAudG90YWwgLSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRQcm9kdWN0UG9ydGlvbkNhbGNcIixcclxuICAgICAgYGViYXNrZXQ6IHRybnNhY3Rpb25EaXNjb3VudDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICBkaXNjb3VudFxyXG4gICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxyXG4gICAgKTtcclxuXHJcbiAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDphbnkpID0+IHtcclxuICAgICAgcHJvZHVjdCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRQcm9kdWN0UG9ydGlvbkNhbGNcIiwgXCJkaXNjb3VudGFibGUgaW4gYmFza2V0IHNlcnZpY2VcIiwgcHJvZHVjdC5kaXNjb3VudGFibGUpO1xyXG5cclxuICAgICAgY29uc3QgcHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwgPVxyXG4gICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uKSArXHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnJlZnVuZFBvcnRpb24pO1xyXG5cclxuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHByb2R1Y3QuaXRlbUxpbmVJZCkgJiYgcHJvZHVjdC5kaXNjb3VudGFibGUgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHBlcmNlbnRhZ2UgPSAoKHByb2R1Y3QudG90YWwgLSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCkpIC8gdG90YWwpICogMTAwO1xyXG4gICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uICs9XHJcbiAgICAgICAgICAoZGlzY291bnQuZGlzY291bnRBbW91bnQgKiBwZXJjZW50YWdlKSAvIDEwMDtcclxuICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbiA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBiYXNrZXQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3Q6IFByb2R1Y3QpIHtcclxuICAgIGlmICghcHJvZHVjdC5pdGVtRGlzY291bnRzKSB7XHJcbiAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cyA9IHtcclxuICAgICAgICB0cm5EaXNjb3VudHNQb3J0aW9uOiAwLFxyXG4gICAgICAgIHRyblByb21vdGlvbnNQb3J0aW9uOiAwLFxyXG4gICAgICAgIHJlZnVuZFBvcnRpb246IDAsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvZHVjdDtcclxuICB9XHJcblxyXG4gIG1hcmtQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpIHtcclxuICAgIHRoaXMucHJvZHVjdFNvdXJjZS5uZXh0KHByb2R1Y3QpO1xyXG4gIH1cclxuICBzdG9wUGVlclN5bmNQcm9jZXNzKHBlZXJTeW5jOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnBlZXJTb3VyY2UubmV4dChwZWVyU3luYyk7XHJcbiAgfVxyXG5cclxuICBzY2FuU3RhcnQoaXNTY2FubmluZzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zY2FuU291cmNlLm5leHQoaXNTY2FubmluZyk7XHJcbiAgfVxyXG5cclxuICBwcm9tb3Rpb25SZW1haW5pbmdDYWxjdWxhdGlvbihwcm9tb3Rpb246IFRyYW5zYWN0aW9uUHJvbW90aW9uW10pIHtcclxuICAgIHZhciBwcm9tb3Rpb25WYWx1ZSA9IDA7XHJcbiAgICBwcm9tb3Rpb24uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBwcm9tb3Rpb25WYWx1ZSArPSBlbGVtZW50LnByb21vdGlvbkFtb3VudDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb21vdGlvblZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZGlzY291bnRSZW1haW5pbmdDYWxjdWxhdGlvbihkaXNjb3VudDogVHJhbnNhY3Rpb25EaXNjb3VudFtdKSB7XHJcbiAgICB2YXIgZGlzY291bnRWYWx1ZSA9IDA7XHJcbiAgICBkaXNjb3VudC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgIGRpc2NvdW50VmFsdWUgKz0gZWxlbWVudC5kaXNjb3VudEFtb3VudDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpc2NvdW50VmFsdWU7XHJcbiAgfVxyXG5cclxuICBkaXNjb3VudFJlZnVuZGVkQ2FsY3VsYXRpb24oZGlzY291bnQ6IFRyYW5zYWN0aW9uRGlzY291bnRbXSkge1xyXG4gICAgdmFyIGRpc2NvdW50VmFsdWUgPSAwO1xyXG4gICAgZGlzY291bnQuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC5kaXNjb3VudEFtb3VudCA8IDApIHtcclxuICAgICAgICBkaXNjb3VudFZhbHVlICs9IGVsZW1lbnQuZGlzY291bnRBbW91bnQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpc2NvdW50VmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZU5ld0l0ZW1MaW5lSWQocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xyXG4gICAgbGV0IGxhcmdlc3ROdW1iZXI6IGFueSA9IDA7XHJcblxyXG4gICAgaWYgKHByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGl0ZW1MaW5lSWRBcnJheSA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0Lml0ZW1MaW5lSWQ7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbGFyZ2VzdE51bWJlciA9IGl0ZW1MaW5lSWRBcnJheS5yZWR1Y2UoKGEgOmFueSwgYjphbnkpID0+IE1hdGgubWF4KGEsIGIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbGFyZ2VzdE51bWJlciArIDE7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHkoXHJcbiAgICBwcm9kdWN0OiBhbnksXHJcbiAgICBxdWFudGl0eTogbnVtYmVyXHJcbiAgKTogUHJvZHVjdCB7XHJcblxyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHlcIiwgYGViYXNrZXQ6IHVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eSA6ICR7cXVhbnRpdHl9IHByb2R1Y3Q6ICR7SlNPTi5zdHJpbmdpZnkocHJvZHVjdCl9YCk7XHJcbiAgICBwcm9kdWN0LnF1YW50aXR5ID0gcXVhbnRpdHk7XHJcbiAgICBpZiAocHJvZHVjdC5oYXNPd25Qcm9wZXJ0eShcImxpbmVEaXNjb3VudFwiKSkge1xyXG4gICAgICAvLyAmJiB0aGlzLnByb2R1Y3QucXVhbnRpdHkgIT09IHRoaXMucHJvZHVjdERldGFpbEZvcm0uY29udHJvbHMucXVhbnRpdHkudmFsdWVcclxuICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSA9IE51bWJlcihcclxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLmdldEZsb29yZWRGaXhlZChcclxuICAgICAgICAgIHByb2R1Y3QubGluZURpc2NvdW50LnVuaXRQcmljZSAqIHF1YW50aXR5LFxyXG4gICAgICAgICAgMlxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRBbW91bnQgPVxyXG4gICAgICAgIHByb2R1Y3QudG90YWxMaW5lUHJpY2UgLSBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcHJvZHVjdC50b3RhbExpbmVQcmljZSA9XHJcbiAgICAgICAgcXVhbnRpdHkgKiB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsKHByb2R1Y3Quc2VsZWN0ZWRQcmljZSk7XHJcbiAgICB9XHJcbiAgICBpZiAocHJvZHVjdC5saW5lRGlzY291bnQpIHtcclxuICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcclxuICAgIH1cclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQmFza2V0UHJvZHVjdERhdGFBc1BlclF1YW50aXR5XCIsIGBlYmFza2V0OiB1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHkgOiAke3F1YW50aXR5fSBwcm9kdWN0OiAke0pTT04uc3RyaW5naWZ5KHByb2R1Y3QpfWApO1xyXG5cclxuICAgIHJldHVybiBwcm9kdWN0O1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXIoaXNXZWJPcmRlcjogYm9vbGVhbik6IFByb2R1Y3RbXSB7XHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImZpbHRlclByb2R1Y3RMaXN0V2l0aFdlYk9yZGVyXCIsIFwiZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXIgaGl0XCIsIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cyk7XHJcbiAgICBpZiAoaXNXZWJPcmRlcilcclxuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5maWx0ZXIoKHgpID0+IHguaXNXZWJPcmRlcik7XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5maWx0ZXIoKHgpID0+ICF4LmlzV2ViT3JkZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnkoKTogUHJvZHVjdFtdIHtcclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlcIiwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhEZWxpdmVyeSBoaXRcIiwgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzKTtcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmRlbGl2ZXJ5TWV0aG9kID09PSBERUxJVkVSWV9NRVRIT0RTLkRFTElWRVJZLnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cChncm91cDogc3RyaW5nLCBwcm9kdWN0czogUHJvZHVjdFtdKTogUHJvZHVjdFtdIHtcclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cFwiLCBcImZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5R3JvdXAgaGl0XCIsIHByb2R1Y3RzKTtcclxuICAgIHJldHVybiBwcm9kdWN0cy5maWx0ZXIoKHgpID0+IHguZGVsaXZlcnlHcm91cCA9PT0gZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVOZXdEZWxpdmVyeUdyb3VwTnVtYmVyKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcclxuICAgIGxldCBsYXJnZXN0TnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIGlmIChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsYXJnZXN0TnVtYmVyID0gZGVsaXZlcnlHcm91cEFyci5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGxhcmdlc3ROdW1iZXIgKyAxKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJnZXREZWxpdmVyeUdyb3VwTnVtYmVyc1wiLCBcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzIGluaXRpYXRpbmcgOiBcIixwcm9kdWN0cyk7XHJcblxyXG4gICAgbGV0IHVuaXF1ZUFuZHNvcnRlZFJlc3VsdDogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIGlmIChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwcm9kdWN0LmRlbGl2ZXJ5TWV0aG9kID09PSBcIjFcIikge1xyXG4gICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHVuaXF1ZUFuZHNvcnRlZFJlc3VsdCA9IEFycmF5LmZyb20obmV3IFNldChkZWxpdmVyeUdyb3VwQXJyKSkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzXCIsIFwiZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMgOiB1bmlxdWVBbmRzb3J0ZWRSZXN1bHRcIiwgdW5pcXVlQW5kc29ydGVkUmVzdWx0KTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmlxdWVBbmRzb3J0ZWRSZXN1bHQ7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcm9kdWN0c1dpdGhOZXdEZWxpdmVyeUdyb3VwTnVtYmVyKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlUHJvZHVjdHNXaXRoTmV3RGVsaXZlcnlHcm91cE51bWJlclwiLCBcImluaXRpYXRpbmcgOiBcIiwgcHJvZHVjdHMpO1xyXG5cclxuICAgIGxldCBuZXdHcm91cE51bWJlciA9IHRoaXMuZ2VuZXJhdGVOZXdEZWxpdmVyeUdyb3VwTnVtYmVyKHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cyk7XHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZm9yRWFjaChjQlByb2R1Y3RzID0+IHtcclxuICAgICAgICBwcm9kdWN0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgaWYgKGNCUHJvZHVjdHMuaXRlbUxpbmVJZCA9PT0gZWxlbWVudC5pdGVtTGluZUlkKSB7XHJcbiAgICAgICAgICAgIGNCUHJvZHVjdHMuZGVsaXZlcnlHcm91cCA9IG5ld0dyb3VwTnVtYmVyO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlQmFza2V0KHRoaXMuY3VycmVudEJhc2tldCk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lKHByb2R1Y3RzOiBhbnlbXSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IHRpbWU7XHJcbiAgICAgIGxldCBlc3RtYXRlZFRpbWU6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBlc3RpbWF0ZWREYXlzOiBzdHJpbmcgPSBcIkhvdXJzXCI7XHJcbiAgICAgIHByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IHsgbGVhZFRpbWU6IHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogYW55OyB9OyB9KSA9PiB7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ3ZWVrc1wiKSB7XHJcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiA3O1xyXG4gICAgICAgICAgZXN0bWF0ZWRUaW1lID0gTWF0aC5tYXgoZXN0bWF0ZWRUaW1lLCB0aW1lKTtcclxuICAgICAgICAgIGVzdGltYXRlZERheXMgPSAoZXN0bWF0ZWRUaW1lID09PSB0aW1lKSA/IGVsZW1lbnQubGVhZFRpbWUudHlwZSA6IGVzdGltYXRlZERheXNcclxuICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBgd2VlayAke2VzdG1hdGVkVGltZX0gJHtlc3RpbWF0ZWREYXlzfWApO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQubGVhZFRpbWUudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcImRheXNcIikge1xyXG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0O1xyXG4gICAgICAgICAgZXN0bWF0ZWRUaW1lID0gTWF0aC5tYXgoZXN0bWF0ZWRUaW1lLCB0aW1lKTtcclxuICAgICAgICAgIGVzdGltYXRlZERheXMgPSAoZXN0bWF0ZWRUaW1lID09PSB0aW1lKSA/IGVsZW1lbnQubGVhZFRpbWUudHlwZSA6IGVzdGltYXRlZERheXNcclxuXHJcbiAgICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgYGRheXMgJHtlc3RtYXRlZFRpbWV9ICR7ZXN0aW1hdGVkRGF5c31gKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnQubGVhZFRpbWUudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIm1vbnRoc1wiKSB7XHJcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiAzMDtcclxuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XHJcbiAgICAgICAgICBlc3RpbWF0ZWREYXlzID0gKGVzdG1hdGVkVGltZSA9PT0gdGltZSkgPyBlbGVtZW50LmxlYWRUaW1lLnR5cGUgOiBlc3RpbWF0ZWREYXlzXHJcblxyXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGBtb250aHMgJHtlc3RtYXRlZFRpbWV9ICAke2VzdGltYXRlZERheXN9YCk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5ZWFyc1wiKSB7XHJcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiAzNjU7XHJcbiAgICAgICAgICBlc3RtYXRlZFRpbWUgPSBNYXRoLm1heChlc3RtYXRlZFRpbWUsIHRpbWUpO1xyXG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xyXG5cclxuICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBgeWVhcnMgJHtlc3RtYXRlZFRpbWV9ICAke2VzdGltYXRlZERheXN9YCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpO1xyXG4gICAgICAgICAgZXN0bWF0ZWRUaW1lID0gTWF0aC5tYXgoZXN0bWF0ZWRUaW1lLCB0aW1lKTtcclxuICAgICAgICAgIGVzdGltYXRlZERheXMgPSAoZXN0bWF0ZWRUaW1lID09PSB0aW1lKSA/IGVsZW1lbnQubGVhZFRpbWUudHlwZSA6IGVzdGltYXRlZERheXM7XHJcbiAgICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgYGhvdXJzICAke2VzdG1hdGVkVGltZX0gICR7ZXN0aW1hdGVkRGF5c31gKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChlc3RpbWF0ZWREYXlzLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwiZGF5c1wiKSB7XHJcbiAgICAgICAgZXN0bWF0ZWRUaW1lID0gZXN0bWF0ZWRUaW1lIC8gMjQ7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIndlZWtzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiA3KTtcclxuICAgICAgfSBlbHNlIGlmIChlc3RpbWF0ZWREYXlzLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwibW9udGhzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzMCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcInllYXJzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzNjUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZXN0aW1hdGUgPSB7XHJcbiAgICAgICAgdmFsdWU6IGVzdG1hdGVkVGltZS50b1N0cmluZygpLFxyXG4gICAgICAgIHR5cGU6IGVzdGltYXRlZERheXNcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZXN0aW1hdGU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0Vycm9yKHRoaXMuY2xhc3NOYW1lLCBcImNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgXCJlcnJvciBpbiBjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGVycm9yKTtcclxuICAgIH1cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHJvZHVjdHNXaXRoRGVsaXZlcnlHcm91cE51bWJlcihvbGRHcm91cDogc3RyaW5nLCBuZXdHcm91cDogc3RyaW5nKSB7XHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZVByb2R1Y3RzV2l0aERlbGl2ZXJ5R3JvdXBOdW1iZXIgaW5pdGlhdGluZ1wiKTtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZm9yRWFjaChjQlByb2R1Y3RzID0+IHtcclxuICAgICAgaWYgKGNCUHJvZHVjdHMuZGVsaXZlcnlHcm91cCA9PT0gb2xkR3JvdXApIHtcclxuICAgICAgICBjQlByb2R1Y3RzLmRlbGl2ZXJ5R3JvdXAgPSBuZXdHcm91cDtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudXBkYXRlQmFza2V0KHRoaXMuY3VycmVudEJhc2tldCk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBnZXREZWxpdmVyeUluZm8oKTogYW55IHtcclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiZ2V0RGVsaXZlcnlJbmZvXCIsIFwiZ2V0RGVsaXZlcnlHcm91cEluZm9yIGluaXRpYXRpbmdcIik7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgZ3JvdXBJbmZvOiBEZWxpdmVyeUluZm8gPSB7XHJcbiAgICAgICAgZ3JvdXBzOiBbXVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzKHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cykuZm9yRWFjaCgoZ3JvdXBOdW1iZXIpID0+IHtcclxuICAgICAgICBsZXQgZ3JvdXA6IGFueSA9IHtcclxuICAgICAgICAgIGdyb3VwTnVtYmVyOiBncm91cE51bWJlcixcclxuICAgICAgICAgIGl0ZW1zOiBbXSxcclxuICAgICAgICAgIGVzdGltYXRlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiSG91cnNcIixcclxuICAgICAgICAgICAgdmFsdWU6IFwiMFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKGNCUHJvZHVjdHMgPT4ge1xyXG4gICAgICAgICAgaWYgKGNCUHJvZHVjdHMuZGVsaXZlcnlHcm91cCA9PT0gZ3JvdXBOdW1iZXIudG9TdHJpbmcoKSkge1xyXG4gICAgICAgICAgICBncm91cC5pdGVtcy5wdXNoKGNCUHJvZHVjdHMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBncm91cC5lc3RpbWF0ZSA9IHRoaXMuY2FsY3VsYXRlRXN0aW1hdGVkVGltZShncm91cC5pdGVtcyk7XHJcblxyXG4gICAgICAgIGdyb3VwSW5mby5ncm91cHMucHVzaChncm91cCk7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBncm91cEluZm87XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dFcnJvcih0aGlzLmNsYXNzTmFtZSwgXCJnZXREZWxpdmVyeUluZm9cIiwgXCJlcnJvciB3aGlsZSBnZXR0aW5nIGRlbGl2ZXJ5IGluZm9cIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import { DELIVERY_METHODS } from './mapper-library.model';
3
+ import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
4
+ export class BasketService {
5
+ constructor(numberUtilService) {
6
+ this.numberUtilService = numberUtilService;
7
+ this.currentBasket = {
8
+ products: [],
9
+ transactionDiscount: [],
10
+ quantity: 0,
11
+ total: 0,
12
+ saleTotal: 0,
13
+ baseCurrency: ''
14
+ };
15
+ this.basketSource = new BehaviorSubject(null);
16
+ this.basket = this.basketSource.asObservable();
17
+ this.productSource = new BehaviorSubject(null);
18
+ this.product = this.productSource.asObservable();
19
+ this.peerSource = new BehaviorSubject(false);
20
+ this.peerSync = this.peerSource.asObservable();
21
+ this.scanSource = new BehaviorSubject(false);
22
+ this.scanner = this.scanSource.asObservable();
23
+ this.className = "BasketService";
24
+ }
25
+ get isMixedBasketSales() {
26
+ return this._isMixedBasketSales;
27
+ }
28
+ set isMixedBasketSales(v) {
29
+ this._isMixedBasketSales = v;
30
+ }
31
+ updateBasket(basket) {
32
+ this.currentBasket = basket;
33
+ this.isMixedBasketSales = this.filterProductListWithWebOrder(true).length > 0;
34
+ this.basketSource.next(basket);
35
+ }
36
+ /**
37
+ * calculates the total basket value and quantity
38
+ * @param null
39
+ * @returns void
40
+ */
41
+ updateBasketTotal(basketDetails, basketState) {
42
+ basketDetails.quantity = 0;
43
+ basketDetails.total = 0;
44
+ for (const p of basketDetails.products) {
45
+ basketDetails.quantity = basketDetails.quantity + p.quantity;
46
+ basketDetails.total =
47
+ this.numberUtilService.trimTo2Decimal(basketDetails.total) +
48
+ this.numberUtilService.trimTo2Decimal(p.total);
49
+ }
50
+ AppLoggerService.logDebug(this.className, "updateBasketTotal", `basketDetails updated values for transaction id
51
+ ${basketDetails.transactionId}, basketDetails
52
+ ${JSON.stringify(basketDetails)}`);
53
+ basketDetails.basketTotal = basketDetails.total;
54
+ basketState.updateBasket(basketDetails);
55
+ }
56
+ /**
57
+ * add Line promotion
58
+ * @param null
59
+ * @returns basketDetails
60
+ */
61
+ addlinePromotion(promotionList, basketDetails) {
62
+ AppLoggerService.logDebug(this.className, "addlinePromotion", `promotionList ${JSON.stringify(promotionList)} and
63
+ basketDetails
64
+ ${JSON.stringify(basketDetails)} for linePromotions`);
65
+ if (promotionList &&
66
+ promotionList.result &&
67
+ promotionList.result.linePromotions &&
68
+ promotionList.result.linePromotions.length > 0) {
69
+ for (var element of basketDetails.products) {
70
+ for (var promotionelement of promotionList.result.linePromotions) {
71
+ if (element.itemLineId.toString() ===
72
+ promotionelement.itemLineId.toString()) {
73
+ element.linePromotions = promotionelement;
74
+ }
75
+ }
76
+ }
77
+ }
78
+ return basketDetails;
79
+ }
80
+ /**
81
+ * add Transaction promotion
82
+ * @param null
83
+ * @returns basketDetails
84
+ */
85
+ addTransactionPromotion(promotionList, basketdetails) {
86
+ AppLoggerService.logDebug(this.className, "addTransactionPromotion", `promotionList ${JSON.stringify(promotionList)} and
87
+ basketDetails
88
+ ${JSON.stringify(basketdetails)} for transactionPromotions ${JSON.stringify(basketdetails.transactionPromotion)}`);
89
+ if (promotionList &&
90
+ promotionList.result &&
91
+ promotionList.result.transactionPromotion &&
92
+ promotionList.result.transactionPromotion.length > 0) {
93
+ promotionList.result.transactionPromotion.forEach((tPromotion) => {
94
+ let transactionPromotionEntryUpdated = Object.assign({}, tPromotion);
95
+ transactionPromotionEntryUpdated.itemLineIds = basketdetails.products.map((product) => {
96
+ return product.itemLineId;
97
+ });
98
+ if (!basketdetails.transactionPromotion) {
99
+ basketdetails.transactionPromotion = [];
100
+ }
101
+ basketdetails.transactionPromotion.push(transactionPromotionEntryUpdated);
102
+ basketdetails = this.transactionPromotionProductPortionCalc(basketdetails, transactionPromotionEntryUpdated);
103
+ });
104
+ }
105
+ AppLoggerService.logDebug(this.className, "addTransactionPromotion", "basket details in refund calculation file", basketdetails);
106
+ return basketdetails;
107
+ }
108
+ updateProductTotalForSummary(basketDetails) {
109
+ /*sale- product refundedQuantity = undefined
110
+ partial refund - product refundedQuantity is > 0
111
+ total refund - proudct refundedQuantity is > 0
112
+ exchange - exchange product refundedQuantity is > 0
113
+ new product refundedQuantity = undefined
114
+ old product without exchange refundedQuantity = 0
115
+ unreference refund-product refundedQuantity is > 0 */
116
+ basketDetails.total = 0;
117
+ basketDetails.quantity = 0;
118
+ for (var product of basketDetails.products) {
119
+ if (product.linePromotions) {
120
+ product.total = product.linePromotions.promotionLinePrice;
121
+ }
122
+ else if (product.lineDiscount && !product.linePromotions) {
123
+ product.total = product.lineDiscount.discountedLinePrice;
124
+ }
125
+ else {
126
+ product.total = product.totalLinePrice;
127
+ }
128
+ product.total =
129
+ product.total -
130
+ Math.abs(product.refundedTotal ? product.refundedTotal : 0);
131
+ basketDetails.total += product.total;
132
+ basketDetails.quantity =
133
+ basketDetails.quantity +
134
+ (product.quantity -
135
+ (product.refundedQuantity ? product.refundedQuantity : 0));
136
+ AppLoggerService.logDebug(this.className, "updateProductTotalForSummary", "update basketdetails total :" +
137
+ basketDetails.total +
138
+ " Product line ID : " +
139
+ product.itemLineId +
140
+ " product total : " +
141
+ product.total, "quantity : " + basketDetails.quantity);
142
+ }
143
+ return this.updateBasketTotalForSummary(basketDetails);
144
+ }
145
+ updateBasketTotalForSummary(basketDetails) {
146
+ basketDetails.basketTotal = basketDetails.total;
147
+ AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total for transaction transactionDiscount ", basketDetails.transactionDiscount);
148
+ AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total for transaction transactionPromotion ", basketDetails.transactionPromotion);
149
+ basketDetails = this.updateTransactionPromotion(basketDetails);
150
+ basketDetails = this.updateTransactionDiscount(basketDetails);
151
+ basketDetails.basketTotal = Number(basketDetails.basketTotal.toFixed(2));
152
+ AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total: basketTotal after promotion applied for basketTotal", basketDetails.basketTotal);
153
+ return basketDetails;
154
+ }
155
+ updateTransactionDiscount(basketDetails) {
156
+ if (basketDetails.transactionDiscount &&
157
+ basketDetails.transactionDiscount.length > 0) {
158
+ const discountTotal = basketDetails.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
159
+ AppLoggerService.logDebug(this.className, "updateTransactionDiscount", "discountTotal ", discountTotal);
160
+ basketDetails.basketTotal =
161
+ basketDetails.basketTotal - Math.abs(discountTotal);
162
+ }
163
+ return basketDetails;
164
+ }
165
+ updateTransactionPromotion(basketDetails) {
166
+ if (basketDetails.transactionPromotion &&
167
+ basketDetails.transactionPromotion.length > 0) {
168
+ const discountTotal = basketDetails.transactionPromotion.reduce((n, { promotionAmount }) => n + promotionAmount, 0);
169
+ basketDetails.basketTotal =
170
+ basketDetails.basketTotal - Math.abs(discountTotal);
171
+ }
172
+ return basketDetails;
173
+ }
174
+ updateBasketTotalWithoutDiscount(basket) {
175
+ basket.total = 0;
176
+ basket.quantity = 0;
177
+ for (var product of basket.products) {
178
+ if (product.linePromotions) {
179
+ product.total = product.linePromotions.promotionLinePrice;
180
+ }
181
+ else if (product.lineDiscount && !product.linePromotions) {
182
+ product.total = product.lineDiscount.discountedLinePrice || 0;
183
+ }
184
+ else {
185
+ product.total = product.totalLinePrice;
186
+ }
187
+ product.total =
188
+ product.total -
189
+ Math.abs(product.refundedTotal ? product.refundedTotal : 0);
190
+ basket.total += product.total;
191
+ basket.quantity =
192
+ basket.quantity +
193
+ (product.quantity -
194
+ (product.refundedQuantity ? product.refundedQuantity : 0));
195
+ AppLoggerService.logDebug(this.className, "updateBasketTotalWithoutDiscount", "e-basket:basket service:update basketdetails total :" +
196
+ JSON.stringify(basket) +
197
+ basket.total +
198
+ " Product line ID : " +
199
+ product.itemLineId +
200
+ " product total : " +
201
+ product.total);
202
+ }
203
+ basket.basketTotal = basket.total;
204
+ return basket;
205
+ }
206
+ updateBasketTotalWithDiscounts(basket) {
207
+ AppLoggerService.logDebug(this.className, "updateBasketTotalWithDiscounts", `this.basketDetails new values ${basket},
208
+ ${JSON.stringify(basket.basketTotal)}`);
209
+ if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
210
+ const discountTotal = basket.transactionPromotion.reduce((n, { promotionAmount }) => n + promotionAmount, 0);
211
+ basket.basketTotal = basket.basketTotal - discountTotal;
212
+ }
213
+ if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
214
+ const discountTotal = basket.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
215
+ basket.basketTotal = basket.basketTotal - discountTotal;
216
+ }
217
+ AppLoggerService.logDebug(this.className, "updateBasketTotalWithDiscounts", "basket new values", basket);
218
+ return basket;
219
+ }
220
+ transactionDiscountAndPromotionProductortionCalculation(basket) {
221
+ if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
222
+ basket.transactionDiscount.forEach((discount) => (basket = this.transactionDiscountProductPortionCalc(basket, discount)));
223
+ }
224
+ if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
225
+ basket.transactionPromotion.forEach((promotion) => {
226
+ basket = this.transactionPromotionProductPortionCalc(basket, promotion);
227
+ });
228
+ }
229
+ AppLoggerService.logDebug(this.className, "transactionDiscountAndPromotionProductortionCalculation", `basket item discount protion calculation ,
230
+ ${basket},
231
+ ${basket.products}`);
232
+ return basket;
233
+ }
234
+ transactionPromotionProductPortionCalc(basket, promotion) {
235
+ let total = 0;
236
+ let percentage = 0;
237
+ {
238
+ basket.products.forEach((p) => {
239
+ if (promotion.itemLineIds.includes(p.itemLineId)) {
240
+ p = this.validateProductItemDiscount(p);
241
+ const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
242
+ this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
243
+ this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
244
+ total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
245
+ }
246
+ });
247
+ AppLoggerService.logDebug(this.className, "transactionPromotionProductPortionCalc", `ebasket: trnsactionPromotion: ${JSON.stringify(promotion)}, selected products total: ${total}`);
248
+ basket.products.forEach((product) => {
249
+ product = this.validateProductItemDiscount(product);
250
+ const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
251
+ this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
252
+ this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
253
+ if (promotion.itemLineIds.includes(product.itemLineId)) {
254
+ percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
255
+ product.itemDiscounts.trnPromotionsPortion +=
256
+ (promotion.promotionAmount * percentage) / 100;
257
+ product.itemDiscounts.trnPromotionsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion);
258
+ }
259
+ });
260
+ }
261
+ return basket;
262
+ }
263
+ transactionDiscountProductPortionCalc(basket, discount) {
264
+ let total = 0;
265
+ let percentage = 0;
266
+ basket.products.forEach((p) => {
267
+ if (discount.itemLineIds.includes(p.itemLineId)) {
268
+ p = this.validateProductItemDiscount(p);
269
+ const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
270
+ this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
271
+ this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
272
+ total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
273
+ }
274
+ });
275
+ AppLoggerService.logDebug(this.className, "transactionDiscountProductPortionCalc", `ebasket: trnsactionDiscount: ${JSON.stringify(discount)}, selected products total: ${total}`);
276
+ basket.products.forEach((product) => {
277
+ product = this.validateProductItemDiscount(product);
278
+ AppLoggerService.logDebug(this.className, "transactionDiscountProductPortionCalc", "discountable in basket service", product.discountable);
279
+ const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
280
+ this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
281
+ this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
282
+ if (discount.itemLineIds.includes(product.itemLineId) && product.discountable == true) {
283
+ percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
284
+ product.itemDiscounts.trnDiscountsPortion +=
285
+ (discount.discountAmount * percentage) / 100;
286
+ product.itemDiscounts.trnDiscountsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion);
287
+ }
288
+ });
289
+ return basket;
290
+ }
291
+ validateProductItemDiscount(product) {
292
+ if (!product.itemDiscounts) {
293
+ product.itemDiscounts = {
294
+ trnDiscountsPortion: 0,
295
+ trnPromotionsPortion: 0,
296
+ refundPortion: 0,
297
+ };
298
+ }
299
+ return product;
300
+ }
301
+ markProduct(product) {
302
+ this.productSource.next(product);
303
+ }
304
+ stopPeerSyncProcess(peerSync) {
305
+ this.peerSource.next(peerSync);
306
+ }
307
+ scanStart(isScanning) {
308
+ this.scanSource.next(isScanning);
309
+ }
310
+ promotionRemainingCalculation(promotion) {
311
+ var promotionValue = 0;
312
+ promotion.forEach((element) => {
313
+ promotionValue += element.promotionAmount;
314
+ });
315
+ return promotionValue;
316
+ }
317
+ discountRemainingCalculation(discount) {
318
+ var discountValue = 0;
319
+ discount.forEach((element) => {
320
+ discountValue += element.discountAmount;
321
+ });
322
+ return discountValue;
323
+ }
324
+ discountRefundedCalculation(discount) {
325
+ var discountValue = 0;
326
+ discount.forEach((element) => {
327
+ if (element.discountAmount < 0) {
328
+ discountValue += element.discountAmount;
329
+ }
330
+ });
331
+ return discountValue;
332
+ }
333
+ generateNewItemLineId(products) {
334
+ let largestNumber = 0;
335
+ if (products.length > 0) {
336
+ let itemLineIdArray = products.map((product) => {
337
+ return product.itemLineId;
338
+ });
339
+ largestNumber = itemLineIdArray.reduce((a, b) => Math.max(a, b));
340
+ }
341
+ return largestNumber + 1;
342
+ }
343
+ updateBasketProductDataAsPerQuantity(product, quantity) {
344
+ AppLoggerService.logDebug(this.className, "updateBasketProductDataAsPerQuantity", `ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);
345
+ product.quantity = quantity;
346
+ if (product.hasOwnProperty("lineDiscount")) {
347
+ // && this.product.quantity !== this.productDetailForm.controls.quantity.value
348
+ product.lineDiscount.discountedLinePrice = Number(this.numberUtilService.getFlooredFixed(product.lineDiscount.unitPrice * quantity, 2));
349
+ product.lineDiscount.discountAmount =
350
+ product.totalLinePrice - product.lineDiscount.discountedLinePrice;
351
+ }
352
+ else {
353
+ product.totalLinePrice =
354
+ quantity * this.numberUtilService.trimTo2Decimal(product.selectedPrice);
355
+ }
356
+ if (product.lineDiscount) {
357
+ product.total = product.lineDiscount.discountedLinePrice;
358
+ }
359
+ else {
360
+ product.total = product.totalLinePrice;
361
+ }
362
+ AppLoggerService.logDebug(this.className, "updateBasketProductDataAsPerQuantity", `ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);
363
+ return product;
364
+ }
365
+ filterProductListWithWebOrder(isWebOrder) {
366
+ AppLoggerService.logDebug(this.className, "filterProductListWithWebOrder", "filterProductListWithWebOrder hit", this.currentBasket.products);
367
+ if (isWebOrder)
368
+ return this.currentBasket.products.filter((x) => x.isWebOrder);
369
+ else {
370
+ return this.currentBasket.products.filter((x) => !x.isWebOrder);
371
+ }
372
+ }
373
+ filterProductListWithDelivery() {
374
+ AppLoggerService.logDebug(this.className, "filterProductListWithDelivery", "filterProductListWithDelivery hit", this.currentBasket.products);
375
+ return this.currentBasket.products.filter((x) => x.deliveryMethod === DELIVERY_METHODS.DELIVERY.toString());
376
+ }
377
+ filterProductListWithDeliveryGroup(group, products) {
378
+ AppLoggerService.logDebug(this.className, "filterProductListWithDeliveryGroup", "filterProductListWithDeliveryGroup hit", products);
379
+ return products.filter((x) => x.deliveryGroup === group);
380
+ }
381
+ generateNewDeliveryGroupNumber(products) {
382
+ let largestNumber = 0;
383
+ if (products.length > 0) {
384
+ let deliveryGroupArr = products.map((product) => {
385
+ if (product.deliveryGroup) {
386
+ return parseInt(product.deliveryGroup);
387
+ }
388
+ return 0;
389
+ });
390
+ largestNumber = deliveryGroupArr.reduce((a, b) => Math.max(a, b));
391
+ }
392
+ return (largestNumber + 1).toString();
393
+ }
394
+ getDeliveryGroupNumbers(products) {
395
+ AppLoggerService.logDebug(this.className, "getDeliveryGroupNumbers", "getDeliveryGroupNumbers initiating : ", products);
396
+ let uniqueAndsortedResult = [];
397
+ if (products.length > 0) {
398
+ let deliveryGroupArr = products.map((product) => {
399
+ if (product.deliveryGroup) {
400
+ return parseInt(product.deliveryGroup);
401
+ }
402
+ else if (product.deliveryMethod === "1") {
403
+ return 1;
404
+ }
405
+ return 0;
406
+ });
407
+ uniqueAndsortedResult = Array.from(new Set(deliveryGroupArr)).sort((a, b) => a - b);
408
+ AppLoggerService.logDebug(this.className, "getDeliveryGroupNumbers", "getDeliveryGroupNumbers : uniqueAndsortedResult", uniqueAndsortedResult);
409
+ }
410
+ return uniqueAndsortedResult;
411
+ }
412
+ updateProductsWithNewDeliveryGroupNumber(products) {
413
+ AppLoggerService.logDebug(this.className, "updateProductsWithNewDeliveryGroupNumber", "initiating : ", products);
414
+ let newGroupNumber = this.generateNewDeliveryGroupNumber(this.currentBasket.products);
415
+ if (products.length > 0) {
416
+ this.currentBasket.products.forEach(cBProducts => {
417
+ products.forEach(element => {
418
+ if (cBProducts.itemLineId === element.itemLineId) {
419
+ cBProducts.deliveryGroup = newGroupNumber;
420
+ }
421
+ });
422
+ });
423
+ }
424
+ this.updateBasket(this.currentBasket);
425
+ return;
426
+ }
427
+ calculateEstimatedTime(products) {
428
+ try {
429
+ let time;
430
+ let estmatedTime = 0;
431
+ let estimatedDays = "Hours";
432
+ products.forEach((element) => {
433
+ if (element.leadTime.type.toLocaleLowerCase() === "weeks") {
434
+ time = Number(element.leadTime.value) * 24 * 7;
435
+ estmatedTime = Math.max(estmatedTime, time);
436
+ estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
437
+ AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `week ${estmatedTime} ${estimatedDays}`);
438
+ }
439
+ else if (element.leadTime.type.toLocaleLowerCase() === "days") {
440
+ time = Number(element.leadTime.value) * 24;
441
+ estmatedTime = Math.max(estmatedTime, time);
442
+ estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
443
+ AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `days ${estmatedTime} ${estimatedDays}`);
444
+ }
445
+ else if (element.leadTime.type.toLocaleLowerCase() === "months") {
446
+ time = Number(element.leadTime.value) * 24 * 30;
447
+ estmatedTime = Math.max(estmatedTime, time);
448
+ estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
449
+ AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `months ${estmatedTime} ${estimatedDays}`);
450
+ }
451
+ else if (element.leadTime.type.toLocaleLowerCase() === "years") {
452
+ time = Number(element.leadTime.value) * 24 * 365;
453
+ estmatedTime = Math.max(estmatedTime, time);
454
+ estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
455
+ AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `years ${estmatedTime} ${estimatedDays}`);
456
+ }
457
+ else {
458
+ time = Number(element.leadTime.value);
459
+ estmatedTime = Math.max(estmatedTime, time);
460
+ estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
461
+ AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `hours ${estmatedTime} ${estimatedDays}`);
462
+ }
463
+ });
464
+ if (estimatedDays.toLocaleLowerCase() === "days") {
465
+ estmatedTime = estmatedTime / 24;
466
+ }
467
+ else if (estimatedDays.toLocaleLowerCase() === "weeks") {
468
+ estmatedTime = estmatedTime / (24 * 7);
469
+ }
470
+ else if (estimatedDays.toLocaleLowerCase() === "months") {
471
+ estmatedTime = estmatedTime / (24 * 30);
472
+ }
473
+ else if (estimatedDays.toLocaleLowerCase() === "years") {
474
+ estmatedTime = estmatedTime / (24 * 365);
475
+ }
476
+ let estimate = {
477
+ value: estmatedTime.toString(),
478
+ type: estimatedDays
479
+ };
480
+ return estimate;
481
+ }
482
+ catch (error) {
483
+ AppLoggerService.logError(this.className, "calculateEstimatedTime", "error in calculateEstimatedTime", error);
484
+ }
485
+ return 0;
486
+ }
487
+ updateProductsWithDeliveryGroupNumber(oldGroup, newGroup) {
488
+ AppLoggerService.logDebug(this.className, "updateProductsWithDeliveryGroupNumber initiating");
489
+ this.currentBasket.products.forEach(cBProducts => {
490
+ if (cBProducts.deliveryGroup === oldGroup) {
491
+ cBProducts.deliveryGroup = newGroup;
492
+ }
493
+ });
494
+ this.updateBasket(this.currentBasket);
495
+ return;
496
+ }
497
+ getDeliveryInfo() {
498
+ AppLoggerService.logDebug(this.className, "getDeliveryInfo", "getDeliveryGroupInfor initiating");
499
+ try {
500
+ let groupInfo = {
501
+ groups: []
502
+ };
503
+ this.getDeliveryGroupNumbers(this.currentBasket.products).forEach((groupNumber) => {
504
+ let group = {
505
+ groupNumber: groupNumber,
506
+ items: [],
507
+ estimate: {
508
+ type: "Hours",
509
+ value: "0"
510
+ }
511
+ };
512
+ this.currentBasket.products.forEach(cBProducts => {
513
+ if (cBProducts.deliveryGroup === groupNumber.toString()) {
514
+ group.items.push(cBProducts);
515
+ }
516
+ });
517
+ group.estimate = this.calculateEstimatedTime(group.items);
518
+ groupInfo.groups.push(group);
519
+ });
520
+ return groupInfo;
521
+ }
522
+ catch (error) {
523
+ AppLoggerService.logError(this.className, "getDeliveryInfo", "error while getting delivery info", error);
524
+ }
525
+ }
526
+ }
527
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBwZXItbGlicmFyeS9zcmMvbGliL2Jhc2tldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFFdEYsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBOUJ4RCxrQkFBYSxHQUFXO1lBQ3RCLFFBQVEsRUFBRSxFQUFFO1lBQ1osbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFLENBQUM7WUFDWixZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFDO1FBRU0saUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztRQUN0RCxXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3ZELFlBQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBDLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDekQsWUFBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7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ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBERUxJVkVSWV9NRVRIT0RTIH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XG5pbXBvcnQgeyBCYXNrZXQsIERlbGl2ZXJ5R3JvdXBJbmZvLCBEZWxpdmVyeUluZm8sIFByb2R1Y3QsIFRyYW5zYWN0aW9uUHJvbW90aW9uIH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkRpc2NvdW50IH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XG5pbXBvcnQgeyBOdW1iZXJVdGlsU2VydmljZSB9IGZyb20gJy4vbnVtYmVyLXV0aWwuc2VydmljZSc7XG5pbXBvcnQge0FwcExvZ2dlclNlcnZpY2V9IGZyb20gJ0BwbWNyZXRhaWwvY29tbW9uLXNlcnZpY2VzL2NvbW1vbi9hcHAtbG9nZ2VyLnNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgQmFza2V0U2VydmljZSB7XG4gIGN1cnJlbnRCYXNrZXQ6IEJhc2tldCA9IHtcbiAgICBwcm9kdWN0czogW10sXG4gICAgdHJhbnNhY3Rpb25EaXNjb3VudDogW10sXG4gICAgcXVhbnRpdHk6IDAsXG4gICAgdG90YWw6IDAsXG4gICAgc2FsZVRvdGFsOiAwLFxuICAgIGJhc2VDdXJyZW5jeTogJydcbiAgfTtcblxuICBwcml2YXRlIGJhc2tldFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgYmFza2V0ID0gdGhpcy5iYXNrZXRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBwcm9kdWN0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuICBwcm9kdWN0ID0gdGhpcy5wcm9kdWN0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgcGVlclNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwZWVyU3luYyA9IHRoaXMucGVlclNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHNjYW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgc2Nhbm5lciA9IHRoaXMuc2NhblNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIF9pc01peGVkQmFza2V0U2FsZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBnZXQgaXNNaXhlZEJhc2tldFNhbGVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTWl4ZWRCYXNrZXRTYWxlcztcbiAgfVxuICBwdWJsaWMgc2V0IGlzTWl4ZWRCYXNrZXRTYWxlcyh2OiBhbnkpIHtcbiAgICB0aGlzLl9pc01peGVkQmFza2V0U2FsZXMgPSB2O1xuICB9XG4gIGNsYXNzTmFtZSA9IFwiQmFza2V0U2VydmljZVwiO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbnVtYmVyVXRpbFNlcnZpY2U6IE51bWJlclV0aWxTZXJ2aWNlKSB7IH1cblxuICB1cGRhdGVCYXNrZXQoYmFza2V0OiBCYXNrZXQpIHtcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXQgPSBiYXNrZXQ7XG4gICAgdGhpcy5pc01peGVkQmFza2V0U2FsZXMgPSB0aGlzLmZpbHRlclByb2R1Y3RMaXN0V2l0aFdlYk9yZGVyKHRydWUpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5iYXNrZXRTb3VyY2UubmV4dChiYXNrZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGJhc2tldCB2YWx1ZSBhbmQgcXVhbnRpdHlcbiAgICogQHBhcmFtICBudWxsXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIHVwZGF0ZUJhc2tldFRvdGFsKGJhc2tldERldGFpbHM6IHsgcXVhbnRpdHk6IG51bWJlcjsgdG90YWw6IG51bWJlcjsgcHJvZHVjdHM6IGFueTsgdHJhbnNhY3Rpb25JZDogYW55OyBiYXNrZXRUb3RhbDogYW55OyB9LCBiYXNrZXRTdGF0ZTogeyB1cGRhdGVCYXNrZXQ6IChhcmcwOiBhbnkpID0+IHZvaWQ7IH0pIHtcbiAgICBiYXNrZXREZXRhaWxzLnF1YW50aXR5ID0gMDtcbiAgICBiYXNrZXREZXRhaWxzLnRvdGFsID0gMDtcbiAgICBmb3IgKGNvbnN0IHAgb2YgYmFza2V0RGV0YWlscy5wcm9kdWN0cykge1xuICAgICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IGJhc2tldERldGFpbHMucXVhbnRpdHkgKyBwLnF1YW50aXR5O1xuICAgICAgYmFza2V0RGV0YWlscy50b3RhbCA9XG4gICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwoYmFza2V0RGV0YWlscy50b3RhbCkgK1xuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsKHAudG90YWwpO1xuICAgIH1cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsXCIsXG4gICAgICBgYmFza2V0RGV0YWlscyB1cGRhdGVkIHZhbHVlcyBmb3IgdHJhbnNhY3Rpb24gaWRcbiAgICAgICR7YmFza2V0RGV0YWlscy50cmFuc2FjdGlvbklkfSwgIGJhc2tldERldGFpbHNcbiAgICAgICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscyl9YFxuICAgICk7XG4gICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCA9IGJhc2tldERldGFpbHMudG90YWw7XG4gICAgYmFza2V0U3RhdGUudXBkYXRlQmFza2V0KGJhc2tldERldGFpbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBMaW5lIHByb21vdGlvblxuICAgKiBAcGFyYW0gIG51bGxcbiAgICogQHJldHVybnMgYmFza2V0RGV0YWlsc1xuICAgKi9cbiAgYWRkbGluZVByb21vdGlvbihwcm9tb3Rpb25MaXN0OiB7IHJlc3VsdDogeyBsaW5lUHJvbW90aW9uczogc3RyaW5nIHwgYW55W107IH07IH0sIGJhc2tldERldGFpbHM6IHsgcHJvZHVjdHM6IGFueTsgfSkge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkbGluZVByb21vdGlvblwiLFxuICAgICAgYHByb21vdGlvbkxpc3QgJHtKU09OLnN0cmluZ2lmeShwcm9tb3Rpb25MaXN0KX0gYW5kIFxuICAgICAgIGJhc2tldERldGFpbHNcbiAgICAgICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscyl9IGZvciBsaW5lUHJvbW90aW9uc2BcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHByb21vdGlvbkxpc3QgJiZcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0ICYmXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC5saW5lUHJvbW90aW9ucyAmJlxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgZm9yICh2YXIgZWxlbWVudCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XG4gICAgICAgIGZvciAodmFyIHByb21vdGlvbmVsZW1lbnQgb2YgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbGVtZW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSA9PT1cbiAgICAgICAgICAgIHByb21vdGlvbmVsZW1lbnQuaXRlbUxpbmVJZC50b1N0cmluZygpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlbGVtZW50LmxpbmVQcm9tb3Rpb25zID0gcHJvbW90aW9uZWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XG4gIH1cblxuICAvKipcbiAgICogYWRkIFRyYW5zYWN0aW9uIHByb21vdGlvblxuICAgKiBAcGFyYW0gIG51bGxcbiAgICogQHJldHVybnMgYmFza2V0RGV0YWlsc1xuICAgKi9cblxuICBhZGRUcmFuc2FjdGlvblByb21vdGlvbihwcm9tb3Rpb25MaXN0OiB7IHJlc3VsdDogeyB0cmFuc2FjdGlvblByb21vdGlvbjogYW55IH07IH0sIGJhc2tldGRldGFpbHM6IEJhc2tldCkge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcbiAgICAgIGBwcm9tb3Rpb25MaXN0ICR7SlNPTi5zdHJpbmdpZnkocHJvbW90aW9uTGlzdCl9IGFuZCBcbiAgICAgICBiYXNrZXREZXRhaWxzXG4gICAgICAke0pTT04uc3RyaW5naWZ5KGJhc2tldGRldGFpbHMpfSBmb3IgdHJhbnNhY3Rpb25Qcm9tb3Rpb25zICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0ZGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbil9YFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgcHJvbW90aW9uTGlzdCAmJlxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQgJiZcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKCh0UHJvbW90aW9uOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uUHJvbW90aW9uRW50cnlVcGRhdGVkOiBhbnkgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIHRQcm9tb3Rpb25cbiAgICAgICAgKTtcblxuICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbkVudHJ5VXBkYXRlZC5pdGVtTGluZUlkcyA9IGJhc2tldGRldGFpbHMucHJvZHVjdHMubWFwKFxuICAgICAgICAgIChwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvZHVjdC5pdGVtTGluZUlkO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pIHtcbiAgICAgICAgICBiYXNrZXRkZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uID0gW107XG4gICAgICAgIH1cbiAgICAgICAgYmFza2V0ZGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5wdXNoKFxuICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uRW50cnlVcGRhdGVkXG4gICAgICAgICk7XG5cbiAgICAgICAgYmFza2V0ZGV0YWlscyA9IHRoaXMudHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGMoXG4gICAgICAgICAgYmFza2V0ZGV0YWlscyxcbiAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbkVudHJ5VXBkYXRlZFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcbiAgICAgIFwiYmFza2V0IGRldGFpbHMgaW4gcmVmdW5kIGNhbGN1bGF0aW9uIGZpbGVcIixcbiAgICAgIGJhc2tldGRldGFpbHNcbiAgICApO1xuICAgIHJldHVybiBiYXNrZXRkZXRhaWxzO1xuICB9XG5cbiAgdXBkYXRlUHJvZHVjdFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzOiB7IHRvdGFsOiBzdHJpbmcgfCBudW1iZXI7IHF1YW50aXR5OiBzdHJpbmcgfCBudW1iZXI7IHByb2R1Y3RzOiBhbnk7IH0pIHtcbiAgICAvKnNhbGUtICAgICAgICAgICAgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5ID0gdW5kZWZpbmVkXG4gICAgcGFydGlhbCByZWZ1bmQgLSAgIHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSBpcyA+IDBcbiAgICB0b3RhbCByZWZ1bmQgLSAgICAgcHJvdWRjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMFxuICAgIGV4Y2hhbmdlIC0gICAgICAgICBleGNoYW5nZSBwcm9kdWN0IHJlZnVuZGVkUXVhbnRpdHkgaXMgPiAwICBcbiAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSA9IHVuZGVmaW5lZCAgXG4gICAgICAgICAgICAgICAgICAgICAgIG9sZCBwcm9kdWN0IHdpdGhvdXQgZXhjaGFuZ2UgcmVmdW5kZWRRdWFudGl0eSA9IDBcbiAgICB1bnJlZmVyZW5jZSByZWZ1bmQtcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMCAqL1xuXG4gICAgYmFza2V0RGV0YWlscy50b3RhbCA9IDA7XG4gICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IDA7XG4gICAgZm9yICh2YXIgcHJvZHVjdCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XG4gICAgICBpZiAocHJvZHVjdC5saW5lUHJvbW90aW9ucykge1xuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lUHJvbW90aW9ucy5wcm9tb3Rpb25MaW5lUHJpY2U7XG4gICAgICB9IGVsc2UgaWYgKHByb2R1Y3QubGluZURpc2NvdW50ICYmICFwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XG4gICAgICB9XG4gICAgICBwcm9kdWN0LnRvdGFsID1cbiAgICAgICAgcHJvZHVjdC50b3RhbCAtXG4gICAgICAgIE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCA/IHByb2R1Y3QucmVmdW5kZWRUb3RhbCA6IDApO1xuXG4gICAgICBiYXNrZXREZXRhaWxzLnRvdGFsICs9IHByb2R1Y3QudG90YWw7XG4gICAgICBiYXNrZXREZXRhaWxzLnF1YW50aXR5ID1cbiAgICAgICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSArXG4gICAgICAgIChwcm9kdWN0LnF1YW50aXR5IC1cbiAgICAgICAgICAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID8gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5IDogMCkpO1xuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVQcm9kdWN0VG90YWxGb3JTdW1tYXJ5XCIsXG4gICAgICAgIFwidXBkYXRlIGJhc2tldGRldGFpbHMgdG90YWwgOlwiICtcbiAgICAgICAgYmFza2V0RGV0YWlscy50b3RhbCArXG4gICAgICAgIFwiIFByb2R1Y3QgbGluZSBJRCA6IFwiICtcbiAgICAgICAgcHJvZHVjdC5pdGVtTGluZUlkICtcbiAgICAgICAgXCIgcHJvZHVjdCB0b3RhbCA6IFwiICtcbiAgICAgICAgcHJvZHVjdC50b3RhbCxcbiAgICAgICAgXCJxdWFudGl0eSAgOiBcIiArIGJhc2tldERldGFpbHMucXVhbnRpdHlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzKTtcbiAgfVxuXG4gIHVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzOiBhbnkpIHtcbiAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsID0gYmFza2V0RGV0YWlscy50b3RhbDtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0luZm8odGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQmFza2V0VG90YWxGb3JTdW1tYXJ5XCIsXG4gICAgICBcInVwZGF0ZSBCYXNrZXQgVG90YWwgZm9yIHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uRGlzY291bnQgIFwiLFxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50XG4gICAgKTtcblxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nSW5mbyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRUb3RhbEZvclN1bW1hcnlcIixcbiAgICAgIFwidXBkYXRlIEJhc2tldCBUb3RhbCBmb3IgdHJhbnNhY3Rpb24gdHJhbnNhY3Rpb25Qcm9tb3Rpb24gIFwiLFxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvblxuICAgICk7XG5cbiAgICBiYXNrZXREZXRhaWxzID0gdGhpcy51cGRhdGVUcmFuc2FjdGlvblByb21vdGlvbihiYXNrZXREZXRhaWxzKTtcbiAgICBiYXNrZXREZXRhaWxzID0gdGhpcy51cGRhdGVUcmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHMpO1xuICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPSBOdW1iZXIoYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbC50b0ZpeGVkKDIpKTtcblxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nSW5mbyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRUb3RhbEZvclN1bW1hcnlcIixcbiAgICAgIFwidXBkYXRlIEJhc2tldCBUb3RhbDogYmFza2V0VG90YWwgYWZ0ZXIgcHJvbW90aW9uIGFwcGxpZWQgIGZvciBiYXNrZXRUb3RhbFwiLFxuICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbFxuICAgICk7XG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XG4gIH1cblxuICB1cGRhdGVUcmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHM6IHsgdHJhbnNhY3Rpb25EaXNjb3VudDogYW55W107IGJhc2tldFRvdGFsOiBudW1iZXI7IH0pIHtcbiAgICBpZiAoXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQgJiZcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50LnJlZHVjZShcbiAgICAgICAgKG46IGFueSwgeyBkaXNjb3VudEFtb3VudCB9OiBhbnkpID0+IG4gKyBkaXNjb3VudEFtb3VudCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlVHJhbnNhY3Rpb25EaXNjb3VudFwiLCAgXCJkaXNjb3VudFRvdGFsIFwiLCBkaXNjb3VudFRvdGFsKTtcbiAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPVxuICAgICAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsIC0gTWF0aC5hYnMoZGlzY291bnRUb3RhbCk7XG4gICAgfVxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xuICB9XG5cbiAgdXBkYXRlVHJhbnNhY3Rpb25Qcm9tb3Rpb24oYmFza2V0RGV0YWlsczogeyB0cmFuc2FjdGlvblByb21vdGlvbjogYW55W107IGJhc2tldFRvdGFsOiBudW1iZXI7IH0pIHtcbiAgICBpZiAoXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IGRpc2NvdW50VG90YWwgPSBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLnJlZHVjZShcbiAgICAgICAgKG46IGFueSwgeyBwcm9tb3Rpb25BbW91bnQgfTogYW55KSA9PiBuICsgcHJvbW90aW9uQW1vdW50LFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCA9XG4gICAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgLSBNYXRoLmFicyhkaXNjb3VudFRvdGFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XG4gIH1cblxuICB1cGRhdGVCYXNrZXRUb3RhbFdpdGhvdXREaXNjb3VudChiYXNrZXQ6IEJhc2tldCk6IEJhc2tldCB7XG4gICAgYmFza2V0LnRvdGFsID0gMDtcbiAgICBiYXNrZXQucXVhbnRpdHkgPSAwO1xuXG4gICAgZm9yICh2YXIgcHJvZHVjdCBvZiBiYXNrZXQucHJvZHVjdHMpIHtcbiAgICAgIGlmIChwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVQcm9tb3Rpb25zLnByb21vdGlvbkxpbmVQcmljZTtcbiAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5saW5lRGlzY291bnQgJiYgIXByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xuICAgICAgfVxuXG4gICAgICBwcm9kdWN0LnRvdGFsID1cbiAgICAgICAgcHJvZHVjdC50b3RhbCAtXG4gICAgICAgIE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCA/IHByb2R1Y3QucmVmdW5kZWRUb3RhbCA6IDApO1xuICAgICAgYmFza2V0LnRvdGFsICs9IHByb2R1Y3QudG90YWw7XG4gICAgICBiYXNrZXQucXVhbnRpdHkgPVxuICAgICAgICBiYXNrZXQucXVhbnRpdHkgK1xuICAgICAgICAocHJvZHVjdC5xdWFudGl0eSAtXG4gICAgICAgICAgKHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA/IHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA6IDApKTtcblxuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRUb3RhbFdpdGhvdXREaXNjb3VudFwiLFxuICAgICAgICBcImUtYmFza2V0OmJhc2tldCBzZXJ2aWNlOnVwZGF0ZSBiYXNrZXRkZXRhaWxzIHRvdGFsIDpcIiArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldCkgK1xuICAgICAgICBiYXNrZXQudG90YWwgK1xuICAgICAgICBcIiBQcm9kdWN0IGxpbmUgSUQgOiBcIiArXG4gICAgICAgIHByb2R1Y3QuaXRlbUxpbmVJZCArXG4gICAgICAgIFwiIHByb2R1Y3QgdG90YWwgOiBcIiArXG4gICAgICAgIHByb2R1Y3QudG90YWxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYmFza2V0LmJhc2tldFRvdGFsID0gYmFza2V0LnRvdGFsO1xuICAgIHJldHVybiBiYXNrZXQ7XG4gIH1cblxuICB1cGRhdGVCYXNrZXRUb3RhbFdpdGhEaXNjb3VudHMoYmFza2V0OiBhbnkpOiBCYXNrZXQge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQmFza2V0VG90YWxXaXRoRGlzY291bnRzXCIsXG4gICAgICBgdGhpcy5iYXNrZXREZXRhaWxzIG5ldyB2YWx1ZXMgICR7YmFza2V0fSwgXG4gICAgICAke0pTT04uc3RyaW5naWZ5KGJhc2tldC5iYXNrZXRUb3RhbCl9YFxuICAgICk7XG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5yZWR1Y2UoXG4gICAgICAgIChuOiBhbnksIHsgcHJvbW90aW9uQW1vdW50IH06IGFueSkgPT4gbiArIHByb21vdGlvbkFtb3VudCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGJhc2tldC5iYXNrZXRUb3RhbCA9IGJhc2tldC5iYXNrZXRUb3RhbCAtIGRpc2NvdW50VG90YWw7XG4gICAgfVxuICAgIGlmIChiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCAmJiBiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQucmVkdWNlKFxuICAgICAgICAobjogYW55LCB7IGRpc2NvdW50QW1vdW50IH06IGFueSkgPT4gbiArIGRpc2NvdW50QW1vdW50LFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQuYmFza2V0VG90YWwgLSBkaXNjb3VudFRvdGFsO1xuICAgIH1cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50c1wiLFxuICAgICAgXCJiYXNrZXQgbmV3IHZhbHVlc1wiLFxuICAgICAgYmFza2V0XG4gICAgKTtcblxuICAgIHJldHVybiBiYXNrZXQ7XG4gIH1cblxuICB0cmFuc2FjdGlvbkRpc2NvdW50QW5kUHJvbW90aW9uUHJvZHVjdG9ydGlvbkNhbGN1bGF0aW9uKGJhc2tldDogQmFza2V0KSB7XG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goXG4gICAgICAgIChkaXNjb3VudCkgPT5cbiAgICAgICAgKGJhc2tldCA9IHRoaXMudHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhcbiAgICAgICAgICBiYXNrZXQsXG4gICAgICAgICAgZGlzY291bnRcbiAgICAgICAgKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKHByb21vdGlvbikgPT4ge1xuICAgICAgICBiYXNrZXQgPSB0aGlzLnRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgcHJvbW90aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRBbmRQcm9tb3Rpb25Qcm9kdWN0b3J0aW9uQ2FsY3VsYXRpb25cIixcbiAgICAgIGBiYXNrZXQgaXRlbSBkaXNjb3VudCBwcm90aW9uIGNhbGN1bGF0aW9uICxcbiAgICAgICR7YmFza2V0fSxcbiAgICAgICR7YmFza2V0LnByb2R1Y3RzfWBcbiAgICApO1xuICAgIHJldHVybiBiYXNrZXQ7XG4gIH1cblxuICB0cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsYyhcbiAgICBiYXNrZXQ6IGFueSxcbiAgICBwcm9tb3Rpb246IGFueVxuICApIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGxldCBwZXJjZW50YWdlID0gMDtcbiAgICB7XG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocDphbnkpID0+IHtcbiAgICAgICAgaWYgKHByb21vdGlvbi5pdGVtTGluZUlkcy5pbmNsdWRlcyhwLml0ZW1MaW5lSWQpKSB7XG4gICAgICAgICAgcCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHApO1xuICAgICAgICAgIGNvbnN0IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsID1cbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uKSArXG4gICAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy5yZWZ1bmRQb3J0aW9uKTtcbiAgICAgICAgICB0b3RhbCArPSAocC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ0cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsY1wiLFxuICAgICAgICBgZWJhc2tldDogdHJuc2FjdGlvblByb21vdGlvbjogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwcm9tb3Rpb25cbiAgICAgICAgKX0sIHNlbGVjdGVkIHByb2R1Y3RzIHRvdGFsOiAke3RvdGFsfWBcbiAgICAgICk7XG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XG4gICAgICAgIHByb2R1Y3QgPSB0aGlzLnZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0KTtcblxuICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XG5cbiAgICAgICAgaWYgKHByb21vdGlvbi5pdGVtTGluZUlkcy5pbmNsdWRlcyhwcm9kdWN0Lml0ZW1MaW5lSWQpKSB7XG4gICAgICAgICAgcGVyY2VudGFnZSA9ICgocHJvZHVjdC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSkgLyB0b3RhbCkgKiAxMDA7XG4gICAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uICs9XG4gICAgICAgICAgICAocHJvbW90aW9uLnByb21vdGlvbkFtb3VudCAqIHBlcmNlbnRhZ2UpIC8gMTAwO1xuICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbiA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYmFza2V0O1xuICB9XG5cbiAgdHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhcbiAgICBiYXNrZXQ6IGFueSxcbiAgICBkaXNjb3VudDogYW55XG4gICkge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xuXG4gICAgYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHA6IGFueSkgPT4ge1xuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHAuaXRlbUxpbmVJZCkpIHtcbiAgICAgICAgcCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHApO1xuICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XG5cblxuICAgICAgICB0b3RhbCArPSAocC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRQcm9kdWN0UG9ydGlvbkNhbGNcIixcbiAgICAgIGBlYmFza2V0OiB0cm5zYWN0aW9uRGlzY291bnQ6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGRpc2NvdW50XG4gICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxuICAgICk7XG5cbiAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDphbnkpID0+IHtcbiAgICAgIHByb2R1Y3QgPSB0aGlzLnZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0KTtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsY1wiLCBcImRpc2NvdW50YWJsZSBpbiBiYXNrZXQgc2VydmljZVwiLCBwcm9kdWN0LmRpc2NvdW50YWJsZSk7XG5cbiAgICAgIGNvbnN0IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsID1cbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXG4gICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy5yZWZ1bmRQb3J0aW9uKTtcblxuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHByb2R1Y3QuaXRlbUxpbmVJZCkgJiYgcHJvZHVjdC5kaXNjb3VudGFibGUgPT0gdHJ1ZSkge1xuICAgICAgICBwZXJjZW50YWdlID0gKChwcm9kdWN0LnRvdGFsIC0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwpKSAvIHRvdGFsKSAqIDEwMDtcbiAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24gKz1cbiAgICAgICAgICAoZGlzY291bnQuZGlzY291bnRBbW91bnQgKiBwZXJjZW50YWdlKSAvIDEwMDtcbiAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbilcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYmFza2V0O1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0OiBQcm9kdWN0KSB7XG4gICAgaWYgKCFwcm9kdWN0Lml0ZW1EaXNjb3VudHMpIHtcbiAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cyA9IHtcbiAgICAgICAgdHJuRGlzY291bnRzUG9ydGlvbjogMCxcbiAgICAgICAgdHJuUHJvbW90aW9uc1BvcnRpb246IDAsXG4gICAgICAgIHJlZnVuZFBvcnRpb246IDAsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxuXG4gIG1hcmtQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpIHtcbiAgICB0aGlzLnByb2R1Y3RTb3VyY2UubmV4dChwcm9kdWN0KTtcbiAgfVxuICBzdG9wUGVlclN5bmNQcm9jZXNzKHBlZXJTeW5jOiBib29sZWFuKSB7XG4gICAgdGhpcy5wZWVyU291cmNlLm5leHQocGVlclN5bmMpO1xuICB9XG5cbiAgc2NhblN0YXJ0KGlzU2Nhbm5pbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNjYW5Tb3VyY2UubmV4dChpc1NjYW5uaW5nKTtcbiAgfVxuXG4gIHByb21vdGlvblJlbWFpbmluZ0NhbGN1bGF0aW9uKHByb21vdGlvbjogVHJhbnNhY3Rpb25Qcm9tb3Rpb25bXSkge1xuICAgIHZhciBwcm9tb3Rpb25WYWx1ZSA9IDA7XG4gICAgcHJvbW90aW9uLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIHByb21vdGlvblZhbHVlICs9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9tb3Rpb25WYWx1ZTtcbiAgfVxuXG4gIGRpc2NvdW50UmVtYWluaW5nQ2FsY3VsYXRpb24oZGlzY291bnQ6IFRyYW5zYWN0aW9uRGlzY291bnRbXSkge1xuICAgIHZhciBkaXNjb3VudFZhbHVlID0gMDtcbiAgICBkaXNjb3VudC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBkaXNjb3VudFZhbHVlICs9IGVsZW1lbnQuZGlzY291bnRBbW91bnQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpc2NvdW50VmFsdWU7XG4gIH1cblxuICBkaXNjb3VudFJlZnVuZGVkQ2FsY3VsYXRpb24oZGlzY291bnQ6IFRyYW5zYWN0aW9uRGlzY291bnRbXSkge1xuICAgIHZhciBkaXNjb3VudFZhbHVlID0gMDtcbiAgICBkaXNjb3VudC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5kaXNjb3VudEFtb3VudCA8IDApIHtcbiAgICAgICAgZGlzY291bnRWYWx1ZSArPSBlbGVtZW50LmRpc2NvdW50QW1vdW50O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkaXNjb3VudFZhbHVlO1xuICB9XG5cbiAgZ2VuZXJhdGVOZXdJdGVtTGluZUlkKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICBsZXQgbGFyZ2VzdE51bWJlcjogYW55ID0gMDtcblxuICAgIGlmIChwcm9kdWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgaXRlbUxpbmVJZEFycmF5ID0gcHJvZHVjdHMubWFwKChwcm9kdWN0KSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9kdWN0Lml0ZW1MaW5lSWQ7XG4gICAgICB9KTtcblxuICAgICAgbGFyZ2VzdE51bWJlciA9IGl0ZW1MaW5lSWRBcnJheS5yZWR1Y2UoKGEgOmFueSwgYjphbnkpID0+IE1hdGgubWF4KGEsIGIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFyZ2VzdE51bWJlciArIDE7XG4gIH1cblxuICB1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHkoXG4gICAgcHJvZHVjdDogYW55LFxuICAgIHF1YW50aXR5OiBudW1iZXJcbiAgKTogUHJvZHVjdCB7XG5cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eVwiLCBgZWJhc2tldDogdXBkYXRlQmFza2V0UHJvZHVjdERhdGFBc1BlclF1YW50aXR5IDogJHtxdWFudGl0eX0gcHJvZHVjdDogJHtKU09OLnN0cmluZ2lmeShwcm9kdWN0KX1gKTtcbiAgICBwcm9kdWN0LnF1YW50aXR5ID0gcXVhbnRpdHk7XG4gICAgaWYgKHByb2R1Y3QuaGFzT3duUHJvcGVydHkoXCJsaW5lRGlzY291bnRcIikpIHtcbiAgICAgIC8vICYmIHRoaXMucHJvZHVjdC5xdWFudGl0eSAhPT0gdGhpcy5wcm9kdWN0RGV0YWlsRm9ybS5jb250cm9scy5xdWFudGl0eS52YWx1ZVxuICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSA9IE51bWJlcihcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS5nZXRGbG9vcmVkRml4ZWQoXG4gICAgICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQudW5pdFByaWNlICogcXVhbnRpdHksXG4gICAgICAgICAgMlxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRBbW91bnQgPVxuICAgICAgICBwcm9kdWN0LnRvdGFsTGluZVByaWNlIC0gcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZHVjdC50b3RhbExpbmVQcmljZSA9XG4gICAgICAgIHF1YW50aXR5ICogdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChwcm9kdWN0LnNlbGVjdGVkUHJpY2UpO1xuICAgIH1cbiAgICBpZiAocHJvZHVjdC5saW5lRGlzY291bnQpIHtcbiAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcbiAgICB9XG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHlcIiwgYGViYXNrZXQ6IHVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eSA6ICR7cXVhbnRpdHl9IHByb2R1Y3Q6ICR7SlNPTi5zdHJpbmdpZnkocHJvZHVjdCl9YCk7XG5cbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxuXG4gIGZpbHRlclByb2R1Y3RMaXN0V2l0aFdlYk9yZGVyKGlzV2ViT3JkZXI6IGJvb2xlYW4pOiBQcm9kdWN0W10ge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXJcIiwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhXZWJPcmRlciBoaXRcIiwgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzKTtcbiAgICBpZiAoaXNXZWJPcmRlcilcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmlzV2ViT3JkZXIpO1xuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5maWx0ZXIoKHgpID0+ICF4LmlzV2ViT3JkZXIpO1xuICAgIH1cbiAgfVxuXG4gIGZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5KCk6IFByb2R1Y3RbXSB7XG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhEZWxpdmVyeVwiLCBcImZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5IGhpdFwiLCB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMpO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmRlbGl2ZXJ5TWV0aG9kID09PSBERUxJVkVSWV9NRVRIT0RTLkRFTElWRVJZLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cChncm91cDogc3RyaW5nLCBwcm9kdWN0czogUHJvZHVjdFtdKTogUHJvZHVjdFtdIHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5R3JvdXBcIiwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhEZWxpdmVyeUdyb3VwIGhpdFwiLCBwcm9kdWN0cyk7XG4gICAgcmV0dXJuIHByb2R1Y3RzLmZpbHRlcigoeCkgPT4geC5kZWxpdmVyeUdyb3VwID09PSBncm91cCk7XG4gIH1cblxuICBnZW5lcmF0ZU5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIGxldCBsYXJnZXN0TnVtYmVyID0gMDtcblxuICAgIGlmIChwcm9kdWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xuICAgICAgICBpZiAocHJvZHVjdC5kZWxpdmVyeUdyb3VwKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHByb2R1Y3QuZGVsaXZlcnlHcm91cCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgbGFyZ2VzdE51bWJlciA9IGRlbGl2ZXJ5R3JvdXBBcnIucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChsYXJnZXN0TnVtYmVyICsgMSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzXCIsIFwiZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMgaW5pdGlhdGluZyA6IFwiLHByb2R1Y3RzKTtcblxuICAgIGxldCB1bmlxdWVBbmRzb3J0ZWRSZXN1bHQ6IG51bWJlcltdID0gW107XG5cbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGRlbGl2ZXJ5R3JvdXBBcnIgPSBwcm9kdWN0cy5tYXAoKHByb2R1Y3QpID0+IHtcbiAgICAgICAgaWYgKHByb2R1Y3QuZGVsaXZlcnlHcm91cCkge1xuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByb2R1Y3QuZGVsaXZlcnlNZXRob2QgPT09IFwiMVwiKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgdW5pcXVlQW5kc29ydGVkUmVzdWx0ID0gQXJyYXkuZnJvbShuZXcgU2V0KGRlbGl2ZXJ5R3JvdXBBcnIpKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzXCIsIFwiZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMgOiB1bmlxdWVBbmRzb3J0ZWRSZXN1bHRcIiwgdW5pcXVlQW5kc29ydGVkUmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHVuaXF1ZUFuZHNvcnRlZFJlc3VsdDtcbiAgfVxuXG4gIHVwZGF0ZVByb2R1Y3RzV2l0aE5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlUHJvZHVjdHNXaXRoTmV3RGVsaXZlcnlHcm91cE51bWJlclwiLCBcImluaXRpYXRpbmcgOiBcIiwgcHJvZHVjdHMpO1xuXG4gICAgbGV0IG5ld0dyb3VwTnVtYmVyID0gdGhpcy5nZW5lcmF0ZU5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIodGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzKTtcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzLmZvckVhY2goY0JQcm9kdWN0cyA9PiB7XG4gICAgICAgIHByb2R1Y3RzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgaWYgKGNCUHJvZHVjdHMuaXRlbUxpbmVJZCA9PT0gZWxlbWVudC5pdGVtTGluZUlkKSB7XG4gICAgICAgICAgICBjQlByb2R1Y3RzLmRlbGl2ZXJ5R3JvdXAgPSBuZXdHcm91cE51bWJlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQmFza2V0KHRoaXMuY3VycmVudEJhc2tldCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY2FsY3VsYXRlRXN0aW1hdGVkVGltZShwcm9kdWN0czogYW55W10pIHtcbiAgICB0cnkge1xuICAgICAgbGV0IHRpbWU7XG4gICAgICBsZXQgZXN0bWF0ZWRUaW1lOiBudW1iZXIgPSAwO1xuICAgICAgbGV0IGVzdGltYXRlZERheXM6IHN0cmluZyA9IFwiSG91cnNcIjtcbiAgICAgIHByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IHsgbGVhZFRpbWU6IHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogYW55OyB9OyB9KSA9PiB7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubGVhZFRpbWUudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIndlZWtzXCIpIHtcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiA3O1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBgd2VlayAke2VzdG1hdGVkVGltZX0gJHtlc3RpbWF0ZWREYXlzfWApO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sZWFkVGltZS50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwiZGF5c1wiKSB7XG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0O1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGBkYXlzICR7ZXN0bWF0ZWRUaW1lfSAke2VzdGltYXRlZERheXN9YCk7XG5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJtb250aHNcIikge1xuICAgICAgICAgIHRpbWUgPSBOdW1iZXIoZWxlbWVudC5sZWFkVGltZS52YWx1ZSkgKiAyNCAqIDMwO1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGBtb250aHMgJHtlc3RtYXRlZFRpbWV9ICAke2VzdGltYXRlZERheXN9YCk7XG5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5ZWFyc1wiKSB7XG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0ICogMzY1O1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGB5ZWFycyAke2VzdG1hdGVkVGltZX0gICR7ZXN0aW1hdGVkRGF5c31gKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRpbWUgPSBOdW1iZXIoZWxlbWVudC5sZWFkVGltZS52YWx1ZSk7XG4gICAgICAgICAgZXN0bWF0ZWRUaW1lID0gTWF0aC5tYXgoZXN0bWF0ZWRUaW1lLCB0aW1lKTtcbiAgICAgICAgICBlc3RpbWF0ZWREYXlzID0gKGVzdG1hdGVkVGltZSA9PT0gdGltZSkgPyBlbGVtZW50LmxlYWRUaW1lLnR5cGUgOiBlc3RpbWF0ZWREYXlzO1xuICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBgaG91cnMgICR7ZXN0bWF0ZWRUaW1lfSAgJHtlc3RpbWF0ZWREYXlzfWApO1xuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcImRheXNcIikge1xuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAyNDtcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIndlZWtzXCIpIHtcbiAgICAgICAgZXN0bWF0ZWRUaW1lID0gZXN0bWF0ZWRUaW1lIC8gKDI0ICogNyk7XG4gICAgICB9IGVsc2UgaWYgKGVzdGltYXRlZERheXMudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJtb250aHNcIikge1xuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzMCk7XG4gICAgICB9IGVsc2UgaWYgKGVzdGltYXRlZERheXMudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5ZWFyc1wiKSB7XG4gICAgICAgIGVzdG1hdGVkVGltZSA9IGVzdG1hdGVkVGltZSAvICgyNCAqIDM2NSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBlc3RpbWF0ZSA9IHtcbiAgICAgICAgdmFsdWU6IGVzdG1hdGVkVGltZS50b1N0cmluZygpLFxuICAgICAgICB0eXBlOiBlc3RpbWF0ZWREYXlzXG4gICAgICB9XG4gICAgICByZXR1cm4gZXN0aW1hdGU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRXJyb3IodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBcImVycm9yIGluIGNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHVwZGF0ZVByb2R1Y3RzV2l0aERlbGl2ZXJ5R3JvdXBOdW1iZXIob2xkR3JvdXA6IHN0cmluZywgbmV3R3JvdXA6IHN0cmluZykge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlUHJvZHVjdHNXaXRoRGVsaXZlcnlHcm91cE51bWJlciBpbml0aWF0aW5nXCIpO1xuXG4gICAgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzLmZvckVhY2goY0JQcm9kdWN0cyA9PiB7XG4gICAgICBpZiAoY0JQcm9kdWN0cy5kZWxpdmVyeUdyb3VwID09PSBvbGRHcm91cCkge1xuICAgICAgICBjQlByb2R1Y3RzLmRlbGl2ZXJ5R3JvdXAgPSBuZXdHcm91cDtcbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVCYXNrZXQodGhpcy5jdXJyZW50QmFza2V0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBnZXREZWxpdmVyeUluZm8oKTogYW55IHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5SW5mb1wiLCBcImdldERlbGl2ZXJ5R3JvdXBJbmZvciBpbml0aWF0aW5nXCIpO1xuICAgIHRyeSB7XG4gICAgICBsZXQgZ3JvdXBJbmZvOiBEZWxpdmVyeUluZm8gPSB7XG4gICAgICAgIGdyb3VwczogW11cbiAgICAgIH1cblxuICAgICAgdGhpcy5nZXREZWxpdmVyeUdyb3VwTnVtYmVycyh0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMpLmZvckVhY2goKGdyb3VwTnVtYmVyKSA9PiB7XG4gICAgICAgIGxldCBncm91cDogYW55ID0ge1xuICAgICAgICAgIGdyb3VwTnVtYmVyOiBncm91cE51bWJlcixcbiAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAgZXN0aW1hdGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiSG91cnNcIixcbiAgICAgICAgICAgIHZhbHVlOiBcIjBcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZm9yRWFjaChjQlByb2R1Y3RzID0+IHtcbiAgICAgICAgICBpZiAoY0JQcm9kdWN0cy5kZWxpdmVyeUdyb3VwID09PSBncm91cE51bWJlci50b1N0cmluZygpKSB7XG4gICAgICAgICAgICBncm91cC5pdGVtcy5wdXNoKGNCUHJvZHVjdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ3JvdXAuZXN0aW1hdGUgPSB0aGlzLmNhbGN1bGF0ZUVzdGltYXRlZFRpbWUoZ3JvdXAuaXRlbXMpO1xuXG4gICAgICAgIGdyb3VwSW5mby5ncm91cHMucHVzaChncm91cCk7XG5cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZ3JvdXBJbmZvO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRXJyb3IodGhpcy5jbGFzc05hbWUsIFwiZ2V0RGVsaXZlcnlJbmZvXCIsIFwiZXJyb3Igd2hpbGUgZ2V0dGluZyBkZWxpdmVyeSBpbmZvXCIsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==