ng-easycommerce-v18 0.4.2 → 0.4.3-beta.1

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 (203) hide show
  1. package/README.md +132 -121
  2. package/assets/decidirFormEc.html +514 -514
  3. package/assets/ec-i18n/ct.json +286 -282
  4. package/assets/ec-i18n/en.json +12 -1
  5. package/assets/ec-i18n/es.json +445 -434
  6. package/assets/ec-i18n/fr.json +4 -0
  7. package/assets/ec-i18n/gl.json +286 -282
  8. package/assets/ec-i18n/pr.json +286 -282
  9. package/assets/images/cards-occasional.svg +21 -21
  10. package/assets/recaptcha/recaptcha-site-keys.json +3 -3
  11. package/assets/recaptcha/recaptcha-sites-prod.json +38 -38
  12. package/assets/recaptcha/recaptcha-sites.json +52 -52
  13. package/esm2022/lib/api/connection.service.mjs +1 -1
  14. package/esm2022/lib/classes/checkout/steps.mjs +1 -1
  15. package/esm2022/lib/classes/component-helper.mjs +1 -1
  16. package/esm2022/lib/classes/filters/attributes-filter.mjs +1 -1
  17. package/esm2022/lib/classes/filters/category-filter.mjs +1 -1
  18. package/esm2022/lib/classes/filters/dynamics-filter.mjs +1 -1
  19. package/esm2022/lib/classes/filters/filter-factory.mjs +1 -1
  20. package/esm2022/lib/classes/filters/filter.mjs +1 -1
  21. package/esm2022/lib/classes/filters/index.mjs +1 -1
  22. package/esm2022/lib/classes/filters/price_range-filter.mjs +1 -1
  23. package/esm2022/lib/classes/filters/sort-filter.mjs +1 -1
  24. package/esm2022/lib/classes/index.mjs +1 -1
  25. package/esm2022/lib/classes/user.mjs +1 -1
  26. package/esm2022/lib/constants/api.constants.service.mjs +1 -1
  27. package/esm2022/lib/constants/core.constants.service.mjs +1 -1
  28. package/esm2022/lib/constants/index.mjs +1 -1
  29. package/esm2022/lib/ec-components/abstractions-components/block-ec.component.mjs +1 -1
  30. package/esm2022/lib/ec-components/abstractions-components/index.mjs +1 -1
  31. package/esm2022/lib/ec-components/abstractions-components/menu-ec.component.mjs +1 -1
  32. package/esm2022/lib/ec-components/account-ec/account-ec.component.mjs +3 -3
  33. package/esm2022/lib/ec-components/account-ec/index.mjs +1 -1
  34. package/esm2022/lib/ec-components/account-ec/order-ec/order-ec.component.mjs +5 -9
  35. package/esm2022/lib/ec-components/account-ec/orders-list-ec/orders-list-ec.component.mjs +11 -5
  36. package/esm2022/lib/ec-components/auth-ec/auth-ec.component.mjs +3 -3
  37. package/esm2022/lib/ec-components/auth-ec/confirm-account-ec/confirm-account-ec.component.mjs +3 -3
  38. package/esm2022/lib/ec-components/auth-ec/forgot-password-ec/forgot-password-ec.component.mjs +3 -3
  39. package/esm2022/lib/ec-components/auth-ec/index.mjs +1 -1
  40. package/esm2022/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.mjs +3 -3
  41. package/esm2022/lib/ec-components/auth-ec/password-reset-ec/password-reset-ec.component.mjs +3 -3
  42. package/esm2022/lib/ec-components/auth-ec/register-form-ec/register-form-ec.component.mjs +3 -3
  43. package/esm2022/lib/ec-components/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.mjs +3 -3
  44. package/esm2022/lib/ec-components/blocks-ec/block-banner-box-ec/block-banner-box-ec.component.mjs +3 -3
  45. package/esm2022/lib/ec-components/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.mjs +3 -3
  46. package/esm2022/lib/ec-components/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.mjs +3 -3
  47. package/esm2022/lib/ec-components/blocks-ec/block-html-ec/block-html-ec.component.mjs +3 -3
  48. package/esm2022/lib/ec-components/blocks-ec/block-newsletter-ec/block-newsletter-ec.component.mjs +3 -3
  49. package/esm2022/lib/ec-components/blocks-ec/block-products-ec/block-products-ec.component.mjs +3 -3
  50. package/esm2022/lib/ec-components/blocks-ec/blocks-ec.component.mjs +3 -3
  51. package/esm2022/lib/ec-components/blocks-ec/index.mjs +1 -1
  52. package/esm2022/lib/ec-components/breadcrumb-ec/breadcrumb-ec.component.mjs +3 -3
  53. package/esm2022/lib/ec-components/cart-ec/cart-ec.component.mjs +12 -3
  54. package/esm2022/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.mjs +3 -3
  55. package/esm2022/lib/ec-components/cart-ec/index.mjs +1 -1
  56. package/esm2022/lib/ec-components/checkout-ec/checkout-ec.component.mjs +10 -3
  57. package/esm2022/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.mjs +6 -4
  58. package/esm2022/lib/ec-components/checkout-ec/dataform-ec/input-ec/input-ec.component.mjs +3 -3
  59. package/esm2022/lib/ec-components/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.mjs +5 -3
  60. package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.mjs +44 -4
  61. package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/bank-transfer-ec/bank-transfer-ec.component.mjs +3 -3
  62. package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/index.mjs +1 -1
  63. package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/mp-redirect-ec/mp-redirect-ec.component.mjs +3 -3
  64. package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/offline-ec/offline-ec.component.mjs +3 -3
  65. package/esm2022/lib/ec-components/checkout-ec/shipment-ec/shipment-ec.component.mjs +3 -3
  66. package/esm2022/lib/ec-components/checkout-ec/step-container-ec/step-container-ec.component.mjs +3 -3
  67. package/esm2022/lib/ec-components/checkout-ec/success-ec/success-ec.component.mjs +4 -3
  68. package/esm2022/lib/ec-components/collection-ec/collection-ec.component.mjs +3 -3
  69. package/esm2022/lib/ec-components/contact-ec/contact-ec.component.mjs +1 -1
  70. package/esm2022/lib/ec-components/coupon-ec/coupon-ec.component.mjs +3 -3
  71. package/esm2022/lib/ec-components/credit-account-banner-ec/credit-account-banner-ec.component.mjs +79 -0
  72. package/esm2022/lib/ec-components/faqs-ec/faqs-ec.component.mjs +3 -3
  73. package/esm2022/lib/ec-components/filters-ec/filters-ec.component.mjs +3 -3
  74. package/esm2022/lib/ec-components/filters-sort-ec/filters-sort-ec.component.mjs +3 -3
  75. package/esm2022/lib/ec-components/footer-ec/footer-ec.component.mjs +3 -3
  76. package/esm2022/lib/ec-components/header-ec/header-ec.component.mjs +27 -13
  77. package/esm2022/lib/ec-components/home-ec/home-ec.component.mjs +3 -3
  78. package/esm2022/lib/ec-components/index.mjs +2 -1
  79. package/esm2022/lib/ec-components/price-range-filter/price-range-filter.component.mjs +3 -3
  80. package/esm2022/lib/ec-components/product-detail-ec/product-detail-ec.component.mjs +1 -1
  81. package/esm2022/lib/ec-components/product-ec/product-ec.component.mjs +3 -3
  82. package/esm2022/lib/ec-components/related-products-ec/related-products-ec.component.mjs +3 -3
  83. package/esm2022/lib/ec-components/reviews-ec/reviews-ec.component.mjs +3 -3
  84. package/esm2022/lib/ec-components/reviews-form-ec/reviews-form-ec.component.mjs +3 -3
  85. package/esm2022/lib/ec-components/section-container-ec/section-container-ec.component.mjs +3 -3
  86. package/esm2022/lib/ec-components/share-ec/share-buttons-ec/index.mjs +1 -1
  87. package/esm2022/lib/ec-components/share-ec/share-buttons-ec/share-email-ec/share-email-ec.component.mjs +3 -3
  88. package/esm2022/lib/ec-components/share-ec/share-buttons-ec/share-facebook-ec/share-facebook-ec.component.mjs +3 -3
  89. package/esm2022/lib/ec-components/share-ec/share-buttons-ec/share-pinterest-ec/share-pinterest-ec.component.mjs +3 -3
  90. package/esm2022/lib/ec-components/share-ec/share-buttons-ec/share-twitter-ec/share-twitter-ec.component.mjs +3 -3
  91. package/esm2022/lib/ec-components/share-ec/share-buttons-ec/share-whatsapp-ec/share-whatsapp-ec.component.mjs +3 -3
  92. package/esm2022/lib/ec-components/share-ec/share-ec.component.mjs +3 -3
  93. package/esm2022/lib/ec-components/sidebar-ec/sidebar-ec.component.mjs +5 -7
  94. package/esm2022/lib/ec-components/stores-ec/stores-ec.component.mjs +3 -3
  95. package/esm2022/lib/ec-components/variants-ec/variants-ec.component.mjs +3 -3
  96. package/esm2022/lib/ec-components/widgets-ec/decidir-ec/decidir-ec.component.mjs +3 -3
  97. package/esm2022/lib/ec-components/widgets-ec/index.mjs +1 -1
  98. package/esm2022/lib/ec-components/widgets-ec/loading/index.mjs +1 -1
  99. package/esm2022/lib/ec-components/widgets-ec/loading/loading-full-ec/loading-full-ec.component.mjs +3 -3
  100. package/esm2022/lib/ec-components/widgets-ec/loading/loading-inline-ec/loading-inline-ec.component.mjs +3 -3
  101. package/esm2022/lib/ec-components/widgets-ec/loading/loading-section-ec/loading-section-ec.component.mjs +3 -3
  102. package/esm2022/lib/ec-components/widgets-ec/magnizoom-ec/magnizoom-ec.component.mjs +3 -3
  103. package/esm2022/lib/ec-components/widgets-ec/price-ec/price-ec.component.mjs +5 -11
  104. package/esm2022/lib/ec-components/widgets-ec/rating-ec/rating-ec.component.mjs +3 -3
  105. package/esm2022/lib/ec-components/widgets-ec/re-captcha-ec/re-captcha-ec.component.mjs +3 -3
  106. package/esm2022/lib/ec-components/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.mjs +3 -3
  107. package/esm2022/lib/ec-directive/index.mjs +1 -1
  108. package/esm2022/lib/ec-directive/product-off.directive.mjs +1 -1
  109. package/esm2022/lib/ec-directive/product-stock.directive.mjs +1 -1
  110. package/esm2022/lib/ec-guards/auth.guard.mjs +1 -1
  111. package/esm2022/lib/ec-pipe/ec-currency-symbol.pipe.mjs +1 -1
  112. package/esm2022/lib/ec-pipe/ec-safe-html.pipe.mjs +1 -1
  113. package/esm2022/lib/ec-pipe/index.mjs +1 -1
  114. package/esm2022/lib/ec-services/addressing.service.mjs +10 -1
  115. package/esm2022/lib/ec-services/analytics/analytics.service.mjs +1 -1
  116. package/esm2022/lib/ec-services/analytics/doppler.service.mjs +1 -1
  117. package/esm2022/lib/ec-services/analytics/facebook-pixel.service.mjs +1 -1
  118. package/esm2022/lib/ec-services/analytics/google-analytics.service.mjs +1 -1
  119. package/esm2022/lib/ec-services/analytics/gtm.service.mjs +1 -1
  120. package/esm2022/lib/ec-services/analytics/index.mjs +1 -1
  121. package/esm2022/lib/ec-services/analytics/metricool-pixel.service.mjs +11 -11
  122. package/esm2022/lib/ec-services/auth.service.mjs +1 -1
  123. package/esm2022/lib/ec-services/auth.storage.service.mjs +1 -1
  124. package/esm2022/lib/ec-services/base-api.service.mjs +1 -1
  125. package/esm2022/lib/ec-services/blocks-repository.service.mjs +1 -1
  126. package/esm2022/lib/ec-services/blocks.service.mjs +1 -1
  127. package/esm2022/lib/ec-services/cart.service.mjs +42 -7
  128. package/esm2022/lib/ec-services/channel.service.mjs +1 -2
  129. package/esm2022/lib/ec-services/checkout.service.mjs +1 -1
  130. package/esm2022/lib/ec-services/currency.service.mjs +1 -1
  131. package/esm2022/lib/ec-services/filters.service.mjs +1 -1
  132. package/esm2022/lib/ec-services/form.service.mjs +1 -1
  133. package/esm2022/lib/ec-services/index.mjs +2 -1
  134. package/esm2022/lib/ec-services/local-storage.service.mjs +1 -1
  135. package/esm2022/lib/ec-services/ngx-local-storage.service.mjs +1 -1
  136. package/esm2022/lib/ec-services/options.service.mjs +1 -1
  137. package/esm2022/lib/ec-services/order-utility.service.mjs +1 -1
  138. package/esm2022/lib/ec-services/orders.service.mjs +1 -1
  139. package/esm2022/lib/ec-services/pagination.service.mjs +1 -1
  140. package/esm2022/lib/ec-services/parameters.service.mjs +1 -1
  141. package/esm2022/lib/ec-services/payment.service.mjs +1 -1
  142. package/esm2022/lib/ec-services/price-visibility.service.mjs +40 -0
  143. package/esm2022/lib/ec-services/product-detail.service.mjs +45 -7
  144. package/esm2022/lib/ec-services/products.service.mjs +1 -1
  145. package/esm2022/lib/ec-services/re-captcha.service.mjs +1 -1
  146. package/esm2022/lib/ec-services/reviews.service.mjs +1 -1
  147. package/esm2022/lib/ec-services/runtime-config.service.mjs +1 -1
  148. package/esm2022/lib/ec-services/shipment.service.mjs +1 -1
  149. package/esm2022/lib/ec-services/stores.service.mjs +1 -1
  150. package/esm2022/lib/ec-services/test.service.mjs +1 -1
  151. package/esm2022/lib/ec-services/toast.service.mjs +1 -1
  152. package/esm2022/lib/interceptors/auth.interceptor.mjs +1 -1
  153. package/esm2022/lib/interceptors/index.mjs +1 -1
  154. package/esm2022/lib/interceptors/runtime-config.interceptor.mjs +1 -1
  155. package/esm2022/lib/interfaces/analytics/event-key.mjs +1 -1
  156. package/esm2022/lib/interfaces/analytics/facebook-pixel-data.mjs +1 -1
  157. package/esm2022/lib/interfaces/analytics/gtm-config.mjs +1 -1
  158. package/esm2022/lib/interfaces/analytics/index.mjs +1 -1
  159. package/esm2022/lib/interfaces/blocks.mjs +1 -1
  160. package/esm2022/lib/interfaces/checkout.mjs +1 -1
  161. package/esm2022/lib/interfaces/connection.mjs +1 -1
  162. package/esm2022/lib/interfaces/coupon.mjs +1 -1
  163. package/esm2022/lib/interfaces/currency.mjs +1 -1
  164. package/esm2022/lib/interfaces/deserializable.mjs +1 -1
  165. package/esm2022/lib/interfaces/environment.mjs +1 -1
  166. package/esm2022/lib/interfaces/faqs.mjs +1 -1
  167. package/esm2022/lib/interfaces/filter.mjs +1 -1
  168. package/esm2022/lib/interfaces/index.mjs +1 -1
  169. package/esm2022/lib/interfaces/options.mjs +1 -1
  170. package/esm2022/lib/interfaces/pagination.mjs +1 -1
  171. package/esm2022/lib/interfaces/parameter.mjs +1 -1
  172. package/esm2022/lib/interfaces/product.mjs +1 -1
  173. package/esm2022/lib/interfaces/runtime-config.mjs +1 -1
  174. package/esm2022/lib/interfaces/step.mjs +1 -1
  175. package/esm2022/lib/interfaces/storage.mjs +1 -1
  176. package/esm2022/lib/interfaces/store.mjs +1 -1
  177. package/esm2022/lib/interfaces/types/user.type.mjs +1 -1
  178. package/esm2022/lib/providers/index.mjs +1 -1
  179. package/esm2022/lib/providers/provideEnvironment.mjs +1 -1
  180. package/esm2022/lib/providers/provideRuntimeConfig.mjs +1 -1
  181. package/esm2022/lib/stores/currency.store.mjs +1 -1
  182. package/esm2022/public-api.mjs +1 -1
  183. package/fesm2022/ng-easycommerce-v18.mjs +422 -179
  184. package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
  185. package/lib/ec-components/account-ec/order-ec/order-ec.component.d.ts +2 -2
  186. package/lib/ec-components/account-ec/orders-list-ec/orders-list-ec.component.d.ts +3 -0
  187. package/lib/ec-components/cart-ec/cart-ec.component.d.ts +4 -2
  188. package/lib/ec-components/checkout-ec/checkout-ec.component.d.ts +2 -0
  189. package/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.d.ts +1 -1
  190. package/lib/ec-components/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +2 -0
  191. package/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.d.ts +6 -0
  192. package/lib/ec-components/checkout-ec/success-ec/success-ec.component.d.ts +1 -0
  193. package/lib/ec-components/credit-account-banner-ec/credit-account-banner-ec.component.d.ts +27 -0
  194. package/lib/ec-components/header-ec/header-ec.component.d.ts +12 -4
  195. package/lib/ec-components/index.d.ts +1 -0
  196. package/lib/ec-components/sidebar-ec/sidebar-ec.component.d.ts +2 -1
  197. package/lib/ec-components/widgets-ec/price-ec/price-ec.component.d.ts +2 -4
  198. package/lib/ec-services/addressing.service.d.ts +2 -0
  199. package/lib/ec-services/cart.service.d.ts +1 -0
  200. package/lib/ec-services/index.d.ts +1 -0
  201. package/lib/ec-services/price-visibility.service.d.ts +23 -0
  202. package/lib/ec-services/product-detail.service.d.ts +3 -0
  203. package/package.json +1 -1
@@ -23,7 +23,6 @@ export class DataformEcComponent {
23
23
  _formService = inject(FormService);
24
24
  _checkoutService = inject(CheckoutService);
25
25
  _formBuilder = inject(FormBuilder);
26
- modeSelectAddress = this._addressingService.modeSelectAddress;
27
26
  cartItems = [];
28
27
  channel$ = this._channelService.channel$;
29
28
  countries$ = this._formService.getCountriesData();
@@ -73,6 +72,9 @@ export class DataformEcComponent {
73
72
  this.loadingStep$.subscribe(res => this.loadingStep = res);
74
73
  this.channel$.subscribe(res => this.channel = res);
75
74
  }
75
+ get modeSelectAddress() {
76
+ return this._addressingService.modeSelectAddress;
77
+ }
76
78
  ngOnInit() {
77
79
  this._paramsService.getParameters().subscribe(params => this.params = params);
78
80
  this._cartService.cartItems$.subscribe(items => this.cartItems = items);
@@ -295,7 +297,7 @@ export class DataformEcComponent {
295
297
  this._checkoutService.next();
296
298
  }
297
299
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataformEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
298
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DataformEcComponent, isStandalone: true, selector: "app-dataform-ec", ngImport: i0, template: "@if(channel$ | async; as channelConfig){\r\n@if(channelConfig.channelType != 'b2b' || (channelConfig.channelType == 'b2b' && isAuthenticated())){\r\n@if( modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && isAuthenticated() && this.addressBook != null){\r\n<!--Selector de modos-->\r\n<div class=\"container card p-4 mb-3\">\r\n <div class=\"row justify-content-center\">\r\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\r\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\r\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\r\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\r\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\r\n </label>\r\n @if(!getParamByChannelAndLanguage('btn_new_address_')){\r\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\">\r\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\r\n {{ 'new-address' | translate | titlecase}}\r\n </label>\r\n }\r\n @if(getParamByChannelAndLanguage('btn_new_address_'); as param){\r\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\">\r\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\r\n {{ param.value}}\r\n </label>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n\r\n@if(getMode()){\r\n@if(!require_login){\r\n<div>\r\n @if(modeSelectAddress == 'ONLY_LOAD_ADDRESS'){\r\n <div class=\"checkout-title my-2\">\r\n <h3>{{'billing-details'|translate}}</h3>\r\n </div>\r\n }\r\n <!--Formulario-->\r\n <form [formGroup]=\"checkoutForm\" (submit)=\"verifyValidate($event)\"> <!-- //this.cartService.items -->\r\n <div class=\"row mt-2\"><!--Fila 1-->\r\n\r\n @if(getTypeForm().viewForms.firstName.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <!--Si es required-->\r\n <label class=\"form-label\">{{'first-name'|translate}}\r\n @if(getTypeForm().viewForms.firstName.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <!--Input-->\r\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['firstName'].touched &&\r\n checkoutForm.controls['firstName'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\r\n </div>\r\n }\r\n <!--Error info-->\r\n @if(checkoutForm.controls['firstName'].touched &&\r\n checkoutForm.controls['firstName'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'first-name-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if(getTypeForm().viewForms.lastName.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'last-name'|translate}}\r\n @if(getTypeForm().viewForms.lastName.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['lastName'].touched &&\r\n checkoutForm.controls['lastName'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutForm.controls['lastName'].touched && checkoutForm.controls['lastName'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-2\"><!--Fila 2-->\r\n @if(getTypeForm().viewForms.phoneNumber.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'phone'|translate}}\r\n @if(getTypeForm().viewForms.phoneNumber.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\r\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['phoneNumber'].touched &&\r\n checkoutForm.controls['phoneNumber'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'phone-help1'|translate}}\r\n </span>\r\n </div>\r\n }\r\n @if(checkoutForm.controls['phoneNumber'].touched &&\r\n checkoutForm.controls['phoneNumber'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'phone-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if(getTypeForm().viewForms.email.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'email-address'|translate}}\r\n @if(getTypeForm().viewForms.email.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help1'|translate}}\r\n </span>\r\n </div>\r\n }\r\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['email']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-2\"><!--Fila 3-->\r\n @if(getTypeForm().viewForms.countryCode.enabled){\r\n @if(countries$ | async; as countries){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'country'|translate}}\r\n @if(getTypeForm().viewForms.countryCode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\r\n (change)=\"onCountrySelected($event)\">\r\n @for(country of countries; track $index){\r\n <option [value]=\"country.code\">{{ country.name }}</option>\r\n }\r\n </select>\r\n @if(checkoutForm.controls['countryCode'].touched &&\r\n checkoutForm.controls['countryCode'].errors?.['required']){\r\n <div class=\"text text-danger\">\r\n {{'country-help'|translate}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.provinceCode.enabled){\r\n @if(provinces$ | async; as provinces){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'state'|translate}}\r\n @if(getTypeForm().viewForms.provinceCode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select class=\"form-select\" name=\"provinceCode\" (change)=\"onProvincesSelected($event, provinces)\"\r\n formControlName='provinceCode'>\r\n <option value=\"\">{{'select-state'|translate}}</option>\r\n @for(province of provinces; track $index){\r\n <option [value]=\"province.code\">{{ province.name }}\r\n </option>\r\n }\r\n </select>\r\n @if(checkoutForm.controls['provinceCode'].touched &&\r\n checkoutForm.controls['provinceCode'].errors?.['required']){\r\n <div class=\"text text-danger\">\r\n {{'state-help'|translate}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.city.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'town-city'|translate}}\r\n @if(getTypeForm().viewForms.city.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\" formControlName='city'\r\n value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['city'].touched && checkoutForm.controls['city'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 4-->\r\n @if(getTypeForm().viewForms.street.enabled){\r\n <div class=\"form-group col-12 col-md-8\">\r\n <label class=\"field-label\">{{'address'|translate}}\r\n @if(getTypeForm().viewForms.street.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\r\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['maxlength']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- form direcci\u00F3n -->\r\n @if(getTypeForm().viewForms.postcode.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'postal-code'|translate}}\r\n @if(getTypeForm().viewForms.postcode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\r\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['postcode'].touched &&\r\n checkoutForm.controls['postcode'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutForm.controls['postcode'].touched && checkoutForm.controls['postcode'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 5-->\r\n @if(getTypeForm().viewForms.documentType.enabled){\r\n @if(documentTypes$ | async; as documentTypes){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'document-type'|translate}}\r\n @if(getTypeForm().viewForms.documentType.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select name=\"documentType\" class=\"form-select\" (change)=\"onDocumentTypesSelected($event)\"\r\n formControlName='documentType'>\r\n @for(item of documentTypes; track $index){\r\n <option [value]=\"item.code\">{{item.name}}</option>\r\n }\r\n </select>\r\n @if(checkoutForm.controls['documentType'].touched &&\r\n checkoutForm.controls['documentType'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'type-document-help'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.documentNumber.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'document-number'|translate}}\r\n @if(getTypeForm().viewForms.documentNumber.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\r\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n @if(checkoutForm.controls['documentNumber'].touched &&\r\n checkoutForm.controls['documentNumber'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'document-number-help'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 6-->\r\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\r\n <div class=\"form-group col-12 col-md-12\">\r\n @if(!getLabelNotesParam()){\r\n <label class=\"field-label\">{{'notes'|translate}}\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n @if(getLabelNotesParam(); as labelnotes){\r\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\" formControlName='notes'\r\n value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(this.channel.checkoutNotesField == 'required' && checkoutForm.controls['notes'].touched &&\r\n checkoutForm.controls['notes'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 7-->\r\n <div class=\"form-group col-12 col-md-12\">\r\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\r\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\r\n id=\"formFact\"></label>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <div class=\"col-12\">\r\n <p>\r\n <label class=\"required text-underline text-danger\">* {{ 'required-fields' | translate }}</label>\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n @if(getTypeForm().viewForms.terms.enabled){\r\n <div class=\"form-group col-12 col-md-12\">\r\n @if(getTypeForm().viewForms.terms.required){\r\n <span class=\"required\">*</span>\r\n }\r\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\r\n formControlName='terms' type=\"checkbox\" required (change)=\"onInputChange()\" /> </label><br />\r\n <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\"\r\n data-bs-target=\"#terminos-y-condiciones\">\r\n {{ 'whats-this' | translate }}\r\n </button>\r\n @if(checkoutForm.controls['terms'].touched && !checkoutForm.controls['terms'].value){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n @if(!viewDataFacturacion){\r\n <!--Formulario de Facturaci\u00F3n-->\r\n <div class=\"card\">\r\n <div class=\"card-header text-center\">\r\n <h2>{{ 'billing-data' | translate }}</h2>\r\n </div>\r\n <div class=\"card-body\">\r\n <form [formGroup]=\"checkoutFormFacturacion\">\r\n <div class=\"row mt-2\"><!--Fila 1-->\r\n\r\n @if(getTypeForm().viewForms.firstName.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <!--Si es required-->\r\n <label class=\"form-label\">{{'first-name'|translate}}\r\n @if(getTypeForm().viewForms.firstName.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <!--Input-->\r\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\"\r\n value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\r\n checkoutFormFacturacion.controls['firstName'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\r\n </div>\r\n }\r\n <!--Error info-->\r\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\r\n checkoutFormFacturacion.controls['firstName'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'first-name-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if(getTypeForm().viewForms.lastName.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'last-name'|translate}}\r\n @if(getTypeForm().viewForms.lastName.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\r\n checkoutFormFacturacion.controls['lastName'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\r\n checkoutFormFacturacion.controls['lastName'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-2\"><!--Fila 2-->\r\n @if(getTypeForm().viewForms.phoneNumber.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'phone'|translate}}\r\n @if(getTypeForm().viewForms.phoneNumber.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\r\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\r\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'phone-help1'|translate}}\r\n </span>\r\n </div>\r\n }\r\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\r\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'phone-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if(getTypeForm().viewForms.email.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'email-address'|translate}}\r\n @if(getTypeForm().viewForms.email.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['email'].touched &&\r\n checkoutFormFacturacion.controls['email'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help1'|translate}}\r\n </span>\r\n </div>\r\n }\r\n @if(checkoutFormFacturacion.controls['email'].touched &&\r\n checkoutFormFacturacion.controls['email'].errors?.['email']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-2\"><!--Fila 3-->\r\n @if(getTypeForm().viewForms.countryCode.enabled){\r\n @if(countries$ | async; as countries){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'country'|translate}}\r\n @if(getTypeForm().viewForms.countryCode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\r\n (change)=\"onCountrySelected($event, true)\">\r\n @for(country of countries; track $index){\r\n <option [value]=\"country.code\">{{ country.name }}</option>\r\n }\r\n </select>\r\n @if(checkoutFormFacturacion.controls['countryCode'].touched &&\r\n checkoutFormFacturacion.controls['countryCode'].errors?.['required']){\r\n <div class=\"text text-danger\">\r\n {{'country-help'|translate}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.provinceCode.enabled){\r\n @if(provinces$ | async; as provinces){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'state'|translate}}\r\n @if(getTypeForm().viewForms.provinceCode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select class=\"form-select\" name=\"provinceCode\"\r\n (change)=\"onProvincesSelected($event, provinces, true)\" formControlName='provinceCode'>\r\n <option value=\"\">{{'select-state'|translate}}</option>\r\n @for(province of provinces; track $index){\r\n <option [value]=\"province.code\">{{ province.name }}\r\n </option>\r\n }\r\n </select>\r\n @if(checkoutFormFacturacion.controls['provinceCode'].touched &&\r\n checkoutFormFacturacion.controls['provinceCode'].errors?.['required']){\r\n <div class=\"text text-danger\">\r\n {{'state-help'|translate}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.city.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'town-city'|translate}}\r\n @if(getTypeForm().viewForms.city.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\r\n formControlName='city' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['city'].touched &&\r\n checkoutFormFacturacion.controls['city'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 4-->\r\n @if(getTypeForm().viewForms.street.enabled){\r\n <div class=\"form-group col-12 col-md-8\">\r\n <label class=\"field-label\">{{'address'|translate}}\r\n @if(getTypeForm().viewForms.street.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\r\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['street'].touched &&\r\n checkoutFormFacturacion.controls['street'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutFormFacturacion.controls['street'].touched &&\r\n checkoutFormFacturacion.controls['street'].errors?.['maxlength']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- form direcci\u00F3n -->\r\n @if(getTypeForm().viewForms.postcode.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'postal-code'|translate}}\r\n @if(getTypeForm().viewForms.postcode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\r\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\r\n checkoutFormFacturacion.controls['postcode'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\r\n checkoutFormFacturacion.controls['postcode'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 5-->\r\n @if(getTypeForm().viewForms.documentType.enabled){\r\n @if(documentTypes$ | async; as documentTypes){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'document-type'|translate}}\r\n @if(getTypeForm().viewForms.documentType.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select name=\"documentType\" class=\"form-select\"\r\n (change)=\"onDocumentTypesSelected($event, true)\" formControlName='documentType'>\r\n @for(item of documentTypes; track $index){\r\n <option [value]=\"item.code\">{{item.name}}</option>\r\n }\r\n </select>\r\n @if(checkoutFormFacturacion.controls['documentType'].touched &&\r\n checkoutFormFacturacion.controls['documentType'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'type-document-help'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.documentNumber.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'document-number'|translate}}\r\n @if(getTypeForm().viewForms.documentNumber.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\r\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['documentNumber'].touched &&\r\n checkoutFormFacturacion.controls['documentNumber'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'document-number-help'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 6-->\r\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\r\n <div class=\"form-group col-12 col-md-12\">\r\n @if(!getLabelNotesParam()){\r\n <label class=\"field-label\">{{'notes'|translate}}\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n @if(getLabelNotesParam(); as labelnotes){\r\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\r\n formControlName='notes' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(this.channel.checkoutNotesField == 'required' &&\r\n checkoutFormFacturacion.controls['notes'].touched &&\r\n checkoutFormFacturacion.controls['notes'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"row d-flex flex-row\">\r\n <div class=\"col-12 d-flex justify-content-end\">\r\n <button type=\"submit\" class=\"btn btn-primary text-white\"\r\n [disabled]=\"checkoutForm.invalid || (this.channel.checkoutNotesField == 'required' && (!checkoutForm.get('notes')?.value || checkoutForm.get('notes')?.value.trim() === '')) || (!viewDataFacturacion && checkoutFormFacturacion && (checkoutFormFacturacion.invalid || (this.channel.checkoutNotesField == 'required' && (!checkoutFormFacturacion.get('notes')?.value || checkoutFormFacturacion.get('notes')?.value.trim() === ''))))\">{{(isLastOne\r\n ? 'finish-checkout' : (allready_data ? 'update' :\r\n 'ready-form')) | translate}}\r\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\r\n </button>\r\n </div>\r\n </div>\r\n @if(loading){\r\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n} @else {\r\n<div id=\"loginCheckout\">\r\n @if(require_login){\r\n <div class=\"d-flex flex-column justify-content-center align-items-center my-5 \">\r\n <div class=\"col-12 col-md-6 \">\r\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\r\n </app-login-form-ec>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n}\r\n} @else {\r\n@if(modeSelectAddress == 'ONLY_ADDRESS_SELECTION'){\r\n<div class=\"checkout-title my-2\">\r\n <h3>{{'address-selection'|translate}}</h3>\r\n</div>\r\n}\r\n\r\n@if(this.addressBook){\r\n@if(this.addressBook?.length){\r\n<div class=\"container\">\r\n <div class=\"row\">\r\n @for(item of addressBook; track $index; let i = $index){\r\n <div class=\"col-sm-6 col-12 my-3\">\r\n <div class=\"card p-3\">\r\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\r\n [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\" (change)=\"onInputChange()\">\r\n <div class=\"ms-5\">\r\n <h4 class=\"card-title\">\r\n <strong>{{'address'|translate}}</strong><br>\r\n <span class=\"text-uppercase h3\">{{item.street}}</span>\r\n </h4>\r\n <div class=\"row\">\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\r\n </h5>\r\n </div>\r\n <div class=\"row px-3\">\r\n <div class=\"card p-2 bg-light w-100\">\r\n <div class=\"card-body\">\r\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'first-name'|translate}}</strong>\r\n {{item.addressContact.firstName}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'last-name'|translate}}</strong>\r\n {{item.addressContact.lastName}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'document-type'|translate}}</strong>\r\n {{getDocumentType(item.addressContact.documentType)}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'document-number'|translate}}</strong>\r\n {{item.addressContact.documentNumber}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'email-address'|translate}}</strong>\r\n {{item.addressContact.email}}\r\n </h6>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"w-100\">\r\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\r\n <div class=\"row mt-df\">\r\n <div class=\"form-group col-12 col-md-12\">\r\n @if(!getLabelNotesParam()){\r\n <label class=\"form-label\">{{'notes'|translate}}\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n @if(getLabelNotesParam(); as labelnotes){\r\n <label class=\"form-label\" [innerHTML]=\"labelnotes.value\">\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\r\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\" [required]=\"this.channel.checkoutNotesField == 'required'\">\r\n @if(this.channel.checkoutNotesField == 'required' && ctrl.touched && ctrl.invalid){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row d-flex flex-row\">\r\n <div class=\"col-12 d-flex justify-content-end\">\r\n <button (click)=\"onSelectAddress(cartItems)\" class=\"btn btn-primary text-white\"\r\n [disabled]=\"loadingStep || (this.channel.checkoutNotesField == 'required' && (!this.addressBookSelected.notes || this.addressBookSelected.notes.trim() === ''))\">{{(isLastOne\r\n ? 'finish-checkout' : (allready_data ? 'update' :\r\n 'ready-form')) | translate}}\r\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\r\n </button>\r\n\r\n </div>\r\n </div>\r\n @if(loading){\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n }\r\n</div>\r\n} @else {\r\n<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-12 text-center my-2\">\r\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n} @else {\r\n<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-12 text-center my-2\">\r\n <h4> {{'address-book-not-result' | translate }} </h4>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n\r\n}\r\n\r\n}\r\n@else {\r\n<div class=\"container\">\r\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\r\n</div>\r\n}\r\n}\r\n@if(getTypeForm().viewForms.terms.enabled){\r\n<div class=\"modal fade\" id=\"terminos-y-condiciones\" tabindex=\"-1\" aria-labelledby=\"modalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-xl modal-dialog-scrollable\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\" id=\"modalLabel\">T\u00E9rminos y condiciones</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <app-blocks-ec [section]=\"'terminos-y-condiciones'\" />\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}", styles: [""], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.CheckboxRequiredValidator, selector: "input[type=checkbox][required][formControlName],input[type=checkbox][required][formControl],input[type=checkbox][required][ngModel]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: LoginFormEcComponent, selector: "app-login-form-ec", inputs: ["redirect", "redirectTo", "inCart"], outputs: ["ready"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "component", type: LoadingFullEcComponent, selector: "app-loading-full-ec" }, { kind: "component", type: BlocksEcComponent, selector: "app-blocks-ec", inputs: ["templates", "show_loading", "section", "blockFilters"] }] });
300
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DataformEcComponent, isStandalone: true, selector: "app-dataform-ec", ngImport: i0, template: "@if(channel$ | async; as channelConfig){\n@if(channelConfig.channelType != 'b2b' || (channelConfig.channelType == 'b2b' && isAuthenticated())){\n@if( modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && isAuthenticated() && this.addressBook != null){\n<!--Selector de modos-->\n<div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n @if(!getParamByChannelAndLanguage('btn_new_address_')){\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n }\n @if(getParamByChannelAndLanguage('btn_new_address_'); as param){\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n }\n </div>\n </div>\n </div>\n</div>\n}\n\n@if(getMode()){\n@if(!require_login){\n<div>\n @if(modeSelectAddress == 'ONLY_LOAD_ADDRESS'){\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n }\n <!--Formulario-->\n <form [formGroup]=\"checkoutForm\" (submit)=\"verifyValidate($event)\"> <!-- //this.cartService.items -->\n <div class=\"row mt-2\"><!--Fila 1-->\n\n @if(getTypeForm().viewForms.firstName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <!--Si es required-->\n <label class=\"form-label\">{{'first-name'|translate}}\n @if(getTypeForm().viewForms.firstName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <!--Input-->\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['firstName'].touched &&\n checkoutForm.controls['firstName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n </div>\n }\n <!--Error info-->\n @if(checkoutForm.controls['firstName'].touched &&\n checkoutForm.controls['firstName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.lastName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'last-name'|translate}}\n @if(getTypeForm().viewForms.lastName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['lastName'].touched &&\n checkoutForm.controls['lastName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['lastName'].touched && checkoutForm.controls['lastName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 2-->\n @if(getTypeForm().viewForms.phoneNumber.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'phone'|translate}}\n @if(getTypeForm().viewForms.phoneNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['phoneNumber'].touched &&\n checkoutForm.controls['phoneNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutForm.controls['phoneNumber'].touched &&\n checkoutForm.controls['phoneNumber'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.email.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'email-address'|translate}}\n @if(getTypeForm().viewForms.email.required){\n <span class=\"required\">*</span>\n }</label>\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['email']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 3-->\n @if(getTypeForm().viewForms.countryCode.enabled){\n @if(countries$ | async; as countries){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'country'|translate}}\n @if(getTypeForm().viewForms.countryCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\n (change)=\"onCountrySelected($event)\">\n @for(country of countries; track $index){\n <option [value]=\"country.code\">{{ country.name }}</option>\n }\n </select>\n @if(checkoutForm.controls['countryCode'].touched &&\n checkoutForm.controls['countryCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.provinceCode.enabled){\n @if(provinces$ | async; as provinces){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'state'|translate}}\n @if(getTypeForm().viewForms.provinceCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"provinceCode\" (change)=\"onProvincesSelected($event, provinces)\"\n formControlName='provinceCode'>\n <option value=\"\">{{'select-state'|translate}}</option>\n @for(province of provinces; track $index){\n <option [value]=\"province.code\">{{ province.name }}\n </option>\n }\n </select>\n @if(checkoutForm.controls['provinceCode'].touched &&\n checkoutForm.controls['provinceCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.city.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'town-city'|translate}}\n @if(getTypeForm().viewForms.city.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\" formControlName='city'\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['city'].touched && checkoutForm.controls['city'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 4-->\n @if(getTypeForm().viewForms.street.enabled){\n <div class=\"form-group col-12 col-md-8\">\n <label class=\"field-label\">{{'address'|translate}}\n @if(getTypeForm().viewForms.street.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['maxlength']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n\n <!-- form direcci\u00F3n -->\n @if(getTypeForm().viewForms.postcode.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'postal-code'|translate}}\n @if(getTypeForm().viewForms.postcode.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['postcode'].touched &&\n checkoutForm.controls['postcode'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['postcode'].touched && checkoutForm.controls['postcode'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 5-->\n @if(getTypeForm().viewForms.documentType.enabled){\n @if(documentTypes$ | async; as documentTypes){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-type'|translate}}\n @if(getTypeForm().viewForms.documentType.required){\n <span class=\"required\">*</span>\n }</label>\n <select name=\"documentType\" class=\"form-select\" (change)=\"onDocumentTypesSelected($event)\"\n formControlName='documentType'>\n @for(item of documentTypes; track $index){\n <option [value]=\"item.code\">{{item.name}}</option>\n }\n </select>\n @if(checkoutForm.controls['documentType'].touched &&\n checkoutForm.controls['documentType'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.documentNumber.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-number'|translate}}\n @if(getTypeForm().viewForms.documentNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutForm.controls['documentNumber'].touched &&\n checkoutForm.controls['documentNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 6-->\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"field-label\">{{'notes'|translate}}\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\" formControlName='notes'\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(this.channel.checkoutNotesField == 'required' && checkoutForm.controls['notes'].touched &&\n checkoutForm.controls['notes'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df\">\n <div class=\"col-12\">\n <p>\n <label class=\"required text-underline text-danger\">* {{ 'required-fields' | translate }}</label>\n </p>\n </div>\n </div>\n <div class=\"row mt-df\">\n @if(getTypeForm().viewForms.terms.enabled){\n <div class=\"form-group col-12 col-md-12\">\n @if(getTypeForm().viewForms.terms.required){\n <span class=\"required\">*</span>\n }\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\n formControlName='terms' type=\"checkbox\" required (change)=\"onInputChange()\" /> </label><br />\n <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\"\n data-bs-target=\"#terminos-y-condiciones\">\n {{ 'whats-this' | translate }}\n </button>\n @if(checkoutForm.controls['terms'].touched && !checkoutForm.controls['terms'].value){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n }\n </div>\n }\n </div>\n @if(!viewDataFacturacion){\n <!--Formulario de Facturaci\u00F3n-->\n <div class=\"card\">\n <div class=\"card-header text-center\">\n <h2>{{ 'billing-data' | translate }}</h2>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"checkoutFormFacturacion\">\n <div class=\"row mt-2\"><!--Fila 1-->\n\n @if(getTypeForm().viewForms.firstName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <!--Si es required-->\n <label class=\"form-label\">{{'first-name'|translate}}\n @if(getTypeForm().viewForms.firstName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <!--Input-->\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\"\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\n checkoutFormFacturacion.controls['firstName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n </div>\n }\n <!--Error info-->\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\n checkoutFormFacturacion.controls['firstName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.lastName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'last-name'|translate}}\n @if(getTypeForm().viewForms.lastName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\n checkoutFormFacturacion.controls['lastName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\n checkoutFormFacturacion.controls['lastName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 2-->\n @if(getTypeForm().viewForms.phoneNumber.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'phone'|translate}}\n @if(getTypeForm().viewForms.phoneNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.email.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'email-address'|translate}}\n @if(getTypeForm().viewForms.email.required){\n <span class=\"required\">*</span>\n }</label>\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['email'].touched &&\n checkoutFormFacturacion.controls['email'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['email'].touched &&\n checkoutFormFacturacion.controls['email'].errors?.['email']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 3-->\n @if(getTypeForm().viewForms.countryCode.enabled){\n @if(countries$ | async; as countries){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'country'|translate}}\n @if(getTypeForm().viewForms.countryCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\n (change)=\"onCountrySelected($event, true)\">\n @for(country of countries; track $index){\n <option [value]=\"country.code\">{{ country.name }}</option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['countryCode'].touched &&\n checkoutFormFacturacion.controls['countryCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.provinceCode.enabled){\n @if(provinces$ | async; as provinces){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'state'|translate}}\n @if(getTypeForm().viewForms.provinceCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event, provinces, true)\" formControlName='provinceCode'>\n <option value=\"\">{{'select-state'|translate}}</option>\n @for(province of provinces; track $index){\n <option [value]=\"province.code\">{{ province.name }}\n </option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['provinceCode'].touched &&\n checkoutFormFacturacion.controls['provinceCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.city.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'town-city'|translate}}\n @if(getTypeForm().viewForms.city.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n formControlName='city' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['city'].touched &&\n checkoutFormFacturacion.controls['city'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 4-->\n @if(getTypeForm().viewForms.street.enabled){\n <div class=\"form-group col-12 col-md-8\">\n <label class=\"field-label\">{{'address'|translate}}\n @if(getTypeForm().viewForms.street.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['street'].touched &&\n checkoutFormFacturacion.controls['street'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['street'].touched &&\n checkoutFormFacturacion.controls['street'].errors?.['maxlength']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n\n <!-- form direcci\u00F3n -->\n @if(getTypeForm().viewForms.postcode.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'postal-code'|translate}}\n @if(getTypeForm().viewForms.postcode.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\n checkoutFormFacturacion.controls['postcode'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\n checkoutFormFacturacion.controls['postcode'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 5-->\n @if(getTypeForm().viewForms.documentType.enabled){\n @if(documentTypes$ | async; as documentTypes){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-type'|translate}}\n @if(getTypeForm().viewForms.documentType.required){\n <span class=\"required\">*</span>\n }</label>\n <select name=\"documentType\" class=\"form-select\"\n (change)=\"onDocumentTypesSelected($event, true)\" formControlName='documentType'>\n @for(item of documentTypes; track $index){\n <option [value]=\"item.code\">{{item.name}}</option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['documentType'].touched &&\n checkoutFormFacturacion.controls['documentType'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.documentNumber.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-number'|translate}}\n @if(getTypeForm().viewForms.documentNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['documentNumber'].touched &&\n checkoutFormFacturacion.controls['documentNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 6-->\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"field-label\">{{'notes'|translate}}\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n formControlName='notes' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(this.channel.checkoutNotesField == 'required' &&\n checkoutFormFacturacion.controls['notes'].touched &&\n checkoutFormFacturacion.controls['notes'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n </form>\n </div>\n </div>\n }\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-end\">\n <button type=\"submit\" class=\"btn btn-primary text-white\"\n [disabled]=\"checkoutForm.invalid || (this.channel.checkoutNotesField == 'required' && (!checkoutForm.get('notes')?.value || checkoutForm.get('notes')?.value.trim() === '')) || (!viewDataFacturacion && checkoutFormFacturacion && (checkoutFormFacturacion.invalid || (this.channel.checkoutNotesField == 'required' && (!checkoutFormFacturacion.get('notes')?.value || checkoutFormFacturacion.get('notes')?.value.trim() === ''))))\">{{(isLastOne\n ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\n </button>\n </div>\n </div>\n @if(loading){\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n }\n\n </form>\n</div>\n} @else {\n<div id=\"loginCheckout\">\n @if(require_login){\n <div class=\"d-flex flex-column justify-content-center align-items-center my-5 \">\n <div class=\"col-12 col-md-6 \">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n }\n</div>\n}\n} @else {\n@if(modeSelectAddress == 'ONLY_ADDRESS_SELECTION'){\n<div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n</div>\n}\n\n@if(this.addressBook){\n@if(this.addressBook?.length){\n<div class=\"container\">\n <div class=\"row\">\n @for(item of addressBook; track $index; let i = $index){\n <div class=\"col-sm-6 col-12 my-3\">\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\n [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\" (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong>\n {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong>\n {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n <div class=\"w-100\">\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"form-label\">{{'notes'|translate}}\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"form-label\" [innerHTML]=\"labelnotes.value\">\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\n autocomplete=\"off\" [required]=\"this.channel.checkoutNotesField == 'required'\">\n @if(this.channel.checkoutNotesField == 'required' && ctrl.touched && ctrl.invalid){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-end\">\n <button (click)=\"onSelectAddress(cartItems)\" class=\"btn btn-primary text-white\"\n [disabled]=\"loadingStep || (this.channel.checkoutNotesField == 'required' && (!this.addressBookSelected.notes || this.addressBookSelected.notes.trim() === ''))\">{{(isLastOne\n ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\n </button>\n\n </div>\n </div>\n @if(loading){\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n }\n</div>\n} @else {\n<div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n</div>\n}\n} @else {\n<div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n</div>\n}\n\n}\n\n}\n@else {\n<div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\n</div>\n}\n}\n@if(getTypeForm().viewForms.terms.enabled){\n<div class=\"modal fade\" id=\"terminos-y-condiciones\" tabindex=\"-1\" aria-labelledby=\"modalLabel\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-xl modal-dialog-scrollable\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\" id=\"modalLabel\">T\u00E9rminos y condiciones</h5>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n <app-blocks-ec [section]=\"'terminos-y-condiciones'\" />\n </div>\n </div>\n </div>\n</div>\n}", styles: [""], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.CheckboxRequiredValidator, selector: "input[type=checkbox][required][formControlName],input[type=checkbox][required][formControl],input[type=checkbox][required][ngModel]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: LoginFormEcComponent, selector: "app-login-form-ec", inputs: ["redirect", "redirectTo", "inCart"], outputs: ["ready"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "component", type: LoadingFullEcComponent, selector: "app-loading-full-ec" }, { kind: "component", type: BlocksEcComponent, selector: "app-blocks-ec", inputs: ["templates", "show_loading", "section", "blockFilters"] }] });
299
301
  }
300
302
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataformEcComponent, decorators: [{
301
303
  type: Component,
@@ -310,6 +312,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
310
312
  LoadingFullEcComponent,
311
313
  JsonPipe,
312
314
  BlocksEcComponent
313
- ], template: "@if(channel$ | async; as channelConfig){\r\n@if(channelConfig.channelType != 'b2b' || (channelConfig.channelType == 'b2b' && isAuthenticated())){\r\n@if( modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && isAuthenticated() && this.addressBook != null){\r\n<!--Selector de modos-->\r\n<div class=\"container card p-4 mb-3\">\r\n <div class=\"row justify-content-center\">\r\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\r\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\r\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\r\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\r\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\r\n </label>\r\n @if(!getParamByChannelAndLanguage('btn_new_address_')){\r\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\">\r\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\r\n {{ 'new-address' | translate | titlecase}}\r\n </label>\r\n }\r\n @if(getParamByChannelAndLanguage('btn_new_address_'); as param){\r\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\">\r\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\r\n {{ param.value}}\r\n </label>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n\r\n@if(getMode()){\r\n@if(!require_login){\r\n<div>\r\n @if(modeSelectAddress == 'ONLY_LOAD_ADDRESS'){\r\n <div class=\"checkout-title my-2\">\r\n <h3>{{'billing-details'|translate}}</h3>\r\n </div>\r\n }\r\n <!--Formulario-->\r\n <form [formGroup]=\"checkoutForm\" (submit)=\"verifyValidate($event)\"> <!-- //this.cartService.items -->\r\n <div class=\"row mt-2\"><!--Fila 1-->\r\n\r\n @if(getTypeForm().viewForms.firstName.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <!--Si es required-->\r\n <label class=\"form-label\">{{'first-name'|translate}}\r\n @if(getTypeForm().viewForms.firstName.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <!--Input-->\r\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['firstName'].touched &&\r\n checkoutForm.controls['firstName'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\r\n </div>\r\n }\r\n <!--Error info-->\r\n @if(checkoutForm.controls['firstName'].touched &&\r\n checkoutForm.controls['firstName'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'first-name-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if(getTypeForm().viewForms.lastName.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'last-name'|translate}}\r\n @if(getTypeForm().viewForms.lastName.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['lastName'].touched &&\r\n checkoutForm.controls['lastName'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutForm.controls['lastName'].touched && checkoutForm.controls['lastName'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-2\"><!--Fila 2-->\r\n @if(getTypeForm().viewForms.phoneNumber.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'phone'|translate}}\r\n @if(getTypeForm().viewForms.phoneNumber.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\r\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['phoneNumber'].touched &&\r\n checkoutForm.controls['phoneNumber'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'phone-help1'|translate}}\r\n </span>\r\n </div>\r\n }\r\n @if(checkoutForm.controls['phoneNumber'].touched &&\r\n checkoutForm.controls['phoneNumber'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'phone-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if(getTypeForm().viewForms.email.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'email-address'|translate}}\r\n @if(getTypeForm().viewForms.email.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help1'|translate}}\r\n </span>\r\n </div>\r\n }\r\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['email']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-2\"><!--Fila 3-->\r\n @if(getTypeForm().viewForms.countryCode.enabled){\r\n @if(countries$ | async; as countries){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'country'|translate}}\r\n @if(getTypeForm().viewForms.countryCode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\r\n (change)=\"onCountrySelected($event)\">\r\n @for(country of countries; track $index){\r\n <option [value]=\"country.code\">{{ country.name }}</option>\r\n }\r\n </select>\r\n @if(checkoutForm.controls['countryCode'].touched &&\r\n checkoutForm.controls['countryCode'].errors?.['required']){\r\n <div class=\"text text-danger\">\r\n {{'country-help'|translate}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.provinceCode.enabled){\r\n @if(provinces$ | async; as provinces){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'state'|translate}}\r\n @if(getTypeForm().viewForms.provinceCode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select class=\"form-select\" name=\"provinceCode\" (change)=\"onProvincesSelected($event, provinces)\"\r\n formControlName='provinceCode'>\r\n <option value=\"\">{{'select-state'|translate}}</option>\r\n @for(province of provinces; track $index){\r\n <option [value]=\"province.code\">{{ province.name }}\r\n </option>\r\n }\r\n </select>\r\n @if(checkoutForm.controls['provinceCode'].touched &&\r\n checkoutForm.controls['provinceCode'].errors?.['required']){\r\n <div class=\"text text-danger\">\r\n {{'state-help'|translate}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.city.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'town-city'|translate}}\r\n @if(getTypeForm().viewForms.city.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\" formControlName='city'\r\n value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['city'].touched && checkoutForm.controls['city'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 4-->\r\n @if(getTypeForm().viewForms.street.enabled){\r\n <div class=\"form-group col-12 col-md-8\">\r\n <label class=\"field-label\">{{'address'|translate}}\r\n @if(getTypeForm().viewForms.street.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\r\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['maxlength']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- form direcci\u00F3n -->\r\n @if(getTypeForm().viewForms.postcode.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'postal-code'|translate}}\r\n @if(getTypeForm().viewForms.postcode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\r\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutForm.controls['postcode'].touched &&\r\n checkoutForm.controls['postcode'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutForm.controls['postcode'].touched && checkoutForm.controls['postcode'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 5-->\r\n @if(getTypeForm().viewForms.documentType.enabled){\r\n @if(documentTypes$ | async; as documentTypes){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'document-type'|translate}}\r\n @if(getTypeForm().viewForms.documentType.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select name=\"documentType\" class=\"form-select\" (change)=\"onDocumentTypesSelected($event)\"\r\n formControlName='documentType'>\r\n @for(item of documentTypes; track $index){\r\n <option [value]=\"item.code\">{{item.name}}</option>\r\n }\r\n </select>\r\n @if(checkoutForm.controls['documentType'].touched &&\r\n checkoutForm.controls['documentType'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'type-document-help'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.documentNumber.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'document-number'|translate}}\r\n @if(getTypeForm().viewForms.documentNumber.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\r\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n @if(checkoutForm.controls['documentNumber'].touched &&\r\n checkoutForm.controls['documentNumber'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'document-number-help'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 6-->\r\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\r\n <div class=\"form-group col-12 col-md-12\">\r\n @if(!getLabelNotesParam()){\r\n <label class=\"field-label\">{{'notes'|translate}}\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n @if(getLabelNotesParam(); as labelnotes){\r\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\" formControlName='notes'\r\n value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(this.channel.checkoutNotesField == 'required' && checkoutForm.controls['notes'].touched &&\r\n checkoutForm.controls['notes'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 7-->\r\n <div class=\"form-group col-12 col-md-12\">\r\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\r\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\r\n id=\"formFact\"></label>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <div class=\"col-12\">\r\n <p>\r\n <label class=\"required text-underline text-danger\">* {{ 'required-fields' | translate }}</label>\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n @if(getTypeForm().viewForms.terms.enabled){\r\n <div class=\"form-group col-12 col-md-12\">\r\n @if(getTypeForm().viewForms.terms.required){\r\n <span class=\"required\">*</span>\r\n }\r\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\r\n formControlName='terms' type=\"checkbox\" required (change)=\"onInputChange()\" /> </label><br />\r\n <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\"\r\n data-bs-target=\"#terminos-y-condiciones\">\r\n {{ 'whats-this' | translate }}\r\n </button>\r\n @if(checkoutForm.controls['terms'].touched && !checkoutForm.controls['terms'].value){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n @if(!viewDataFacturacion){\r\n <!--Formulario de Facturaci\u00F3n-->\r\n <div class=\"card\">\r\n <div class=\"card-header text-center\">\r\n <h2>{{ 'billing-data' | translate }}</h2>\r\n </div>\r\n <div class=\"card-body\">\r\n <form [formGroup]=\"checkoutFormFacturacion\">\r\n <div class=\"row mt-2\"><!--Fila 1-->\r\n\r\n @if(getTypeForm().viewForms.firstName.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <!--Si es required-->\r\n <label class=\"form-label\">{{'first-name'|translate}}\r\n @if(getTypeForm().viewForms.firstName.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <!--Input-->\r\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\"\r\n value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\r\n checkoutFormFacturacion.controls['firstName'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\r\n </div>\r\n }\r\n <!--Error info-->\r\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\r\n checkoutFormFacturacion.controls['firstName'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'first-name-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if(getTypeForm().viewForms.lastName.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'last-name'|translate}}\r\n @if(getTypeForm().viewForms.lastName.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\r\n checkoutFormFacturacion.controls['lastName'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\r\n checkoutFormFacturacion.controls['lastName'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-2\"><!--Fila 2-->\r\n @if(getTypeForm().viewForms.phoneNumber.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'phone'|translate}}\r\n @if(getTypeForm().viewForms.phoneNumber.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\r\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\r\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'phone-help1'|translate}}\r\n </span>\r\n </div>\r\n }\r\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\r\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'phone-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if(getTypeForm().viewForms.email.enabled){\r\n <div class=\"form-group col-12 col-md-6\">\r\n <label class=\"form-label\">{{'email-address'|translate}}\r\n @if(getTypeForm().viewForms.email.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['email'].touched &&\r\n checkoutFormFacturacion.controls['email'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help1'|translate}}\r\n </span>\r\n </div>\r\n }\r\n @if(checkoutFormFacturacion.controls['email'].touched &&\r\n checkoutFormFacturacion.controls['email'].errors?.['email']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help2'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-2\"><!--Fila 3-->\r\n @if(getTypeForm().viewForms.countryCode.enabled){\r\n @if(countries$ | async; as countries){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'country'|translate}}\r\n @if(getTypeForm().viewForms.countryCode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\r\n (change)=\"onCountrySelected($event, true)\">\r\n @for(country of countries; track $index){\r\n <option [value]=\"country.code\">{{ country.name }}</option>\r\n }\r\n </select>\r\n @if(checkoutFormFacturacion.controls['countryCode'].touched &&\r\n checkoutFormFacturacion.controls['countryCode'].errors?.['required']){\r\n <div class=\"text text-danger\">\r\n {{'country-help'|translate}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.provinceCode.enabled){\r\n @if(provinces$ | async; as provinces){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'state'|translate}}\r\n @if(getTypeForm().viewForms.provinceCode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select class=\"form-select\" name=\"provinceCode\"\r\n (change)=\"onProvincesSelected($event, provinces, true)\" formControlName='provinceCode'>\r\n <option value=\"\">{{'select-state'|translate}}</option>\r\n @for(province of provinces; track $index){\r\n <option [value]=\"province.code\">{{ province.name }}\r\n </option>\r\n }\r\n </select>\r\n @if(checkoutFormFacturacion.controls['provinceCode'].touched &&\r\n checkoutFormFacturacion.controls['provinceCode'].errors?.['required']){\r\n <div class=\"text text-danger\">\r\n {{'state-help'|translate}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.city.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"form-label\">{{'town-city'|translate}}\r\n @if(getTypeForm().viewForms.city.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\r\n formControlName='city' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['city'].touched &&\r\n checkoutFormFacturacion.controls['city'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 4-->\r\n @if(getTypeForm().viewForms.street.enabled){\r\n <div class=\"form-group col-12 col-md-8\">\r\n <label class=\"field-label\">{{'address'|translate}}\r\n @if(getTypeForm().viewForms.street.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\r\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['street'].touched &&\r\n checkoutFormFacturacion.controls['street'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutFormFacturacion.controls['street'].touched &&\r\n checkoutFormFacturacion.controls['street'].errors?.['maxlength']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- form direcci\u00F3n -->\r\n @if(getTypeForm().viewForms.postcode.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'postal-code'|translate}}\r\n @if(getTypeForm().viewForms.postcode.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\r\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\r\n checkoutFormFacturacion.controls['postcode'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\r\n </div>\r\n }\r\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\r\n checkoutFormFacturacion.controls['postcode'].errors?.['pattern']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 5-->\r\n @if(getTypeForm().viewForms.documentType.enabled){\r\n @if(documentTypes$ | async; as documentTypes){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'document-type'|translate}}\r\n @if(getTypeForm().viewForms.documentType.required){\r\n <span class=\"required\">*</span>\r\n }</label>\r\n <select name=\"documentType\" class=\"form-select\"\r\n (change)=\"onDocumentTypesSelected($event, true)\" formControlName='documentType'>\r\n @for(item of documentTypes; track $index){\r\n <option [value]=\"item.code\">{{item.name}}</option>\r\n }\r\n </select>\r\n @if(checkoutFormFacturacion.controls['documentType'].touched &&\r\n checkoutFormFacturacion.controls['documentType'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'type-document-help'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @if(getTypeForm().viewForms.documentNumber.enabled){\r\n <div class=\"form-group col-12 col-md-4\">\r\n <label class=\"field-label\">{{'document-number'|translate}}\r\n @if(getTypeForm().viewForms.documentNumber.required){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\r\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n @if(checkoutFormFacturacion.controls['documentNumber'].touched &&\r\n checkoutFormFacturacion.controls['documentNumber'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">\r\n {{'document-number-help'|translate}}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 6-->\r\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\r\n <div class=\"form-group col-12 col-md-12\">\r\n @if(!getLabelNotesParam()){\r\n <label class=\"field-label\">{{'notes'|translate}}\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n @if(getLabelNotesParam(); as labelnotes){\r\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\r\n formControlName='notes' value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n @if(this.channel.checkoutNotesField == 'required' &&\r\n checkoutFormFacturacion.controls['notes'].touched &&\r\n checkoutFormFacturacion.controls['notes'].errors?.['required']){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"row d-flex flex-row\">\r\n <div class=\"col-12 d-flex justify-content-end\">\r\n <button type=\"submit\" class=\"btn btn-primary text-white\"\r\n [disabled]=\"checkoutForm.invalid || (this.channel.checkoutNotesField == 'required' && (!checkoutForm.get('notes')?.value || checkoutForm.get('notes')?.value.trim() === '')) || (!viewDataFacturacion && checkoutFormFacturacion && (checkoutFormFacturacion.invalid || (this.channel.checkoutNotesField == 'required' && (!checkoutFormFacturacion.get('notes')?.value || checkoutFormFacturacion.get('notes')?.value.trim() === ''))))\">{{(isLastOne\r\n ? 'finish-checkout' : (allready_data ? 'update' :\r\n 'ready-form')) | translate}}\r\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\r\n </button>\r\n </div>\r\n </div>\r\n @if(loading){\r\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n} @else {\r\n<div id=\"loginCheckout\">\r\n @if(require_login){\r\n <div class=\"d-flex flex-column justify-content-center align-items-center my-5 \">\r\n <div class=\"col-12 col-md-6 \">\r\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\r\n </app-login-form-ec>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n}\r\n} @else {\r\n@if(modeSelectAddress == 'ONLY_ADDRESS_SELECTION'){\r\n<div class=\"checkout-title my-2\">\r\n <h3>{{'address-selection'|translate}}</h3>\r\n</div>\r\n}\r\n\r\n@if(this.addressBook){\r\n@if(this.addressBook?.length){\r\n<div class=\"container\">\r\n <div class=\"row\">\r\n @for(item of addressBook; track $index; let i = $index){\r\n <div class=\"col-sm-6 col-12 my-3\">\r\n <div class=\"card p-3\">\r\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\r\n [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\" (change)=\"onInputChange()\">\r\n <div class=\"ms-5\">\r\n <h4 class=\"card-title\">\r\n <strong>{{'address'|translate}}</strong><br>\r\n <span class=\"text-uppercase h3\">{{item.street}}</span>\r\n </h4>\r\n <div class=\"row\">\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\r\n </h5>\r\n </div>\r\n <div class=\"row px-3\">\r\n <div class=\"card p-2 bg-light w-100\">\r\n <div class=\"card-body\">\r\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'first-name'|translate}}</strong>\r\n {{item.addressContact.firstName}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'last-name'|translate}}</strong>\r\n {{item.addressContact.lastName}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'document-type'|translate}}</strong>\r\n {{getDocumentType(item.addressContact.documentType)}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'document-number'|translate}}</strong>\r\n {{item.addressContact.documentNumber}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'email-address'|translate}}</strong>\r\n {{item.addressContact.email}}\r\n </h6>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"w-100\">\r\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\r\n <div class=\"row mt-df\">\r\n <div class=\"form-group col-12 col-md-12\">\r\n @if(!getLabelNotesParam()){\r\n <label class=\"form-label\">{{'notes'|translate}}\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n @if(getLabelNotesParam(); as labelnotes){\r\n <label class=\"form-label\" [innerHTML]=\"labelnotes.value\">\r\n @if(this.channel.checkoutNotesField == 'required'){\r\n <span class=\"required\">*</span>\r\n }\r\n </label>\r\n }\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\r\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\" [required]=\"this.channel.checkoutNotesField == 'required'\">\r\n @if(this.channel.checkoutNotesField == 'required' && ctrl.touched && ctrl.invalid){\r\n <div class=\"text-danger-container\">\r\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"row d-flex flex-row\">\r\n <div class=\"col-12 d-flex justify-content-end\">\r\n <button (click)=\"onSelectAddress(cartItems)\" class=\"btn btn-primary text-white\"\r\n [disabled]=\"loadingStep || (this.channel.checkoutNotesField == 'required' && (!this.addressBookSelected.notes || this.addressBookSelected.notes.trim() === ''))\">{{(isLastOne\r\n ? 'finish-checkout' : (allready_data ? 'update' :\r\n 'ready-form')) | translate}}\r\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\r\n </button>\r\n\r\n </div>\r\n </div>\r\n @if(loading){\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n }\r\n</div>\r\n} @else {\r\n<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-12 text-center my-2\">\r\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n} @else {\r\n<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-12 text-center my-2\">\r\n <h4> {{'address-book-not-result' | translate }} </h4>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n\r\n}\r\n\r\n}\r\n@else {\r\n<div class=\"container\">\r\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\r\n</div>\r\n}\r\n}\r\n@if(getTypeForm().viewForms.terms.enabled){\r\n<div class=\"modal fade\" id=\"terminos-y-condiciones\" tabindex=\"-1\" aria-labelledby=\"modalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-xl modal-dialog-scrollable\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\" id=\"modalLabel\">T\u00E9rminos y condiciones</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <app-blocks-ec [section]=\"'terminos-y-condiciones'\" />\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}" }]
315
+ ], template: "@if(channel$ | async; as channelConfig){\n@if(channelConfig.channelType != 'b2b' || (channelConfig.channelType == 'b2b' && isAuthenticated())){\n@if( modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && isAuthenticated() && this.addressBook != null){\n<!--Selector de modos-->\n<div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n @if(!getParamByChannelAndLanguage('btn_new_address_')){\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n }\n @if(getParamByChannelAndLanguage('btn_new_address_'); as param){\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n }\n </div>\n </div>\n </div>\n</div>\n}\n\n@if(getMode()){\n@if(!require_login){\n<div>\n @if(modeSelectAddress == 'ONLY_LOAD_ADDRESS'){\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n }\n <!--Formulario-->\n <form [formGroup]=\"checkoutForm\" (submit)=\"verifyValidate($event)\"> <!-- //this.cartService.items -->\n <div class=\"row mt-2\"><!--Fila 1-->\n\n @if(getTypeForm().viewForms.firstName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <!--Si es required-->\n <label class=\"form-label\">{{'first-name'|translate}}\n @if(getTypeForm().viewForms.firstName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <!--Input-->\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['firstName'].touched &&\n checkoutForm.controls['firstName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n </div>\n }\n <!--Error info-->\n @if(checkoutForm.controls['firstName'].touched &&\n checkoutForm.controls['firstName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.lastName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'last-name'|translate}}\n @if(getTypeForm().viewForms.lastName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['lastName'].touched &&\n checkoutForm.controls['lastName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['lastName'].touched && checkoutForm.controls['lastName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 2-->\n @if(getTypeForm().viewForms.phoneNumber.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'phone'|translate}}\n @if(getTypeForm().viewForms.phoneNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['phoneNumber'].touched &&\n checkoutForm.controls['phoneNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutForm.controls['phoneNumber'].touched &&\n checkoutForm.controls['phoneNumber'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.email.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'email-address'|translate}}\n @if(getTypeForm().viewForms.email.required){\n <span class=\"required\">*</span>\n }</label>\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['email']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 3-->\n @if(getTypeForm().viewForms.countryCode.enabled){\n @if(countries$ | async; as countries){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'country'|translate}}\n @if(getTypeForm().viewForms.countryCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\n (change)=\"onCountrySelected($event)\">\n @for(country of countries; track $index){\n <option [value]=\"country.code\">{{ country.name }}</option>\n }\n </select>\n @if(checkoutForm.controls['countryCode'].touched &&\n checkoutForm.controls['countryCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.provinceCode.enabled){\n @if(provinces$ | async; as provinces){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'state'|translate}}\n @if(getTypeForm().viewForms.provinceCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"provinceCode\" (change)=\"onProvincesSelected($event, provinces)\"\n formControlName='provinceCode'>\n <option value=\"\">{{'select-state'|translate}}</option>\n @for(province of provinces; track $index){\n <option [value]=\"province.code\">{{ province.name }}\n </option>\n }\n </select>\n @if(checkoutForm.controls['provinceCode'].touched &&\n checkoutForm.controls['provinceCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.city.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'town-city'|translate}}\n @if(getTypeForm().viewForms.city.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\" formControlName='city'\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['city'].touched && checkoutForm.controls['city'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 4-->\n @if(getTypeForm().viewForms.street.enabled){\n <div class=\"form-group col-12 col-md-8\">\n <label class=\"field-label\">{{'address'|translate}}\n @if(getTypeForm().viewForms.street.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['maxlength']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n\n <!-- form direcci\u00F3n -->\n @if(getTypeForm().viewForms.postcode.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'postal-code'|translate}}\n @if(getTypeForm().viewForms.postcode.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['postcode'].touched &&\n checkoutForm.controls['postcode'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['postcode'].touched && checkoutForm.controls['postcode'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 5-->\n @if(getTypeForm().viewForms.documentType.enabled){\n @if(documentTypes$ | async; as documentTypes){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-type'|translate}}\n @if(getTypeForm().viewForms.documentType.required){\n <span class=\"required\">*</span>\n }</label>\n <select name=\"documentType\" class=\"form-select\" (change)=\"onDocumentTypesSelected($event)\"\n formControlName='documentType'>\n @for(item of documentTypes; track $index){\n <option [value]=\"item.code\">{{item.name}}</option>\n }\n </select>\n @if(checkoutForm.controls['documentType'].touched &&\n checkoutForm.controls['documentType'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.documentNumber.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-number'|translate}}\n @if(getTypeForm().viewForms.documentNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutForm.controls['documentNumber'].touched &&\n checkoutForm.controls['documentNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 6-->\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"field-label\">{{'notes'|translate}}\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\" formControlName='notes'\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(this.channel.checkoutNotesField == 'required' && checkoutForm.controls['notes'].touched &&\n checkoutForm.controls['notes'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df\">\n <div class=\"col-12\">\n <p>\n <label class=\"required text-underline text-danger\">* {{ 'required-fields' | translate }}</label>\n </p>\n </div>\n </div>\n <div class=\"row mt-df\">\n @if(getTypeForm().viewForms.terms.enabled){\n <div class=\"form-group col-12 col-md-12\">\n @if(getTypeForm().viewForms.terms.required){\n <span class=\"required\">*</span>\n }\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\n formControlName='terms' type=\"checkbox\" required (change)=\"onInputChange()\" /> </label><br />\n <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\"\n data-bs-target=\"#terminos-y-condiciones\">\n {{ 'whats-this' | translate }}\n </button>\n @if(checkoutForm.controls['terms'].touched && !checkoutForm.controls['terms'].value){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n }\n </div>\n }\n </div>\n @if(!viewDataFacturacion){\n <!--Formulario de Facturaci\u00F3n-->\n <div class=\"card\">\n <div class=\"card-header text-center\">\n <h2>{{ 'billing-data' | translate }}</h2>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"checkoutFormFacturacion\">\n <div class=\"row mt-2\"><!--Fila 1-->\n\n @if(getTypeForm().viewForms.firstName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <!--Si es required-->\n <label class=\"form-label\">{{'first-name'|translate}}\n @if(getTypeForm().viewForms.firstName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <!--Input-->\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\"\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\n checkoutFormFacturacion.controls['firstName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n </div>\n }\n <!--Error info-->\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\n checkoutFormFacturacion.controls['firstName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.lastName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'last-name'|translate}}\n @if(getTypeForm().viewForms.lastName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\n checkoutFormFacturacion.controls['lastName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\n checkoutFormFacturacion.controls['lastName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 2-->\n @if(getTypeForm().viewForms.phoneNumber.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'phone'|translate}}\n @if(getTypeForm().viewForms.phoneNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.email.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'email-address'|translate}}\n @if(getTypeForm().viewForms.email.required){\n <span class=\"required\">*</span>\n }</label>\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['email'].touched &&\n checkoutFormFacturacion.controls['email'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['email'].touched &&\n checkoutFormFacturacion.controls['email'].errors?.['email']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 3-->\n @if(getTypeForm().viewForms.countryCode.enabled){\n @if(countries$ | async; as countries){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'country'|translate}}\n @if(getTypeForm().viewForms.countryCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\n (change)=\"onCountrySelected($event, true)\">\n @for(country of countries; track $index){\n <option [value]=\"country.code\">{{ country.name }}</option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['countryCode'].touched &&\n checkoutFormFacturacion.controls['countryCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.provinceCode.enabled){\n @if(provinces$ | async; as provinces){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'state'|translate}}\n @if(getTypeForm().viewForms.provinceCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event, provinces, true)\" formControlName='provinceCode'>\n <option value=\"\">{{'select-state'|translate}}</option>\n @for(province of provinces; track $index){\n <option [value]=\"province.code\">{{ province.name }}\n </option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['provinceCode'].touched &&\n checkoutFormFacturacion.controls['provinceCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.city.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'town-city'|translate}}\n @if(getTypeForm().viewForms.city.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n formControlName='city' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['city'].touched &&\n checkoutFormFacturacion.controls['city'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 4-->\n @if(getTypeForm().viewForms.street.enabled){\n <div class=\"form-group col-12 col-md-8\">\n <label class=\"field-label\">{{'address'|translate}}\n @if(getTypeForm().viewForms.street.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['street'].touched &&\n checkoutFormFacturacion.controls['street'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['street'].touched &&\n checkoutFormFacturacion.controls['street'].errors?.['maxlength']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n\n <!-- form direcci\u00F3n -->\n @if(getTypeForm().viewForms.postcode.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'postal-code'|translate}}\n @if(getTypeForm().viewForms.postcode.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\n checkoutFormFacturacion.controls['postcode'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\n checkoutFormFacturacion.controls['postcode'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 5-->\n @if(getTypeForm().viewForms.documentType.enabled){\n @if(documentTypes$ | async; as documentTypes){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-type'|translate}}\n @if(getTypeForm().viewForms.documentType.required){\n <span class=\"required\">*</span>\n }</label>\n <select name=\"documentType\" class=\"form-select\"\n (change)=\"onDocumentTypesSelected($event, true)\" formControlName='documentType'>\n @for(item of documentTypes; track $index){\n <option [value]=\"item.code\">{{item.name}}</option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['documentType'].touched &&\n checkoutFormFacturacion.controls['documentType'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.documentNumber.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-number'|translate}}\n @if(getTypeForm().viewForms.documentNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['documentNumber'].touched &&\n checkoutFormFacturacion.controls['documentNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 6-->\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"field-label\">{{'notes'|translate}}\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n formControlName='notes' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(this.channel.checkoutNotesField == 'required' &&\n checkoutFormFacturacion.controls['notes'].touched &&\n checkoutFormFacturacion.controls['notes'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n </form>\n </div>\n </div>\n }\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-end\">\n <button type=\"submit\" class=\"btn btn-primary text-white\"\n [disabled]=\"checkoutForm.invalid || (this.channel.checkoutNotesField == 'required' && (!checkoutForm.get('notes')?.value || checkoutForm.get('notes')?.value.trim() === '')) || (!viewDataFacturacion && checkoutFormFacturacion && (checkoutFormFacturacion.invalid || (this.channel.checkoutNotesField == 'required' && (!checkoutFormFacturacion.get('notes')?.value || checkoutFormFacturacion.get('notes')?.value.trim() === ''))))\">{{(isLastOne\n ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\n </button>\n </div>\n </div>\n @if(loading){\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n }\n\n </form>\n</div>\n} @else {\n<div id=\"loginCheckout\">\n @if(require_login){\n <div class=\"d-flex flex-column justify-content-center align-items-center my-5 \">\n <div class=\"col-12 col-md-6 \">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n }\n</div>\n}\n} @else {\n@if(modeSelectAddress == 'ONLY_ADDRESS_SELECTION'){\n<div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n</div>\n}\n\n@if(this.addressBook){\n@if(this.addressBook?.length){\n<div class=\"container\">\n <div class=\"row\">\n @for(item of addressBook; track $index; let i = $index){\n <div class=\"col-sm-6 col-12 my-3\">\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\n [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\" (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong>\n {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong>\n {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n <div class=\"w-100\">\n @if(this.channel.checkoutNotesField == 'required' || this.channel.checkoutNotesField == 'show'){\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"form-label\">{{'notes'|translate}}\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"form-label\" [innerHTML]=\"labelnotes.value\">\n @if(this.channel.checkoutNotesField == 'required'){\n <span class=\"required\">*</span>\n }\n </label>\n }\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\n autocomplete=\"off\" [required]=\"this.channel.checkoutNotesField == 'required'\">\n @if(this.channel.checkoutNotesField == 'required' && ctrl.touched && ctrl.invalid){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'notes-help'|translate}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-end\">\n <button (click)=\"onSelectAddress(cartItems)\" class=\"btn btn-primary text-white\"\n [disabled]=\"loadingStep || (this.channel.checkoutNotesField == 'required' && (!this.addressBookSelected.notes || this.addressBookSelected.notes.trim() === ''))\">{{(isLastOne\n ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\n </button>\n\n </div>\n </div>\n @if(loading){\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n }\n</div>\n} @else {\n<div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n</div>\n}\n} @else {\n<div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n</div>\n}\n\n}\n\n}\n@else {\n<div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\n</div>\n}\n}\n@if(getTypeForm().viewForms.terms.enabled){\n<div class=\"modal fade\" id=\"terminos-y-condiciones\" tabindex=\"-1\" aria-labelledby=\"modalLabel\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-xl modal-dialog-scrollable\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\" id=\"modalLabel\">T\u00E9rminos y condiciones</h5>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n <app-blocks-ec [section]=\"'terminos-y-condiciones'\" />\n </div>\n </div>\n </div>\n</div>\n}" }]
314
316
  }], ctorParameters: () => [] });
315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvY2hlY2tvdXQtZWMvZGF0YWZvcm0tZWMvZGF0YWZvcm0tZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvY2hlY2tvdXQtZWMvZGF0YWZvcm0tZWMvZGF0YWZvcm0tZWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBYSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFvQixXQUFXLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BMLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7OztBQW9CeEUsTUFBTSxPQUFPLG1CQUFtQjtJQUVwQixlQUFlLEdBQW1CLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN6RCxZQUFZLEdBQWdCLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoRCxjQUFjLEdBQXNCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzlELFVBQVUsR0FBd0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDOUQsa0JBQWtCLEdBQXNCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xFLFlBQVksR0FBZ0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELGFBQWEsR0FBaUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ25ELFlBQVksR0FBZ0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELGdCQUFnQixHQUFvQixNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDNUQsWUFBWSxHQUFnQixNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFakQsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDO0lBQzlELFNBQVMsR0FBUSxFQUFFLENBQUE7SUFFbkIsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO0lBQ3pDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDbEQsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO0lBQzFDLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQztJQUNsRCxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQztJQUNoRCxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQztJQUVsRCxhQUFhLEdBQVksS0FBSyxDQUFDO0lBQy9CLE1BQU0sQ0FBTTtJQUNaLFdBQVcsR0FBUSxFQUFFLENBQUM7SUFDdEIsbUJBQW1CLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQTtJQUMxQyxVQUFVLEdBQVksS0FBSyxDQUFDO0lBQzVCLE9BQU8sR0FBWSxLQUFLLENBQUM7SUFDekIsYUFBYSxHQUFZLEtBQUssQ0FBQztJQUMvQixhQUFhLEdBQVksS0FBSyxDQUFDO0lBQy9CLFlBQVksQ0FBWTtJQUN4Qix1QkFBdUIsQ0FBWTtJQUNuQyxXQUFXLEdBQVEsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztJQUN2RCxTQUFTLEdBQVksS0FBSyxDQUFDO0lBQzNCLFdBQVcsR0FBWSxLQUFLLENBQUM7SUFDN0IsT0FBTyxDQUFNO0lBRUgsaUJBQWlCLEdBQUcsZUFBZSxDQUFDO0lBRTNDLDJCQUEyQixHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzdELDJCQUEyQixHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzdELCtCQUErQixHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO0lBRXBFLHFCQUFxQixHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4RSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEUseUJBQXlCLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBRWhGLG1CQUFtQixHQUFZLElBQUksQ0FBQztJQUNwQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRXhCO1FBQ0ksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUN4QyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxVQUFVLENBQUMsVUFBVTtZQUMvRCxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztTQUNwRixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWE7YUFDMUIsSUFBSSxDQUNELE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDekUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNuRCxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxVQUFVLENBQUMsV0FBVztZQUNoRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLG1FQUFtRTtTQUN4SixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYTthQUNyQyxJQUFJLENBQ0QsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BGLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBRXhFLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLDhFQUE4RTtRQUNwTixJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25HLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixJQUFJLDRCQUE0QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsSUFBSSx3QkFBd0IsQ0FBQztlQUM3SSxjQUFjLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNuRSxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFBO2dCQUNyQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3JELENBQUMsQ0FDQSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ3BELDRCQUE0QjtRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNsQyxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUMxQyxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3pELENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxPQUFZLEVBQUUsWUFBcUIsS0FBSztRQUN0RCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMxRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUV0RCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbEIseURBQXlEO1lBRXpELElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ1osV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJO2FBQzVCLENBQUMsQ0FBQztZQUVILG9DQUFvQztZQUNwQyxNQUFNLFNBQVMsR0FBRztnQkFDZCxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRTthQUNsQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0wsQ0FBQztJQUVELHNCQUFzQixDQUFDLFlBQWlCLEVBQUUsWUFBcUIsS0FBSztRQUNoRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMxRSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBRTVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZCLG9FQUFvRTtZQUVwRSxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNaLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSTthQUNsQyxDQUFDLENBQUM7WUFFSCxzREFBc0Q7WUFDdEQsTUFBTSxTQUFTLEdBQUc7Z0JBQ2QsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUU7YUFDdkMsQ0FBQztZQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNMLENBQUM7SUFDRCxlQUFlO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQzlDLENBQUM7SUFFRCxPQUFPO1FBQ0gsUUFBUSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM3QixLQUFLLG1CQUFtQjtnQkFDcEIsT0FBTyxJQUFJLENBQUE7WUFDZixLQUFLLHdCQUF3QjtnQkFDekIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7b0JBQ3RDLE9BQU8sS0FBSyxDQUFBO2dCQUNoQixDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFBO1lBQ2YsS0FBSyw0QkFBNEI7Z0JBQzdCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO29CQUN0QyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUE7Z0JBQzdCLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUE7UUFDbkIsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBWTtRQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksSUFBSSxPQUFPLENBQUE7SUFDeEMsQ0FBQztJQUVELDRCQUE0QixDQUFDLFNBQWlCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3ZJLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxhQUFrQjtRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsRUFBRSxLQUFLLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMxRixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNuRyxDQUFDO0lBQ0QsZUFBZSxDQUFDLEtBQVU7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMvRSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQztnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUN6RCxDQUFDO2dCQUNELE1BQU0sT0FBTyxHQUFHO29CQUNaLFFBQVEsRUFBRSxJQUFJLENBQUMsbUJBQW1CO29CQUNsQyxlQUFlLEVBQUUsZUFBZTtpQkFDbkMsQ0FBQTtnQkFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDaEQsR0FBRyxDQUFDLEVBQUU7b0JBQ0YsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDaEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFOzRCQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dDQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDOzRCQUNsUixDQUFDO3dCQUNMLENBQUMsQ0FBQyxDQUFBO29CQUNOLENBQUM7b0JBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUMxQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLENBQUMsQ0FDSixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUUvRCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1lBQUMsQ0FBQztRQUM5RCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDbEMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFFOUMsVUFBVSxDQUFDLElBQVMsSUFBSSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFBLENBQUMsQ0FBQztJQUVsTCxXQUFXLENBQUMsSUFBUyxJQUFJLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFFckgsZUFBZSxDQUFDLElBQVMsSUFBSSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUEsQ0FBQyxDQUFDO0lBRTFILGtCQUFrQixLQUFLLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUVqSyxjQUFjLENBQUMsTUFBVztRQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUIsc0ZBQXNGO1lBQ3RGLGFBQWE7WUFDYixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsQ0FBQzs7WUFDRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxTQUFTLEdBQUcsQ0FBQyxhQUFrQixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRWxGLFVBQVUsR0FBRyxLQUFLLElBQUksRUFBRTtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLElBQUksR0FBUSxFQUFFLGVBQWUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pMLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUs7WUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDdkssSUFBSSxDQUFDO1lBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTVELElBQUksTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtZQUMxRSxDQUFDO2lCQUNJLElBQUksTUFBTSxLQUFLLEtBQUssSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2hELDREQUE0RDtnQkFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7Z0JBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO2dCQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDZixDQUFDO1FBRUwsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDLENBQUE7SUFFUyxZQUFZO1FBQ2xCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7Z0JBQ3BCLE9BQU07WUFDVixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7Z0JBQ3BCLE9BQU07WUFDVixDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO0lBQ3pCLENBQUM7SUFFRCxXQUFXLEdBQUcsR0FBRyxFQUFFO0lBQ25CLENBQUMsQ0FBQTtJQUVEOzs7T0FHRztJQUNILGlCQUFpQixHQUFHLENBQUMsS0FBVSxFQUFFLFVBQW1CLEtBQUssRUFBRSxFQUFFO1FBQ3pELE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQy9CLDRDQUE0QztRQUM1QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN4RSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQywwSEFBMEg7UUFDMUgsSUFBSSxLQUFLLElBQUksRUFBRSxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDLENBQUE7SUFDRDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsS0FBVSxFQUFFLFNBQWMsRUFBRSxVQUFtQixLQUFLO1FBQ3BFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RSxvSEFBb0g7SUFDeEgsQ0FBQztJQUNELHVCQUF1QixDQUFDLEtBQVUsRUFBRSxVQUFtQixLQUFLO1FBQ3hELE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO1FBQzlCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsbUJBQW1CLEdBQUcsR0FBRyxFQUFFO1FBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQTtRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdkMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUMxRSwrREFBK0Q7b0JBQy9ELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO29CQUNsRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQTtvQkFDeEQsbUNBQW1DO29CQUNuQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtvQkFDM0QsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUE7Z0JBQ3BFLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDbkIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUE7SUFDbkMsQ0FBQyxDQUFBO0lBRUQsSUFBSTtRQUNBLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNoQyxDQUFDO3dHQTNUUSxtQkFBbUI7NEZBQW5CLG1CQUFtQiwyRUNoQ2hDLG94L0NBZzJCQywwREQ5MEJPLFVBQVUsbU9BQ1YsbUJBQW1CLGk4REFDbkIsV0FBVyx1UEFDWCxvQkFBb0IsK0hBQ3BCLGVBQWUsdUZBQ2YsU0FBUyx5Q0FDVCxhQUFhLGtEQUNiLHNCQUFzQixnRUFFdEIsaUJBQWlCOzs0RkFLWixtQkFBbUI7a0JBbEIvQixTQUFTOytCQUNJLGlCQUFpQixjQUNmLElBQUksV0FDUDt3QkFDTCxVQUFVO3dCQUNWLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxvQkFBb0I7d0JBQ3BCLGVBQWU7d0JBQ2YsU0FBUzt3QkFDVCxhQUFhO3dCQUNiLHNCQUFzQjt3QkFDdEIsUUFBUTt3QkFDUixpQkFBaUI7cUJBQ3BCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IExvZ2luRm9ybUVjQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXV0aC1lYyc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBBZGRyZXNzaW5nU2VydmljZSwgQW5hbHl0aWNzU2VydmljZSwgQXV0aFNlcnZpY2UsIENhcnRTZXJ2aWNlLCBDaGFubmVsU2VydmljZSwgQ2hlY2tvdXRTZXJ2aWNlLCBGb3JtU2VydmljZSwgUGFyYW1ldGVyc1NlcnZpY2UsIFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzJztcclxuaW1wb3J0IHsgQXN5bmNQaXBlLCBKc29uUGlwZSwgVGl0bGVDYXNlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEFwaUNvbnN0YW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBMb2FkaW5nRnVsbEVjQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vd2lkZ2V0cy1lYyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZmlsdGVyLCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwaSc7XHJcbmltcG9ydCB7IElucHV0RWNDb21wb25lbnQgfSBmcm9tICcuL2lucHV0LWVjL2lucHV0LWVjLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEJsb2Nrc0VjQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2Jsb2Nrcy1lYy9ibG9ja3MtZWMuY29tcG9uZW50XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXBwLWRhdGFmb3JtLWVjJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgUm91dGVyTGluayxcclxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgICAgIExvZ2luRm9ybUVjQ29tcG9uZW50LFxyXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgICAgICBBc3luY1BpcGUsXHJcbiAgICAgICAgVGl0bGVDYXNlUGlwZSxcclxuICAgICAgICBMb2FkaW5nRnVsbEVjQ29tcG9uZW50LFxyXG4gICAgICAgIEpzb25QaXBlLFxyXG4gICAgICAgIEJsb2Nrc0VjQ29tcG9uZW50XHJcbiAgICBdLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGFmb3JtLWVjLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsOiAnLi9kYXRhZm9ybS1lYy5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFmb3JtRWNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIHByaXZhdGUgX2NoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSA9IGluamVjdChDaGFubmVsU2VydmljZSk7XHJcbiAgICBwcml2YXRlIF9hdXRoU2VydmljZTogQXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSBfcGFyYW1zU2VydmljZTogUGFyYW1ldGVyc1NlcnZpY2UgPSBpbmplY3QoUGFyYW1ldGVyc1NlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSBfYXBpQ29uc3RzOiBBcGlDb25zdGFudHNTZXJ2aWNlID0gaW5qZWN0KEFwaUNvbnN0YW50c1NlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSBfYWRkcmVzc2luZ1NlcnZpY2U6IEFkZHJlc3NpbmdTZXJ2aWNlID0gaW5qZWN0KEFkZHJlc3NpbmdTZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgX2NhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSA9IGluamVjdChDYXJ0U2VydmljZSk7XHJcbiAgICBwcml2YXRlIF90b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSBfZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlID0gaW5qZWN0KEZvcm1TZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgX2NoZWNrb3V0U2VydmljZTogQ2hlY2tvdXRTZXJ2aWNlID0gaW5qZWN0KENoZWNrb3V0U2VydmljZSk7XHJcbiAgICBwcml2YXRlIF9mb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIgPSBpbmplY3QoRm9ybUJ1aWxkZXIpO1xyXG5cclxuICAgIHB1YmxpYyBtb2RlU2VsZWN0QWRkcmVzcyA9IHRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzO1xyXG4gICAgcHVibGljIGNhcnRJdGVtczogYW55ID0gW11cclxuXHJcbiAgICBwdWJsaWMgY2hhbm5lbCQgPSB0aGlzLl9jaGFubmVsU2VydmljZS5jaGFubmVsJDtcclxuICAgIHB1YmxpYyBjb3VudHJpZXMkID0gdGhpcy5fZm9ybVNlcnZpY2UuZ2V0Q291bnRyaWVzRGF0YSgpO1xyXG4gICAgcHVibGljIHByb3ZpbmNlcyQgPSB0aGlzLl9mb3JtU2VydmljZS5wcm92aW5jZXMkO1xyXG4gICAgcHVibGljIGRvY3VtZW50VHlwZXMkID0gdGhpcy5fZm9ybVNlcnZpY2UuZG9jdW1lbnRUeXBlcyQ7XHJcbiAgICBwdWJsaWMgaXNMYXN0U3RlcCQgPSB0aGlzLl9jaGVja291dFNlcnZpY2UuaXNMYXN0U3RlcCQ7XHJcbiAgICBwdWJsaWMgbG9hZGluZ1N0ZXAkID0gdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmxvYWRpbmdTdGVwJDtcclxuXHJcbiAgICBwdWJsaWMgc2VsZWN0QWRkcmVzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHBhcmFtczogYW55O1xyXG4gICAgcHVibGljIGFkZHJlc3NCb29rOiBhbnkgPSBbXTtcclxuICAgIHB1YmxpYyBhZGRyZXNzQm9va1NlbGVjdGVkID0geyBpZDogMCwgbm90ZXM6IFwiXCIgfVxyXG4gICAgcHVibGljIGZvcm1fcmVhZHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgYWxscmVhZHlfZGF0YTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHJlcXVpcmVfbG9naW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBjaGVja291dEZvcm06IEZvcm1Hcm91cDtcclxuICAgIHB1YmxpYyBjaGVja291dEZvcm1GYWN0dXJhY2lvbjogRm9ybUdyb3VwO1xyXG4gICAgcHVibGljIGdldFR5cGVGb3JtOiBhbnkgPSB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybTtcclxuICAgIHB1YmxpYyBpc0xhc3RPbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBsb2FkaW5nU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNoYW5uZWw6IGFueTtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvc3RhbENvZGVQYXR0ZXJuID0gJ15bMC05XVswLTldKiQnO1xyXG5cclxuICAgIHByb3RlY3RlZCBjb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XHJcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xyXG4gICAgcHJvdGVjdGVkIGRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XHJcblxyXG4gICAgcHVibGljIGNvdW50cmllc0ZhY3R1cmFjaW9uJCA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHVibGljIHByb3ZpbmNlc0ZhY3R1cmFjaW9uJCA9IHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHVibGljIGRvY3VtZW50VHlwZXNGYWN0dXJhY2lvbiQgPSB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgcHVibGljIHZpZXdEYXRhRmFjdHVyYWNpb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIHZhbGlkYWRvID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0gPSB0aGlzLl9mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCk/LmNvbmZpZ0Zvcm0uZm9ybUFkZHJlcyxcclxuICAgICAgICAgICAgcG9zdGNvZGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybih0aGlzLnBvc3RhbENvZGVQYXR0ZXJuKV1dXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5zdGF0dXNDaGFuZ2VzXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkIH0pKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gPSB0aGlzLl9mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCk/LmNvbmZpZ0Zvcm0uZm9ybUJpbGxpbmcsXHJcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4odGhpcy5wb3N0YWxDb2RlUGF0dGVybildXSAvLyBTZSBhZ3JlZ2EgcGFyYSBxdWUgc8OzbG8gYWNlcHRlIGPDs2RpZ29zIHBvc3RhbGVzIG1heW9yZXMgcXVlIGNlcm9cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnN0YXR1c0NoYW5nZXNcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4geyB0aGlzLm9uRm9ybUNoYW5nZSgpOyByZXR1cm4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCB9KSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xyXG4gICAgICAgIHRoaXMuaXNMYXN0U3RlcCQuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmlzTGFzdE9uZSA9IHJlcyk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RlcCQuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmxvYWRpbmdTdGVwID0gcmVzKTtcclxuICAgICAgICB0aGlzLmNoYW5uZWwkLnN1YnNjcmliZShyZXMgPT4gdGhpcy5jaGFubmVsID0gcmVzKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wYXJhbXNTZXJ2aWNlLmdldFBhcmFtZXRlcnMoKS5zdWJzY3JpYmUocGFyYW1zID0+IHRoaXMucGFyYW1zID0gcGFyYW1zKTtcclxuICAgICAgICB0aGlzLl9jYXJ0U2VydmljZS5jYXJ0SXRlbXMkLnN1YnNjcmliZShpdGVtcyA9PiB0aGlzLmNhcnRJdGVtcyA9IGl0ZW1zKTtcclxuXHJcbiAgICAgICAgdGhpcy5fYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUodGhpcy5fYXV0aFNlcnZpY2UuZ2V0VXNlclByb2ZpbGVBc1VzZXIoKT8uZW1haWwpOyAvLy0tPiBlc3RvIGVzIG1vbWVudGFuZW8gaGFzdGEgcXVlIGVtcGllY2UgYSB0cmFiYWphciBjb24gU2VsbGVyIHkgQ3VzdG9tZXIuICBcclxuICAgICAgICB0aGlzLl9hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXQoJ2VtYWlsJyk/LmRpc2FibGUoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcclxuICAgICAgICAodGhpcy5fYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MgPT0gJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJyB8fCB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcyA9PSAnT05MWV9BRERSRVNTX1NFTEVDVElPTicpXHJcbiAgICAgICAgICAgICYmIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLmdldEFkZHJlc3NCb29rKCkpLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSByZXMgJiYgcmVzIHx8IG51bGxcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPT0gbnVsbCAmJiB0aGlzLnNldE1vZGUoJ2NhcmdhJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApLmNhdGNoKGVyciA9PiBjb25zb2xlLmVycm9yKGVyci5lcnJvci5tZXNzYWdlKSlcclxuICAgICAgICAvLyBQYXJhIGZvcm11bGFyaW8gcHJpbmNpcGFsXHJcbiAgICAgICAgdGhpcy5jb3VudHJpZXMkLnN1YnNjcmliZShjb3VudHJpZXMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY291bnRyaWVzICYmIGNvdW50cmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRDb3VudHJ5KGNvdW50cmllc1swXSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUGFyYSB0aXBvcyBkZSBkb2N1bWVudG8gZGVsIGZvcm11bGFyaW8gcHJpbmNpcGFsXHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzJC5zdWJzY3JpYmUoZG9jdW1lbnRUeXBlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudFR5cGVzICYmIGRvY3VtZW50VHlwZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0RG9jdW1lbnRUeXBlKGRvY3VtZW50VHlwZXNbMF0sIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2V0RGVmYXVsdENvdW50cnkoY291bnRyeTogYW55LCBpc0JpbGxpbmc6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IGZvcm0gPSBpc0JpbGxpbmcgPyB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uIDogdGhpcy5jaGVja291dEZvcm07XHJcbiAgICAgICAgY29uc3QgY3VycmVudENvdW50cnkgPSBmb3JtLmdldCgnY291bnRyeUNvZGUnKT8udmFsdWU7XHJcblxyXG4gICAgICAgIGlmICghY3VycmVudENvdW50cnkpIHtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ1NldHRpbmcgZGVmYXVsdCBjb3VudHJ5OicsIGNvdW50cnkubmFtZSk7XHJcblxyXG4gICAgICAgICAgICBmb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICAgICAgY291bnRyeUNvZGU6IGNvdW50cnkuY29kZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIENhcmdhciBwcm92aW5jaWFzIGF1dG9tw6F0aWNhbWVudGVcclxuICAgICAgICAgICAgY29uc3QgZmFrZUV2ZW50ID0ge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB7IHZhbHVlOiBjb3VudHJ5LmNvZGUgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLm9uQ291bnRyeVNlbGVjdGVkKGZha2VFdmVudCwgaXNCaWxsaW5nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGVmYXVsdERvY3VtZW50VHlwZShkb2N1bWVudFR5cGU6IGFueSwgaXNCaWxsaW5nOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBmb3JtID0gaXNCaWxsaW5nID8gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbiA6IHRoaXMuY2hlY2tvdXRGb3JtO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnREb2N1bWVudFR5cGUgPSBmb3JtLmdldCgnZG9jdW1lbnRUeXBlJyk/LnZhbHVlO1xyXG5cclxuICAgICAgICBpZiAoIWN1cnJlbnREb2N1bWVudFR5cGUpIHtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ1NldHRpbmcgZGVmYXVsdCBkb2N1bWVudCB0eXBlOicsIGRvY3VtZW50VHlwZS5uYW1lKTtcclxuXHJcbiAgICAgICAgICAgIGZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudFR5cGU6IGRvY3VtZW50VHlwZS5jb2RlXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gT3BjaW9uYWw6IGRpc3BhcmFyIGVsIGV2ZW50byBjaGFuZ2Ugc2kgZXMgbmVjZXNhcmlvXHJcbiAgICAgICAgICAgIGNvbnN0IGZha2VFdmVudCA9IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldDogeyB2YWx1ZTogZG9jdW1lbnRUeXBlLmNvZGUgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKGZha2VFdmVudCwgaXNCaWxsaW5nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TW9kZSgpIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMubW9kZVNlbGVjdEFkZHJlc3MpIHtcclxuICAgICAgICAgICAgY2FzZSAnT05MWV9MT0FEX0FERFJFU1MnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgICAgIGNhc2UgJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJzpcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEFkZHJlc3NcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldE1vZGUobW9kZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzID0gbW9kZSA9PSBcImNhcmdhXCJcclxuICAgIH1cclxuXHJcbiAgICBnZXRQYXJhbUJ5Q2hhbm5lbEFuZExhbmd1YWdlKG5hbWVQYXJhbTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtc1NlcnZpY2UuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCBuYW1lUGFyYW0gKyB0aGlzLl9hcGlDb25zdHMuQ0hBTk5FTCArICdfJyArIHRoaXMuX2FwaUNvbnN0cy5MT0NBTEUuc3BsaXQoJ18nKVswXSlcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RBZGRyZXNzKGFkZHJlc3NTZWxlY3Q6IGFueSkgeyAgXHJcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9vay5tYXAoKGFkZHJlc3M6IGFueSkgPT4gYWRkcmVzcy5zZWxlY3RlZCA9IGFkZHJlc3MuaWQgPT09IGFkZHJlc3NTZWxlY3QuaWQpXHJcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKChhZGRyZXNzOiBhbnkpID0+IGFkZHJlc3Muc2VsZWN0ZWQpLmlkIHx8IDBcclxuICAgIH1cclxuICAgIG9uU2VsZWN0QWRkcmVzcyhpdGVtczogYW55KSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBsZXQgYWRkcmVzc1NlbGVjdGVkID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKChhZGRyZXNzOiBhbnkpID0+IGFkZHJlc3Muc2VsZWN0ZWQpXHJcbiAgICAgICAgaWYgKGFkZHJlc3NTZWxlY3RlZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBhZGRyZXNzU2VsZWN0ZWQuaWQgfHwgMFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzczogYWRkcmVzc1NlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlcihyZXF1ZXN0KS50aGVuKFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5sb3RbMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FydFNlcnZpY2UuYWRkVG9Mb3QoaXRlbS5wcm9kdWN0LCAwLCBpdGVtLnZhcmlhbnRfaWQsIDAsIGl0ZW0uaXRlbV9pZCwgaXRlbS5xdWFudGl0eSwgaXRlbS5wcm9kdWN0LnByaWNlLCBpdGVtLnF1YW50aXR5LCBpdGVtLmRpc2NvdW50LCBpdGVtLnByb2R1Y3QucHJpY2UgKiBpdGVtLnF1YW50aXR5LCAnbmV3JywgJycsICcnLCAwLCByZXMuc2hpcHBpbmdBZGRyZXNzLmNpdHkgKyAnIC0gJyArIHJlcy5zaGlwcGluZ0FkZHJlc3Muc3RyZWV0LCAnbmV3bG90Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApLmNhdGNoKGVyciA9PiB0aGlzLl90b2FzdFNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yJykpO1xyXG5cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyB0aGlzLl90b2FzdFNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yJykgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvbklucHV0Q2hhbmdlID0gKCkgPT4gdGhpcy5mb3JtX3JlYWR5ID0gZmFsc2U7XHJcblxyXG4gICAgZ2V0Q291bnRyeShjb2RlOiBhbnkpIHsgcmV0dXJuIHRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLmNvdW50cmllc0xpc3QuZmluZCgoY291bnRyaWVzOiBhbnkpID0+IGNvdW50cmllcy5jb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk/Lm5hbWUgfHwgXCJcIiB9XHJcblxyXG4gICAgZ2V0UHJvdmluY2UoY29kZTogYW55KSB7IHJldHVybiB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5wcm92aW5jZUxpc3QuZmluZCgoY3Q6IGFueSkgPT4gY3QuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiIH1cclxuXHJcbiAgICBnZXREb2N1bWVudFR5cGUoY29kZTogYW55KSB7IHJldHVybiB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5kb2N1bWVudFR5cGVzLmZpbmQoKGR0OiBhbnkpID0+IGR0LmNvZGUgPT0gY29kZSk/Lm5hbWUgfHwgXCJcIiB9XHJcblxyXG4gICAgZ2V0TGFiZWxOb3Rlc1BhcmFtKCkgeyByZXR1cm4gdGhpcy5fcGFyYW1zU2VydmljZS5oYXNQYXJhbXModGhpcy5wYXJhbXMsICdsYWJlbF9ub3Rlc18nICsgdGhpcy5fYXBpQ29uc3RzLkNIQU5ORUwgKyAnXycgKyB0aGlzLl9hcGlDb25zdHMuTE9DQUxFLnNwbGl0KCdfJylbMF0pIH1cclxuXHJcbiAgICB2ZXJpZnlWYWxpZGF0ZSgkZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICAvLyBBY2EgZGVibyByZXNvbHZlciBlbCBmb3JtdWxhcmlvIHkgdW5hIHZleiBlc3RlIHRvZG8gb2sgZGVibyBhdmlzYXIgYWwgb2JzZXJ2YWJsZSBkZVxyXG4gICAgICAgICAgICAvLyBsb3Mgc3RlcHMuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc3VsdCgpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XHJcbiAgICB9XHJcbiAgICBzaG93RXJyb3IgPSAoZXJyb3JfbWVzc2FnZTogYW55KSA9PiB7IHRoaXMuX3RvYXN0U2VydmljZS5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBlbWl0UmVzdWx0ID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IHsgc2hpcHBpbmdBZGRyZXNzOiB7IC4uLnRoaXMuY2hlY2tvdXRGb3JtLmdldFJhd1ZhbHVlKCksIHBob25lTnVtYmVyOiB0aGlzLmNoZWNrb3V0Rm9ybS52YWx1ZS5waG9uZU51bWJlci50b1N0cmluZygpIH0sIG5vdGVzOiAodGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSkubm90ZXMgfTtcclxuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSBkYXRhID0geyAuLi5kYXRhLCBub3RlczogZGF0YS5ub3RlcywgYmlsbGluZ0FkZHJlc3M6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5zZXRBZGRyZXNzKGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZV9sb2dpbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b2FzdFNlcnZpY2Uuc2hvdygnRWwgZW1haWwgeWEgZXN0w6EgcmVnaXN0cmFkbywgaW5pY2llIHNlc2nDs24uJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT09IGZhbHNlICYmIHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvL09qbyBxdWUgbG8gZWRpdG8sIG5vIGhpem8gdW5hIGNvbXByYSBudWV2YSwgYXRlbnRpIGEgZXN0by5cclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWVcclxuICAgICAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWVcclxuICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB0aGlzLl90b2FzdFNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yJykgfVxyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkZvcm1DaGFuZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYWRvID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52YWxpZGFkbyA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgb25Gb3JtVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXB0dXJhIGVsIGV2ZW50byBkZSBjdWFuZG8gY2FtYmlhIHVuIHBhaXMgZW4gZWwgYDxzZWxlY3Q+YFxyXG4gICAgICogQHBhcmFtIGV2ZW50IFxyXG4gICAgICovXHJcbiAgICBvbkNvdW50cnlTZWxlY3RlZCA9IChldmVudDogYW55LCBiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpID0+IHtcclxuICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgLy8kKCcjc2VsZWN0T3BQYWlzJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICBjb25zdCBmb3JtID0gYmlsbGluZyA/IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gOiB0aGlzLmNoZWNrb3V0Rm9ybTtcclxuICAgICAgICBmb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICBmb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZSgnJyk7XHJcbiAgICAgICAgLy92YWx1ZSAhPSAnJyAmJiB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dCh0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkucHJvdmluY2VzKTtcclxuICAgICAgICBpZiAodmFsdWUgIT0gJycgfHwgdmFsdWUgIT0gJ251bGwnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1TZXJ2aWNlLm9uQ291bnRyeVNlbGVjdGVkKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhcHR1cmEgZWwgZXZlbnRvIGRlIGN1YW5kbyBjYW1iaWEgdW5hIHByb3ZpbmNpYS9lc3RhZG8gZW4gZWwgYDxzZWxlY3Q+YFxyXG4gICAgICogQHBhcmFtIGV2ZW50IFxyXG4gICAgICogQHBhcmFtIHByb3ZpbmNlcyBsaXN0YSBkZSBwcm92aW5jaWFzIHBhcmEgb2J0ZW5lciBlbCBub21icmUgZGUgbGEgc2VsZWNjaW9uYWRhLlxyXG4gICAgICovXHJcbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkKGV2ZW50OiBhbnksIHByb3ZpbmNlczogYW55LCBiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgY29uc3QgZm9ybSA9IGJpbGxpbmcgPyB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uIDogdGhpcy5jaGVja291dEZvcm07XHJcbiAgICAgICAgcmV0dXJuIGZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XHJcbiAgICAgICAgLyogcmV0dXJuIGZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlTmFtZSddLnNldFZhbHVlKHByb3ZpbmNlcy5maW5kKChwcm92aW5jZTogYW55KSA9PiBwcm92aW5jZS5jb2RlID09IHZhbHVlKS5uYW1lKTsgKi9cclxuICAgIH1cclxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKGV2ZW50OiBhbnksIGJpbGxpbmc6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGV2ZW50LnRhcmdldFxyXG4gICAgICAgIGNvbnN0IGZvcm0gPSBiaWxsaW5nID8gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbiA6IHRoaXMuY2hlY2tvdXRGb3JtO1xyXG4gICAgICAgIHJldHVybiBmb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnJyA/ICcnIDogdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgc2hvd0Zvcm1GYWN0dXJhY2lvbiA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPSAhdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXHJcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvbiQuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShyZXNbMF0uY29kZSlcclxuICAgICAgICAgICAgICAgICAgICAvLyBQcm92aW5jaWEgLSBObyBzZWxlY2Npb25hciBhdXRvbcOhdGljYW1lbnRlIG5pbmd1bmEgcHJvdmluY2lhXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUoJycpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcclxuICAgICAgICAgICAgICAgICAgICAvLyBEb2N1bWVudG8gLSBVc2FyIGVsIG51ZXZvIG3DqXRvZG9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHREb2N1bWVudFR5cGUocmVzWzBdPy5kb2N1bWVudFR5cGVzWzBdLCB0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHJlc1swXT8uZG9jdW1lbnRUeXBlcylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkZvcm1DaGFuZ2UoKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb25cclxuICAgIH1cclxuXHJcbiAgICBuZXh0KCkge1xyXG4gICAgICAgIHRoaXMuX2NoZWNrb3V0U2VydmljZS5uZXh0KClcclxuICAgIH1cclxuXHJcbn1cclxuIiwiQGlmKGNoYW5uZWwkIHwgYXN5bmM7IGFzIGNoYW5uZWxDb25maWcpe1xyXG5AaWYoY2hhbm5lbENvbmZpZy5jaGFubmVsVHlwZSAhPSAnYjJiJyB8fCAoY2hhbm5lbENvbmZpZy5jaGFubmVsVHlwZSA9PSAnYjJiJyAmJiBpc0F1dGhlbnRpY2F0ZWQoKSkpe1xyXG5AaWYoIG1vZGVTZWxlY3RBZGRyZXNzID09ICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTicgJiYgaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5hZGRyZXNzQm9vayAhPSBudWxsKXtcclxuPCEtLVNlbGVjdG9yIGRlIG1vZG9zLS0+XHJcbjxkaXYgY2xhc3M9XCJjb250YWluZXIgY2FyZCBwLTQgbWItM1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtMTAgY29sLWxnLTggdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtdG9nZ2xlXCIgZGF0YS1icy10b2dnbGU9XCJidXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzXT1cIididG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5ICcgKyAoIWdldE1vZGUoKSA/ICdhY3RpdmUnIDogJycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJvcHRpb25zXCIgaWQ9XCJvcHRpb24xXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2hlY2tlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldE1vZGUoJ3NlbGVjY2lvbicpXCI+IHt7J3NlbGVjdC1hZGRyZXNzJyB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZX19XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgQGlmKCFnZXRQYXJhbUJ5Q2hhbm5lbEFuZExhbmd1YWdlKCdidG5fbmV3X2FkZHJlc3NfJykpe1xyXG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzc109XCInYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSAnICsgKGdldE1vZGUoKSA/ICdhY3RpdmUnIDogJycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJvcHRpb25zXCIgaWQ9XCJvcHRpb24yXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGNoYW5nZSk9XCJzZXRNb2RlKCdjYXJnYScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgJ25ldy1hZGRyZXNzJyB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZX19XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgQGlmKGdldFBhcmFtQnlDaGFubmVsQW5kTGFuZ3VhZ2UoJ2J0bl9uZXdfYWRkcmVzc18nKTsgYXMgcGFyYW0pe1xyXG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzc109XCInYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSAnICsgKHNlbGVjdEFkZHJlc3MgPyAnYWN0aXZlJyA6ICcnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwib3B0aW9uc1wiIGlkPVwib3B0aW9uMlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChjaGFuZ2UpPVwic2V0TW9kZSgnY2FyZ2EnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHBhcmFtLnZhbHVlfX1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG59XHJcblxyXG5AaWYoZ2V0TW9kZSgpKXtcclxuQGlmKCFyZXF1aXJlX2xvZ2luKXtcclxuPGRpdj5cclxuICAgIEBpZihtb2RlU2VsZWN0QWRkcmVzcyA9PSAnT05MWV9MT0FEX0FERFJFU1MnKXtcclxuICAgIDxkaXYgY2xhc3M9XCJjaGVja291dC10aXRsZSAgbXktMlwiPlxyXG4gICAgICAgIDxoMz57eydiaWxsaW5nLWRldGFpbHMnfHRyYW5zbGF0ZX19PC9oMz5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPCEtLUZvcm11bGFyaW8tLT5cclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY2hlY2tvdXRGb3JtXCIgKHN1Ym1pdCk9XCJ2ZXJpZnlWYWxpZGF0ZSgkZXZlbnQpXCI+IDwhLS0gLy90aGlzLmNhcnRTZXJ2aWNlLml0ZW1zIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPjwhLS1GaWxhIDEtLT5cclxuXHJcbiAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5maXJzdE5hbWUuZW5hYmxlZCl7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLVNpIGVzIHJlcXVpcmVkLS0+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snZmlyc3QtbmFtZSd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZmlyc3ROYW1lLnJlcXVpcmVkKXtcclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPCEtLUlucHV0LS0+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJmaXJzdE5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJmaXJzdE5hbWVcIiB2YWx1ZT1cIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZmlyc3ROYW1lJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eydmaXJzdC1uYW1lLWhlbHAxJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPCEtLUVycm9yIGluZm8tLT5cclxuICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZmlyc3ROYW1lJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydmaXJzdC1uYW1lLWhlbHAyJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubGFzdE5hbWUuZW5hYmxlZCl7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J2xhc3QtbmFtZSd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubGFzdE5hbWUucmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJsYXN0TmFtZVwiIGZvcm1Db250cm9sTmFtZT1cImxhc3ROYW1lXCIgdmFsdWU9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydsYXN0TmFtZSddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snbGFzdE5hbWUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2xhc3QtbmFtZS1oZWxwMSd8dHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2xhc3ROYW1lJ10udG91Y2hlZCAmJiBjaGVja291dEZvcm0uY29udHJvbHNbJ2xhc3ROYW1lJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2xhc3QtbmFtZS1oZWxwMid8dHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTJcIj48IS0tRmlsYSAyLS0+XHJcbiAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5waG9uZU51bWJlci5lbmFibGVkKXtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sncGhvbmUnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnBob25lTnVtYmVyLnJlcXVpcmVkKXtcclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJwaG9uZU51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdwaG9uZU51bWJlcicgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1sncGhvbmVOdW1iZXInXS50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICBjaGVja291dEZvcm0uY29udHJvbHNbJ3Bob25lTnVtYmVyJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sncGhvbmUtaGVscDEnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwaG9uZU51bWJlciddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1sncGhvbmVOdW1iZXInXS5lcnJvcnM/LlsncGF0dGVybiddKXtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J3Bob25lLWhlbHAyJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZW1haWwuZW5hYmxlZCl7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J2VtYWlsLWFkZHJlc3MnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmVtYWlsLnJlcXVpcmVkKXtcclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB9PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJlbWFpbFwiIG5hbWU9XCJlbWFpbFwiIGZvcm1Db250cm9sTmFtZT0nZW1haWwnIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS50b3VjaGVkICYmIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydlbWFpbC1hZGRyZXNzLWhlbHAxJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS50b3VjaGVkICYmIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5lcnJvcnM/LlsnZW1haWwnXSl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydlbWFpbC1hZGRyZXNzLWhlbHAyJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPjwhLS1GaWxhIDMtLT5cclxuICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmNvdW50cnlDb2RlLmVuYWJsZWQpe1xyXG4gICAgICAgICAgICBAaWYoY291bnRyaWVzJCB8IGFzeW5jOyBhcyBjb3VudHJpZXMpe1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydjb3VudHJ5J3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5jb3VudHJ5Q29kZS5yZXF1aXJlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBuYW1lPVwiY291bnRyeUNvZGVcIiBmb3JtQ29udHJvbE5hbWU9J2NvdW50cnlDb2RlJ1xyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Db3VudHJ5U2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEBmb3IoY291bnRyeSBvZiBjb3VudHJpZXM7IHRyYWNrICRpbmRleCl7XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiY291bnRyeS5jb2RlXCI+e3sgY291bnRyeS5uYW1lIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCB0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J2NvdW50cnktaGVscCd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5wcm92aW5jZUNvZGUuZW5hYmxlZCl7XHJcbiAgICAgICAgICAgIEBpZihwcm92aW5jZXMkIHwgYXN5bmM7IGFzIHByb3ZpbmNlcyl7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J3N0YXRlJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5wcm92aW5jZUNvZGUucmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgbmFtZT1cInByb3ZpbmNlQ29kZVwiIChjaGFuZ2UpPVwib25Qcm92aW5jZXNTZWxlY3RlZCgkZXZlbnQsIHByb3ZpbmNlcylcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0ncHJvdmluY2VDb2RlJz5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3snc2VsZWN0LXN0YXRlJ3x0cmFuc2xhdGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIEBmb3IocHJvdmluY2Ugb2YgcHJvdmluY2VzOyB0cmFjayAkaW5kZXgpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInByb3ZpbmNlLmNvZGVcIj57eyBwcm92aW5jZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICBjaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IHRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snc3RhdGUtaGVscCd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5jaXR5LmVuYWJsZWQpe1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyd0b3duLWNpdHknfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmNpdHkucmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJjaXR5XCIgZm9ybUNvbnRyb2xOYW1lPSdjaXR5J1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXS50b3VjaGVkICYmIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snY2l0eSddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3sndG93bi1jaXR5LWhlbHAnfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC1kZlwiPjwhLS1GaWxhIDQtLT5cclxuICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnN0cmVldC5lbmFibGVkKXtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC04XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J2FkZHJlc3MnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnN0cmVldC5yZXF1aXJlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwic3RyZWV0XCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J3N0cmVldCcgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J10udG91Y2hlZCAmJiBjaGVja291dEZvcm0uY29udHJvbHNbJ3N0cmVldCddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snYWRkcmVzcy1oZWxwMSd8dHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ3N0cmVldCddLnRvdWNoZWQgJiYgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydzdHJlZXQnXS5lcnJvcnM/LlsnbWF4bGVuZ3RoJ10pe1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eydhZGRyZXNzLWhlbHAyJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgPCEtLSBmb3JtIGRpcmVjY2nDs24gLS0+XHJcbiAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5wb3N0Y29kZS5lbmFibGVkKXtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J3Bvc3RhbC1jb2RlJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5wb3N0Y29kZS5yZXF1aXJlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInBvc3Rjb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J3Bvc3Rjb2RlJyB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwb3N0Y29kZSddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1sncG9zdGNvZGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J3Bvc3RhbC1jb2RlLWhlbHAnfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwb3N0Y29kZSddLnRvdWNoZWQgJiYgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwb3N0Y29kZSddLmVycm9ycz8uWydwYXR0ZXJuJ10pe1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4ge3sncG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvcicgfCB0cmFuc2xhdGV9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+PCEtLUZpbGEgNS0tPlxyXG4gICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnRUeXBlLmVuYWJsZWQpe1xyXG4gICAgICAgICAgICBAaWYoZG9jdW1lbnRUeXBlcyQgfCBhc3luYzsgYXMgZG9jdW1lbnRUeXBlcyl7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eydkb2N1bWVudC10eXBlJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudFR5cGUucmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwiZG9jdW1lbnRUeXBlXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIChjaGFuZ2UpPVwib25Eb2N1bWVudFR5cGVzU2VsZWN0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdkb2N1bWVudFR5cGUnPlxyXG4gICAgICAgICAgICAgICAgICAgIEBmb3IoaXRlbSBvZiBkb2N1bWVudFR5cGVzOyB0cmFjayAkaW5kZXgpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIml0ZW0uY29kZVwiPnt7aXRlbS5uYW1lfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sndHlwZS1kb2N1bWVudC1oZWxwJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5lbmFibGVkKXtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J2RvY3VtZW50LW51bWJlcid8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnROdW1iZXIucmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt0eXBlXT1cIid0ZXh0J1wiIG5hbWU9XCJkb2N1bWVudE51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdkb2N1bWVudE51bWJlcicgbWluPVwiMVwiIG1heD1cIjk5OTk5OTk5OTk5XCIgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudE51bWJlciddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnROdW1iZXInXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydkb2N1bWVudC1udW1iZXItaGVscCd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+PCEtLUZpbGEgNi0tPlxyXG4gICAgICAgICAgICBAaWYodGhpcy5jaGFubmVsLmNoZWNrb3V0Tm90ZXNGaWVsZCA9PSAncmVxdWlyZWQnIHx8IHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3Nob3cnKXtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgQGlmKCFnZXRMYWJlbE5vdGVzUGFyYW0oKSl7XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J25vdGVzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIEBpZih0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYoZ2V0TGFiZWxOb3Rlc1BhcmFtKCk7IGFzIGxhYmVsbm90ZXMpe1xyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIiBbaW5uZXJIVE1MXT1cImxhYmVsbm90ZXMudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICBAaWYodGhpcy5jaGFubmVsLmNoZWNrb3V0Tm90ZXNGaWVsZCA9PSAncmVxdWlyZWQnKXtcclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwibm90ZXNcIiBmb3JtQ29udHJvbE5hbWU9J25vdGVzJ1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgICAgIEBpZih0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcgJiYgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydub3RlcyddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snbm90ZXMnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J25vdGVzLWhlbHAnfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC1kZlwiPjwhLS1GaWxhIDctLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZvcm1GYWN0XCI+PGI+e3sgJ3NhbWUtYmlsbGluZy1hZGRyZXNzJyB8IHRyYW5zbGF0ZSB9fTwvYj4gPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiIFtjaGVja2VkXT1cInZpZXdEYXRhRmFjdHVyYWNpb25cIiAoY2hhbmdlKT1cInNob3dGb3JtRmFjdHVyYWNpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZm9ybUZhY3RcIj48L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJlcXVpcmVkIHRleHQtdW5kZXJsaW5lIHRleHQtZGFuZ2VyXCI+KiB7eyAncmVxdWlyZWQtZmllbGRzJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtZGZcIj5cclxuICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnRlcm1zLmVuYWJsZWQpe1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMudGVybXMucmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJcIiBmb3I9XCJcIj4ge3sgJ2FjY2VwdC10ZXJtcycgfCB0cmFuc2xhdGUgfX0gPGlucHV0IGNsYXNzPVwibXMtMlwiIG5hbWU9XCJ0ZXJtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0ndGVybXMnIHR5cGU9XCJjaGVja2JveFwiIHJlcXVpcmVkIChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgLz4gPC9sYWJlbD48YnIgLz5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1icy10YXJnZXQ9XCIjdGVybWlub3MteS1jb25kaWNpb25lc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICd3aGF0cy10aGlzJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWyd0ZXJtcyddLnRvdWNoZWQgJiYgIWNoZWNrb3V0Rm9ybS5jb250cm9sc1sndGVybXMnXS52YWx1ZSl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7ICdtdXN0LWFjY2VwdC10ZXJtcycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBAaWYoIXZpZXdEYXRhRmFjdHVyYWNpb24pe1xyXG4gICAgICAgIDwhLS1Gb3JtdWxhcmlvIGRlIEZhY3R1cmFjacOzbi0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGgyPnt7ICdiaWxsaW5nLWRhdGEnIHwgdHJhbnNsYXRlIH19PC9oMj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY2hlY2tvdXRGb3JtRmFjdHVyYWNpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTJcIj48IS0tRmlsYSAxLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZmlyc3ROYW1lLmVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TaSBlcyByZXF1aXJlZC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J2ZpcnN0LW5hbWUnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmZpcnN0TmFtZS5yZXF1aXJlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1JbnB1dC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiZmlyc3ROYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmlyc3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2ZpcnN0TmFtZSddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydmaXJzdE5hbWUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2ZpcnN0LW5hbWUtaGVscDEnfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tRXJyb3IgaW5mby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydmaXJzdE5hbWUnXS50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZmlyc3ROYW1lJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydmaXJzdC1uYW1lLWhlbHAyJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubGFzdE5hbWUuZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J2xhc3QtbmFtZSd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubGFzdE5hbWUucmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJsYXN0TmFtZVwiIGZvcm1Db250cm9sTmFtZT1cImxhc3ROYW1lXCIgdmFsdWU9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2xhc3ROYW1lJ10udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2xhc3ROYW1lJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eydsYXN0LW5hbWUtaGVscDEnfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2xhc3ROYW1lJ10udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2xhc3ROYW1lJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2xhc3QtbmFtZS1oZWxwMid8dHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTJcIj48IS0tRmlsYSAyLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5waG9uZU51bWJlci5lbmFibGVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sncGhvbmUnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnBob25lTnVtYmVyLnJlcXVpcmVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJwaG9uZU51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdwaG9uZU51bWJlcicgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwaG9uZU51bWJlciddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwaG9uZU51bWJlciddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J3Bob25lLWhlbHAxJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwaG9uZU51bWJlciddLnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwaG9uZU51bWJlciddLmVycm9ycz8uWydwYXR0ZXJuJ10pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sncGhvbmUtaGVscDInfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5lbWFpbC5lbmFibGVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snZW1haWwtYWRkcmVzcyd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZW1haWwucmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cImVtYWlsXCIgbmFtZT1cImVtYWlsXCIgZm9ybUNvbnRyb2xOYW1lPSdlbWFpbCcgdmFsdWU9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2VtYWlsJ10udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2VtYWlsJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snZW1haWwtYWRkcmVzcy1oZWxwMSd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZW1haWwnXS50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZW1haWwnXS5lcnJvcnM/LlsnZW1haWwnXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydlbWFpbC1hZGRyZXNzLWhlbHAyJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPjwhLS1GaWxhIDMtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmNvdW50cnlDb2RlLmVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoY291bnRyaWVzJCB8IGFzeW5jOyBhcyBjb3VudHJpZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydjb3VudHJ5J3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5jb3VudHJ5Q29kZS5yZXF1aXJlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBuYW1lPVwiY291bnRyeUNvZGVcIiBmb3JtQ29udHJvbE5hbWU9J2NvdW50cnlDb2RlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Db3VudHJ5U2VsZWN0ZWQoJGV2ZW50LCB0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IoY291bnRyeSBvZiBjb3VudHJpZXM7IHRyYWNrICRpbmRleCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiY291bnRyeS5jb2RlXCI+e3sgY291bnRyeS5uYW1lIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgdGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydjb3VudHJ5LWhlbHAnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMucHJvdmluY2VDb2RlLmVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYocHJvdmluY2VzJCB8IGFzeW5jOyBhcyBwcm92aW5jZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydzdGF0ZSd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMucHJvdmluY2VDb2RlLnJlcXVpcmVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIG5hbWU9XCJwcm92aW5jZUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Qcm92aW5jZXNTZWxlY3RlZCgkZXZlbnQsIHByb3ZpbmNlcywgdHJ1ZSlcIiBmb3JtQ29udHJvbE5hbWU9J3Byb3ZpbmNlQ29kZSc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt7J3NlbGVjdC1zdGF0ZSd8dHJhbnNsYXRlfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yKHByb3ZpbmNlIG9mIHByb3ZpbmNlczsgdHJhY2sgJGluZGV4KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJwcm92aW5jZS5jb2RlXCI+e3sgcHJvdmluY2UubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgdGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydzdGF0ZS1oZWxwJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmNpdHkuZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J3Rvd24tY2l0eSd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuY2l0eS5yZXF1aXJlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0nY2l0eScgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjaXR5J10udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NpdHknXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J3Rvd24tY2l0eS1oZWxwJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtZGZcIj48IS0tRmlsYSA0LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5zdHJlZXQuZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eydhZGRyZXNzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5zdHJlZXQucmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInN0cmVldFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdzdHJlZXQnIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snc3RyZWV0J10udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3N0cmVldCddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snYWRkcmVzcy1oZWxwMSd8dHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snc3RyZWV0J10udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3N0cmVldCddLmVycm9ycz8uWydtYXhsZW5ndGgnXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2FkZHJlc3MtaGVscDInfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGZvcm0gZGlyZWNjacOzbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnBvc3Rjb2RlLmVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+e3sncG9zdGFsLWNvZGUnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnBvc3Rjb2RlLnJlcXVpcmVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwicG9zdGNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0ncG9zdGNvZGUnIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncG9zdGNvZGUnXS50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncG9zdGNvZGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J3Bvc3RhbC1jb2RlLWhlbHAnfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Bvc3Rjb2RlJ10udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Bvc3Rjb2RlJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPiB7eydwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yJyB8IHRyYW5zbGF0ZX19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtZGZcIj48IS0tRmlsYSA1LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudFR5cGUuZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihkb2N1bWVudFR5cGVzJCB8IGFzeW5jOyBhcyBkb2N1bWVudFR5cGVzKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J2RvY3VtZW50LXR5cGUnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmRvY3VtZW50VHlwZS5yZXF1aXJlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJkb2N1bWVudFR5cGVcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKCRldmVudCwgdHJ1ZSlcIiBmb3JtQ29udHJvbE5hbWU9J2RvY3VtZW50VHlwZSc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvcihpdGVtIG9mIGRvY3VtZW50VHlwZXM7IHRyYWNrICRpbmRleCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiaXRlbS5jb2RlXCI+e3tpdGVtLm5hbWV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sndHlwZS1kb2N1bWVudC1oZWxwJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5lbmFibGVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J2RvY3VtZW50LW51bWJlcid8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnROdW1iZXIucmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt0eXBlXT1cIid0ZXh0J1wiIG5hbWU9XCJkb2N1bWVudE51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdkb2N1bWVudE51bWJlcicgbWluPVwiMVwiIG1heD1cIjk5OTk5OTk5OTk5XCIgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50TnVtYmVyJ10udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50TnVtYmVyJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snZG9jdW1lbnQtbnVtYmVyLWhlbHAnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC1kZlwiPjwhLS1GaWxhIDYtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3JlcXVpcmVkJyB8fCB0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdzaG93Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZighZ2V0TGFiZWxOb3Rlc1BhcmFtKCkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eydub3Rlcyd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYodGhpcy5jaGFubmVsLmNoZWNrb3V0Tm90ZXNGaWVsZCA9PSAncmVxdWlyZWQnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldExhYmVsTm90ZXNQYXJhbSgpOyBhcyBsYWJlbG5vdGVzKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCIgW2lubmVySFRNTF09XCJsYWJlbG5vdGVzLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3JlcXVpcmVkJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5vdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J25vdGVzJyB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYodGhpcy5jaGFubmVsLmNoZWNrb3V0Tm90ZXNGaWVsZCA9PSAncmVxdWlyZWQnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snbm90ZXMnXS50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snbm90ZXMnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J25vdGVzLWhlbHAnfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGQtZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LXdoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2hlY2tvdXRGb3JtLmludmFsaWQgfHwgKHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3JlcXVpcmVkJyAmJiAoIWNoZWNrb3V0Rm9ybS5nZXQoJ25vdGVzJyk/LnZhbHVlIHx8IGNoZWNrb3V0Rm9ybS5nZXQoJ25vdGVzJyk/LnZhbHVlLnRyaW0oKSA9PT0gJycpKSB8fCAoIXZpZXdEYXRhRmFjdHVyYWNpb24gJiYgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gJiYgKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmludmFsaWQgfHwgKHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3JlcXVpcmVkJyAmJiAoIWNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmdldCgnbm90ZXMnKT8udmFsdWUgfHwgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0KCdub3RlcycpPy52YWx1ZS50cmltKCkgPT09ICcnKSkpKVwiPnt7KGlzTGFzdE9uZVxyXG4gICAgICAgICAgICAgICAgICAgID8gJ2ZpbmlzaC1jaGVja291dCcgOiAoYWxscmVhZHlfZGF0YSA/ICd1cGRhdGUnIDpcclxuICAgICAgICAgICAgICAgICAgICAncmVhZHktZm9ybScpKSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSB7eyhhbGxyZWFkeV9kYXRhID8gJ3VwZGF0ZScgOiAoaXNMYXN0T25lID8gJ2ZpbmlzaC1jaGVja291dCcgOiAncmVhZHktZm9ybScpKSB8IHRyYW5zbGF0ZX19ICAtLT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBAaWYobG9hZGluZyl7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8YXBwLWxvYWRpbmctZnVsbC1lYz48L2FwcC1sb2FkaW5nLWZ1bGwtZWM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+XHJcbn0gQGVsc2Uge1xyXG48ZGl2IGlkPVwibG9naW5DaGVja291dFwiPlxyXG4gICAgQGlmKHJlcXVpcmVfbG9naW4pe1xyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBteS01IFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgXCI+XHJcbiAgICAgICAgICAgIDxhcHAtbG9naW4tZm9ybS1lYyAocmVhZHkpPVwidmVyaWZ5VmFsaWRhdGUoJGV2ZW50KVwiIFtyZWRpcmVjdF09XCJmYWxzZVwiIFt0aXRsZV09XCInbmVlZC1sb2dpbidcIj5cclxuICAgICAgICAgICAgPC9hcHAtbG9naW4tZm9ybS1lYz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG48L2Rpdj5cclxufVxyXG59IEBlbHNlIHtcclxuQGlmKG1vZGVTZWxlY3RBZGRyZXNzID09ICdPTkxZX0FERFJFU1NfU0VMRUNUSU9OJyl7XHJcbjxkaXYgY2xhc3M9XCJjaGVja291dC10aXRsZSBteS0yXCI+XHJcbiAgICA8aDM+e3snYWRkcmVzcy1zZWxlY3Rpb24nfHRyYW5zbGF0ZX19PC9oMz5cclxuPC9kaXY+XHJcbn1cclxuXHJcbkBpZih0aGlzLmFkZHJlc3NCb29rKXtcclxuQGlmKHRoaXMuYWRkcmVzc0Jvb2s/Lmxlbmd0aCl7XHJcbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICBAZm9yKGl0ZW0gb2YgYWRkcmVzc0Jvb2s7IHRyYWNrICRpbmRleDsgbGV0IGkgPSAkaW5kZXgpe1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNiBjb2wtMTIgbXktM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTNcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm1zLTEgbXQtMyBmb3JtLWNoZWNrLWlucHV0IGlucHV0LXNpemUtbGdcIiB0eXBlPVwicmFkaW9cIiBbbmFtZV09XCInbi0nK2lcIiBbaWRdPVwiaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXRlbS5zZWxlY3RlZFwiIChjbGljayk9XCJzZXRTZWxlY3RBZGRyZXNzKGl0ZW0pXCIgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtcy01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwiY2FyZC10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7J2FkZHJlc3MnfHRyYW5zbGF0ZX19PC9zdHJvbmc+PGJyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdXBwZXJjYXNlIGgzXCI+e3tpdGVtLnN0cmVldH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZCBjb2wtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eydjb3VudHJ5J3x0cmFuc2xhdGV9fTwvc3Ryb25nPiB7e2dldENvdW50cnkoaXRlbS5jb3VudHJ5Q29kZSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZCBjb2wtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eydzdGF0ZSd8dHJhbnNsYXRlfX08L3N0cm9uZz4ge3tnZXRQcm92aW5jZShpdGVtLnByb3ZpbmNlQ29kZSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZCBjb2wtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyd0b3duLWNpdHknfHRyYW5zbGF0ZX19PC9zdHJvbmc+IHt7aXRlbS5jaXR5fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtYi0yIHRleHQtbXV0ZWQgY29sLWF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sncG9zdGFsLWNvZGUnfHRyYW5zbGF0ZX19PC9zdHJvbmc+IHt7aXRlbS5wb3N0Y29kZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBweC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMiBiZy1saWdodCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eydhZGRyZXNzLWNvbnRhY3QnfHRyYW5zbGF0ZX19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7J2ZpcnN0LW5hbWUnfHRyYW5zbGF0ZX19PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5hZGRyZXNzQ29udGFjdC5maXJzdE5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtYi0yIHRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eydsYXN0LW5hbWUnfHRyYW5zbGF0ZX19PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5hZGRyZXNzQ29udGFjdC5sYXN0TmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oNj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7J2RvY3VtZW50LXR5cGUnfHRyYW5zbGF0ZX19PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z2V0RG9jdW1lbnRUeXBlKGl0ZW0uYWRkcmVzc0NvbnRhY3QuZG9jdW1lbnRUeXBlKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oNj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7J2RvY3VtZW50LW51bWJlcid8dHJhbnNsYXRlfX08L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLmFkZHJlc3NDb250YWN0LmRvY3VtZW50TnVtYmVyfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cImNhcmQtc3VidGl0bGUgbWItMiB0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3snZW1haWwtYWRkcmVzcyd8dHJhbnNsYXRlfX08L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLmFkZHJlc3NDb250YWN0LmVtYWlsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwidy0xMDBcIj5cclxuICAgICAgICBAaWYodGhpcy5jaGFubmVsLmNoZWNrb3V0Tm90ZXNGaWVsZCA9PSAncmVxdWlyZWQnIHx8IHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3Nob3cnKXtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgIEBpZighZ2V0TGFiZWxOb3Rlc1BhcmFtKCkpe1xyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J25vdGVzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIEBpZih0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYoZ2V0TGFiZWxOb3Rlc1BhcmFtKCk7IGFzIGxhYmVsbm90ZXMpe1xyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIFtpbm5lckhUTUxdPVwibGFiZWxub3Rlcy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEBpZih0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5vdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3Rlc1wiICNjdHJsPVwibmdNb2RlbFwiIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtyZXF1aXJlZF09XCJ0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCdcIj5cclxuICAgICAgICAgICAgICAgIEBpZih0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcgJiYgY3RybC50b3VjaGVkICYmIGN0cmwuaW52YWxpZCl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J25vdGVzLWhlbHAnfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBkLWZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU2VsZWN0QWRkcmVzcyhjYXJ0SXRlbXMpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC13aGl0ZVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZ1N0ZXAgfHwgKHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3JlcXVpcmVkJyAmJiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMudHJpbSgpID09PSAnJykpXCI+e3soaXNMYXN0T25lXHJcbiAgICAgICAgICAgICAgICA/ICdmaW5pc2gtY2hlY2tvdXQnIDogKGFsbHJlYWR5X2RhdGEgPyAndXBkYXRlJyA6XHJcbiAgICAgICAgICAgICAgICAncmVhZHktZm9ybScpKSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8IS0tIHt7KGFsbHJlYWR5X2RhdGEgPyAndXBkYXRlJyA6IChpc0xhc3RPbmUgPyAnZmluaXNoLWNoZWNrb3V0JyA6ICdyZWFkeS1mb3JtJykpIHwgdHJhbnNsYXRlfX0gIC0tPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIEBpZihsb2FkaW5nKXtcclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4ganVzaXRmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8YXBwLWxvYWRpbmctZnVsbC1lYz48L2FwcC1sb2FkaW5nLWZ1bGwtZWM+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuPC9kaXY+XHJcbn0gQGVsc2Uge1xyXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiB0ZXh0LWNlbnRlciBteS0yXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtbG9hZGluZy1mdWxsLWVjPjwvYXBwLWxvYWRpbmctZnVsbC1lYz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbn1cclxufSBAZWxzZSB7XHJcbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIHRleHQtY2VudGVyIG15LTJcIj5cclxuICAgICAgICAgICAgPGg0PiB7eydhZGRyZXNzLWJvb2stbm90LXJlc3VsdCcgfCB0cmFuc2xhdGUgfX0gPC9oND5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxufVxyXG5cclxufVxyXG5cclxufVxyXG5AZWxzZSB7XHJcbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cclxuICAgIDxwPlBvciBmYXZvciA8YSBbcm91dGVyTGlua109XCJbJy9hdXRoL2xvZ2luJ11cIj4gSW5pY2llIFNlc2nDs248L2E+PC9wPlxyXG48L2Rpdj5cclxufVxyXG59XHJcbkBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy50ZXJtcy5lbmFibGVkKXtcclxuPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cInRlcm1pbm9zLXktY29uZGljaW9uZXNcIiB0YWJpbmRleD1cIi0xXCIgYXJpYS1sYWJlbGxlZGJ5PVwibW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC14bCBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJtb2RhbExhYmVsXCI+VMOpcm1pbm9zIHkgY29uZGljaW9uZXM8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtYmxvY2tzLWVjIFtzZWN0aW9uXT1cIid0ZXJtaW5vcy15LWNvbmRpY2lvbmVzJ1wiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG59Il19
317
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvY2hlY2tvdXQtZWMvZGF0YWZvcm0tZWMvZGF0YWZvcm0tZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvY2hlY2tvdXQtZWMvZGF0YWZvcm0tZWMvZGF0YWZvcm0tZWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBYSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFvQixXQUFXLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BMLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFB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QUFTOytCQUNJLGlCQUFpQixjQUNmLElBQUksV0FDUDt3QkFDTCxVQUFVO3dCQUNWLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxvQkFBb0I7d0JBQ3BCLGVBQWU7d0JBQ2YsU0FBUzt3QkFDVCxhQUFhO3dCQUNiLHNCQUFzQjt3QkFDdEIsUUFBUTt3QkFDUixpQkFBaUI7cUJBQ3BCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSb3V0ZXJMaW5rIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IExvZ2luRm9ybUVjQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXV0aC1lYyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFkZHJlc3NpbmdTZXJ2aWNlLCBBbmFseXRpY3NTZXJ2aWNlLCBBdXRoU2VydmljZSwgQ2FydFNlcnZpY2UsIENoYW5uZWxTZXJ2aWNlLCBDaGVja291dFNlcnZpY2UsIEZvcm1TZXJ2aWNlLCBQYXJhbWV0ZXJzU2VydmljZSwgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZWMtc2VydmljZXMnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBKc29uUGlwZSwgVGl0bGVDYXNlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBcGlDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IExvYWRpbmdGdWxsRWNDb21wb25lbnQgfSBmcm9tICcuLi8uLi93aWRnZXRzLWVjJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZmlsdGVyLCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcGknO1xuaW1wb3J0IHsgSW5wdXRFY0NvbXBvbmVudCB9IGZyb20gJy4vaW5wdXQtZWMvaW5wdXQtZWMuY29tcG9uZW50JztcbmltcG9ydCB7IEJsb2Nrc0VjQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2Jsb2Nrcy1lYy9ibG9ja3MtZWMuY29tcG9uZW50XCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWRhdGFmb3JtLWVjJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgUm91dGVyTGluayxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIExvZ2luRm9ybUVjQ29tcG9uZW50LFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgVGl0bGVDYXNlUGlwZSxcbiAgICAgICAgTG9hZGluZ0Z1bGxFY0NvbXBvbmVudCxcbiAgICAgICAgSnNvblBpcGUsXG4gICAgICAgIEJsb2Nrc0VjQ29tcG9uZW50XG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0YWZvcm0tZWMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9kYXRhZm9ybS1lYy5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgRGF0YWZvcm1FY0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBwcml2YXRlIF9jaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UgPSBpbmplY3QoQ2hhbm5lbFNlcnZpY2UpO1xuICAgIHByaXZhdGUgX2F1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSA9IGluamVjdChBdXRoU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfcGFyYW1zU2VydmljZTogUGFyYW1ldGVyc1NlcnZpY2UgPSBpbmplY3QoUGFyYW1ldGVyc1NlcnZpY2UpO1xuICAgIHByaXZhdGUgX2FwaUNvbnN0czogQXBpQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChBcGlDb25zdGFudHNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF9hZGRyZXNzaW5nU2VydmljZTogQWRkcmVzc2luZ1NlcnZpY2UgPSBpbmplY3QoQWRkcmVzc2luZ1NlcnZpY2UpO1xuICAgIHByaXZhdGUgX2NhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSA9IGluamVjdChDYXJ0U2VydmljZSk7XG4gICAgcHJpdmF0ZSBfdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF9mb3JtU2VydmljZTogRm9ybVNlcnZpY2UgPSBpbmplY3QoRm9ybVNlcnZpY2UpO1xuICAgIHByaXZhdGUgX2NoZWNrb3V0U2VydmljZTogQ2hlY2tvdXRTZXJ2aWNlID0gaW5qZWN0KENoZWNrb3V0U2VydmljZSk7XG4gICAgcHJpdmF0ZSBfZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyID0gaW5qZWN0KEZvcm1CdWlsZGVyKTtcblxuICAgIHB1YmxpYyBjYXJ0SXRlbXM6IGFueSA9IFtdXG5cbiAgICBwdWJsaWMgY2hhbm5lbCQgPSB0aGlzLl9jaGFubmVsU2VydmljZS5jaGFubmVsJDtcbiAgICBwdWJsaWMgY291bnRyaWVzJCA9IHRoaXMuX2Zvcm1TZXJ2aWNlLmdldENvdW50cmllc0RhdGEoKTtcbiAgICBwdWJsaWMgcHJvdmluY2VzJCA9IHRoaXMuX2Zvcm1TZXJ2aWNlLnByb3ZpbmNlcyQ7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZXMkID0gdGhpcy5fZm9ybVNlcnZpY2UuZG9jdW1lbnRUeXBlcyQ7XG4gICAgcHVibGljIGlzTGFzdFN0ZXAkID0gdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmlzTGFzdFN0ZXAkO1xuICAgIHB1YmxpYyBsb2FkaW5nU3RlcCQgPSB0aGlzLl9jaGVja291dFNlcnZpY2UubG9hZGluZ1N0ZXAkO1xuXG4gICAgcHVibGljIHNlbGVjdEFkZHJlc3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcGFyYW1zOiBhbnk7XG4gICAgcHVibGljIGFkZHJlc3NCb29rOiBhbnkgPSBbXTtcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2tTZWxlY3RlZCA9IHsgaWQ6IDAsIG5vdGVzOiBcIlwiIH1cbiAgICBwdWJsaWMgZm9ybV9yZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGFsbHJlYWR5X2RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcmVxdWlyZV9sb2dpbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjaGVja291dEZvcm06IEZvcm1Hcm91cDtcbiAgICBwdWJsaWMgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb246IEZvcm1Hcm91cDtcbiAgICBwdWJsaWMgZ2V0VHlwZUZvcm06IGFueSA9IHRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtO1xuICAgIHB1YmxpYyBpc0xhc3RPbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgbG9hZGluZ1N0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2hhbm5lbDogYW55O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3N0YWxDb2RlUGF0dGVybiA9ICdeWzAtOV1bMC05XSokJztcblxuICAgIHByb3RlY3RlZCBjb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIHByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcblxuICAgIHB1YmxpYyBjb3VudHJpZXNGYWN0dXJhY2lvbiQgPSB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgcHJvdmluY2VzRmFjdHVyYWNpb24kID0gdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZXNGYWN0dXJhY2lvbiQgPSB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwdWJsaWMgdmlld0RhdGFGYWN0dXJhY2lvbjogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIHZhbGlkYWRvID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0gPSB0aGlzLl9mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICAuLi50aGlzLl9hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpPy5jb25maWdGb3JtLmZvcm1BZGRyZXMsXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKHRoaXMucG9zdGFsQ29kZVBhdHRlcm4pXV1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkIH0pKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gPSB0aGlzLl9mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICAuLi50aGlzLl9hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpPy5jb25maWdGb3JtLmZvcm1CaWxsaW5nLFxuICAgICAgICAgICAgcG9zdGNvZGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybih0aGlzLnBvc3RhbENvZGVQYXR0ZXJuKV1dIC8vIFNlIGFncmVnYSBwYXJhIHF1ZSBzw7NsbyBhY2VwdGUgY8OzZGlnb3MgcG9zdGFsZXMgbWF5b3JlcyBxdWUgY2Vyb1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5zdGF0dXNDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4geyB0aGlzLm9uRm9ybUNoYW5nZSgpOyByZXR1cm4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCB9KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkZvcm1WYWxpZCgpKTtcbiAgICAgICAgdGhpcy5pc0xhc3RTdGVwJC5zdWJzY3JpYmUocmVzID0+IHRoaXMuaXNMYXN0T25lID0gcmVzKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RlcCQuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmxvYWRpbmdTdGVwID0gcmVzKTtcbiAgICAgICAgdGhpcy5jaGFubmVsJC5zdWJzY3JpYmUocmVzID0+IHRoaXMuY2hhbm5lbCA9IHJlcyk7XG4gICAgfVxuXG4gICAgZ2V0IG1vZGVTZWxlY3RBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3M7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3BhcmFtc1NlcnZpY2UuZ2V0UGFyYW1ldGVycygpLnN1YnNjcmliZShwYXJhbXMgPT4gdGhpcy5wYXJhbXMgPSBwYXJhbXMpO1xuICAgICAgICB0aGlzLl9jYXJ0U2VydmljZS5jYXJ0SXRlbXMkLnN1YnNjcmliZShpdGVtcyA9PiB0aGlzLmNhcnRJdGVtcyA9IGl0ZW1zKTtcblxuICAgICAgICB0aGlzLl9hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5zZXRWYWx1ZSh0aGlzLl9hdXRoU2VydmljZS5nZXRVc2VyUHJvZmlsZUFzVXNlcigpPy5lbWFpbCk7IC8vLS0+IGVzdG8gZXMgbW9tZW50YW5lbyBoYXN0YSBxdWUgZW1waWVjZSBhIHRyYWJhamFyIGNvbiBTZWxsZXIgeSBDdXN0b21lci4gIFxuICAgICAgICB0aGlzLl9hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXQoJ2VtYWlsJyk/LmRpc2FibGUoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgKHRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09ICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTicgfHwgdGhpcy5fYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MgPT0gJ09OTFlfQUREUkVTU19TRUxFQ1RJT04nKVxuICAgICAgICAgICAgJiYgZmlyc3RWYWx1ZUZyb20odGhpcy5fYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc0Jvb2soKSkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSByZXMgJiYgcmVzIHx8IG51bGxcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rID09IG51bGwgJiYgdGhpcy5zZXRNb2RlKCdjYXJnYScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICApLmNhdGNoKGVyciA9PiBjb25zb2xlLmVycm9yKGVyci5lcnJvci5tZXNzYWdlKSlcbiAgICAgICAgLy8gUGFyYSBmb3JtdWxhcmlvIHByaW5jaXBhbFxuICAgICAgICB0aGlzLmNvdW50cmllcyQuc3Vic2NyaWJlKGNvdW50cmllcyA9PiB7XG4gICAgICAgICAgICBpZiAoY291bnRyaWVzICYmIGNvdW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0Q291bnRyeShjb3VudHJpZXNbMF0sIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBQYXJhIHRpcG9zIGRlIGRvY3VtZW50byBkZWwgZm9ybXVsYXJpbyBwcmluY2lwYWxcbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzJC5zdWJzY3JpYmUoZG9jdW1lbnRUeXBlcyA9PiB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnRUeXBlcyAmJiBkb2N1bWVudFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHREb2N1bWVudFR5cGUoZG9jdW1lbnRUeXBlc1swXSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0RGVmYXVsdENvdW50cnkoY291bnRyeTogYW55LCBpc0JpbGxpbmc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBmb3JtID0gaXNCaWxsaW5nID8gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbiA6IHRoaXMuY2hlY2tvdXRGb3JtO1xuICAgICAgICBjb25zdCBjdXJyZW50Q291bnRyeSA9IGZvcm0uZ2V0KCdjb3VudHJ5Q29kZScpPy52YWx1ZTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRDb3VudHJ5KSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnU2V0dGluZyBkZWZhdWx0IGNvdW50cnk6JywgY291bnRyeS5uYW1lKTtcblxuICAgICAgICAgICAgZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogY291bnRyeS5jb2RlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gQ2FyZ2FyIHByb3ZpbmNpYXMgYXV0b23DoXRpY2FtZW50ZVxuICAgICAgICAgICAgY29uc3QgZmFrZUV2ZW50ID0ge1xuICAgICAgICAgICAgICAgIHRhcmdldDogeyB2YWx1ZTogY291bnRyeS5jb2RlIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm9uQ291bnRyeVNlbGVjdGVkKGZha2VFdmVudCwgaXNCaWxsaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldERlZmF1bHREb2N1bWVudFR5cGUoZG9jdW1lbnRUeXBlOiBhbnksIGlzQmlsbGluZzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSBpc0JpbGxpbmcgPyB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uIDogdGhpcy5jaGVja291dEZvcm07XG4gICAgICAgIGNvbnN0IGN1cnJlbnREb2N1bWVudFR5cGUgPSBmb3JtLmdldCgnZG9jdW1lbnRUeXBlJyk/LnZhbHVlO1xuXG4gICAgICAgIGlmICghY3VycmVudERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ1NldHRpbmcgZGVmYXVsdCBkb2N1bWVudCB0eXBlOicsIGRvY3VtZW50VHlwZS5uYW1lKTtcblxuICAgICAgICAgICAgZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudFR5cGU6IGRvY3VtZW50VHlwZS5jb2RlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gT3BjaW9uYWw6IGRpc3BhcmFyIGVsIGV2ZW50byBjaGFuZ2Ugc2kgZXMgbmVjZXNhcmlvXG4gICAgICAgICAgICBjb25zdCBmYWtlRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB7IHZhbHVlOiBkb2N1bWVudFR5cGUuY29kZSB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vbkRvY3VtZW50VHlwZXNTZWxlY3RlZChmYWtlRXZlbnQsIGlzQmlsbGluZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKClcbiAgICB9XG5cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMubW9kZVNlbGVjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2F1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBZGRyZXNzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRNb2RlKG1vZGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNlbGVjdEFkZHJlc3MgPSBtb2RlID09IFwiY2FyZ2FcIlxuICAgIH1cblxuICAgIGdldFBhcmFtQnlDaGFubmVsQW5kTGFuZ3VhZ2UobmFtZVBhcmFtOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtc1NlcnZpY2UuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCBuYW1lUGFyYW0gKyB0aGlzLl9hcGlDb25zdHMuQ0hBTk5FTCArICdfJyArIHRoaXMuX2FwaUNvbnN0cy5MT0NBTEUuc3BsaXQoJ18nKVswXSlcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RBZGRyZXNzKGFkZHJlc3NTZWxlY3Q6IGFueSkgeyAgXG4gICAgICAgIHRoaXMuYWRkcmVzc0Jvb2subWFwKChhZGRyZXNzOiBhbnkpID0+IGFkZHJlc3Muc2VsZWN0ZWQgPSBhZGRyZXNzLmlkID09PSBhZGRyZXNzU2VsZWN0LmlkKVxuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoKGFkZHJlc3M6IGFueSkgPT4gYWRkcmVzcy5zZWxlY3RlZCkuaWQgfHwgMFxuICAgIH1cbiAgICBvblNlbGVjdEFkZHJlc3MoaXRlbXM6IGFueSkge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgYWRkcmVzc1NlbGVjdGVkID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKChhZGRyZXNzOiBhbnkpID0+IGFkZHJlc3Muc2VsZWN0ZWQpXG4gICAgICAgIGlmIChhZGRyZXNzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gYWRkcmVzc1NlbGVjdGVkLmlkIHx8IDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzOiBhZGRyZXNzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkcmVzc2luZ1NlcnZpY2Uuc2V0SGVhZHF1YXJ0ZXIocmVxdWVzdCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FydFNlcnZpY2UuYWRkVG9Mb3QoaXRlbS5wcm9kdWN0LCAwLCBpdGVtLnZhcmlhbnRfaWQsIDAsIGl0ZW0uaXRlbV9pZCwgaXRlbS5xdWFudGl0eSwgaXRlbS5wcm9kdWN0LnByaWNlLCBpdGVtLnF1YW50aXR5LCBpdGVtLmRpc2NvdW50LCBpdGVtLnByb2R1Y3QucHJpY2UgKiBpdGVtLnF1YW50aXR5LCAnbmV3JywgJycsICcnLCAwLCByZXMuc2hpcHBpbmdBZGRyZXNzLmNpdHkgKyAnIC0gJyArIHJlcy5zaGlwcGluZ0FkZHJlc3Muc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICkuY2F0Y2goZXJyID0+IHRoaXMuX3RvYXN0U2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3InKSk7XG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coJ29wZXJhdGlvbi1lcnJvcicpIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uSW5wdXRDaGFuZ2UgPSAoKSA9PiB0aGlzLmZvcm1fcmVhZHkgPSBmYWxzZTtcblxuICAgIGdldENvdW50cnkoY29kZTogYW55KSB7IHJldHVybiB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQoKGNvdW50cmllczogYW55KSA9PiBjb3VudHJpZXMuY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKGNvZGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpPy5uYW1lIHx8IFwiXCIgfVxuXG4gICAgZ2V0UHJvdmluY2UoY29kZTogYW55KSB7IHJldHVybiB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5wcm92aW5jZUxpc3QuZmluZCgoY3Q6IGFueSkgPT4gY3QuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiIH1cblxuICAgIGdldERvY3VtZW50VHlwZShjb2RlOiBhbnkpIHsgcmV0dXJuIHRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLmRvY3VtZW50VHlwZXMuZmluZCgoZHQ6IGFueSkgPT4gZHQuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiIH1cblxuICAgIGdldExhYmVsTm90ZXNQYXJhbSgpIHsgcmV0dXJuIHRoaXMuX3BhcmFtc1NlcnZpY2UuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCAnbGFiZWxfbm90ZXNfJyArIHRoaXMuX2FwaUNvbnN0cy5DSEFOTkVMICsgJ18nICsgdGhpcy5fYXBpQ29uc3RzLkxPQ0FMRS5zcGxpdCgnXycpWzBdKSB9XG5cbiAgICB2ZXJpZnlWYWxpZGF0ZSgkZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIC8vIEFjYSBkZWJvIHJlc29sdmVyIGVsIGZvcm11bGFyaW8geSB1bmEgdmV6IGVzdGUgdG9kbyBvayBkZWJvIGF2aXNhciBhbCBvYnNlcnZhYmxlIGRlXG4gICAgICAgICAgICAvLyBsb3Mgc3RlcHMuXG4gICAgICAgICAgICB0aGlzLmVtaXRSZXN1bHQoKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XG4gICAgfVxuICAgIHNob3dFcnJvciA9IChlcnJvcl9tZXNzYWdlOiBhbnkpID0+IHsgdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coZXJyb3JfbWVzc2FnZSk7IHJldHVybiB0cnVlOyB9XG5cbiAgICBwcm90ZWN0ZWQgZW1pdFJlc3VsdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IHsgc2hpcHBpbmdBZGRyZXNzOiB7IC4uLnRoaXMuY2hlY2tvdXRGb3JtLmdldFJhd1ZhbHVlKCksIHBob25lTnVtYmVyOiB0aGlzLmNoZWNrb3V0Rm9ybS52YWx1ZS5waG9uZU51bWJlci50b1N0cmluZygpIH0sIG5vdGVzOiAodGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSkubm90ZXMgfTtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gJiYgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCkgZGF0YSA9IHsgLi4uZGF0YSwgbm90ZXM6IGRhdGEubm90ZXMsIGJpbGxpbmdBZGRyZXNzOiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmdldFJhd1ZhbHVlKCkgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5zZXRBZGRyZXNzKGRhdGEpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZV9sb2dpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coJ0VsIGVtYWlsIHlhIGVzdMOhIHJlZ2lzdHJhZG8sIGluaWNpZSBzZXNpw7NuLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT09IGZhbHNlICYmIHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy9Pam8gcXVlIGxvIGVkaXRvLCBubyBoaXpvIHVuYSBjb21wcmEgbnVldmEsIGF0ZW50aSBhIGVzdG8uXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLm5leHQoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coJ29wZXJhdGlvbi1lcnJvcicpIH1cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRm9ybUNoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGFkbyA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gJiYgdGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYWRvID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWRhZG8gPSBmYWxzZVxuICAgIH1cblxuICAgIG9uRm9ybVZhbGlkID0gKCkgPT4ge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcHR1cmEgZWwgZXZlbnRvIGRlIGN1YW5kbyBjYW1iaWEgdW4gcGFpcyBlbiBlbCBgPHNlbGVjdD5gXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqL1xuICAgIG9uQ291bnRyeVNlbGVjdGVkID0gKGV2ZW50OiBhbnksIGJpbGxpbmc6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICAgIC8vJCgnI3NlbGVjdE9wUGFpcycpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGZvcm0gPSBiaWxsaW5nID8gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbiA6IHRoaXMuY2hlY2tvdXRGb3JtO1xuICAgICAgICBmb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgZm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUoJycpO1xuICAgICAgICAvL3ZhbHVlICE9ICcnICYmIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZS5maW5kKGNvdW50cnkgPT4gY291bnRyeS5jb2RlID09IHZhbHVlKS5wcm92aW5jZXMpO1xuICAgICAgICBpZiAodmFsdWUgIT0gJycgfHwgdmFsdWUgIT0gJ251bGwnKSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtU2VydmljZS5vbkNvdW50cnlTZWxlY3RlZCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FwdHVyYSBlbCBldmVudG8gZGUgY3VhbmRvIGNhbWJpYSB1bmEgcHJvdmluY2lhL2VzdGFkbyBlbiBlbCBgPHNlbGVjdD5gXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEBwYXJhbSBwcm92aW5jZXMgbGlzdGEgZGUgcHJvdmluY2lhcyBwYXJhIG9idGVuZXIgZWwgbm9tYnJlIGRlIGxhIHNlbGVjY2lvbmFkYS5cbiAgICAgKi9cbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkKGV2ZW50OiBhbnksIHByb3ZpbmNlczogYW55LCBiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICBjb25zdCBmb3JtID0gYmlsbGluZyA/IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gOiB0aGlzLmNoZWNrb3V0Rm9ybTtcbiAgICAgICAgcmV0dXJuIGZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIC8qIHJldHVybiBmb3JtLmNvbnRyb2xzWydwcm92aW5jZU5hbWUnXS5zZXRWYWx1ZShwcm92aW5jZXMuZmluZCgocHJvdmluY2U6IGFueSkgPT4gcHJvdmluY2UuY29kZSA9PSB2YWx1ZSkubmFtZSk7ICovXG4gICAgfVxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKGV2ZW50OiBhbnksIGJpbGxpbmc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSBldmVudC50YXJnZXRcbiAgICAgICAgY29uc3QgZm9ybSA9IGJpbGxpbmcgPyB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uIDogdGhpcy5jaGVja291dEZvcm07XG4gICAgICAgIHJldHVybiBmb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnJyA/ICcnIDogdmFsdWUpO1xuICAgIH1cbiAgICBzaG93Rm9ybUZhY3R1cmFjaW9uID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPSAhdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uJC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYSAtIE5vIHNlbGVjY2lvbmFyIGF1dG9tw6F0aWNhbWVudGUgbmluZ3VuYSBwcm92aW5jaWFcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUoJycpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocmVzWzBdPy5wcm92aW5jZXMpXG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50byAtIFVzYXIgZWwgbnVldm8gbcOpdG9kb1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHREb2N1bWVudFR5cGUocmVzWzBdPy5kb2N1bWVudFR5cGVzWzBdLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LmRvY3VtZW50VHlwZXMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb25cbiAgICB9XG5cbiAgICBuZXh0KCkge1xuICAgICAgICB0aGlzLl9jaGVja291dFNlcnZpY2UubmV4dCgpXG4gICAgfVxuXG59XG4iLCJAaWYoY2hhbm5lbCQgfCBhc3luYzsgYXMgY2hhbm5lbENvbmZpZyl7XG5AaWYoY2hhbm5lbENvbmZpZy5jaGFubmVsVHlwZSAhPSAnYjJiJyB8fCAoY2hhbm5lbENvbmZpZy5jaGFubmVsVHlwZSA9PSAnYjJiJyAmJiBpc0F1dGhlbnRpY2F0ZWQoKSkpe1xuQGlmKCBtb2RlU2VsZWN0QWRkcmVzcyA9PSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nICYmIGlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuYWRkcmVzc0Jvb2sgIT0gbnVsbCl7XG48IS0tU2VsZWN0b3IgZGUgbW9kb3MtLT5cbjxkaXYgY2xhc3M9XCJjb250YWluZXIgY2FyZCBwLTQgbWItM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJyb3cganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC0xMCBjb2wtbGctOCB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtdG9nZ2xlXCIgZGF0YS1icy10b2dnbGU9XCJidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzc109XCInYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSAnICsgKCFnZXRNb2RlKCkgPyAnYWN0aXZlJyA6ICcnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm9wdGlvbnNcIiBpZD1cIm9wdGlvbjFcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldE1vZGUoJ3NlbGVjY2lvbicpXCI+IHt7J3NlbGVjdC1hZGRyZXNzJyB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZX19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICBAaWYoIWdldFBhcmFtQnlDaGFubmVsQW5kTGFuZ3VhZ2UoJ2J0bl9uZXdfYWRkcmVzc18nKSl7XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzc109XCInYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSAnICsgKGdldE1vZGUoKSA/ICdhY3RpdmUnIDogJycpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwib3B0aW9uc1wiIGlkPVwib3B0aW9uMlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChjaGFuZ2UpPVwic2V0TW9kZSgnY2FyZ2EnKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnbmV3LWFkZHJlc3MnIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYoZ2V0UGFyYW1CeUNoYW5uZWxBbmRMYW5ndWFnZSgnYnRuX25ld19hZGRyZXNzXycpOyBhcyBwYXJhbSl7XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzc109XCInYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSAnICsgKHNlbGVjdEFkZHJlc3MgPyAnYWN0aXZlJyA6ICcnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm9wdGlvbnNcIiBpZD1cIm9wdGlvbjJcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoY2hhbmdlKT1cInNldE1vZGUoJ2NhcmdhJylcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgcGFyYW0udmFsdWV9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG59XG5cbkBpZihnZXRNb2RlKCkpe1xuQGlmKCFyZXF1aXJlX2xvZ2luKXtcbjxkaXY+XG4gICAgQGlmKG1vZGVTZWxlY3RBZGRyZXNzID09ICdPTkxZX0xPQURfQUREUkVTUycpe1xuICAgIDxkaXYgY2xhc3M9XCJjaGVja291dC10aXRsZSAgbXktMlwiPlxuICAgICAgICA8aDM+e3snYmlsbGluZy1kZXRhaWxzJ3x0cmFuc2xhdGV9fTwvaDM+XG4gICAgPC9kaXY+XG4gICAgfVxuICAgIDwhLS1Gb3JtdWxhcmlvLS0+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjaGVja291dEZvcm1cIiAoc3VibWl0KT1cInZlcmlmeVZhbGlkYXRlKCRldmVudClcIj4gPCEtLSAvL3RoaXMuY2FydFNlcnZpY2UuaXRlbXMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPjwhLS1GaWxhIDEtLT5cblxuICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmZpcnN0TmFtZS5lbmFibGVkKXtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgIDwhLS1TaSBlcyByZXF1aXJlZC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydmaXJzdC1uYW1lJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZmlyc3ROYW1lLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwhLS1JbnB1dC0tPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImZpcnN0TmFtZVwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiIHZhbHVlPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snZmlyc3QtbmFtZS1oZWxwMSd8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwhLS1FcnJvciBpbmZvLS0+XG4gICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZmlyc3ROYW1lJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZmlyc3ROYW1lJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydmaXJzdC1uYW1lLWhlbHAyJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubGFzdE5hbWUuZW5hYmxlZCl7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snbGFzdC1uYW1lJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubGFzdE5hbWUucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwibGFzdE5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJsYXN0TmFtZVwiIHZhbHVlPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydsYXN0TmFtZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICBjaGVja291dEZvcm0uY29udHJvbHNbJ2xhc3ROYW1lJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2xhc3QtbmFtZS1oZWxwMSd8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2xhc3ROYW1lJ10udG91Y2hlZCAmJiBjaGVja291dEZvcm0uY29udHJvbHNbJ2xhc3ROYW1lJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snbGFzdC1uYW1lLWhlbHAyJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPjwhLS1GaWxhIDItLT5cbiAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5waG9uZU51bWJlci5lbmFibGVkKXtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydwaG9uZSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnBob25lTnVtYmVyLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwicGhvbmVOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J3Bob25lTnVtYmVyJyB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1sncGhvbmVOdW1iZXInXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwaG9uZU51bWJlciddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J3Bob25lLWhlbHAxJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ3Bob25lTnVtYmVyJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1sncGhvbmVOdW1iZXInXS5lcnJvcnM/LlsncGF0dGVybiddKXtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J3Bob25lLWhlbHAyJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZW1haWwuZW5hYmxlZCl7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snZW1haWwtYWRkcmVzcyd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmVtYWlsLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJlbWFpbFwiIG5hbWU9XCJlbWFpbFwiIGZvcm1Db250cm9sTmFtZT0nZW1haWwnIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnRvdWNoZWQgJiYgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2VtYWlsLWFkZHJlc3MtaGVscDEnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS50b3VjaGVkICYmIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5lcnJvcnM/LlsnZW1haWwnXSl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydlbWFpbC1hZGRyZXNzLWhlbHAyJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTJcIj48IS0tRmlsYSAzLS0+XG4gICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuY291bnRyeUNvZGUuZW5hYmxlZCl7XG4gICAgICAgICAgICBAaWYoY291bnRyaWVzJCB8IGFzeW5jOyBhcyBjb3VudHJpZXMpe1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J2NvdW50cnknfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5jb3VudHJ5Q29kZS5yZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBuYW1lPVwiY291bnRyeUNvZGVcIiBmb3JtQ29udHJvbE5hbWU9J2NvdW50cnlDb2RlJ1xuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ291bnRyeVNlbGVjdGVkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvcihjb3VudHJ5IG9mIGNvdW50cmllczsgdHJhY2sgJGluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiY291bnRyeS5jb2RlXCI+e3sgY291bnRyeS5uYW1lIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICBjaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IHRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J2NvdW50cnktaGVscCd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5wcm92aW5jZUNvZGUuZW5hYmxlZCl7XG4gICAgICAgICAgICBAaWYocHJvdmluY2VzJCB8IGFzeW5jOyBhcyBwcm92aW5jZXMpe1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J3N0YXRlJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMucHJvdmluY2VDb2RlLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIG5hbWU9XCJwcm92aW5jZUNvZGVcIiAoY2hhbmdlKT1cIm9uUHJvdmluY2VzU2VsZWN0ZWQoJGV2ZW50LCBwcm92aW5jZXMpXCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdwcm92aW5jZUNvZGUnPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3snc2VsZWN0LXN0YXRlJ3x0cmFuc2xhdGV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICBAZm9yKHByb3ZpbmNlIG9mIHByb3ZpbmNlczsgdHJhY2sgJGluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwicHJvdmluY2UuY29kZVwiPnt7IHByb3ZpbmNlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgdGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3snc3RhdGUtaGVscCd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5jaXR5LmVuYWJsZWQpe1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J3Rvd24tY2l0eSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmNpdHkucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJjaXR5XCIgZm9ybUNvbnRyb2xOYW1lPSdjaXR5J1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1snY2l0eSddLnRvdWNoZWQgJiYgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjaXR5J10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J3Rvd24tY2l0eS1oZWxwJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtZGZcIj48IS0tRmlsYSA0LS0+XG4gICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuc3RyZWV0LmVuYWJsZWQpe1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC04XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eydhZGRyZXNzJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuc3RyZWV0LnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwic3RyZWV0XCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdzdHJlZXQnIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydzdHJlZXQnXS50b3VjaGVkICYmIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2FkZHJlc3MtaGVscDEnfHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydzdHJlZXQnXS50b3VjaGVkICYmIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J10uZXJyb3JzPy5bJ21heGxlbmd0aCddKXtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eydhZGRyZXNzLWhlbHAyJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBmb3JtIGRpcmVjY2nDs24gLS0+XG4gICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMucG9zdGNvZGUuZW5hYmxlZCl7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J3Bvc3RhbC1jb2RlJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMucG9zdGNvZGUucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJwb3N0Y29kZVwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0ncG9zdGNvZGUnIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwb3N0Y29kZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICBjaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J3Bvc3RhbC1jb2RlLWhlbHAnfHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwb3N0Y29kZSddLnRvdWNoZWQgJiYgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwb3N0Y29kZSddLmVycm9ycz8uWydwYXR0ZXJuJ10pe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPiB7eydwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yJyB8IHRyYW5zbGF0ZX19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtZGZcIj48IS0tRmlsYSA1LS0+XG4gICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnRUeXBlLmVuYWJsZWQpe1xuICAgICAgICAgICAgQGlmKGRvY3VtZW50VHlwZXMkIHwgYXN5bmM7IGFzIGRvY3VtZW50VHlwZXMpe1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eydkb2N1bWVudC10eXBlJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnRUeXBlLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cImRvY3VtZW50VHlwZVwiIGNsYXNzPVwiZm9ybS1zZWxlY3RcIiAoY2hhbmdlKT1cIm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J2RvY3VtZW50VHlwZSc+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IoaXRlbSBvZiBkb2N1bWVudFR5cGVzOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJpdGVtLmNvZGVcIj57e2l0ZW0ubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyd0eXBlLWRvY3VtZW50LWhlbHAnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5lbmFibGVkKXtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+e3snZG9jdW1lbnQtbnVtYmVyJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnROdW1iZXIucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdHlwZV09XCIndGV4dCdcIiBuYW1lPVwiZG9jdW1lbnROdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J2RvY3VtZW50TnVtYmVyJyBtaW49XCIxXCIgbWF4PVwiOTk5OTk5OTk5OTlcIiB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnROdW1iZXInXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudE51bWJlciddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2RvY3VtZW50LW51bWJlci1oZWxwJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+PCEtLUZpbGEgNi0tPlxuICAgICAgICAgICAgQGlmKHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3JlcXVpcmVkJyB8fCB0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdzaG93Jyl7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgQGlmKCFnZXRMYWJlbE5vdGVzUGFyYW0oKSl7XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eydub3Rlcyd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgQGlmKHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3JlcXVpcmVkJyl7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmKGdldExhYmVsTm90ZXNQYXJhbSgpOyBhcyBsYWJlbG5vdGVzKXtcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiIFtpbm5lckhUTUxdPVwibGFiZWxub3Rlcy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYodGhpcy5jaGFubmVsLmNoZWNrb3V0Tm90ZXNGaWVsZCA9PSAncmVxdWlyZWQnKXtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwibm90ZXNcIiBmb3JtQ29udHJvbE5hbWU9J25vdGVzJ1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgQGlmKHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3JlcXVpcmVkJyAmJiBjaGVja291dEZvcm0uY29udHJvbHNbJ25vdGVzJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snbm90ZXMnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snbm90ZXMtaGVscCd8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+PCEtLUZpbGEgNy0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmb3JtRmFjdFwiPjxiPnt7ICdzYW1lLWJpbGxpbmctYWRkcmVzcycgfCB0cmFuc2xhdGUgfX08L2I+IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCIgW2NoZWNrZWRdPVwidmlld0RhdGFGYWN0dXJhY2lvblwiIChjaGFuZ2UpPVwic2hvd0Zvcm1GYWN0dXJhY2lvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZm9ybUZhY3RcIj48L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJlcXVpcmVkIHRleHQtdW5kZXJsaW5lIHRleHQtZGFuZ2VyXCI+KiB7eyAncmVxdWlyZWQtZmllbGRzJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+XG4gICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMudGVybXMuZW5hYmxlZCl7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnRlcm1zLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiXCI+IHt7ICdhY2NlcHQtdGVybXMnIHwgdHJhbnNsYXRlIH19IDxpbnB1dCBjbGFzcz1cIm1zLTJcIiBuYW1lPVwidGVybXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSd0ZXJtcycgdHlwZT1cImNoZWNrYm94XCIgcmVxdWlyZWQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiAvPiA8L2xhYmVsPjxiciAvPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtYnMtdGFyZ2V0PVwiI3Rlcm1pbm9zLXktY29uZGljaW9uZXNcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ3doYXRzLXRoaXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1sndGVybXMnXS50b3VjaGVkICYmICFjaGVja291dEZvcm0uY29udHJvbHNbJ3Rlcm1zJ10udmFsdWUpe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7ICdtdXN0LWFjY2VwdC10ZXJtcycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYoIXZpZXdEYXRhRmFjdHVyYWNpb24pe1xuICAgICAgICA8IS0tRm9ybXVsYXJpbyBkZSBGYWN0dXJhY2nDs24tLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxoMj57eyAnYmlsbGluZy1kYXRhJyB8IHRyYW5zbGF0ZSB9fTwvaDI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPjwhLS1GaWxhIDEtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmZpcnN0TmFtZS5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TaSBlcyByZXF1aXJlZC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydmaXJzdC1uYW1lJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZmlyc3ROYW1lLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1JbnB1dC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImZpcnN0TmFtZVwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2ZpcnN0TmFtZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZmlyc3ROYW1lJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2ZpcnN0LW5hbWUtaGVscDEnfHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tRXJyb3IgaW5mby0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZmlyc3ROYW1lJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydmaXJzdE5hbWUnXS5lcnJvcnM/LlsncGF0dGVybiddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2ZpcnN0LW5hbWUtaGVscDInfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5sYXN0TmFtZS5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydsYXN0LW5hbWUnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5sYXN0TmFtZS5yZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJsYXN0TmFtZVwiIGZvcm1Db250cm9sTmFtZT1cImxhc3ROYW1lXCIgdmFsdWU9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snbGFzdE5hbWUnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2xhc3ROYW1lJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2xhc3QtbmFtZS1oZWxwMSd8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snbGFzdE5hbWUnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2xhc3ROYW1lJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snbGFzdC1uYW1lLWhlbHAyJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPjwhLS1GaWxhIDItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5waG9uZU51bWJlci5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydwaG9uZSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnBob25lTnVtYmVyLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwicGhvbmVOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J3Bob25lTnVtYmVyJyB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwaG9uZU51bWJlciddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncGhvbmVOdW1iZXInXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydwaG9uZS1oZWxwMSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Bob25lTnVtYmVyJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwaG9uZU51bWJlciddLmVycm9ycz8uWydwYXR0ZXJuJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sncGhvbmUtaGVscDInfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5lbWFpbC5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydlbWFpbC1hZGRyZXNzJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZW1haWwucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cImVtYWlsXCIgbmFtZT1cImVtYWlsXCIgZm9ybUNvbnRyb2xOYW1lPSdlbWFpbCcgdmFsdWU9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZW1haWwnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2VtYWlsJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snZW1haWwtYWRkcmVzcy1oZWxwMSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2VtYWlsJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydlbWFpbCddLmVycm9ycz8uWydlbWFpbCddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2VtYWlsLWFkZHJlc3MtaGVscDInfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPjwhLS1GaWxhIDMtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5jb3VudHJ5Q29kZS5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjb3VudHJpZXMkIHwgYXN5bmM7IGFzIGNvdW50cmllcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snY291bnRyeSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmNvdW50cnlDb2RlLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIG5hbWU9XCJjb3VudHJ5Q29kZVwiIGZvcm1Db250cm9sTmFtZT0nY291bnRyeUNvZGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Db3VudHJ5U2VsZWN0ZWQoJGV2ZW50LCB0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yKGNvdW50cnkgb2YgY291bnRyaWVzOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJjb3VudHJ5LmNvZGVcIj57eyBjb3VudHJ5Lm5hbWUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IHRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2NvdW50cnktaGVscCd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5wcm92aW5jZUNvZGUuZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYocHJvdmluY2VzJCB8IGFzeW5jOyBhcyBwcm92aW5jZXMpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J3N0YXRlJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMucHJvdmluY2VDb2RlLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIG5hbWU9XCJwcm92aW5jZUNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uUHJvdmluY2VzU2VsZWN0ZWQoJGV2ZW50LCBwcm92aW5jZXMsIHRydWUpXCIgZm9ybUNvbnRyb2xOYW1lPSdwcm92aW5jZUNvZGUnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3snc2VsZWN0LXN0YXRlJ3x0cmFuc2xhdGV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yKHByb3ZpbmNlIG9mIHByb3ZpbmNlczsgdHJhY2sgJGluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwicHJvdmluY2UuY29kZVwiPnt7IHByb3ZpbmNlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IHRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J3N0YXRlLWhlbHAnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuY2l0eS5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyd0b3duLWNpdHknfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5jaXR5LnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiY2l0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0nY2l0eScgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY2l0eSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY2l0eSddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eyd0b3duLWNpdHktaGVscCd8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+PCEtLUZpbGEgNC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnN0cmVldC5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtOFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+e3snYWRkcmVzcyd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnN0cmVldC5yZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInN0cmVldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0nc3RyZWV0JyB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydzdHJlZXQnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3N0cmVldCddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eydhZGRyZXNzLWhlbHAxJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydzdHJlZXQnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3N0cmVldCddLmVycm9ycz8uWydtYXhsZW5ndGgnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snYWRkcmVzcy1oZWxwMid8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZm9ybSBkaXJlY2Npw7NuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnBvc3Rjb2RlLmVuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eydwb3N0YWwtY29kZSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnBvc3Rjb2RlLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwicG9zdGNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J3Bvc3Rjb2RlJyB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwb3N0Y29kZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncG9zdGNvZGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3sncG9zdGFsLWNvZGUtaGVscCd8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncG9zdGNvZGUnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Bvc3Rjb2RlJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+IHt7J3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3InIHwgdHJhbnNsYXRlfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC1kZlwiPjwhLS1GaWxhIDUtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudFR5cGUuZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoZG9jdW1lbnRUeXBlcyQgfCBhc3luYzsgYXMgZG9jdW1lbnRUeXBlcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J2RvY3VtZW50LXR5cGUnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudFR5cGUucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwiZG9jdW1lbnRUeXBlXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Eb2N1bWVudFR5cGVzU2VsZWN0ZWQoJGV2ZW50LCB0cnVlKVwiIGZvcm1Db250cm9sTmFtZT0nZG9jdW1lbnRUeXBlJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvcihpdGVtIG9mIGRvY3VtZW50VHlwZXM7IHRyYWNrICRpbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIml0ZW0uY29kZVwiPnt7aXRlbS5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyd0eXBlLWRvY3VtZW50LWhlbHAnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+e3snZG9jdW1lbnQtbnVtYmVyJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnROdW1iZXIucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdHlwZV09XCIndGV4dCdcIiBuYW1lPVwiZG9jdW1lbnROdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J2RvY3VtZW50TnVtYmVyJyBtaW49XCIxXCIgbWF4PVwiOTk5OTk5OTk5OTlcIiB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudE51bWJlciddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnROdW1iZXInXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydkb2N1bWVudC1udW1iZXItaGVscCd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC1kZlwiPjwhLS1GaWxhIDYtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZih0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcgfHwgdGhpcy5jaGFubmVsLmNoZWNrb3V0Tm90ZXNGaWVsZCA9PSAnc2hvdycpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZighZ2V0TGFiZWxOb3Rlc1BhcmFtKCkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+e3snbm90ZXMnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZih0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRMYWJlbE5vdGVzUGFyYW0oKTsgYXMgbGFiZWxub3Rlcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIiBbaW5uZXJIVE1MXT1cImxhYmVsbm90ZXMudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3JlcXVpcmVkJyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5vdGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdub3RlcycgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZih0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snbm90ZXMnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ25vdGVzJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J25vdGVzLWhlbHAnfHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBkLWZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNoZWNrb3V0Rm9ybS5pbnZhbGlkIHx8ICh0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcgJiYgKCFjaGVja291dEZvcm0uZ2V0KCdub3RlcycpPy52YWx1ZSB8fCBjaGVja291dEZvcm0uZ2V0KCdub3RlcycpPy52YWx1ZS50cmltKCkgPT09ICcnKSkgfHwgKCF2aWV3RGF0YUZhY3R1cmFjaW9uICYmIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uICYmIChjaGVja291dEZvcm1GYWN0dXJhY2lvbi5pbnZhbGlkIHx8ICh0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcgJiYgKCFjaGVja291dEZvcm1GYWN0dXJhY2lvbi5nZXQoJ25vdGVzJyk/LnZhbHVlIHx8IGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmdldCgnbm90ZXMnKT8udmFsdWUudHJpbSgpID09PSAnJykpKSlcIj57eyhpc0xhc3RPbmVcbiAgICAgICAgICAgICAgICAgICAgPyAnZmluaXNoLWNoZWNrb3V0JyA6IChhbGxyZWFkeV9kYXRhID8gJ3VwZGF0ZScgOlxuICAgICAgICAgICAgICAgICAgICAncmVhZHktZm9ybScpKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwhLS0ge3soYWxscmVhZHlfZGF0YSA/ICd1cGRhdGUnIDogKGlzTGFzdE9uZSA/ICdmaW5pc2gtY2hlY2tvdXQnIDogJ3JlYWR5LWZvcm0nKSkgfCB0cmFuc2xhdGV9fSAgLS0+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZihsb2FkaW5nKXtcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGFwcC1sb2FkaW5nLWZ1bGwtZWM+PC9hcHAtbG9hZGluZy1mdWxsLWVjPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgPC9mb3JtPlxuPC9kaXY+XG59IEBlbHNlIHtcbjxkaXYgaWQ9XCJsb2dpbkNoZWNrb3V0XCI+XG4gICAgQGlmKHJlcXVpcmVfbG9naW4pe1xuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgbXktNSBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBcIj5cbiAgICAgICAgICAgIDxhcHAtbG9naW4tZm9ybS1lYyAocmVhZHkpPVwidmVyaWZ5VmFsaWRhdGUoJGV2ZW50KVwiIFtyZWRpcmVjdF09XCJmYWxzZVwiIFt0aXRsZV09XCInbmVlZC1sb2dpbidcIj5cbiAgICAgICAgICAgIDwvYXBwLWxvZ2luLWZvcm0tZWM+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cbjwvZGl2PlxufVxufSBAZWxzZSB7XG5AaWYobW9kZVNlbGVjdEFkZHJlc3MgPT0gJ09OTFlfQUREUkVTU19TRUxFQ1RJT04nKXtcbjxkaXYgY2xhc3M9XCJjaGVja291dC10aXRsZSBteS0yXCI+XG4gICAgPGgzPnt7J2FkZHJlc3Mtc2VsZWN0aW9uJ3x0cmFuc2xhdGV9fTwvaDM+XG48L2Rpdj5cbn1cblxuQGlmKHRoaXMuYWRkcmVzc0Jvb2spe1xuQGlmKHRoaXMuYWRkcmVzc0Jvb2s/Lmxlbmd0aCl7XG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICBAZm9yKGl0ZW0gb2YgYWRkcmVzc0Jvb2s7IHRyYWNrICRpbmRleDsgbGV0IGkgPSAkaW5kZXgpe1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLTEyIG15LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtM1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm1zLTEgbXQtMyBmb3JtLWNoZWNrLWlucHV0IGlucHV0LXNpemUtbGdcIiB0eXBlPVwicmFkaW9cIiBbbmFtZV09XCInbi0nK2lcIiBbaWRdPVwiaVwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIml0ZW0uc2VsZWN0ZWRcIiAoY2xpY2spPVwic2V0U2VsZWN0QWRkcmVzcyhpdGVtKVwiIChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1zLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwiY2FyZC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eydhZGRyZXNzJ3x0cmFuc2xhdGV9fTwvc3Ryb25nPjxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC11cHBlcmNhc2UgaDNcIj57e2l0ZW0uc3RyZWV0fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtc3VidGl0bGUgbWItMiB0ZXh0LW11dGVkIGNvbC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eydjb3VudHJ5J3x0cmFuc2xhdGV9fTwvc3Ryb25nPiB7e2dldENvdW50cnkoaXRlbS5jb3VudHJ5Q29kZSl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtc3VidGl0bGUgbWItMiB0ZXh0LW11dGVkIGNvbC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eydzdGF0ZSd8dHJhbnNsYXRlfX08L3N0cm9uZz4ge3tnZXRQcm92aW5jZShpdGVtLnByb3ZpbmNlQ29kZSl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtc3VidGl0bGUgbWItMiB0ZXh0LW11dGVkIGNvbC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyd0b3duLWNpdHknfHRyYW5zbGF0ZX19PC9zdHJvbmc+IHt7aXRlbS5jaXR5fX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZCBjb2wtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sncG9zdGFsLWNvZGUnfHRyYW5zbGF0ZX19PC9zdHJvbmc+IHt7aXRlbS5wb3N0Y29kZX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBweC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTIgYmctbGlnaHQgdy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eydhZGRyZXNzLWNvbnRhY3QnfHRyYW5zbGF0ZX19PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtYi0yIHRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3snZmlyc3QtbmFtZSd8dHJhbnNsYXRlfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5hZGRyZXNzQ29udGFjdC5maXJzdE5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eydsYXN0LW5hbWUnfHRyYW5zbGF0ZX19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uYWRkcmVzc0NvbnRhY3QubGFzdE5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eydkb2N1bWVudC10eXBlJ3x0cmFuc2xhdGV9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXREb2N1bWVudFR5cGUoaXRlbS5hZGRyZXNzQ29udGFjdC5kb2N1bWVudFR5cGUpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtYi0yIHRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3snZG9jdW1lbnQtbnVtYmVyJ3x0cmFuc2xhdGV9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLmFkZHJlc3NDb250YWN0LmRvY3VtZW50TnVtYmVyfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtYi0yIHRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3snZW1haWwtYWRkcmVzcyd8dHJhbnNsYXRlfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5hZGRyZXNzQ29udGFjdC5lbWFpbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgIEBpZih0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcgfHwgdGhpcy5jaGFubmVsLmNoZWNrb3V0Tm90ZXNGaWVsZCA9PSAnc2hvdycpe1xuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgQGlmKCFnZXRMYWJlbE5vdGVzUGFyYW0oKSl7XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J25vdGVzJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICBAaWYodGhpcy5jaGFubmVsLmNoZWNrb3V0Tm90ZXNGaWVsZCA9PSAncmVxdWlyZWQnKXtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYoZ2V0TGFiZWxOb3Rlc1BhcmFtKCk7IGFzIGxhYmVsbm90ZXMpe1xuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBbaW5uZXJIVE1MXT1cImxhYmVsbm90ZXMudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmKHRoaXMuY2hhbm5lbC5jaGVja291dE5vdGVzRmllbGQgPT0gJ3JlcXVpcmVkJyl7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJub3Rlc1wiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzXCIgI2N0cmw9XCJuZ01vZGVsXCIgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtyZXF1aXJlZF09XCJ0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCdcIj5cbiAgICAgICAgICAgICAgICBAaWYodGhpcy5jaGFubmVsLmNoZWNrb3V0Tm90ZXNGaWVsZCA9PSAncmVxdWlyZWQnICYmIGN0cmwudG91Y2hlZCAmJiBjdHJsLmludmFsaWQpe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J25vdGVzLWhlbHAnfHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZC1mbGV4IGZsZXgtcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU2VsZWN0QWRkcmVzcyhjYXJ0SXRlbXMpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdTdGVwIHx8ICh0aGlzLmNoYW5uZWwuY2hlY2tvdXROb3Rlc0ZpZWxkID09ICdyZXF1aXJlZCcgJiYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzLnRyaW0oKSA9PT0gJycpKVwiPnt7KGlzTGFzdE9uZVxuICAgICAgICAgICAgICAgID8gJ2ZpbmlzaC1jaGVja291dCcgOiAoYWxscmVhZHlfZGF0YSA/ICd1cGRhdGUnIDpcbiAgICAgICAgICAgICAgICAncmVhZHktZm9ybScpKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPCEtLSB7eyhhbGxyZWFkeV9kYXRhID8gJ3VwZGF0ZScgOiAoaXNMYXN0T25lID8gJ2ZpbmlzaC1jaGVja291dCcgOiAncmVhZHktZm9ybScpKSB8IHRyYW5zbGF0ZX19ICAtLT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIEBpZihsb2FkaW5nKXtcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGp1c2l0ZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxhcHAtbG9hZGluZy1mdWxsLWVjPjwvYXBwLWxvYWRpbmctZnVsbC1lYz5cbiAgICA8L2Rpdj5cbiAgICB9XG48L2Rpdj5cbn0gQGVsc2Uge1xuPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiB0ZXh0LWNlbnRlciBteS0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGFwcC1sb2FkaW5nLWZ1bGwtZWM+PC9hcHAtbG9hZGluZy1mdWxsLWVjPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG59XG59IEBlbHNlIHtcbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgdGV4dC1jZW50ZXIgbXktMlwiPlxuICAgICAgICAgICAgPGg0PiB7eydhZGRyZXNzLWJvb2stbm90LXJlc3VsdCcgfCB0cmFuc2xhdGUgfX0gPC9oND5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbn1cblxufVxuXG59XG5AZWxzZSB7XG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgPHA+UG9yIGZhdm9yIDxhIFtyb3V0ZXJMaW5rXT1cIlsnL2F1dGgvbG9naW4nXVwiPiBJbmljaWUgU2VzacOzbjwvYT48L3A+XG48L2Rpdj5cbn1cbn1cbkBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy50ZXJtcy5lbmFibGVkKXtcbjxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlXCIgaWQ9XCJ0ZXJtaW5vcy15LWNvbmRpY2lvbmVzXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cIm1vZGFsTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLXhsIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIm1vZGFsTGFiZWxcIj5Uw6lybWlub3MgeSBjb25kaWNpb25lczwvaDU+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgIDxhcHAtYmxvY2tzLWVjIFtzZWN0aW9uXT1cIid0ZXJtaW5vcy15LWNvbmRpY2lvbmVzJ1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbn0iXX0=