@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,326 +1,326 @@
1
- import { PROMOTION_LEVEL, PROMOTION_TYPE } from "./mapper-library.model";
2
- import { NumberUtilService } from "./number-util.service";
3
- import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
4
- export class WebReturnMapperBuilderClass {
5
- constructor(document, currencyPipe) {
6
- this.currencyPipe = currencyPipe;
7
- this.className = "WebReturnMapperBuilderClass";
8
- this.webReturnObject = {
9
- id: '',
10
- orgCode: "",
11
- storeId: "",
12
- storeNodeId: "",
13
- storeNodeStructure: "",
14
- deviceId: "",
15
- terminalId: "",
16
- initiatingModule: "",
17
- export: false,
18
- isInStoreOrder: false,
19
- basket: {},
20
- basketSummary: {},
21
- baseCurrency: "",
22
- customer: {
23
- firstName: '',
24
- lastName: '',
25
- email: '',
26
- postCode: '',
27
- id: '',
28
- billingAddress: {},
29
- shippingAddress: {},
30
- },
31
- currentTransactionDetails: {}
32
- };
33
- if (document) {
34
- this.document = document;
35
- }
36
- this.numberUtilService = new NumberUtilService(currencyPipe);
37
- }
38
- WebReturnMapper() {
39
- this.webReturnObject['type'] = 'WEB_RETURNS';
40
- this.webReturnObject['datetime'] = this.getUTCDateTime(this.getText(this.document.updated_at));
41
- this.webReturnObject.baseCurrency = this.getText(this.document.base_currency_code);
42
- this.webReturnObject.storeId = this.getText(this.document.store_id);
43
- this.webReturnObject.subsidiaryId = '1';
44
- this.webReturnObject.initiatingModule = 'MAGENTO';
45
- this.webReturnObject.createdAt = this.getUTCDateTime(this.getText(this.document.created_at));
46
- this.webReturnObject.updatedAt = this.getUTCDateTime(this.getText(this.document.updated_at));
47
- this.webReturnObject.export = true;
48
- this.webReturnObject.transCompletedAt = this.getUTCDateTime(this.getText(this.document.updated_at));
49
- this.webReturnObject['externalTransactionId'] = this.getText(this.document.order_id);
50
- // customer
51
- this.webReturnObject['customer']['firstName'] = this.getText(this.document.customer_firstname) || '';
52
- this.webReturnObject['customer']['lastName'] = this.getText(this.document.customer_lastname) || '';
53
- this.webReturnObject['customer']['email'] = this.getText(this.document.customer_email) || '';
54
- this.webReturnObject['customer']['postCode'] = '';
55
- // Billing address
56
- this.webReturnObject['customer']['billingAddress']['address1'] = (this.document.billing_address && this.document.billing_address.street) ? this.getText(this.document.billing_address.street) : '';
57
- this.webReturnObject['customer']['billingAddress']['city'] = (this.document.billing_address && this.document.billing_address.city) ? this.getText(this.document.billing_address.city) : '';
58
- this.webReturnObject['customer']['billingAddress']['county'] = (this.document.billing_address && this.document.billing_address.region) ? this.getText(this.document.billing_address.region) : '';
59
- this.webReturnObject['customer']['billingAddress']['postCode'] = (this.document.billing_address && this.document.billing_address.postcode) ? this.getText(this.document.billing_address.postcode) : '';
60
- this.webReturnObject['customer']['billingAddress']['country'] = (this.document.billing_address && this.document.billing_address.country) ? this.getText(this.document.billing_address.country) : '';
61
- // Shipping address
62
- this.webReturnObject['customer']['shippingAddress']['address1'] = (this.document.shipping_address && this.document.shipping_address.street) ? this.getText(this.document.shipping_address.street) : '';
63
- this.webReturnObject['customer']['shippingAddress']['city'] = (this.document.shipping_address && this.document.shipping_address.city) ? this.getText(this.document.shipping_address.city) : '';
64
- this.webReturnObject['customer']['shippingAddress']['county'] = (this.document.shipping_address && this.document.shipping_address.region) ? this.getText(this.document.shipping_address.region) : '';
65
- this.webReturnObject['customer']['shippingAddress']['postCode'] = (this.document.shipping_address && this.document.shipping_address.postcode) ? this.getText(this.document.shipping_address.postcode) : '';
66
- this.webReturnObject['customer']['shippingAddress']['country'] = (this.document.shipping_address && this.document.shipping_address.country) ? this.getText(this.document.shipping_address.country) : '';
67
- // basketSummary
68
- this.webReturnObject.basketSummary['discountTotal'] = Math.abs(Number(this.document.discount_amount ? this.getText(this.document.discount_amount) : 0));
69
- this.webReturnObject.basketSummary['VATTotal'] = Number(this.document.base_total_paid ? this.getText(this.document.base_total_paid) : 0);
70
- this.webReturnObject.basketSummary['saleTotal'] = Number(this.document.base_total_invoiced ? this.getText(this.document.base_total_invoiced) : 0);
71
- this.webReturnObject.basketSummary['basketTotal'] = Number(this.document.base_total_paid ? this.getText(this.document.base_total_paid) : 0);
72
- this.webReturnObject.basketSummary['totalItems'] = Number(this.document.total_qty_ordered ? this.getText(this.document.total_qty_ordered) : 0);
73
- this.webReturnObject.basketSummary['refundTotal'] = Number(this.document.base_total_refunded ? this.getText(this.document.base_total_refunded) : 0);
74
- // // basket line discount
75
- // this.webReturnObject.basket['lineDiscount'] = [];
76
- // let lineDiscount = {
77
- // itemLineId: (this.document.items && this.document.items.item && this.document.items.item.item_id) ? this.getText(this.document.items.item.item_id) : 0,
78
- // discountAmount: (this.document.items && this.document.items.item && this.document.items.item.discount_amount) ? Number(this.getText(this.document.items.item.discount_amount)) : 0
79
- // }
80
- // this.webReturnObject.basket['lineDiscount'].push(lineDiscount);
81
- // basket transaction discount
82
- // basket products
83
- this.webReturnObject.basket['products'] = [];
84
- this.webReturnObject.basket['linePromotion'] = [];
85
- this.webReturnObject.basket['transactionDiscount'] = [];
86
- this.webReturnObject.basket['transactionPromotion'] = [];
87
- // let transactionDiscount = {
88
- // discountAmount: (this.document && this.document.discount_amount) ? Number(this.getText(this.document.discount_amount)) : 0
89
- // }
90
- // this.webReturnObject.basket['transactionDiscount'].push(transactionDiscount);
91
- let product = {};
92
- if (this.document.items && this.document.items.item) {
93
- if (this.document.items.item instanceof Array) {
94
- this.document.items.item.forEach((element, index) => {
95
- let qty = this.getText(element.qty_ordered) ? Number(this.getText(element.qty_ordered)) : 0;
96
- let refundQty = this.getText(element.qty_refunded) ? Number(this.getText(element.qty_refunded)) : 0;
97
- let price = this.getText(element.price_incl_tax) ? Number(this.getText(element.price_incl_tax)) : 0;
98
- product = {
99
- description: (element.name) ? this.getText(element.name) : '',
100
- SKU: (element.sku) ? this.getText(element.sku) : '',
101
- quantity: (element.qty_ordered) ? Number(this.getText(element.qty_ordered)) : 0,
102
- refundedQuantity: (element.qty_refunded) ? Number(this.getText(element.qty_refunded)) : 0,
103
- //price: (element.original_price) ? Number(this.getText(element.original_price)) : 0,
104
- price: price,
105
- itemLineId: (index + 1).toString(),
106
- // totalLinePrice: (element.row_invoiced) ? Number(this.getText(element.row_invoiced)) : 0,
107
- totalLinePrice: ((qty - refundQty) * price),
108
- };
109
- let promotionAmount = this.getText(element.discount_amount) ? Number(this.getText(element.discount_amount)) : 0;
110
- let appliedIDs = this.getText(element.applied_rule_ids) ? this.getText(element.applied_rule_ids) : '';
111
- if (product && product.price != 0) {
112
- if (promotionAmount) {
113
- let trigger = {};
114
- trigger.itemLineId = product.itemLineId;
115
- trigger.quantity = product.quantity ? product.quantity : 0;
116
- let promotion = {
117
- promotionAmount: promotionAmount,
118
- promotionId: appliedIDs,
119
- itemLineId: product.itemLineId,
120
- promotionLinePrice: product.totalLinePrice - promotionAmount,
121
- trigger: trigger
122
- };
123
- this.webReturnObject.basket['linePromotion'].push(promotion);
124
- }
125
- this.webReturnObject.basket['products'].push(product);
126
- }
127
- });
128
- }
129
- else {
130
- let qty = (this.document.items && this.document.items.item && this.document.items.item.qty_ordered) ? Number(this.getText(this.document.items.item.qty_ordered)) : 0;
131
- let refundQty = (this.document.items && this.document.items.item && this.document.items.item.qty_refunded) ? Number(this.getText(this.document.items.item.qty_refunded)) : 0;
132
- let price = (this.document.items && this.document.items.item && this.document.items.item.price_incl_tax) ? Number(this.getText(this.document.items.item.price_incl_tax)) : 0;
133
- product = {
134
- description: (this.document.items && this.document.items.item && this.document.items.item.name) ? this.getText(this.document.items.item.name) : '',
135
- SKU: (this.document.items && this.document.items.item && this.document.items.item.sku) ? this.getText(this.document.items.item.sku) : '',
136
- quantity: (this.document.items && this.document.items.item && this.document.items.item.qty_ordered) ? Number(this.getText(this.document.items.item.qty_ordered)) : 0,
137
- refundedQuantity: (this.document.items && this.document.items.item && this.document.items.item.qty_refunded) ? Number(this.getText(this.document.items.item.qty_refunded)) : 0,
138
- // price: (this.document.items && this.document.items.item && this.document.items.item.original_price) ? Number(this.getText(this.document.items.item.original_price)) : 0,
139
- price: price,
140
- itemLineId: "1",
141
- // totalLinePrice: (this.document.items && this.document.items.item && this.document.items.item.row_invoiced) ? Number(this.getText(this.document.items.item.row_invoiced)) : 0,
142
- totalLinePrice: ((qty - refundQty) * price),
143
- };
144
- let promotionAmount = this.getText(this.document.items.item.discount_amount) ? Number(this.getText(this.document.items.item.discount_amount)) : 0;
145
- let appliedIDs = this.getText(this.document.items.item.applied_rule_ids) ? this.getText(this.document.items.item.applied_rule_ids) : '';
146
- if (product && product.price != 0) {
147
- if (promotionAmount) {
148
- let trigger = {};
149
- trigger.itemLineId = product.itemLineId;
150
- trigger.quantity = product.quantity ? product.quantity : 0;
151
- let promotion = {
152
- promotionAmount: promotionAmount,
153
- promotionId: appliedIDs,
154
- itemLineId: product.itemLineId,
155
- promotionLinePrice: product.totalLinePrice - promotionAmount,
156
- trigger: trigger
157
- };
158
- this.webReturnObject.basket['linePromotion'].push(promotion);
159
- }
160
- this.webReturnObject.basket['products'].push(product);
161
- }
162
- }
163
- let couponCode = this.getText(this.document.coupon_code) ? this.getText(this.document.coupon_code) : 0;
164
- let appliedIDs = this.getText(this.document.applied_rule_ids) ? this.getText(this.document.applied_rule_ids) : '';
165
- let discountDescription = this.getText(this.document.discount_description) ? this.getText(this.document.discount_description) : '';
166
- let couponTriggerPromotions = [];
167
- if (couponCode && appliedIDs) {
168
- let transactionPromotion = {};
169
- if (this.webReturnObject.basket['linePromotion'] && this.webReturnObject.basket['linePromotion'].length > 0) {
170
- this.webReturnObject.basket['linePromotion'].forEach((promotion) => {
171
- if (promotion.promotionId === appliedIDs) {
172
- let trigger = {};
173
- trigger.itemLineId = promotion.itemLineId;
174
- trigger.quantity = promotion.trigger.quantity;
175
- trigger.totalQuantity = promotion.trigger.quantity;
176
- trigger.promotionAmount = promotion.promotionAmount;
177
- trigger.refundedReason = couponCode;
178
- trigger.refundedReasonDescription = discountDescription;
179
- trigger.promotionId = promotion.promotionId;
180
- couponTriggerPromotions.push(trigger);
181
- this.webReturnObject.basket['linePromotion'] = this.webReturnObject.basket['linePromotion'].filter((x) => x.itemLineId !== promotion.itemLineId);
182
- }
183
- });
184
- }
185
- if (couponTriggerPromotions.length > 0) {
186
- transactionPromotion.displayText = couponTriggerPromotions[0].refundedReasonDescription;
187
- transactionPromotion.name = couponTriggerPromotions[0].refundedReason;
188
- transactionPromotion.promotionAmount = -(couponTriggerPromotions.reduce((n, { promotionAmount }) => n + promotionAmount, 0));
189
- transactionPromotion.promotionId = couponTriggerPromotions[0].promotionId;
190
- transactionPromotion.promotionInfo = couponTriggerPromotions[0].refundedReasonDescription;
191
- transactionPromotion.couponCode = couponCode;
192
- transactionPromotion.itemLineIds = [];
193
- transactionPromotion.type = PROMOTION_TYPE.COUPON;
194
- transactionPromotion.subLevelType = PROMOTION_LEVEL.LINE;
195
- transactionPromotion.trigger = couponTriggerPromotions;
196
- }
197
- AppLoggerService.logDebug(this.className, "WebReturnMapper", "update LinePromotion With Coupon", transactionPromotion);
198
- if (!this.webReturnObject.basket.transactionPromotion) {
199
- this.webReturnObject.basket.transactionPromotion = [];
200
- }
201
- if (transactionPromotion && transactionPromotion.promotionId) {
202
- this.webReturnObject.basket.transactionPromotion.push(transactionPromotion);
203
- }
204
- }
205
- this.updateTransactionPromotionPrtionCalc();
206
- }
207
- return this;
208
- }
209
- validateProductItemDiscount(product) {
210
- if (!product.itemDiscounts) {
211
- product.itemDiscounts = {
212
- trnDiscountsPortion: 0,
213
- trnPromotionsPortion: 0,
214
- refundPortion: 0,
215
- };
216
- }
217
- return product;
218
- }
219
- transactionPromotionProductPortionCalc(txDoc, promotion) {
220
- AppLoggerService.logDebug(this.className, "transactionPromotionProductPortionCalc", `trnsactionPromotion: ${JSON.stringify(promotion)}`);
221
- if (promotion.type === PROMOTION_TYPE.COUPON && promotion.subLevelType === PROMOTION_LEVEL.LINE) {
222
- txDoc.basket.products.forEach((product) => {
223
- product = this.validateProductItemDiscount(product);
224
- if (promotion.trigger && promotion.trigger.length > 0) {
225
- promotion.trigger.forEach((t) => {
226
- if (t.itemLineId === product.itemLineId.toString()) {
227
- product.itemDiscounts.trnPromotionsPortion += t.promotionAmount;
228
- }
229
- });
230
- }
231
- });
232
- }
233
- else {
234
- txDoc.basket.products.forEach((product) => {
235
- product = this.validateProductItemDiscount(product);
236
- if (promotion.itemLineIds.includes(+product.itemLineId)) {
237
- let discountAmount = 0;
238
- if (this.document.items.item instanceof Array) {
239
- const productItem = this.document.items.item.find(productItem => productItem.sku === product.SKU);
240
- discountAmount = productItem.discount_amount ? +productItem.discount_amount : 0;
241
- }
242
- else {
243
- discountAmount = this.document.items.item.sku === product.SKU && this.document.items.item.discount_amount ?
244
- +this.document.items.item.discount_amount : 0;
245
- }
246
- const transactionPromotionPortion = discountAmount;
247
- product.itemDiscounts.trnPromotionsPortion += this.numberUtilService.trimTo2Decimal2(transactionPromotionPortion);
248
- }
249
- });
250
- }
251
- return txDoc;
252
- }
253
- updateTransactionPromotionPrtionCalc() {
254
- try {
255
- if (this.webReturnObject.basket.transactionPromotion && this.webReturnObject.basket.transactionPromotion.length > 0) {
256
- this.webReturnObject.basket.transactionPromotion.forEach(tr => {
257
- this.transactionPromotionProductPortionCalc(this.webReturnObject, tr);
258
- });
259
- }
260
- }
261
- catch (error) {
262
- AppLoggerService.logError(this.className, "updateTransactionPromotionPrtionCalc", "updateTransactionPromotionPrtionCalc => failed:", error);
263
- }
264
- }
265
- deviceId(deviceId) {
266
- this.webReturnObject.deviceId = deviceId;
267
- return this;
268
- }
269
- terminalId(terminalId) {
270
- this.webReturnObject.terminalId = terminalId;
271
- return this;
272
- }
273
- orgCode(orgCode) {
274
- this.webReturnObject.orgCode = orgCode;
275
- return this;
276
- }
277
- storeId(storeId) {
278
- this.webReturnObject.storeId = storeId;
279
- return this;
280
- }
281
- storeNodeId(storeNodeId) {
282
- this.webReturnObject.storeNodeId = storeNodeId;
283
- return this;
284
- }
285
- storeNodeStructure(storeNodeStructure) {
286
- this.webReturnObject.storeNodeStructure = storeNodeStructure;
287
- return this;
288
- }
289
- docId(docId) {
290
- this.webReturnObject.id = docId;
291
- return this;
292
- }
293
- updateUserID(userID) {
294
- this.webReturnObject.userId = userID;
295
- return this;
296
- }
297
- updateUserName(name) {
298
- this.webReturnObject.userName = name;
299
- return this;
300
- }
301
- build() {
302
- return this.webReturnObject;
303
- }
304
- getText(obj) {
305
- if (obj && obj.text) {
306
- return obj.text;
307
- }
308
- else {
309
- return obj;
310
- }
311
- }
312
- getUTCDateTime(date) {
313
- if (date) {
314
- return new Date(date).toISOString();
315
- }
316
- }
317
- isInStoreOrder() {
318
- AppLoggerService.logDebug(this.className, "isInStoreOrder", "isInStoreOrder mapping started...");
319
- if (this.document.payment && this.document.payment.method && this.document.payment.method === 'pos_order') {
320
- this.webReturnObject.isInStoreOrder = true;
321
- }
322
- AppLoggerService.logDebug(this.className, "isInStoreOrder", "isInStoreOrder mapping ended...");
323
- return this;
324
- }
325
- }
326
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViUmV0dXJuLW1hcHBlci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hcHBlci1saWJyYXJ5L3NyYy9saWIvV2ViUmV0dXJuLW1hcHBlci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQTJELGVBQWUsRUFBRSxjQUFjLEVBQWtDLE1BQU0sd0JBQXdCLENBQUM7QUFDbEssT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFFdEYsTUFBTSxPQUFPLDJCQUEyQjtJQStCcEMsWUFBWSxRQUFRLEVBQVUsWUFBMkI7UUFBM0IsaUJBQVksR0FBWixZQUFZLENBQWU7UUE5QnpELGNBQVMsR0FBRyw2QkFBNkIsQ0FBQztRQUVsQyxvQkFBZSxHQUF3QjtZQUMzQyxFQUFFLEVBQUUsRUFBRTtZQUNOLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLEVBQUU7WUFDWCxXQUFXLEVBQUUsRUFBRTtZQUNmLGtCQUFrQixFQUFFLEVBQUU7WUFDdEIsUUFBUSxFQUFFLEVBQUU7WUFDWixVQUFVLEVBQUUsRUFBRTtZQUNkLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsTUFBTSxFQUFFLEtBQUs7WUFDYixjQUFjLEVBQUUsS0FBSztZQUNyQixNQUFNLEVBQUUsRUFBRTtZQUNWLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFlBQVksRUFBRSxFQUFFO1lBQ2hCLFFBQVEsRUFBRTtnQkFDTixTQUFTLEVBQUUsRUFBRTtnQkFDYixRQUFRLEVBQUUsRUFBRTtnQkFDWixLQUFLLEVBQUUsRUFBRTtnQkFDVCxRQUFRLEVBQUUsRUFBRTtnQkFDWixFQUFFLEVBQUUsRUFBRTtnQkFDTixjQUFjLEVBQUUsRUFBRTtnQkFDbEIsZUFBZSxFQUFFLEVBQUU7YUFFdEI7WUFDRCx5QkFBeUIsRUFBRSxFQUEr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SUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBQztZQUNyRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDOUM7UUFDRCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQy9GLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlscywgVHJhbnNhY3Rpb25Eb2N1bWVudCwgVHJpZ2dlciwgUFJPTU9USU9OX0xFVkVMLCBQUk9NT1RJT05fVFlQRSwgVFByb2R1Y3QsIFRyYW5zYWN0aW9uUHJvbW90aW9uIH0gZnJvbSBcIi4vbWFwcGVyLWxpYnJhcnkubW9kZWxcIjtcclxuaW1wb3J0IHsgTnVtYmVyVXRpbFNlcnZpY2UgfSBmcm9tIFwiLi9udW1iZXItdXRpbC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7QXBwTG9nZ2VyU2VydmljZX0gZnJvbSAnQHBtY3JldGFpbC9jb21tb24tc2VydmljZXMvY29tbW9uL2FwcC1sb2dnZXIuc2VydmljZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgV2ViUmV0dXJuTWFwcGVyQnVpbGRlckNsYXNzIHtcclxuICAgIGNsYXNzTmFtZSA9IFwiV2ViUmV0dXJuTWFwcGVyQnVpbGRlckNsYXNzXCI7XHJcbiAgICBwcml2YXRlIGRvY3VtZW50OiBhbnk7XHJcbiAgICBwcml2YXRlIHdlYlJldHVybk9iamVjdDogVHJhbnNhY3Rpb25Eb2N1bWVudCA9IHtcclxuICAgICAgICBpZDogJycsXHJcbiAgICAgICAgb3JnQ29kZTogXCJcIixcclxuICAgICAgICBzdG9yZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcclxuICAgICAgICBkZXZpY2VJZDogXCJcIixcclxuICAgICAgICB0ZXJtaW5hbElkOiBcIlwiLFxyXG4gICAgICAgIGluaXRpYXRpbmdNb2R1bGU6IFwiXCIsXHJcbiAgICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgICBpc0luU3RvcmVPcmRlcjogZmFsc2UsXHJcbiAgICAgICAgYmFza2V0OiB7fSxcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5OiB7fSxcclxuICAgICAgICBiYXNlQ3VycmVuY3k6IFwiXCIsXHJcbiAgICAgICAgY3VzdG9tZXI6IHtcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgbGFzdE5hbWU6ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogJycsXHJcbiAgICAgICAgICAgIHBvc3RDb2RlOiAnJyxcclxuICAgICAgICAgICAgaWQ6ICcnLFxyXG4gICAgICAgICAgICBiaWxsaW5nQWRkcmVzczoge30sXHJcbiAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzczoge30sXHJcblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsczoge30gYXMgQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1xyXG4gICAgfVxyXG4gICAgbnVtYmVyVXRpbFNlcnZpY2U6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgcHJpdmF0ZSBjdXJyZW5jeVBpcGU/OiBDdXJyZW5jeVBpcGUpIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlID0gbmV3IE51bWJlclV0aWxTZXJ2aWNlKGN1cnJlbmN5UGlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgV2ViUmV0dXJuTWFwcGVyKCkge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0Wyd0eXBlJ10gPSAnV0VCX1JFVFVSTlMnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydkYXRldGltZSddID0gdGhpcy5nZXRVVENEYXRlVGltZSh0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC51cGRhdGVkX2F0KSk7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFzZUN1cnJlbmN5ID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYmFzZV9jdXJyZW5jeV9jb2RlKTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5zdG9yZUlkID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuc3RvcmVfaWQpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnN1YnNpZGlhcnlJZCA9ICcxJztcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5pbml0aWF0aW5nTW9kdWxlID0gJ01BR0VOVE8nO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmNyZWF0ZWRBdCA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuY3JlYXRlZF9hdCkpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnVwZGF0ZWRBdCA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQudXBkYXRlZF9hdCkpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmV4cG9ydCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QudHJhbnNDb21wbGV0ZWRBdCA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQudXBkYXRlZF9hdCkpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydleHRlcm5hbFRyYW5zYWN0aW9uSWQnXSA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lm9yZGVyX2lkKTtcclxuXHJcbiAgICAgICAgLy8gY3VzdG9tZXJcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnZmlyc3ROYW1lJ10gPSB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5jdXN0b21lcl9maXJzdG5hbWUpIHx8ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydsYXN0TmFtZSddID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuY3VzdG9tZXJfbGFzdG5hbWUpIHx8ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydlbWFpbCddID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuY3VzdG9tZXJfZW1haWwpIHx8ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydwb3N0Q29kZSddID0gJyc7XHJcblxyXG4gICAgICAgIC8vIEJpbGxpbmcgYWRkcmVzc1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydiaWxsaW5nQWRkcmVzcyddWydhZGRyZXNzMSddID0gKHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzICYmIHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzLnN0cmVldCkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3Muc3RyZWV0KSA6ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydiaWxsaW5nQWRkcmVzcyddWydjaXR5J10gPSAodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MuY2l0eSkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MuY2l0eSkgOiAnJztcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnYmlsbGluZ0FkZHJlc3MnXVsnY291bnR5J10gPSAodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MucmVnaW9uKSA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmJpbGxpbmdfYWRkcmVzcy5yZWdpb24pIDogJyc7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ2JpbGxpbmdBZGRyZXNzJ11bJ3Bvc3RDb2RlJ10gPSAodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MucG9zdGNvZGUpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzLnBvc3Rjb2RlKSA6ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydiaWxsaW5nQWRkcmVzcyddWydjb3VudHJ5J10gPSAodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MuY291bnRyeSkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MuY291bnRyeSkgOiAnJztcclxuXHJcbiAgICAgICAgLy8gU2hpcHBpbmcgYWRkcmVzc1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydzaGlwcGluZ0FkZHJlc3MnXVsnYWRkcmVzczEnXSA9ICh0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLnN0cmVldCkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLnN0cmVldCkgOiAnJztcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnc2hpcHBpbmdBZGRyZXNzJ11bJ2NpdHknXSA9ICh0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLmNpdHkpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5jaXR5KSA6ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydzaGlwcGluZ0FkZHJlc3MnXVsnY291bnR5J10gPSAodGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzICYmIHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5yZWdpb24pID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5yZWdpb24pIDogJyc7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ3NoaXBwaW5nQWRkcmVzcyddWydwb3N0Q29kZSddID0gKHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcyAmJiB0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MucG9zdGNvZGUpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5wb3N0Y29kZSkgOiAnJztcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnc2hpcHBpbmdBZGRyZXNzJ11bJ2NvdW50cnknXSA9ICh0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLmNvdW50cnkpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5jb3VudHJ5KSA6ICcnO1xyXG5cclxuICAgICAgICAvLyBiYXNrZXRTdW1tYXJ5IFxyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFN1bW1hcnlbJ2Rpc2NvdW50VG90YWwnXSA9IE1hdGguYWJzKE51bWJlcih0aGlzLmRvY3VtZW50LmRpc2NvdW50X2Ftb3VudCA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmRpc2NvdW50X2Ftb3VudCkgOiAwKSk7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0U3VtbWFyeVsnVkFUVG90YWwnXSA9IE51bWJlcih0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfcGFpZCA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfcGFpZCkgOiAwKTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRTdW1tYXJ5WydzYWxlVG90YWwnXSA9IE51bWJlcih0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfaW52b2ljZWQgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iYXNlX3RvdGFsX2ludm9pY2VkKSA6IDApO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFN1bW1hcnlbJ2Jhc2tldFRvdGFsJ10gPSBOdW1iZXIodGhpcy5kb2N1bWVudC5iYXNlX3RvdGFsX3BhaWQgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iYXNlX3RvdGFsX3BhaWQpIDogMCk7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0U3VtbWFyeVsndG90YWxJdGVtcyddID0gTnVtYmVyKHRoaXMuZG9jdW1lbnQudG90YWxfcXR5X29yZGVyZWQgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC50b3RhbF9xdHlfb3JkZXJlZCkgOiAwKTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRTdW1tYXJ5WydyZWZ1bmRUb3RhbCddID0gTnVtYmVyKHRoaXMuZG9jdW1lbnQuYmFzZV90b3RhbF9yZWZ1bmRlZCA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfcmVmdW5kZWQpIDogMCk7XHJcblxyXG4gICAgICAgIC8vIC8vIGJhc2tldCBsaW5lIGRpc2NvdW50XHJcbiAgICAgICAgLy8gdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lRGlzY291bnQnXSA9IFtdO1xyXG5cclxuICAgICAgICAvLyBsZXQgbGluZURpc2NvdW50ID0ge1xyXG4gICAgICAgIC8vICAgICBpdGVtTGluZUlkOiAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLml0ZW1faWQpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5pdGVtX2lkKSA6IDAsXHJcbiAgICAgICAgLy8gICAgIGRpc2NvdW50QW1vdW50OiAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLmRpc2NvdW50X2Ftb3VudCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5kaXNjb3VudF9hbW91bnQpKSA6IDBcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lRGlzY291bnQnXS5wdXNoKGxpbmVEaXNjb3VudCk7XHJcblxyXG4gICAgICAgIC8vIGJhc2tldCB0cmFuc2FjdGlvbiBkaXNjb3VudFxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICAvLyBiYXNrZXQgcHJvZHVjdHMgXHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0Wydwcm9kdWN0cyddID0gW107XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ109W107XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0Wyd0cmFuc2FjdGlvbkRpc2NvdW50J10gPSBbXTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ3RyYW5zYWN0aW9uUHJvbW90aW9uJ10gPSBbXTtcclxuXHJcbiAgICAgICAgLy8gbGV0IHRyYW5zYWN0aW9uRGlzY291bnQgPSB7XHJcbiAgICAgICAgLy8gICAgIGRpc2NvdW50QW1vdW50OiAodGhpcy5kb2N1bWVudCAmJiB0aGlzLmRvY3VtZW50LmRpc2NvdW50X2Ftb3VudCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuZGlzY291bnRfYW1vdW50KSkgOiAwXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsndHJhbnNhY3Rpb25EaXNjb3VudCddLnB1c2godHJhbnNhY3Rpb25EaXNjb3VudCk7XHJcblxyXG5cclxuICAgICAgICBsZXQgcHJvZHVjdCA6IGFueT0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHF0eSA9IHRoaXMuZ2V0VGV4dChlbGVtZW50LnF0eV9vcmRlcmVkKSA/IE51bWJlcih0aGlzLmdldFRleHQoZWxlbWVudC5xdHlfb3JkZXJlZCkpIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmdW5kUXR5ID0gdGhpcy5nZXRUZXh0KGVsZW1lbnQucXR5X3JlZnVuZGVkKSA/IE51bWJlcih0aGlzLmdldFRleHQoZWxlbWVudC5xdHlfcmVmdW5kZWQpKSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByaWNlID0gdGhpcy5nZXRUZXh0KGVsZW1lbnQucHJpY2VfaW5jbF90YXgpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dChlbGVtZW50LnByaWNlX2luY2xfdGF4KSkgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAoZWxlbWVudC5uYW1lKSA/IHRoaXMuZ2V0VGV4dChlbGVtZW50Lm5hbWUpIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNLVTogKGVsZW1lbnQuc2t1KSA/IHRoaXMuZ2V0VGV4dChlbGVtZW50LnNrdSkgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IChlbGVtZW50LnF0eV9vcmRlcmVkKSA/IE51bWJlcih0aGlzLmdldFRleHQoZWxlbWVudC5xdHlfb3JkZXJlZCkpIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmdW5kZWRRdWFudGl0eTogKGVsZW1lbnQucXR5X3JlZnVuZGVkKSA/IE51bWJlcih0aGlzLmdldFRleHQoZWxlbWVudC5xdHlfcmVmdW5kZWQpKSA6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpY2U6IChlbGVtZW50Lm9yaWdpbmFsX3ByaWNlKSA/IE51bWJlcih0aGlzLmdldFRleHQoZWxlbWVudC5vcmlnaW5hbF9wcmljZSkpIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IHByaWNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUxpbmVJZDogKGluZGV4ICsgMSkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG90YWxMaW5lUHJpY2U6IChlbGVtZW50LnJvd19pbnZvaWNlZCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KGVsZW1lbnQucm93X2ludm9pY2VkKSkgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbExpbmVQcmljZTogKChxdHkgLSByZWZ1bmRRdHkpICogcHJpY2UpLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vdGlvbkFtb3VudCA9IHRoaXMuZ2V0VGV4dChlbGVtZW50LmRpc2NvdW50X2Ftb3VudCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KGVsZW1lbnQuZGlzY291bnRfYW1vdW50KSkgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcHBsaWVkSURzID0gdGhpcy5nZXRUZXh0KGVsZW1lbnQuYXBwbGllZF9ydWxlX2lkcykgPyB0aGlzLmdldFRleHQoZWxlbWVudC5hcHBsaWVkX3J1bGVfaWRzKTonJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2R1Y3QgJiYgcHJvZHVjdC5wcmljZSAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByb21vdGlvbkFtb3VudClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyaWdnZXIgPSB7fSBhcyBUcmlnZ2VyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLml0ZW1MaW5lSWQgPSBwcm9kdWN0Lml0ZW1MaW5lSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5ID8gcHJvZHVjdC5xdWFudGl0eSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vdGlvbiAgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uQW1vdW50OnByb21vdGlvbkFtb3VudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25JZDphcHBsaWVkSURzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1MaW5lSWQ6cHJvZHVjdC5pdGVtTGluZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbkxpbmVQcmljZTogcHJvZHVjdC50b3RhbExpbmVQcmljZSAtIHByb21vdGlvbkFtb3VudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOnRyaWdnZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ2xpbmVQcm9tb3Rpb24nXS5wdXNoKHByb21vdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsncHJvZHVjdHMnXS5wdXNoKHByb2R1Y3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBxdHkgPSAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnF0eV9vcmRlcmVkKSA/IE51bWJlcih0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnF0eV9vcmRlcmVkKSkgOiAwO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlZnVuZFF0eSA9ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucXR5X3JlZnVuZGVkKSA/IE51bWJlcih0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnF0eV9yZWZ1bmRlZCkpIDogMDtcclxuICAgICAgICAgICAgICAgIGxldCBwcmljZSA9ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucHJpY2VfaW5jbF90YXgpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucHJpY2VfaW5jbF90YXgpKSA6IDA7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLm5hbWUpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5uYW1lKSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIFNLVTogKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5za3UpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5za3UpIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucXR5X29yZGVyZWQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucXR5X29yZGVyZWQpKSA6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVmdW5kZWRRdWFudGl0eTogKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5xdHlfcmVmdW5kZWQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucXR5X3JlZnVuZGVkKSkgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHByaWNlOiAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLm9yaWdpbmFsX3ByaWNlKSA/IE51bWJlcih0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLm9yaWdpbmFsX3ByaWNlKSkgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHByaWNlOiBwcmljZSxcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbUxpbmVJZDogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdG90YWxMaW5lUHJpY2U6ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucm93X2ludm9pY2VkKSA/IE51bWJlcih0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnJvd19pbnZvaWNlZCkpIDogMCxcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbExpbmVQcmljZTogKChxdHkgLSByZWZ1bmRRdHkpICogcHJpY2UpLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25BbW91bnQgPSB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLmRpc2NvdW50X2Ftb3VudCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5kaXNjb3VudF9hbW91bnQpKSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwcGxpZWRJRHMgPSB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLmFwcGxpZWRfcnVsZV9pZHMpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5hcHBsaWVkX3J1bGVfaWRzKTonJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2R1Y3QgJiYgcHJvZHVjdC5wcmljZSAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByb21vdGlvbkFtb3VudClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyaWdnZXIgPSB7fSBhcyBUcmlnZ2VyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLml0ZW1MaW5lSWQgPSBwcm9kdWN0Lml0ZW1MaW5lSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5ID8gcHJvZHVjdC5xdWFudGl0eSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vdGlvbiAgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uQW1vdW50OnByb21vdGlvbkFtb3VudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25JZDphcHBsaWVkSURzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1MaW5lSWQ6cHJvZHVjdC5pdGVtTGluZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbkxpbmVQcmljZTogcHJvZHVjdC50b3RhbExpbmVQcmljZSAtIHByb21vdGlvbkFtb3VudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOnRyaWdnZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ2xpbmVQcm9tb3Rpb24nXS5wdXNoKHByb21vdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsncHJvZHVjdHMnXS5wdXNoKHByb2R1Y3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvdXBvbkNvZGUgPSB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5jb3Vwb25fY29kZSkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5jb3Vwb25fY29kZSkgOiAwO1xyXG4gICAgICAgICAgICBsZXQgYXBwbGllZElEcyA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmFwcGxpZWRfcnVsZV9pZHMpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYXBwbGllZF9ydWxlX2lkcyk6Jyc7XHJcbiAgICAgICAgICAgIGxldCBkaXNjb3VudERlc2NyaXB0aW9uID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuZGlzY291bnRfZGVzY3JpcHRpb24pID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuZGlzY291bnRfZGVzY3JpcHRpb24pOicnO1xyXG5cclxuICAgICAgICAgICAgbGV0IGNvdXBvblRyaWdnZXJQcm9tb3Rpb25zID0gW10gYXMgVHJpZ2dlcltdO1xyXG4gICAgICAgICAgICBpZihjb3Vwb25Db2RlICYmIGFwcGxpZWRJRHMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvblByb21vdGlvbiA9IHt9IGFzIFRyYW5zYWN0aW9uUHJvbW90aW9uO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsnbGluZVByb21vdGlvbiddICYmIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsnbGluZVByb21vdGlvbiddLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10uZm9yRWFjaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHByb21vdGlvbik9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByb21vdGlvbi5wcm9tb3Rpb25JZCA9PT0gYXBwbGllZElEcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJpZ2dlciA9IHt9IGFzIFRyaWdnZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5pdGVtTGluZUlkID0gcHJvbW90aW9uLml0ZW1MaW5lSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5xdWFudGl0eSA9IHByb21vdGlvbi50cmlnZ2VyLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIudG90YWxRdWFudGl0eSA9IHByb21vdGlvbi50cmlnZ2VyLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucHJvbW90aW9uQW1vdW50ID0gcHJvbW90aW9uLnByb21vdGlvbkFtb3VudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLnJlZnVuZGVkUmVhc29uID0gY291cG9uQ29kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLnJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb24gPSBkaXNjb3VudERlc2NyaXB0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucHJvbW90aW9uSWQgPSBwcm9tb3Rpb24ucHJvbW90aW9uSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291cG9uVHJpZ2dlclByb21vdGlvbnMucHVzaCh0cmlnZ2VyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ2xpbmVQcm9tb3Rpb24nXSA9IHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsnbGluZVByb21vdGlvbiddLmZpbHRlcigoeCk9PnguaXRlbUxpbmVJZCAhPT0gcHJvbW90aW9uLml0ZW1MaW5lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY291cG9uVHJpZ2dlclByb21vdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLmRpc3BsYXlUZXh0ID0gY291cG9uVHJpZ2dlclByb21vdGlvbnNbMF0ucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbi5uYW1lID0gY291cG9uVHJpZ2dlclByb21vdGlvbnNbMF0ucmVmdW5kZWRSZWFzb247XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24ucHJvbW90aW9uQW1vdW50ID0gLShjb3Vwb25UcmlnZ2VyUHJvbW90aW9ucy5yZWR1Y2UoKG4sIHsgcHJvbW90aW9uQW1vdW50IH0pID0+IG4gKyBwcm9tb3Rpb25BbW91bnQsIDApKTtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbi5wcm9tb3Rpb25JZCA9IGNvdXBvblRyaWdnZXJQcm9tb3Rpb25zWzBdLnByb21vdGlvbklkO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLnByb21vdGlvbkluZm8gPSBjb3Vwb25UcmlnZ2VyUHJvbW90aW9uc1swXS5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLmNvdXBvbkNvZGUgPSBjb3Vwb25Db2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLml0ZW1MaW5lSWRzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24udHlwZSA9IFBST01PVElPTl9UWVBFLkNPVVBPTjtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbi5zdWJMZXZlbFR5cGUgPSBQUk9NT1RJT05fTEVWRUwuTElORTtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbi50cmlnZ2VyID0gY291cG9uVHJpZ2dlclByb21vdGlvbnM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiV2ViUmV0dXJuTWFwcGVyXCIsIFwidXBkYXRlIExpbmVQcm9tb3Rpb24gV2l0aCBDb3Vwb25cIix0cmFuc2FjdGlvblByb21vdGlvbik7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiYgdHJhbnNhY3Rpb25Qcm9tb3Rpb24ucHJvbW90aW9uSWQgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ucHVzaCh0cmFuc2FjdGlvblByb21vdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVHJhbnNhY3Rpb25Qcm9tb3Rpb25QcnRpb25DYWxjKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocHJvZHVjdDogVFByb2R1Y3QpIHtcclxuICAgICAgICBpZiAoIXByb2R1Y3QuaXRlbURpc2NvdW50cykge1xyXG4gICAgICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMgPSB7XHJcbiAgICAgICAgICAgICAgICB0cm5EaXNjb3VudHNQb3J0aW9uOiAwLFxyXG4gICAgICAgICAgICAgICAgdHJuUHJvbW90aW9uc1BvcnRpb246IDAsXHJcbiAgICAgICAgICAgICAgICByZWZ1bmRQb3J0aW9uOiAwLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvZHVjdDtcclxuICAgIH1cclxuXHJcbiAgICB0cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsYyhcclxuICAgICAgICB0eERvYzogVHJhbnNhY3Rpb25Eb2N1bWVudCxcclxuICAgICAgICBwcm9tb3Rpb246IFRyYW5zYWN0aW9uUHJvbW90aW9uXHJcbiAgICApIHtcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjXCIsXHJcbiAgICAgICAgICAgIGB0cm5zYWN0aW9uUHJvbW90aW9uOiAke0pTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgICAgICAgcHJvbW90aW9uXHJcbiAgICAgICAgICAgICl9YFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHByb21vdGlvbi50eXBlID09PSBQUk9NT1RJT05fVFlQRS5DT1VQT04gJiYgcHJvbW90aW9uLnN1YkxldmVsVHlwZSA9PT0gUFJPTU9USU9OX0xFVkVMLkxJTkUpIHtcclxuICAgICAgICAgICAgdHhEb2MuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3QpID0+IHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3QgPSB0aGlzLnZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW90aW9uLnRyaWdnZXIgJiYgcHJvbW90aW9uLnRyaWdnZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21vdGlvbi50cmlnZ2VyLmZvckVhY2goKHQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXRlbUxpbmVJZCA9PT0gcHJvZHVjdC5pdGVtTGluZUlkLnRvU3RyaW5nKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbiArPSB0LnByb21vdGlvbkFtb3VudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHR4RG9jLmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0ID0gdGhpcy52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocHJvZHVjdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW90aW9uLml0ZW1MaW5lSWRzLmluY2x1ZGVzKCtwcm9kdWN0Lml0ZW1MaW5lSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpc2NvdW50QW1vdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjdEl0ZW0gPSB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uZmluZChwcm9kdWN0SXRlbSA9PiBwcm9kdWN0SXRlbS5za3UgPT09IHByb2R1Y3QuU0tVKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRBbW91bnQgPSBwcm9kdWN0SXRlbS5kaXNjb3VudF9hbW91bnQgPyArcHJvZHVjdEl0ZW0uZGlzY291bnRfYW1vdW50IDogMDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudEFtb3VudCA9IHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5za3UgPT09IHByb2R1Y3QuU0tVICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5kaXNjb3VudF9hbW91bnQgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5kaXNjb3VudF9hbW91bnQgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvblByb21vdGlvblBvcnRpb24gPSBkaXNjb3VudEFtb3VudDtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24gKz0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodHJhbnNhY3Rpb25Qcm9tb3Rpb25Qb3J0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0eERvYztcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVUcmFuc2FjdGlvblByb21vdGlvblBydGlvbkNhbGMoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2godHIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGModGhpcy53ZWJSZXR1cm5PYmplY3QsIHRyKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcclxuICAgICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dFcnJvcih0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVUcmFuc2FjdGlvblByb21vdGlvblBydGlvbkNhbGNcIiwgXCJ1cGRhdGVUcmFuc2FjdGlvblByb21vdGlvblBydGlvbkNhbGMgPT4gZmFpbGVkOlwiLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRldmljZUlkKGRldmljZUlkKSB7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuZGV2aWNlSWQgPSBkZXZpY2VJZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICB0ZXJtaW5hbElkKHRlcm1pbmFsSWQpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC50ZXJtaW5hbElkID0gdGVybWluYWxJZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBvcmdDb2RlKG9yZ0NvZGUpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5vcmdDb2RlID0gb3JnQ29kZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzdG9yZUlkKHN0b3JlSWQpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5zdG9yZUlkID0gc3RvcmVJZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzdG9yZU5vZGVJZChzdG9yZU5vZGVJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3Quc3RvcmVOb2RlSWQgPSBzdG9yZU5vZGVJZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzdG9yZU5vZGVTdHJ1Y3R1cmUoc3RvcmVOb2RlU3RydWN0dXJlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5zdG9yZU5vZGVTdHJ1Y3R1cmUgPSBzdG9yZU5vZGVTdHJ1Y3R1cmU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZG9jSWQoZG9jSWQpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5pZCA9IGRvY0lkO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVVzZXJJRCh1c2VySUQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnVzZXJJZCA9IHVzZXJJRDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVVc2VyTmFtZShuYW1lKSB7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QudXNlck5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLndlYlJldHVybk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUZXh0KG9iaikge1xyXG4gICAgICAgIGlmIChvYmogJiYgb2JqLnRleHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iai50ZXh0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFVUQ0RhdGVUaW1lKGRhdGUpIHtcclxuICAgICAgICBpZiAoZGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSkudG9JU09TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNJblN0b3JlT3JkZXIoKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJpc0luU3RvcmVPcmRlclwiLCBcImlzSW5TdG9yZU9yZGVyIG1hcHBpbmcgc3RhcnRlZC4uLlwiKTsgXHJcbiAgICAgICAgaWYodGhpcy5kb2N1bWVudC5wYXltZW50ICYmIHRoaXMuZG9jdW1lbnQucGF5bWVudC5tZXRob2QgJiYgdGhpcy5kb2N1bWVudC5wYXltZW50Lm1ldGhvZCA9PT0gJ3Bvc19vcmRlcicpe1xyXG4gICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5pc0luU3RvcmVPcmRlciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiaXNJblN0b3JlT3JkZXJcIiwgXCJpc0luU3RvcmVPcmRlciBtYXBwaW5nIGVuZGVkLi4uXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
1
+ import { PROMOTION_LEVEL, PROMOTION_TYPE } from "./mapper-library.model";
2
+ import { NumberUtilService } from "./number-util.service";
3
+ import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
4
+ export class WebReturnMapperBuilderClass {
5
+ constructor(document, currencyPipe) {
6
+ this.currencyPipe = currencyPipe;
7
+ this.className = "WebReturnMapperBuilderClass";
8
+ this.webReturnObject = {
9
+ id: '',
10
+ orgCode: "",
11
+ storeId: "",
12
+ storeNodeId: "",
13
+ storeNodeStructure: "",
14
+ deviceId: "",
15
+ terminalId: "",
16
+ initiatingModule: "",
17
+ export: false,
18
+ isInStoreOrder: false,
19
+ basket: {},
20
+ basketSummary: {},
21
+ baseCurrency: "",
22
+ customer: {
23
+ firstName: '',
24
+ lastName: '',
25
+ email: '',
26
+ postCode: '',
27
+ id: '',
28
+ billingAddress: {},
29
+ shippingAddress: {},
30
+ },
31
+ currentTransactionDetails: {}
32
+ };
33
+ if (document) {
34
+ this.document = document;
35
+ }
36
+ this.numberUtilService = new NumberUtilService(currencyPipe);
37
+ }
38
+ WebReturnMapper() {
39
+ this.webReturnObject['type'] = 'WEB_RETURNS';
40
+ this.webReturnObject['datetime'] = this.getUTCDateTime(this.getText(this.document.updated_at));
41
+ this.webReturnObject.baseCurrency = this.getText(this.document.base_currency_code);
42
+ this.webReturnObject.storeId = this.getText(this.document.store_id);
43
+ this.webReturnObject.subsidiaryId = '1';
44
+ this.webReturnObject.initiatingModule = 'MAGENTO';
45
+ this.webReturnObject.createdAt = this.getUTCDateTime(this.getText(this.document.created_at));
46
+ this.webReturnObject.updatedAt = this.getUTCDateTime(this.getText(this.document.updated_at));
47
+ this.webReturnObject.export = true;
48
+ this.webReturnObject.transCompletedAt = this.getUTCDateTime(this.getText(this.document.updated_at));
49
+ this.webReturnObject['externalTransactionId'] = this.getText(this.document.order_id);
50
+ // customer
51
+ this.webReturnObject['customer']['firstName'] = this.getText(this.document.customer_firstname) || '';
52
+ this.webReturnObject['customer']['lastName'] = this.getText(this.document.customer_lastname) || '';
53
+ this.webReturnObject['customer']['email'] = this.getText(this.document.customer_email) || '';
54
+ this.webReturnObject['customer']['postCode'] = '';
55
+ // Billing address
56
+ this.webReturnObject['customer']['billingAddress']['address1'] = (this.document.billing_address && this.document.billing_address.street) ? this.getText(this.document.billing_address.street) : '';
57
+ this.webReturnObject['customer']['billingAddress']['city'] = (this.document.billing_address && this.document.billing_address.city) ? this.getText(this.document.billing_address.city) : '';
58
+ this.webReturnObject['customer']['billingAddress']['county'] = (this.document.billing_address && this.document.billing_address.region) ? this.getText(this.document.billing_address.region) : '';
59
+ this.webReturnObject['customer']['billingAddress']['postCode'] = (this.document.billing_address && this.document.billing_address.postcode) ? this.getText(this.document.billing_address.postcode) : '';
60
+ this.webReturnObject['customer']['billingAddress']['country'] = (this.document.billing_address && this.document.billing_address.country) ? this.getText(this.document.billing_address.country) : '';
61
+ // Shipping address
62
+ this.webReturnObject['customer']['shippingAddress']['address1'] = (this.document.shipping_address && this.document.shipping_address.street) ? this.getText(this.document.shipping_address.street) : '';
63
+ this.webReturnObject['customer']['shippingAddress']['city'] = (this.document.shipping_address && this.document.shipping_address.city) ? this.getText(this.document.shipping_address.city) : '';
64
+ this.webReturnObject['customer']['shippingAddress']['county'] = (this.document.shipping_address && this.document.shipping_address.region) ? this.getText(this.document.shipping_address.region) : '';
65
+ this.webReturnObject['customer']['shippingAddress']['postCode'] = (this.document.shipping_address && this.document.shipping_address.postcode) ? this.getText(this.document.shipping_address.postcode) : '';
66
+ this.webReturnObject['customer']['shippingAddress']['country'] = (this.document.shipping_address && this.document.shipping_address.country) ? this.getText(this.document.shipping_address.country) : '';
67
+ // basketSummary
68
+ this.webReturnObject.basketSummary['discountTotal'] = Math.abs(Number(this.document.discount_amount ? this.getText(this.document.discount_amount) : 0));
69
+ this.webReturnObject.basketSummary['VATTotal'] = Number(this.document.base_total_paid ? this.getText(this.document.base_total_paid) : 0);
70
+ this.webReturnObject.basketSummary['saleTotal'] = Number(this.document.base_total_invoiced ? this.getText(this.document.base_total_invoiced) : 0);
71
+ this.webReturnObject.basketSummary['basketTotal'] = Number(this.document.base_total_paid ? this.getText(this.document.base_total_paid) : 0);
72
+ this.webReturnObject.basketSummary['totalItems'] = Number(this.document.total_qty_ordered ? this.getText(this.document.total_qty_ordered) : 0);
73
+ this.webReturnObject.basketSummary['refundTotal'] = Number(this.document.base_total_refunded ? this.getText(this.document.base_total_refunded) : 0);
74
+ // // basket line discount
75
+ // this.webReturnObject.basket['lineDiscount'] = [];
76
+ // let lineDiscount = {
77
+ // itemLineId: (this.document.items && this.document.items.item && this.document.items.item.item_id) ? this.getText(this.document.items.item.item_id) : 0,
78
+ // discountAmount: (this.document.items && this.document.items.item && this.document.items.item.discount_amount) ? Number(this.getText(this.document.items.item.discount_amount)) : 0
79
+ // }
80
+ // this.webReturnObject.basket['lineDiscount'].push(lineDiscount);
81
+ // basket transaction discount
82
+ // basket products
83
+ this.webReturnObject.basket['products'] = [];
84
+ this.webReturnObject.basket['linePromotion'] = [];
85
+ this.webReturnObject.basket['transactionDiscount'] = [];
86
+ this.webReturnObject.basket['transactionPromotion'] = [];
87
+ // let transactionDiscount = {
88
+ // discountAmount: (this.document && this.document.discount_amount) ? Number(this.getText(this.document.discount_amount)) : 0
89
+ // }
90
+ // this.webReturnObject.basket['transactionDiscount'].push(transactionDiscount);
91
+ let product = {};
92
+ if (this.document.items && this.document.items.item) {
93
+ if (this.document.items.item instanceof Array) {
94
+ this.document.items.item.forEach((element, index) => {
95
+ let qty = this.getText(element.qty_ordered) ? Number(this.getText(element.qty_ordered)) : 0;
96
+ let refundQty = this.getText(element.qty_refunded) ? Number(this.getText(element.qty_refunded)) : 0;
97
+ let price = this.getText(element.price_incl_tax) ? Number(this.getText(element.price_incl_tax)) : 0;
98
+ product = {
99
+ description: (element.name) ? this.getText(element.name) : '',
100
+ SKU: (element.sku) ? this.getText(element.sku) : '',
101
+ quantity: (element.qty_ordered) ? Number(this.getText(element.qty_ordered)) : 0,
102
+ refundedQuantity: (element.qty_refunded) ? Number(this.getText(element.qty_refunded)) : 0,
103
+ //price: (element.original_price) ? Number(this.getText(element.original_price)) : 0,
104
+ price: price,
105
+ itemLineId: (index + 1).toString(),
106
+ // totalLinePrice: (element.row_invoiced) ? Number(this.getText(element.row_invoiced)) : 0,
107
+ totalLinePrice: ((qty - refundQty) * price),
108
+ };
109
+ let promotionAmount = this.getText(element.discount_amount) ? Number(this.getText(element.discount_amount)) : 0;
110
+ let appliedIDs = this.getText(element.applied_rule_ids) ? this.getText(element.applied_rule_ids) : '';
111
+ if (product && product.price != 0) {
112
+ if (promotionAmount) {
113
+ let trigger = {};
114
+ trigger.itemLineId = product.itemLineId;
115
+ trigger.quantity = product.quantity ? product.quantity : 0;
116
+ let promotion = {
117
+ promotionAmount: promotionAmount,
118
+ promotionId: appliedIDs,
119
+ itemLineId: product.itemLineId,
120
+ promotionLinePrice: product.totalLinePrice - promotionAmount,
121
+ trigger: trigger
122
+ };
123
+ this.webReturnObject.basket['linePromotion'].push(promotion);
124
+ }
125
+ this.webReturnObject.basket['products'].push(product);
126
+ }
127
+ });
128
+ }
129
+ else {
130
+ let qty = (this.document.items && this.document.items.item && this.document.items.item.qty_ordered) ? Number(this.getText(this.document.items.item.qty_ordered)) : 0;
131
+ let refundQty = (this.document.items && this.document.items.item && this.document.items.item.qty_refunded) ? Number(this.getText(this.document.items.item.qty_refunded)) : 0;
132
+ let price = (this.document.items && this.document.items.item && this.document.items.item.price_incl_tax) ? Number(this.getText(this.document.items.item.price_incl_tax)) : 0;
133
+ product = {
134
+ description: (this.document.items && this.document.items.item && this.document.items.item.name) ? this.getText(this.document.items.item.name) : '',
135
+ SKU: (this.document.items && this.document.items.item && this.document.items.item.sku) ? this.getText(this.document.items.item.sku) : '',
136
+ quantity: (this.document.items && this.document.items.item && this.document.items.item.qty_ordered) ? Number(this.getText(this.document.items.item.qty_ordered)) : 0,
137
+ refundedQuantity: (this.document.items && this.document.items.item && this.document.items.item.qty_refunded) ? Number(this.getText(this.document.items.item.qty_refunded)) : 0,
138
+ // price: (this.document.items && this.document.items.item && this.document.items.item.original_price) ? Number(this.getText(this.document.items.item.original_price)) : 0,
139
+ price: price,
140
+ itemLineId: "1",
141
+ // totalLinePrice: (this.document.items && this.document.items.item && this.document.items.item.row_invoiced) ? Number(this.getText(this.document.items.item.row_invoiced)) : 0,
142
+ totalLinePrice: ((qty - refundQty) * price),
143
+ };
144
+ let promotionAmount = this.getText(this.document.items.item.discount_amount) ? Number(this.getText(this.document.items.item.discount_amount)) : 0;
145
+ let appliedIDs = this.getText(this.document.items.item.applied_rule_ids) ? this.getText(this.document.items.item.applied_rule_ids) : '';
146
+ if (product && product.price != 0) {
147
+ if (promotionAmount) {
148
+ let trigger = {};
149
+ trigger.itemLineId = product.itemLineId;
150
+ trigger.quantity = product.quantity ? product.quantity : 0;
151
+ let promotion = {
152
+ promotionAmount: promotionAmount,
153
+ promotionId: appliedIDs,
154
+ itemLineId: product.itemLineId,
155
+ promotionLinePrice: product.totalLinePrice - promotionAmount,
156
+ trigger: trigger
157
+ };
158
+ this.webReturnObject.basket['linePromotion'].push(promotion);
159
+ }
160
+ this.webReturnObject.basket['products'].push(product);
161
+ }
162
+ }
163
+ let couponCode = this.getText(this.document.coupon_code) ? this.getText(this.document.coupon_code) : 0;
164
+ let appliedIDs = this.getText(this.document.applied_rule_ids) ? this.getText(this.document.applied_rule_ids) : '';
165
+ let discountDescription = this.getText(this.document.discount_description) ? this.getText(this.document.discount_description) : '';
166
+ let couponTriggerPromotions = [];
167
+ if (couponCode && appliedIDs) {
168
+ let transactionPromotion = {};
169
+ if (this.webReturnObject.basket['linePromotion'] && this.webReturnObject.basket['linePromotion'].length > 0) {
170
+ this.webReturnObject.basket['linePromotion'].forEach((promotion) => {
171
+ if (promotion.promotionId === appliedIDs) {
172
+ let trigger = {};
173
+ trigger.itemLineId = promotion.itemLineId;
174
+ trigger.quantity = promotion.trigger.quantity;
175
+ trigger.totalQuantity = promotion.trigger.quantity;
176
+ trigger.promotionAmount = promotion.promotionAmount;
177
+ trigger.refundedReason = couponCode;
178
+ trigger.refundedReasonDescription = discountDescription;
179
+ trigger.promotionId = promotion.promotionId;
180
+ couponTriggerPromotions.push(trigger);
181
+ this.webReturnObject.basket['linePromotion'] = this.webReturnObject.basket['linePromotion'].filter((x) => x.itemLineId !== promotion.itemLineId);
182
+ }
183
+ });
184
+ }
185
+ if (couponTriggerPromotions.length > 0) {
186
+ transactionPromotion.displayText = couponTriggerPromotions[0].refundedReasonDescription;
187
+ transactionPromotion.name = couponTriggerPromotions[0].refundedReason;
188
+ transactionPromotion.promotionAmount = -(couponTriggerPromotions.reduce((n, { promotionAmount }) => n + promotionAmount, 0));
189
+ transactionPromotion.promotionId = couponTriggerPromotions[0].promotionId;
190
+ transactionPromotion.promotionInfo = couponTriggerPromotions[0].refundedReasonDescription;
191
+ transactionPromotion.couponCode = couponCode;
192
+ transactionPromotion.itemLineIds = [];
193
+ transactionPromotion.type = PROMOTION_TYPE.COUPON;
194
+ transactionPromotion.subLevelType = PROMOTION_LEVEL.LINE;
195
+ transactionPromotion.trigger = couponTriggerPromotions;
196
+ }
197
+ AppLoggerService.logDebug(this.className, "WebReturnMapper", "update LinePromotion With Coupon", transactionPromotion);
198
+ if (!this.webReturnObject.basket.transactionPromotion) {
199
+ this.webReturnObject.basket.transactionPromotion = [];
200
+ }
201
+ if (transactionPromotion && transactionPromotion.promotionId) {
202
+ this.webReturnObject.basket.transactionPromotion.push(transactionPromotion);
203
+ }
204
+ }
205
+ this.updateTransactionPromotionPrtionCalc();
206
+ }
207
+ return this;
208
+ }
209
+ validateProductItemDiscount(product) {
210
+ if (!product.itemDiscounts) {
211
+ product.itemDiscounts = {
212
+ trnDiscountsPortion: 0,
213
+ trnPromotionsPortion: 0,
214
+ refundPortion: 0,
215
+ };
216
+ }
217
+ return product;
218
+ }
219
+ transactionPromotionProductPortionCalc(txDoc, promotion) {
220
+ AppLoggerService.logDebug(this.className, "transactionPromotionProductPortionCalc", `trnsactionPromotion: ${JSON.stringify(promotion)}`);
221
+ if (promotion.type === PROMOTION_TYPE.COUPON && promotion.subLevelType === PROMOTION_LEVEL.LINE) {
222
+ txDoc.basket.products.forEach((product) => {
223
+ product = this.validateProductItemDiscount(product);
224
+ if (promotion.trigger && promotion.trigger.length > 0) {
225
+ promotion.trigger.forEach((t) => {
226
+ if (t.itemLineId === product.itemLineId.toString()) {
227
+ product.itemDiscounts.trnPromotionsPortion += t.promotionAmount;
228
+ }
229
+ });
230
+ }
231
+ });
232
+ }
233
+ else {
234
+ txDoc.basket.products.forEach((product) => {
235
+ product = this.validateProductItemDiscount(product);
236
+ if (promotion.itemLineIds.includes(+product.itemLineId)) {
237
+ let discountAmount = 0;
238
+ if (this.document.items.item instanceof Array) {
239
+ const productItem = this.document.items.item.find(productItem => productItem.sku === product.SKU);
240
+ discountAmount = productItem.discount_amount ? +productItem.discount_amount : 0;
241
+ }
242
+ else {
243
+ discountAmount = this.document.items.item.sku === product.SKU && this.document.items.item.discount_amount ?
244
+ +this.document.items.item.discount_amount : 0;
245
+ }
246
+ const transactionPromotionPortion = discountAmount;
247
+ product.itemDiscounts.trnPromotionsPortion += this.numberUtilService.trimTo2Decimal2(transactionPromotionPortion);
248
+ }
249
+ });
250
+ }
251
+ return txDoc;
252
+ }
253
+ updateTransactionPromotionPrtionCalc() {
254
+ try {
255
+ if (this.webReturnObject.basket.transactionPromotion && this.webReturnObject.basket.transactionPromotion.length > 0) {
256
+ this.webReturnObject.basket.transactionPromotion.forEach(tr => {
257
+ this.transactionPromotionProductPortionCalc(this.webReturnObject, tr);
258
+ });
259
+ }
260
+ }
261
+ catch (error) {
262
+ AppLoggerService.logError(this.className, "updateTransactionPromotionPrtionCalc", "updateTransactionPromotionPrtionCalc => failed:", error);
263
+ }
264
+ }
265
+ deviceId(deviceId) {
266
+ this.webReturnObject.deviceId = deviceId;
267
+ return this;
268
+ }
269
+ terminalId(terminalId) {
270
+ this.webReturnObject.terminalId = terminalId;
271
+ return this;
272
+ }
273
+ orgCode(orgCode) {
274
+ this.webReturnObject.orgCode = orgCode;
275
+ return this;
276
+ }
277
+ storeId(storeId) {
278
+ this.webReturnObject.storeId = storeId;
279
+ return this;
280
+ }
281
+ storeNodeId(storeNodeId) {
282
+ this.webReturnObject.storeNodeId = storeNodeId;
283
+ return this;
284
+ }
285
+ storeNodeStructure(storeNodeStructure) {
286
+ this.webReturnObject.storeNodeStructure = storeNodeStructure;
287
+ return this;
288
+ }
289
+ docId(docId) {
290
+ this.webReturnObject.id = docId;
291
+ return this;
292
+ }
293
+ updateUserID(userID) {
294
+ this.webReturnObject.userId = userID;
295
+ return this;
296
+ }
297
+ updateUserName(name) {
298
+ this.webReturnObject.userName = name;
299
+ return this;
300
+ }
301
+ build() {
302
+ return this.webReturnObject;
303
+ }
304
+ getText(obj) {
305
+ if (obj && obj.text) {
306
+ return obj.text;
307
+ }
308
+ else {
309
+ return obj;
310
+ }
311
+ }
312
+ getUTCDateTime(date) {
313
+ if (date) {
314
+ return new Date(date).toISOString();
315
+ }
316
+ }
317
+ isInStoreOrder() {
318
+ AppLoggerService.logDebug(this.className, "isInStoreOrder", "isInStoreOrder mapping started...");
319
+ if (this.document.payment && this.document.payment.method && this.document.payment.method === 'pos_order') {
320
+ this.webReturnObject.isInStoreOrder = true;
321
+ }
322
+ AppLoggerService.logDebug(this.className, "isInStoreOrder", "isInStoreOrder mapping ended...");
323
+ return this;
324
+ }
325
+ }
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViUmV0dXJuLW1hcHBlci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hcHBlci1saWJyYXJ5L3NyYy9saWIvV2ViUmV0dXJuLW1hcHBlci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQTJELGVBQWUsRUFBRSxjQUFjLEVBQWtDLE1BQU0sd0JBQXdCLENBQUM7QUFDbEssT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFFdEYsTUFBTSxPQUFPLDJCQUEyQjtJQStCcEMsWUFBWSxRQUFRLEVBQVUsWUFBMkI7UUFBM0IsaUJBQVksR0FBWixZQUFZLENBQWU7UUE5QnpELGNBQVMsR0FBRyw2QkFBNkIsQ0FBQztRQUVsQyxvQkFBZSxHQUF3QjtZQUMzQyxFQUFFLEVBQUUsRUFBRTtZQUNOLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLEVBQUU7WUFDWCxXQUFXLEVBQUUsRUFBRTtZQUNmLGtCQUFrQixFQUFFLEVBQUU7WUFDdEIsUUFBUSxFQUFFLEVBQUU7WUFDWixVQUFVLEVBQUUsRUFBRTtZQUNkLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsTUFBTSxFQUFFLEtBQUs7WUFDYixjQUFjLEVBQUUsS0FBSztZQUNyQixNQUFNLEVBQUUsRUFBRTtZQUNWLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFlBQVksRUFBRSxFQUFFO1lBQ2hCLFFBQVEsRUFBRTtnQkFDTixTQUFTLEVBQUUsRUFBRTtnQkFDYixRQUFRLEVBQUUsRUFBRTtnQkFDWixLQUFLLEVBQUUsRUFBRTtnQkFDVCxRQUFRLEVBQUUsRUFBRTtnQkFDWixFQUFFLEVBQUUsRUFBRTtnQkFDTixjQUFjLEVBQUUsRUFBRTtnQkFDbEIsZUFBZSxFQUFFLEVBQUU7YUFFdEI7WUFDRCx5QkFBeUIsRUFBRSxFQUEr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SUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBQztZQUNyRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDOUM7UUFDRCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQy9GLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMsIFRyYW5zYWN0aW9uRG9jdW1lbnQsIFRyaWdnZXIsIFBST01PVElPTl9MRVZFTCwgUFJPTU9USU9OX1RZUEUsIFRQcm9kdWN0LCBUcmFuc2FjdGlvblByb21vdGlvbiB9IGZyb20gXCIuL21hcHBlci1saWJyYXJ5Lm1vZGVsXCI7XG5pbXBvcnQgeyBOdW1iZXJVdGlsU2VydmljZSB9IGZyb20gXCIuL251bWJlci11dGlsLnNlcnZpY2VcIjtcbmltcG9ydCB7QXBwTG9nZ2VyU2VydmljZX0gZnJvbSAnQHBtY3JldGFpbC9jb21tb24tc2VydmljZXMvY29tbW9uL2FwcC1sb2dnZXIuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBXZWJSZXR1cm5NYXBwZXJCdWlsZGVyQ2xhc3Mge1xuICAgIGNsYXNzTmFtZSA9IFwiV2ViUmV0dXJuTWFwcGVyQnVpbGRlckNsYXNzXCI7XG4gICAgcHJpdmF0ZSBkb2N1bWVudDogYW55O1xuICAgIHByaXZhdGUgd2ViUmV0dXJuT2JqZWN0OiBUcmFuc2FjdGlvbkRvY3VtZW50ID0ge1xuICAgICAgICBpZDogJycsXG4gICAgICAgIG9yZ0NvZGU6IFwiXCIsXG4gICAgICAgIHN0b3JlSWQ6IFwiXCIsXG4gICAgICAgIHN0b3JlTm9kZUlkOiBcIlwiLFxuICAgICAgICBzdG9yZU5vZGVTdHJ1Y3R1cmU6IFwiXCIsXG4gICAgICAgIGRldmljZUlkOiBcIlwiLFxuICAgICAgICB0ZXJtaW5hbElkOiBcIlwiLFxuICAgICAgICBpbml0aWF0aW5nTW9kdWxlOiBcIlwiLFxuICAgICAgICBleHBvcnQ6IGZhbHNlLFxuICAgICAgICBpc0luU3RvcmVPcmRlcjogZmFsc2UsXG4gICAgICAgIGJhc2tldDoge30sXG4gICAgICAgIGJhc2tldFN1bW1hcnk6IHt9LFxuICAgICAgICBiYXNlQ3VycmVuY3k6IFwiXCIsXG4gICAgICAgIGN1c3RvbWVyOiB7XG4gICAgICAgICAgICBmaXJzdE5hbWU6ICcnLFxuICAgICAgICAgICAgbGFzdE5hbWU6ICcnLFxuICAgICAgICAgICAgZW1haWw6ICcnLFxuICAgICAgICAgICAgcG9zdENvZGU6ICcnLFxuICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgYmlsbGluZ0FkZHJlc3M6IHt9LFxuICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzOiB7fSxcblxuICAgICAgICB9LFxuICAgICAgICBjdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzOiB7fSBhcyBDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzXG4gICAgfVxuICAgIG51bWJlclV0aWxTZXJ2aWNlOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgcHJpdmF0ZSBjdXJyZW5jeVBpcGU/OiBDdXJyZW5jeVBpcGUpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZSA9IG5ldyBOdW1iZXJVdGlsU2VydmljZShjdXJyZW5jeVBpcGUpO1xuICAgIH1cblxuICAgIFdlYlJldHVybk1hcHBlcigpIHtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ3R5cGUnXSA9ICdXRUJfUkVUVVJOUyc7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydkYXRldGltZSddID0gdGhpcy5nZXRVVENEYXRlVGltZSh0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC51cGRhdGVkX2F0KSk7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2VDdXJyZW5jeSA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmJhc2VfY3VycmVuY3lfY29kZSk7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnN0b3JlSWQgPSB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5zdG9yZV9pZCk7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnN1YnNpZGlhcnlJZCA9ICcxJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuaW5pdGlhdGluZ01vZHVsZSA9ICdNQUdFTlRPJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuY3JlYXRlZEF0ID0gdGhpcy5nZXRVVENEYXRlVGltZSh0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5jcmVhdGVkX2F0KSk7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnVwZGF0ZWRBdCA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQudXBkYXRlZF9hdCkpO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5leHBvcnQgPSB0cnVlO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC50cmFuc0NvbXBsZXRlZEF0ID0gdGhpcy5nZXRVVENEYXRlVGltZSh0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC51cGRhdGVkX2F0KSk7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydleHRlcm5hbFRyYW5zYWN0aW9uSWQnXSA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lm9yZGVyX2lkKTtcblxuICAgICAgICAvLyBjdXN0b21lclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnZmlyc3ROYW1lJ10gPSB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5jdXN0b21lcl9maXJzdG5hbWUpIHx8ICcnO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnbGFzdE5hbWUnXSA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmN1c3RvbWVyX2xhc3RuYW1lKSB8fCAnJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ2VtYWlsJ10gPSB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5jdXN0b21lcl9lbWFpbCkgfHwgJyc7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydwb3N0Q29kZSddID0gJyc7XG5cbiAgICAgICAgLy8gQmlsbGluZyBhZGRyZXNzXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydiaWxsaW5nQWRkcmVzcyddWydhZGRyZXNzMSddID0gKHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzICYmIHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzLnN0cmVldCkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3Muc3RyZWV0KSA6ICcnO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnYmlsbGluZ0FkZHJlc3MnXVsnY2l0eSddID0gKHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzICYmIHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzLmNpdHkpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzLmNpdHkpIDogJyc7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydiaWxsaW5nQWRkcmVzcyddWydjb3VudHknXSA9ICh0aGlzLmRvY3VtZW50LmJpbGxpbmdfYWRkcmVzcyAmJiB0aGlzLmRvY3VtZW50LmJpbGxpbmdfYWRkcmVzcy5yZWdpb24pID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzLnJlZ2lvbikgOiAnJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ2JpbGxpbmdBZGRyZXNzJ11bJ3Bvc3RDb2RlJ10gPSAodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MucG9zdGNvZGUpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzLnBvc3Rjb2RlKSA6ICcnO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnYmlsbGluZ0FkZHJlc3MnXVsnY291bnRyeSddID0gKHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzICYmIHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzLmNvdW50cnkpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzLmNvdW50cnkpIDogJyc7XG5cbiAgICAgICAgLy8gU2hpcHBpbmcgYWRkcmVzc1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnc2hpcHBpbmdBZGRyZXNzJ11bJ2FkZHJlc3MxJ10gPSAodGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzICYmIHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5zdHJlZXQpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5zdHJlZXQpIDogJyc7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydzaGlwcGluZ0FkZHJlc3MnXVsnY2l0eSddID0gKHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcyAmJiB0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MuY2l0eSkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLmNpdHkpIDogJyc7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydzaGlwcGluZ0FkZHJlc3MnXVsnY291bnR5J10gPSAodGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzICYmIHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5yZWdpb24pID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5yZWdpb24pIDogJyc7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydzaGlwcGluZ0FkZHJlc3MnXVsncG9zdENvZGUnXSA9ICh0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLnBvc3Rjb2RlKSA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MucG9zdGNvZGUpIDogJyc7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydzaGlwcGluZ0FkZHJlc3MnXVsnY291bnRyeSddID0gKHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcyAmJiB0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MuY291bnRyeSkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLmNvdW50cnkpIDogJyc7XG5cbiAgICAgICAgLy8gYmFza2V0U3VtbWFyeSBcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0U3VtbWFyeVsnZGlzY291bnRUb3RhbCddID0gTWF0aC5hYnMoTnVtYmVyKHRoaXMuZG9jdW1lbnQuZGlzY291bnRfYW1vdW50ID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuZGlzY291bnRfYW1vdW50KSA6IDApKTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0U3VtbWFyeVsnVkFUVG90YWwnXSA9IE51bWJlcih0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfcGFpZCA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfcGFpZCkgOiAwKTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0U3VtbWFyeVsnc2FsZVRvdGFsJ10gPSBOdW1iZXIodGhpcy5kb2N1bWVudC5iYXNlX3RvdGFsX2ludm9pY2VkID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYmFzZV90b3RhbF9pbnZvaWNlZCkgOiAwKTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0U3VtbWFyeVsnYmFza2V0VG90YWwnXSA9IE51bWJlcih0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfcGFpZCA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfcGFpZCkgOiAwKTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0U3VtbWFyeVsndG90YWxJdGVtcyddID0gTnVtYmVyKHRoaXMuZG9jdW1lbnQudG90YWxfcXR5X29yZGVyZWQgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC50b3RhbF9xdHlfb3JkZXJlZCkgOiAwKTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0U3VtbWFyeVsncmVmdW5kVG90YWwnXSA9IE51bWJlcih0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfcmVmdW5kZWQgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iYXNlX3RvdGFsX3JlZnVuZGVkKSA6IDApO1xuXG4gICAgICAgIC8vIC8vIGJhc2tldCBsaW5lIGRpc2NvdW50XG4gICAgICAgIC8vIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsnbGluZURpc2NvdW50J10gPSBbXTtcblxuICAgICAgICAvLyBsZXQgbGluZURpc2NvdW50ID0ge1xuICAgICAgICAvLyAgICAgaXRlbUxpbmVJZDogKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5pdGVtX2lkKSA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uaXRlbV9pZCkgOiAwLFxuICAgICAgICAvLyAgICAgZGlzY291bnRBbW91bnQ6ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uZGlzY291bnRfYW1vdW50KSA/IE51bWJlcih0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLmRpc2NvdW50X2Ftb3VudCkpIDogMFxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsnbGluZURpc2NvdW50J10ucHVzaChsaW5lRGlzY291bnQpO1xuXG4gICAgICAgIC8vIGJhc2tldCB0cmFuc2FjdGlvbiBkaXNjb3VudFxuICAgICAgICBcblxuICAgICAgICAvLyBiYXNrZXQgcHJvZHVjdHMgXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsncHJvZHVjdHMnXSA9IFtdO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ2xpbmVQcm9tb3Rpb24nXT1bXTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0Wyd0cmFuc2FjdGlvbkRpc2NvdW50J10gPSBbXTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0Wyd0cmFuc2FjdGlvblByb21vdGlvbiddID0gW107XG5cbiAgICAgICAgLy8gbGV0IHRyYW5zYWN0aW9uRGlzY291bnQgPSB7XG4gICAgICAgIC8vICAgICBkaXNjb3VudEFtb3VudDogKHRoaXMuZG9jdW1lbnQgJiYgdGhpcy5kb2N1bWVudC5kaXNjb3VudF9hbW91bnQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmRpc2NvdW50X2Ftb3VudCkpIDogMFxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsndHJhbnNhY3Rpb25EaXNjb3VudCddLnB1c2godHJhbnNhY3Rpb25EaXNjb3VudCk7XG5cblxuICAgICAgICBsZXQgcHJvZHVjdCA6IGFueT0ge307XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxdHkgPSB0aGlzLmdldFRleHQoZWxlbWVudC5xdHlfb3JkZXJlZCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KGVsZW1lbnQucXR5X29yZGVyZWQpKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWZ1bmRRdHkgPSB0aGlzLmdldFRleHQoZWxlbWVudC5xdHlfcmVmdW5kZWQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dChlbGVtZW50LnF0eV9yZWZ1bmRlZCkpIDogMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByaWNlID0gdGhpcy5nZXRUZXh0KGVsZW1lbnQucHJpY2VfaW5jbF90YXgpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dChlbGVtZW50LnByaWNlX2luY2xfdGF4KSkgOiAwO1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IChlbGVtZW50Lm5hbWUpID8gdGhpcy5nZXRUZXh0KGVsZW1lbnQubmFtZSkgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFNLVTogKGVsZW1lbnQuc2t1KSA/IHRoaXMuZ2V0VGV4dChlbGVtZW50LnNrdSkgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiAoZWxlbWVudC5xdHlfb3JkZXJlZCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KGVsZW1lbnQucXR5X29yZGVyZWQpKSA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZ1bmRlZFF1YW50aXR5OiAoZWxlbWVudC5xdHlfcmVmdW5kZWQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dChlbGVtZW50LnF0eV9yZWZ1bmRlZCkpIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpY2U6IChlbGVtZW50Lm9yaWdpbmFsX3ByaWNlKSA/IE51bWJlcih0aGlzLmdldFRleHQoZWxlbWVudC5vcmlnaW5hbF9wcmljZSkpIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBwcmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUxpbmVJZDogKGluZGV4ICsgMSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvdGFsTGluZVByaWNlOiAoZWxlbWVudC5yb3dfaW52b2ljZWQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dChlbGVtZW50LnJvd19pbnZvaWNlZCkpIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTGluZVByaWNlOiAoKHF0eSAtIHJlZnVuZFF0eSkgKiBwcmljZSksXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uQW1vdW50ID0gdGhpcy5nZXRUZXh0KGVsZW1lbnQuZGlzY291bnRfYW1vdW50KSA/IE51bWJlcih0aGlzLmdldFRleHQoZWxlbWVudC5kaXNjb3VudF9hbW91bnQpKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcHBsaWVkSURzID0gdGhpcy5nZXRUZXh0KGVsZW1lbnQuYXBwbGllZF9ydWxlX2lkcykgPyB0aGlzLmdldFRleHQoZWxlbWVudC5hcHBsaWVkX3J1bGVfaWRzKTonJztcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZHVjdCAmJiBwcm9kdWN0LnByaWNlICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByb21vdGlvbkFtb3VudClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJpZ2dlciA9IHt9IGFzIFRyaWdnZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLml0ZW1MaW5lSWQgPSBwcm9kdWN0Lml0ZW1MaW5lSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eSA/IHByb2R1Y3QucXVhbnRpdHkgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vdGlvbiAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbkFtb3VudDpwcm9tb3Rpb25BbW91bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbklkOmFwcGxpZWRJRHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1MaW5lSWQ6cHJvZHVjdC5pdGVtTGluZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25MaW5lUHJpY2U6IHByb2R1Y3QudG90YWxMaW5lUHJpY2UgLSBwcm9tb3Rpb25BbW91bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6dHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsnbGluZVByb21vdGlvbiddLnB1c2gocHJvbW90aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0Wydwcm9kdWN0cyddLnB1c2gocHJvZHVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcXR5ID0gKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5xdHlfb3JkZXJlZCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5xdHlfb3JkZXJlZCkpIDogMDtcbiAgICAgICAgICAgICAgICBsZXQgcmVmdW5kUXR5ID0gKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5xdHlfcmVmdW5kZWQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucXR5X3JlZnVuZGVkKSkgOiAwO1xuICAgICAgICAgICAgICAgIGxldCBwcmljZSA9ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucHJpY2VfaW5jbF90YXgpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucHJpY2VfaW5jbF90YXgpKSA6IDA7XG4gICAgICAgICAgICAgICAgcHJvZHVjdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ubmFtZSkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLm5hbWUpIDogJycsXG4gICAgICAgICAgICAgICAgICAgIFNLVTogKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5za3UpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5za3UpIDogJycsXG4gICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnF0eV9vcmRlcmVkKSA/IE51bWJlcih0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnF0eV9vcmRlcmVkKSkgOiAwLFxuICAgICAgICAgICAgICAgICAgICByZWZ1bmRlZFF1YW50aXR5OiAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnF0eV9yZWZ1bmRlZCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5xdHlfcmVmdW5kZWQpKSA6IDAsXG4gICAgICAgICAgICAgICAgICAgIC8vIHByaWNlOiAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLm9yaWdpbmFsX3ByaWNlKSA/IE51bWJlcih0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLm9yaWdpbmFsX3ByaWNlKSkgOiAwLFxuICAgICAgICAgICAgICAgICAgICBwcmljZTogcHJpY2UsXG5cbiAgICAgICAgICAgICAgICAgICAgaXRlbUxpbmVJZDogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvdGFsTGluZVByaWNlOiAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnJvd19pbnZvaWNlZCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5yb3dfaW52b2ljZWQpKSA6IDAsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsTGluZVByaWNlOiAoKHF0eSAtIHJlZnVuZFF0eSkgKiBwcmljZSksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uQW1vdW50ID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5kaXNjb3VudF9hbW91bnQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uZGlzY291bnRfYW1vdW50KSkgOiAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBwbGllZElEcyA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uYXBwbGllZF9ydWxlX2lkcykgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLmFwcGxpZWRfcnVsZV9pZHMpOicnO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0ICYmIHByb2R1Y3QucHJpY2UgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJvbW90aW9uQW1vdW50KVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmlnZ2VyID0ge30gYXMgVHJpZ2dlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuaXRlbUxpbmVJZCA9IHByb2R1Y3QuaXRlbUxpbmVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5ID8gcHJvZHVjdC5xdWFudGl0eSA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uICA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uQW1vdW50OnByb21vdGlvbkFtb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uSWQ6YXBwbGllZElEcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUxpbmVJZDpwcm9kdWN0Lml0ZW1MaW5lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbkxpbmVQcmljZTogcHJvZHVjdC50b3RhbExpbmVQcmljZSAtIHByb21vdGlvbkFtb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjp0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10ucHVzaChwcm9tb3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ3Byb2R1Y3RzJ10ucHVzaChwcm9kdWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY291cG9uQ29kZSA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmNvdXBvbl9jb2RlKSA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmNvdXBvbl9jb2RlKSA6IDA7XG4gICAgICAgICAgICBsZXQgYXBwbGllZElEcyA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmFwcGxpZWRfcnVsZV9pZHMpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYXBwbGllZF9ydWxlX2lkcyk6Jyc7XG4gICAgICAgICAgICBsZXQgZGlzY291bnREZXNjcmlwdGlvbiA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmRpc2NvdW50X2Rlc2NyaXB0aW9uKSA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmRpc2NvdW50X2Rlc2NyaXB0aW9uKTonJztcblxuICAgICAgICAgICAgbGV0IGNvdXBvblRyaWdnZXJQcm9tb3Rpb25zID0gW10gYXMgVHJpZ2dlcltdO1xuICAgICAgICAgICAgaWYoY291cG9uQ29kZSAmJiBhcHBsaWVkSURzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvblByb21vdGlvbiA9IHt9IGFzIFRyYW5zYWN0aW9uUHJvbW90aW9uO1xuXG4gICAgICAgICAgICAgICAgaWYodGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10gJiYgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10ubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsnbGluZVByb21vdGlvbiddLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAocHJvbW90aW9uKT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByb21vdGlvbi5wcm9tb3Rpb25JZCA9PT0gYXBwbGllZElEcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmlnZ2VyID0ge30gYXMgVHJpZ2dlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5pdGVtTGluZUlkID0gcHJvbW90aW9uLml0ZW1MaW5lSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucXVhbnRpdHkgPSBwcm9tb3Rpb24udHJpZ2dlci5xdWFudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci50b3RhbFF1YW50aXR5ID0gcHJvbW90aW9uLnRyaWdnZXIucXVhbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucHJvbW90aW9uQW1vdW50ID0gcHJvbW90aW9uLnByb21vdGlvbkFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5yZWZ1bmRlZFJlYXNvbiA9IGNvdXBvbkNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbiA9IGRpc2NvdW50RGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucHJvbW90aW9uSWQgPSBwcm9tb3Rpb24ucHJvbW90aW9uSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdXBvblRyaWdnZXJQcm9tb3Rpb25zLnB1c2godHJpZ2dlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsnbGluZVByb21vdGlvbiddID0gdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10uZmlsdGVyKCh4KT0+eC5pdGVtTGluZUlkICE9PSBwcm9tb3Rpb24uaXRlbUxpbmVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb3Vwb25UcmlnZ2VyUHJvbW90aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLmRpc3BsYXlUZXh0ID0gY291cG9uVHJpZ2dlclByb21vdGlvbnNbMF0ucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24ubmFtZSA9IGNvdXBvblRyaWdnZXJQcm9tb3Rpb25zWzBdLnJlZnVuZGVkUmVhc29uO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbi5wcm9tb3Rpb25BbW91bnQgPSAtKGNvdXBvblRyaWdnZXJQcm9tb3Rpb25zLnJlZHVjZSgobiwgeyBwcm9tb3Rpb25BbW91bnQgfSkgPT4gbiArIHByb21vdGlvbkFtb3VudCwgMCkpO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbi5wcm9tb3Rpb25JZCA9IGNvdXBvblRyaWdnZXJQcm9tb3Rpb25zWzBdLnByb21vdGlvbklkO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbi5wcm9tb3Rpb25JbmZvID0gY291cG9uVHJpZ2dlclByb21vdGlvbnNbMF0ucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24uY291cG9uQ29kZSA9IGNvdXBvbkNvZGU7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLml0ZW1MaW5lSWRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLnR5cGUgPSBQUk9NT1RJT05fVFlQRS5DT1VQT047XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLnN1YkxldmVsVHlwZSA9IFBST01PVElPTl9MRVZFTC5MSU5FO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbi50cmlnZ2VyID0gY291cG9uVHJpZ2dlclByb21vdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiV2ViUmV0dXJuTWFwcGVyXCIsIFwidXBkYXRlIExpbmVQcm9tb3Rpb24gV2l0aCBDb3Vwb25cIix0cmFuc2FjdGlvblByb21vdGlvbik7XG4gICAgXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24gKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiYgdHJhbnNhY3Rpb25Qcm9tb3Rpb24ucHJvbW90aW9uSWQgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLnB1c2godHJhbnNhY3Rpb25Qcm9tb3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVUcmFuc2FjdGlvblByb21vdGlvblBydGlvbkNhbGMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3Q6IFRQcm9kdWN0KSB7XG4gICAgICAgIGlmICghcHJvZHVjdC5pdGVtRGlzY291bnRzKSB7XG4gICAgICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMgPSB7XG4gICAgICAgICAgICAgICAgdHJuRGlzY291bnRzUG9ydGlvbjogMCxcbiAgICAgICAgICAgICAgICB0cm5Qcm9tb3Rpb25zUG9ydGlvbjogMCxcbiAgICAgICAgICAgICAgICByZWZ1bmRQb3J0aW9uOiAwLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvZHVjdDtcbiAgICB9XG5cbiAgICB0cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsYyhcbiAgICAgICAgdHhEb2M6IFRyYW5zYWN0aW9uRG9jdW1lbnQsXG4gICAgICAgIHByb21vdGlvbjogVHJhbnNhY3Rpb25Qcm9tb3Rpb25cbiAgICApIHtcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ0cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsY1wiLFxuICAgICAgICAgICAgYHRybnNhY3Rpb25Qcm9tb3Rpb246ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgcHJvbW90aW9uXG4gICAgICAgICAgICApfWBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHByb21vdGlvbi50eXBlID09PSBQUk9NT1RJT05fVFlQRS5DT1VQT04gJiYgcHJvbW90aW9uLnN1YkxldmVsVHlwZSA9PT0gUFJPTU9USU9OX0xFVkVMLkxJTkUpIHtcbiAgICAgICAgICAgIHR4RG9jLmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByb21vdGlvbi50cmlnZ2VyICYmIHByb21vdGlvbi50cmlnZ2VyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uLnRyaWdnZXIuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXRlbUxpbmVJZCA9PT0gcHJvZHVjdC5pdGVtTGluZUlkLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24gKz0gdC5wcm9tb3Rpb25BbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHhEb2MuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3QpID0+IHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0ID0gdGhpcy52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocHJvZHVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb21vdGlvbi5pdGVtTGluZUlkcy5pbmNsdWRlcygrcHJvZHVjdC5pdGVtTGluZUlkKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlzY291bnRBbW91bnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RJdGVtID0gdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLmZpbmQocHJvZHVjdEl0ZW0gPT4gcHJvZHVjdEl0ZW0uc2t1ID09PSBwcm9kdWN0LlNLVSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudEFtb3VudCA9IHByb2R1Y3RJdGVtLmRpc2NvdW50X2Ftb3VudCA/ICtwcm9kdWN0SXRlbS5kaXNjb3VudF9hbW91bnQgOiAwO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRBbW91bnQgPSB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uc2t1ID09PSBwcm9kdWN0LlNLVSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uZGlzY291bnRfYW1vdW50ID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLmRpc2NvdW50X2Ftb3VudCA6IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb25Qcm9tb3Rpb25Qb3J0aW9uID0gZGlzY291bnRBbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbiArPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0cmFuc2FjdGlvblByb21vdGlvblBvcnRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eERvYztcbiAgICB9XG5cbiAgICB1cGRhdGVUcmFuc2FjdGlvblByb21vdGlvblBydGlvbkNhbGMoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2godHIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKHRoaXMud2ViUmV0dXJuT2JqZWN0LCB0cilcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0Vycm9yKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZVRyYW5zYWN0aW9uUHJvbW90aW9uUHJ0aW9uQ2FsY1wiLCBcInVwZGF0ZVRyYW5zYWN0aW9uUHJvbW90aW9uUHJ0aW9uQ2FsYyA9PiBmYWlsZWQ6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRldmljZUlkKGRldmljZUlkKSB7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmRldmljZUlkID0gZGV2aWNlSWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRlcm1pbmFsSWQodGVybWluYWxJZCkge1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC50ZXJtaW5hbElkID0gdGVybWluYWxJZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb3JnQ29kZShvcmdDb2RlKSB7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0Lm9yZ0NvZGUgPSBvcmdDb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdG9yZUlkKHN0b3JlSWQpIHtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3Quc3RvcmVJZCA9IHN0b3JlSWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHN0b3JlTm9kZUlkKHN0b3JlTm9kZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3Quc3RvcmVOb2RlSWQgPSBzdG9yZU5vZGVJZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc3RvcmVOb2RlU3RydWN0dXJlKHN0b3JlTm9kZVN0cnVjdHVyZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnN0b3JlTm9kZVN0cnVjdHVyZSA9IHN0b3JlTm9kZVN0cnVjdHVyZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZG9jSWQoZG9jSWQpIHtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuaWQgPSBkb2NJZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdXBkYXRlVXNlcklEKHVzZXJJRDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnVzZXJJZCA9IHVzZXJJRDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdXBkYXRlVXNlck5hbWUobmFtZSkge1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC51c2VyTmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWJSZXR1cm5PYmplY3Q7XG4gICAgfVxuXG4gICAgZ2V0VGV4dChvYmopIHtcbiAgICAgICAgaWYgKG9iaiAmJiBvYmoudGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIG9iai50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFVUQ0RhdGVUaW1lKGRhdGUpIHtcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKS50b0lTT1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNJblN0b3JlT3JkZXIoKSB7XG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiaXNJblN0b3JlT3JkZXJcIiwgXCJpc0luU3RvcmVPcmRlciBtYXBwaW5nIHN0YXJ0ZWQuLi5cIik7IFxuICAgICAgICBpZih0aGlzLmRvY3VtZW50LnBheW1lbnQgJiYgdGhpcy5kb2N1bWVudC5wYXltZW50Lm1ldGhvZCAmJiB0aGlzLmRvY3VtZW50LnBheW1lbnQubWV0aG9kID09PSAncG9zX29yZGVyJyl7XG4gICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5pc0luU3RvcmVPcmRlciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJpc0luU3RvcmVPcmRlclwiLCBcImlzSW5TdG9yZU9yZGVyIG1hcHBpbmcgZW5kZWQuLi5cIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiJdfQ==