ng-easycommerce 0.1.1 → 1.1.3

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 (115) hide show
  1. package/README.md +14 -0
  2. package/assets/ec-i18n/ct.json +4 -0
  3. package/assets/ec-i18n/en.json +4 -0
  4. package/assets/ec-i18n/es.json +4 -0
  5. package/assets/ec-i18n/fr.json +4 -0
  6. package/assets/ec-i18n/gl.json +4 -0
  7. package/assets/ec-i18n/pr.json +4 -0
  8. package/bundles/ng-easycommerce.umd.js +5191 -3521
  9. package/bundles/ng-easycommerce.umd.js.map +1 -1
  10. package/bundles/ng-easycommerce.umd.min.js +1 -1
  11. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  12. package/esm2015/lib/api/connection.service.js +2 -2
  13. package/esm2015/lib/core.consts.js +4 -5
  14. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +2 -2
  15. package/esm2015/lib/ec-component/cart-bootstrap-navigation.js +27 -0
  16. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +11 -1
  17. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +28 -3
  18. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +185 -13
  19. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +6 -2
  20. package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +26 -9
  21. package/esm2015/lib/ec-component/checkout-ec/payment-ec-single/payment-ec-single.component.js +11 -3
  22. package/esm2015/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +4 -2
  23. package/esm2015/lib/ec-component/coupon-ec/coupon-ec.component.js +6 -1
  24. package/esm2015/lib/guards/able-buyer-guard.service.js +2 -2
  25. package/esm2015/lib/guards/auth-guard.service.js +2 -2
  26. package/esm2015/lib/guards/checkout-ready.service.js +3 -3
  27. package/esm2015/lib/guards/loggedin-guard.service.js +2 -2
  28. package/esm2015/lib/guards/user-role-guard.service.js +2 -2
  29. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  30. package/esm2015/lib/services/account/orders.service.js +6 -4
  31. package/esm2015/lib/services/auth.service.js +4 -3
  32. package/esm2015/lib/services/captcha.service.js +6 -4
  33. package/esm2015/lib/services/cart.service.js +1194 -74
  34. package/esm2015/lib/services/channel-config.service.js +4 -6
  35. package/esm2015/lib/services/checkout/addressing.service.js +65 -9
  36. package/esm2015/lib/services/checkout/checkout.service.js +58 -9
  37. package/esm2015/lib/services/checkout/error-handler.service.js +4 -3
  38. package/esm2015/lib/services/checkout/payment.service.js +35 -15
  39. package/esm2015/lib/services/checkout/shipment.service.js +54 -3
  40. package/esm2015/lib/services/concatenated-associations.service.js +4 -3
  41. package/esm2015/lib/services/currency.service.js +5 -3
  42. package/esm2015/lib/services/filters.service.js +2 -2
  43. package/esm2015/lib/services/footer/footer.service.js +4 -3
  44. package/esm2015/lib/services/gift-card.service.js +56 -5
  45. package/esm2015/lib/services/parameters.service.js +5 -3
  46. package/esm2015/lib/services/reviews.service.js +5 -4
  47. package/esm2015/lib/services/seo.service.js +4 -5
  48. package/esm2015/lib/services/stores.service.js +4 -3
  49. package/esm2015/lib/services/wishlist.service.js +3 -4
  50. package/esm2015/lib/utils/analytics/google-analytics.service.js +1 -1
  51. package/esm2015/lib/utils/order-util.service.js +22 -2
  52. package/esm2015/lib/utils/price-presentation.service.js +2 -3
  53. package/esm2015/lib/utils/shipping-price-display.service.js +2 -3
  54. package/esm5/lib/api/connection.service.js +2 -2
  55. package/esm5/lib/core.consts.js +4 -5
  56. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +2 -2
  57. package/esm5/lib/ec-component/cart-bootstrap-navigation.js +27 -0
  58. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +11 -1
  59. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +28 -3
  60. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +206 -12
  61. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +6 -2
  62. package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +31 -14
  63. package/esm5/lib/ec-component/checkout-ec/payment-ec-single/payment-ec-single.component.js +11 -3
  64. package/esm5/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +5 -3
  65. package/esm5/lib/ec-component/coupon-ec/coupon-ec.component.js +6 -1
  66. package/esm5/lib/guards/able-buyer-guard.service.js +2 -2
  67. package/esm5/lib/guards/auth-guard.service.js +2 -2
  68. package/esm5/lib/guards/checkout-ready.service.js +3 -3
  69. package/esm5/lib/guards/loggedin-guard.service.js +2 -2
  70. package/esm5/lib/guards/user-role-guard.service.js +2 -2
  71. package/esm5/lib/interfaces/checkout-data.js +1 -1
  72. package/esm5/lib/services/account/orders.service.js +6 -4
  73. package/esm5/lib/services/auth.service.js +4 -3
  74. package/esm5/lib/services/captcha.service.js +6 -4
  75. package/esm5/lib/services/cart.service.js +1243 -94
  76. package/esm5/lib/services/channel-config.service.js +4 -6
  77. package/esm5/lib/services/checkout/addressing.service.js +65 -9
  78. package/esm5/lib/services/checkout/checkout.service.js +65 -13
  79. package/esm5/lib/services/checkout/error-handler.service.js +4 -3
  80. package/esm5/lib/services/checkout/payment.service.js +29 -11
  81. package/esm5/lib/services/checkout/shipment.service.js +58 -7
  82. package/esm5/lib/services/concatenated-associations.service.js +4 -3
  83. package/esm5/lib/services/currency.service.js +5 -3
  84. package/esm5/lib/services/filters.service.js +2 -2
  85. package/esm5/lib/services/footer/footer.service.js +4 -3
  86. package/esm5/lib/services/gift-card.service.js +59 -5
  87. package/esm5/lib/services/parameters.service.js +5 -3
  88. package/esm5/lib/services/reviews.service.js +5 -4
  89. package/esm5/lib/services/seo.service.js +4 -5
  90. package/esm5/lib/services/stores.service.js +4 -3
  91. package/esm5/lib/services/wishlist.service.js +3 -4
  92. package/esm5/lib/utils/analytics/google-analytics.service.js +1 -1
  93. package/esm5/lib/utils/order-util.service.js +22 -2
  94. package/esm5/lib/utils/price-presentation.service.js +2 -3
  95. package/esm5/lib/utils/shipping-price-display.service.js +2 -3
  96. package/fesm2015/ng-easycommerce.js +4360 -2745
  97. package/fesm2015/ng-easycommerce.js.map +1 -1
  98. package/fesm5/ng-easycommerce.js +5193 -3523
  99. package/fesm5/ng-easycommerce.js.map +1 -1
  100. package/lib/ec-component/cart-bootstrap-navigation.d.ts +7 -0
  101. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +5 -2
  102. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +6 -1
  103. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +27 -3
  104. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +1 -1
  105. package/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.d.ts +3 -0
  106. package/lib/ec-component/checkout-ec/payment-ec-single/payment-ec-single.component.d.ts +3 -0
  107. package/lib/interfaces/checkout-data.d.ts +6 -1
  108. package/lib/services/cart.service.d.ts +123 -7
  109. package/lib/services/checkout/addressing.service.d.ts +1 -1
  110. package/lib/services/checkout/checkout.service.d.ts +3 -0
  111. package/lib/services/checkout/shipment.service.d.ts +2 -2
  112. package/lib/services/gift-card.service.d.ts +1 -0
  113. package/lib/utils/order-util.service.d.ts +1 -0
  114. package/ng-easycommerce.metadata.json +1 -1
  115. package/package.json +1 -1
@@ -65,6 +65,7 @@ import { PaymentEcComponent } from './payment-ec/payment-ec.component';
65
65
  import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal';
66
66
  import { ShippingPriceDisplayService } from '../../utils/shipping-price-display.service';
67
67
  import { SeoService } from '../../services/seo.service';
68
+ import { handleInvalidatedCheckoutNavigation, navigateHomeAfterCartBootstrapRecovery } from '../cart-bootstrap-navigation';
68
69
  var CheckoutEcComponent = /** @class */ (function (_super) {
69
70
  __extends(CheckoutEcComponent, _super);
70
71
  function CheckoutEcComponent(checkoutService, toastrService, router, cartService, productsService, channelService, consts, elementRef, modalService, shippingPriceDisplay, seo) {
@@ -94,6 +95,21 @@ var CheckoutEcComponent = /** @class */ (function (_super) {
94
95
  _this.paymentAutoOpened = false;
95
96
  _this.autoClosedSteps = new Set();
96
97
  _this.manuallyOpenedSteps = new Set();
98
+ _this.checkoutInvalidationHandled = false;
99
+ _this.handleCartBootstrapRecovery = function () {
100
+ navigateHomeAfterCartBootstrapRecovery(_this.router.url, 'checkout', function () { return _this.cartService.consumeCartBootstrapRecovery(); }, function () { return _this.router.navigateByUrl('/'); });
101
+ };
102
+ _this.handleCartCheckoutInvalidation = function () {
103
+ if (_this.checkoutInvalidationHandled)
104
+ return;
105
+ _this.checkoutInvalidationHandled = handleInvalidatedCheckoutNavigation(_this.router.url, function () {
106
+ var _a;
107
+ _this.canCheckout = false;
108
+ _this.loadingSubject.next(false);
109
+ (_a = _this.subReady) === null || _a === void 0 ? void 0 : _a.unsubscribe();
110
+ _this.checkoutService.invalidateCheckoutState();
111
+ }, function () { return _this.router.navigateByUrl('/'); });
112
+ };
97
113
  _this.hideTaxes = false;
98
114
  _this.showTaxLegend = false;
99
115
  _this.shipmentSummary = null;
@@ -263,10 +279,12 @@ var CheckoutEcComponent = /** @class */ (function (_super) {
263
279
  _this.goToNextFromAddress = function () { return _this.goToNextSection('address'); };
264
280
  _this.isSectionOpen = function (stepName) { return _this.openSections.includes(stepName); };
265
281
  _this.getSummaryLabel = function (type, item) {
282
+ var _a, _b;
266
283
  switch (type) {
267
284
  case 'productsBeforeDiscounts': return 'products-before-discounts';
268
285
  case 'subtotal': return 'subtotal';
269
286
  case 'discount': return 'discount';
287
+ case 'paymentMethodAdjustment': return (_b = (_a = item) === null || _a === void 0 ? void 0 : _a.amount, (_b !== null && _b !== void 0 ? _b : 0)) < 0 ? 'payment-method-discount' : 'payment-method-surcharge';
270
288
  case 'coupon': return 'coupon';
271
289
  case 'lineDiscount': return 'line-discounts';
272
290
  case 'shipment': return 'shipment';
@@ -346,6 +364,8 @@ var CheckoutEcComponent = /** @class */ (function (_super) {
346
364
  return false;
347
365
  if ((item.type === 'discount' || item.type === 'coupon') && _this.hideDiscounts)
348
366
  return false;
367
+ if (item.type === 'paymentMethodAdjustment' && (item.amount === 0 || item.amount == null))
368
+ return false;
349
369
  if (item.type === 'taxes' && (_this.hideTaxes || item.amount == 0))
350
370
  return false;
351
371
  if (item.type === 'clientTaxes' && (_this.hideTaxes || item.amount == 0))
@@ -470,6 +490,9 @@ var CheckoutEcComponent = /** @class */ (function (_super) {
470
490
  }
471
491
  CheckoutEcComponent.prototype.ngOnInit = function () {
472
492
  var _this = this;
493
+ this.cartBootstrapRecoverySubscription = this.cartService.cartBootstrapRecovery.subscribe(this.handleCartBootstrapRecovery);
494
+ this.cartCheckoutInvalidationSubscription = this.cartService.cartCheckoutInvalidation.subscribe(this.handleCartCheckoutInvalidation);
495
+ this.handleCartBootstrapRecovery();
473
496
  this.navSub = this.router.events.pipe(filter(function (event) { return event instanceof NavigationEnd; })).subscribe(function () {
474
497
  if (_this.router.url.includes('/checkout')) {
475
498
  _this.scrollToTopOnEnter();
@@ -553,7 +576,7 @@ var CheckoutEcComponent = /** @class */ (function (_super) {
553
576
  this.evaluateMobileBarVisibility();
554
577
  };
555
578
  CheckoutEcComponent.prototype.ngOnDestroy = function () {
556
- var _a, _b, _c;
579
+ var _a, _b, _c, _d, _e;
557
580
  if (this.summaryObserver) {
558
581
  this.summaryObserver.disconnect();
559
582
  this.summaryObserver = null;
@@ -562,6 +585,8 @@ var CheckoutEcComponent = /** @class */ (function (_super) {
562
585
  (_a = this.subCan) === null || _a === void 0 ? void 0 : _a.unsubscribe();
563
586
  (_b = this.subReady) === null || _b === void 0 ? void 0 : _b.unsubscribe();
564
587
  (_c = this.navSub) === null || _c === void 0 ? void 0 : _c.unsubscribe();
588
+ (_d = this.cartBootstrapRecoverySubscription) === null || _d === void 0 ? void 0 : _d.unsubscribe();
589
+ (_e = this.cartCheckoutInvalidationSubscription) === null || _e === void 0 ? void 0 : _e.unsubscribe();
565
590
  };
566
591
  CheckoutEcComponent.prototype.aggregateDiscounts = function (data) {
567
592
  if (!data || !data.length)
@@ -708,11 +733,11 @@ var CheckoutEcComponent = /** @class */ (function (_super) {
708
733
  CheckoutEcComponent = __decorate([
709
734
  Component({
710
735
  selector: 'app-checkout-ec',
711
- template: "<main class=\"py-4\" id=\"appCheckoutEc\">\n <ng-container *ngIf=\"(checkoutService.loading$ | async) as load\">\n <div class=\"checkout-loading-overlay\" *ngIf=\"load\">\n <div class=\"checkout-loading-card\">\n <app-loading-full-ec></app-loading-full-ec>\n <h5>{{ 'processing-payment' | translate }}</h5>\n </div>\n </div>\n </ng-container>\n <div *ngIf=\"canCheckout; else cartEmpty\">\n <ng-container *ngIf=\"checkoutView === 'single'; else legacyCheckout\">\n <div class=\"container\">\n <div class=\"row checkout-single-row\">\n <div class=\"col-lg-8 col-12\">\n <div class=\"checkout-single\">\n <div class=\"checkout-section\" *ngFor=\"let step of steps; let x=index\"\n [attr.data-step]=\"step.name\"\n [class.is-disabled]=\"!isStepEnabled(step.name)\"\n [class.is-complete]=\"isStepComplete(step.name)\">\n <button class=\"section-header\" type=\"button\"\n [attr.aria-expanded]=\"isSectionOpen(step.name)\"\n [disabled]=\"!isStepEnabled(step.name)\"\n (click)=\"toggleSection(step.name)\">\n <span class=\"section-index\">{{ x + 1 }}</span>\n <span class=\"section-title\">\n {{ getSingleStepTitle(step) | translate }}\n </span>\n <span class=\"section-state\" *ngIf=\"isStepComplete(step.name)\">\n &#10003;\n </span>\n </button>\n <div class=\"section-summary\" *ngIf=\"isStepComplete(step.name) && !isSectionOpen(step.name)\"\n role=\"button\" tabindex=\"0\"\n (click)=\"toggleSection(step.name)\"\n (keydown.enter)=\"toggleSection(step.name)\"\n (keydown.space)=\"toggleSection(step.name)\">\n <span class=\"section-summary-label\">\n {{ getSingleSummaryLabel(step) }}\n </span>\n <span class=\"section-summary-value\">\n {{ getSingleSummaryValue(step) }}\n </span>\n <span class=\"section-summary-edit\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"toggleSection(step.name); $event.stopPropagation()\"\n (keydown.enter)=\"toggleSection(step.name); $event.stopPropagation()\"\n (keydown.space)=\"toggleSection(step.name); $event.stopPropagation()\">\n {{ 'edit' | translate }}\n </span>\n </div>\n <div class=\"section-body\" [hidden]=\"!isSectionOpen(step.name)\">\n <ng-container [ngSwitch]=\"step.name\">\n <ng-container *ngSwitchCase=\"'address'\">\n <app-dataform-ec [step_id]=\"step.step\" [isLastOne]=\"false\"\n [nextStep]=\"goToNextFromAddress\" [compactAddressView]=\"true\"\n (dirtyChange)=\"onStepDirtyChange('address', $event)\">\n </app-dataform-ec>\n </ng-container>\n <ng-container *ngSwitchCase=\"'shipment'\">\n <app-shipment-ec [step_id]=\"step.step\" [compactShipmentView]=\"true\"\n (advanceStep)=\"goToNextSection(step.name)\"\n (summaryChange)=\"setShipmentSummary($event)\">\n </app-shipment-ec>\n </ng-container>\n <ng-container *ngSwitchCase=\"'payment'\">\n <app-payment-ec [step_id]=\"step.step\" [compactPaymentView]=\"true\"\n (dirtyChange)=\"onStepDirtyChange('payment', $event)\"></app-payment-ec>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-lg-4 col-12\">\n <ng-container *ngIf=\"(checkoutService.state$ | async) as checkoutState\">\n <aside class=\"checkout-summary\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true) || (areAllStepsReady(checkoutState) && !shouldHideFinishButton(checkoutState))\">\n <ng-container *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <h4 class=\"summary-title\">\n {{ checkoutView === 'single' ? ('payment-summary' | translate) : ('purchase-summary' | translate) }}\n </h4>\n <div class=\"summary-totals\" *ngIf=\"(checkoutService.asociatedData$ | async) as data\">\n <ng-container *ngFor=\"let item of getSummaryData(data)\">\n <div class=\"summary-total-row\" *ngIf=\"shouldShowSummaryItem(item)\"\n [class.summary-total-row-total]=\"item.type === 'total'\"\n [class.summary-total-row-tax-info]=\"item.type === 'taxes' && item.taxesIncludedInTotal === true\">\n <span>{{ getSummaryLabel(item.type, item) | translate }}</span>\n <ng-container *ngIf=\"getSummaryAmountView(item) as priceView\">\n <span class=\"summary-total-row-price\"\n [class.summary-total-row-price--discounted]=\"priceView.showOriginalPrice\"\n [class.summary-total-row-price--free]=\"priceView.isFree\">\n <del *ngIf=\"priceView.showOriginalPrice\">\n {{ priceView.originalPrice | ecCurrencySymbol:'alwaysShowDecimals' }}\n </del>\n <strong>\n <ng-container *ngIf=\"priceView.isFree; else summaryValue\">\n {{ 'free' | translate }}\n </ng-container>\n <ng-template #summaryValue>\n {{ priceView.finalPrice | ecCurrencySymbol:'alwaysShowDecimals' }}\n </ng-template>\n </strong>\n </span>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <button class=\"btn valid-btn w-100 mt-3 text-uppercase\"\n id=\"checkoutFinishBtn\"\n *ngIf=\"areAllStepsReady(checkoutState) && !shouldHideFinishButton(checkoutState)\"\n (click)=\"endCheckout()\">\n {{ 'finish-checkout' | translate }}\n </button>\n </aside>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"(checkoutService.asociatedData$ | async) as data\">\n <ng-container *ngIf=\"(checkoutService.state$ | async) as checkoutState\">\n <div class=\"summary-mobile-bar\" [class.is-hidden]=\"hideMobileSummaryBar\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <div class=\"summary-mobile-total\">\n <span class=\"summary-mobile-label\">{{ 'total' | translate }}</span>\n <span class=\"summary-mobile-value\">\n {{ getTotalAmount(data) != null ? (getTotalAmount(data) | ecCurrencySymbol:'alwaysShowDecimals') : '--' }}\n </span>\n </div>\n <button class=\"btn valid-btn summary-mobile-btn\"\n *ngIf=\"!shouldHideFinishButton(checkoutState)\"\n [disabled]=\"!areAllStepsReady(checkoutState)\"\n (click)=\"endCheckout()\">\n {{ 'finish-checkout' | translate }}\n </button>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #unsavedChangesModal>\n <div class=\"modal-content checkout-unsaved-modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">{{ 'unsaved-changes-title' | translate }}</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\"\n (click)=\"cancelUnsavedClose()\"></button>\n </div>\n <div class=\"modal-body\">\n {{ 'unsaved-changes-body' | translate }}\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-keep-editing\"\n (click)=\"cancelUnsavedClose()\">\n {{ 'unsaved-changes-continue' | translate }}\n </button>\n <button type=\"button\" class=\"btn btn-primary btn-discard\" (click)=\"confirmUnsavedDiscard()\">\n {{ 'unsaved-changes-discard' | translate }}\n </button>\n </div>\n </div>\n </ng-template>\n </div>\n </ng-container>\n <ng-template #legacyCheckout>\n <app-detail-checkout-block-ec></app-detail-checkout-block-ec>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-md-12 col-12\">\n <div id=\"stepper\" class=\"bs-stepper\" *ngIf=\"(checkoutService.state$ | async) as state\">\n\n <div class=\"row mb-3 position-relative stepperContainer\">\n <ng-container *ngFor=\"let step of steps; let x=index\">\n <div [class]=\"'px-0 col-'+(12 / steps.length)\">\n <div [class]=\"'step ' + getClassToStepper(x)\" [attr.data-target]=\"'#test-l-'+step.step\">\n <button class=\"step-trigger\">\n <span class=\"bs-stepper-circle\">{{x+1}}</span>\n <span class=\"bs-stepper-label\">{{ step.label |translate}}</span>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- CONTENT -->\n <div class=\"bs-stepper-content margin-bottom-i\">\n <div *ngIf=\"(checkoutService.state$ | async) as checkoutState\">\n <ng-container *ngFor=\"let step of steps; let x=index\">\n <div [id]=\"'test-l-'+step.step\" class=\"content\">\n <app-step-ec [step_id]=\"step.step\" [id_step]=\"x+1\" [previousStep]=\"steps[x-1] ? steps[x-1].name : step.name\" [nextStep]=\"steps[x+1] ? next : endCheckout\" [goBack]=\"goBack\" [lastStep]=\"steps[x+1] ? false : true\"> \n </app-step-ec> \n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"(checkoutService.loading$ | async) as load\">\n <div class=\"col-md-12 col-12\">\n <div *ngIf=\"load\" class=\"d-flex flex-column jusitfy-content-center align-items-center mt-2\">\n <app-loading-full-ec></app-loading-full-ec>\n <h5>{{ 'processing-payment' | translate }}</h5>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </div>\n</main>\n\n<ng-template #cartEmpty>\n <div class=\"wrap\">\n <div *ngIf=\"(loading$ | async) as load\">\n <app-loading-full-ec *ngIf=\"canCheckout\"></app-loading-full-ec>\n </div>\n <section id=\"cart\" *ngIf=\"!canCheckout\">\n <section id=\"cart bg-white h-50\">\n <div class=\"d-flex flex-column justify-content-center align-items-center text-center\">\n <h4>{{ 'empty-cart' | translate }}</h4>\n <h5>{{ 'empty-cart-detail' | translate }}</h5>\n </div>\n </section>\n </section>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <app-loading-full-ec></app-loading-full-ec>\n</ng-template>\n\n<ng-template #requireLoginView>\n</ng-template>\n\n\n<!-- <ec-checkout-error></ec-checkout-error> -->\n",
736
+ template: "<main class=\"py-4\" id=\"appCheckoutEc\">\n <ng-container *ngIf=\"(checkoutService.loading$ | async) as load\">\n <div class=\"checkout-loading-overlay\" *ngIf=\"load\">\n <div class=\"checkout-loading-card\">\n <app-loading-full-ec></app-loading-full-ec>\n <h5>{{ 'processing-payment' | translate }}</h5>\n </div>\n </div>\n </ng-container>\n <div *ngIf=\"canCheckout; else cartEmpty\">\n <ng-container *ngIf=\"checkoutView === 'single'; else legacyCheckout\">\n <div class=\"container\">\n <div class=\"row checkout-single-row\">\n <div class=\"col-lg-8 col-12\">\n <div class=\"checkout-single\">\n <div class=\"checkout-section\" *ngFor=\"let step of steps; let x=index\"\n [attr.data-step]=\"step.name\"\n [class.is-disabled]=\"!isStepEnabled(step.name)\"\n [class.is-complete]=\"isStepComplete(step.name)\">\n <button class=\"section-header\" type=\"button\"\n [attr.aria-expanded]=\"isSectionOpen(step.name)\"\n [disabled]=\"!isStepEnabled(step.name)\"\n (click)=\"toggleSection(step.name)\">\n <span class=\"section-index\">{{ x + 1 }}</span>\n <span class=\"section-title\">\n {{ getSingleStepTitle(step) | translate }}\n </span>\n <span class=\"section-state\" *ngIf=\"isStepComplete(step.name)\">\n &#10003;\n </span>\n </button>\n <div class=\"section-summary\" *ngIf=\"isStepComplete(step.name) && !isSectionOpen(step.name)\"\n role=\"button\" tabindex=\"0\"\n (click)=\"toggleSection(step.name)\"\n (keydown.enter)=\"toggleSection(step.name)\"\n (keydown.space)=\"toggleSection(step.name)\">\n <span class=\"section-summary-label\">\n {{ getSingleSummaryLabel(step) }}\n </span>\n <span class=\"section-summary-value\">\n {{ getSingleSummaryValue(step) }}\n </span>\n <span class=\"section-summary-edit\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"toggleSection(step.name); $event.stopPropagation()\"\n (keydown.enter)=\"toggleSection(step.name); $event.stopPropagation()\"\n (keydown.space)=\"toggleSection(step.name); $event.stopPropagation()\">\n {{ 'edit' | translate }}\n </span>\n </div>\n <div class=\"section-body\" [hidden]=\"!isSectionOpen(step.name)\">\n <ng-container [ngSwitch]=\"step.name\">\n <ng-container *ngSwitchCase=\"'address'\">\n <app-dataform-ec [step_id]=\"step.step\" [isLastOne]=\"false\"\n [nextStep]=\"goToNextFromAddress\" [compactAddressView]=\"true\"\n (dirtyChange)=\"onStepDirtyChange('address', $event)\">\n </app-dataform-ec>\n </ng-container>\n <ng-container *ngSwitchCase=\"'shipment'\">\n <app-shipment-ec [step_id]=\"step.step\" [compactShipmentView]=\"true\"\n (advanceStep)=\"goToNextSection(step.name)\"\n (summaryChange)=\"setShipmentSummary($event)\">\n </app-shipment-ec>\n </ng-container>\n <ng-container *ngSwitchCase=\"'payment'\">\n <app-payment-ec [step_id]=\"step.step\" [compactPaymentView]=\"true\"\n (dirtyChange)=\"onStepDirtyChange('payment', $event)\"></app-payment-ec>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-lg-4 col-12\">\n <ng-container *ngIf=\"(checkoutService.state$ | async) as checkoutState\">\n <aside class=\"checkout-summary\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true) || (areAllStepsReady(checkoutState) && !shouldHideFinishButton(checkoutState))\">\n <ng-container *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <h4 class=\"summary-title\">\n {{ checkoutView === 'single' ? ('payment-summary' | translate) : ('purchase-summary' | translate) }}\n </h4>\n <div class=\"summary-totals\" *ngIf=\"(checkoutService.asociatedData$ | async) as data\">\n <ng-container *ngFor=\"let item of getSummaryData(data)\">\n <div class=\"summary-total-row\" *ngIf=\"shouldShowSummaryItem(item)\"\n [class.summary-total-row-total]=\"item.type === 'total'\"\n [class.summary-total-row-tax-info]=\"item.type === 'taxes' && item.taxesIncludedInTotal === true\">\n <span>\n {{ getSummaryLabel(item.type, item) | translate }}\n <ng-container *ngIf=\"item.type === 'paymentMethodAdjustment' && item.name && item.name !== 'discount' && item.name !== 'surcharge'\">\n \u00B7 {{ item.name }}\n </ng-container>\n </span>\n <ng-container *ngIf=\"getSummaryAmountView(item) as priceView\">\n <span class=\"summary-total-row-price\"\n [class.summary-total-row-price--discounted]=\"priceView.showOriginalPrice\"\n [class.summary-total-row-price--free]=\"priceView.isFree\">\n <del *ngIf=\"priceView.showOriginalPrice\">\n {{ priceView.originalPrice | ecCurrencySymbol:'alwaysShowDecimals' }}\n </del>\n <strong>\n <ng-container *ngIf=\"priceView.isFree; else summaryValue\">\n {{ 'free' | translate }}\n </ng-container>\n <ng-template #summaryValue>\n {{ priceView.finalPrice | ecCurrencySymbol:'alwaysShowDecimals' }}\n </ng-template>\n </strong>\n </span>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <button class=\"btn valid-btn w-100 mt-3 text-uppercase\"\n id=\"checkoutFinishBtn\"\n *ngIf=\"areAllStepsReady(checkoutState) && !shouldHideFinishButton(checkoutState)\"\n (click)=\"endCheckout()\">\n {{ 'finish-checkout' | translate }}\n </button>\n </aside>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"(checkoutService.asociatedData$ | async) as data\">\n <ng-container *ngIf=\"(checkoutService.state$ | async) as checkoutState\">\n <div class=\"summary-mobile-bar\" [class.is-hidden]=\"hideMobileSummaryBar\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <div class=\"summary-mobile-total\">\n <span class=\"summary-mobile-label\">{{ 'total' | translate }}</span>\n <span class=\"summary-mobile-value\">\n {{ getTotalAmount(data) != null ? (getTotalAmount(data) | ecCurrencySymbol:'alwaysShowDecimals') : '--' }}\n </span>\n </div>\n <button class=\"btn valid-btn summary-mobile-btn\"\n *ngIf=\"!shouldHideFinishButton(checkoutState)\"\n [disabled]=\"!areAllStepsReady(checkoutState)\"\n (click)=\"endCheckout()\">\n {{ 'finish-checkout' | translate }}\n </button>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #unsavedChangesModal>\n <div class=\"modal-content checkout-unsaved-modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">{{ 'unsaved-changes-title' | translate }}</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\"\n (click)=\"cancelUnsavedClose()\"></button>\n </div>\n <div class=\"modal-body\">\n {{ 'unsaved-changes-body' | translate }}\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-keep-editing\"\n (click)=\"cancelUnsavedClose()\">\n {{ 'unsaved-changes-continue' | translate }}\n </button>\n <button type=\"button\" class=\"btn btn-primary btn-discard\" (click)=\"confirmUnsavedDiscard()\">\n {{ 'unsaved-changes-discard' | translate }}\n </button>\n </div>\n </div>\n </ng-template>\n </div>\n </ng-container>\n <ng-template #legacyCheckout>\n <app-detail-checkout-block-ec></app-detail-checkout-block-ec>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-md-12 col-12\">\n <div id=\"stepper\" class=\"bs-stepper\" *ngIf=\"(checkoutService.state$ | async) as state\">\n\n <div class=\"row mb-3 position-relative stepperContainer\">\n <ng-container *ngFor=\"let step of steps; let x=index\">\n <div [class]=\"'px-0 col-'+(12 / steps.length)\">\n <div [class]=\"'step ' + getClassToStepper(x)\" [attr.data-target]=\"'#test-l-'+step.step\">\n <button class=\"step-trigger\">\n <span class=\"bs-stepper-circle\">{{x+1}}</span>\n <span class=\"bs-stepper-label\">{{ step.label |translate}}</span>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- CONTENT -->\n <div class=\"bs-stepper-content margin-bottom-i\">\n <div *ngIf=\"(checkoutService.state$ | async) as checkoutState\">\n <ng-container *ngFor=\"let step of steps; let x=index\">\n <div [id]=\"'test-l-'+step.step\" class=\"content\">\n <app-step-ec [step_id]=\"step.step\" [id_step]=\"x+1\" [previousStep]=\"steps[x-1] ? steps[x-1].name : step.name\" [nextStep]=\"steps[x+1] ? next : endCheckout\" [goBack]=\"goBack\" [lastStep]=\"steps[x+1] ? false : true\"> \n </app-step-ec> \n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"(checkoutService.loading$ | async) as load\">\n <div class=\"col-md-12 col-12\">\n <div *ngIf=\"load\" class=\"d-flex flex-column jusitfy-content-center align-items-center mt-2\">\n <app-loading-full-ec></app-loading-full-ec>\n <h5>{{ 'processing-payment' | translate }}</h5>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </div>\n</main>\n\n<ng-template #cartEmpty>\n <div class=\"wrap\">\n <div *ngIf=\"(loading$ | async) as load\">\n <app-loading-full-ec *ngIf=\"canCheckout\"></app-loading-full-ec>\n </div>\n <section id=\"cart\" *ngIf=\"!canCheckout\">\n <section id=\"cart bg-white h-50\">\n <div class=\"d-flex flex-column justify-content-center align-items-center text-center\">\n <h4>{{ 'empty-cart' | translate }}</h4>\n <h5>{{ 'empty-cart-detail' | translate }}</h5>\n </div>\n </section>\n </section>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <app-loading-full-ec></app-loading-full-ec>\n</ng-template>\n\n<ng-template #requireLoginView>\n</ng-template>\n\n\n<!-- <ec-checkout-error></ec-checkout-error> -->\n",
712
737
  styles: ["@import url(https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&family=Roboto:wght@400;500;700&family=Source+Sans+Pro:wght@400;600;700&display=swap);.btn.valid-btn{background-color:var(--ec-primary,#000);border-color:var(--ec-primary,#000);color:var(--ec-primary-contrast,#fff);margin-right:12px}.btn.valid-btn:disabled,.btn.valid-btn[disabled]{background-color:var(--ec-primary-muted,#6c757d);border-color:var(--ec-primary-muted,#6c757d);color:var(--ec-primary-contrast,#fff);opacity:.8}.switch{position:relative;display:inline-block;width:16%!important;height:34px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;transition:.4s}.slider:before{position:absolute;content:\"\";height:26px;width:26px;left:4px;bottom:4px;background-color:#fff;transition:.4s}input:checked+.slider{background-color:#000}input:focus+.slider{box-shadow:0 0 1px #000}input:checked+.slider:before{transform:translateX(26px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}.bg-white{background-color:#fff}#appCheckoutEc,#appCheckoutEc *{font-family:var(--ec-checkout-font, \"Source Sans Pro\", Roboto, \"Open Sans\", \"Helvetica Neue\", Arial, sans-serif)!important}.active .bs-stepper-circle{background-color:#000}.margin-bottom-i{margin-bottom:3%}.Main{margin-top:140px;min-height:60vh}.btn:disabled{opacity:.65}.co-data-icon{height:50px;-o-object-fit:contain;object-fit:contain}.checkout-btn-container{display:flex;justify-content:space-between}.loading-container-line{display:flex;flex-direction:row;justify-content:center}.stepperContainer::after{content:\"\";border-top:1px solid #000;position:absolute;width:95%;top:48%;left:10px;margin:auto;z-index:-1}.bs-stepper .step-trigger{background-color:#fff}.bs-stepper .step-trigger.disabled,.bs-stepper .step-trigger:disabled{opacity:1}@media screen and (max-width:992px){.stepperContainer::after{display:none}.step{text-align:left!important}}@media screen and (max-width:576px){.step{text-align:center!important}.resumen i{font-size:2em}.resumen strong{font-size:.8em}.resumen span{font-size:1em}}@media screen and (max-width:768px){.step-trigger .bs-stepper-label{font-size:.75rem}.content.fade.active.dstepper-block{padding-top:1rem}}.checkout-single{display:flex;flex-direction:column;gap:1rem;--ec-accent:#000;--ec-accent-contrast:#fff;--ec-accent-soft:#f5f8ff;--ec-border:#e3e3e3;--ec-muted:#666;--ec-surface:#fff;--ec-surface-alt:#fafafa;--ec-success:#16a34a}:host ::ng-deep .checkout-unsaved-modal .modal-dialog{max-width:420px;margin:1.5rem auto}:host ::ng-deep .checkout-unsaved-modal-content{border-radius:10px;border:1px solid rgba(0,0,0,.08);box-shadow:0 18px 36px rgba(0,0,0,.18)}:host ::ng-deep .checkout-unsaved-modal-content .modal-header{border-bottom:0;padding:1.1rem 1.25rem .5rem;align-items:flex-start}:host ::ng-deep .checkout-unsaved-modal-content .modal-title{font-size:1.05rem;font-weight:600;color:#111}:host ::ng-deep .checkout-unsaved-modal-content .modal-body{padding:.4rem 1.25rem 1rem;color:#555;font-size:.95rem;line-height:1.4}:host ::ng-deep .checkout-unsaved-modal-content .modal-footer{border-top:0;padding:0 1.25rem 1.25rem;display:flex;gap:.6rem;justify-content:flex-end}:host ::ng-deep .checkout-unsaved-modal-content .btn-keep-editing{border-color:#d0d5dd;color:#344054;background:#fff;font-weight:600}:host ::ng-deep .checkout-unsaved-modal-content .btn-discard{background-color:var(--ec-primary,#000);border-color:var(--ec-primary,#000);color:var(--ec-primary-contrast,#fff);font-weight:600}.checkout-section{border:1px solid var(--ec-border);border-radius:6px;background:var(--ec-surface);overflow:hidden}.checkout-single .checkout-section{overflow:visible}.checkout-section.is-disabled{opacity:.6}.checkout-section.is-complete{border-color:var(--ec-success)}.section-header{width:100%;display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:1rem;background:var(--ec-surface-alt);border:0;text-align:left}.checkout-section.is-complete .section-header{background:rgba(22,163,74,.08)}.checkout-section.is-complete .section-index,.checkout-section.is-complete .section-state{background:var(--ec-success);color:#fff}.section-index{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;background:var(--ec-accent);color:var(--ec-accent-contrast);font-weight:600}.section-summary{display:-ms-grid;display:grid;-ms-grid-columns:1fr auto;grid-template-columns:1fr auto;-ms-grid-rows:auto auto;grid-template-rows:auto auto;gap:.2rem .75rem;align-items:center;padding:.5rem 1rem .85rem;font-size:.9rem;color:var(--ec-muted)}.section-summary-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;color:var(--ec-muted)}.section-summary-value{font-weight:600;color:#111;-ms-grid-column:1;-ms-grid-column-span:1;grid-column:1/2}.section-summary-edit{-ms-grid-column:2;-ms-grid-column-span:1;grid-column:2/3;-ms-grid-row:1;-ms-grid-row-span:2;grid-row:1/3;-ms-grid-row-align:center;align-self:center;-ms-grid-column-align:end;justify-self:end;font-size:.8rem;font-weight:700;color:var(--ec-accent,#000);text-transform:uppercase;letter-spacing:.04em}.section-summary-edit:focus{outline:2px solid var(--ec-accent,#000);outline-offset:2px;border-radius:4px}.section-title{flex:1;font-weight:600}.section-state{width:32px;height:32px;border-radius:50%;background:#e7f6ea;color:#2f7a32;display:inline-flex;align-items:center;justify-content:center;font-size:.85rem;font-weight:700;line-height:1}.section-body{padding:1rem 1.25rem}.section-actions{display:flex;justify-content:flex-end;margin-top:1rem}.checkout-summary{border:1px solid #e3e3e3;border-radius:6px;padding:1rem;background:#fff;position:-webkit-sticky;position:sticky;top:var(--ec-checkout-sticky-top,1rem)}.summary-title{font-weight:600;margin-bottom:1rem}.checkout-single .valid-btn{font-size:1rem;padding:.7rem 1.1rem;letter-spacing:.02em;text-transform:uppercase}.checkout-single #checkoutFinishBtn,.checkout-single .summary-mobile-btn{background-color:var(--ec-primary,#000);border-color:var(--ec-primary,#000);color:var(--ec-primary-contrast,#fff);text-transform:uppercase}.checkout-single #checkoutFinishBtn:disabled,.checkout-single #checkoutFinishBtn[disabled],.checkout-single .summary-mobile-btn:disabled,.checkout-single .summary-mobile-btn[disabled]{background-color:var(--ec-primary-muted,#6c757d);border-color:var(--ec-primary-muted,#6c757d);color:var(--ec-primary-contrast,#fff);opacity:.8}.summary-products{border-bottom:1px solid #eee;margin-bottom:1rem;padding-bottom:1rem}.summary-product{display:-ms-grid;display:grid;-ms-grid-columns:1fr auto;grid-template-columns:1fr auto;gap:.25rem .5rem;align-items:center;padding:.35rem 0;border-bottom:1px solid #f1f1f1}.summary-product:last-child{border-bottom:0}.summary-product-main{display:flex;flex-direction:column;gap:.2rem;min-width:0}.summary-product-name{font-weight:500;font-size:.95rem;color:#222;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.summary-product-qty{font-size:.85rem;color:#666}.summary-product-price{font-weight:600;font-size:.9rem;color:#222}.summary-totals{display:flex;flex-direction:column;gap:.5rem;padding-top:.75rem}.summary-total-row{display:flex;justify-content:space-between;align-items:baseline;gap:1rem;font-weight:500;font-size:.95rem;color:#555}.summary-total-row>span:first-child{min-width:0}.summary-total-row-total{font-size:1.1rem;font-weight:700;color:#111;margin-top:.5rem;padding-top:.75rem;border-top:1px solid #e5e7eb}.summary-total-row-tax-info{order:1;font-size:.82rem;font-weight:400;color:#6b7280;gap:.75rem}.summary-total-row-tax-info .summary-total-row-price,.summary-total-row-tax-info .summary-total-row-price strong{font-weight:400;color:#6b7280}.summary-total-row-price{flex:0 0 auto;white-space:nowrap;display:inline-flex;flex-direction:column;align-items:flex-end;gap:.15rem;text-align:right}.summary-total-row-price del{color:#888;font-weight:500;text-decoration-thickness:1px}.summary-total-row-price strong{font-weight:700}.summary-total-row-price--free strong{color:var(--ec-success,#198754)}.summary-total-row-price--discounted strong{color:#111}.summary-mobile-bar{display:none}@media screen and (max-width:992px){.checkout-summary{position:static;margin-top:.75rem}.checkout-single{padding-bottom:20px}.summary-mobile-bar{position:fixed;left:0;right:0;bottom:0;z-index:var(--ec-checkout-summary-mobile-z-index,10040);display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.6rem .9rem calc(.6rem + env(safe-area-inset-bottom));background:#fff;border-top:1px solid #e5e7eb;box-shadow:0 -6px 18px rgba(15,23,42,.08)}.summary-mobile-total{display:flex;flex-direction:column;gap:.2rem}.summary-mobile-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;color:#6b7280}.summary-mobile-value{font-weight:700;font-size:1.05rem;color:#111827}.summary-mobile-btn{padding:.7rem 1.1rem;font-size:.95rem;white-space:nowrap}}:host-context(.modal-open) .summary-mobile-bar{z-index:var(--ec-checkout-summary-mobile-z-index-modal-open,1030)}.checkout-loading-overlay{position:fixed;inset:0;background:rgba(17,24,39,.45);display:flex;align-items:center;justify-content:center;z-index:var(--ec-checkout-overlay-z-index,10050);padding:1.5rem}.checkout-loading-card{background:#fff;border-radius:12px;padding:1.5rem 2rem;box-shadow:0 20px 40px rgba(0,0,0,.2);display:flex;flex-direction:column;align-items:center;gap:.75rem;text-align:center}.checkout-loading-card h5{margin:0;font-weight:600;color:#111}.summary-mobile-bar.is-hidden{display:none}"]
713
738
  })
714
739
  ], CheckoutEcComponent);
715
740
  return CheckoutEcComponent;
716
741
  }(ComponentHelper));
717
742
  export { CheckoutEcComponent };
718
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tvdXQtZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9jaGVja291dC1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLE9BQU8sTUFBTSxZQUFZLENBQUM7QUFDakMsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUErQixNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBT3hEO0lBQXlDLHVDQUFlO0lBdUNwRCw2QkFBbUIsZUFBZ0MsRUFBUyxhQUEyQixFQUM1RSxNQUFjLEVBQVMsV0FBd0IsRUFBUyxlQUFnQyxFQUN4RixjQUFvQyxFQUFTLE1BQWlCLEVBQzdELFVBQXNCLEVBQVUsWUFBNEIsRUFDNUQsb0JBQWlELEVBQy9DLEdBQWU7UUFMN0IsWUFNSSxpQkFBTyxTQXdCVjtRQTlCa0IscUJBQWUsR0FBZixlQUFlLENBQWlCO1FBQVMsbUJBQWEsR0FBYixhQUFhLENBQWM7UUFDNUUsWUFBTSxHQUFOLE1BQU0sQ0FBUTtRQUFTLGlCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVMscUJBQWUsR0FBZixlQUFlLENBQWlCO1FBQ3hGLG9CQUFjLEdBQWQsY0FBYyxDQUFzQjtRQUFTLFlBQU0sR0FBTixNQUFNLENBQVc7UUFDN0QsZ0JBQVUsR0FBVixVQUFVLENBQVk7UUFBVSxrQkFBWSxHQUFaLFlBQVksQ0FBZ0I7UUFDNUQsMEJBQW9CLEdBQXBCLG9CQUFvQixDQUE2QjtRQUMvQyxTQUFHLEdBQUgsR0FBRyxDQUFZO1FBekN0QixvQkFBYyxHQUFHLElBQUksZUFBZSxDQUFVLElBQUksQ0FBQyxDQUFDO1FBQ3BELGlCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLG1CQUFhLEdBQUcsS0FBSyxDQUFDO1FBSXRCLFdBQUssR0FBVSxFQUFFLENBQUM7UUFDbEIsZ0JBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsbUJBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0Isa0JBQVksR0FBcUIsUUFBUSxDQUFDO1FBQzFDLDZCQUF1QixHQUFtQixJQUFJLENBQUM7UUFDOUMsd0JBQWtCLEdBQTBCLElBQUksQ0FBQztRQUNsRCxrQkFBWSxHQUFhLEVBQUUsQ0FBQztRQUMzQiwyQkFBcUIsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLHVCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixxQkFBZSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDcEMseUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUN6QyxlQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLG1CQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLHFCQUFlLEdBQStDLElBQUksQ0FBQztRQUNuRSwwQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDNUIscUJBQWUsR0FBZ0MsSUFBSSxDQUFDO1FBQ3BELG9CQUFjLEdBQXVCLElBQUksQ0FBQztRQUMxQyxrQkFBWSxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO1FBQzNDLGNBQVEsR0FBc0IsSUFBSSxDQUFDO1FBQ2xDLDBCQUFvQixHQUFrQixJQUFJLENBQUM7UUFFM0Msa0JBQVksR0FBRyxLQUFLLENBQUM7UUFDckIseUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGNBQVEsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBc0M3Qyx1QkFBaUIsR0FBRztZQUN4QixJQUFNLFFBQVEsR0FBRyxLQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hDLEtBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGdCQUFjLFFBQVUsQ0FBQyxDQUFDO1lBQzVDLEtBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLGdDQUF5QixRQUFRLE1BQUcsQ0FBQyxDQUFDO1lBQzlELEtBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLEtBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTFCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO2dCQUMvQixLQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQy9DO1FBQ0wsQ0FBQyxDQUFBO1FBc0ZELHdCQUFrQixHQUFHOztZQUNqQixLQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLEtBQUssR0FBWSxFQUFFLENBQUM7WUFDeEIsc0NBQXNDO1lBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNoQyxPQUFBLEtBQUksQ0FBQyxPQUFPLDBDQUFFLDZCQUE2QixFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN0RixPQUFBLEtBQUksQ0FBQyxPQUFPLDBDQUFFLDRCQUE0QixFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNwRjsrQ0FDbUM7WUFDbkMsb0JBQW9CO1lBQ3BCLEtBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksS0FBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7Z0JBQ3pCLEtBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNyQjtZQUNELEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxPQUFBLEtBQUksQ0FBQyxPQUFPLDBDQUFFLDZCQUE2QixLQUFJLElBQUksSUFBSSxPQUFBLEtBQUksQ0FBQyxPQUFPLDBDQUFFLDRCQUE0QixLQUFJLElBQUksQ0FBQyxFQUFFO2dCQUN4SSxLQUFJLENBQUMsUUFBUSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxLQUFLLEVBQUwsQ0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ2hGLFVBQUEsR0FBRyxJQUFNLEdBQUcsSUFBSSxLQUFJLENBQUMsV0FBVyxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQ3ZDLENBQUM7YUFDTDtRQUNMLENBQUMsQ0FBQTtRQUVELFlBQU0sR0FBRyxjQUFNLE9BQUEsS0FBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBdkIsQ0FBdUIsQ0FBQztRQUV2QyxpQkFBVyxHQUFHLFVBQUMsU0FBUyxJQUFLLE9BQUEsS0FBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQTNDLENBQTJDLENBQUM7UUFFekUsaUJBQVcsR0FBRyxVQUFDLFFBQWdCLElBQUssT0FBQSxDQUFDLENBQUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQWpDLENBQWlDLENBQUM7UUFFdEUsb0JBQWMsR0FBRyxVQUFDLFFBQWdCLElBQUssT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBekQsQ0FBeUQsQ0FBQztRQUVqRyx1QkFBaUIsR0FBRyxVQUFDLFFBQWdCLEVBQUUsT0FBZ0I7WUFDbkQsS0FBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQTtRQUVELGlCQUFXLEdBQUc7WUFDVixLQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FDaEMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsRUFBRSxJQUFJLEtBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUExRCxDQUEwRCxFQUNqRSxVQUFBLEdBQUcsSUFBSSxPQUFBLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQTFDLENBQTBDLENBQ3BELENBQUE7UUFDTCxDQUFDLENBQUE7UUFFRCxnQkFBVSxHQUFHO1lBQ1QsVUFBVSxDQUFDO2dCQUNQLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUU7b0JBQzVDLEtBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRTt3QkFDM0QsTUFBTSxFQUFFLElBQUk7d0JBQ1osU0FBUyxFQUFFLElBQUk7cUJBQ2xCLENBQUMsQ0FBQTtpQkFDTDtxQkFBTTtvQkFDSCxLQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7aUJBQ3BCO1lBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ1QsMkJBQTJCO1FBQy9CLENBQUMsQ0FBQTtRQUVELFVBQUksR0FBRztZQUNILDJCQUEyQjtZQUMzQixLQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ25CLDJCQUEyQjtZQUMzQixNQUFNLENBQUMsUUFBUSxDQUFDO2dCQUNaLEdBQUcsRUFBRSxDQUFDO2dCQUNOLFFBQVEsRUFBRSxRQUFRO2FBQ3JCLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQztRQUVGLFdBQUssR0FBRyxVQUFDLFdBQVcsSUFBSyxPQUFBLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFwQyxDQUFvQyxDQUFDO1FBRTlELGFBQU8sR0FBRyxVQUFDLFNBQXVCO1lBQzlCLFFBQVEsU0FBUyxDQUFDLElBQUksRUFBRTtnQkFDcEIsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLDBCQUEwQixDQUFDO2dCQUNqRCxLQUFLLFVBQVUsQ0FBQyxDQUFDLE9BQU8sNEJBQTRCLENBQUM7Z0JBQ3JELEtBQUssVUFBVSxDQUFDLENBQUMsT0FBTyw2QkFBNkIsQ0FBQztnQkFDdEQsS0FBSyxVQUFVLENBQUMsQ0FBQyxPQUFPLDRCQUE0QixDQUFDO2dCQUNyRCxLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8sK0JBQStCLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxDQUFDLE9BQU8sK0JBQStCLENBQUM7YUFDbkQ7UUFDTCxDQUFDLENBQUE7UUFFRCxxQkFBZSxHQUFHOztZQUNkLEtBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLDBDQUEwQztZQUMxQyxLQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQTtZQUM5RCxtQ0FBbUM7WUFDbkMsT0FBQSxLQUFJLENBQUMsT0FBTywwQ0FBRSw2QkFBNkIsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtZQUNwSCxrQ0FBa0M7WUFDbEMsT0FBQSxLQUFJLENBQUMsT0FBTywwQ0FBRSw0QkFBNEIsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7WUFDMUcsS0FBSSxDQUFDLEtBQUssR0FBRyxLQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFDLElBQUksRUFBRSxLQUFLLElBQUssT0FBQSx1QkFBTSxJQUFJLEtBQUUsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLElBQUcsRUFBOUIsQ0FBOEIsQ0FBQyxDQUFDO1lBQzdFLHlCQUF5QjtZQUN6QixJQUFJLEtBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUNuQixLQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM1QztRQUNMLENBQUMsQ0FBQTtRQUVELGlCQUFXLEdBQUcsVUFBQyxVQUFrQixJQUFLLE9BQUEsS0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBdkIsQ0FBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBL0QsQ0FBK0QsQ0FBQTtRQUVyRyx1QkFBaUIsR0FBRyxVQUFDLEtBQWE7WUFDOUIsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO2dCQUNaLE9BQU8sT0FBTyxDQUFBO2FBQ2pCO2lCQUFNO2dCQUNILE9BQU8sS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO2FBQzVEO1FBQ0wsQ0FBQyxDQUFBO1FBRUQsc0JBQWdCLEdBQUcsY0FBTSxPQUFBLEtBQUksQ0FBQyxZQUFZLEtBQUssUUFBUSxFQUE5QixDQUE4QixDQUFDO1FBRXhELHdCQUFrQixHQUFHLFVBQUMsSUFBZ0MsZ0JBQ2xELE9BQUEsT0FBQSxJQUFJLDBDQUFFLElBQUksTUFBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsT0FBQyxJQUFJLDBDQUFFLEtBQUssQ0FBQSxFQUFBLENBQUM7UUFFakUsMkJBQXFCLEdBQUcsVUFBQyxJQUFnQzs7WUFDckQsSUFBSSxPQUFBLElBQUksMENBQUUsSUFBSSxNQUFLLFNBQVM7Z0JBQUUsT0FBTyxLQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuRSxJQUFJLE9BQUEsSUFBSSwwQ0FBRSxJQUFJLE1BQUssVUFBVTtnQkFBRSxPQUFPLE9BQUEsS0FBSSxDQUFDLGVBQWUsMENBQUUsS0FBSyxLQUFJLEVBQUUsQ0FBQztZQUN4RSxPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUMsQ0FBQTtRQUVELDJCQUFxQixHQUFHLFVBQUMsSUFBZ0M7O1lBQ3JELElBQUksT0FBQSxJQUFJLDBDQUFFLElBQUksTUFBSyxVQUFVO2dCQUFFLE9BQU8sT0FBQSxLQUFJLENBQUMsZUFBZSwwQ0FBRSxNQUFNLEtBQUksRUFBRSxDQUFDO1lBQ3pFLE9BQU8sS0FBSSxDQUFDLGNBQWMsT0FBQyxJQUFJLDBDQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQTtRQUVELG1CQUFhLEdBQUcsVUFBQyxRQUFnQjtZQUM3QixJQUFNLEtBQUssR0FBRyxLQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUF0QixDQUFzQixDQUFDLENBQUM7WUFDbkUsSUFBSSxLQUFLLElBQUksQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUM1QixJQUFJLEtBQUksQ0FBQyxZQUFZLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQzFELE9BQU8sS0FBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN0QztZQUNELElBQU0sUUFBUSxHQUFHLEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sS0FBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFBO1FBRUQsbUJBQWEsR0FBRyxVQUFDLFFBQWdCO1lBQzdCLElBQUksQ0FBQyxLQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztnQkFBRSxPQUFPO1lBQzFDLElBQU0sS0FBSyxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtnQkFDWixJQUFJLEtBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDMUQsS0FBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQztvQkFDckMsS0FBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO29CQUN2RCxPQUFPO2lCQUNWO2dCQUNELEtBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN0QztpQkFBTTtnQkFDSCxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDakMsSUFBSSxLQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUM1QixLQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUMxQztnQkFDRCxLQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2xDO1FBQ0wsQ0FBQyxDQUFBO1FBRUQscUJBQWUsR0FBRyxVQUFDLFFBQWdCO1lBQy9CLElBQU0sS0FBSyxHQUFHLEtBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQXRCLENBQXNCLENBQUMsQ0FBQztZQUNuRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFBRSxPQUFPO1lBQ25ELElBQU0sUUFBUSxHQUFHLEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM1QyxLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxLQUFLLFFBQVEsRUFBakIsQ0FBaUIsQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxLQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUUsS0FBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUE7UUFFRCx5QkFBbUIsR0FBRyxjQUFNLE9BQUEsS0FBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBL0IsQ0FBK0IsQ0FBQztRQUU1RCxtQkFBYSxHQUFHLFVBQUMsUUFBZ0IsSUFBSyxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFwQyxDQUFvQyxDQUFDO1FBRTNFLHFCQUFlLEdBQUcsVUFBQyxJQUEwQixFQUFFLElBQW1CO1lBQzlELFFBQVEsSUFBSSxFQUFFO2dCQUNWLEtBQUsseUJBQXlCLENBQUMsQ0FBQyxPQUFPLDJCQUEyQixDQUFDO2dCQUNuRSxLQUFLLFVBQVUsQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDO2dCQUNuQyxLQUFLLFVBQVUsQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDO2dCQUNuQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDO2dCQUMvQixLQUFLLGNBQWMsQ0FBQyxDQUFDLE9BQU8sZ0JBQWdCLENBQUM7Z0JBQzdDLEtBQUssVUFBVSxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUM7Z0JBQ25DLEtBQUssT0FBTztvQkFDUixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSTt3QkFBRSxPQUFPLHlCQUF5QixDQUFDO29CQUNqRixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssS0FBSzt3QkFBRSxPQUFPLE9BQU8sQ0FBQztvQkFDaEUsT0FBTyxLQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUMzRCxLQUFLLGFBQWEsQ0FBQyxDQUFDLE9BQU8sYUFBYSxDQUFDO2dCQUN6QyxLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDO2dCQUM3QixPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQzthQUN4QjtRQUNMLENBQUMsQ0FBQTtRQUVELG9CQUFjLEdBQUcsVUFBQyxJQUFvQjs7WUFDbEMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFDckIsSUFBSSxLQUFJLENBQUMsWUFBWSxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDaEQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBeEIsQ0FBd0IsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDOUMsSUFBTSxXQUFXLFNBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsMENBQUUsTUFBTSxDQUFDO2dCQUM1RCxJQUFNLGNBQWMsR0FBRyxLQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLE9BQUMsV0FBVywwQ0FBRSxRQUFRLENBQUMsQ0FBQztnQkFDNUYsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO29CQUN4QixJQUFNLFlBQVksR0FBaUI7d0JBQy9CLElBQUksRUFBRSxVQUFVO3dCQUNoQixJQUFJLEVBQUUsVUFBVTt3QkFDaEIsTUFBTSxFQUFFLGNBQWM7cUJBQ3pCLENBQUM7b0JBQ0YsSUFBTSxZQUFVLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFyQixDQUFxQixDQUFDLENBQUM7b0JBQ3hFLElBQUksWUFBVSxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUNuQixXQUFXLFlBQU8sV0FBVyxHQUFFLFlBQVksRUFBQyxDQUFDO3FCQUNoRDt5QkFBTTt3QkFDSCx3REFBd0Q7d0JBQ3hELDBEQUEwRDt3QkFDMUQsdUJBQXVCO3dCQUN2QixXQUFXLFlBQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsWUFBVSxDQUFDLEdBQUUsWUFBWSxHQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBVSxDQUFDLENBQUMsQ0FBQztxQkFDdkc7aUJBQ0o7YUFDSjtZQUNELFdBQVcsR0FBRyxLQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO2lCQUM3QyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxLQUFLLHlCQUF5QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUF2RSxDQUF1RSxDQUFDLENBQUM7WUFFN0YsSUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFBLElBQUk7Z0JBQ3pDLE9BQUEsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUk7WUFBM0QsQ0FBMkQsQ0FDOUQsQ0FBQztZQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTtnQkFBRSxPQUFPLFdBQVcsQ0FBQztZQUU5QyxJQUFNLG9CQUFvQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJO2dCQUNoRCxPQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxDQUFDO1lBQTlELENBQThELENBQ2pFLENBQUM7WUFDRixJQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBckIsQ0FBcUIsQ0FBQyxDQUFDO1lBRWpGLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQztnQkFBRSxnQkFBVyxvQkFBb0IsRUFBSyxhQUFhLEVBQUU7WUFFMUUsZ0JBQ08sb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQzdDLGFBQWEsRUFDYixvQkFBb0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUMvQztRQUNOLENBQUMsQ0FBQTtRQUVELDBCQUFvQixHQUFHLFVBQUMsSUFBa0I7O1lBQ3RDLElBQU0sc0JBQXNCLEdBQUcsT0FBQSxJQUFJLDBDQUFFLElBQUksTUFBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkcsT0FBTyxLQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxPQUFDLElBQUksMENBQUUsTUFBTSxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDMUYsQ0FBQyxDQUFBO1FBRUQsb0JBQWMsR0FBRyxVQUFDLElBQW9CO1lBQ2xDLElBQU0sV0FBVyxHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ3JELElBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBckIsQ0FBcUIsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDL0MsQ0FBQyxDQUFBO1FBRUQsMkJBQXFCLEdBQUcsVUFBQyxJQUFrQjtZQUN2QyxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUsseUJBQXlCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxjQUFjO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMzRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxLQUFJLENBQUMsYUFBYTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM3RixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsS0FBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUNoRixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxJQUFJLENBQUMsS0FBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN0RixJQUFJLEtBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQyxDQUFBO1FBRUQsNEJBQXNCLEdBQUc7O1lBQ3JCLElBQU0sUUFBUSxHQUFRLEtBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFNBQWdCLENBQUMsQ0FBQztZQUN6RSxJQUFNLE9BQU8sR0FBRyxPQUFBLFFBQVEsMENBQUUsZUFBZSxrQkFBSSxRQUFRLDBDQUFFLFFBQVEsMENBQUUsZUFBZSxDQUFBLENBQUM7WUFDakYsSUFBTSxPQUFPLEdBQUcsT0FBQSxPQUFPLDBDQUFFLGNBQWMsWUFBSSxPQUFPLDBDQUFFLE9BQU8sQ0FBQSxJQUFJLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDN0UsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFBO1FBRUQsb0JBQWMsR0FBRyxVQUFDLFFBQWdCOztZQUM5QixJQUFNLFFBQVEsR0FBUSxLQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxRQUFlLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQ3hCLElBQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxlQUFlLGlCQUFJLFFBQVEsMENBQUUsUUFBUSwwQ0FBRSxlQUFlLENBQUEsV0FBSSxRQUFRLDBDQUFFLGVBQWUsQ0FBQSxDQUFDO2dCQUM3RyxJQUFJLENBQUMsT0FBTztvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsSUFBTSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RSxJQUFNLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7cUJBQzVGLE1BQU0sQ0FBQyxPQUFPLENBQUM7cUJBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoQixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDckQ7WUFDRCxJQUFJLFFBQVEsS0FBSyxVQUFVLEVBQUU7Z0JBQ3pCLElBQU0sV0FBVyxHQUFHLE9BQUEsUUFBUSxDQUFDLE1BQU0sMENBQUUsSUFBSSxLQUFJLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO2dCQUN4RSxJQUFNLGFBQWEsR0FBRyxPQUFBLFFBQVEsQ0FBQyxRQUFRLDBDQUFFLElBQUksS0FBSSxRQUFRLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7Z0JBQ3BILE9BQU8sQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuRTtZQUNELElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDeEIsT0FBTyxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2FBQy9DO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUE7UUFFRCx3QkFBa0IsR0FBRyxVQUFDLE9BQTRDOztZQUM5RCxJQUFNLFFBQVEsR0FBRyxPQUFPLE9BQUMsT0FBTywwQ0FBRSxLQUFLLENBQUMsQ0FBQztZQUN6QyxJQUFNLFNBQVMsR0FBRyxPQUFPLE9BQUMsT0FBTywwQ0FBRSxNQUFNLENBQUMsQ0FBQztZQUMzQyxLQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2xFLENBQUMsQ0FBQTtRQUVPLCtCQUF5QixHQUFHOztZQUNoQyxJQUFNLGdCQUFnQixHQUFRLEtBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFVBQWlCLENBQUMsQ0FBQztZQUNsRixPQUFPLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIseUJBQ2hELGdCQUFnQiwwQ0FBRSxhQUFhLG1EQUMvQixnQkFBZ0IsMENBQUUsUUFBUSwwQ0FBRSxhQUFhLDJEQUN6QyxnQkFBZ0IsMENBQUUsUUFBUSwwQ0FBRSxRQUFRLDBDQUFFLGFBQWEseUNBQ25ELElBQUksR0FDUCxDQUFDO1FBQ04sQ0FBQyxDQUFBO1FBaUdELHNCQUFnQixHQUFHLFVBQUMsS0FBa0Q7WUFDbEUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFBLElBQUk7Z0JBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQTtRQUVELDRCQUFzQixHQUFHLFVBQUMsS0FBbUM7O1lBQ3pELElBQUksS0FBSSxDQUFDLFlBQVksS0FBSyxRQUFRO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ2pELElBQUksQ0FBQyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ2hELElBQU0sV0FBVyxHQUFRLEtBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFNBQWdCLENBQUMsQ0FBQztZQUM1RSxPQUFPLENBQUMsUUFBQyxXQUFXLDBDQUFFLFlBQVksQ0FBQSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQTtRQUVELDZCQUF1QixHQUFHLFVBQUMsUUFBMEI7WUFDakQsSUFBSSxDQUFDLEtBQUksQ0FBQyxvQkFBb0I7Z0JBQUUsT0FBTztZQUN2QyxLQUFJLENBQUMsUUFBUSxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDN0MsS0FBSyxFQUFFLDhDQUE4QztnQkFDckQsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLFFBQVEsRUFBRSxLQUFLO2FBQ2xCLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQTtRQUVELHdCQUFrQixHQUFHOztZQUNqQixLQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLE1BQUEsS0FBSSxDQUFDLFFBQVEsMENBQUUsSUFBSSxHQUFHO1FBQzFCLENBQUMsQ0FBQTtRQUVELDJCQUFxQixHQUFHOztZQUNwQixJQUFJLENBQUMsS0FBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUM1QixNQUFBLEtBQUksQ0FBQyxRQUFRLDBDQUFFLElBQUksR0FBRztnQkFDdEIsT0FBTzthQUNWO1lBQ0QsSUFBTSxRQUFRLEdBQUcsS0FBSSxDQUFDLG9CQUFvQixDQUFDO1lBQzNDLEtBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDakMsS0FBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xDLEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLEtBQUssUUFBUSxFQUFqQixDQUFpQixDQUFDLENBQUM7WUFDeEUsTUFBQSxLQUFJLENBQUMsUUFBUSwwQ0FBRSxJQUFJLEdBQUc7UUFDMUIsQ0FBQyxDQUFBO1FBeGlCRyxLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbEQsS0FBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUNwQyxLQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxRQUFRLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsVUFBQSxHQUFHOztZQUM1QyxLQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQTtZQUNsQixLQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7WUFDdEIsS0FBSSxDQUFDLFVBQVUsZUFBRyxHQUFHLDBDQUFFLFVBQVUsdUNBQUksS0FBSyxFQUFBLENBQUM7WUFDM0MsS0FBSSxDQUFDLGFBQWEsZUFBRyxHQUFHLDBDQUFFLGFBQWEsdUNBQUksS0FBSyxFQUFBLENBQUM7WUFDakQsS0FBSSxDQUFDLFNBQVMsZUFBRyxHQUFHLDBDQUFFLFNBQVMsdUNBQUksS0FBSyxFQUFBLENBQUM7WUFDekMsS0FBSSxDQUFDLGFBQWEsZUFBRyxHQUFHLDBDQUFFLGFBQWEsdUNBQUksS0FBSyxFQUFBLENBQUM7WUFDakQsS0FBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFFekIsSUFBSSxLQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNqQixLQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDL0I7WUFDRCxJQUFJLEtBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDMUIsS0FBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztnQkFDakMsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDN0I7WUFDRCxrQ0FBa0M7UUFDdEMsQ0FBQyxDQUFDLENBQUE7UUFDRixLQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7O0lBQ3hCLENBQUM7SUFjRCxzQ0FBUSxHQUFSO1FBQUEsaUJBZ0VDO1FBL0RHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUssWUFBWSxhQUFhLEVBQTlCLENBQThCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM3RixJQUFJLEtBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDdkMsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDN0I7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLGFBQWE7WUFDakYsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDaEIsS0FBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLE9BQU87YUFDVjtZQUNELElBQUksQ0FBQyxLQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNwQixLQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO2dCQUNoQyxPQUFPO2FBQ1Y7WUFDRCxLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUNsQyxJQUFJLEtBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFBRSxPQUFPO1lBQ3BDLElBQU0sY0FBYyxHQUFHLEtBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQXZCLENBQXVCLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsY0FBYztnQkFBRSxPQUFPO1lBQzVCLElBQU0sV0FBVyxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxXQUFXO2dCQUFFLE9BQU87WUFDekIsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4QyxJQUFJLEtBQUksQ0FBQyxxQkFBcUIsS0FBSyxHQUFHO2dCQUFFLE9BQU87WUFDL0MsS0FBSSxDQUFDLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFBLEtBQUs7WUFDdkMsSUFBSSxLQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTztZQUM5QyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSTs7Z0JBQ2QsSUFBSSxRQUFDLElBQUksMENBQUUsSUFBSSxDQUFBO29CQUFFLE9BQU87Z0JBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ2pCLEtBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkMsT0FBTztpQkFDVjtnQkFDRCxJQUFJLEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUM3QixPQUFPO2lCQUNWO2dCQUNELElBQUksQ0FBQyxLQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzNILEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksRUFBbEIsQ0FBa0IsQ0FBQyxDQUFDO29CQUN6RSxLQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3ZDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxVQUFBLE9BQU87WUFDbEQsSUFBSSxLQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQUUsT0FBTztZQUNwQyxJQUFJLEtBQUksQ0FBQyxpQkFBaUI7Z0JBQUUsT0FBTztZQUNuQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUN4QyxJQUFNLGVBQWUsR0FBRyxLQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUF4QixDQUF3QixDQUFDLENBQUM7WUFDMUUsSUFBSSxlQUFlLElBQUksQ0FBQyxLQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztnQkFBRSxPQUFPO1lBQzdELElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxLQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztnQkFBRSxPQUFPO1lBQy9ELElBQUksQ0FBQyxLQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDeEMsS0FBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDckM7WUFDRCxLQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQUEsU0FBUztZQUMzQyxLQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUM5QyxLQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDZDQUFlLEdBQWY7UUFDSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3hGLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCx5Q0FBVyxHQUFYOztRQUNJLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxXQUFXLEdBQUU7UUFDMUIsTUFBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxXQUFXLEdBQUU7UUFDNUIsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxXQUFXLEdBQUc7SUFDL0IsQ0FBQztJQTBTTyxnREFBa0IsR0FBMUIsVUFBMkIsSUFBb0I7UUFDM0MsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBTSxhQUFhLEdBQUcsSUFBSTthQUNyQixNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBeEIsQ0FBd0IsQ0FBQzthQUN4QyxNQUFNLENBQUMsVUFBQyxHQUFHLEVBQUUsSUFBSSxJQUFLLE9BQUEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBeEIsQ0FBd0IsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFNLFdBQVcsR0FBRyxJQUFJO2FBQ25CLE1BQU0sQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUF0QixDQUFzQixDQUFDO2FBQ3RDLE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxJQUFJLElBQUssT0FBQSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUF4QixDQUF3QixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBbEQsQ0FBa0QsQ0FBQyxDQUFDO1FBRXpGLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNwQixPQUFPLFFBQVEsQ0FBQztTQUNuQjtRQUVELElBQU0sTUFBTSxHQUFtQixFQUFFLENBQUM7UUFDbEMsSUFBSSxhQUFhLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7U0FDOUU7UUFDRCxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUN4RTtRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE9BQU8sUUFBUSxDQUFDO1FBRXBDLElBQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBeEIsQ0FBd0IsQ0FBQyxDQUFDO1FBQzNFLElBQUksYUFBYSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3RCLElBQU0sUUFBTSxZQUFPLFFBQVEsQ0FBQyxDQUFDO1lBQzdCLFFBQU0sQ0FBQyxNQUFNLE9BQWIsUUFBTSxZQUFRLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFLLE1BQU0sR0FBRTtZQUMvQyxPQUFPLFFBQU0sQ0FBQztTQUNqQjtRQUVELElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBbEQsQ0FBa0QsQ0FBQyxDQUFDO1FBQzlGLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQztZQUFFLGdCQUFXLFFBQVEsRUFBSyxNQUFNLEVBQUU7UUFDdkQsSUFBTSxRQUFRLEdBQUcsSUFBSTthQUNoQixLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQzthQUNwQixNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBbEQsQ0FBa0QsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUMvRSxJQUFNLE1BQU0sWUFBTyxRQUFRLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsTUFBTSxPQUFiLE1BQU0sWUFBUSxRQUFRLEVBQUUsQ0FBQyxHQUFLLE1BQU0sR0FBRTtRQUN0QyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU8sdURBQXlCLEdBQWpDLFVBQWtDLElBQWtCOztRQUNoRCxJQUFJLE9BQUEsSUFBSSwwQ0FBRSxJQUFJLE1BQUssVUFBVTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVDLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNyQyxJQUFJLFFBQUMsSUFBSSwwQ0FBRSxNQUFNLENBQUE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoQyxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLElBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBQSxRQUFRLElBQUksT0FBQSxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBekIsQ0FBeUIsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDM0QsQ0FBQztJQUVPLDZDQUFlLEdBQXZCLFVBQXdCLFFBQWdCO1FBQXhDLGlCQVVDO1FBVEcsVUFBVSxDQUFDO1lBQ1AsSUFBTSxJQUFJLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQyxhQUE0QixDQUFDO1lBQzFELElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU87WUFDbEIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBZ0IsUUFBUSxRQUFLLENBQWdCLENBQUM7WUFDakYsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTztZQUNyQixJQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUNyRSxJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDbEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVPLGdEQUFrQixHQUExQjtRQUNJLFVBQVUsQ0FBQztZQUNQLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDM0QsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVPLGtEQUFvQixHQUE1QjtRQUFBLGlCQWFDO1FBWkcsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQzNDLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBNEIsQ0FBQztRQUMxRCxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUV2QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksb0JBQW9CLENBQUMsVUFBQyxPQUFPO1lBQ3BELElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixLQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQ2hFLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBSUQseURBQTJCLEdBQTNCO1FBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDeEYsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO2dCQUFFLE9BQU87U0FDcEM7UUFDRCxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDekQsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQTRDTyxnREFBa0IsR0FBMUIsVUFBMkIsUUFBZ0I7O1FBQ3ZDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUN4QixJQUFNLFFBQVEsU0FBRyxJQUFJLENBQUMsa0JBQWtCLDBDQUFFLEtBQUssQ0FBQztZQUNoRCxJQUFJLFFBQVEsRUFBRTtnQkFDVixRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDN0I7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkMsT0FBTztTQUNWO1FBQ0QsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3hCLElBQU0sT0FBTyxTQUFHLElBQUksQ0FBQyxpQkFBaUIsMENBQUUsS0FBSyxDQUFDO1lBQzlDLElBQUksT0FBTyxFQUFFO2dCQUNULE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUM1QjtZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QyxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7Z0JBbmtCbUMsZUFBZTtnQkFBd0IsWUFBWTtnQkFDcEUsTUFBTTtnQkFBc0IsV0FBVztnQkFBMEIsZUFBZTtnQkFDeEUsb0JBQW9CO2dCQUFpQixTQUFTO2dCQUNqRCxVQUFVO2dCQUF3QixjQUFjO2dCQUN0QywyQkFBMkI7Z0JBQzFDLFVBQVU7O0lBVE07UUFBbEMsWUFBWSxDQUFDLG1CQUFtQixDQUFDO21FQUE0RDtJQUM1RDtRQUFqQyxZQUFZLENBQUMsa0JBQWtCLENBQUM7a0VBQTBEO0lBQ3pEO1FBQWpDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQztvRUFBK0M7SUE4ZmhGO1FBRkMsWUFBWSxDQUFDLGVBQWUsQ0FBQztRQUM3QixZQUFZLENBQUMsZUFBZSxDQUFDOzBFQVU3QjtJQTVpQlEsbUJBQW1CO1FBTC9CLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsNHRlQUEyQzs7U0FFOUMsQ0FBQztPQUNXLG1CQUFtQixDQTJtQi9CO0lBQUQsMEJBQUM7Q0FBQSxBQTNtQkQsQ0FBeUMsZUFBZSxHQTJtQnZEO1NBM21CWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBTdGVwcGVyIGZyb20gJ2JzLXN0ZXBwZXInO1xuaW1wb3J0IHsgUm91dGVyLCBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgUmVwbGF5U3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDaGVja291dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jaGVja291dC9jaGVja291dC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RlcEkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3N0ZXAnO1xuaW1wb3J0IHsgQ2hlY2tvdXREYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jaGVja291dC1kYXRhJztcbmltcG9ydCB7IFByb2R1Y3RzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Byb2R1Y3RzL3Byb2R1Y3RzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9jb21wb25lbnQtaGVscGVyJztcbmltcG9ydCB7IENoYW5uZWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBDaGVja291dFZpZXdUeXBlLCBDb25zdGFudHMgfSBmcm9tICcuLi8uLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgeyBEYXRhRm9ybUVjQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGF5bWVudEVjQ29tcG9uZW50IH0gZnJvbSAnLi9wYXltZW50LWVjL3BheW1lbnQtZWMuY29tcG9uZW50JztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlLCBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBTaGlwcGluZ1ByaWNlRGlzcGxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi91dGlscy9zaGlwcGluZy1wcmljZS1kaXNwbGF5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VvU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Nlby5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtY2hlY2tvdXQtZWMnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jaGVja291dC1lYy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2hlY2tvdXQtZWMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDaGVja291dEVjQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50SGVscGVyIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHVibGljIHN0ZXBwZXI6IFN0ZXBwZXI7XG4gICAgcHVibGljIGxvYWRpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBwdWJsaWMgY2FuQ2hlY2tvdXQgPSBmYWxzZTtcbiAgICBwdWJsaWMgcmVxdWlyZV9sb2dpbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBzdWJDYW46IFN1YnNjcmlwdGlvbjtcbiAgICBwdWJsaWMgc3ViUmVhZHk6IFN1YnNjcmlwdGlvbjtcbiAgICBwdWJsaWMgY2hhbm5lbDogYW55O1xuICAgIHB1YmxpYyBzdGVwczogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgaGlkZVByaWNlczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBoaWRlRGlzY291bnRzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNoZWNrb3V0VmlldzogQ2hlY2tvdXRWaWV3VHlwZSA9ICdsZWdhY3knO1xuICAgIHB1YmxpYyBjcmVkaXRBY2NvdW50U2hvd1ByaWNlczogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgbGFzdEFzc29jaWF0ZWREYXRhOiBDaGVja291dERhdGFbXSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvcGVuU2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBsYXN0UGF5bWVudEFkZHJlc3NLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcGF5bWVudEF1dG9PcGVuZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGF1dG9DbG9zZWRTdGVwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgbWFudWFsbHlPcGVuZWRTdGVwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHB1YmxpYyBoaWRlVGF4ZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgc2hvd1RheExlZ2VuZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBzaGlwbWVudFN1bW1hcnk6IHsgbGFiZWw/OiBzdHJpbmc7IGRldGFpbD86IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGhpZGVNb2JpbGVTdW1tYXJ5QmFyID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzdW1tYXJ5T2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBmaW5pc2hCdXR0b25FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHN0ZXBEaXJ0eU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIHB1YmxpYyBtb2RhbFJlZjogQnNNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcGVuZGluZ0Nsb3NlU3RlcE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgbmF2U3ViOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBjaGFubmVsUmVhZHkgPSBmYWxzZTtcbiAgICBwcml2YXRlIHBlbmRpbmdDaGVja291dEluaXQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBsb2FkaW5nJCA9IHRoaXMubG9hZGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBAVmlld0NoaWxkcmVuKERhdGFGb3JtRWNDb21wb25lbnQpIHByaXZhdGUgZGF0YWZvcm1Db21wb25lbnRzOiBRdWVyeUxpc3Q8RGF0YUZvcm1FY0NvbXBvbmVudD47XG4gICAgQFZpZXdDaGlsZHJlbihQYXltZW50RWNDb21wb25lbnQpIHByaXZhdGUgcGF5bWVudENvbXBvbmVudHM6IFF1ZXJ5TGlzdDxQYXltZW50RWNDb21wb25lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoJ3Vuc2F2ZWRDaGFuZ2VzTW9kYWwnKSBwcml2YXRlIHVuc2F2ZWRDaGFuZ2VzTW9kYWw6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2hlY2tvdXRTZXJ2aWNlOiBDaGVja291dFNlcnZpY2UsIHB1YmxpYyB0b2FzdHJTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlciwgcHVibGljIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSwgcHVibGljIHByb2R1Y3RzU2VydmljZTogUHJvZHVjdHNTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxDb25maWdTZXJ2aWNlLCBwdWJsaWMgY29uc3RzOiBDb25zdGFudHMsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNoaXBwaW5nUHJpY2VEaXNwbGF5OiBTaGlwcGluZ1ByaWNlRGlzcGxheVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBzZW86IFNlb1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jaGVja291dFZpZXcgPSB0aGlzLmNvbnN0cy5nZXRDaGVja291dFZpZXcoKTtcbiAgICAgICAgdGhpcy5jb25zdHMuY2hlY2tvdXRWaWV3JC5zdWJzY3JpYmUodmlldyA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0VmlldyA9IHZpZXcgfHwgJ2xlZ2FjeSc7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmNoYW5uZWxDb25maWckLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gcmVzXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVTdGVwcygpXG4gICAgICAgICAgICB0aGlzLmhpZGVQcmljZXMgPSByZXM/LmhpZGVQcmljZXMgPz8gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmhpZGVEaXNjb3VudHMgPSByZXM/LmhpZGVEaXNjb3VudHMgPz8gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmhpZGVUYXhlcyA9IHJlcz8uaGlkZVRheGVzID8/IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zaG93VGF4TGVnZW5kID0gcmVzPy5zaG93VGF4TGVnZW5kID8/IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jaGFubmVsUmVhZHkgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5oaWRlUHJpY2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NoZWNrb3V0SW5pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0SW5pdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNoZWNrb3V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuc3RlcEVuYWJsZWQoMykpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuZWNPbkNvbnN0cnVjdCgpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDaGVja291dFNlbyA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2l0ZU5hbWUgPSB0aGlzLnNlby5nZXRTaXRlTmFtZSgpO1xuICAgICAgICB0aGlzLnNlby5zZXRUaXRsZShgQ2hlY2tvdXQgfCAke3NpdGVOYW1lfWApO1xuICAgICAgICB0aGlzLnNlby5zZXREZXNjcmlwdGlvbihgRmluYWxpesOhIHR1IGNvbXByYSBlbiAke3NpdGVOYW1lfS5gKTtcbiAgICAgICAgdGhpcy5zZW8uc2V0T2dUeXBlKCd3ZWJzaXRlJyk7XG4gICAgICAgIHRoaXMuc2VvLnNldE5vSW5kZXgodHJ1ZSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnNlby5zZXRDYW5vbmljYWwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubmF2U3ViID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCcvY2hlY2tvdXQnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Ub3BPbkVudGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1YkNhbiA9IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmNhbkNoZWNrb3V0JC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShjb250YWluX2l0ZW1zID0+IHtcbiAgICAgICAgICAgIGlmICghY29udGFpbl9pdGVtcykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuQ2hlY2tvdXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hhbm5lbFJlYWR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRJbml0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVDaGVja291dCgpO1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLmNoZWNrb3V0U2VydmljZS5zdGF0ZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGVnYWN5Q2hlY2tvdXQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaGFzUGF5bWVudFN0ZXAgPSB0aGlzLnN0ZXBzLnNvbWUoc3RlcCA9PiBzdGVwLm5hbWUgPT09ICdwYXltZW50Jyk7XG4gICAgICAgICAgICBpZiAoIWhhc1BheW1lbnRTdGVwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBhZGRyZXNzRGF0YSA9IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldFN0ZXBEYXRhKCdhZGRyZXNzJyk7XG4gICAgICAgICAgICBpZiAoIWFkZHJlc3NEYXRhKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShhZGRyZXNzRGF0YSk7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0UGF5bWVudEFkZHJlc3NLZXkgPT09IGtleSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5sYXN0UGF5bWVudEFkZHJlc3NLZXkgPSBrZXk7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLnN0YXRlJC5zdWJzY3JpYmUoc3RlcHMgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWdhY3lDaGVja291dCgpIHx8ICFzdGVwcykgcmV0dXJuO1xuICAgICAgICAgICAgc3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXN0ZXA/Lm5hbWUpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoIXN0ZXAuaXNSZWFkeSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b0Nsb3NlZFN0ZXBzLmRlbGV0ZShzdGVwLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU3RlcERpcnR5KHN0ZXAubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXV0b0Nsb3NlZFN0ZXBzLmhhcyhzdGVwLm5hbWUpICYmIHRoaXMub3BlblNlY3Rpb25zLmluY2x1ZGVzKHN0ZXAubmFtZSkgJiYgIXRoaXMubWFudWFsbHlPcGVuZWRTdGVwcy5oYXMoc3RlcC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5TZWN0aW9ucyA9IHRoaXMub3BlblNlY3Rpb25zLmZpbHRlcihuYW1lID0+IG5hbWUgIT09IHN0ZXAubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b0Nsb3NlZFN0ZXBzLmFkZChzdGVwLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2UucGF5bWVudE1ldGhvZHMkLnN1YnNjcmliZShtZXRob2RzID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGVnYWN5Q2hlY2tvdXQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMucGF5bWVudEF1dG9PcGVuZWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghbWV0aG9kcyB8fCAhbWV0aG9kcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGhhc1NoaXBtZW50U3RlcCA9IHRoaXMuc3RlcHMuc29tZShzdGVwID0+IHN0ZXAubmFtZSA9PT0gJ3NoaXBtZW50Jyk7XG4gICAgICAgICAgICBpZiAoaGFzU2hpcG1lbnRTdGVwICYmICF0aGlzLmlzU3RlcFJlYWR5KCdzaGlwbWVudCcpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWhhc1NoaXBtZW50U3RlcCAmJiAhdGhpcy5pc1N0ZXBFbmFibGVkKCdwYXltZW50JykpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcGVuU2VjdGlvbnMuaW5jbHVkZXMoJ3BheW1lbnQnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlblNlY3Rpb25zLnB1c2goJ3BheW1lbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGF5bWVudEF1dG9PcGVuZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVDaGVja291dFNlbygpO1xuICAgICAgICB0aGlzLmVjT25Jbml0KClcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5zaG93UHJpY2UkLnN1YnNjcmliZShzaG93UHJpY2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVkaXRBY2NvdW50U2hvd1ByaWNlcyA9IHNob3dQcmljZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmFzb2NpYXRlZERhdGEkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMubGFzdEFzc29jaWF0ZWREYXRhID0gZGF0YTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnNjcm9sbFRvVG9wT25FbnRlcigpO1xuICAgICAgICB0aGlzLnNldHVwU3VtbWFyeU9ic2VydmVyKCk7XG4gICAgICAgIHRoaXMuZmluaXNoQnV0dG9uRWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY2hlY2tvdXRGaW5pc2hCdG4nKTtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZU1vYmlsZUJhclZpc2liaWxpdHkoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3VtbWFyeU9ic2VydmVyKSB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlPYnNlcnZlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hCdXR0b25FbCA9IG51bGw7XG4gICAgICAgIHRoaXMuc3ViQ2FuPy51bnN1YnNjcmliZSgpXG4gICAgICAgIHRoaXMuc3ViUmVhZHk/LnVuc3Vic2NyaWJlKClcbiAgICAgICAgdGhpcy5uYXZTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZUNoZWNrb3V0ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbkNoZWNrb3V0ID0gdHJ1ZTtcbiAgICAgICAgbGV0IHN0ZXBzOiBTdGVwSVtdID0gW107XG4gICAgICAgIC8vY29uc29sZS5sb2coJ2NoYW5uZWwnLCB0aGlzLmNoYW5uZWwpXG4gICAgICAgIHN0ZXBzLnB1c2goeyBuYW1lOiAnYWRkcmVzcycgfSk7XG4gICAgICAgIHRoaXMuY2hhbm5lbD8uaXNTa2lwcGluZ1NoaXBwaW5nU3RlcEFsbG93ZWQgPyBudWxsIDogc3RlcHMucHVzaCh7IG5hbWU6ICdzaGlwbWVudCcgfSk7XG4gICAgICAgIHRoaXMuY2hhbm5lbD8uaXNTa2lwcGluZ1BheW1lbnRTdGVwQWxsb3dlZCA/IG51bGwgOiBzdGVwcy5wdXNoKHsgbmFtZTogJ3BheW1lbnQnIH0pO1xuICAgICAgICAvKiBzdGVwcy5wdXNoKHsgbmFtZTogJ3NoaXBtZW50JyB9KTtcbiAgICAgICAgc3RlcHMucHVzaCh7IG5hbWU6ICdwYXltZW50JyB9KTsgKi9cbiAgICAgICAgLy9jb25zb2xlLmxvZyhzdGVwcylcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2Uuc2V0U3RlcHMoc3RlcHMpO1xuICAgICAgICBpZiAodGhpcy5pc0xlZ2FjeUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RlcHBlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmlzTGVnYWN5Q2hlY2tvdXQoKSAmJiAodGhpcy5jaGFubmVsPy5pc1NraXBwaW5nU2hpcHBpbmdTdGVwQWxsb3dlZCAhPSB0cnVlIHx8IHRoaXMuY2hhbm5lbD8uaXNTa2lwcGluZ1BheW1lbnRTdGVwQWxsb3dlZCAhPSB0cnVlKSkge1xuICAgICAgICAgICAgdGhpcy5zdWJSZWFkeSA9IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLm9uUmVhZHkkLnBpcGUoZmlsdGVyKHJlYWR5ID0+IHJlYWR5KSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIHJlcyA9PiB7IHJlcyAmJiB0aGlzLmVuZENoZWNrb3V0KCkgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdvQmFjayA9ICgpID0+IHRoaXMuc3RlcHBlci5wcmV2aW91cygpO1xuXG4gICAgaXNTdGVwUmVhZHkgPSAoc3RlcF9uYW1lKSA9PiB0aGlzLmNoZWNrb3V0U2VydmljZS5pc1N0ZXBSZWFkeShzdGVwX25hbWUpO1xuXG4gICAgaXNTdGVwRGlydHkgPSAoc3RlcE5hbWU6IHN0cmluZykgPT4gISF0aGlzLnN0ZXBEaXJ0eU1hcC5nZXQoc3RlcE5hbWUpO1xuXG4gICAgaXNTdGVwQ29tcGxldGUgPSAoc3RlcE5hbWU6IHN0cmluZykgPT4gdGhpcy5pc1N0ZXBSZWFkeShzdGVwTmFtZSkgJiYgIXRoaXMuaXNTdGVwRGlydHkoc3RlcE5hbWUpO1xuXG4gICAgb25TdGVwRGlydHlDaGFuZ2UgPSAoc3RlcE5hbWU6IHN0cmluZywgaXNEaXJ0eTogYm9vbGVhbikgPT4ge1xuICAgICAgICB0aGlzLnN0ZXBEaXJ0eU1hcC5zZXQoc3RlcE5hbWUsIGlzRGlydHkpO1xuICAgIH1cblxuICAgIGVuZENoZWNrb3V0ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrb3V0U2VydmljZS5jb21wbGV0ZSgpLnRoZW4oXG4gICAgICAgICAgICByZXMgPT4gcmVzLm9rICYmIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnY2hlY2tvdXQvb3JkZXJfc3VjY2VzcyddKSxcbiAgICAgICAgICAgIGVyciA9PiB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yJylcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHNldFN0ZXBwZXIgPSAoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzdGVwcGVyJykgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcHBlciA9IG5ldyBTdGVwcGVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzdGVwcGVyJyksIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZWFyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IHRydWVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0ZXBwZXIoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnN0ZXBwZXIpXG4gICAgfVxuXG4gICAgbmV4dCA9ICgpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnN0ZXBwZXIpXG4gICAgICAgIHRoaXMuc3RlcHBlci5uZXh0KClcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnN0ZXBwZXIpXG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pXG4gICAgfTtcblxuICAgIGVycm9yID0gKGVycm9yX3ZhbHVlKSA9PiB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdyhlcnJvcl92YWx1ZSk7XG5cbiAgICBnZXRJY29uID0gKGRhdGFfaXRlbTogQ2hlY2tvdXREYXRhKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YV9pdGVtLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NvdXBvbic6IHJldHVybiAnYXNzZXRzL2ltYWdlcy9jb3Vwb24ucG5nJztcbiAgICAgICAgICAgIGNhc2UgJ2Rpc2NvdW50JzogcmV0dXJuICdhc3NldHMvaW1hZ2VzL2Rpc2NvdW50LnBuZyc7XG4gICAgICAgICAgICBjYXNlICdzaGlwbWVudCc6IHJldHVybiAnYXNzZXRzL2ltYWdlcy9pY28tZW52aW8ucG5nJztcbiAgICAgICAgICAgIGNhc2UgJ3N1YnRvdGFsJzogcmV0dXJuICdhc3NldHMvaW1hZ2VzL3Byb2R1Y3RzLnBuZyc7XG4gICAgICAgICAgICBjYXNlICd0b3RhbCc6IHJldHVybiAnYXNzZXRzL2ltYWdlcy9pY28tY2Fycml0by5wbmcnO1xuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICdhc3NldHMvaW1hZ2VzL2ljby1jYXJyaXRvLnBuZyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0aWFsaXplU3RlcHMgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RlcHMgPSBbXTtcbiAgICAgICAgLy9FbCBwYXNvIGRlIGVsZWdpciBkaXJlY2Npw7NuIHNpZW1wcmUgZXN0YVxuICAgICAgICB0aGlzLnN0ZXBzLnB1c2goeyBsYWJlbDogJ2JpbGxpbmctZGV0YWlscycsIG5hbWU6ICdhZGRyZXNzJyB9KVxuICAgICAgICAvL0VsIHBhc28gZGUgZWxlZ2lyIG1ldG9kbyBkZSBlbnZpb1xuICAgICAgICB0aGlzLmNoYW5uZWw/LmlzU2tpcHBpbmdTaGlwcGluZ1N0ZXBBbGxvd2VkID8gbnVsbCA6IHRoaXMuc3RlcHMucHVzaCh7IGxhYmVsOiAnc2hpcG1lbnQtbWV0aG9kJywgbmFtZTogJ3NoaXBtZW50JyB9KVxuICAgICAgICAvL0VsIHBhc28gZGUgZWxlZ2lyIG1ldG9kbyBkZSBwYWdvXG4gICAgICAgIHRoaXMuY2hhbm5lbD8uaXNTa2lwcGluZ1BheW1lbnRTdGVwQWxsb3dlZCA/IG51bGwgOiB0aGlzLnN0ZXBzLnB1c2goeyBsYWJlbDogJ3BheW1lbnQnLCBuYW1lOiAncGF5bWVudCcgfSlcbiAgICAgICAgdGhpcy5zdGVwcyA9IHRoaXMuc3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKHsgLi4uc3RlcCwgc3RlcDogaW5kZXggKyAxIH0pKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnN0ZXBzKVxuICAgICAgICBpZiAodGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMub3BlblNlY3Rpb25zID0gW3RoaXMuc3RlcHNbMF0ubmFtZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGVwRW5hYmxlZCA9IChzdGVwTnVtYmVyOiBudW1iZXIpID0+IHRoaXMuc3RlcHMuZmluZChzdGVwID0+IHN0ZXAuc3RlcCA9PSBzdGVwTnVtYmVyKSA/IHRydWUgOiBmYWxzZVxuXG4gICAgZ2V0Q2xhc3NUb1N0ZXBwZXIgPSAoaW5kZXg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gICAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2xpbmVhJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHNbaW5kZXggKyAxXSA/ICd0ZXh0LWNlbnRlcicgOiAndGV4dC1lbmQnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0xlZ2FjeUNoZWNrb3V0ID0gKCkgPT4gdGhpcy5jaGVja291dFZpZXcgIT09ICdzaW5nbGUnO1xuXG4gICAgZ2V0U2luZ2xlU3RlcFRpdGxlID0gKHN0ZXA6IFN0ZXBJICYgeyBsYWJlbD86IHN0cmluZyB9KSA9PlxuICAgICAgICBzdGVwPy5uYW1lID09PSAnYWRkcmVzcycgPyAnYWRkcmVzcy1zZWxlY3Rpb24nIDogc3RlcD8ubGFiZWw7XG5cbiAgICBnZXRTaW5nbGVTdW1tYXJ5TGFiZWwgPSAoc3RlcDogU3RlcEkgJiB7IGxhYmVsPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgaWYgKHN0ZXA/Lm5hbWUgPT09ICdhZGRyZXNzJykgcmV0dXJuIHRoaXMuZ2V0QWRkcmVzc1N1bW1hcnlMYWJlbCgpO1xuICAgICAgICBpZiAoc3RlcD8ubmFtZSA9PT0gJ3NoaXBtZW50JykgcmV0dXJuIHRoaXMuc2hpcG1lbnRTdW1tYXJ5Py5sYWJlbCB8fCAnJztcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGdldFNpbmdsZVN1bW1hcnlWYWx1ZSA9IChzdGVwOiBTdGVwSSAmIHsgbGFiZWw/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICBpZiAoc3RlcD8ubmFtZSA9PT0gJ3NoaXBtZW50JykgcmV0dXJuIHRoaXMuc2hpcG1lbnRTdW1tYXJ5Py5kZXRhaWwgfHwgJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0ZXBTdW1tYXJ5KHN0ZXA/Lm5hbWUpO1xuICAgIH1cblxuICAgIGlzU3RlcEVuYWJsZWQgPSAoc3RlcE5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc3RlcHMuZmluZEluZGV4KHN0ZXAgPT4gc3RlcC5uYW1lID09PSBzdGVwTmFtZSk7XG4gICAgICAgIGlmIChpbmRleCA8PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRWaWV3ID09PSAnc2luZ2xlJyAmJiBzdGVwTmFtZSA9PT0gJ3BheW1lbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1N0ZXBSZWFkeSgnYWRkcmVzcycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZTdGVwID0gdGhpcy5zdGVwc1tpbmRleCAtIDFdO1xuICAgICAgICByZXR1cm4gdGhpcy5pc1N0ZXBSZWFkeShwcmV2U3RlcC5uYW1lKTtcbiAgICB9XG5cbiAgICB0b2dnbGVTZWN0aW9uID0gKHN0ZXBOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RlcEVuYWJsZWQoc3RlcE5hbWUpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuU2VjdGlvbnMuaW5kZXhPZihzdGVwTmFtZSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1N0ZXBSZWFkeShzdGVwTmFtZSkgJiYgdGhpcy5pc1N0ZXBEaXJ0eShzdGVwTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDbG9zZVN0ZXBOYW1lID0gc3RlcE5hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuVW5zYXZlZENoYW5nZXNNb2RhbCh0aGlzLnVuc2F2ZWRDaGFuZ2VzTW9kYWwpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3BlblNlY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TZWN0aW9ucy5wdXNoKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU3RlcFJlYWR5KHN0ZXBOYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFudWFsbHlPcGVuZWRTdGVwcy5hZGQoc3RlcE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1NlY3Rpb24oc3RlcE5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ29Ub05leHRTZWN0aW9uID0gKHN0ZXBOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnN0ZXBzLmZpbmRJbmRleChzdGVwID0+IHN0ZXAubmFtZSA9PT0gc3RlcE5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xIHx8ICF0aGlzLnN0ZXBzW2luZGV4ICsgMV0pIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV4dE5hbWUgPSB0aGlzLnN0ZXBzW2luZGV4ICsgMV0ubmFtZTtcbiAgICAgICAgdGhpcy5vcGVuU2VjdGlvbnMgPSB0aGlzLm9wZW5TZWN0aW9ucy5maWx0ZXIobmFtZSA9PiBuYW1lICE9PSBzdGVwTmFtZSk7XG4gICAgICAgIGlmICghdGhpcy5vcGVuU2VjdGlvbnMuaW5jbHVkZXMobmV4dE5hbWUpKSB0aGlzLm9wZW5TZWN0aW9ucy5wdXNoKG5leHROYW1lKTtcbiAgICAgICAgdGhpcy5zY3JvbGxUb1NlY3Rpb24obmV4dE5hbWUpO1xuICAgIH1cblxuICAgIGdvVG9OZXh0RnJvbUFkZHJlc3MgPSAoKSA9PiB0aGlzLmdvVG9OZXh0U2VjdGlvbignYWRkcmVzcycpO1xuXG4gICAgaXNTZWN0aW9uT3BlbiA9IChzdGVwTmFtZTogc3RyaW5nKSA9PiB0aGlzLm9wZW5TZWN0aW9ucy5pbmNsdWRlcyhzdGVwTmFtZSk7XG5cbiAgICBnZXRTdW1tYXJ5TGFiZWwgPSAodHlwZTogQ2hlY2tvdXREYXRhWyd0eXBlJ10sIGl0ZW0/OiBDaGVja291dERhdGEpID0+IHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdwcm9kdWN0c0JlZm9yZURpc2NvdW50cyc6IHJldHVybiAncHJvZHVjdHMtYmVmb3JlLWRpc2NvdW50cyc7XG4gICAgICAgICAgICBjYXNlICdzdWJ0b3RhbCc6IHJldHVybiAnc3VidG90YWwnO1xuICAgICAgICAgICAgY2FzZSAnZGlzY291bnQnOiByZXR1cm4gJ2Rpc2NvdW50JztcbiAgICAgICAgICAgIGNhc2UgJ2NvdXBvbic6IHJldHVybiAnY291cG9uJztcbiAgICAgICAgICAgIGNhc2UgJ2xpbmVEaXNjb3VudCc6IHJldHVybiAnbGluZS1kaXNjb3VudHMnO1xuICAgICAgICAgICAgY2FzZSAnc2hpcG1lbnQnOiByZXR1cm4gJ3NoaXBtZW50JztcbiAgICAgICAgICAgIGNhc2UgJ3RheGVzJzpcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnRheGVzSW5jbHVkZWRJblRvdGFsID09PSB0cnVlKSByZXR1cm4gJ3RheGVzLWluY2x1ZGVkLWluLXRvdGFsJztcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnRheGVzSW5jbHVkZWRJblRvdGFsID09PSBmYWxzZSkgcmV0dXJuICd0YXhlcyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1RheExlZ2VuZCA/ICduYXRpb25hbC10YXhlcycgOiAndGF4ZXMnO1xuICAgICAgICAgICAgY2FzZSAnY2xpZW50VGF4ZXMnOiByZXR1cm4gJ2NsaWVudFRheGVzJztcbiAgICAgICAgICAgIGNhc2UgJ3RvdGFsJzogcmV0dXJuICd0b3RhbCc7XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFN1bW1hcnlEYXRhID0gKGRhdGE6IENoZWNrb3V0RGF0YVtdKSA9PiB7XG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dFZpZXcgIT09ICdzaW5nbGUnKSByZXR1cm4gZGF0YTtcbiAgICAgICAgbGV0IHN1bW1hcnlEYXRhID0gZGF0YTtcbiAgICAgICAgY29uc3QgaGFzU2hpcG1lbnQgPSBzdW1tYXJ5RGF0YS5zb21lKGl0ZW0gPT4gaXRlbS50eXBlID09PSAnc2hpcG1lbnQnKTtcbiAgICAgICAgaWYgKCFoYXNTaGlwbWVudCAmJiB0aGlzLmlzU3RlcFJlYWR5KCdzaGlwbWVudCcpKSB7XG4gICAgICAgICAgICBjb25zdCBvcmRlclRvdGFscyA9IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldE9yZGVyKCk/LnRvdGFscztcbiAgICAgICAgICAgIGNvbnN0IHNoaXBtZW50QW1vdW50ID0gdGhpcy5zaGlwcGluZ1ByaWNlRGlzcGxheS5ub3JtYWxpemVQcmljZVZhbHVlKG9yZGVyVG90YWxzPy5zaGlwcGluZyk7XG4gICAgICAgICAgICBpZiAoc2hpcG1lbnRBbW91bnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoaXBtZW50SXRlbTogQ2hlY2tvdXREYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2hpcG1lbnQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc2hpcG1lbnQnLFxuICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IHNoaXBtZW50QW1vdW50XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbEluZGV4ID0gc3VtbWFyeURhdGEuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS50eXBlID09PSAndG90YWwnKTtcbiAgICAgICAgICAgICAgICBpZiAodG90YWxJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeURhdGEgPSBbLi4uc3VtbWFyeURhdGEsIHNoaXBtZW50SXRlbV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYHRvdGFsYCB5YSBlcyBlbCBpbXBvcnRlIGZpbmFsIGluZm9ybWFkbyBwb3IgYmFja2VuZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gU8OzbG8gc2UgaW5jb3Jwb3JhIGVsIGVudsOtbyBmYWx0YW50ZSwgc2luIHJlY29uc3RydWlyIG5pXG4gICAgICAgICAgICAgICAgICAgIC8vIG1vZGlmaWNhciBlc2UgdG90YWwuXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnlEYXRhID0gWy4uLnN1bW1hcnlEYXRhLnNsaWNlKDAsIHRvdGFsSW5kZXgpLCBzaGlwbWVudEl0ZW0sIC4uLnN1bW1hcnlEYXRhLnNsaWNlKHRvdGFsSW5kZXgpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VtbWFyeURhdGEgPSB0aGlzLmFnZ3JlZ2F0ZURpc2NvdW50cyhzdW1tYXJ5RGF0YSlcbiAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGUgIT09ICdwcm9kdWN0c0JlZm9yZURpc2NvdW50cycgJiYgaXRlbS50eXBlICE9PSAnbGluZURpc2NvdW50Jyk7XG5cbiAgICAgICAgY29uc3QgaW5jbHVkZWRUYXhlcyA9IHN1bW1hcnlEYXRhLmZpbHRlcihpdGVtID0+XG4gICAgICAgICAgICBpdGVtLnR5cGUgPT09ICd0YXhlcycgJiYgaXRlbS50YXhlc0luY2x1ZGVkSW5Ub3RhbCA9PT0gdHJ1ZVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghaW5jbHVkZWRUYXhlcy5sZW5ndGgpIHJldHVybiBzdW1tYXJ5RGF0YTtcblxuICAgICAgICBjb25zdCB3aXRob3V0SW5jbHVkZWRUYXhlcyA9IHN1bW1hcnlEYXRhLmZpbHRlcihpdGVtID0+XG4gICAgICAgICAgICAhKGl0ZW0udHlwZSA9PT0gJ3RheGVzJyAmJiBpdGVtLnRheGVzSW5jbHVkZWRJblRvdGFsID09PSB0cnVlKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0b3RhbEluZGV4ID0gd2l0aG91dEluY2x1ZGVkVGF4ZXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS50eXBlID09PSAndG90YWwnKTtcblxuICAgICAgICBpZiAodG90YWxJbmRleCA9PT0gLTEpIHJldHVybiBbLi4ud2l0aG91dEluY2x1ZGVkVGF4ZXMsIC4uLmluY2x1ZGVkVGF4ZXNdO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi53aXRob3V0SW5jbHVkZWRUYXhlcy5zbGljZSgwLCB0b3RhbEluZGV4ICsgMSksXG4gICAgICAgICAgICAuLi5pbmNsdWRlZFRheGVzLFxuICAgICAgICAgICAgLi4ud2l0aG91dEluY2x1ZGVkVGF4ZXMuc2xpY2UodG90YWxJbmRleCArIDEpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZ2V0U3VtbWFyeUFtb3VudFZpZXcgPSAoaXRlbTogQ2hlY2tvdXREYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU2hpcG1lbnRBbW91bnQgPSBpdGVtPy50eXBlID09PSAnc2hpcG1lbnQnID8gdGhpcy5nZXRTaGlwbWVudE9yaWdpbmFsQW1vdW50KCkgOiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5zaGlwcGluZ1ByaWNlRGlzcGxheS5idWlsZFZpZXdNb2RlbChpdGVtPy5hbW91bnQsIG9yaWdpbmFsU2hpcG1lbnRBbW91bnQpO1xuICAgIH1cblxuICAgIGdldFRvdGFsQW1vdW50ID0gKGRhdGE6IENoZWNrb3V0RGF0YVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlEYXRhID0gdGhpcy5nZXRTdW1tYXJ5RGF0YShkYXRhKTtcbiAgICAgICAgaWYgKCFzdW1tYXJ5RGF0YSB8fCAhc3VtbWFyeURhdGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtID0gc3VtbWFyeURhdGEuZmluZChpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ3RvdGFsJyk7XG4gICAgICAgIHJldHVybiB0b3RhbEl0ZW0gPyB0b3RhbEl0ZW0uYW1vdW50IDogbnVsbDtcbiAgICB9XG5cbiAgICBzaG91bGRTaG93U3VtbWFyeUl0ZW0gPSAoaXRlbTogQ2hlY2tvdXREYXRhKSA9PiB7XG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSAncHJvZHVjdHNCZWZvcmVEaXNjb3VudHMnIHx8IGl0ZW0udHlwZSA9PT0gJ2xpbmVEaXNjb3VudCcpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKChpdGVtLnR5cGUgPT09ICdkaXNjb3VudCcgfHwgaXRlbS50eXBlID09PSAnY291cG9uJykgJiYgaXRlbS5hbW91bnQgPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoKGl0ZW0udHlwZSA9PT0gJ2Rpc2NvdW50JyB8fCBpdGVtLnR5cGUgPT09ICdjb3Vwb24nKSAmJiB0aGlzLmhpZGVEaXNjb3VudHMpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3RheGVzJyAmJiAodGhpcy5oaWRlVGF4ZXMgfHwgaXRlbS5hbW91bnQgPT0gMCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2NsaWVudFRheGVzJyAmJiAodGhpcy5oaWRlVGF4ZXMgfHwgaXRlbS5hbW91bnQgPT0gMCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkSGlkZVN1bW1hcnlTdWJ0b3RhbChpdGVtKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzU3VtbWFyeUxhYmVsID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGVwRGF0YTogYW55ID0gdGhpcy5jaGVja291dFNlcnZpY2UuZ2V0U3RlcERhdGEoJ2FkZHJlc3MnIGFzIGFueSk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBzdGVwRGF0YT8uc2hpcHBpbmdBZGRyZXNzIHx8IHN0ZXBEYXRhPy5zZWxlY3RlZD8uc2hpcHBpbmdBZGRyZXNzO1xuICAgICAgICBjb25zdCBjb250YWN0ID0gYWRkcmVzcz8uYWRkcmVzc0NvbnRhY3QgfHwgYWRkcmVzcz8uY29udGFjdCB8fCBhZGRyZXNzIHx8IHt9O1xuICAgICAgICByZXR1cm4gW2NvbnRhY3QuZmlyc3ROYW1lLCBjb250YWN0Lmxhc3ROYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIH1cblxuICAgIGdldFN0ZXBTdW1tYXJ5ID0gKHN0ZXBOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RlcERhdGE6IGFueSA9IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldFN0ZXBEYXRhKHN0ZXBOYW1lIGFzIGFueSk7XG4gICAgICAgIGlmICghc3RlcERhdGEpIHJldHVybiAnJztcbiAgICAgICAgaWYgKHN0ZXBOYW1lID09PSAnYWRkcmVzcycpIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3MgPSBzdGVwRGF0YS5zaGlwcGluZ0FkZHJlc3MgfHwgc3RlcERhdGE/LnNlbGVjdGVkPy5zaGlwcGluZ0FkZHJlc3MgfHwgc3RlcERhdGE/LnNoaXBwaW5nQWRkcmVzcztcbiAgICAgICAgICAgIGlmICghYWRkcmVzcykgcmV0dXJuICcnO1xuICAgICAgICAgICAgY29uc3QgbWFpbiA9IFthZGRyZXNzLnN0cmVldCwgYWRkcmVzcy5jaXR5XS5maWx0ZXIoQm9vbGVhbikuam9pbignIMK3ICcpO1xuICAgICAgICAgICAgY29uc3QgcmVnaW9uID0gW2FkZHJlc3MucHJvdmluY2VDb2RlIHx8IGFkZHJlc3MucHJvdmluY2UsIGFkZHJlc3MuY291bnRyeUNvZGUgfHwgYWRkcmVzcy5jb3VudHJ5XVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgIHJldHVybiBbbWFpbiwgcmVnaW9uXS5maWx0ZXIoQm9vbGVhbikuam9pbignIOKAlCAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcE5hbWUgPT09ICdzaGlwbWVudCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZExhYmVsID0gc3RlcERhdGEubWV0aG9kPy5uYW1lIHx8IHN0ZXBEYXRhLm1ldGhvZF9uYW1lIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgY29udHJhY3RMYWJlbCA9IHN0ZXBEYXRhLmNvbnRyYWN0Py5uYW1lIHx8IHN0ZXBEYXRhLmNvbnRyYWN0X25hbWUgfHwgc3RlcERhdGEubmFtZSB8fCBzdGVwRGF0YS5jb250cmFjdCB8fCAnJztcbiAgICAgICAgICAgIHJldHVybiBbbWV0aG9kTGFiZWwsIGNvbnRyYWN0TGFiZWxdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZXBOYW1lID09PSAncGF5bWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwRGF0YS5uYW1lIHx8IHN0ZXBEYXRhLmNvZGUgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHNldFNoaXBtZW50U3VtbWFyeSA9IChzdW1tYXJ5OiB7IGxhYmVsPzogc3RyaW5nOyBkZXRhaWw/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICBjb25zdCBoYXNMYWJlbCA9IEJvb2xlYW4oc3VtbWFyeT8ubGFiZWwpO1xuICAgICAgICBjb25zdCBoYXNEZXRhaWwgPSBCb29sZWFuKHN1bW1hcnk/LmRldGFpbCk7XG4gICAgICAgIHRoaXMuc2hpcG1lbnRTdW1tYXJ5ID0gaGFzTGFiZWwgfHwgaGFzRGV0YWlsID8gc3VtbWFyeSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTaGlwbWVudE9yaWdpbmFsQW1vdW50ID0gKCk6IG51bWJlciB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCBzaGlwbWVudFN0ZXBEYXRhOiBhbnkgPSB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRTdGVwRGF0YSgnc2hpcG1lbnQnIGFzIGFueSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNoaXBwaW5nUHJpY2VEaXNwbGF5Lm5vcm1hbGl6ZVByaWNlVmFsdWUoXG4gICAgICAgICAgICBzaGlwbWVudFN0ZXBEYXRhPy5vcmlnaW5hbFByaWNlID8/XG4gICAgICAgICAgICBzaGlwbWVudFN0ZXBEYXRhPy5jb250cmFjdD8ub3JpZ2luYWxQcmljZSA/P1xuICAgICAgICAgICAgc2hpcG1lbnRTdGVwRGF0YT8uc2VsZWN0ZWQ/LmNvbnRyYWN0Py5vcmlnaW5hbFByaWNlID8/XG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZ2dyZWdhdGVEaXNjb3VudHMoZGF0YTogQ2hlY2tvdXREYXRhW10pIHtcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gZGF0YVxuICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ2Rpc2NvdW50JylcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICsgKGN1cnIuYW1vdW50IHx8IDApLCAwKTtcbiAgICAgICAgY29uc3QgY291cG9uVG90YWwgPSBkYXRhXG4gICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS50eXBlID09PSAnY291cG9uJylcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICsgKGN1cnIuYW1vdW50IHx8IDApLCAwKTtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBkYXRhLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSAhPT0gJ2Rpc2NvdW50JyAmJiBpdGVtLnR5cGUgIT09ICdjb3Vwb24nKTtcblxuICAgICAgICBpZiAodGhpcy5oaWRlRGlzY291bnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRyYXM6IENoZWNrb3V0RGF0YVtdID0gW107XG4gICAgICAgIGlmIChkaXNjb3VudFRvdGFsICE9PSAwKSB7XG4gICAgICAgICAgICBleHRyYXMucHVzaCh7IHR5cGU6ICdkaXNjb3VudCcsIG5hbWU6ICdkaXNjb3VudCcsIGFtb3VudDogZGlzY291bnRUb3RhbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY291cG9uVG90YWwgIT09IDApIHtcbiAgICAgICAgICAgIGV4dHJhcy5wdXNoKHsgdHlwZTogJ2NvdXBvbicsIG5hbWU6ICdjb3Vwb24nLCBhbW91bnQ6IGNvdXBvblRvdGFsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXh0cmFzLmxlbmd0aCkgcmV0dXJuIGZpbHRlcmVkO1xuXG4gICAgICAgIGNvbnN0IHN1YnRvdGFsSW5kZXggPSBmaWx0ZXJlZC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnR5cGUgPT09ICdzdWJ0b3RhbCcpO1xuICAgICAgICBpZiAoc3VidG90YWxJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5maWx0ZXJlZF07XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKHN1YnRvdGFsSW5kZXggKyAxLCAwLCAuLi5leHRyYXMpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBkYXRhLmZpbmRJbmRleChpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ2Rpc2NvdW50JyB8fCBpdGVtLnR5cGUgPT09ICdjb3Vwb24nKTtcbiAgICAgICAgaWYgKGZpcnN0SW5kZXggPT09IC0xKSByZXR1cm4gWy4uLmZpbHRlcmVkLCAuLi5leHRyYXNdO1xuICAgICAgICBjb25zdCBpbnNlcnRBdCA9IGRhdGFcbiAgICAgICAgICAgIC5zbGljZSgwLCBmaXJzdEluZGV4KVxuICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSAhPT0gJ2Rpc2NvdW50JyAmJiBpdGVtLnR5cGUgIT09ICdjb3Vwb24nKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5maWx0ZXJlZF07XG4gICAgICAgIHJlc3VsdC5zcGxpY2UoaW5zZXJ0QXQsIDAsIC4uLmV4dHJhcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRIaWRlU3VtbWFyeVN1YnRvdGFsKGl0ZW06IENoZWNrb3V0RGF0YSkge1xuICAgICAgICBpZiAoaXRlbT8udHlwZSAhPT0gJ3N1YnRvdGFsJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5sYXN0QXNzb2NpYXRlZERhdGE7XG4gICAgICAgIGlmICghZGF0YT8ubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlEYXRhID0gdGhpcy5nZXRTdW1tYXJ5RGF0YShkYXRhKTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtID0gc3VtbWFyeURhdGEuZmluZChkYXRhSXRlbSA9PiBkYXRhSXRlbS50eXBlID09PSAndG90YWwnKTtcbiAgICAgICAgcmV0dXJuICEhdG90YWxJdGVtICYmIGl0ZW0uYW1vdW50ID09PSB0b3RhbEl0ZW0uYW1vdW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsVG9TZWN0aW9uKHN0ZXBOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb290ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoIXJvb3QpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSByb290LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXN0ZXA9XFxcIiR7c3RlcE5hbWV9XFxcIl1gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghc2VjdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgdG9wID0gc2VjdGlvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogTWF0aC5tYXgoMCwgdG9wIC0gb2Zmc2V0KSwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY3JvbGxUb1RvcE9uRW50ZXIoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBsZWZ0OiAwLCBiZWhhdmlvcjogJ2F1dG8nIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwU3VtbWFyeU9ic2VydmVyKCkge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dFZpZXcgIT09ICdzaW5nbGUnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFyb290KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGZpbmlzaEJ0biA9IHJvb3QucXVlcnlTZWxlY3RvcignI2NoZWNrb3V0RmluaXNoQnRuJyk7XG4gICAgICAgIGlmICghZmluaXNoQnRuKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zdW1tYXJ5T2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcbiAgICAgICAgICAgIHRoaXMuaGlkZU1vYmlsZVN1bW1hcnlCYXIgPSAhIWVudHJ5ICYmIGVudHJ5LmlzSW50ZXJzZWN0aW5nO1xuICAgICAgICB9LCB7IHJvb3RNYXJnaW46ICcwcHggMHB4IC0xMjBweCAwcHgnLCB0aHJlc2hvbGQ6IDAgfSk7XG5cbiAgICAgICAgdGhpcy5zdW1tYXJ5T2JzZXJ2ZXIub2JzZXJ2ZShmaW5pc2hCdG4pO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICAgIGV2YWx1YXRlTW9iaWxlQmFyVmlzaWJpbGl0eSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRWaWV3ICE9PSAnc2luZ2xlJykgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuZmluaXNoQnV0dG9uRWwpIHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQnV0dG9uRWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY2hlY2tvdXRGaW5pc2hCdG4nKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5maW5pc2hCdXR0b25FbCkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmZpbmlzaEJ1dHRvbkVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCAwO1xuICAgICAgICB0aGlzLmhpZGVNb2JpbGVTdW1tYXJ5QmFyID0gcmVjdC50b3AgPCAodmlld3BvcnRIZWlnaHQgLSA4MCk7XG4gICAgfVxuXG4gICAgYXJlQWxsU3RlcHNSZWFkeSA9IChzdGVwczogeyBpc1JlYWR5OiAoKSA9PiBib29sZWFuOyBuYW1lPzogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICBpZiAoIXN0ZXBzIHx8ICFzdGVwcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHN0ZXBzLmV2ZXJ5KHN0ZXAgPT4ge1xuICAgICAgICAgICAgaWYgKCFzdGVwLmlzUmVhZHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFzdGVwLm5hbWUpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzU3RlcERpcnR5KHN0ZXAubmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNob3VsZEhpZGVGaW5pc2hCdXR0b24gPSAoc3RlcHM6IHsgaXNSZWFkeTogKCkgPT4gYm9vbGVhbiB9W10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRWaWV3ICE9PSAnc2luZ2xlJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMuYXJlQWxsU3RlcHNSZWFkeShzdGVwcykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcGF5bWVudERhdGE6IGFueSA9IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldFN0ZXBEYXRhKCdwYXltZW50JyBhcyBhbnkpO1xuICAgICAgICByZXR1cm4gISFwYXltZW50RGF0YT8uYXV0b0NvbXBsZXRlO1xuICAgIH1cblxuICAgIG9wZW5VbnNhdmVkQ2hhbmdlc01vZGFsID0gKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2xvc2VTdGVwTmFtZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLm1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyh0ZW1wbGF0ZSwge1xuICAgICAgICAgICAgY2xhc3M6ICdtb2RhbC1kaWFsb2ctY2VudGVyZWQgY2hlY2tvdXQtdW5zYXZlZC1tb2RhbCcsXG4gICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXG4gICAgICAgICAgICBrZXlib2FyZDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2FuY2VsVW5zYXZlZENsb3NlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdDbG9zZVN0ZXBOYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb2RhbFJlZj8uaGlkZSgpO1xuICAgIH1cblxuICAgIGNvbmZpcm1VbnNhdmVkRGlzY2FyZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDbG9zZVN0ZXBOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsUmVmPy5oaWRlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RlcE5hbWUgPSB0aGlzLnBlbmRpbmdDbG9zZVN0ZXBOYW1lO1xuICAgICAgICB0aGlzLnBlbmRpbmdDbG9zZVN0ZXBOYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5kaXNjYXJkU3RlcENoYW5nZXMoc3RlcE5hbWUpO1xuICAgICAgICB0aGlzLm9wZW5TZWN0aW9ucyA9IHRoaXMub3BlblNlY3Rpb25zLmZpbHRlcihuYW1lID0+IG5hbWUgIT09IHN0ZXBOYW1lKTtcbiAgICAgICAgdGhpcy5tb2RhbFJlZj8uaGlkZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzY2FyZFN0ZXBDaGFuZ2VzKHN0ZXBOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHN0ZXBOYW1lID09PSAnYWRkcmVzcycpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFmb3JtID0gdGhpcy5kYXRhZm9ybUNvbXBvbmVudHM/LmZpcnN0O1xuICAgICAgICAgICAgaWYgKGRhdGFmb3JtKSB7XG4gICAgICAgICAgICAgICAgZGF0YWZvcm0uZGlzY2FyZENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RlcERpcnR5TWFwLnNldChzdGVwTmFtZSwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGVwTmFtZSA9PT0gJ3BheW1lbnQnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXltZW50ID0gdGhpcy5wYXltZW50Q29tcG9uZW50cz8uZmlyc3Q7XG4gICAgICAgICAgICBpZiAocGF5bWVudCkge1xuICAgICAgICAgICAgICAgIHBheW1lbnQuZGlzY2FyZENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RlcERpcnR5TWFwLnNldChzdGVwTmFtZSwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcERpcnR5TWFwLnNldChzdGVwTmFtZSwgZmFsc2UpO1xuICAgIH1cbn1cbiJdfQ==
743
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tvdXQtZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9jaGVja291dC1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLE9BQU8sTUFBTSxZQUFZLENBQUM7QUFDakMsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUErQixNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxD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M2tCUSxtQkFBbUI7UUFML0IsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixxcGZBQTJDOztTQUU5QyxDQUFDO09BQ1csbUJBQW1CLENBMG9CL0I7SUFBRCwwQkFBQztDQUFBLEFBMW9CRCxDQUF5QyxlQUFlLEdBMG9CdkQ7U0Exb0JZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IFN0ZXBwZXIgZnJvbSAnYnMtc3RlcHBlcic7XG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENoZWNrb3V0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoZWNrb3V0L2NoZWNrb3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBTdGVwSSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc3RlcCc7XG5pbXBvcnQgeyBDaGVja291dERhdGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2NoZWNrb3V0LWRhdGEnO1xuaW1wb3J0IHsgUHJvZHVjdHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJvZHVjdHMvcHJvZHVjdHMuc2VydmljZSc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQ2hhbm5lbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jaGFubmVsLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IENoZWNrb3V0Vmlld1R5cGUsIENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvcmUuY29uc3RzJztcbmltcG9ydCB7IERhdGFGb3JtRWNDb21wb25lbnQgfSBmcm9tICcuL2RhdGFmb3JtLWVjL2RhdGFmb3JtLWVjLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXltZW50RWNDb21wb25lbnQgfSBmcm9tICcuL3BheW1lbnQtZWMvcGF5bWVudC1lYy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UsIEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IFNoaXBwaW5nUHJpY2VEaXNwbGF5U2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL3NoaXBwaW5nLXByaWNlLWRpc3BsYXkuc2VydmljZSc7XG5pbXBvcnQgeyBTZW9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VvLnNlcnZpY2UnO1xuaW1wb3J0IHsgaGFuZGxlSW52YWxpZGF0ZWRDaGVja291dE5hdmlnYXRpb24sIG5hdmlnYXRlSG9tZUFmdGVyQ2FydEJvb3RzdHJhcFJlY292ZXJ5IH0gZnJvbSAnLi4vY2FydC1ib290c3RyYXAtbmF2aWdhdGlvbic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWNoZWNrb3V0LWVjJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hlY2tvdXQtZWMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NoZWNrb3V0LWVjLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2hlY2tvdXRFY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyBzdGVwcGVyOiBTdGVwcGVyO1xuICAgIHB1YmxpYyBsb2FkaW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gICAgcHVibGljIGNhbkNoZWNrb3V0ID0gZmFsc2U7XG4gICAgcHVibGljIHJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgc3ViQ2FuOiBTdWJzY3JpcHRpb247XG4gICAgcHVibGljIHN1YlJlYWR5OiBTdWJzY3JpcHRpb247XG4gICAgcHVibGljIGNoYW5uZWw6IGFueTtcbiAgICBwdWJsaWMgc3RlcHM6IGFueVtdID0gW107XG4gICAgcHVibGljIGhpZGVQcmljZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgaGlkZURpc2NvdW50czogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjaGVja291dFZpZXc6IENoZWNrb3V0Vmlld1R5cGUgPSAnbGVnYWN5JztcbiAgICBwdWJsaWMgY3JlZGl0QWNjb3VudFNob3dQcmljZXM6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGxhc3RBc3NvY2lhdGVkRGF0YTogQ2hlY2tvdXREYXRhW10gfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgb3BlblNlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgbGFzdFBheW1lbnRBZGRyZXNzS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHBheW1lbnRBdXRvT3BlbmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBhdXRvQ2xvc2VkU3RlcHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIG1hbnVhbGx5T3BlbmVkU3RlcHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGNhcnRCb290c3RyYXBSZWNvdmVyeVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgY2FydENoZWNrb3V0SW52YWxpZGF0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBjaGVja291dEludmFsaWRhdGlvbkhhbmRsZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGhhbmRsZUNhcnRCb290c3RyYXBSZWNvdmVyeSA9ICgpID0+IHtcbiAgICAgICAgbmF2aWdhdGVIb21lQWZ0ZXJDYXJ0Qm9vdHN0cmFwUmVjb3ZlcnkoXG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwsXG4gICAgICAgICAgICAnY2hlY2tvdXQnLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5jYXJ0U2VydmljZS5jb25zdW1lQ2FydEJvb3RzdHJhcFJlY292ZXJ5KCksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvJylcbiAgICAgICAgKTtcbiAgICB9O1xuICAgIHByaXZhdGUgaGFuZGxlQ2FydENoZWNrb3V0SW52YWxpZGF0aW9uID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEludmFsaWRhdGlvbkhhbmRsZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5jaGVja291dEludmFsaWRhdGlvbkhhbmRsZWQgPSBoYW5kbGVJbnZhbGlkYXRlZENoZWNrb3V0TmF2aWdhdGlvbihcbiAgICAgICAgICAgIHRoaXMucm91dGVyLnVybCxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbkNoZWNrb3V0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YlJlYWR5Py51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmludmFsaWRhdGVDaGVja291dFN0YXRlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycpXG4gICAgICAgICk7XG4gICAgfTtcbiAgICBwdWJsaWMgaGlkZVRheGVzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHNob3dUYXhMZWdlbmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgc2hpcG1lbnRTdW1tYXJ5OiB7IGxhYmVsPzogc3RyaW5nOyBkZXRhaWw/OiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBoaWRlTW9iaWxlU3VtbWFyeUJhciA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3VtbWFyeU9ic2VydmVyOiBJbnRlcnNlY3Rpb25PYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZmluaXNoQnV0dG9uRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBzdGVwRGlydHlNYXAgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBwdWJsaWMgbW9kYWxSZWY6IEJzTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHBlbmRpbmdDbG9zZVN0ZXBOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIG5hdlN1YjogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgY2hhbm5lbFJlYWR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBwZW5kaW5nQ2hlY2tvdXRJbml0ID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgbG9hZGluZyQgPSB0aGlzLmxvYWRpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgQFZpZXdDaGlsZHJlbihEYXRhRm9ybUVjQ29tcG9uZW50KSBwcml2YXRlIGRhdGFmb3JtQ29tcG9uZW50czogUXVlcnlMaXN0PERhdGFGb3JtRWNDb21wb25lbnQ+O1xuICAgIEBWaWV3Q2hpbGRyZW4oUGF5bWVudEVjQ29tcG9uZW50KSBwcml2YXRlIHBheW1lbnRDb21wb25lbnRzOiBRdWVyeUxpc3Q8UGF5bWVudEVjQ29tcG9uZW50PjtcbiAgICBAVmlld0NoaWxkKCd1bnNhdmVkQ2hhbmdlc01vZGFsJykgcHJpdmF0ZSB1bnNhdmVkQ2hhbmdlc01vZGFsOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNoZWNrb3V0U2VydmljZTogQ2hlY2tvdXRTZXJ2aWNlLCBwdWJsaWMgdG9hc3RyU2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsIHB1YmxpYyBwcm9kdWN0c1NlcnZpY2U6IFByb2R1Y3RzU2VydmljZSxcbiAgICAgICAgcHVibGljIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsQ29uZmlnU2VydmljZSwgcHVibGljIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzaGlwcGluZ1ByaWNlRGlzcGxheTogU2hpcHBpbmdQcmljZURpc3BsYXlTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgc2VvOiBTZW9TZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRWaWV3ID0gdGhpcy5jb25zdHMuZ2V0Q2hlY2tvdXRWaWV3KCk7XG4gICAgICAgIHRoaXMuY29uc3RzLmNoZWNrb3V0VmlldyQuc3Vic2NyaWJlKHZpZXcgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dFZpZXcgPSB2aWV3IHx8ICdsZWdhY3knO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5jaGFubmVsQ29uZmlnJC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IHJlc1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplU3RlcHMoKVxuICAgICAgICAgICAgdGhpcy5oaWRlUHJpY2VzID0gcmVzPy5oaWRlUHJpY2VzID8/IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5oaWRlRGlzY291bnRzID0gcmVzPy5oaWRlRGlzY291bnRzID8/IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5oaWRlVGF4ZXMgPSByZXM/LmhpZGVUYXhlcyA/PyBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1RheExlZ2VuZCA9IHJlcz8uc2hvd1RheExlZ2VuZCA/PyBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbFJlYWR5ID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaGlkZVByaWNlcykge1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdDaGVja291dEluaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dEluaXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVDaGVja291dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnN0ZXBFbmFibGVkKDMpKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2hlY2tvdXRTZW8gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNpdGVOYW1lID0gdGhpcy5zZW8uZ2V0U2l0ZU5hbWUoKTtcbiAgICAgICAgdGhpcy5zZW8uc2V0VGl0bGUoYENoZWNrb3V0IHwgJHtzaXRlTmFtZX1gKTtcbiAgICAgICAgdGhpcy5zZW8uc2V0RGVzY3JpcHRpb24oYEZpbmFsaXrDoSB0dSBjb21wcmEgZW4gJHtzaXRlTmFtZX0uYCk7XG4gICAgICAgIHRoaXMuc2VvLnNldE9nVHlwZSgnd2Vic2l0ZScpO1xuICAgICAgICB0aGlzLnNlby5zZXROb0luZGV4KHRydWUpO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5zZW8uc2V0Q2Fub25pY2FsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeVN1YnNjcmlwdGlvbiA9IHRoaXMuY2FydFNlcnZpY2UuY2FydEJvb3RzdHJhcFJlY292ZXJ5LnN1YnNjcmliZSh0aGlzLmhhbmRsZUNhcnRCb290c3RyYXBSZWNvdmVyeSk7XG4gICAgICAgIHRoaXMuY2FydENoZWNrb3V0SW52YWxpZGF0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5jYXJ0U2VydmljZS5jYXJ0Q2hlY2tvdXRJbnZhbGlkYXRpb24uc3Vic2NyaWJlKHRoaXMuaGFuZGxlQ2FydENoZWNrb3V0SW52YWxpZGF0aW9uKTtcbiAgICAgICAgdGhpcy5oYW5kbGVDYXJ0Qm9vdHN0cmFwUmVjb3ZlcnkoKTtcbiAgICAgICAgdGhpcy5uYXZTdWIgPSB0aGlzLnJvdXRlci5ldmVudHMucGlwZShmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy9jaGVja291dCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1RvcE9uRW50ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3ViQ2FuID0gdGhpcy5jaGVja291dFNlcnZpY2UuY2FuQ2hlY2tvdXQkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGNvbnRhaW5faXRlbXMgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb250YWluX2l0ZW1zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5DaGVja291dCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5jaGFubmVsUmVhZHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dEluaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNoZWNrb3V0KCk7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLnN0YXRlJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWdhY3lDaGVja291dCgpKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBoYXNQYXltZW50U3RlcCA9IHRoaXMuc3RlcHMuc29tZShzdGVwID0+IHN0ZXAubmFtZSA9PT0gJ3BheW1lbnQnKTtcbiAgICAgICAgICAgIGlmICghaGFzUGF5bWVudFN0ZXApIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NEYXRhID0gdGhpcy5jaGVja291dFNlcnZpY2UuZ2V0U3RlcERhdGEoJ2FkZHJlc3MnKTtcbiAgICAgICAgICAgIGlmICghYWRkcmVzc0RhdGEpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KGFkZHJlc3NEYXRhKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RQYXltZW50QWRkcmVzc0tleSA9PT0ga2V5KSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLmxhc3RQYXltZW50QWRkcmVzc0tleSA9IGtleTtcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2Uuc3RhdGUkLnN1YnNjcmliZShzdGVwcyA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xlZ2FjeUNoZWNrb3V0KCkgfHwgIXN0ZXBzKSByZXR1cm47XG4gICAgICAgICAgICBzdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc3RlcD8ubmFtZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICghc3RlcC5pc1JlYWR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvQ2xvc2VkU3RlcHMuZGVsZXRlKHN0ZXAubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGVwRGlydHkoc3RlcC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hdXRvQ2xvc2VkU3RlcHMuaGFzKHN0ZXAubmFtZSkgJiYgdGhpcy5vcGVuU2VjdGlvbnMuaW5jbHVkZXMoc3RlcC5uYW1lKSAmJiAhdGhpcy5tYW51YWxseU9wZW5lZFN0ZXBzLmhhcyhzdGVwLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlblNlY3Rpb25zID0gdGhpcy5vcGVuU2VjdGlvbnMuZmlsdGVyKG5hbWUgPT4gbmFtZSAhPT0gc3RlcC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvQ2xvc2VkU3RlcHMuYWRkKHN0ZXAubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoZWNrb3V0U2VydmljZS5wYXltZW50TWV0aG9kcyQuc3Vic2NyaWJlKG1ldGhvZHMgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWdhY3lDaGVja291dCgpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodGhpcy5wYXltZW50QXV0b09wZW5lZCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFtZXRob2RzIHx8ICFtZXRob2RzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaGFzU2hpcG1lbnRTdGVwID0gdGhpcy5zdGVwcy5zb21lKHN0ZXAgPT4gc3RlcC5uYW1lID09PSAnc2hpcG1lbnQnKTtcbiAgICAgICAgICAgIGlmIChoYXNTaGlwbWVudFN0ZXAgJiYgIXRoaXMuaXNTdGVwUmVhZHkoJ3NoaXBtZW50JykpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghaGFzU2hpcG1lbnRTdGVwICYmICF0aGlzLmlzU3RlcEVuYWJsZWQoJ3BheW1lbnQnKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5TZWN0aW9ucy5pbmNsdWRlcygncGF5bWVudCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuU2VjdGlvbnMucHVzaCgncGF5bWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wYXltZW50QXV0b09wZW5lZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoZWNrb3V0U2VvKCk7XG4gICAgICAgIHRoaXMuZWNPbkluaXQoKVxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLnNob3dQcmljZSQuc3Vic2NyaWJlKHNob3dQcmljZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWRpdEFjY291bnRTaG93UHJpY2VzID0gc2hvd1ByaWNlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2UuYXNvY2lhdGVkRGF0YSQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5sYXN0QXNzb2NpYXRlZERhdGEgPSBkYXRhO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Ub3BPbkVudGVyKCk7XG4gICAgICAgIHRoaXMuc2V0dXBTdW1tYXJ5T2JzZXJ2ZXIoKTtcbiAgICAgICAgdGhpcy5maW5pc2hCdXR0b25FbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjaGVja291dEZpbmlzaEJ0bicpO1xuICAgICAgICB0aGlzLmV2YWx1YXRlTW9iaWxlQmFyVmlzaWJpbGl0eSgpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdW1tYXJ5T2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeU9ic2VydmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmlzaEJ1dHRvbkVsID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdWJDYW4/LnVuc3Vic2NyaWJlKClcbiAgICAgICAgdGhpcy5zdWJSZWFkeT8udW5zdWJzY3JpYmUoKVxuICAgICAgICB0aGlzLm5hdlN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuY2FydENoZWNrb3V0SW52YWxpZGF0aW9uU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGluaXRpYWxpemVDaGVja291dCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5jYW5DaGVja291dCA9IHRydWU7XG4gICAgICAgIGxldCBzdGVwczogU3RlcElbXSA9IFtdO1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdjaGFubmVsJywgdGhpcy5jaGFubmVsKVxuICAgICAgICBzdGVwcy5wdXNoKHsgbmFtZTogJ2FkZHJlc3MnIH0pO1xuICAgICAgICB0aGlzLmNoYW5uZWw/LmlzU2tpcHBpbmdTaGlwcGluZ1N0ZXBBbGxvd2VkID8gbnVsbCA6IHN0ZXBzLnB1c2goeyBuYW1lOiAnc2hpcG1lbnQnIH0pO1xuICAgICAgICB0aGlzLmNoYW5uZWw/LmlzU2tpcHBpbmdQYXltZW50U3RlcEFsbG93ZWQgPyBudWxsIDogc3RlcHMucHVzaCh7IG5hbWU6ICdwYXltZW50JyB9KTtcbiAgICAgICAgLyogc3RlcHMucHVzaCh7IG5hbWU6ICdzaGlwbWVudCcgfSk7XG4gICAgICAgIHN0ZXBzLnB1c2goeyBuYW1lOiAncGF5bWVudCcgfSk7ICovXG4gICAgICAgIC8vY29uc29sZS5sb2coc3RlcHMpXG4gICAgICAgIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLnNldFN0ZXBzKHN0ZXBzKTtcbiAgICAgICAgaWYgKHRoaXMuaXNMZWdhY3lDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0ZXBwZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pc0xlZ2FjeUNoZWNrb3V0KCkgJiYgKHRoaXMuY2hhbm5lbD8uaXNTa2lwcGluZ1NoaXBwaW5nU3RlcEFsbG93ZWQgIT0gdHJ1ZSB8fCB0aGlzLmNoYW5uZWw/LmlzU2tpcHBpbmdQYXltZW50U3RlcEFsbG93ZWQgIT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3ViUmVhZHkgPSB0aGlzLmNoZWNrb3V0U2VydmljZS5vblJlYWR5JC5waXBlKGZpbHRlcihyZWFkeSA9PiByZWFkeSkpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICByZXMgPT4geyByZXMgJiYgdGhpcy5lbmRDaGVja291dCgpIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnb0JhY2sgPSAoKSA9PiB0aGlzLnN0ZXBwZXIucHJldmlvdXMoKTtcblxuICAgIGlzU3RlcFJlYWR5ID0gKHN0ZXBfbmFtZSkgPT4gdGhpcy5jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoc3RlcF9uYW1lKTtcblxuICAgIGlzU3RlcERpcnR5ID0gKHN0ZXBOYW1lOiBzdHJpbmcpID0+ICEhdGhpcy5zdGVwRGlydHlNYXAuZ2V0KHN0ZXBOYW1lKTtcblxuICAgIGlzU3RlcENvbXBsZXRlID0gKHN0ZXBOYW1lOiBzdHJpbmcpID0+IHRoaXMuaXNTdGVwUmVhZHkoc3RlcE5hbWUpICYmICF0aGlzLmlzU3RlcERpcnR5KHN0ZXBOYW1lKTtcblxuICAgIG9uU3RlcERpcnR5Q2hhbmdlID0gKHN0ZXBOYW1lOiBzdHJpbmcsIGlzRGlydHk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5zdGVwRGlydHlNYXAuc2V0KHN0ZXBOYW1lLCBpc0RpcnR5KTtcbiAgICB9XG5cbiAgICBlbmRDaGVja291dCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2UuY29tcGxldGUoKS50aGVuKFxuICAgICAgICAgICAgcmVzID0+IHJlcy5vayAmJiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2NoZWNrb3V0L29yZGVyX3N1Y2Nlc3MnXSksXG4gICAgICAgICAgICBlcnIgPT4gdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ29wZXJhdGlvbi1lcnJvcicpXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBzZXRTdGVwcGVyID0gKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3RlcHBlcicpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXBwZXIgPSBuZXcgU3RlcHBlcihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3RlcHBlcicpLCB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGVwcGVyKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5zdGVwcGVyKVxuICAgIH1cblxuICAgIG5leHQgPSAoKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5zdGVwcGVyKVxuICAgICAgICB0aGlzLnN0ZXBwZXIubmV4dCgpXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5zdGVwcGVyKVxuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KVxuICAgIH07XG5cbiAgICBlcnJvciA9IChlcnJvcl92YWx1ZSkgPT4gdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coZXJyb3JfdmFsdWUpO1xuXG4gICAgZ2V0SWNvbiA9IChkYXRhX2l0ZW06IENoZWNrb3V0RGF0YSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGRhdGFfaXRlbS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjb3Vwb24nOiByZXR1cm4gJ2Fzc2V0cy9pbWFnZXMvY291cG9uLnBuZyc7XG4gICAgICAgICAgICBjYXNlICdkaXNjb3VudCc6IHJldHVybiAnYXNzZXRzL2ltYWdlcy9kaXNjb3VudC5wbmcnO1xuICAgICAgICAgICAgY2FzZSAnc2hpcG1lbnQnOiByZXR1cm4gJ2Fzc2V0cy9pbWFnZXMvaWNvLWVudmlvLnBuZyc7XG4gICAgICAgICAgICBjYXNlICdzdWJ0b3RhbCc6IHJldHVybiAnYXNzZXRzL2ltYWdlcy9wcm9kdWN0cy5wbmcnO1xuICAgICAgICAgICAgY2FzZSAndG90YWwnOiByZXR1cm4gJ2Fzc2V0cy9pbWFnZXMvaWNvLWNhcnJpdG8ucG5nJztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAnYXNzZXRzL2ltYWdlcy9pY28tY2Fycml0by5wbmcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZVN0ZXBzID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnN0ZXBzID0gW107XG4gICAgICAgIC8vRWwgcGFzbyBkZSBlbGVnaXIgZGlyZWNjacOzbiBzaWVtcHJlIGVzdGFcbiAgICAgICAgdGhpcy5zdGVwcy5wdXNoKHsgbGFiZWw6ICdiaWxsaW5nLWRldGFpbHMnLCBuYW1lOiAnYWRkcmVzcycgfSlcbiAgICAgICAgLy9FbCBwYXNvIGRlIGVsZWdpciBtZXRvZG8gZGUgZW52aW9cbiAgICAgICAgdGhpcy5jaGFubmVsPy5pc1NraXBwaW5nU2hpcHBpbmdTdGVwQWxsb3dlZCA/IG51bGwgOiB0aGlzLnN0ZXBzLnB1c2goeyBsYWJlbDogJ3NoaXBtZW50LW1ldGhvZCcsIG5hbWU6ICdzaGlwbWVudCcgfSlcbiAgICAgICAgLy9FbCBwYXNvIGRlIGVsZWdpciBtZXRvZG8gZGUgcGFnb1xuICAgICAgICB0aGlzLmNoYW5uZWw/LmlzU2tpcHBpbmdQYXltZW50U3RlcEFsbG93ZWQgPyBudWxsIDogdGhpcy5zdGVwcy5wdXNoKHsgbGFiZWw6ICdwYXltZW50JywgbmFtZTogJ3BheW1lbnQnIH0pXG4gICAgICAgIHRoaXMuc3RlcHMgPSB0aGlzLnN0ZXBzLm1hcCgoc3RlcCwgaW5kZXgpID0+ICh7IC4uLnN0ZXAsIHN0ZXA6IGluZGV4ICsgMSB9KSk7XG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5zdGVwcylcbiAgICAgICAgaWYgKHRoaXMuc3RlcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TZWN0aW9ucyA9IFt0aGlzLnN0ZXBzWzBdLm5hbWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RlcEVuYWJsZWQgPSAoc3RlcE51bWJlcjogbnVtYmVyKSA9PiB0aGlzLnN0ZXBzLmZpbmQoc3RlcCA9PiBzdGVwLnN0ZXAgPT0gc3RlcE51bWJlcikgPyB0cnVlIDogZmFsc2VcblxuICAgIGdldENsYXNzVG9TdGVwcGVyID0gKGluZGV4OiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgICBpZiAoaW5kZXggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICdsaW5lYSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0ZXBzW2luZGV4ICsgMV0gPyAndGV4dC1jZW50ZXInIDogJ3RleHQtZW5kJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNMZWdhY3lDaGVja291dCA9ICgpID0+IHRoaXMuY2hlY2tvdXRWaWV3ICE9PSAnc2luZ2xlJztcblxuICAgIGdldFNpbmdsZVN0ZXBUaXRsZSA9IChzdGVwOiBTdGVwSSAmIHsgbGFiZWw/OiBzdHJpbmcgfSkgPT5cbiAgICAgICAgc3RlcD8ubmFtZSA9PT0gJ2FkZHJlc3MnID8gJ2FkZHJlc3Mtc2VsZWN0aW9uJyA6IHN0ZXA/LmxhYmVsO1xuXG4gICAgZ2V0U2luZ2xlU3VtbWFyeUxhYmVsID0gKHN0ZXA6IFN0ZXBJICYgeyBsYWJlbD86IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIGlmIChzdGVwPy5uYW1lID09PSAnYWRkcmVzcycpIHJldHVybiB0aGlzLmdldEFkZHJlc3NTdW1tYXJ5TGFiZWwoKTtcbiAgICAgICAgaWYgKHN0ZXA/Lm5hbWUgPT09ICdzaGlwbWVudCcpIHJldHVybiB0aGlzLnNoaXBtZW50U3VtbWFyeT8ubGFiZWwgfHwgJyc7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBnZXRTaW5nbGVTdW1tYXJ5VmFsdWUgPSAoc3RlcDogU3RlcEkgJiB7IGxhYmVsPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgaWYgKHN0ZXA/Lm5hbWUgPT09ICdzaGlwbWVudCcpIHJldHVybiB0aGlzLnNoaXBtZW50U3VtbWFyeT8uZGV0YWlsIHx8ICcnO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGVwU3VtbWFyeShzdGVwPy5uYW1lKTtcbiAgICB9XG5cbiAgICBpc1N0ZXBFbmFibGVkID0gKHN0ZXBOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnN0ZXBzLmZpbmRJbmRleChzdGVwID0+IHN0ZXAubmFtZSA9PT0gc3RlcE5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggPD0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0VmlldyA9PT0gJ3NpbmdsZScgJiYgc3RlcE5hbWUgPT09ICdwYXltZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNTdGVwUmVhZHkoJ2FkZHJlc3MnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2U3RlcCA9IHRoaXMuc3RlcHNbaW5kZXggLSAxXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTdGVwUmVhZHkocHJldlN0ZXAubmFtZSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlU2VjdGlvbiA9IChzdGVwTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0ZXBFbmFibGVkKHN0ZXBOYW1lKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMub3BlblNlY3Rpb25zLmluZGV4T2Yoc3RlcE5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGVwUmVhZHkoc3RlcE5hbWUpICYmIHRoaXMuaXNTdGVwRGlydHkoc3RlcE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xvc2VTdGVwTmFtZSA9IHN0ZXBOYW1lO1xuICAgICAgICAgICAgICAgIHRoaXMub3BlblVuc2F2ZWRDaGFuZ2VzTW9kYWwodGhpcy51bnNhdmVkQ2hhbmdlc01vZGFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wZW5TZWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuU2VjdGlvbnMucHVzaChzdGVwTmFtZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1N0ZXBSZWFkeShzdGVwTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hbnVhbGx5T3BlbmVkU3RlcHMuYWRkKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9TZWN0aW9uKHN0ZXBOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdvVG9OZXh0U2VjdGlvbiA9IChzdGVwTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zdGVwcy5maW5kSW5kZXgoc3RlcCA9PiBzdGVwLm5hbWUgPT09IHN0ZXBOYW1lKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSB8fCAhdGhpcy5zdGVwc1tpbmRleCArIDFdKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5leHROYW1lID0gdGhpcy5zdGVwc1tpbmRleCArIDFdLm5hbWU7XG4gICAgICAgIHRoaXMub3BlblNlY3Rpb25zID0gdGhpcy5vcGVuU2VjdGlvbnMuZmlsdGVyKG5hbWUgPT4gbmFtZSAhPT0gc3RlcE5hbWUpO1xuICAgICAgICBpZiAoIXRoaXMub3BlblNlY3Rpb25zLmluY2x1ZGVzKG5leHROYW1lKSkgdGhpcy5vcGVuU2VjdGlvbnMucHVzaChuZXh0TmFtZSk7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9TZWN0aW9uKG5leHROYW1lKTtcbiAgICB9XG5cbiAgICBnb1RvTmV4dEZyb21BZGRyZXNzID0gKCkgPT4gdGhpcy5nb1RvTmV4dFNlY3Rpb24oJ2FkZHJlc3MnKTtcblxuICAgIGlzU2VjdGlvbk9wZW4gPSAoc3RlcE5hbWU6IHN0cmluZykgPT4gdGhpcy5vcGVuU2VjdGlvbnMuaW5jbHVkZXMoc3RlcE5hbWUpO1xuXG4gICAgZ2V0U3VtbWFyeUxhYmVsID0gKHR5cGU6IENoZWNrb3V0RGF0YVsndHlwZSddLCBpdGVtPzogQ2hlY2tvdXREYXRhKSA9PiB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAncHJvZHVjdHNCZWZvcmVEaXNjb3VudHMnOiByZXR1cm4gJ3Byb2R1Y3RzLWJlZm9yZS1kaXNjb3VudHMnO1xuICAgICAgICAgICAgY2FzZSAnc3VidG90YWwnOiByZXR1cm4gJ3N1YnRvdGFsJztcbiAgICAgICAgICAgIGNhc2UgJ2Rpc2NvdW50JzogcmV0dXJuICdkaXNjb3VudCc7XG4gICAgICAgICAgICBjYXNlICdwYXltZW50TWV0aG9kQWRqdXN0bWVudCc6IHJldHVybiAoaXRlbT8uYW1vdW50ID8/IDApIDwgMCA/ICdwYXltZW50LW1ldGhvZC1kaXNjb3VudCcgOiAncGF5bWVudC1tZXRob2Qtc3VyY2hhcmdlJztcbiAgICAgICAgICAgIGNhc2UgJ2NvdXBvbic6IHJldHVybiAnY291cG9uJztcbiAgICAgICAgICAgIGNhc2UgJ2xpbmVEaXNjb3VudCc6IHJldHVybiAnbGluZS1kaXNjb3VudHMnO1xuICAgICAgICAgICAgY2FzZSAnc2hpcG1lbnQnOiByZXR1cm4gJ3NoaXBtZW50JztcbiAgICAgICAgICAgIGNhc2UgJ3RheGVzJzpcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnRheGVzSW5jbHVkZWRJblRvdGFsID09PSB0cnVlKSByZXR1cm4gJ3RheGVzLWluY2x1ZGVkLWluLXRvdGFsJztcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnRheGVzSW5jbHVkZWRJblRvdGFsID09PSBmYWxzZSkgcmV0dXJuICd0YXhlcyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1RheExlZ2VuZCA/ICduYXRpb25hbC10YXhlcycgOiAndGF4ZXMnO1xuICAgICAgICAgICAgY2FzZSAnY2xpZW50VGF4ZXMnOiByZXR1cm4gJ2NsaWVudFRheGVzJztcbiAgICAgICAgICAgIGNhc2UgJ3RvdGFsJzogcmV0dXJuICd0b3RhbCc7XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFN1bW1hcnlEYXRhID0gKGRhdGE6IENoZWNrb3V0RGF0YVtdKSA9PiB7XG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dFZpZXcgIT09ICdzaW5nbGUnKSByZXR1cm4gZGF0YTtcbiAgICAgICAgbGV0IHN1bW1hcnlEYXRhID0gZGF0YTtcbiAgICAgICAgY29uc3QgaGFzU2hpcG1lbnQgPSBzdW1tYXJ5RGF0YS5zb21lKGl0ZW0gPT4gaXRlbS50eXBlID09PSAnc2hpcG1lbnQnKTtcbiAgICAgICAgaWYgKCFoYXNTaGlwbWVudCAmJiB0aGlzLmlzU3RlcFJlYWR5KCdzaGlwbWVudCcpKSB7XG4gICAgICAgICAgICBjb25zdCBvcmRlclRvdGFscyA9IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldE9yZGVyKCk/LnRvdGFscztcbiAgICAgICAgICAgIGNvbnN0IHNoaXBtZW50QW1vdW50ID0gdGhpcy5zaGlwcGluZ1ByaWNlRGlzcGxheS5ub3JtYWxpemVQcmljZVZhbHVlKG9yZGVyVG90YWxzPy5zaGlwcGluZyk7XG4gICAgICAgICAgICBpZiAoc2hpcG1lbnRBbW91bnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoaXBtZW50SXRlbTogQ2hlY2tvdXREYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2hpcG1lbnQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc2hpcG1lbnQnLFxuICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IHNoaXBtZW50QW1vdW50XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbEluZGV4ID0gc3VtbWFyeURhdGEuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS50eXBlID09PSAndG90YWwnKTtcbiAgICAgICAgICAgICAgICBpZiAodG90YWxJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeURhdGEgPSBbLi4uc3VtbWFyeURhdGEsIHNoaXBtZW50SXRlbV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYHRvdGFsYCB5YSBlcyBlbCBpbXBvcnRlIGZpbmFsIGluZm9ybWFkbyBwb3IgYmFja2VuZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gU8OzbG8gc2UgaW5jb3Jwb3JhIGVsIGVudsOtbyBmYWx0YW50ZSwgc2luIHJlY29uc3RydWlyIG5pXG4gICAgICAgICAgICAgICAgICAgIC8vIG1vZGlmaWNhciBlc2UgdG90YWwuXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnlEYXRhID0gWy4uLnN1bW1hcnlEYXRhLnNsaWNlKDAsIHRvdGFsSW5kZXgpLCBzaGlwbWVudEl0ZW0sIC4uLnN1bW1hcnlEYXRhLnNsaWNlKHRvdGFsSW5kZXgpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VtbWFyeURhdGEgPSB0aGlzLmFnZ3JlZ2F0ZURpc2NvdW50cyhzdW1tYXJ5RGF0YSlcbiAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGUgIT09ICdwcm9kdWN0c0JlZm9yZURpc2NvdW50cycgJiYgaXRlbS50eXBlICE9PSAnbGluZURpc2NvdW50Jyk7XG5cbiAgICAgICAgY29uc3QgaW5jbHVkZWRUYXhlcyA9IHN1bW1hcnlEYXRhLmZpbHRlcihpdGVtID0+XG4gICAgICAgICAgICBpdGVtLnR5cGUgPT09ICd0YXhlcycgJiYgaXRlbS50YXhlc0luY2x1ZGVkSW5Ub3RhbCA9PT0gdHJ1ZVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghaW5jbHVkZWRUYXhlcy5sZW5ndGgpIHJldHVybiBzdW1tYXJ5RGF0YTtcblxuICAgICAgICBjb25zdCB3aXRob3V0SW5jbHVkZWRUYXhlcyA9IHN1bW1hcnlEYXRhLmZpbHRlcihpdGVtID0+XG4gICAgICAgICAgICAhKGl0ZW0udHlwZSA9PT0gJ3RheGVzJyAmJiBpdGVtLnRheGVzSW5jbHVkZWRJblRvdGFsID09PSB0cnVlKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0b3RhbEluZGV4ID0gd2l0aG91dEluY2x1ZGVkVGF4ZXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS50eXBlID09PSAndG90YWwnKTtcblxuICAgICAgICBpZiAodG90YWxJbmRleCA9PT0gLTEpIHJldHVybiBbLi4ud2l0aG91dEluY2x1ZGVkVGF4ZXMsIC4uLmluY2x1ZGVkVGF4ZXNdO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi53aXRob3V0SW5jbHVkZWRUYXhlcy5zbGljZSgwLCB0b3RhbEluZGV4ICsgMSksXG4gICAgICAgICAgICAuLi5pbmNsdWRlZFRheGVzLFxuICAgICAgICAgICAgLi4ud2l0aG91dEluY2x1ZGVkVGF4ZXMuc2xpY2UodG90YWxJbmRleCArIDEpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZ2V0U3VtbWFyeUFtb3VudFZpZXcgPSAoaXRlbTogQ2hlY2tvdXREYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU2hpcG1lbnRBbW91bnQgPSBpdGVtPy50eXBlID09PSAnc2hpcG1lbnQnID8gdGhpcy5nZXRTaGlwbWVudE9yaWdpbmFsQW1vdW50KCkgOiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5zaGlwcGluZ1ByaWNlRGlzcGxheS5idWlsZFZpZXdNb2RlbChpdGVtPy5hbW91bnQsIG9yaWdpbmFsU2hpcG1lbnRBbW91bnQpO1xuICAgIH1cblxuICAgIGdldFRvdGFsQW1vdW50ID0gKGRhdGE6IENoZWNrb3V0RGF0YVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlEYXRhID0gdGhpcy5nZXRTdW1tYXJ5RGF0YShkYXRhKTtcbiAgICAgICAgaWYgKCFzdW1tYXJ5RGF0YSB8fCAhc3VtbWFyeURhdGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtID0gc3VtbWFyeURhdGEuZmluZChpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ3RvdGFsJyk7XG4gICAgICAgIHJldHVybiB0b3RhbEl0ZW0gPyB0b3RhbEl0ZW0uYW1vdW50IDogbnVsbDtcbiAgICB9XG5cbiAgICBzaG91bGRTaG93U3VtbWFyeUl0ZW0gPSAoaXRlbTogQ2hlY2tvdXREYXRhKSA9PiB7XG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSAncHJvZHVjdHNCZWZvcmVEaXNjb3VudHMnIHx8IGl0ZW0udHlwZSA9PT0gJ2xpbmVEaXNjb3VudCcpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKChpdGVtLnR5cGUgPT09ICdkaXNjb3VudCcgfHwgaXRlbS50eXBlID09PSAnY291cG9uJykgJiYgaXRlbS5hbW91bnQgPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoKGl0ZW0udHlwZSA9PT0gJ2Rpc2NvdW50JyB8fCBpdGVtLnR5cGUgPT09ICdjb3Vwb24nKSAmJiB0aGlzLmhpZGVEaXNjb3VudHMpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3BheW1lbnRNZXRob2RBZGp1c3RtZW50JyAmJiAoaXRlbS5hbW91bnQgPT09IDAgfHwgaXRlbS5hbW91bnQgPT0gbnVsbCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3RheGVzJyAmJiAodGhpcy5oaWRlVGF4ZXMgfHwgaXRlbS5hbW91bnQgPT0gMCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2NsaWVudFRheGVzJyAmJiAodGhpcy5oaWRlVGF4ZXMgfHwgaXRlbS5hbW91bnQgPT0gMCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkSGlkZVN1bW1hcnlTdWJ0b3RhbChpdGVtKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzU3VtbWFyeUxhYmVsID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGVwRGF0YTogYW55ID0gdGhpcy5jaGVja291dFNlcnZpY2UuZ2V0U3RlcERhdGEoJ2FkZHJlc3MnIGFzIGFueSk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBzdGVwRGF0YT8uc2hpcHBpbmdBZGRyZXNzIHx8IHN0ZXBEYXRhPy5zZWxlY3RlZD8uc2hpcHBpbmdBZGRyZXNzO1xuICAgICAgICBjb25zdCBjb250YWN0ID0gYWRkcmVzcz8uYWRkcmVzc0NvbnRhY3QgfHwgYWRkcmVzcz8uY29udGFjdCB8fCBhZGRyZXNzIHx8IHt9O1xuICAgICAgICByZXR1cm4gW2NvbnRhY3QuZmlyc3ROYW1lLCBjb250YWN0Lmxhc3ROYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIH1cblxuICAgIGdldFN0ZXBTdW1tYXJ5ID0gKHN0ZXBOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RlcERhdGE6IGFueSA9IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldFN0ZXBEYXRhKHN0ZXBOYW1lIGFzIGFueSk7XG4gICAgICAgIGlmICghc3RlcERhdGEpIHJldHVybiAnJztcbiAgICAgICAgaWYgKHN0ZXBOYW1lID09PSAnYWRkcmVzcycpIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3MgPSBzdGVwRGF0YS5zaGlwcGluZ0FkZHJlc3MgfHwgc3RlcERhdGE/LnNlbGVjdGVkPy5zaGlwcGluZ0FkZHJlc3MgfHwgc3RlcERhdGE/LnNoaXBwaW5nQWRkcmVzcztcbiAgICAgICAgICAgIGlmICghYWRkcmVzcykgcmV0dXJuICcnO1xuICAgICAgICAgICAgY29uc3QgbWFpbiA9IFthZGRyZXNzLnN0cmVldCwgYWRkcmVzcy5jaXR5XS5maWx0ZXIoQm9vbGVhbikuam9pbignIMK3ICcpO1xuICAgICAgICAgICAgY29uc3QgcmVnaW9uID0gW2FkZHJlc3MucHJvdmluY2VDb2RlIHx8IGFkZHJlc3MucHJvdmluY2UsIGFkZHJlc3MuY291bnRyeUNvZGUgfHwgYWRkcmVzcy5jb3VudHJ5XVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgIHJldHVybiBbbWFpbiwgcmVnaW9uXS5maWx0ZXIoQm9vbGVhbikuam9pbignIOKAlCAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcE5hbWUgPT09ICdzaGlwbWVudCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZExhYmVsID0gc3RlcERhdGEubWV0aG9kPy5uYW1lIHx8IHN0ZXBEYXRhLm1ldGhvZF9uYW1lIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgY29udHJhY3RMYWJlbCA9IHN0ZXBEYXRhLmNvbnRyYWN0Py5uYW1lIHx8IHN0ZXBEYXRhLmNvbnRyYWN0X25hbWUgfHwgc3RlcERhdGEubmFtZSB8fCBzdGVwRGF0YS5jb250cmFjdCB8fCAnJztcbiAgICAgICAgICAgIHJldHVybiBbbWV0aG9kTGFiZWwsIGNvbnRyYWN0TGFiZWxdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZXBOYW1lID09PSAncGF5bWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwRGF0YS5uYW1lIHx8IHN0ZXBEYXRhLmNvZGUgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHNldFNoaXBtZW50U3VtbWFyeSA9IChzdW1tYXJ5OiB7IGxhYmVsPzogc3RyaW5nOyBkZXRhaWw/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICBjb25zdCBoYXNMYWJlbCA9IEJvb2xlYW4oc3VtbWFyeT8ubGFiZWwpO1xuICAgICAgICBjb25zdCBoYXNEZXRhaWwgPSBCb29sZWFuKHN1bW1hcnk/LmRldGFpbCk7XG4gICAgICAgIHRoaXMuc2hpcG1lbnRTdW1tYXJ5ID0gaGFzTGFiZWwgfHwgaGFzRGV0YWlsID8gc3VtbWFyeSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTaGlwbWVudE9yaWdpbmFsQW1vdW50ID0gKCk6IG51bWJlciB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCBzaGlwbWVudFN0ZXBEYXRhOiBhbnkgPSB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRTdGVwRGF0YSgnc2hpcG1lbnQnIGFzIGFueSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNoaXBwaW5nUHJpY2VEaXNwbGF5Lm5vcm1hbGl6ZVByaWNlVmFsdWUoXG4gICAgICAgICAgICBzaGlwbWVudFN0ZXBEYXRhPy5vcmlnaW5hbFByaWNlID8/XG4gICAgICAgICAgICBzaGlwbWVudFN0ZXBEYXRhPy5jb250cmFjdD8ub3JpZ2luYWxQcmljZSA/P1xuICAgICAgICAgICAgc2hpcG1lbnRTdGVwRGF0YT8uc2VsZWN0ZWQ/LmNvbnRyYWN0Py5vcmlnaW5hbFByaWNlID8/XG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZ2dyZWdhdGVEaXNjb3VudHMoZGF0YTogQ2hlY2tvdXREYXRhW10pIHtcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gZGF0YVxuICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ2Rpc2NvdW50JylcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICsgKGN1cnIuYW1vdW50IHx8IDApLCAwKTtcbiAgICAgICAgY29uc3QgY291cG9uVG90YWwgPSBkYXRhXG4gICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS50eXBlID09PSAnY291cG9uJylcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICsgKGN1cnIuYW1vdW50IHx8IDApLCAwKTtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBkYXRhLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSAhPT0gJ2Rpc2NvdW50JyAmJiBpdGVtLnR5cGUgIT09ICdjb3Vwb24nKTtcblxuICAgICAgICBpZiAodGhpcy5oaWRlRGlzY291bnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRyYXM6IENoZWNrb3V0RGF0YVtdID0gW107XG4gICAgICAgIGlmIChkaXNjb3VudFRvdGFsICE9PSAwKSB7XG4gICAgICAgICAgICBleHRyYXMucHVzaCh7IHR5cGU6ICdkaXNjb3VudCcsIG5hbWU6ICdkaXNjb3VudCcsIGFtb3VudDogZGlzY291bnRUb3RhbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY291cG9uVG90YWwgIT09IDApIHtcbiAgICAgICAgICAgIGV4dHJhcy5wdXNoKHsgdHlwZTogJ2NvdXBvbicsIG5hbWU6ICdjb3Vwb24nLCBhbW91bnQ6IGNvdXBvblRvdGFsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXh0cmFzLmxlbmd0aCkgcmV0dXJuIGZpbHRlcmVkO1xuXG4gICAgICAgIGNvbnN0IHN1YnRvdGFsSW5kZXggPSBmaWx0ZXJlZC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnR5cGUgPT09ICdzdWJ0b3RhbCcpO1xuICAgICAgICBpZiAoc3VidG90YWxJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5maWx0ZXJlZF07XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKHN1YnRvdGFsSW5kZXggKyAxLCAwLCAuLi5leHRyYXMpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBkYXRhLmZpbmRJbmRleChpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ2Rpc2NvdW50JyB8fCBpdGVtLnR5cGUgPT09ICdjb3Vwb24nKTtcbiAgICAgICAgaWYgKGZpcnN0SW5kZXggPT09IC0xKSByZXR1cm4gWy4uLmZpbHRlcmVkLCAuLi5leHRyYXNdO1xuICAgICAgICBjb25zdCBpbnNlcnRBdCA9IGRhdGFcbiAgICAgICAgICAgIC5zbGljZSgwLCBmaXJzdEluZGV4KVxuICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSAhPT0gJ2Rpc2NvdW50JyAmJiBpdGVtLnR5cGUgIT09ICdjb3Vwb24nKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5maWx0ZXJlZF07XG4gICAgICAgIHJlc3VsdC5zcGxpY2UoaW5zZXJ0QXQsIDAsIC4uLmV4dHJhcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRIaWRlU3VtbWFyeVN1YnRvdGFsKGl0ZW06IENoZWNrb3V0RGF0YSkge1xuICAgICAgICBpZiAoaXRlbT8udHlwZSAhPT0gJ3N1YnRvdGFsJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5sYXN0QXNzb2NpYXRlZERhdGE7XG4gICAgICAgIGlmICghZGF0YT8ubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlEYXRhID0gdGhpcy5nZXRTdW1tYXJ5RGF0YShkYXRhKTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtID0gc3VtbWFyeURhdGEuZmluZChkYXRhSXRlbSA9PiBkYXRhSXRlbS50eXBlID09PSAndG90YWwnKTtcbiAgICAgICAgcmV0dXJuICEhdG90YWxJdGVtICYmIGl0ZW0uYW1vdW50ID09PSB0b3RhbEl0ZW0uYW1vdW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsVG9TZWN0aW9uKHN0ZXBOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb290ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoIXJvb3QpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSByb290LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXN0ZXA9XFxcIiR7c3RlcE5hbWV9XFxcIl1gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghc2VjdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgdG9wID0gc2VjdGlvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogTWF0aC5tYXgoMCwgdG9wIC0gb2Zmc2V0KSwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY3JvbGxUb1RvcE9uRW50ZXIoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBsZWZ0OiAwLCBiZWhhdmlvcjogJ2F1dG8nIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwU3VtbWFyeU9ic2VydmVyKCkge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dFZpZXcgIT09ICdzaW5nbGUnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFyb290KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGZpbmlzaEJ0biA9IHJvb3QucXVlcnlTZWxlY3RvcignI2NoZWNrb3V0RmluaXNoQnRuJyk7XG4gICAgICAgIGlmICghZmluaXNoQnRuKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zdW1tYXJ5T2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcbiAgICAgICAgICAgIHRoaXMuaGlkZU1vYmlsZVN1bW1hcnlCYXIgPSAhIWVudHJ5ICYmIGVudHJ5LmlzSW50ZXJzZWN0aW5nO1xuICAgICAgICB9LCB7IHJvb3RNYXJnaW46ICcwcHggMHB4IC0xMjBweCAwcHgnLCB0aHJlc2hvbGQ6IDAgfSk7XG5cbiAgICAgICAgdGhpcy5zdW1tYXJ5T2JzZXJ2ZXIub2JzZXJ2ZShmaW5pc2hCdG4pO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICAgIGV2YWx1YXRlTW9iaWxlQmFyVmlzaWJpbGl0eSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRWaWV3ICE9PSAnc2luZ2xlJykgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuZmluaXNoQnV0dG9uRWwpIHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQnV0dG9uRWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY2hlY2tvdXRGaW5pc2hCdG4nKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5maW5pc2hCdXR0b25FbCkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmZpbmlzaEJ1dHRvbkVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCAwO1xuICAgICAgICB0aGlzLmhpZGVNb2JpbGVTdW1tYXJ5QmFyID0gcmVjdC50b3AgPCAodmlld3BvcnRIZWlnaHQgLSA4MCk7XG4gICAgfVxuXG4gICAgYXJlQWxsU3RlcHNSZWFkeSA9IChzdGVwczogeyBpc1JlYWR5OiAoKSA9PiBib29sZWFuOyBuYW1lPzogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICBpZiAoIXN0ZXBzIHx8ICFzdGVwcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHN0ZXBzLmV2ZXJ5KHN0ZXAgPT4ge1xuICAgICAgICAgICAgaWYgKCFzdGVwLmlzUmVhZHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFzdGVwLm5hbWUpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzU3RlcERpcnR5KHN0ZXAubmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNob3VsZEhpZGVGaW5pc2hCdXR0b24gPSAoc3RlcHM6IHsgaXNSZWFkeTogKCkgPT4gYm9vbGVhbiB9W10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRWaWV3ICE9PSAnc2luZ2xlJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMuYXJlQWxsU3RlcHNSZWFkeShzdGVwcykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcGF5bWVudERhdGE6IGFueSA9IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldFN0ZXBEYXRhKCdwYXltZW50JyBhcyBhbnkpO1xuICAgICAgICByZXR1cm4gISFwYXltZW50RGF0YT8uYXV0b0NvbXBsZXRlO1xuICAgIH1cblxuICAgIG9wZW5VbnNhdmVkQ2hhbmdlc01vZGFsID0gKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2xvc2VTdGVwTmFtZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLm1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyh0ZW1wbGF0ZSwge1xuICAgICAgICAgICAgY2xhc3M6ICdtb2RhbC1kaWFsb2ctY2VudGVyZWQgY2hlY2tvdXQtdW5zYXZlZC1tb2RhbCcsXG4gICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXG4gICAgICAgICAgICBrZXlib2FyZDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2FuY2VsVW5zYXZlZENsb3NlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdDbG9zZVN0ZXBOYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb2RhbFJlZj8uaGlkZSgpO1xuICAgIH1cblxuICAgIGNvbmZpcm1VbnNhdmVkRGlzY2FyZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDbG9zZVN0ZXBOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsUmVmPy5oaWRlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RlcE5hbWUgPSB0aGlzLnBlbmRpbmdDbG9zZVN0ZXBOYW1lO1xuICAgICAgICB0aGlzLnBlbmRpbmdDbG9zZVN0ZXBOYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5kaXNjYXJkU3RlcENoYW5nZXMoc3RlcE5hbWUpO1xuICAgICAgICB0aGlzLm9wZW5TZWN0aW9ucyA9IHRoaXMub3BlblNlY3Rpb25zLmZpbHRlcihuYW1lID0+IG5hbWUgIT09IHN0ZXBOYW1lKTtcbiAgICAgICAgdGhpcy5tb2RhbFJlZj8uaGlkZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzY2FyZFN0ZXBDaGFuZ2VzKHN0ZXBOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHN0ZXBOYW1lID09PSAnYWRkcmVzcycpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFmb3JtID0gdGhpcy5kYXRhZm9ybUNvbXBvbmVudHM/LmZpcnN0O1xuICAgICAgICAgICAgaWYgKGRhdGFmb3JtKSB7XG4gICAgICAgICAgICAgICAgZGF0YWZvcm0uZGlzY2FyZENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RlcERpcnR5TWFwLnNldChzdGVwTmFtZSwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGVwTmFtZSA9PT0gJ3BheW1lbnQnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXltZW50ID0gdGhpcy5wYXltZW50Q29tcG9uZW50cz8uZmlyc3Q7XG4gICAgICAgICAgICBpZiAocGF5bWVudCkge1xuICAgICAgICAgICAgICAgIHBheW1lbnQuZGlzY2FyZENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RlcERpcnR5TWFwLnNldChzdGVwTmFtZSwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcERpcnR5TWFwLnNldChzdGVwTmFtZSwgZmFsc2UpO1xuICAgIH1cbn1cbiJdfQ==