ng-easycommerce 0.0.639 → 0.0.641

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 (25) hide show
  1. package/README.md +5 -0
  2. package/bundles/ng-easycommerce.umd.js +71 -26
  3. package/bundles/ng-easycommerce.umd.js.map +1 -1
  4. package/bundles/ng-easycommerce.umd.min.js +1 -1
  5. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  6. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +8 -1
  7. package/esm2015/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +7 -3
  8. package/esm2015/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.js +23 -3
  9. package/esm2015/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +10 -1
  10. package/esm2015/lib/services/cart.service.js +6 -2
  11. package/esm2015/lib/services/products/product-detail.service.js +23 -22
  12. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +8 -1
  13. package/esm5/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +7 -3
  14. package/esm5/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.js +23 -3
  15. package/esm5/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +10 -1
  16. package/esm5/lib/services/cart.service.js +6 -2
  17. package/esm5/lib/services/products/product-detail.service.js +23 -22
  18. package/fesm2015/ng-easycommerce.js +71 -26
  19. package/fesm2015/ng-easycommerce.js.map +1 -1
  20. package/fesm5/ng-easycommerce.js +71 -26
  21. package/fesm5/ng-easycommerce.js.map +1 -1
  22. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +1 -0
  23. package/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.d.ts +4 -0
  24. package/ng-easycommerce.metadata.json +1 -1
  25. package/package.json +1 -1
@@ -225,18 +225,19 @@ var ProductDetailService = /** @class */ (function () {
225
225
  options && options.forEach(function (option) { return Object.keys(option).forEach(function (key) { return _this.setOption(key, option[key]); }); });
226
226
  };
227
227
  this.generateAsociatedDataFromVariants = function () {
228
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4;
228
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6;
229
229
  var asociated = {};
230
230
  if (_this.isReady()) {
231
231
  asociated.stock = _this.variants[0].stock;
232
232
  // Precio: si viene taxLegendInfo usamos su price, si no el v.price
233
233
  var rawPrice = (_b = (_a = _this.variants[0].taxLegendInfo) === null || _a === void 0 ? void 0 : _a.price, (_b !== null && _b !== void 0 ? _b : _this.variants[0].price));
234
234
  asociated.price = rawPrice.toString();
235
- asociated.saleprice = _this.variants[0].saleprice && _this.variants[0].saleprice.toString() || undefined;
236
- asociated.discount = ((_c = _this.variants[0]) === null || _c === void 0 ? void 0 : _c.discount) || undefined;
235
+ var rawSalePrice = (_d = (_c = _this.variants[0].taxLegendInfo) === null || _c === void 0 ? void 0 : _c.saleprice, (_d !== null && _d !== void 0 ? _d : _this.variants[0].saleprice));
236
+ asociated.saleprice = rawSalePrice ? rawSalePrice.toString() : undefined;
237
+ asociated.discount = ((_e = _this.variants[0]) === null || _e === void 0 ? void 0 : _e.discount) || undefined;
237
238
  asociated.properties = _this.variants[0].properties ? _this.beautifyProperties(_this.variants[0].properties) : undefined;
238
- asociated.uniqueExternalCode = ((_d = _this.variants[0]) === null || _d === void 0 ? void 0 : _d.uniqueExternalCode) || undefined;
239
- asociated.multipleQuantity = ((_e = _this.variants[0]) === null || _e === void 0 ? void 0 : _e.multipleQuantity) || undefined;
239
+ asociated.uniqueExternalCode = ((_f = _this.variants[0]) === null || _f === void 0 ? void 0 : _f.uniqueExternalCode) || undefined;
240
+ asociated.multipleQuantity = ((_g = _this.variants[0]) === null || _g === void 0 ? void 0 : _g.multipleQuantity) || undefined;
240
241
  }
241
242
  else {
242
243
  asociated.price = _this.cratePrice();
@@ -247,31 +248,31 @@ var ProductDetailService = /** @class */ (function () {
247
248
  ('images' in _this.variants[0] && _this.variants[0].images.length > 0)
248
249
  ? asociated.picture = _this.variants[0].images[0]
249
250
  : asociated.picture = (_this.asociatedDataSubject.value.picture || _this.productSubject.value.picturesdefault[0]);
250
- asociated.maximumAmount = ((_f = _this.variants[0]) === null || _f === void 0 ? void 0 : _f.maximumAmount) || 0;
251
- asociated.minimumAmount = ((_g = _this.variants[0]) === null || _g === void 0 ? void 0 : _g.minimumAmount) || 0;
252
- asociated.maximumItemsQuantity = ((_h = _this.variants[0]) === null || _h === void 0 ? void 0 : _h.stock) > 0 && 'maximumItemsQuantity' in _this.variants[0] ? (_j = _this.variants[0]) === null || _j === void 0 ? void 0 : _j.maximumItemsQuantity : (_k = _this.variants[0]) === null || _k === void 0 ? void 0 : _k.stock;
253
- asociated.minimumItemsQuantity = ((_l = _this.variants[0]) === null || _l === void 0 ? void 0 : _l.stock) > 0 && 'minimumItemsQuantity' in _this.variants[0]
254
- && ((_m = _this.variants[0]) === null || _m === void 0 ? void 0 : _m.minimumItemsQuantity) > 0 ? (_o = _this.variants[0]) === null || _o === void 0 ? void 0 : _o.minimumItemsQuantity : (((_p = _this.variants[0]) === null || _p === void 0 ? void 0 : _p.multipleQuantity) ? (_q = _this.variants[0]) === null || _q === void 0 ? void 0 : _q.multipleQuantity : 1);
251
+ asociated.maximumAmount = ((_h = _this.variants[0]) === null || _h === void 0 ? void 0 : _h.maximumAmount) || 0;
252
+ asociated.minimumAmount = ((_j = _this.variants[0]) === null || _j === void 0 ? void 0 : _j.minimumAmount) || 0;
253
+ asociated.maximumItemsQuantity = ((_k = _this.variants[0]) === null || _k === void 0 ? void 0 : _k.stock) > 0 && 'maximumItemsQuantity' in _this.variants[0] ? (_l = _this.variants[0]) === null || _l === void 0 ? void 0 : _l.maximumItemsQuantity : (_m = _this.variants[0]) === null || _m === void 0 ? void 0 : _m.stock;
254
+ asociated.minimumItemsQuantity = ((_o = _this.variants[0]) === null || _o === void 0 ? void 0 : _o.stock) > 0 && 'minimumItemsQuantity' in _this.variants[0]
255
+ && ((_p = _this.variants[0]) === null || _p === void 0 ? void 0 : _p.minimumItemsQuantity) > 0 ? (_q = _this.variants[0]) === null || _q === void 0 ? void 0 : _q.minimumItemsQuantity : (((_r = _this.variants[0]) === null || _r === void 0 ? void 0 : _r.multipleQuantity) ? (_s = _this.variants[0]) === null || _s === void 0 ? void 0 : _s.multipleQuantity : 1);
255
256
  asociated.finalConsumer = {
256
- finalConsumerPrice: (_r = _this.variants[0]) === null || _r === void 0 ? void 0 : _r.final_consumer_price,
257
- originalFinalConsumerPrice: (_s = _this.variants[0]) === null || _s === void 0 ? void 0 : _s.original_final_consumer_price,
257
+ finalConsumerPrice: (_t = _this.variants[0]) === null || _t === void 0 ? void 0 : _t.final_consumer_price,
258
+ originalFinalConsumerPrice: (_u = _this.variants[0]) === null || _u === void 0 ? void 0 : _u.original_final_consumer_price,
258
259
  };
259
260
  asociated.taxes = {
260
- taxIncluded: (_t = _this.variants[0]) === null || _t === void 0 ? void 0 : _t.taxIncluded,
261
- taxCategory: (_u = _this.variants[0]) === null || _u === void 0 ? void 0 : _u.taxCategory,
261
+ taxIncluded: (_v = _this.variants[0]) === null || _v === void 0 ? void 0 : _v.taxIncluded,
262
+ taxCategory: (_w = _this.variants[0]) === null || _w === void 0 ? void 0 : _w.taxCategory,
262
263
  };
263
264
  // Segun version del backend
264
- if ((_v = _this.variants[0]) === null || _v === void 0 ? void 0 : _v.taxLegendInfo) {
265
+ if ((_x = _this.variants[0]) === null || _x === void 0 ? void 0 : _x.taxLegendInfo) {
265
266
  // Nuevo backend
266
- asociated.priceWithoutTaxes = (_w = _this.variants[0]) === null || _w === void 0 ? void 0 : _w.taxLegendInfo.priceWithoutTaxes;
267
- asociated.taxeAmount = (_x = _this.variants[0]) === null || _x === void 0 ? void 0 : _x.taxLegendInfo.taxes;
268
- asociated.taxRate = (_y = _this.variants[0]) === null || _y === void 0 ? void 0 : _y.taxLegendInfo.taxRate;
267
+ asociated.priceWithoutTaxes = (_y = _this.variants[0]) === null || _y === void 0 ? void 0 : _y.taxLegendInfo.priceWithoutTaxes;
268
+ asociated.taxeAmount = (_z = _this.variants[0]) === null || _z === void 0 ? void 0 : _z.taxLegendInfo.taxes;
269
+ asociated.taxRate = (_0 = _this.variants[0]) === null || _0 === void 0 ? void 0 : _0.taxLegendInfo.taxRate;
269
270
  }
270
271
  else {
271
272
  // Backend antiguo
272
- asociated.priceWithoutTaxes = (_0 = (_z = _this.variants[0]) === null || _z === void 0 ? void 0 : _z.priceWithoutTaxes, (_0 !== null && _0 !== void 0 ? _0 : undefined));
273
- asociated.taxeAmount = (_2 = (_1 = _this.variants[0]) === null || _1 === void 0 ? void 0 : _1.taxes, (_2 !== null && _2 !== void 0 ? _2 : undefined));
274
- asociated.taxRate = (_4 = (_3 = _this.variants[0]) === null || _3 === void 0 ? void 0 : _3.taxRate, (_4 !== null && _4 !== void 0 ? _4 : undefined));
273
+ asociated.priceWithoutTaxes = (_2 = (_1 = _this.variants[0]) === null || _1 === void 0 ? void 0 : _1.priceWithoutTaxes, (_2 !== null && _2 !== void 0 ? _2 : undefined));
274
+ asociated.taxeAmount = (_4 = (_3 = _this.variants[0]) === null || _3 === void 0 ? void 0 : _3.taxes, (_4 !== null && _4 !== void 0 ? _4 : undefined));
275
+ asociated.taxRate = (_6 = (_5 = _this.variants[0]) === null || _5 === void 0 ? void 0 : _5.taxRate, (_6 !== null && _6 !== void 0 ? _6 : undefined));
275
276
  }
276
277
  _this.asociatedDataSubject.next(asociated);
277
278
  };
@@ -524,4 +525,4 @@ var ProductDetailService = /** @class */ (function () {
524
525
  return ProductDetailService;
525
526
  }());
526
527
  export { ProductDetailService };
527
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUF5QixNQUFNLE1BQU0sQ0FBQztBQUU5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd0RDtJQWNJLDhCQUNZLGVBQWdDLEVBQVUsV0FBd0IsRUFBVSxhQUEyQixFQUN2RyxTQUFvQixFQUFTLGdCQUFrQyxFQUFTLGVBQWdDO1FBRnBILGlCQUdDO1FBRlcsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUN2RyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFTLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQWQ1RyxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFVLEVBQUUsQ0FBQyxDQUFDO1FB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QUksQ0FBQyxVQUFBLEVBQUU7WUFDekUsT0FBQSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDO1FBQTVELENBQTRELENBQUMsQ0FBQTtJQUNyRSxDQUFDOztnQkF2YzRCLGVBQWU7Z0JBQXVCLFdBQVc7Z0JBQXlCLFlBQVk7Z0JBQzVGLFNBQVM7Z0JBQTJCLGdCQUFnQjtnQkFBMEIsZUFBZTs7SUFoQjNHLG9CQUFvQjtRQURoQyxVQUFVLEVBQUU7T0FDQSxvQkFBb0IsQ0FvZWhDO0lBQUQsMkJBQUM7Q0FBQSxBQXBlRCxJQW9lQztTQXBlWSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIHBhcnRpdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcHJvZHVjdCc7XG5pbXBvcnQgeyBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICcuL3Byb2R1Y3RzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi8uLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgXyBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vYW5hbHl0aWNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGFyYW1zSW50ZXJmYWNlcy9wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50JztcbmltcG9ydCB7IEN1cnJlbmN5U2VydmljZSB9IGZyb20gJy4uL2N1cnJlbmN5LnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHJvZHVjdERldGFpbFNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBwcm9kdWN0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJvZHVjdD4oe30pO1xuICAgIHByaXZhdGUgb3B0aW9uc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xuICAgIHByaXZhdGUgYXNvY2lhdGVkRGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oeyBwcmljZTogJycsIHN0b2NrOiAwLCBwaWN0dXJlOiAnJyB9KTtcblxuICAgIHByaXZhdGUgdmFyaWFudHMgPSBbXVxuXG4gICAgcHVibGljIHByb2R1Y3QkID0gdGhpcy5wcm9kdWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgb3B0aW9ucyQgPSB0aGlzLm9wdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBhc29jaWF0ZWREYXRhJCA9IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHJpdmF0ZSBjdXJyZW50VG90YWxBbW91bnQ6IG51bWJlcjtcbiAgICBwcml2YXRlIGJhbGFuY2VDdXN0b21lcjogYW55ID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHByb2R1Y3RzU2VydmljZTogUHJvZHVjdHNTZXJ2aWNlLCBwcml2YXRlIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSwgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY29uc3RhbnRzOiBDb25zdGFudHMsIHB1YmxpYyBhbmFseXRpY3NTZXJ2aWNlOiBBbmFseXRpY3NTZXJ2aWNlLCBwdWJsaWMgY3VycmVuY3lTZXJ2aWNlOiBDdXJyZW5jeVNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSBjb2RlIElkZW50aWZpY2Fkb3IgZGVsIHByb2R1Y3RvXG4gICAgKiBAcGFyYW0gdmFyaWFudCBJbmRpY2Egc2kgc2UgZXN0w6Egc29saWNpdGFuZG8gdW4gcHJvZHVjdG8gcG9yIHN1IGNvZGlnbywgbyBwb3IgZWwgY29kaWdvIGNvcnJlc3BvbmRpZW50ZSBhIHVuYSBkZSBzdXMgdmFyaWFudGVzXG4gICAgKiAgXG4gICAgKiBDYXJnYSBlbCBwcm9kdWN0byBzb2xpY2l0YWRvIGFzeW5jcm9uaWNhbWVudGUgc2luIHJlc3B1ZXN0YSBcbiAgICAqL1xuICAgIGxvYWRQcm9kdWN0ID0gKGNvZGUsIHZhcmlhbnQ6IGJvb2xlYW4gPSBmYWxzZSkgPT5cbiAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0U3BlY2lmaWNQcm9kdWN0KGNvZGUsIHZhcmlhbnQpLnRvUHJvbWlzZSgpLnRoZW4oXG4gICAgICAgICAgICByZXMgPT4gdmFyaWFudCA/IHRoaXMuaW5pdGlhbGl6ZShyZXMsIGNvZGUpIDogdGhpcy5pbml0aWFsaXplKHJlcyksXG4gICAgICAgICAgICBlcnIgPT4gdGhpcy5wcm9kdWN0U3ViamVjdC5uZXh0KG51bGwpXG4gICAgICAgIClcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9kdWN0X2lkIElkZW50aWZpY2Fkb3IgZGVsIHByb2R1Y3RvXG4gICAgICogQHBhcmFtIHZhcmlhbnQgSW5kaWNhIHNpIHNlIGVzdMOhIHNvbGljaXRhbmRvIHVuIHByb2R1Y3RvIHBvciBzdSBjb2RpZ28sIG8gcG9yIGVsIGNvZGlnbyBjb3JyZXNwb25kaWVudGUgYSB1bmEgZGUgc3VzIHZhcmlhbnRlc1xuICAgICAqIEBhc3luY1xuICAgICAqICBcbiAgICAgKiBBIGRpZmVyZW5jaWEgZGVsIG1ldG9kbyBsb2FkUHJvZHVjdCwgZXN0ZSByZXRvcm5hIHVuIHZhbG9yIGN1YW5kbyB0ZXJtaW5hIFxuICAgICAqL1xuICAgIGdldFByb2R1Y3QgPSBhc3luYyAocHJvZHVjdF9pZCwgdmFyaWFudDogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRTcGVjaWZpY1Byb2R1Y3QocHJvZHVjdF9pZCwgdmFyaWFudCkudG9Qcm9taXNlKCk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8IHJlc3VsdC5lcnJvcikgdGhpcy5wcm9kdWN0U3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICBlbHNlIHZhcmlhbnQgPyB0aGlzLmluaXRpYWxpemUocmVzdWx0LCBwcm9kdWN0X2lkKSA6IHRoaXMuaW5pdGlhbGl6ZShyZXN1bHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemUgPSAocHJvZHVjdCwgdmFyaWFudF9jb2RlPykgPT4ge1xuICAgICAgICB0aGlzLnByb2R1Y3RTdWJqZWN0Lm5leHQocHJvZHVjdCk7XG4gICAgICAgIHRoaXMub3B0aW9uc1N1YmplY3QubmV4dCh0aGlzLmdldE9wdGlvbnMoKSlcbiAgICAgICAgdmFyaWFudF9jb2RlID8gdGhpcy51cGRhdGVWYXJpYW50cyh2YXJpYW50X2NvZGUpIDogdGhpcy51cGRhdGVWYXJpYW50cygpO1xuICAgICAgICB0aGlzLnZhcmlhbnRzLmxlbmd0aCAmJiB0aGlzLmdlbmVyYXRlQXNvY2lhdGVkRGF0YUZyb21WYXJpYW50cygpO1xuICAgICAgICB0aGlzLmZldGNoQ2FydERhdGEoKVxuICAgICAgICAvL3RoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3ZpZXdfaXRlbScsIHsgLi4ucHJvZHVjdCwgY3VycmVuY3k6IHRoaXMuY29uc3RhbnRzLmN1cnJlbmN5LmNvZGUgfSlcbiAgICAgICAgLy8gdmFyaWFudF9jb2RlICYmIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3ZpZXdfaXRlbScsIHsgLi4ucHJvZHVjdCwgY3VycmVuY3k6IHRoaXMuY29uc3RhbnRzLmN1cnJlbmN5LmNvZGUgfSlcbiAgICB9XG5cbiAgICBzZXRQcm9kdWN0ID0gKHByb2R1Y3QpID0+IHRoaXMuaXNQcm9kdWN0VmFsaWQocHJvZHVjdCkgJiYgdGhpcy5pbml0aWFsaXplKHByb2R1Y3QpO1xuXG4gICAgaXNSZWFkeSA9ICgpID0+IHRoaXMudmFyaWFudHMubGVuZ3RoID09IDE7XG5cbiAgICBzZXRPcHRpb24gPSAob3B0aW9uX2NvZGUsIG9wdGlvbl92YWx1ZSkgPT4ge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMub3B0aW9uc1N1YmplY3QudmFsdWU7XG4gICAgICAgIGxldCBvcHRpb24gPSBvcHRpb25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LmNvZGUgPT0gb3B0aW9uX2NvZGUpLnZhbHVlcy5maW5kKHZhbHVlID0+IHZhbHVlLm5hbWUgPT0gb3B0aW9uX3ZhbHVlKTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gIW9wdGlvbi5zZWxlY3RlZDtcbiAgICAgICAgb3B0aW9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5jb2RlID09IG9wdGlvbl9jb2RlKS52YWx1ZXMuZm9yRWFjaChcbiAgICAgICAgICAgIHZhbHVlID0+IHsgaWYgKHZhbHVlLm5hbWUgIT0gb3B0aW9uLm5hbWUpIHZhbHVlLnNlbGVjdGVkID0gZmFsc2UgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLm9wdGlvbnNTdWJqZWN0Lm5leHQob3B0aW9ucyk7XG4gICAgICAgIHRoaXMudXBkYXRlVmFyaWFudHMoKTtcbiAgICAgICAgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gSGFiaWxpdGFyIHRvZG9zIGxvcyBib3RvbmVzIGNvbiBsYSBjbGFzZSAnYWRkQ2FydEJ1dHRvbidcbiAgICAgICAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWRkQ2FydEJ1dHRvbicpO1xuICAgICAgICAgICAgc3VibWl0QnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XG4gICAgICAgICAgICAgICAgKGJ1dHRvbiBhcyBIVE1MQnV0dG9uRWxlbWVudCkuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdzZWxlY3Rpb24tbm90LWF2YWlsYWJsZScpO1xuXG4gICAgICAgICAgICAvLyBEZXNoYWJpbGl0YXIgdG9kb3MgbG9zIGJvdG9uZXMgY29uIGxhIGNsYXNlICdzdWJtaXQtYnV0dG9uJ1xuICAgICAgICAgICAgY29uc3Qgc3VibWl0QnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hZGRDYXJ0QnV0dG9uJyk7XG4gICAgICAgICAgICBzdWJtaXRCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcbiAgICAgICAgICAgICAgICAoYnV0dG9uIGFzIEhUTUxCdXR0b25FbGVtZW50KS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgY2hhbmdlUGljdHVyZSA9IChwaWN0dXJlKSA9PiB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZTtcbiAgICAgICAgZGF0YS5waWN0dXJlID0gcGljdHVyZTtcbiAgICAgICAgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC5uZXh0KGRhdGEpO1xuICAgIH1cblxuICAgIGhhbmRsZUVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIFdoYXRoZXZlciB3ZSBuZWVkIHRvIGRvIHdpdGggZXJyb3JcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gYWdyZWdhL2FjdHVhbGl6YSB1biBpdGVtIGVuIGVsIGNhcnJpdG8gXG4gICAgICogQHBhcmFtIHF1YW50aXR5IGNhbnRpZGFkIGEgYWdyZWdhclxuICAgICAqIEBwYXJhbSB2YXJpYW50X2NvZGUgKioob3BjaW9uYWwpKiogY29kaWdvIGRlIGxhIHZhcmlhbnRlIHNlbGVjY2lvbmFkYSBkZWwgcHJvZHVjdG8uXG4gICAgICogQHBhcmFtIGNvbW1lbnRzICoqKG9wY2lvbmFsKSoqIGNvbWVudGFyaW8gcGVyc29uYWxpemFkbyBkZWwgY2xpZW50ZS5cbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBhZGRUb0NhcnQocXVhbnRpdHksIHZhcmlhbnRfY29kZT86IHN0cmluZywgY29tbWVudHM/OiBzdHJpbmcpIHtcbiAgICAgICAgcXVhbnRpdHkgPSBwYXJzZUludChxdWFudGl0eSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2NhbnQtYnV5Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJvZHVjdF9zZWxlY3RlZCA9IF8uY2xvbmUodGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZSk7XG4gICAgICAgIGxldCB2YXJpYW50OiBhbnk7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnZhcmlhbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCduby12YXJpYW50cycpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUuc3RvY2sgPT0gMFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2snKVxuICAgICAgICAgICAgICAgICAgICA6IHZhcmlhbnQgPSB0aGlzLnZhcmlhbnRzWzBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFudF9jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSB0aGlzLnZhcmlhbnRzLmZpbmQodmFyaWFudCA9PiB2YXJpYW50LmNvZGUgPT09IHZhcmlhbnRfY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYW50LnN0b2NrID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2snKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygndmFyaWFudHMtbGVmdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFyaWFudCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVRdWFudGl0eShxdWFudGl0eSwgdmFyaWFudC5jb2RlKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHByaWNlVG9WYWxpZGF0ZSA9IHByb2R1Y3Rfc2VsZWN0ZWQuc2FsZXByaWNlXG4gICAgICAgICAgICA/IHByb2R1Y3Rfc2VsZWN0ZWQuc2FsZXByaWNlICogcXVhbnRpdHlcbiAgICAgICAgICAgIDogcHJvZHVjdF9zZWxlY3RlZC5wcmljZSAqIHF1YW50aXR5O1xuXG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyhwcmljZVRvVmFsaWRhdGUpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcHJvZHVjdCA9IHRoaXMubWFrZUFmZm9yZGFibGVQcm9kdWN0KHByb2R1Y3Rfc2VsZWN0ZWQpO1xuXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkVG9DYXJ0KHByb2R1Y3QsIHF1YW50aXR5LCB2YXJpYW50LmNvZGUsIGNvbW1lbnRzKTtcbiAgICB9O1xuXG5cblxuICAgIGFkZFRvQ2FydFByb21pc2UgPSBhc3luYyAocXVhbnRpdHkpID0+IHtcbiAgICAgICAgcXVhbnRpdHkgPSBwYXJzZUludChxdWFudGl0eSk7XG4gICAgICAgIGlmICghdGhpcy52YXJpYW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnY2FudC1idXknIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByb2R1Y3Rfc2VsZWN0ZWQgPSBfLmNsb25lKHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUpO1xuICAgICAgICBpZiAodGhpcy52YXJpYW50cy5sZW5ndGggPiAxIHx8IHRoaXMudmFyaWFudHMubGVuZ3RoID09IDAgfHwgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5zdG9jayA9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YXJpYW50cy5sZW5ndGggPT0gMCkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICduby12YXJpYW50cycgfTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID4gMSAmJiB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID4gMCkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICd2YXJpYW50cy1sZWZ0JyB9O1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YXJpYW50cy5sZW5ndGggIT0gMCAmJiB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID09IDApIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnb3V0LW9mLXN0b2NrJyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVF1YW50aXR5KHF1YW50aXR5KSkgcmV0dXJuO1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0NhcnRQcm9taXNlKHRoaXMubWFrZUFmZm9yZGFibGVQcm9kdWN0KHByb2R1Y3Rfc2VsZWN0ZWQpLCBxdWFudGl0eSwgdGhpcy52YXJpYW50c1swXS5jb2RlKTtcbiAgICAgICAgcmV0dXJuIChyZXN1bHQgJiYgIShyZXN1bHQuZXJyb3IpKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zID0gKHByb2R1Y3RfcmVjZWl2ZWQ/OiBQcm9kdWN0KSA9PiB7XG4gICAgICAgIGxldCBwcm9kdWN0ID0gcHJvZHVjdF9yZWNlaXZlZCB8fCB0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IFtdO1xuICAgICAgICBwcm9kdWN0Lm9wdGlvbnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLnRvT3B0aW9uKGVsZW1lbnQpKTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b09wdGlvbiA9IChwcmVvcHRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHByZW9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgIGNvZGU6IHByZW9wdGlvbi5jb2RlLFxuICAgICAgICAgICAgdHlwZTogcHJlb3B0aW9uLnR5cGUsXG4gICAgICAgICAgICB2YWx1ZXM6IHByZW9wdGlvbi52YWx1ZXMubWFwKHZhbHVlID0+ICh7IG5hbWU6IHZhbHVlLmNvZGUsIGRlc2NyaXB0aW9uOiB2YWx1ZS5uYW1lLCBpbWFnZTogdmFsdWUuaW1hZ2UsIG1vYmlsZUltYWdlOiB2YWx1ZS5tb2JpbGVJbWFnZSwgc2VsZWN0ZWQ6IGZhbHNlIH0pKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlQWZmb3JkYWJsZVByb2R1Y3QocHJvZHVjdF9zZWxlY3RlZDogUHJvZHVjdCkge1xuICAgICAgICBwcm9kdWN0X3NlbGVjdGVkLnByaWNlID0gcGFyc2VGbG9hdCh0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnByaWNlKTtcbiAgICAgICAgcHJvZHVjdF9zZWxlY3RlZC5zYWxlcHJpY2UgPSBwYXJzZUZsb2F0KHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUucHJpY2UpO1xuICAgICAgICBwcm9kdWN0X3NlbGVjdGVkLm9wdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy52YXJpYW50c1swXS5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHByb2R1Y3Rfc2VsZWN0ZWQub3B0aW9ucyA9IHsgLi4ucHJvZHVjdF9zZWxlY3RlZC5vcHRpb25zLCAuLi5vcHRpb24gfSlcbiAgICAgICAgcmV0dXJuIHByb2R1Y3Rfc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYXJpYW50cyA9IChjb2RlPykgPT4ge1xuICAgICAgICBsZXQgdmFyaWFudHMgPSB0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlLnZhcmlhbnRzO1xuICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1N1YmplY3QudmFsdWUuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgICAgIG9wdGlvbi52YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHMgPSB2YXJpYW50cy5maWx0ZXIodmFyaWFudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhbnQub3B0aW9ucy5zb21lKHZhcmlhbnRfb3B0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcHRpb24uY29kZSBpbiB2YXJpYW50X29wdGlvbiAmJiB2YXJpYW50X29wdGlvbltvcHRpb24uY29kZV0gPT0gdmFsdWUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhcmlhbnRzID0gdmFyaWFudHMuZmlsdGVyKHZhcmlhbnQgPT4gdmFyaWFudC5jb2RlID09IGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFyaWFudHMgPSB2YXJpYW50cztcbiAgICAgICAgY29kZSAmJiB0aGlzLnVwZGF0ZU9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU9wdGlvbnMgPSAoKSA9PiB7XG4gICAgICAgIGxldCB7IG9wdGlvbnMgfSA9IHRoaXMudmFyaWFudHMubGVuZ3RoICYmIHRoaXMudmFyaWFudHNbMF07XG4gICAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiBPYmplY3Qua2V5cyhvcHRpb24pLmZvckVhY2goa2V5ID0+IHRoaXMuc2V0T3B0aW9uKGtleSwgb3B0aW9uW2tleV0pKSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlQXNvY2lhdGVkRGF0YUZyb21WYXJpYW50cyA9ICgpID0+IHtcbiAgICAgICAgbGV0IGFzb2NpYXRlZDogYW55ID0ge307XG4gICAgICAgIGlmICh0aGlzLmlzUmVhZHkoKSkge1xuICAgICAgICAgICAgYXNvY2lhdGVkLnN0b2NrID0gdGhpcy52YXJpYW50c1swXS5zdG9ja1xuICAgICAgICAgICAgLy8gUHJlY2lvOiBzaSB2aWVuZSB0YXhMZWdlbmRJbmZvIHVzYW1vcyBzdSBwcmljZSwgc2kgbm8gZWwgdi5wcmljZVxuICAgICAgICAgICAgY29uc3QgcmF3UHJpY2UgPSB0aGlzLnZhcmlhbnRzWzBdLnRheExlZ2VuZEluZm8/LnByaWNlID8/IHRoaXMudmFyaWFudHNbMF0ucHJpY2U7XG4gICAgICAgICAgICBhc29jaWF0ZWQucHJpY2UgPSByYXdQcmljZS50b1N0cmluZygpO1xuICAgICAgICAgICAgYXNvY2lhdGVkLnNhbGVwcmljZSA9IHRoaXMudmFyaWFudHNbMF0uc2FsZXByaWNlICYmIHRoaXMudmFyaWFudHNbMF0uc2FsZXByaWNlLnRvU3RyaW5nKCkgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXNvY2lhdGVkLmRpc2NvdW50ID0gdGhpcy52YXJpYW50c1swXT8uZGlzY291bnQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXNvY2lhdGVkLnByb3BlcnRpZXMgPSB0aGlzLnZhcmlhbnRzWzBdLnByb3BlcnRpZXMgPyB0aGlzLmJlYXV0aWZ5UHJvcGVydGllcyh0aGlzLnZhcmlhbnRzWzBdLnByb3BlcnRpZXMpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXNvY2lhdGVkLnVuaXF1ZUV4dGVybmFsQ29kZSA9IHRoaXMudmFyaWFudHNbMF0/LnVuaXF1ZUV4dGVybmFsQ29kZSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBhc29jaWF0ZWQubXVsdGlwbGVRdWFudGl0eSA9IHRoaXMudmFyaWFudHNbMF0/Lm11bHRpcGxlUXVhbnRpdHkgfHwgdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNvY2lhdGVkLnByaWNlID0gdGhpcy5jcmF0ZVByaWNlKClcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zYWxlcHJpY2UgPSB0aGlzLmNyYXRlU2FsZVByaWNlKClcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zdG9jayA9ICh0aGlzLnZhcmlhbnRzLm1hcCh2YXJpYW50ID0+IHZhcmlhbnQuc3RvY2spKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKVxuICAgICAgICAgICAgYXNvY2lhdGVkLmRpc2NvdW50ID0gdGhpcy5jcmF0ZURpc2NvdW50KClcbiAgICAgICAgfVxuXG4gICAgICAgICgnaW1hZ2VzJyBpbiB0aGlzLnZhcmlhbnRzWzBdICYmIHRoaXMudmFyaWFudHNbMF0uaW1hZ2VzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICA/IGFzb2NpYXRlZC5waWN0dXJlID0gdGhpcy52YXJpYW50c1swXS5pbWFnZXNbMF1cbiAgICAgICAgICAgIDogYXNvY2lhdGVkLnBpY3R1cmUgPSAodGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5waWN0dXJlIHx8IHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUucGljdHVyZXNkZWZhdWx0WzBdKTtcblxuXG4gICAgICAgIGFzb2NpYXRlZC5tYXhpbXVtQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8ubWF4aW11bUFtb3VudCB8fCAwXG4gICAgICAgIGFzb2NpYXRlZC5taW5pbXVtQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8ubWluaW11bUFtb3VudCB8fCAwXG5cbiAgICAgICAgYXNvY2lhdGVkLm1heGltdW1JdGVtc1F1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8uc3RvY2sgPiAwICYmICdtYXhpbXVtSXRlbXNRdWFudGl0eScgaW4gdGhpcy52YXJpYW50c1swXSA/IHRoaXMudmFyaWFudHNbMF0/Lm1heGltdW1JdGVtc1F1YW50aXR5IDogdGhpcy52YXJpYW50c1swXT8uc3RvY2tcbiAgICAgICAgYXNvY2lhdGVkLm1pbmltdW1JdGVtc1F1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8uc3RvY2sgPiAwICYmICdtaW5pbXVtSXRlbXNRdWFudGl0eScgaW4gdGhpcy52YXJpYW50c1swXVxuICAgICAgICAgICAgJiYgdGhpcy52YXJpYW50c1swXT8ubWluaW11bUl0ZW1zUXVhbnRpdHkgPiAwID8gdGhpcy52YXJpYW50c1swXT8ubWluaW11bUl0ZW1zUXVhbnRpdHlcbiAgICAgICAgICAgIDogKHRoaXMudmFyaWFudHNbMF0/Lm11bHRpcGxlUXVhbnRpdHkgPyB0aGlzLnZhcmlhbnRzWzBdPy5tdWx0aXBsZVF1YW50aXR5IDogMSlcblxuICAgICAgICBhc29jaWF0ZWQuZmluYWxDb25zdW1lciA9IHtcbiAgICAgICAgICAgIGZpbmFsQ29uc3VtZXJQcmljZTogdGhpcy52YXJpYW50c1swXT8uZmluYWxfY29uc3VtZXJfcHJpY2UsXG4gICAgICAgICAgICBvcmlnaW5hbEZpbmFsQ29uc3VtZXJQcmljZTogdGhpcy52YXJpYW50c1swXT8ub3JpZ2luYWxfZmluYWxfY29uc3VtZXJfcHJpY2UsXG4gICAgICAgIH1cblxuICAgICAgICBhc29jaWF0ZWQudGF4ZXMgPSB7XG4gICAgICAgICAgICB0YXhJbmNsdWRlZDogdGhpcy52YXJpYW50c1swXT8udGF4SW5jbHVkZWQsXG4gICAgICAgICAgICB0YXhDYXRlZ29yeTogdGhpcy52YXJpYW50c1swXT8udGF4Q2F0ZWdvcnksXG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VndW4gdmVyc2lvbiBkZWwgYmFja2VuZFxuICAgICAgICBpZiAodGhpcy52YXJpYW50c1swXT8udGF4TGVnZW5kSW5mbykge1xuICAgICAgICAgICAgLy8gTnVldm8gYmFja2VuZFxuICAgICAgICAgICAgYXNvY2lhdGVkLnByaWNlV2l0aG91dFRheGVzID0gdGhpcy52YXJpYW50c1swXT8udGF4TGVnZW5kSW5mby5wcmljZVdpdGhvdXRUYXhlcztcbiAgICAgICAgICAgIGFzb2NpYXRlZC50YXhlQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8udGF4TGVnZW5kSW5mby50YXhlcztcbiAgICAgICAgICAgIGFzb2NpYXRlZC50YXhSYXRlID0gdGhpcy52YXJpYW50c1swXT8udGF4TGVnZW5kSW5mby50YXhSYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQmFja2VuZCBhbnRpZ3VvXG4gICAgICAgICAgICBhc29jaWF0ZWQucHJpY2VXaXRob3V0VGF4ZXMgPSB0aGlzLnZhcmlhbnRzWzBdPy5wcmljZVdpdGhvdXRUYXhlcyA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICBhc29jaWF0ZWQudGF4ZUFtb3VudCA9IHRoaXMudmFyaWFudHNbMF0/LnRheGVzID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGFzb2NpYXRlZC50YXhSYXRlID0gdGhpcy52YXJpYW50c1swXT8udGF4UmF0ZSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0Lm5leHQoYXNvY2lhdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVjaWJlIGxhcyBwcm9waWVkYWRlcyBkZSB1bmEgdmFyaWFudGUgeSBwb3IgY2FkYSBpdGVtIGFybWEgdW4gb2JqZXRvIGNvbiBcbiAgICAgKiBlbCBuYW1lPWNsYXZlIHkgdmFsdWU9dmFsb3IgZGUgZXNlIGl0ZW0uICBcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBcbiAgICAgKiBAcmV0dXJucyBVbiBhcnJlZ2xvIGNvbiBsYXMgcHJvcGllZGFkZXMgZGUgbGEgZm9ybWEgeyBuYW1lID0gLi4uICwgdmFsdWUgPSAuLi59XG4gICAgICovXG4gICAgcHJpdmF0ZSBiZWF1dGlmeVByb3BlcnRpZXMgPSAocHJvcGVydGllcykgPT4ge1xuICAgICAgICBsZXQgYmVhdXRpZnlEYXRhID0gW11cbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHByb3ApIHtcbiAgICAgICAgICAgICAgICBiZWF1dGlmeURhdGEucHVzaCh7IG5hbWU6IGtleSwgdmFsdWU6IHByb3Bba2V5XSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJlYXV0aWZ5RGF0YVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JhdGVEaXNjb3VudCA9ICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBhbGxfZGlzY291bnQgPSAnJztcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHMuZm9yRWFjaCh2YXJpYW50ID0+IHtcbiAgICAgICAgICAgICAgICB2YXJpYW50LmRpc2NvdW50ICYmIChhbGxfZGlzY291bnQgPSBhbGxfZGlzY291bnQgKyAnLCAnICsgdmFyaWFudC5kaXNjb3VudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChhbGxfZGlzY291bnQgPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWxsX2Rpc2NvdW50XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyYXRlUHJpY2UgPSAoKSA9PiB7XG4gICAgICAgIGxldCBtaW5fcHJpY2UgPSAwO1xuICAgICAgICBsZXQgbWF4X3ByaWNlID0gMDtcbiAgICAgICAgbGV0IGFsbF9wcmljZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YXJpYW50cy5mb3JFYWNoKHZhcmlhbnQgPT4ge1xuICAgICAgICAgICAgYWxsX3ByaWNlcy5wdXNoKHZhcmlhbnQucHJpY2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWluX3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWluKGEsIGIpKTtcbiAgICAgICAgbWF4X3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpLCAwKTtcbiAgICAgICAgcmV0dXJuIG1pbl9wcmljZSA9PSBtYXhfcHJpY2UgPyBtYXhfcHJpY2UudG9TdHJpbmcoKSA6IG1pbl9wcmljZSArICcgLSAnICsgbWF4X3ByaWNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JhdGVTYWxlUHJpY2UgPSAoKSA9PiB7XG4gICAgICAgIGxldCBtaW5fcHJpY2UgPSAwO1xuICAgICAgICBsZXQgbWF4X3ByaWNlID0gMDtcbiAgICAgICAgbGV0IGFsbF9wcmljZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YXJpYW50cy5mb3JFYWNoKHZhcmlhbnQgPT4ge1xuICAgICAgICAgICAgdmFyaWFudC5zYWxlcHJpY2UgJiYgYWxsX3ByaWNlcy5wdXNoKHZhcmlhbnQuc2FsZXByaWNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYWxsX3ByaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICBtaW5fcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYikpO1xuICAgICAgICBtYXhfcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYiksIDApO1xuICAgICAgICByZXR1cm4gbWluX3ByaWNlID09IG1heF9wcmljZSA/IG1heF9wcmljZS50b1N0cmluZygpIDogbWluX3ByaWNlICsgJyAtICcgKyBtYXhfcHJpY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpblJhbmdlID0gKHF1YW50aXR5LCBtaW4sIG1heCkgPT4gKChxdWFudGl0eSAtIG1pbikgKiAocXVhbnRpdHkgLSBtYXgpIDw9IDApXG5cbiAgICBwcml2YXRlIHZhbGlkYXRlUXVhbnRpdHkgPSAocXVhbnRpdHk6IG51bWJlciwgdmFyaWFudENvZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgY29kZVRvQ2hlY2sgPSB2YXJpYW50Q29kZSB8fCB0aGlzLnZhcmlhbnRzWzBdLmNvZGU7XG4gICAgICAgIGNvbnN0IGFjdHVhbFF1YW50aXR5ID0gdGhpcy5jYXJ0U2VydmljZS5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KGNvZGVUb0NoZWNrKTtcbiAgICAgICAgY29uc3QgYXNvY2lhdGVkRGF0YSA9IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWU7XG4gICAgICAgIGNvbnN0IHRvdGFsUXVhbnRpdHkgPSBhY3R1YWxRdWFudGl0eSArIHF1YW50aXR5O1xuXG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSB0aGlzLnZhcmlhbnRzLmZpbmQodiA9PiB2LmNvZGUgPT09IGNvZGVUb0NoZWNrKTtcbiAgICAgICAgY29uc3Qgc3RvY2sgPSB2YXJpYW50Py5zdG9jayA/PyAwO1xuXG4gICAgICAgIGlmICh0b3RhbFF1YW50aXR5ID4gc3RvY2spIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2stYWN0dWFsbHknKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc29jaWF0ZWREYXRhLm1heGltdW1JdGVtc1F1YW50aXR5ICYmIHRvdGFsUXVhbnRpdHkgPiBhc29jaWF0ZWREYXRhLm1heGltdW1JdGVtc1F1YW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWF4aW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGFzb2NpYXRlZERhdGEubWF4aW11bUl0ZW1zUXVhbnRpdHkgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXNvY2lhdGVkRGF0YS5taW5pbXVtSXRlbXNRdWFudGl0eSAmJiB0b3RhbFF1YW50aXR5IDwgYXNvY2lhdGVkRGF0YS5taW5pbXVtSXRlbXNRdWFudGl0eSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21pbmltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBhc29jaWF0ZWREYXRhLm1pbmltdW1JdGVtc1F1YW50aXR5IH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzb2NpYXRlZERhdGEubXVsdGlwbGVRdWFudGl0eSAmJiBhc29jaWF0ZWREYXRhLm11bHRpcGxlUXVhbnRpdHkgPiAwKSB7XG4gICAgICAgICAgICBpZiAodG90YWxRdWFudGl0eSAlIGFzb2NpYXRlZERhdGEubXVsdGlwbGVRdWFudGl0eSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LWJlLW11bHRpcGxlJywgeyBxdWFudGl0eTogYXNvY2lhdGVkRGF0YS5tdWx0aXBsZVF1YW50aXR5IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVQcmljZUFuZENyZWRpdHMgPSAocHJpY2U6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAodGhpcy5iYWxhbmNlQ3VzdG9tZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYmFsYW5jZUN1c3RvbWVyLmFsbG93QW55UGF5bWVudE1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5iYWxhbmNlQ3VzdG9tZXIucmVtYWluaW5nQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJpY2UgPiB0aGlzLmJhbGFuY2VDdXN0b21lci5yZW1haW5pbmdDcmVkaXRzKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm90LWVub3VnaC1jcmVkaXRzJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG5cbiAgICBwcml2YXRlIGZldGNoQ2FydERhdGEgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuZ2V0VG90YWxBbW91bnQoKS5zdWJzY3JpYmUoKHRvdGFsQW1vdW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb3RhbEFtb3VudCA9IHRvdGFsQW1vdW50O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmJhbGFuY2VDdXN0b21lciQuc3Vic2NyaWJlKChiYWxhbmNlQ3VzdG9tZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyID0gYmFsYW5jZUN1c3RvbWVyO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gQ3VhbmRvIGhheWEgbW9kZWxvcyBkZSByZXNwdWVzdGEsIHZhbGlkYW1vcyBxdWUgbm8gc2UgaW50ZW50ZSBjYXJnYXIgdW4gcHJvZHVjdG8gaW5jb21wbGV0b1xuICAgIHByaXZhdGUgaXNQcm9kdWN0VmFsaWQgPSAocHJvZHVjdDogUHJvZHVjdCkgPT4gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIFZhcmlhbnRlcyB5IHN1cyB2YWxvcmVzXG4gICAgICogXG4gICAgICogQGRlc2NyaXB0aW9uIFJldG9ybmEgdW5hIGxpc3RhIGZpbHRyYWRhIGRlIGxhcyB2YXJpYW50ZXMgcXVlIGVzdGFuIHNlbGVjY2lvbmFkYXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFZhcmlhbnRzU2VsZWN0ZWQob3B0aW9uczogYW55LCBvcHRpb25zRXhjZXB0aW9uOiBBcnJheTxhbnk+KTogQXJyYXk8T2JqZWN0PiB7XG5cbiAgICAgICAgbGV0IHZhcmlhbnRzU2VsZWN0ZWQgPSBbXTtcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKHYgPT4ge1xuICAgICAgICAgICAgaWYgKHYudmFsdWVzICYmIHYudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHYudmFsdWVzLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5zZWxlY3RlZCAmJiAhb3B0aW9uc0V4Y2VwdGlvbi5maW5kKG9wID0+IG9wLnRvVXBwZXJDYXNlKCkgPT0gdi5jb2RlLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50c1NlbGVjdGVkW3YuY29kZV0gPSB2YWwubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2YXJpYW50c1NlbGVjdGVkO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgVmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcbiAgICAgKiBAcGFyYW0gdmFyaWFudHMgVG9kYXMgbGFzIHZhcmlhbnRlcyBkaXNwb25pYmxlcyBkZWwgcHJvZHVjdG9cbiAgICAgKiBcbiAgICAgKiBAZGVzY3JpcHRpb24gcmV0b3JuYSB0b2RhcyBsYXMgdmFyaWFudGVzIGRpc3BvbmlibGVzIGEgc2VsZWNjaW9uIHkgc3Ugc3RvY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFyaWFudHNBdmFpbGFibGUob3B0aW9uczogYW55LCB2YXJpYW50czogYW55LCBvcHRpb25zRXhjZXB0aW9uOiBBcnJheTxhbnk+KTogYW55IHtcblxuICAgICAgICBsZXQgdmFyaWFudHNTZWxlY3RlZCA9IHRoaXMuZ2V0VmFyaWFudHNTZWxlY3RlZChvcHRpb25zLCBvcHRpb25zRXhjZXB0aW9uKTtcblxuICAgICAgICBsZXQgdmFyaWFudHNBdmFpbGFibGUgPSBbXTtcblxuICAgICAgICB2YXJpYW50cy5tYXAodiA9PiB7XG5cbiAgICAgICAgICAgIGxldCBhdXggPSB7fTtcbiAgICAgICAgICAgIGlmICh2Lm9wdGlvbnMgJiYgdi5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHYub3B0aW9ucy5tYXAob3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGF1eCwgb3AsIHsgc3RvY2s6IHYuc3RvY2sgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhcmlhbnRzQXZhaWxhYmxlLnB1c2goYXV4KTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHZhcmlhbnRzQXZhaWxhYmxlLmZpbHRlcih2YSA9PiB0aGlzLmNvbnN0YW50cy5jb250YWluc0FsbCh7IC4uLnZhcmlhbnRzU2VsZWN0ZWQgfSwgdmEpKVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgdmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcbiAgICAgKiBAcGFyYW0gY29kZSBDb2RpZ28gZGUgbGEgdmFyaWFudGUgYSBidXNjYXJcbiAgICAgKiBAcGFyYW0gbmFtZSBub21icmUgZGUgbGEgdmFyaWFudGUgYSBidXNjYXJcbiAgICAgKiBAcGFyYW0gdmFyaWFudHMgdmFyaWFudGVzIGRlbCBwcm9kdWN0b1xuICAgICAqIFxuICAgICAqIEBkZXNjcmlwdGlvbiBidXNjYSBlbiBsYSBsaXN0YSBkZSB2YXJpYW50ZXMgZGlzcG9uaWJsZXMgc2kgaGF5IGRlIGVzZSBjb2RpZ28sIGVzZSBub21icmUgeSBjb24gc3RvY2sgXG4gICAgICovXG4gICAgcHVibGljIGV4aXN0VmFyaWFudEFuZEhhc1N0b2NrKG9wdGlvbnMsIGNvZGUsIG5hbWUsIHZhcmlhbnRzLCBvcHRpb25zRXhjZXB0aW9uID0gW10pOiBib29sZWFuIHtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYXJpYW50c0F2YWlsYWJsZShvcHRpb25zLCB2YXJpYW50cywgb3B0aW9uc0V4Y2VwdGlvbikuZmluZCh2YSA9PlxuICAgICAgICAgICAgdmEuaGFzT3duUHJvcGVydHkoY29kZSkgJiYgdmFbY29kZV0gPT09IG5hbWUgJiYgdmEuc3RvY2sgPiAwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwcm9kdWN0IHByb2R1Y3RvIGVsIGN1YWwgc2UgcXVpZXJlIGRlc2RvYmxhciBwb3IgdmFyaWFudGVzIHBvciB1bmEgb3BjacOzbi5cbiAgICAgKiBAcGFyYW0gd2l0aE9wdGlvbiAndHlwZScgdGlwbyBkZSBvcGNpw7NuLCBjb2RlOiBjw7NkaWdvIGRlIGxhIG9wY2nDs24uICdkZWZhdWx0Rmlyc3RPcHRpb24nOiBlbiBjYXNvIGRlIHF1ZSBubyBzZSBwdWVkYSBkZXNkb2JsYXIgcG9yIGxhIG9wY2nDs24gaW5kaWNhZGEgc2kgZWwgdmFsb3IgZXMgdmVyZGFkZXJvIHNlIGludGVudGFyYSBkZXNkb2JsYXIgcG9yIGxhIHByaW1lcmEgb3BjacOzbiBhc29jaWFkYSBhbCBwcm9kdWN0by5cbiAgICAgKiAnY2hlY2tJZlN0b2NrJzogZW4gY2FzbyBkZSBxdWUgZXN0YSB2YWxvciBzZWEgdmVyZGFkZXJvIHNlIHJlYWxpemEgdW4gY29udHJvbCBkZSBxdWUgbGEgdmFyaWFudGVzIGN1ZW50ZW4gY29uIHN0b2NrIHBhcmEgc2VyIHVuIHByb2R1Y3RvIGRlc2RvYmxhZG8gcG9yIGxhIHZhcmlhbnRlLCBzaSBlbCB2YWxvciBlcyBmYWxzbyBubyBzZSByZWFsaXphIGRpY2hvIGNvbnRyb2wgeSBlbCBwcm9kdWN0byBzZSBkZXNkb2JsYXJhIGNvbiBzdG9jayBlbiAwLlxuICAgICAqIEByZXR1cm5zIGFycmVnbG8gY29uIGVsIHByb2R1Y3RvIGRlc2RvYmxhZG8gcG9yIGxhIHZhcmlhbnRlIHNvbGljaXRhZGEuXG4gICAgICogKG9wY2nDs24gcG9yIGRlZmVjdG8gcXVlIHNlIGludGVudGEgaGFjZXIgZWwgZGVzZG9ibGFtaWVudG8gJ2NvbG9yJywgbyBiaWVuIHNpIGVuIGxlIHBhcsOhbWV0cm8gd2l0aE9wdGlvbiBlbCBhdHJpYnV0byAnZGVmYXVsdEZpcnN0T3B0aW9uJyBlcyB2ZXJkYWRlcm8gc2UgZGVzZG9ibGEgcG9yIGxhIHByaW1lcmEgb3BjacOzbiBhc29jaWFkYSBhbCBwcm9kdWN0byApIFxuICAgICAqL1xuICAgIGdldFByb2R1Y3RXaXRoVW5pcXVlVmFyaWFudCA9IChwcm9kdWN0LCB3aXRoT3B0aW9uPzogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChbcHJvZHVjdF0sIHdpdGhPcHRpb24pXG4gICAgfVxuXG59Il19
528
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUF5QixNQUFNLE1BQU0sQ0FBQztBQUU5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd0RDtJQWNJLDhCQUNZLGVBQWdDLEVBQVUsV0FBd0IsRUFBVSxhQUEyQixFQUN2RyxTQUFvQixFQUFTLGdCQUFrQyxFQUFTLGVBQWdDO1FBRnBILGlCQUdDO1FBRlcsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUN2RyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFTLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQWQ1RyxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFVLEVBQUUsQ0FBQyxDQUFDO1FB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cUJBQXFCO1FBRS9FLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxFQUFFO1lBQ3pFLE9BQUEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUE1RCxDQUE0RCxDQUFDLENBQUE7SUFDckUsQ0FBQzs7Z0JBeGM0QixlQUFlO2dCQUF1QixXQUFXO2dCQUF5QixZQUFZO2dCQUM1RixTQUFTO2dCQUEyQixnQkFBZ0I7Z0JBQTBCLGVBQWU7O0lBaEIzRyxvQkFBb0I7UUFEaEMsVUFBVSxFQUFFO09BQ0Esb0JBQW9CLENBcWVoQztJQUFELDJCQUFDO0NBQUEsQUFyZUQsSUFxZUM7U0FyZVksb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBwYXJ0aXRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Byb2R1Y3QnO1xuaW1wb3J0IHsgUHJvZHVjdHNTZXJ2aWNlIH0gZnJvbSAnLi9wcm9kdWN0cy5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vY2FydC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uL2FuYWx5dGljcy5zZXJ2aWNlJztcbmltcG9ydCB7IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BhcmFtc0ludGVyZmFjZXMvcGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCc7XG5pbXBvcnQgeyBDdXJyZW5jeVNlcnZpY2UgfSBmcm9tICcuLi9jdXJyZW5jeS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFByb2R1Y3REZXRhaWxTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgcHJvZHVjdFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3Q+KHt9KTtcbiAgICBwcml2YXRlIG9wdGlvbnNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHt9KTtcbiAgICBwcml2YXRlIGFzb2NpYXRlZERhdGFTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHsgcHJpY2U6ICcnLCBzdG9jazogMCwgcGljdHVyZTogJycgfSk7XG5cbiAgICBwcml2YXRlIHZhcmlhbnRzID0gW11cblxuICAgIHB1YmxpYyBwcm9kdWN0JCA9IHRoaXMucHJvZHVjdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIG9wdGlvbnMkID0gdGhpcy5vcHRpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgYXNvY2lhdGVkRGF0YSQgPSB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHByaXZhdGUgY3VycmVudFRvdGFsQW1vdW50OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBiYWxhbmNlQ3VzdG9tZXI6IGFueSA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBwcm9kdWN0c1NlcnZpY2U6IFByb2R1Y3RzU2VydmljZSwgcHJpdmF0ZSBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbnN0YW50czogQ29uc3RhbnRzLCBwdWJsaWMgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSwgcHVibGljIGN1cnJlbmN5U2VydmljZTogQ3VycmVuY3lTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0gY29kZSBJZGVudGlmaWNhZG9yIGRlbCBwcm9kdWN0b1xuICAgICogQHBhcmFtIHZhcmlhbnQgSW5kaWNhIHNpIHNlIGVzdMOhIHNvbGljaXRhbmRvIHVuIHByb2R1Y3RvIHBvciBzdSBjb2RpZ28sIG8gcG9yIGVsIGNvZGlnbyBjb3JyZXNwb25kaWVudGUgYSB1bmEgZGUgc3VzIHZhcmlhbnRlc1xuICAgICogIFxuICAgICogQ2FyZ2EgZWwgcHJvZHVjdG8gc29saWNpdGFkbyBhc3luY3JvbmljYW1lbnRlIHNpbiByZXNwdWVzdGEgXG4gICAgKi9cbiAgICBsb2FkUHJvZHVjdCA9IChjb2RlLCB2YXJpYW50OiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFNwZWNpZmljUHJvZHVjdChjb2RlLCB2YXJpYW50KS50b1Byb21pc2UoKS50aGVuKFxuICAgICAgICAgICAgcmVzID0+IHZhcmlhbnQgPyB0aGlzLmluaXRpYWxpemUocmVzLCBjb2RlKSA6IHRoaXMuaW5pdGlhbGl6ZShyZXMpLFxuICAgICAgICAgICAgZXJyID0+IHRoaXMucHJvZHVjdFN1YmplY3QubmV4dChudWxsKVxuICAgICAgICApXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvZHVjdF9pZCBJZGVudGlmaWNhZG9yIGRlbCBwcm9kdWN0b1xuICAgICAqIEBwYXJhbSB2YXJpYW50IEluZGljYSBzaSBzZSBlc3TDoSBzb2xpY2l0YW5kbyB1biBwcm9kdWN0byBwb3Igc3UgY29kaWdvLCBvIHBvciBlbCBjb2RpZ28gY29ycmVzcG9uZGllbnRlIGEgdW5hIGRlIHN1cyB2YXJpYW50ZXNcbiAgICAgKiBAYXN5bmNcbiAgICAgKiAgXG4gICAgICogQSBkaWZlcmVuY2lhIGRlbCBtZXRvZG8gbG9hZFByb2R1Y3QsIGVzdGUgcmV0b3JuYSB1biB2YWxvciBjdWFuZG8gdGVybWluYSBcbiAgICAgKi9cbiAgICBnZXRQcm9kdWN0ID0gYXN5bmMgKHByb2R1Y3RfaWQsIHZhcmlhbnQ6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0U3BlY2lmaWNQcm9kdWN0KHByb2R1Y3RfaWQsIHZhcmlhbnQpLnRvUHJvbWlzZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQuZXJyb3IpIHRoaXMucHJvZHVjdFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgZWxzZSB2YXJpYW50ID8gdGhpcy5pbml0aWFsaXplKHJlc3VsdCwgcHJvZHVjdF9pZCkgOiB0aGlzLmluaXRpYWxpemUocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplID0gKHByb2R1Y3QsIHZhcmlhbnRfY29kZT8pID0+IHtcbiAgICAgICAgdGhpcy5wcm9kdWN0U3ViamVjdC5uZXh0KHByb2R1Y3QpO1xuICAgICAgICB0aGlzLm9wdGlvbnNTdWJqZWN0Lm5leHQodGhpcy5nZXRPcHRpb25zKCkpXG4gICAgICAgIHZhcmlhbnRfY29kZSA/IHRoaXMudXBkYXRlVmFyaWFudHModmFyaWFudF9jb2RlKSA6IHRoaXMudXBkYXRlVmFyaWFudHMoKTtcbiAgICAgICAgdGhpcy52YXJpYW50cy5sZW5ndGggJiYgdGhpcy5nZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMoKTtcbiAgICAgICAgdGhpcy5mZXRjaENhcnREYXRhKClcbiAgICAgICAgLy90aGlzLmFuYWx5dGljc1NlcnZpY2UuY2FsbEV2ZW50KCd2aWV3X2l0ZW0nLCB7IC4uLnByb2R1Y3QsIGN1cnJlbmN5OiB0aGlzLmNvbnN0YW50cy5jdXJyZW5jeS5jb2RlIH0pXG4gICAgICAgIC8vIHZhcmlhbnRfY29kZSAmJiB0aGlzLmFuYWx5dGljc1NlcnZpY2UuY2FsbEV2ZW50KCd2aWV3X2l0ZW0nLCB7IC4uLnByb2R1Y3QsIGN1cnJlbmN5OiB0aGlzLmNvbnN0YW50cy5jdXJyZW5jeS5jb2RlIH0pXG4gICAgfVxuXG4gICAgc2V0UHJvZHVjdCA9IChwcm9kdWN0KSA9PiB0aGlzLmlzUHJvZHVjdFZhbGlkKHByb2R1Y3QpICYmIHRoaXMuaW5pdGlhbGl6ZShwcm9kdWN0KTtcblxuICAgIGlzUmVhZHkgPSAoKSA9PiB0aGlzLnZhcmlhbnRzLmxlbmd0aCA9PSAxO1xuXG4gICAgc2V0T3B0aW9uID0gKG9wdGlvbl9jb2RlLCBvcHRpb25fdmFsdWUpID0+IHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNTdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgb3B0aW9uID0gb3B0aW9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5jb2RlID09IG9wdGlvbl9jb2RlKS52YWx1ZXMuZmluZCh2YWx1ZSA9PiB2YWx1ZS5uYW1lID09IG9wdGlvbl92YWx1ZSk7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9ICFvcHRpb24uc2VsZWN0ZWQ7XG4gICAgICAgIG9wdGlvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQuY29kZSA9PSBvcHRpb25fY29kZSkudmFsdWVzLmZvckVhY2goXG4gICAgICAgICAgICB2YWx1ZSA9PiB7IGlmICh2YWx1ZS5uYW1lICE9IG9wdGlvbi5uYW1lKSB2YWx1ZS5zZWxlY3RlZCA9IGZhbHNlIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5vcHRpb25zU3ViamVjdC5uZXh0KG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZhcmlhbnRzKCk7XG4gICAgICAgIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIEhhYmlsaXRhciB0b2RvcyBsb3MgYm90b25lcyBjb24gbGEgY2xhc2UgJ2FkZENhcnRCdXR0b24nXG4gICAgICAgICAgICBjb25zdCBzdWJtaXRCdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFkZENhcnRCdXR0b24nKTtcbiAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgICAgICAgICAgIChidXR0b24gYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVBc29jaWF0ZWREYXRhRnJvbVZhcmlhbnRzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnc2VsZWN0aW9uLW5vdC1hdmFpbGFibGUnKTtcblxuICAgICAgICAgICAgLy8gRGVzaGFiaWxpdGFyIHRvZG9zIGxvcyBib3RvbmVzIGNvbiBsYSBjbGFzZSAnc3VibWl0LWJ1dHRvbidcbiAgICAgICAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWRkQ2FydEJ1dHRvbicpO1xuICAgICAgICAgICAgc3VibWl0QnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XG4gICAgICAgICAgICAgICAgKGJ1dHRvbiBhcyBIVE1MQnV0dG9uRWxlbWVudCkuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGNoYW5nZVBpY3R1cmUgPSAocGljdHVyZSkgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWU7XG4gICAgICAgIGRhdGEucGljdHVyZSA9IHBpY3R1cmU7XG4gICAgICAgIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QubmV4dChkYXRhKTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAvLyBXaGF0aGV2ZXIgd2UgbmVlZCB0byBkbyB3aXRoIGVycm9yXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIGFncmVnYS9hY3R1YWxpemEgdW4gaXRlbSBlbiBlbCBjYXJyaXRvIFxuICAgICAqIEBwYXJhbSBxdWFudGl0eSBjYW50aWRhZCBhIGFncmVnYXJcbiAgICAgKiBAcGFyYW0gdmFyaWFudF9jb2RlICoqKG9wY2lvbmFsKSoqIGNvZGlnbyBkZSBsYSB2YXJpYW50ZSBzZWxlY2Npb25hZGEgZGVsIHByb2R1Y3RvLlxuICAgICAqIEBwYXJhbSBjb21tZW50cyAqKihvcGNpb25hbCkqKiBjb21lbnRhcmlvIHBlcnNvbmFsaXphZG8gZGVsIGNsaWVudGUuXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgYWRkVG9DYXJ0KHF1YW50aXR5LCB2YXJpYW50X2NvZGU/OiBzdHJpbmcsIGNvbW1lbnRzPzogc3RyaW5nKSB7XG4gICAgICAgIHF1YW50aXR5ID0gcGFyc2VJbnQocXVhbnRpdHkpO1xuXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdjYW50LWJ1eScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByb2R1Y3Rfc2VsZWN0ZWQgPSBfLmNsb25lKHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUpO1xuICAgICAgICBsZXQgdmFyaWFudDogYW55O1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy52YXJpYW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm8tdmFyaWFudHMnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID09IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3V0LW9mLXN0b2NrJylcbiAgICAgICAgICAgICAgICAgICAgOiB2YXJpYW50ID0gdGhpcy52YXJpYW50c1swXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhbnRfY29kZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYW50ID0gdGhpcy52YXJpYW50cy5maW5kKHZhcmlhbnQgPT4gdmFyaWFudC5jb2RlID09PSB2YXJpYW50X2NvZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudC5zdG9jayA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3V0LW9mLXN0b2NrJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3ZhcmlhbnRzLWxlZnQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhcmlhbnQpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlUXVhbnRpdHkocXVhbnRpdHksIHZhcmlhbnQuY29kZSkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwcmljZVRvVmFsaWRhdGUgPSBwcm9kdWN0X3NlbGVjdGVkLnNhbGVwcmljZVxuICAgICAgICAgICAgPyBwcm9kdWN0X3NlbGVjdGVkLnNhbGVwcmljZSAqIHF1YW50aXR5XG4gICAgICAgICAgICA6IHByb2R1Y3Rfc2VsZWN0ZWQucHJpY2UgKiBxdWFudGl0eTtcblxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVQcmljZUFuZENyZWRpdHMocHJpY2VUb1ZhbGlkYXRlKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHByb2R1Y3QgPSB0aGlzLm1ha2VBZmZvcmRhYmxlUHJvZHVjdChwcm9kdWN0X3NlbGVjdGVkKTtcblxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvQ2FydChwcm9kdWN0LCBxdWFudGl0eSwgdmFyaWFudC5jb2RlLCBjb21tZW50cyk7XG4gICAgfTtcblxuXG5cbiAgICBhZGRUb0NhcnRQcm9taXNlID0gYXN5bmMgKHF1YW50aXR5KSA9PiB7XG4gICAgICAgIHF1YW50aXR5ID0gcGFyc2VJbnQocXVhbnRpdHkpO1xuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ2NhbnQtYnV5JyB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcm9kdWN0X3NlbGVjdGVkID0gXy5jbG9uZSh0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID4gMSB8fCB0aGlzLnZhcmlhbnRzLmxlbmd0aCA9PSAwIHx8IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUuc3RvY2sgPT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID09IDApIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnbm8tdmFyaWFudHMnIH07XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA+IDEgJiYgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5zdG9jayA+IDApIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAndmFyaWFudHMtbGVmdCcgfTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoICE9IDAgJiYgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5zdG9jayA9PSAwKSByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ291dC1vZi1zdG9jaycgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVRdWFudGl0eShxdWFudGl0eSkpIHJldHVybjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FydFNlcnZpY2UuYWRkVG9DYXJ0UHJvbWlzZSh0aGlzLm1ha2VBZmZvcmRhYmxlUHJvZHVjdChwcm9kdWN0X3NlbGVjdGVkKSwgcXVhbnRpdHksIHRoaXMudmFyaWFudHNbMF0uY29kZSk7XG4gICAgICAgIHJldHVybiAocmVzdWx0ICYmICEocmVzdWx0LmVycm9yKSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgZ2V0T3B0aW9ucyA9IChwcm9kdWN0X3JlY2VpdmVkPzogUHJvZHVjdCkgPT4ge1xuICAgICAgICBsZXQgcHJvZHVjdCA9IHByb2R1Y3RfcmVjZWl2ZWQgfHwgdGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBbXTtcbiAgICAgICAgcHJvZHVjdC5vcHRpb25zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2godGhpcy50b09wdGlvbihlbGVtZW50KSk7XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9PcHRpb24gPSAocHJlb3B0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBwcmVvcHRpb24ubGFiZWwsXG4gICAgICAgICAgICBjb2RlOiBwcmVvcHRpb24uY29kZSxcbiAgICAgICAgICAgIHR5cGU6IHByZW9wdGlvbi50eXBlLFxuICAgICAgICAgICAgdmFsdWVzOiBwcmVvcHRpb24udmFsdWVzLm1hcCh2YWx1ZSA9PiAoeyBuYW1lOiB2YWx1ZS5jb2RlLCBkZXNjcmlwdGlvbjogdmFsdWUubmFtZSwgaW1hZ2U6IHZhbHVlLmltYWdlLCBtb2JpbGVJbWFnZTogdmFsdWUubW9iaWxlSW1hZ2UsIHNlbGVjdGVkOiBmYWxzZSB9KSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZUFmZm9yZGFibGVQcm9kdWN0KHByb2R1Y3Rfc2VsZWN0ZWQ6IFByb2R1Y3QpIHtcbiAgICAgICAgcHJvZHVjdF9zZWxlY3RlZC5wcmljZSA9IHBhcnNlRmxvYXQodGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5wcmljZSk7XG4gICAgICAgIHByb2R1Y3Rfc2VsZWN0ZWQuc2FsZXByaWNlID0gcGFyc2VGbG9hdCh0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnByaWNlKTtcbiAgICAgICAgcHJvZHVjdF9zZWxlY3RlZC5vcHRpb25zID0ge307XG4gICAgICAgIHRoaXMudmFyaWFudHNbMF0ub3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiBwcm9kdWN0X3NlbGVjdGVkLm9wdGlvbnMgPSB7IC4uLnByb2R1Y3Rfc2VsZWN0ZWQub3B0aW9ucywgLi4ub3B0aW9uIH0pXG4gICAgICAgIHJldHVybiBwcm9kdWN0X3NlbGVjdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVmFyaWFudHMgPSAoY29kZT8pID0+IHtcbiAgICAgICAgbGV0IHZhcmlhbnRzID0gdGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZS52YXJpYW50cztcbiAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNTdWJqZWN0LnZhbHVlLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgICAgICAgICAgICBvcHRpb24udmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzID0gdmFyaWFudHMuZmlsdGVyKHZhcmlhbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YXJpYW50Lm9wdGlvbnMuc29tZSh2YXJpYW50X29wdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3B0aW9uLmNvZGUgaW4gdmFyaWFudF9vcHRpb24gJiYgdmFyaWFudF9vcHRpb25bb3B0aW9uLmNvZGVdID09IHZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXJpYW50cyA9IHZhcmlhbnRzLmZpbHRlcih2YXJpYW50ID0+IHZhcmlhbnQuY29kZSA9PSBjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhcmlhbnRzID0gdmFyaWFudHM7XG4gICAgICAgIGNvZGUgJiYgdGhpcy51cGRhdGVPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVPcHRpb25zID0gKCkgPT4ge1xuICAgICAgICBsZXQgeyBvcHRpb25zIH0gPSB0aGlzLnZhcmlhbnRzLmxlbmd0aCAmJiB0aGlzLnZhcmlhbnRzWzBdO1xuICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4gT2JqZWN0LmtleXMob3B0aW9uKS5mb3JFYWNoKGtleSA9PiB0aGlzLnNldE9wdGlvbihrZXksIG9wdGlvbltrZXldKSkpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMgPSAoKSA9PiB7XG4gICAgICAgIGxldCBhc29jaWF0ZWQ6IGFueSA9IHt9O1xuICAgICAgICBpZiAodGhpcy5pc1JlYWR5KCkpIHtcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zdG9jayA9IHRoaXMudmFyaWFudHNbMF0uc3RvY2tcbiAgICAgICAgICAgIC8vIFByZWNpbzogc2kgdmllbmUgdGF4TGVnZW5kSW5mbyB1c2Ftb3Mgc3UgcHJpY2UsIHNpIG5vIGVsIHYucHJpY2VcbiAgICAgICAgICAgIGNvbnN0IHJhd1ByaWNlID0gdGhpcy52YXJpYW50c1swXS50YXhMZWdlbmRJbmZvPy5wcmljZSA/PyB0aGlzLnZhcmlhbnRzWzBdLnByaWNlO1xuICAgICAgICAgICAgYXNvY2lhdGVkLnByaWNlID0gcmF3UHJpY2UudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJhd1NhbGVQcmljZSA9IHRoaXMudmFyaWFudHNbMF0udGF4TGVnZW5kSW5mbz8uc2FsZXByaWNlID8/IHRoaXMudmFyaWFudHNbMF0uc2FsZXByaWNlO1xuICAgICAgICAgICAgYXNvY2lhdGVkLnNhbGVwcmljZSA9IHJhd1NhbGVQcmljZSA/IHJhd1NhbGVQcmljZS50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXNvY2lhdGVkLmRpc2NvdW50ID0gdGhpcy52YXJpYW50c1swXT8uZGlzY291bnQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXNvY2lhdGVkLnByb3BlcnRpZXMgPSB0aGlzLnZhcmlhbnRzWzBdLnByb3BlcnRpZXMgPyB0aGlzLmJlYXV0aWZ5UHJvcGVydGllcyh0aGlzLnZhcmlhbnRzWzBdLnByb3BlcnRpZXMpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXNvY2lhdGVkLnVuaXF1ZUV4dGVybmFsQ29kZSA9IHRoaXMudmFyaWFudHNbMF0/LnVuaXF1ZUV4dGVybmFsQ29kZSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBhc29jaWF0ZWQubXVsdGlwbGVRdWFudGl0eSA9IHRoaXMudmFyaWFudHNbMF0/Lm11bHRpcGxlUXVhbnRpdHkgfHwgdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNvY2lhdGVkLnByaWNlID0gdGhpcy5jcmF0ZVByaWNlKClcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zYWxlcHJpY2UgPSB0aGlzLmNyYXRlU2FsZVByaWNlKClcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zdG9jayA9ICh0aGlzLnZhcmlhbnRzLm1hcCh2YXJpYW50ID0+IHZhcmlhbnQuc3RvY2spKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKVxuICAgICAgICAgICAgYXNvY2lhdGVkLmRpc2NvdW50ID0gdGhpcy5jcmF0ZURpc2NvdW50KClcbiAgICAgICAgfVxuXG4gICAgICAgICgnaW1hZ2VzJyBpbiB0aGlzLnZhcmlhbnRzWzBdICYmIHRoaXMudmFyaWFudHNbMF0uaW1hZ2VzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICA/IGFzb2NpYXRlZC5waWN0dXJlID0gdGhpcy52YXJpYW50c1swXS5pbWFnZXNbMF1cbiAgICAgICAgICAgIDogYXNvY2lhdGVkLnBpY3R1cmUgPSAodGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5waWN0dXJlIHx8IHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUucGljdHVyZXNkZWZhdWx0WzBdKTtcblxuXG4gICAgICAgIGFzb2NpYXRlZC5tYXhpbXVtQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8ubWF4aW11bUFtb3VudCB8fCAwXG4gICAgICAgIGFzb2NpYXRlZC5taW5pbXVtQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8ubWluaW11bUFtb3VudCB8fCAwXG5cbiAgICAgICAgYXNvY2lhdGVkLm1heGltdW1JdGVtc1F1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8uc3RvY2sgPiAwICYmICdtYXhpbXVtSXRlbXNRdWFudGl0eScgaW4gdGhpcy52YXJpYW50c1swXSA/IHRoaXMudmFyaWFudHNbMF0/Lm1heGltdW1JdGVtc1F1YW50aXR5IDogdGhpcy52YXJpYW50c1swXT8uc3RvY2tcbiAgICAgICAgYXNvY2lhdGVkLm1pbmltdW1JdGVtc1F1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8uc3RvY2sgPiAwICYmICdtaW5pbXVtSXRlbXNRdWFudGl0eScgaW4gdGhpcy52YXJpYW50c1swXVxuICAgICAgICAgICAgJiYgdGhpcy52YXJpYW50c1swXT8ubWluaW11bUl0ZW1zUXVhbnRpdHkgPiAwID8gdGhpcy52YXJpYW50c1swXT8ubWluaW11bUl0ZW1zUXVhbnRpdHlcbiAgICAgICAgICAgIDogKHRoaXMudmFyaWFudHNbMF0/Lm11bHRpcGxlUXVhbnRpdHkgPyB0aGlzLnZhcmlhbnRzWzBdPy5tdWx0aXBsZVF1YW50aXR5IDogMSlcblxuICAgICAgICBhc29jaWF0ZWQuZmluYWxDb25zdW1lciA9IHtcbiAgICAgICAgICAgIGZpbmFsQ29uc3VtZXJQcmljZTogdGhpcy52YXJpYW50c1swXT8uZmluYWxfY29uc3VtZXJfcHJpY2UsXG4gICAgICAgICAgICBvcmlnaW5hbEZpbmFsQ29uc3VtZXJQcmljZTogdGhpcy52YXJpYW50c1swXT8ub3JpZ2luYWxfZmluYWxfY29uc3VtZXJfcHJpY2UsXG4gICAgICAgIH1cblxuICAgICAgICBhc29jaWF0ZWQudGF4ZXMgPSB7XG4gICAgICAgICAgICB0YXhJbmNsdWRlZDogdGhpcy52YXJpYW50c1swXT8udGF4SW5jbHVkZWQsXG4gICAgICAgICAgICB0YXhDYXRlZ29yeTogdGhpcy52YXJpYW50c1swXT8udGF4Q2F0ZWdvcnksXG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VndW4gdmVyc2lvbiBkZWwgYmFja2VuZFxuICAgICAgICBpZiAodGhpcy52YXJpYW50c1swXT8udGF4TGVnZW5kSW5mbykge1xuICAgICAgICAgICAgLy8gTnVldm8gYmFja2VuZFxuICAgICAgICAgICAgYXNvY2lhdGVkLnByaWNlV2l0aG91dFRheGVzID0gdGhpcy52YXJpYW50c1swXT8udGF4TGVnZW5kSW5mby5wcmljZVdpdGhvdXRUYXhlcztcbiAgICAgICAgICAgIGFzb2NpYXRlZC50YXhlQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8udGF4TGVnZW5kSW5mby50YXhlcztcbiAgICAgICAgICAgIGFzb2NpYXRlZC50YXhSYXRlID0gdGhpcy52YXJpYW50c1swXT8udGF4TGVnZW5kSW5mby50YXhSYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQmFja2VuZCBhbnRpZ3VvXG4gICAgICAgICAgICBhc29jaWF0ZWQucHJpY2VXaXRob3V0VGF4ZXMgPSB0aGlzLnZhcmlhbnRzWzBdPy5wcmljZVdpdGhvdXRUYXhlcyA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICBhc29jaWF0ZWQudGF4ZUFtb3VudCA9IHRoaXMudmFyaWFudHNbMF0/LnRheGVzID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGFzb2NpYXRlZC50YXhSYXRlID0gdGhpcy52YXJpYW50c1swXT8udGF4UmF0ZSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0Lm5leHQoYXNvY2lhdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVjaWJlIGxhcyBwcm9waWVkYWRlcyBkZSB1bmEgdmFyaWFudGUgeSBwb3IgY2FkYSBpdGVtIGFybWEgdW4gb2JqZXRvIGNvbiBcbiAgICAgKiBlbCBuYW1lPWNsYXZlIHkgdmFsdWU9dmFsb3IgZGUgZXNlIGl0ZW0uICBcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBcbiAgICAgKiBAcmV0dXJucyBVbiBhcnJlZ2xvIGNvbiBsYXMgcHJvcGllZGFkZXMgZGUgbGEgZm9ybWEgeyBuYW1lID0gLi4uICwgdmFsdWUgPSAuLi59XG4gICAgICovXG4gICAgcHJpdmF0ZSBiZWF1dGlmeVByb3BlcnRpZXMgPSAocHJvcGVydGllcykgPT4ge1xuICAgICAgICBsZXQgYmVhdXRpZnlEYXRhID0gW11cbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHByb3ApIHtcbiAgICAgICAgICAgICAgICBiZWF1dGlmeURhdGEucHVzaCh7IG5hbWU6IGtleSwgdmFsdWU6IHByb3Bba2V5XSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJlYXV0aWZ5RGF0YVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JhdGVEaXNjb3VudCA9ICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBhbGxfZGlzY291bnQgPSAnJztcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHMuZm9yRWFjaCh2YXJpYW50ID0+IHtcbiAgICAgICAgICAgICAgICB2YXJpYW50LmRpc2NvdW50ICYmIChhbGxfZGlzY291bnQgPSBhbGxfZGlzY291bnQgKyAnLCAnICsgdmFyaWFudC5kaXNjb3VudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChhbGxfZGlzY291bnQgPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWxsX2Rpc2NvdW50XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyYXRlUHJpY2UgPSAoKSA9PiB7XG4gICAgICAgIGxldCBtaW5fcHJpY2UgPSAwO1xuICAgICAgICBsZXQgbWF4X3ByaWNlID0gMDtcbiAgICAgICAgbGV0IGFsbF9wcmljZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YXJpYW50cy5mb3JFYWNoKHZhcmlhbnQgPT4ge1xuICAgICAgICAgICAgYWxsX3ByaWNlcy5wdXNoKHZhcmlhbnQucHJpY2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWluX3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWluKGEsIGIpKTtcbiAgICAgICAgbWF4X3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpLCAwKTtcbiAgICAgICAgcmV0dXJuIG1pbl9wcmljZSA9PSBtYXhfcHJpY2UgPyBtYXhfcHJpY2UudG9TdHJpbmcoKSA6IG1pbl9wcmljZSArICcgLSAnICsgbWF4X3ByaWNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JhdGVTYWxlUHJpY2UgPSAoKSA9PiB7XG4gICAgICAgIGxldCBtaW5fcHJpY2UgPSAwO1xuICAgICAgICBsZXQgbWF4X3ByaWNlID0gMDtcbiAgICAgICAgbGV0IGFsbF9wcmljZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YXJpYW50cy5mb3JFYWNoKHZhcmlhbnQgPT4ge1xuICAgICAgICAgICAgdmFyaWFudC5zYWxlcHJpY2UgJiYgYWxsX3ByaWNlcy5wdXNoKHZhcmlhbnQuc2FsZXByaWNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYWxsX3ByaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICBtaW5fcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYikpO1xuICAgICAgICBtYXhfcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYiksIDApO1xuICAgICAgICByZXR1cm4gbWluX3ByaWNlID09IG1heF9wcmljZSA/IG1heF9wcmljZS50b1N0cmluZygpIDogbWluX3ByaWNlICsgJyAtICcgKyBtYXhfcHJpY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpblJhbmdlID0gKHF1YW50aXR5LCBtaW4sIG1heCkgPT4gKChxdWFudGl0eSAtIG1pbikgKiAocXVhbnRpdHkgLSBtYXgpIDw9IDApXG5cbiAgICBwcml2YXRlIHZhbGlkYXRlUXVhbnRpdHkgPSAocXVhbnRpdHk6IG51bWJlciwgdmFyaWFudENvZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgY29kZVRvQ2hlY2sgPSB2YXJpYW50Q29kZSB8fCB0aGlzLnZhcmlhbnRzWzBdLmNvZGU7XG4gICAgICAgIGNvbnN0IGFjdHVhbFF1YW50aXR5ID0gdGhpcy5jYXJ0U2VydmljZS5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KGNvZGVUb0NoZWNrKTtcbiAgICAgICAgY29uc3QgYXNvY2lhdGVkRGF0YSA9IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWU7XG4gICAgICAgIGNvbnN0IHRvdGFsUXVhbnRpdHkgPSBhY3R1YWxRdWFudGl0eSArIHF1YW50aXR5O1xuXG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSB0aGlzLnZhcmlhbnRzLmZpbmQodiA9PiB2LmNvZGUgPT09IGNvZGVUb0NoZWNrKTtcbiAgICAgICAgY29uc3Qgc3RvY2sgPSB2YXJpYW50Py5zdG9jayA/PyAwO1xuXG4gICAgICAgIGlmICh0b3RhbFF1YW50aXR5ID4gc3RvY2spIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2stYWN0dWFsbHknKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc29jaWF0ZWREYXRhLm1heGltdW1JdGVtc1F1YW50aXR5ICYmIHRvdGFsUXVhbnRpdHkgPiBhc29jaWF0ZWREYXRhLm1heGltdW1JdGVtc1F1YW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWF4aW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGFzb2NpYXRlZERhdGEubWF4aW11bUl0ZW1zUXVhbnRpdHkgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXNvY2lhdGVkRGF0YS5taW5pbXVtSXRlbXNRdWFudGl0eSAmJiB0b3RhbFF1YW50aXR5IDwgYXNvY2lhdGVkRGF0YS5taW5pbXVtSXRlbXNRdWFudGl0eSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21pbmltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBhc29jaWF0ZWREYXRhLm1pbmltdW1JdGVtc1F1YW50aXR5IH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzb2NpYXRlZERhdGEubXVsdGlwbGVRdWFudGl0eSAmJiBhc29jaWF0ZWREYXRhLm11bHRpcGxlUXVhbnRpdHkgPiAwKSB7XG4gICAgICAgICAgICBpZiAodG90YWxRdWFudGl0eSAlIGFzb2NpYXRlZERhdGEubXVsdGlwbGVRdWFudGl0eSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LWJlLW11bHRpcGxlJywgeyBxdWFudGl0eTogYXNvY2lhdGVkRGF0YS5tdWx0aXBsZVF1YW50aXR5IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVQcmljZUFuZENyZWRpdHMgPSAocHJpY2U6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAodGhpcy5iYWxhbmNlQ3VzdG9tZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYmFsYW5jZUN1c3RvbWVyLmFsbG93QW55UGF5bWVudE1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5iYWxhbmNlQ3VzdG9tZXIucmVtYWluaW5nQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJpY2UgPiB0aGlzLmJhbGFuY2VDdXN0b21lci5yZW1haW5pbmdDcmVkaXRzKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm90LWVub3VnaC1jcmVkaXRzJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG5cbiAgICBwcml2YXRlIGZldGNoQ2FydERhdGEgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuZ2V0VG90YWxBbW91bnQoKS5zdWJzY3JpYmUoKHRvdGFsQW1vdW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb3RhbEFtb3VudCA9IHRvdGFsQW1vdW50O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmJhbGFuY2VDdXN0b21lciQuc3Vic2NyaWJlKChiYWxhbmNlQ3VzdG9tZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyID0gYmFsYW5jZUN1c3RvbWVyO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gQ3VhbmRvIGhheWEgbW9kZWxvcyBkZSByZXNwdWVzdGEsIHZhbGlkYW1vcyBxdWUgbm8gc2UgaW50ZW50ZSBjYXJnYXIgdW4gcHJvZHVjdG8gaW5jb21wbGV0b1xuICAgIHByaXZhdGUgaXNQcm9kdWN0VmFsaWQgPSAocHJvZHVjdDogUHJvZHVjdCkgPT4gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIFZhcmlhbnRlcyB5IHN1cyB2YWxvcmVzXG4gICAgICogXG4gICAgICogQGRlc2NyaXB0aW9uIFJldG9ybmEgdW5hIGxpc3RhIGZpbHRyYWRhIGRlIGxhcyB2YXJpYW50ZXMgcXVlIGVzdGFuIHNlbGVjY2lvbmFkYXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFZhcmlhbnRzU2VsZWN0ZWQob3B0aW9uczogYW55LCBvcHRpb25zRXhjZXB0aW9uOiBBcnJheTxhbnk+KTogQXJyYXk8T2JqZWN0PiB7XG5cbiAgICAgICAgbGV0IHZhcmlhbnRzU2VsZWN0ZWQgPSBbXTtcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKHYgPT4ge1xuICAgICAgICAgICAgaWYgKHYudmFsdWVzICYmIHYudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHYudmFsdWVzLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5zZWxlY3RlZCAmJiAhb3B0aW9uc0V4Y2VwdGlvbi5maW5kKG9wID0+IG9wLnRvVXBwZXJDYXNlKCkgPT0gdi5jb2RlLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50c1NlbGVjdGVkW3YuY29kZV0gPSB2YWwubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2YXJpYW50c1NlbGVjdGVkO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgVmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcbiAgICAgKiBAcGFyYW0gdmFyaWFudHMgVG9kYXMgbGFzIHZhcmlhbnRlcyBkaXNwb25pYmxlcyBkZWwgcHJvZHVjdG9cbiAgICAgKiBcbiAgICAgKiBAZGVzY3JpcHRpb24gcmV0b3JuYSB0b2RhcyBsYXMgdmFyaWFudGVzIGRpc3BvbmlibGVzIGEgc2VsZWNjaW9uIHkgc3Ugc3RvY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFyaWFudHNBdmFpbGFibGUob3B0aW9uczogYW55LCB2YXJpYW50czogYW55LCBvcHRpb25zRXhjZXB0aW9uOiBBcnJheTxhbnk+KTogYW55IHtcblxuICAgICAgICBsZXQgdmFyaWFudHNTZWxlY3RlZCA9IHRoaXMuZ2V0VmFyaWFudHNTZWxlY3RlZChvcHRpb25zLCBvcHRpb25zRXhjZXB0aW9uKTtcblxuICAgICAgICBsZXQgdmFyaWFudHNBdmFpbGFibGUgPSBbXTtcblxuICAgICAgICB2YXJpYW50cy5tYXAodiA9PiB7XG5cbiAgICAgICAgICAgIGxldCBhdXggPSB7fTtcbiAgICAgICAgICAgIGlmICh2Lm9wdGlvbnMgJiYgdi5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHYub3B0aW9ucy5tYXAob3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGF1eCwgb3AsIHsgc3RvY2s6IHYuc3RvY2sgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhcmlhbnRzQXZhaWxhYmxlLnB1c2goYXV4KTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHZhcmlhbnRzQXZhaWxhYmxlLmZpbHRlcih2YSA9PiB0aGlzLmNvbnN0YW50cy5jb250YWluc0FsbCh7IC4uLnZhcmlhbnRzU2VsZWN0ZWQgfSwgdmEpKVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgdmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcbiAgICAgKiBAcGFyYW0gY29kZSBDb2RpZ28gZGUgbGEgdmFyaWFudGUgYSBidXNjYXJcbiAgICAgKiBAcGFyYW0gbmFtZSBub21icmUgZGUgbGEgdmFyaWFudGUgYSBidXNjYXJcbiAgICAgKiBAcGFyYW0gdmFyaWFudHMgdmFyaWFudGVzIGRlbCBwcm9kdWN0b1xuICAgICAqIFxuICAgICAqIEBkZXNjcmlwdGlvbiBidXNjYSBlbiBsYSBsaXN0YSBkZSB2YXJpYW50ZXMgZGlzcG9uaWJsZXMgc2kgaGF5IGRlIGVzZSBjb2RpZ28sIGVzZSBub21icmUgeSBjb24gc3RvY2sgXG4gICAgICovXG4gICAgcHVibGljIGV4aXN0VmFyaWFudEFuZEhhc1N0b2NrKG9wdGlvbnMsIGNvZGUsIG5hbWUsIHZhcmlhbnRzLCBvcHRpb25zRXhjZXB0aW9uID0gW10pOiBib29sZWFuIHtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYXJpYW50c0F2YWlsYWJsZShvcHRpb25zLCB2YXJpYW50cywgb3B0aW9uc0V4Y2VwdGlvbikuZmluZCh2YSA9PlxuICAgICAgICAgICAgdmEuaGFzT3duUHJvcGVydHkoY29kZSkgJiYgdmFbY29kZV0gPT09IG5hbWUgJiYgdmEuc3RvY2sgPiAwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwcm9kdWN0IHByb2R1Y3RvIGVsIGN1YWwgc2UgcXVpZXJlIGRlc2RvYmxhciBwb3IgdmFyaWFudGVzIHBvciB1bmEgb3BjacOzbi5cbiAgICAgKiBAcGFyYW0gd2l0aE9wdGlvbiAndHlwZScgdGlwbyBkZSBvcGNpw7NuLCBjb2RlOiBjw7NkaWdvIGRlIGxhIG9wY2nDs24uICdkZWZhdWx0Rmlyc3RPcHRpb24nOiBlbiBjYXNvIGRlIHF1ZSBubyBzZSBwdWVkYSBkZXNkb2JsYXIgcG9yIGxhIG9wY2nDs24gaW5kaWNhZGEgc2kgZWwgdmFsb3IgZXMgdmVyZGFkZXJvIHNlIGludGVudGFyYSBkZXNkb2JsYXIgcG9yIGxhIHByaW1lcmEgb3BjacOzbiBhc29jaWFkYSBhbCBwcm9kdWN0by5cbiAgICAgKiAnY2hlY2tJZlN0b2NrJzogZW4gY2FzbyBkZSBxdWUgZXN0YSB2YWxvciBzZWEgdmVyZGFkZXJvIHNlIHJlYWxpemEgdW4gY29udHJvbCBkZSBxdWUgbGEgdmFyaWFudGVzIGN1ZW50ZW4gY29uIHN0b2NrIHBhcmEgc2VyIHVuIHByb2R1Y3RvIGRlc2RvYmxhZG8gcG9yIGxhIHZhcmlhbnRlLCBzaSBlbCB2YWxvciBlcyBmYWxzbyBubyBzZSByZWFsaXphIGRpY2hvIGNvbnRyb2wgeSBlbCBwcm9kdWN0byBzZSBkZXNkb2JsYXJhIGNvbiBzdG9jayBlbiAwLlxuICAgICAqIEByZXR1cm5zIGFycmVnbG8gY29uIGVsIHByb2R1Y3RvIGRlc2RvYmxhZG8gcG9yIGxhIHZhcmlhbnRlIHNvbGljaXRhZGEuXG4gICAgICogKG9wY2nDs24gcG9yIGRlZmVjdG8gcXVlIHNlIGludGVudGEgaGFjZXIgZWwgZGVzZG9ibGFtaWVudG8gJ2NvbG9yJywgbyBiaWVuIHNpIGVuIGxlIHBhcsOhbWV0cm8gd2l0aE9wdGlvbiBlbCBhdHJpYnV0byAnZGVmYXVsdEZpcnN0T3B0aW9uJyBlcyB2ZXJkYWRlcm8gc2UgZGVzZG9ibGEgcG9yIGxhIHByaW1lcmEgb3BjacOzbiBhc29jaWFkYSBhbCBwcm9kdWN0byApIFxuICAgICAqL1xuICAgIGdldFByb2R1Y3RXaXRoVW5pcXVlVmFyaWFudCA9IChwcm9kdWN0LCB3aXRoT3B0aW9uPzogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChbcHJvZHVjdF0sIHdpdGhPcHRpb24pXG4gICAgfVxuXG59Il19
@@ -4202,7 +4202,11 @@ let CartService = class CartService {
4202
4202
  };
4203
4203
  this.updateItemQuantity = (item, quantity) => {
4204
4204
  if (this.validateQuantity(item, quantity) && (this.validatePriceAndCredits(item, quantity))) {
4205
- this.connection.put(this.updateItemQuantityApi(this.findItemByIdVariant(item.variant_id)), { 'quantity': Number(quantity) }).subscribe(res => this.updateCartObj(res) && this.updateCartItemQuantity(item.variant_id, Number(quantity)), err => this.handleError(err));
4205
+ this.requestInProcess.next(true);
4206
+ this.connection
4207
+ .put(this.updateItemQuantityApi(this.findItemByIdVariant(item.variant_id)), { 'quantity': Number(quantity) })
4208
+ .pipe(finalize(() => this.requestInProcess.next(false)))
4209
+ .subscribe(res => this.updateCartObj(res) && this.updateCartItemQuantity(item.variant_id, Number(quantity)), err => this.handleError(err));
4206
4210
  }
4207
4211
  };
4208
4212
  this.validateQuantity = (item, quantity) => {
@@ -6293,6 +6297,7 @@ let CartEcComponent = class CartEcComponent extends ComponentHelper {
6293
6297
  this.hideTaxes = false;
6294
6298
  this.creditAccountShowPrices = null;
6295
6299
  this.showTaxLegend = false;
6300
+ this.cartLoading = false;
6296
6301
  this.toDecimal = (amount) => this.consts.toDecimal(amount);
6297
6302
  this.redirectRegister = () => this.router.navigateByUrl(`/auth/login`);
6298
6303
  this.getVariants = product => {
@@ -6366,10 +6371,16 @@ let CartEcComponent = class CartEcComponent extends ComponentHelper {
6366
6371
  this.cartService.showPrice$.subscribe((showPrice) => {
6367
6372
  this.creditAccountShowPrices = showPrice;
6368
6373
  });
6374
+ this.cartService.loading.subscribe(isLoading => {
6375
+ this.cartLoading = isLoading;
6376
+ });
6369
6377
  this.ecOnInit();
6370
6378
  }
6371
6379
  actualizarCantidad(item, cantidad, stock, id) {
6372
6380
  var _a;
6381
+ if (this.cartLoading) {
6382
+ return;
6383
+ }
6373
6384
  const multipleQuantity = ((_a = item.product) === null || _a === void 0 ? void 0 : _a.variants) && item.product.variants.length > 0 ? item.product.variants[0].multipleQuantity : 0;
6374
6385
  const step = multipleQuantity && multipleQuantity > 0 ? multipleQuantity : 1;
6375
6386
  let newQuantity;
@@ -7583,7 +7594,7 @@ let SuccessEcComponent = class SuccessEcComponent extends ComponentHelper {
7583
7594
  }
7584
7595
  ngOnInit() {
7585
7596
  this.checkoutService.order$.subscribe(res => {
7586
- var _a, _b, _c, _d, _e, _f, _g, _h;
7597
+ var _a, _b, _c, _d, _e;
7587
7598
  //console.log('LO QUE LLEGA EN ORDEN', res);
7588
7599
  ((_a = res) === null || _a === void 0 ? void 0 : _a.number) ? this.params = {
7589
7600
  external_reference: res.number,
@@ -7591,7 +7602,11 @@ let SuccessEcComponent = class SuccessEcComponent extends ComponentHelper {
7591
7602
  //this.payments = [{method:{code:'bank_transsfer'}}]
7592
7603
  this.payments = ((_b = res) === null || _b === void 0 ? void 0 : _b.payments) ? res.payments : null;
7593
7604
  if (((_e = (_d = (_c = this.payments) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.method) === null || _e === void 0 ? void 0 : _e.code) && this.isPlaceToPay(this.payments[0].method.code)) {
7594
- this.totalAmount = (_h = (_g = (_f = res) === null || _f === void 0 ? void 0 : _f.totals) === null || _g === void 0 ? void 0 : _g.total, (_h !== null && _h !== void 0 ? _h : null));
7605
+ const stored = localStorage.getItem('total_amount');
7606
+ if (stored !== null) {
7607
+ this.totalAmount = parseFloat(stored);
7608
+ localStorage.removeItem('total_amount');
7609
+ }
7595
7610
  const now = new Date();
7596
7611
  this.paymentDate = now.toLocaleDateString('es-AR', {
7597
7612
  day: '2-digit',
@@ -8924,18 +8939,19 @@ let ProductDetailService = class ProductDetailService {
8924
8939
  options && options.forEach(option => Object.keys(option).forEach(key => this.setOption(key, option[key])));
8925
8940
  };
8926
8941
  this.generateAsociatedDataFromVariants = () => {
8927
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4;
8942
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6;
8928
8943
  let asociated = {};
8929
8944
  if (this.isReady()) {
8930
8945
  asociated.stock = this.variants[0].stock;
8931
8946
  // Precio: si viene taxLegendInfo usamos su price, si no el v.price
8932
8947
  const rawPrice = (_b = (_a = this.variants[0].taxLegendInfo) === null || _a === void 0 ? void 0 : _a.price, (_b !== null && _b !== void 0 ? _b : this.variants[0].price));
8933
8948
  asociated.price = rawPrice.toString();
8934
- asociated.saleprice = this.variants[0].saleprice && this.variants[0].saleprice.toString() || undefined;
8935
- asociated.discount = ((_c = this.variants[0]) === null || _c === void 0 ? void 0 : _c.discount) || undefined;
8949
+ const rawSalePrice = (_d = (_c = this.variants[0].taxLegendInfo) === null || _c === void 0 ? void 0 : _c.saleprice, (_d !== null && _d !== void 0 ? _d : this.variants[0].saleprice));
8950
+ asociated.saleprice = rawSalePrice ? rawSalePrice.toString() : undefined;
8951
+ asociated.discount = ((_e = this.variants[0]) === null || _e === void 0 ? void 0 : _e.discount) || undefined;
8936
8952
  asociated.properties = this.variants[0].properties ? this.beautifyProperties(this.variants[0].properties) : undefined;
8937
- asociated.uniqueExternalCode = ((_d = this.variants[0]) === null || _d === void 0 ? void 0 : _d.uniqueExternalCode) || undefined;
8938
- asociated.multipleQuantity = ((_e = this.variants[0]) === null || _e === void 0 ? void 0 : _e.multipleQuantity) || undefined;
8953
+ asociated.uniqueExternalCode = ((_f = this.variants[0]) === null || _f === void 0 ? void 0 : _f.uniqueExternalCode) || undefined;
8954
+ asociated.multipleQuantity = ((_g = this.variants[0]) === null || _g === void 0 ? void 0 : _g.multipleQuantity) || undefined;
8939
8955
  }
8940
8956
  else {
8941
8957
  asociated.price = this.cratePrice();
@@ -8946,31 +8962,31 @@ let ProductDetailService = class ProductDetailService {
8946
8962
  ('images' in this.variants[0] && this.variants[0].images.length > 0)
8947
8963
  ? asociated.picture = this.variants[0].images[0]
8948
8964
  : asociated.picture = (this.asociatedDataSubject.value.picture || this.productSubject.value.picturesdefault[0]);
8949
- asociated.maximumAmount = ((_f = this.variants[0]) === null || _f === void 0 ? void 0 : _f.maximumAmount) || 0;
8950
- asociated.minimumAmount = ((_g = this.variants[0]) === null || _g === void 0 ? void 0 : _g.minimumAmount) || 0;
8951
- asociated.maximumItemsQuantity = ((_h = this.variants[0]) === null || _h === void 0 ? void 0 : _h.stock) > 0 && 'maximumItemsQuantity' in this.variants[0] ? (_j = this.variants[0]) === null || _j === void 0 ? void 0 : _j.maximumItemsQuantity : (_k = this.variants[0]) === null || _k === void 0 ? void 0 : _k.stock;
8952
- asociated.minimumItemsQuantity = ((_l = this.variants[0]) === null || _l === void 0 ? void 0 : _l.stock) > 0 && 'minimumItemsQuantity' in this.variants[0]
8953
- && ((_m = this.variants[0]) === null || _m === void 0 ? void 0 : _m.minimumItemsQuantity) > 0 ? (_o = this.variants[0]) === null || _o === void 0 ? void 0 : _o.minimumItemsQuantity : (((_p = this.variants[0]) === null || _p === void 0 ? void 0 : _p.multipleQuantity) ? (_q = this.variants[0]) === null || _q === void 0 ? void 0 : _q.multipleQuantity : 1);
8965
+ asociated.maximumAmount = ((_h = this.variants[0]) === null || _h === void 0 ? void 0 : _h.maximumAmount) || 0;
8966
+ asociated.minimumAmount = ((_j = this.variants[0]) === null || _j === void 0 ? void 0 : _j.minimumAmount) || 0;
8967
+ asociated.maximumItemsQuantity = ((_k = this.variants[0]) === null || _k === void 0 ? void 0 : _k.stock) > 0 && 'maximumItemsQuantity' in this.variants[0] ? (_l = this.variants[0]) === null || _l === void 0 ? void 0 : _l.maximumItemsQuantity : (_m = this.variants[0]) === null || _m === void 0 ? void 0 : _m.stock;
8968
+ asociated.minimumItemsQuantity = ((_o = this.variants[0]) === null || _o === void 0 ? void 0 : _o.stock) > 0 && 'minimumItemsQuantity' in this.variants[0]
8969
+ && ((_p = this.variants[0]) === null || _p === void 0 ? void 0 : _p.minimumItemsQuantity) > 0 ? (_q = this.variants[0]) === null || _q === void 0 ? void 0 : _q.minimumItemsQuantity : (((_r = this.variants[0]) === null || _r === void 0 ? void 0 : _r.multipleQuantity) ? (_s = this.variants[0]) === null || _s === void 0 ? void 0 : _s.multipleQuantity : 1);
8954
8970
  asociated.finalConsumer = {
8955
- finalConsumerPrice: (_r = this.variants[0]) === null || _r === void 0 ? void 0 : _r.final_consumer_price,
8956
- originalFinalConsumerPrice: (_s = this.variants[0]) === null || _s === void 0 ? void 0 : _s.original_final_consumer_price,
8971
+ finalConsumerPrice: (_t = this.variants[0]) === null || _t === void 0 ? void 0 : _t.final_consumer_price,
8972
+ originalFinalConsumerPrice: (_u = this.variants[0]) === null || _u === void 0 ? void 0 : _u.original_final_consumer_price,
8957
8973
  };
8958
8974
  asociated.taxes = {
8959
- taxIncluded: (_t = this.variants[0]) === null || _t === void 0 ? void 0 : _t.taxIncluded,
8960
- taxCategory: (_u = this.variants[0]) === null || _u === void 0 ? void 0 : _u.taxCategory,
8975
+ taxIncluded: (_v = this.variants[0]) === null || _v === void 0 ? void 0 : _v.taxIncluded,
8976
+ taxCategory: (_w = this.variants[0]) === null || _w === void 0 ? void 0 : _w.taxCategory,
8961
8977
  };
8962
8978
  // Segun version del backend
8963
- if ((_v = this.variants[0]) === null || _v === void 0 ? void 0 : _v.taxLegendInfo) {
8979
+ if ((_x = this.variants[0]) === null || _x === void 0 ? void 0 : _x.taxLegendInfo) {
8964
8980
  // Nuevo backend
8965
- asociated.priceWithoutTaxes = (_w = this.variants[0]) === null || _w === void 0 ? void 0 : _w.taxLegendInfo.priceWithoutTaxes;
8966
- asociated.taxeAmount = (_x = this.variants[0]) === null || _x === void 0 ? void 0 : _x.taxLegendInfo.taxes;
8967
- asociated.taxRate = (_y = this.variants[0]) === null || _y === void 0 ? void 0 : _y.taxLegendInfo.taxRate;
8981
+ asociated.priceWithoutTaxes = (_y = this.variants[0]) === null || _y === void 0 ? void 0 : _y.taxLegendInfo.priceWithoutTaxes;
8982
+ asociated.taxeAmount = (_z = this.variants[0]) === null || _z === void 0 ? void 0 : _z.taxLegendInfo.taxes;
8983
+ asociated.taxRate = (_0 = this.variants[0]) === null || _0 === void 0 ? void 0 : _0.taxLegendInfo.taxRate;
8968
8984
  }
8969
8985
  else {
8970
8986
  // Backend antiguo
8971
- asociated.priceWithoutTaxes = (_0 = (_z = this.variants[0]) === null || _z === void 0 ? void 0 : _z.priceWithoutTaxes, (_0 !== null && _0 !== void 0 ? _0 : undefined));
8972
- asociated.taxeAmount = (_2 = (_1 = this.variants[0]) === null || _1 === void 0 ? void 0 : _1.taxes, (_2 !== null && _2 !== void 0 ? _2 : undefined));
8973
- asociated.taxRate = (_4 = (_3 = this.variants[0]) === null || _3 === void 0 ? void 0 : _3.taxRate, (_4 !== null && _4 !== void 0 ? _4 : undefined));
8987
+ asociated.priceWithoutTaxes = (_2 = (_1 = this.variants[0]) === null || _1 === void 0 ? void 0 : _1.priceWithoutTaxes, (_2 !== null && _2 !== void 0 ? _2 : undefined));
8988
+ asociated.taxeAmount = (_4 = (_3 = this.variants[0]) === null || _3 === void 0 ? void 0 : _3.taxes, (_4 !== null && _4 !== void 0 ? _4 : undefined));
8989
+ asociated.taxRate = (_6 = (_5 = this.variants[0]) === null || _5 === void 0 ? void 0 : _5.taxRate, (_6 !== null && _6 !== void 0 ? _6 : undefined));
8974
8990
  }
8975
8991
  this.asociatedDataSubject.next(asociated);
8976
8992
  };
@@ -10613,15 +10629,24 @@ let RedsysCatchEcComponent = class RedsysCatchEcComponent extends ComponentHelpe
10613
10629
  case '200':
10614
10630
  state = 'success';
10615
10631
  this.setStateInLocal('Su pago fue procesado con éxito.', state);
10632
+ if (queryParams.total_amount) {
10633
+ localStorage.setItem('total_amount', queryParams.total_amount);
10634
+ }
10616
10635
  break;
10617
10636
  case 'success':
10618
10637
  this.setStateInLocal('Su pago fue procesado con éxito.', state);
10638
+ if (queryParams.total_amount) {
10639
+ localStorage.setItem('total_amount', queryParams.total_amount);
10640
+ }
10619
10641
  break;
10620
10642
  case 'pending':
10621
10643
  this.setStateInLocal('Su pago fue procesado con éxito.', state);
10622
10644
  break;
10623
10645
  case 'failure':
10624
10646
  this.setStateInLocal('Se ha cancelado el proceso de pago.', state);
10647
+ if (queryParams.total_amount) {
10648
+ localStorage.setItem('total_amount', queryParams.total_amount);
10649
+ }
10625
10650
  break;
10626
10651
  case 'cancel':
10627
10652
  this.setStateInLocal('Se ha cancelado el proceso de pago.', state);
@@ -16303,6 +16328,10 @@ let PlaceToPayEcComponent = class PlaceToPayEcComponent extends ComponentHelper
16303
16328
  this.ready = new EventEmitter();
16304
16329
  this.loading = false;
16305
16330
  this.closeModal = '';
16331
+ this.hasPreviousFailure = false;
16332
+ this.previousFailureAmount = null;
16333
+ this.previousFailureDate = null;
16334
+ this.buttonText = 'Pagar';
16306
16335
  this.dataRedirect = () => this.consts.getUrlBase() + 'shop-api/' + this.consts.getChannel() + '/place-to-pay/' + this.cartService.cart_token + '/process-payment';
16307
16336
  this.iniciar = () => {
16308
16337
  this.closeModal = '';
@@ -16323,17 +16352,33 @@ let PlaceToPayEcComponent = class PlaceToPayEcComponent extends ComponentHelper
16323
16352
  var _a, _b, _c, _d;
16324
16353
  let state = this.closeModal !== '' ? this.closeModal : localStorage.getItem('state');
16325
16354
  !state && ((_a = this.ventana) === null || _a === void 0 ? void 0 : _a.closed) && (state = 'cancel');
16355
+ this.hasPreviousFailure = false;
16326
16356
  this.loading = true;
16327
16357
  if (state) {
16328
- this.loading = false;
16329
16358
  localStorage.removeItem('state');
16330
16359
  if (state === 'success' || state === 'pending') {
16331
16360
  (_b = this.ventana) === null || _b === void 0 ? void 0 : _b.close();
16332
16361
  this.ready.emit(true);
16333
16362
  return;
16334
16363
  }
16364
+ this.loading = false;
16335
16365
  if (state === 'failure' || state === 'cancel') {
16336
16366
  (_c = this.ventana) === null || _c === void 0 ? void 0 : _c.close();
16367
+ if (state === 'failure') {
16368
+ const amt = localStorage.getItem('total_amount');
16369
+ if (amt) {
16370
+ this.hasPreviousFailure = true;
16371
+ this.previousFailureAmount = parseFloat(amt);
16372
+ this.previousFailureDate = new Date().toLocaleDateString('es-AR', {
16373
+ day: '2-digit',
16374
+ month: '2-digit',
16375
+ year: 'numeric',
16376
+ });
16377
+ this.buttonText = 'Reintentar pago';
16378
+ localStorage.removeItem('total_amount');
16379
+ localStorage.removeItem('payment_date');
16380
+ }
16381
+ }
16337
16382
  this.getPreference();
16338
16383
  this.processError(state === 'cancel' ? 'Se canceló el pago con Place to Pay' : '');
16339
16384
  return;
@@ -16396,7 +16441,7 @@ __decorate$20([
16396
16441
  PlaceToPayEcComponent = __decorate$20([
16397
16442
  Component({
16398
16443
  selector: 'app-place-to-pay-ec',
16399
- template: "<div class=\"text-center\">\n <ng-container *ngIf=\"url; else loadingUrl\">\n <ng-container *ngIf=\"!loading; else loadingTemp\">\n <button (click)=\"iniciar()\" class=\"btn btn-outline-secondary rounded-0 comprar mt-3\">Pagar</button>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #loadingUrl>\n <div class=\"d-flex flex-column justify-content-center align-items-center mt-2\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n</ng-template>\n\n<ng-template #loadingTemp>\n <div class=\"d-flex flex-column justify-content-center align-items-center mt-2\">\n <h3>Procesando el pago por Place to Pay</h3>\n <h5>Recuerde hacer click en \"Volver al sitio\" desde Place to Pay para finalizar la compra.</h5>\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n <div class=\"container-fluid\">\n <div class=\"row\">\n <div class=\"col-5\">\n <hr>\n </div>\n <div class=\"col-2 text-center\">\n <label>o</label>\n </div>\n <div class=\"col-5\">\n <hr>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-column justify-content-center align-items-center mt-2\">\n <button (click)=\"clickClose()\" class=\"btn btn-outline-secondary rounded-0 comprar\">Cancelar pago</button>\n </div>\n</ng-template>",
16444
+ template: "<div class=\"text-center\">\n <ng-container *ngIf=\"url; else loadingUrl\">\n <ng-container *ngIf=\"!loading; else loadingTemp\">\n <button (click)=\"iniciar()\" class=\"btn btn-outline-secondary rounded-0 comprar mt-3\">\n {{ buttonText }}\n </button>\n\n <!-- Mensaje de intento previo fallido -->\n <div *ngIf=\"hasPreviousFailure\" class=\"alert alert-danger mt-3\">\n El pago no se pudo realizar el {{ previousFailureDate }}\n por un monto de {{ previousFailureAmount | ecCurrencySymbol }}.\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #loadingUrl>\n <div class=\"d-flex flex-column justify-content-center align-items-center mt-2\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n</ng-template>\n\n<ng-template #loadingTemp>\n <div class=\"d-flex flex-column justify-content-center align-items-center mt-2\">\n <h3>Procesando el pago por Place to Pay</h3>\n <h5>Recuerde hacer click en \"Volver al sitio\" desde Place to Pay para finalizar la compra.</h5>\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n <div class=\"container-fluid\">\n <div class=\"row\">\n <div class=\"col-5\">\n <hr>\n </div>\n <div class=\"col-2 text-center\">\n <label>o</label>\n </div>\n <div class=\"col-5\">\n <hr>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-column justify-content-center align-items-center mt-2\">\n <button (click)=\"clickClose()\" class=\"btn btn-outline-secondary rounded-0 comprar\">Cancelar pago</button>\n </div>\n</ng-template>",
16400
16445
  styles: [""]
16401
16446
  })
16402
16447
  ], PlaceToPayEcComponent);