@pmcretail/mapper-library 0.0.39 → 0.0.43

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