ng-easycommerce 0.0.601 → 0.0.602

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 (592) hide show
  1. package/README.md +938 -936
  2. package/assets/bamboo.html +145 -145
  3. package/assets/bancardCatastro.html +49 -49
  4. package/assets/bancardFrameBase.html +104 -104
  5. package/assets/cecaFrameRedirectBase.html +172 -172
  6. package/assets/decidirFormEc.html +516 -516
  7. package/assets/docs/COOKIES.md +158 -158
  8. package/assets/docs/Parametros-Frontend.md +56 -56
  9. package/assets/ec-i18n/ct.json +290 -290
  10. package/assets/ec-i18n/en.json +0 -0
  11. package/assets/ec-i18n/es.json +400 -400
  12. package/assets/ec-i18n/fr.json +0 -0
  13. package/assets/ec-i18n/gl.json +290 -290
  14. package/assets/ec-i18n/pr.json +290 -290
  15. package/assets/images/whatsapp.png +0 -0
  16. package/assets/mpFrameRedirectBase.html +114 -114
  17. package/assets/recaptcha/recaptcha-site-keys.json +3 -3
  18. package/assets/recaptcha/recaptcha-sites-prod.json +38 -38
  19. package/assets/recaptcha/recaptcha-sites.json +52 -52
  20. package/assets/redirect.html +62 -62
  21. package/assets/redsysAuthVdosBase.html +78 -78
  22. package/assets/redsysAuthVunoBase.html +84 -84
  23. package/assets/redsysFrameRedirectBase.html +102 -102
  24. package/assets/redsysFrameRedirectOutBase.html +102 -102
  25. package/assets/redsysFrameSendBase.html +71 -71
  26. package/assets/redsysProBase.html +399 -399
  27. package/assets/redsysStateBase.html +63 -63
  28. package/assets/scss/_colors.scss +17 -17
  29. package/assets/scss/_styles.scss +22 -22
  30. package/assets/svg/chevron-left-black.svg +61 -61
  31. package/assets/svg/chevron-right-black.svg +61 -61
  32. package/bundles/ng-easycommerce.umd.js +19404 -19391
  33. package/bundles/ng-easycommerce.umd.js.map +1 -1
  34. package/bundles/ng-easycommerce.umd.min.js +1 -1
  35. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  36. package/esm2015/lib/api/connection.service.js +77 -77
  37. package/esm2015/lib/classes/checkout/step-service.js +39 -39
  38. package/esm2015/lib/classes/checkout/step.js +22 -22
  39. package/esm2015/lib/classes/checkout-process-state.js +2 -2
  40. package/esm2015/lib/classes/component-helper.js +14 -14
  41. package/esm2015/lib/classes/filters/AttributesFilter.js +61 -61
  42. package/esm2015/lib/classes/filters/CategoryFilter.js +54 -54
  43. package/esm2015/lib/classes/filters/DinamycsFilter.js +58 -58
  44. package/esm2015/lib/classes/filters/Filter.js +75 -75
  45. package/esm2015/lib/classes/filters/PriceRangeFilter.js +51 -51
  46. package/esm2015/lib/classes/filters/SortFilter.js +79 -79
  47. package/esm2015/lib/classes/user-role-type.js +1 -1
  48. package/esm2015/lib/classes/user.js +108 -108
  49. package/esm2015/lib/core.consts.js +414 -414
  50. package/esm2015/lib/ec-component/account-ec/account-ec.component.js +45 -45
  51. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +119 -119
  52. package/esm2015/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +196 -196
  53. package/esm2015/lib/ec-component/auth-ec/auth-ec.component.js +115 -115
  54. package/esm2015/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +44 -44
  55. package/esm2015/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +58 -58
  56. package/esm2015/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +108 -108
  57. package/esm2015/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +166 -166
  58. package/esm2015/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +165 -165
  59. package/esm2015/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +78 -78
  60. package/esm2015/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +138 -138
  61. package/esm2015/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +110 -110
  62. package/esm2015/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +138 -138
  63. package/esm2015/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +38 -38
  64. package/esm2015/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +152 -152
  65. package/esm2015/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +119 -119
  66. package/esm2015/lib/ec-component/blocks-ec/blocks-ec.component.js +70 -70
  67. package/esm2015/lib/ec-component/build-your-ec/build-your-ec.component.js +305 -305
  68. package/esm2015/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +85 -85
  69. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +398 -398
  70. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +152 -152
  71. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +424 -424
  72. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +88 -88
  73. package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +127 -127
  74. package/esm2015/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +112 -112
  75. package/esm2015/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +53 -53
  76. package/esm2015/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +65 -65
  77. package/esm2015/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +80 -80
  78. package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +220 -220
  79. package/esm2015/lib/ec-component/compared-products-ec/compared-products-ec.component.js +186 -186
  80. package/esm2015/lib/ec-component/cookies-ec/cookies-ec.component.js +109 -109
  81. package/esm2015/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +32 -32
  82. package/esm2015/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +34 -34
  83. package/esm2015/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +34 -34
  84. package/esm2015/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +35 -35
  85. package/esm2015/lib/ec-component/coupon-ec/coupon-ec.component.js +53 -53
  86. package/esm2015/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +49 -49
  87. package/esm2015/lib/ec-component/filters-ec/filters-ec.component.js +152 -152
  88. package/esm2015/lib/ec-component/filters-top-ec/filters-top-ec.component.js +102 -102
  89. package/esm2015/lib/ec-component/footer-ec/footer-ec.component.js +80 -80
  90. package/esm2015/lib/ec-component/header-ec/header-ec.component.js +191 -191
  91. package/esm2015/lib/ec-component/home-ec/home-ec.component.js +37 -37
  92. package/esm2015/lib/ec-component/index.js +241 -241
  93. package/esm2015/lib/ec-component/login-ec/login-ec.component.js +102 -102
  94. package/esm2015/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +90 -90
  95. package/esm2015/lib/ec-component/password-reset-ec/password-reset-ec.component.js +103 -103
  96. package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +168 -168
  97. package/esm2015/lib/ec-component/product-ec/product-ec.component.js +133 -133
  98. package/esm2015/lib/ec-component/related-products-ec/related-products-ec.component.js +94 -94
  99. package/esm2015/lib/ec-component/reviews-ec/reviews-ec.component.js +69 -69
  100. package/esm2015/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +138 -138
  101. package/esm2015/lib/ec-component/section-container-ec/section-container-ec.component.js +86 -86
  102. package/esm2015/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +130 -130
  103. package/esm2015/lib/ec-component/share-block-ec/share-block-ec.component.js +149 -149
  104. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +127 -127
  105. package/esm2015/lib/ec-component/stores-ec/stores-ec.component.js +192 -192
  106. package/esm2015/lib/ec-component/variants-ec/variants-ec.component.js +56 -56
  107. package/esm2015/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +205 -205
  108. package/esm2015/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +296 -296
  109. package/esm2015/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +154 -154
  110. package/esm2015/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +144 -144
  111. package/esm2015/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +49 -49
  112. package/esm2015/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +133 -133
  113. package/esm2015/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +152 -152
  114. package/esm2015/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +175 -175
  115. package/esm2015/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +30 -30
  116. package/esm2015/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +26 -26
  117. package/esm2015/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +21 -21
  118. package/esm2015/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +156 -156
  119. package/esm2015/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +368 -368
  120. package/esm2015/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +151 -151
  121. package/esm2015/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +178 -178
  122. package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +44 -44
  123. package/esm2015/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +83 -83
  124. package/esm2015/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +50 -50
  125. package/esm2015/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +90 -90
  126. package/esm2015/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +143 -143
  127. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +128 -128
  128. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +145 -145
  129. package/esm2015/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +167 -167
  130. package/esm2015/lib/ec-directive/add-action-redirect.directive.js +85 -85
  131. package/esm2015/lib/ec-directive/auth-wholesaler.directive.js +54 -54
  132. package/esm2015/lib/ec-directive/index.js +36 -36
  133. package/esm2015/lib/ec-directive/product-mini-standard.directive.js +65 -65
  134. package/esm2015/lib/ec-directive/product-off.directive.js +144 -144
  135. package/esm2015/lib/ec-directive/product-stock.directive.js +75 -75
  136. package/esm2015/lib/ec-directive/reload-view.directive.js +34 -34
  137. package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +72 -72
  138. package/esm2015/lib/ec-pipe/ec-sanitizer-html.pipe.js +26 -26
  139. package/esm2015/lib/ec-pipe/ec-sanitizer-url.pipe.js +26 -26
  140. package/esm2015/lib/ec-pipe/index.js +13 -13
  141. package/esm2015/lib/guards/able-buyer-guard.service.js +36 -36
  142. package/esm2015/lib/guards/auth-guard.service.js +36 -36
  143. package/esm2015/lib/guards/checkout-ready.service.js +36 -36
  144. package/esm2015/lib/guards/loggedin-guard.service.js +36 -36
  145. package/esm2015/lib/guards/user-role-guard.service.js +38 -38
  146. package/esm2015/lib/interceptors/auth.interceptor.js +55 -55
  147. package/esm2015/lib/interceptors/customer.interceptor.js +48 -48
  148. package/esm2015/lib/interfaces/Script.js +1 -1
  149. package/esm2015/lib/interfaces/analytics/event-key.model.js +1 -1
  150. package/esm2015/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  151. package/esm2015/lib/interfaces/analytics/gtm-config.js +1 -1
  152. package/esm2015/lib/interfaces/analytics/metricool-pixel.js +1 -1
  153. package/esm2015/lib/interfaces/block.js +1 -1
  154. package/esm2015/lib/interfaces/cart/cart-affordable.js +1 -1
  155. package/esm2015/lib/interfaces/checkout/checkout-error.js +1 -1
  156. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  157. package/esm2015/lib/interfaces/choose-options/filter-option.js +6 -6
  158. package/esm2015/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  159. package/esm2015/lib/interfaces/cookies.js +1 -1
  160. package/esm2015/lib/interfaces/core.interfaces.js +1 -1
  161. package/esm2015/lib/interfaces/coupon.js +1 -1
  162. package/esm2015/lib/interfaces/deserializable.js +1 -1
  163. package/esm2015/lib/interfaces/faqs.js +1 -1
  164. package/esm2015/lib/interfaces/filter.js +1 -1
  165. package/esm2015/lib/interfaces/filterStep.js +1 -1
  166. package/esm2015/lib/interfaces/observable-error.interface.js +1 -1
  167. package/esm2015/lib/interfaces/paginate.js +1 -1
  168. package/esm2015/lib/interfaces/parameters.js +1 -1
  169. package/esm2015/lib/interfaces/selection.js +4 -4
  170. package/esm2015/lib/interfaces/step.js +1 -1
  171. package/esm2015/lib/interfaces/store.js +1 -1
  172. package/esm2015/lib/ng-easycommerce.module.js +179 -179
  173. package/esm2015/lib/pipes/order-by.pipe.js +101 -101
  174. package/esm2015/lib/services/account/orders.service.js +102 -102
  175. package/esm2015/lib/services/analytics.service.js +57 -57
  176. package/esm2015/lib/services/auth.service.js +352 -339
  177. package/esm2015/lib/services/banner.service.js +72 -72
  178. package/esm2015/lib/services/blocks/blocks-repository.service.js +62 -62
  179. package/esm2015/lib/services/blocks/blocks.service.js +71 -71
  180. package/esm2015/lib/services/captcha.service.js +130 -130
  181. package/esm2015/lib/services/cart.service.js +571 -571
  182. package/esm2015/lib/services/channel-config.service.js +105 -105
  183. package/esm2015/lib/services/checkout/addressing.service.js +222 -222
  184. package/esm2015/lib/services/checkout/checkout.service.js +233 -233
  185. package/esm2015/lib/services/checkout/error-handler.service.js +81 -81
  186. package/esm2015/lib/services/checkout/payment.service.js +77 -77
  187. package/esm2015/lib/services/checkout/shipment.service.js +183 -183
  188. package/esm2015/lib/services/concatenated-associations.service.js +120 -120
  189. package/esm2015/lib/services/cookies.service.js +208 -208
  190. package/esm2015/lib/services/currency.service.js +161 -161
  191. package/esm2015/lib/services/dataform.service.js +46 -46
  192. package/esm2015/lib/services/filters.service.js +122 -122
  193. package/esm2015/lib/services/gift-card.service.js +61 -61
  194. package/esm2015/lib/services/ip-address.service.js +34 -34
  195. package/esm2015/lib/services/options.service.js +275 -275
  196. package/esm2015/lib/services/pagination.service.js +73 -73
  197. package/esm2015/lib/services/parameters.service.js +72 -72
  198. package/esm2015/lib/services/products/product-detail.service.js +429 -429
  199. package/esm2015/lib/services/products/products.service.js +287 -287
  200. package/esm2015/lib/services/reviews.service.js +107 -107
  201. package/esm2015/lib/services/stores.service.js +37 -37
  202. package/esm2015/lib/services/windows.service.js +52 -52
  203. package/esm2015/lib/services/wishlist.service.js +70 -70
  204. package/esm2015/lib/strategies/standard.strategy.js +43 -43
  205. package/esm2015/lib/utils/analytics/doppler.service.js +37 -37
  206. package/esm2015/lib/utils/analytics/facebook-pixel.service.js +141 -141
  207. package/esm2015/lib/utils/analytics/google-analytics.service.js +265 -265
  208. package/esm2015/lib/utils/analytics/gtm.service.js +341 -341
  209. package/esm2015/lib/utils/analytics/metricool-pixel.service.js +48 -48
  210. package/esm2015/lib/utils/options-of-product-list-data.service.js +96 -96
  211. package/esm2015/lib/utils/order-util.service.js +72 -72
  212. package/esm2015/lib/utils/payment-utils.service.js +35 -35
  213. package/esm2015/lib/utils/shipment-transformer.service.js +66 -66
  214. package/esm2015/lib/utils/toast.service.js +42 -42
  215. package/esm2015/lib/utils/utils.service.js +20 -20
  216. package/esm2015/ng-easycommerce.js +33 -33
  217. package/esm2015/public-api.js +146 -146
  218. package/esm5/lib/api/connection.service.js +90 -90
  219. package/esm5/lib/classes/checkout/step-service.js +74 -74
  220. package/esm5/lib/classes/checkout/step.js +25 -25
  221. package/esm5/lib/classes/checkout-process-state.js +2 -2
  222. package/esm5/lib/classes/component-helper.js +18 -18
  223. package/esm5/lib/classes/filters/AttributesFilter.js +79 -79
  224. package/esm5/lib/classes/filters/CategoryFilter.js +72 -72
  225. package/esm5/lib/classes/filters/DinamycsFilter.js +76 -76
  226. package/esm5/lib/classes/filters/Filter.js +78 -78
  227. package/esm5/lib/classes/filters/PriceRangeFilter.js +68 -68
  228. package/esm5/lib/classes/filters/SortFilter.js +97 -97
  229. package/esm5/lib/classes/user-role-type.js +1 -1
  230. package/esm5/lib/classes/user.js +120 -120
  231. package/esm5/lib/core.consts.js +434 -434
  232. package/esm5/lib/ec-component/account-ec/account-ec.component.js +62 -62
  233. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +173 -173
  234. package/esm5/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +213 -213
  235. package/esm5/lib/ec-component/auth-ec/auth-ec.component.js +132 -132
  236. package/esm5/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +60 -60
  237. package/esm5/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +74 -74
  238. package/esm5/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +125 -125
  239. package/esm5/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +183 -183
  240. package/esm5/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +182 -182
  241. package/esm5/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +106 -106
  242. package/esm5/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +166 -166
  243. package/esm5/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +138 -138
  244. package/esm5/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +165 -165
  245. package/esm5/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +54 -54
  246. package/esm5/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +180 -180
  247. package/esm5/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +146 -146
  248. package/esm5/lib/ec-component/blocks-ec/blocks-ec.component.js +90 -90
  249. package/esm5/lib/ec-component/build-your-ec/build-your-ec.component.js +327 -327
  250. package/esm5/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +112 -112
  251. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +482 -482
  252. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +169 -169
  253. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +509 -509
  254. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +105 -105
  255. package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +217 -217
  256. package/esm5/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +162 -162
  257. package/esm5/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +69 -69
  258. package/esm5/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +82 -82
  259. package/esm5/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +97 -97
  260. package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +261 -261
  261. package/esm5/lib/ec-component/compared-products-ec/compared-products-ec.component.js +209 -209
  262. package/esm5/lib/ec-component/cookies-ec/cookies-ec.component.js +126 -126
  263. package/esm5/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +34 -34
  264. package/esm5/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +36 -36
  265. package/esm5/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +36 -36
  266. package/esm5/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +37 -37
  267. package/esm5/lib/ec-component/coupon-ec/coupon-ec.component.js +71 -71
  268. package/esm5/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +66 -66
  269. package/esm5/lib/ec-component/filters-ec/filters-ec.component.js +168 -168
  270. package/esm5/lib/ec-component/filters-top-ec/filters-top-ec.component.js +118 -118
  271. package/esm5/lib/ec-component/footer-ec/footer-ec.component.js +109 -109
  272. package/esm5/lib/ec-component/header-ec/header-ec.component.js +250 -250
  273. package/esm5/lib/ec-component/home-ec/home-ec.component.js +53 -53
  274. package/esm5/lib/ec-component/index.js +241 -241
  275. package/esm5/lib/ec-component/login-ec/login-ec.component.js +118 -118
  276. package/esm5/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +106 -106
  277. package/esm5/lib/ec-component/password-reset-ec/password-reset-ec.component.js +119 -119
  278. package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +195 -195
  279. package/esm5/lib/ec-component/product-ec/product-ec.component.js +151 -151
  280. package/esm5/lib/ec-component/related-products-ec/related-products-ec.component.js +111 -111
  281. package/esm5/lib/ec-component/reviews-ec/reviews-ec.component.js +85 -85
  282. package/esm5/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +155 -155
  283. package/esm5/lib/ec-component/section-container-ec/section-container-ec.component.js +103 -103
  284. package/esm5/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +149 -149
  285. package/esm5/lib/ec-component/share-block-ec/share-block-ec.component.js +166 -166
  286. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +130 -130
  287. package/esm5/lib/ec-component/stores-ec/stores-ec.component.js +214 -214
  288. package/esm5/lib/ec-component/variants-ec/variants-ec.component.js +72 -72
  289. package/esm5/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +221 -221
  290. package/esm5/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +313 -313
  291. package/esm5/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +170 -170
  292. package/esm5/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +160 -160
  293. package/esm5/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +83 -83
  294. package/esm5/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +149 -149
  295. package/esm5/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +156 -156
  296. package/esm5/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +192 -192
  297. package/esm5/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +46 -46
  298. package/esm5/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +42 -42
  299. package/esm5/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +23 -23
  300. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +174 -174
  301. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +396 -396
  302. package/esm5/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +167 -167
  303. package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +231 -231
  304. package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +60 -60
  305. package/esm5/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +100 -100
  306. package/esm5/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +53 -53
  307. package/esm5/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +124 -124
  308. package/esm5/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +159 -159
  309. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +144 -144
  310. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +162 -162
  311. package/esm5/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +181 -181
  312. package/esm5/lib/ec-directive/add-action-redirect.directive.js +104 -104
  313. package/esm5/lib/ec-directive/auth-wholesaler.directive.js +60 -60
  314. package/esm5/lib/ec-directive/index.js +36 -36
  315. package/esm5/lib/ec-directive/product-mini-standard.directive.js +72 -72
  316. package/esm5/lib/ec-directive/product-off.directive.js +163 -163
  317. package/esm5/lib/ec-directive/product-stock.directive.js +81 -81
  318. package/esm5/lib/ec-directive/reload-view.directive.js +35 -35
  319. package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +74 -74
  320. package/esm5/lib/ec-pipe/ec-sanitizer-html.pipe.js +27 -27
  321. package/esm5/lib/ec-pipe/ec-sanitizer-url.pipe.js +27 -27
  322. package/esm5/lib/ec-pipe/index.js +13 -13
  323. package/esm5/lib/guards/able-buyer-guard.service.js +37 -37
  324. package/esm5/lib/guards/auth-guard.service.js +37 -37
  325. package/esm5/lib/guards/checkout-ready.service.js +37 -37
  326. package/esm5/lib/guards/loggedin-guard.service.js +37 -37
  327. package/esm5/lib/guards/user-role-guard.service.js +39 -39
  328. package/esm5/lib/interceptors/auth.interceptor.js +57 -57
  329. package/esm5/lib/interceptors/customer.interceptor.js +50 -50
  330. package/esm5/lib/interfaces/Script.js +1 -1
  331. package/esm5/lib/interfaces/analytics/event-key.model.js +1 -1
  332. package/esm5/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  333. package/esm5/lib/interfaces/analytics/gtm-config.js +1 -1
  334. package/esm5/lib/interfaces/analytics/metricool-pixel.js +1 -1
  335. package/esm5/lib/interfaces/block.js +1 -1
  336. package/esm5/lib/interfaces/cart/cart-affordable.js +1 -1
  337. package/esm5/lib/interfaces/checkout/checkout-error.js +1 -1
  338. package/esm5/lib/interfaces/checkout-data.js +1 -1
  339. package/esm5/lib/interfaces/choose-options/filter-option.js +6 -6
  340. package/esm5/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  341. package/esm5/lib/interfaces/cookies.js +1 -1
  342. package/esm5/lib/interfaces/core.interfaces.js +1 -1
  343. package/esm5/lib/interfaces/coupon.js +1 -1
  344. package/esm5/lib/interfaces/deserializable.js +1 -1
  345. package/esm5/lib/interfaces/faqs.js +1 -1
  346. package/esm5/lib/interfaces/filter.js +1 -1
  347. package/esm5/lib/interfaces/filterStep.js +1 -1
  348. package/esm5/lib/interfaces/observable-error.interface.js +1 -1
  349. package/esm5/lib/interfaces/paginate.js +1 -1
  350. package/esm5/lib/interfaces/parameters.js +1 -1
  351. package/esm5/lib/interfaces/selection.js +4 -4
  352. package/esm5/lib/interfaces/step.js +1 -1
  353. package/esm5/lib/interfaces/store.js +1 -1
  354. package/esm5/lib/ng-easycommerce.module.js +183 -183
  355. package/esm5/lib/pipes/order-by.pipe.js +106 -106
  356. package/esm5/lib/services/account/orders.service.js +120 -120
  357. package/esm5/lib/services/analytics.service.js +60 -60
  358. package/esm5/lib/services/auth.service.js +426 -413
  359. package/esm5/lib/services/banner.service.js +81 -81
  360. package/esm5/lib/services/blocks/blocks-repository.service.js +94 -94
  361. package/esm5/lib/services/blocks/blocks.service.js +79 -79
  362. package/esm5/lib/services/captcha.service.js +132 -132
  363. package/esm5/lib/services/cart.service.js +700 -700
  364. package/esm5/lib/services/channel-config.service.js +107 -107
  365. package/esm5/lib/services/checkout/addressing.service.js +280 -280
  366. package/esm5/lib/services/checkout/checkout.service.js +316 -316
  367. package/esm5/lib/services/checkout/error-handler.service.js +83 -83
  368. package/esm5/lib/services/checkout/payment.service.js +125 -125
  369. package/esm5/lib/services/checkout/shipment.service.js +265 -265
  370. package/esm5/lib/services/concatenated-associations.service.js +162 -162
  371. package/esm5/lib/services/cookies.service.js +222 -222
  372. package/esm5/lib/services/currency.service.js +205 -205
  373. package/esm5/lib/services/dataform.service.js +48 -48
  374. package/esm5/lib/services/filters.service.js +125 -125
  375. package/esm5/lib/services/gift-card.service.js +63 -63
  376. package/esm5/lib/services/ip-address.service.js +35 -35
  377. package/esm5/lib/services/options.service.js +376 -376
  378. package/esm5/lib/services/pagination.service.js +79 -79
  379. package/esm5/lib/services/parameters.service.js +74 -74
  380. package/esm5/lib/services/products/product-detail.service.js +494 -494
  381. package/esm5/lib/services/products/products.service.js +345 -345
  382. package/esm5/lib/services/reviews.service.js +116 -116
  383. package/esm5/lib/services/stores.service.js +39 -39
  384. package/esm5/lib/services/windows.service.js +79 -79
  385. package/esm5/lib/services/wishlist.service.js +71 -71
  386. package/esm5/lib/strategies/standard.strategy.js +44 -44
  387. package/esm5/lib/utils/analytics/doppler.service.js +39 -39
  388. package/esm5/lib/utils/analytics/facebook-pixel.service.js +145 -145
  389. package/esm5/lib/utils/analytics/google-analytics.service.js +280 -280
  390. package/esm5/lib/utils/analytics/gtm.service.js +358 -358
  391. package/esm5/lib/utils/analytics/metricool-pixel.service.js +40 -40
  392. package/esm5/lib/utils/options-of-product-list-data.service.js +98 -98
  393. package/esm5/lib/utils/order-util.service.js +75 -75
  394. package/esm5/lib/utils/payment-utils.service.js +37 -37
  395. package/esm5/lib/utils/shipment-transformer.service.js +78 -78
  396. package/esm5/lib/utils/toast.service.js +61 -61
  397. package/esm5/lib/utils/utils.service.js +22 -22
  398. package/esm5/ng-easycommerce.js +33 -33
  399. package/esm5/public-api.js +146 -146
  400. package/fesm2015/ng-easycommerce.js +16415 -16402
  401. package/fesm2015/ng-easycommerce.js.map +1 -1
  402. package/fesm5/ng-easycommerce.js +19408 -19395
  403. package/fesm5/ng-easycommerce.js.map +1 -1
  404. package/lib/api/connection.service.d.ts +28 -28
  405. package/lib/classes/checkout/step-service.d.ts +28 -28
  406. package/lib/classes/checkout/step.d.ts +14 -14
  407. package/lib/classes/checkout-process-state.d.ts +12 -12
  408. package/lib/classes/component-helper.d.ts +8 -8
  409. package/lib/classes/filters/AttributesFilter.d.ts +18 -18
  410. package/lib/classes/filters/CategoryFilter.d.ts +17 -17
  411. package/lib/classes/filters/DinamycsFilter.d.ts +15 -15
  412. package/lib/classes/filters/Filter.d.ts +19 -19
  413. package/lib/classes/filters/PriceRangeFilter.d.ts +18 -18
  414. package/lib/classes/filters/SortFilter.d.ts +15 -15
  415. package/lib/classes/user-role-type.d.ts +5 -5
  416. package/lib/classes/user.d.ts +68 -68
  417. package/lib/core.consts.d.ts +216 -216
  418. package/lib/ec-component/account-ec/account-ec.component.d.ts +13 -13
  419. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +34 -34
  420. package/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.d.ts +85 -85
  421. package/lib/ec-component/auth-ec/auth-ec.component.d.ts +35 -35
  422. package/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.d.ts +13 -13
  423. package/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.d.ts +16 -16
  424. package/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.d.ts +26 -26
  425. package/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.d.ts +34 -34
  426. package/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.d.ts +42 -42
  427. package/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.d.ts +23 -23
  428. package/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.d.ts +34 -34
  429. package/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.d.ts +27 -27
  430. package/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.d.ts +34 -34
  431. package/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.d.ts +10 -10
  432. package/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.d.ts +40 -40
  433. package/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.d.ts +25 -25
  434. package/lib/ec-component/blocks-ec/blocks-ec.component.d.ts +24 -24
  435. package/lib/ec-component/build-your-ec/build-your-ec.component.d.ts +122 -122
  436. package/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.d.ts +41 -41
  437. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +57 -57
  438. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +43 -43
  439. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +100 -100
  440. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +24 -24
  441. package/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.d.ts +51 -51
  442. package/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.d.ts +34 -34
  443. package/lib/ec-component/checkout-ec/step-ec/step-ec.component.d.ts +18 -18
  444. package/lib/ec-component/checkout-ec/success-ec/success-ec.component.d.ts +32 -32
  445. package/lib/ec-component/checkout-error-ec/checkout-error-ec.component.d.ts +25 -25
  446. package/lib/ec-component/collection-ec/collection-ec.component.d.ts +67 -67
  447. package/lib/ec-component/compared-products-ec/compared-products-ec.component.d.ts +70 -70
  448. package/lib/ec-component/cookies-ec/cookies-ec.component.d.ts +44 -44
  449. package/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.d.ts +10 -10
  450. package/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.d.ts +8 -8
  451. package/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.d.ts +9 -9
  452. package/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.d.ts +9 -9
  453. package/lib/ec-component/coupon-ec/coupon-ec.component.d.ts +17 -17
  454. package/lib/ec-component/faqs-content-ec/faqs-content-ec.component.d.ts +15 -15
  455. package/lib/ec-component/filters-ec/filters-ec.component.d.ts +33 -33
  456. package/lib/ec-component/filters-top-ec/filters-top-ec.component.d.ts +23 -23
  457. package/lib/ec-component/footer-ec/footer-ec.component.d.ts +30 -30
  458. package/lib/ec-component/header-ec/header-ec.component.d.ts +66 -66
  459. package/lib/ec-component/home-ec/home-ec.component.d.ts +13 -13
  460. package/lib/ec-component/index.d.ts +80 -80
  461. package/lib/ec-component/login-ec/login-ec.component.d.ts +26 -26
  462. package/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.d.ts +28 -28
  463. package/lib/ec-component/password-reset-ec/password-reset-ec.component.d.ts +27 -27
  464. package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +59 -59
  465. package/lib/ec-component/product-ec/product-ec.component.d.ts +49 -49
  466. package/lib/ec-component/related-products-ec/related-products-ec.component.d.ts +22 -22
  467. package/lib/ec-component/reviews-ec/reviews-ec.component.d.ts +29 -29
  468. package/lib/ec-component/reviews-form-ec/reviews-form-ec.component.d.ts +61 -61
  469. package/lib/ec-component/section-container-ec/section-container-ec.component.d.ts +22 -22
  470. package/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.d.ts +37 -37
  471. package/lib/ec-component/share-block-ec/share-block-ec.component.d.ts +26 -26
  472. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +27 -27
  473. package/lib/ec-component/stores-ec/stores-ec.component.d.ts +54 -54
  474. package/lib/ec-component/variants-ec/variants-ec.component.d.ts +14 -14
  475. package/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.d.ts +60 -60
  476. package/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.d.ts +105 -105
  477. package/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.d.ts +46 -46
  478. package/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.d.ts +44 -44
  479. package/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.d.ts +14 -14
  480. package/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.d.ts +38 -38
  481. package/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.d.ts +38 -38
  482. package/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.d.ts +53 -53
  483. package/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.d.ts +6 -6
  484. package/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.d.ts +5 -5
  485. package/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.d.ts +5 -5
  486. package/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.d.ts +43 -43
  487. package/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.d.ts +64 -64
  488. package/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.d.ts +46 -46
  489. package/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.d.ts +41 -41
  490. package/lib/ec-component/widgets-ec/price-ec/price-ec.component.d.ts +12 -12
  491. package/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.d.ts +28 -28
  492. package/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.d.ts +24 -24
  493. package/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.d.ts +14 -14
  494. package/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.d.ts +44 -44
  495. package/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.d.ts +38 -38
  496. package/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.d.ts +42 -42
  497. package/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.d.ts +66 -66
  498. package/lib/ec-directive/add-action-redirect.directive.d.ts +26 -26
  499. package/lib/ec-directive/auth-wholesaler.directive.d.ts +17 -17
  500. package/lib/ec-directive/index.d.ts +6 -6
  501. package/lib/ec-directive/product-mini-standard.directive.d.ts +19 -19
  502. package/lib/ec-directive/product-off.directive.d.ts +22 -22
  503. package/lib/ec-directive/product-stock.directive.d.ts +15 -15
  504. package/lib/ec-directive/reload-view.directive.d.ts +8 -8
  505. package/lib/ec-pipe/ec-currency-symbol.pipe.d.ts +19 -19
  506. package/lib/ec-pipe/ec-sanitizer-html.pipe.d.ts +7 -7
  507. package/lib/ec-pipe/ec-sanitizer-url.pipe.d.ts +7 -7
  508. package/lib/ec-pipe/index.d.ts +4 -4
  509. package/lib/guards/able-buyer-guard.service.d.ts +8 -8
  510. package/lib/guards/auth-guard.service.d.ts +8 -8
  511. package/lib/guards/checkout-ready.service.d.ts +8 -8
  512. package/lib/guards/loggedin-guard.service.d.ts +8 -8
  513. package/lib/guards/user-role-guard.service.d.ts +8 -8
  514. package/lib/interceptors/auth.interceptor.d.ts +9 -9
  515. package/lib/interceptors/customer.interceptor.d.ts +9 -9
  516. package/lib/interfaces/Script.d.ts +5 -5
  517. package/lib/interfaces/analytics/event-key.model.d.ts +1 -1
  518. package/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.d.ts +5 -5
  519. package/lib/interfaces/analytics/gtm-config.d.ts +6 -6
  520. package/lib/interfaces/analytics/metricool-pixel.d.ts +3 -3
  521. package/lib/interfaces/block.d.ts +33 -33
  522. package/lib/interfaces/cart/cart-affordable.d.ts +8 -8
  523. package/lib/interfaces/cart-item.d.ts +8 -8
  524. package/lib/interfaces/checkout/checkout-error.d.ts +7 -7
  525. package/lib/interfaces/checkout-data.d.ts +6 -6
  526. package/lib/interfaces/choose-options/filter-option.d.ts +16 -16
  527. package/lib/interfaces/choose-options/options-of-product-list.d.ts +5 -5
  528. package/lib/interfaces/cookies.d.ts +49 -49
  529. package/lib/interfaces/core.interfaces.d.ts +4 -4
  530. package/lib/interfaces/coupon.d.ts +5 -5
  531. package/lib/interfaces/currencyConfig.d.ts +10 -10
  532. package/lib/interfaces/deserializable.d.ts +3 -3
  533. package/lib/interfaces/faqs.d.ts +12 -12
  534. package/lib/interfaces/filter.d.ts +51 -51
  535. package/lib/interfaces/filterStep.d.ts +29 -29
  536. package/lib/interfaces/navbar-items.d.ts +9 -9
  537. package/lib/interfaces/observable-error.interface.d.ts +5 -5
  538. package/lib/interfaces/paginate.d.ts +1 -1
  539. package/lib/interfaces/parameters.d.ts +10 -10
  540. package/lib/interfaces/paramsInterfaces/paramsProductsWithUniqueVariant.d.ts +6 -6
  541. package/lib/interfaces/product.d.ts +46 -46
  542. package/lib/interfaces/selection.d.ts +10 -10
  543. package/lib/interfaces/step.d.ts +8 -8
  544. package/lib/interfaces/store.d.ts +17 -17
  545. package/lib/ng-easycommerce.module.d.ts +5 -5
  546. package/lib/pipes/order-by.pipe.d.ts +5 -5
  547. package/lib/services/account/orders.service.d.ts +29 -29
  548. package/lib/services/analytics.service.d.ts +21 -21
  549. package/lib/services/auth.service.d.ts +116 -116
  550. package/lib/services/banner.service.d.ts +26 -26
  551. package/lib/services/blocks/blocks-repository.service.d.ts +19 -19
  552. package/lib/services/blocks/blocks.service.d.ts +25 -25
  553. package/lib/services/captcha.service.d.ts +76 -76
  554. package/lib/services/cart.service.d.ts +139 -139
  555. package/lib/services/channel-config.service.d.ts +35 -35
  556. package/lib/services/checkout/addressing.service.d.ts +239 -239
  557. package/lib/services/checkout/checkout.service.d.ts +71 -71
  558. package/lib/services/checkout/error-handler.service.d.ts +19 -19
  559. package/lib/services/checkout/payment.service.d.ts +32 -32
  560. package/lib/services/checkout/shipment.service.d.ts +58 -58
  561. package/lib/services/concatenated-associations.service.d.ts +57 -57
  562. package/lib/services/cookies.service.d.ts +66 -66
  563. package/lib/services/currency.service.d.ts +65 -65
  564. package/lib/services/dataform.service.d.ts +13 -13
  565. package/lib/services/filters.service.d.ts +48 -48
  566. package/lib/services/gift-card.service.d.ts +19 -19
  567. package/lib/services/ip-address.service.d.ts +10 -10
  568. package/lib/services/options.service.d.ts +61 -61
  569. package/lib/services/pagination.service.d.ts +30 -30
  570. package/lib/services/parameters.service.d.ts +18 -18
  571. package/lib/services/products/product-detail.service.d.ts +115 -115
  572. package/lib/services/products/products.service.d.ts +101 -101
  573. package/lib/services/reviews.service.d.ts +71 -71
  574. package/lib/services/stores.service.d.ts +11 -11
  575. package/lib/services/windows.service.d.ts +13 -13
  576. package/lib/services/wishlist.service.d.ts +13 -13
  577. package/lib/strategies/standard.strategy.d.ts +12 -12
  578. package/lib/utils/analytics/doppler.service.d.ts +9 -9
  579. package/lib/utils/analytics/facebook-pixel.service.d.ts +23 -23
  580. package/lib/utils/analytics/google-analytics.service.d.ts +30 -30
  581. package/lib/utils/analytics/gtm.service.d.ts +34 -34
  582. package/lib/utils/analytics/metricool-pixel.service.d.ts +9 -9
  583. package/lib/utils/options-of-product-list-data.service.d.ts +5 -5
  584. package/lib/utils/order-util.service.d.ts +12 -12
  585. package/lib/utils/payment-utils.service.d.ts +5 -5
  586. package/lib/utils/shipment-transformer.service.d.ts +8 -8
  587. package/lib/utils/toast.service.d.ts +15 -15
  588. package/lib/utils/utils.service.d.ts +4 -4
  589. package/ng-easycommerce.d.ts +33 -33
  590. package/ng-easycommerce.metadata.json +1 -1
  591. package/package.json +1 -1
  592. package/public-api.d.ts +144 -144
@@ -1,413 +1,426 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
13
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
- return c > 3 && r && Object.defineProperty(target, key, r), r;
17
- };
18
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
19
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
20
- return new (P || (P = Promise))(function (resolve, reject) {
21
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
22
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
23
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
24
- step((generator = generator.apply(thisArg, _arguments || [])).next());
25
- });
26
- };
27
- var __generator = (this && this.__generator) || function (thisArg, body) {
28
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
29
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
30
- function verb(n) { return function (v) { return step([n, v]); }; }
31
- function step(op) {
32
- if (f) throw new TypeError("Generator is already executing.");
33
- while (_) try {
34
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
35
- if (y = 0, t) op = [op[0] & 2, t.value];
36
- switch (op[0]) {
37
- case 0: case 1: t = op; break;
38
- case 4: _.label++; return { value: op[1], done: false };
39
- case 5: _.label++; y = op[1]; op = [0]; continue;
40
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
41
- default:
42
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
43
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
44
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
45
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
46
- if (t[2]) _.ops.pop();
47
- _.trys.pop(); continue;
48
- }
49
- op = body.call(thisArg, _);
50
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
51
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
52
- }
53
- };
54
- var __read = (this && this.__read) || function (o, n) {
55
- var m = typeof Symbol === "function" && o[Symbol.iterator];
56
- if (!m) return o;
57
- var i = m.call(o), r, ar = [], e;
58
- try {
59
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
60
- }
61
- catch (error) { e = { error: error }; }
62
- finally {
63
- try {
64
- if (r && !r.done && (m = i["return"])) m.call(i);
65
- }
66
- finally { if (e) throw e.error; }
67
- }
68
- return ar;
69
- };
70
- var __spread = (this && this.__spread) || function () {
71
- for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
72
- return ar;
73
- };
74
- import { Injectable, Injector } from '@angular/core';
75
- import { ConnectionService } from '../api/connection.service';
76
- import { Observable, BehaviorSubject, of } from 'rxjs';
77
- import { User } from '../classes/user';
78
- import 'rxjs/add/observable/of';
79
- import { ToastrService } from 'ngx-toastr';
80
- import { Constants } from '../core.consts';
81
- import { map, mapTo, catchError } from 'rxjs/operators';
82
- import * as moment from "moment";
83
- import { ChannelConfigService } from './channel-config.service';
84
- import { CartService } from './cart.service';
85
- import * as i0 from "@angular/core";
86
- import * as i1 from "../../public-api";
87
- import * as i2 from "ngx-toastr";
88
- var AuthService = /** @class */ (function () {
89
- function AuthService(connection, toastrService, constants, injector) {
90
- var _this = this;
91
- this.connection = connection;
92
- this.toastrService = toastrService;
93
- this.constants = constants;
94
- this.injector = injector;
95
- this.JWT_TOKEN = 'JWT_TOKEN';
96
- this.REFRESH_TOKEN = 'REFRESH_TOKEN';
97
- this.EXPIRATES_IN = 'EXPIRATES_IN';
98
- this.USER = 'USER';
99
- this.MAIL = 'mail';
100
- this.LOCALE = 'LOCALE';
101
- this.CHANNEL = 'CHANNEL';
102
- this.CUSTOMER = 'CUSTOMER';
103
- this.CHANNELSELLER = 'CHANNELSELLER';
104
- /* activeChannelSwitch? */
105
- this.activeChannelChange = false;
106
- this.loggedInSubject = new BehaviorSubject(false);
107
- this.loggingInSubject = new BehaviorSubject(false);
108
- this.userInSubject = new BehaviorSubject(null);
109
- this.channelsUserSubject = new BehaviorSubject([]);
110
- /* private customerSubject = new BehaviorSubject<any>(null) */
111
- this.user = null;
112
- // APIS
113
- this.tokenApi = function () { return 'shop-api/login_check'; };
114
- this.registerApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/register'; };
115
- this.registerWholesalerApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/register-wholesaler'; };
116
- this.confirmAccountApi = function (token) { return 'shop-api/' + _this.constants.getChannel() + '/verify-account?token=' + token; };
117
- this.resetPasswordApi = function (token) { return 'shop-api/' + _this.constants.getChannel() + '/password-reset/' + token; };
118
- this.recoverPasswordApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/request-password-reset'; };
119
- this.countriesApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/countries'; };
120
- // Atributos utiles
121
- this.waiting = false;
122
- this.loggedIn = this.loggedInSubject.asObservable();
123
- this.loggingIn = this.loggingInSubject.asObservable();
124
- this.userAuth = this.userInSubject.asObservable();
125
- this.channelsUser = this.channelsUserSubject.asObservable();
126
- /* private customer = this.channelsUserSubject.asObservable() */
127
- this.customer = null;
128
- this.channel = null;
129
- this.channels = [];
130
- this.homeResolver = null;
131
- this.channelAccessPermission = function (res) {
132
- var _a, _b, _c;
133
- _this.channelsUserSubject.next([]);
134
- /* Please remove this ASAP - Needs *channels* array in user object ALWAYS */
135
- /* if (UserRoleType.SELLER == res.type as UserRoleType) return true */
136
- /* No authorized channels */
137
- if (((_a = res.channels) === null || _a === void 0 ? void 0 : _a.length) == 0) {
138
- return false;
139
- }
140
- /* Some authorized channel(s) including current channel */
141
- if (res.channels.find(function (userchannel) { return userchannel.code === _this.channel.code; })) {
142
- /* Multiple authorized channels including current channel */
143
- if (((_b = res.channels) === null || _b === void 0 ? void 0 : _b.length) > 1 && _this.activeChannelChange)
144
- _this.channelsUserSubject.next(res.channels);
145
- return true;
146
- }
147
- /* One authorized channel not including current channel */
148
- if (((_c = res.channels) === null || _c === void 0 ? void 0 : _c.length) == 1 && _this.activeChannelChange) {
149
- delete res.password;
150
- _this.channelAccess(res.channels[0], res);
151
- return true;
152
- }
153
- /* Multiple authorized channels not including current channel */
154
- if (_this.activeChannelChange) {
155
- _this.channelsUserSubject.next(res.channels);
156
- return true;
157
- }
158
- return false;
159
- };
160
- this.channelAccess = function (channel, user) {
161
- if (user === void 0) { user = null; }
162
- if (window.location.hostname != channel.hostname) {
163
- var encoded = btoa(JSON.stringify(user != null ? user : _this.user));
164
- window.location.replace(window.location.protocol + "//" + channel.hostname + "/auth/redirect/" + encoded);
165
- }
166
- else {
167
- _this.constants.modifyChannelConfig(channel);
168
- window.location.reload();
169
- }
170
- };
171
- /**
172
- * @desc Devuelve una promesa
173
- * @param user Objeto que contiene username y password
174
- */
175
- this.doLogin = function (user) {
176
- _this.loggingInSubject.next(true);
177
- user = __assign(__assign({}, user), _this.constants.loginExtraData());
178
- return _this.connection.post(_this.tokenApi(), user).pipe(map(function (res) { return _this.doLoginUser(res); }), mapTo('ok'), catchError(function (err) {
179
- _this.loggingInSubject.next(false);
180
- return of(err.toString());
181
- })).toPromise();
182
- };
183
- this.signUp = function (data) { return _this.connection.post(_this.registerApi(), data); };
184
- this.confirmAccount = function (token) {
185
- return _this.connection.get(_this.confirmAccountApi(token));
186
- };
187
- this.passwordReset = function (new_password, token) {
188
- var data = { password: { first: new_password, second: new_password } };
189
- return _this.connection.put(_this.resetPasswordApi(token), data);
190
- };
191
- this.recoverPassword = function (email) {
192
- return _this.connection.put(_this.recoverPasswordApi(), { email: email });
193
- };
194
- this.isTokenExpired = function () {
195
- var fecha_expiracion = _this.getExpiratesAt();
196
- var result = moment() >= moment(fecha_expiracion);
197
- return result;
198
- };
199
- this.getExpiratesAt = function () { return localStorage.getItem(_this.EXPIRATES_IN); };
200
- this.hasToRefresh = function () { return _this.getRefreshToken(); };
201
- this.signUpWholesaler = function (data) { return _this.connection.post(_this.registerWholesalerApi(), data); };
202
- this.getCountriesData = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
203
- return [2 /*return*/, this.connection.get(this.countriesApi()).pipe(map(function (res) { return res._embedded.items; })).toPromise()];
204
- }); }); };
205
- this.setActiveChannelChange = function (activelyChangeChannelsOnLogin) { return _this.activeChannelChange = activelyChangeChannelsOnLogin; };
206
- this.isAllowedRole = function (allowedRoles, role) {
207
- return allowedRoles.length
208
- ? allowedRoles.includes(role)
209
- : true;
210
- };
211
- /* Please remove this ASAP - Needs *channels* array in user object ALWAYS */
212
- this.forceChannelsForSeller = function (tokens) {
213
- var _a;
214
- var _b;
215
- if ("seller" /* SELLER */ == tokens.type)
216
- ((_b = _this.channels) === null || _b === void 0 ? void 0 : _b.length) ? (_a = _this.user).setChannels.apply(_a, __spread(_this.channels)) : _this.user.setChannels(_this.channel);
217
- };
218
- /**
219
- * @description Cambia de canal
220
- * @param channelConfig debe ser un objeto que contenga al menos las keys channel y locale.
221
- */
222
- this.changeChannel = function (channelConfig) {
223
- _this.constants.modifyChannelConfig({
224
- channel: channelConfig.channel,
225
- locale: channelConfig.locale
226
- });
227
- };
228
- /**
229
- * @description Carga el cliente con el que se realizaran pedidos. Si recibe el valor null
230
- * se vuelve a cargar el vendedor para su uso.
231
- * @param customer
232
- */
233
- this.setCustomer = function (customer) {
234
- var refreshPage = false;
235
- _this.customer = customer;
236
- localStorage.setItem(_this.CUSTOMER, JSON.stringify(customer));
237
- var sameChannel = customer ? _this.sameChannel(customer.channels[0].code, customer.channels[0].locales.code) : null;
238
- if (customer) {
239
- if (!sameChannel) {
240
- !localStorage.getItem(_this.CHANNELSELLER) ?
241
- localStorage.setItem(_this.CHANNELSELLER, JSON.stringify({
242
- channel: _this.constants.getChannel(),
243
- locale: _this.constants.getLocale()
244
- })) : null;
245
- _this.changeChannel({
246
- channel: customer.channels[0].code,
247
- locale: customer.channels[0].locales.code
248
- });
249
- refreshPage = true;
250
- }
251
- }
252
- else {
253
- var res = JSON.parse(localStorage.getItem(_this.CHANNELSELLER));
254
- if (res) {
255
- if (!_this.sameChannel(res.channel, res.locale)) {
256
- _this.changeChannel(res);
257
- refreshPage = true;
258
- }
259
- localStorage.removeItem(_this.CHANNELSELLER);
260
- }
261
- }
262
- _this.injector.get(CartService).clearAndResetCustomerCart();
263
- refreshPage ? location.href = location.href : null;
264
- };
265
- /**
266
- * @description Comprueba si los valores del canal actual son iguales a los ingresado por parametros.
267
- * @param {string} channel Nombre del canal
268
- * @param {string} locale Locale del canal
269
- * @returns {boolean} True si es el mismo canal, False caso contrario.
270
- */
271
- this.sameChannel = function (channel, locale) { return (channel == _this.constants.getChannel()) && (locale == _this.constants.getLocale()); };
272
- /* public getCustomer = () => Observable.of(JSON.parse(localStorage.getItem(this.CUSTOMER))) */
273
- this.getCustomer = function () {
274
- /* this.customerSubject.next(JSON.parse(localStorage.getItem(this.CUSTOMER)))
275
- return this.customer */
276
- return _this.customer || JSON.parse(localStorage.getItem(_this.CUSTOMER));
277
- };
278
- this.setHomeResolver = function (resolverFunction) { return _this.homeResolver = resolverFunction; };
279
- this.getHomeResolver = function () { return _this.homeResolver; };
280
- this.isAbleToBuy = function () { var _a; return !((_a = _this.getUserProfileAsUser()) === null || _a === void 0 ? void 0 : _a.isSeller()) || !!_this.getCustomer(); };
281
- /**
282
- * @description Evalua si el valor que ingresa por parámetro es mayor o igual al mínimo de compra
283
- * que el usuario tiene asignado a ese canal, diferenciando si es mayorista o minorista.
284
- * @param {number} value
285
- * @returns {boolean} true si excede el monto, false caso contrario
286
- */
287
- this.exceedsMinimumAmount = function (value) {
288
- if (value === void 0) { value = 0; }
289
- return _this.user.isWholesaler() ? _this.user.channels.find(function (channel) { return _this.constants.getChannel() == channel.code; }).wholesalerMinimumPurchaseAmount <= value
290
- : _this.user.channels.find(function (channel) { return _this.constants.getChannel() == channel.code; }).retailerMinimumPurchaseAmount <= value;
291
- };
292
- this.isAuthenticated() && this.loggedInSubject.next(true);
293
- }
294
- /**
295
- * @desc Devuelve un observable
296
- * @param user Objeto que contiene username y password
297
- */
298
- AuthService.prototype.login = function (user, withRoles) {
299
- var _this = this;
300
- if (withRoles === void 0) { withRoles = []; }
301
- this.injector.get(ChannelConfigService).channelConfig$.subscribe(function (ch) { return _this.channel = ch; });
302
- this.injector.get(ChannelConfigService).channels.subscribe(function (ch) { return _this.channels = ch; });
303
- this.loggingInSubject.next(true);
304
- user = __assign(__assign({}, user), this.constants.loginExtraData());
305
- var result = this.connection.post(this.tokenApi(), user).pipe(map(function (res) {
306
- if (_this.channelAccessPermission(__assign(__assign({}, user), res)) && _this.isAllowedRole(withRoles, res.type)) {
307
- _this.doLoginUser(__assign(__assign({}, user), res));
308
- return 'ok';
309
- }
310
- return 'error';
311
- }), catchError(function (err) {
312
- _this.loggingInSubject.next(false);
313
- return of(err.toString());
314
- }));
315
- return result;
316
- };
317
- AuthService.prototype.getUserProfile = function () {
318
- return (this.user && Observable.of(this.user)) || this.getCurrentUser();
319
- };
320
- AuthService.prototype.getUserProfileAsUser = function () {
321
- return this.user || this.getCurrentUserAsUser();
322
- };
323
- AuthService.prototype.getCurrentUserAsUser = function () {
324
- var _this = this;
325
- var _a;
326
- this.user = new User();
327
- if (!this.user.loadFromStorage()) {
328
- this.user = null;
329
- }
330
- else if ((_a = this.user) === null || _a === void 0 ? void 0 : _a.channels.find(function (userchannel) { var _a; return ((_a = userchannel) === null || _a === void 0 ? void 0 : _a.code) === _this.constants.getChannel(); })) {
331
- return this.user;
332
- }
333
- else {
334
- this.logout();
335
- }
336
- return this.user;
337
- };
338
- AuthService.prototype.getCurrentUser = function () {
339
- this.user = new User();
340
- if (!this.user.loadFromStorage()) {
341
- this.user = null;
342
- }
343
- return Observable.of(this.user);
344
- };
345
- AuthService.prototype.isAuthenticated = function () {
346
- if (this.isTokenExpired()) {
347
- this.doLogoutUser();
348
- }
349
- this.getCurrentUserAsUser();
350
- this.userInSubject.next(this.user);
351
- return this.getToken() && !this.isTokenExpired() && this.user != null;
352
- };
353
- /* TOKEN */
354
- AuthService.prototype.logout = function () {
355
- this.doLogoutUser();
356
- };
357
- AuthService.prototype.refreshToken = function () {
358
- var _this = this;
359
- var data = __assign(__assign({}, this.constants.loginExtraData()), { refresh_token: this.getRefreshToken() });
360
- return this.connection.post(this.tokenApi(), data).pipe(map(function (res) { return _this.doLoginUser(res); }));
361
- };
362
- AuthService.prototype.getToken = function () {
363
- return localStorage.getItem(this.JWT_TOKEN);
364
- };
365
- AuthService.prototype.doLoginUser = function (tokens) {
366
- this.user = new User();
367
- this.user.initilized(tokens);
368
- this.forceChannelsForSeller(tokens);
369
- this.user.persistInStorage();
370
- localStorage.setItem(this.EXPIRATES_IN, moment(tokens.expires_in).add(1, 'h').format());
371
- localStorage.setItem(this.REFRESH_TOKEN, moment(tokens.expires_in).add(1, 'h').format());
372
- localStorage.setItem(this.JWT_TOKEN, tokens.token);
373
- localStorage.setItem(this.MAIL, tokens.username);
374
- this.userInSubject.next(this.user);
375
- this.loggedInSubject.next(true);
376
- this.loggingInSubject.next(false);
377
- };
378
- AuthService.prototype.doLogoutUser = function () {
379
- this.user = null;
380
- localStorage.removeItem(this.USER);
381
- localStorage.removeItem(this.EXPIRATES_IN);
382
- localStorage.removeItem(this.JWT_TOKEN);
383
- localStorage.removeItem(this.REFRESH_TOKEN);
384
- localStorage.removeItem('cart_token');
385
- localStorage.removeItem(this.MAIL);
386
- localStorage.removeItem(this.CHANNEL);
387
- localStorage.removeItem(this.CHANNELSELLER);
388
- localStorage.removeItem(this.LOCALE);
389
- localStorage.removeItem(this.CUSTOMER);
390
- localStorage.removeItem('MASTER_CHANNEL');
391
- this.loggedInSubject.next(false);
392
- this.userInSubject.next(this.user);
393
- this.channelsUserSubject.next([]);
394
- };
395
- AuthService.prototype.getRefreshToken = function () {
396
- return localStorage.getItem(this.REFRESH_TOKEN);
397
- };
398
- AuthService.ctorParameters = function () { return [
399
- { type: ConnectionService },
400
- { type: ToastrService },
401
- { type: Constants },
402
- { type: Injector }
403
- ]; };
404
- AuthService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AuthService_Factory() { return new i1.AuthService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i2.ToastrService), i0.ɵɵinject(i1.Constants), i0.ɵɵinject(i0.INJECTOR)); }, token: i1.AuthService, providedIn: "root" });
405
- AuthService = __decorate([
406
- Injectable({
407
- providedIn: 'root'
408
- })
409
- ], AuthService);
410
- return AuthService;
411
- }());
412
- export { AuthService };
413
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQU83QztJQTBDSSxxQkFBb0IsVUFBNkIsRUFDckMsYUFBNEIsRUFDNUIsU0FBb0IsRUFDcEIsUUFBa0I7UUFIOUIsaUJBTUM7UUFObUIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDckMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBM0NiLGNBQVMs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QUFZLENBQUMsQ0FBQztRQUN0QyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1QyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxZQUFZLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUVPLHFDQUFlLEdBQXZCO1FBQ0ksT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwRCxDQUFDOztnQkF6TStCLGlCQUFpQjtnQkFDdEIsYUFBYTtnQkFDakIsU0FBUztnQkFDVixRQUFROzs7SUE3Q3JCLFdBQVc7UUFIdkIsVUFBVSxDQUFDO1lBQ1IsVUFBVSxFQUFFLE1BQU07U0FDckIsQ0FBQztPQUNXLFdBQVcsQ0E2VnZCO3NCQS9XRDtDQStXQyxBQTdWRCxJQTZWQztTQTdWWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2Nvbm5lY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vY2xhc3Nlcy91c2VyJztcbmltcG9ydCAncnhqcy9hZGQvb2JzZXJ2YWJsZS9vZic7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgeyBtYXAsIG1hcFRvLCBjYXRjaEVycm9yLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuaW1wb3J0IHsgQ2hhbm5lbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMtY29tcGF0L29wZXJhdG9yL3Rha2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuL2NhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVXNlclJvbGVUeXBlIH0gZnJvbSAnLi4vY2xhc3Nlcy91c2VyLXJvbGUtdHlwZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBKV1RfVE9LRU4gPSAnSldUX1RPS0VOJ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgUkVGUkVTSF9UT0tFTiA9ICdSRUZSRVNIX1RPS0VOJ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgRVhQSVJBVEVTX0lOID0gJ0VYUElSQVRFU19JTidcbiAgICBwcml2YXRlIHJlYWRvbmx5IFVTRVIgPSAnVVNFUidcbiAgICBwcml2YXRlIHJlYWRvbmx5IE1BSUwgPSAnbWFpbCdcbiAgICBwcml2YXRlIHJlYWRvbmx5IExPQ0FMRSA9ICdMT0NBTEUnXG4gICAgcHJpdmF0ZSByZWFkb25seSBDSEFOTkVMID0gJ0NIQU5ORUwnXG4gICAgcHJpdmF0ZSByZWFkb25seSBDVVNUT01FUiA9ICdDVVNUT01FUidcbiAgICBwcml2YXRlIHJlYWRvbmx5IENIQU5ORUxTRUxMRVIgPSAnQ0hBTk5FTFNFTExFUidcblxuICAgIC8qIGFjdGl2ZUNoYW5uZWxTd2l0Y2g/ICovXG4gICAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsQ2hhbmdlOiBib29sZWFuID0gZmFsc2VcbiAgICBwcml2YXRlIGxvZ2dlZEluU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihmYWxzZSlcbiAgICBwcml2YXRlIGxvZ2dpbmdJblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oZmFsc2UpXG4gICAgcHJpdmF0ZSB1c2VySW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyPihudWxsKVxuICAgIHByaXZhdGUgY2hhbm5lbHNVc2VyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKVxuICAgIC8qIHByaXZhdGUgY3VzdG9tZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpICovXG4gICAgcHJpdmF0ZSB1c2VyOiBVc2VyID0gbnVsbFxuXG4gICAgLy8gQVBJU1xuICAgIHB1YmxpYyB0b2tlbkFwaSA9ICgpID0+ICdzaG9wLWFwaS9sb2dpbl9jaGVjayc7XG4gICAgcHVibGljIHJlZ2lzdGVyQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3JlZ2lzdGVyJztcbiAgICBwdWJsaWMgcmVnaXN0ZXJXaG9sZXNhbGVyQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3JlZ2lzdGVyLXdob2xlc2FsZXInO1xuICAgIHB1YmxpYyBjb25maXJtQWNjb3VudEFwaSA9ICh0b2tlbikgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3ZlcmlmeS1hY2NvdW50P3Rva2VuPScgKyB0b2tlbjtcbiAgICBwdWJsaWMgcmVzZXRQYXNzd29yZEFwaSA9ICh0b2tlbikgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3Bhc3N3b3JkLXJlc2V0LycgKyB0b2tlbjtcbiAgICBwdWJsaWMgcmVjb3ZlclBhc3N3b3JkQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQnO1xuICAgIHB1YmxpYyBjb3VudHJpZXNBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RhbnRzLmdldENoYW5uZWwoKSArICcvY291bnRyaWVzJztcblxuICAgIC8vIEF0cmlidXRvcyB1dGlsZXNcbiAgICBwdWJsaWMgd2FpdGluZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBsb2dnZWRJbiA9IHRoaXMubG9nZ2VkSW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpXG4gICAgcHVibGljIGxvZ2dpbmdJbiA9IHRoaXMubG9nZ2luZ0luU3ViamVjdC5hc09ic2VydmFibGUoKVxuICAgIHB1YmxpYyB1c2VyQXV0aCA9IHRoaXMudXNlckluU3ViamVjdC5hc09ic2VydmFibGUoKVxuICAgIHB1YmxpYyBjaGFubmVsc1VzZXIgPSB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QuYXNPYnNlcnZhYmxlKClcbiAgICAvKiBwcml2YXRlIGN1c3RvbWVyID0gdGhpcy5jaGFubmVsc1VzZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpICovXG4gICAgcHJpdmF0ZSBjdXN0b21lciA9IG51bGxcbiAgICBwdWJsaWMgY2hhbm5lbCA9IG51bGxcbiAgICBwdWJsaWMgY2hhbm5lbHMgPSBbXVxuICAgIHByaXZhdGUgaG9tZVJlc29sdmVyID0gbnVsbFxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdHJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbnN0YW50czogQ29uc3RhbnRzLFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxuICAgICkge1xuICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMubG9nZ2VkSW5TdWJqZWN0Lm5leHQodHJ1ZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXZ1ZWx2ZSB1biBvYnNlcnZhYmxlXG4gICAgICogQHBhcmFtIHVzZXIgT2JqZXRvIHF1ZSBjb250aWVuZSB1c2VybmFtZSB5IHBhc3N3b3JkIFxuICAgICAqL1xuICAgIGxvZ2luKHVzZXI6IHsgdXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyB9LCB3aXRoUm9sZXM6IFVzZXJSb2xlVHlwZVtdID0gW10pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICB0aGlzLmluamVjdG9yLmdldChDaGFubmVsQ29uZmlnU2VydmljZSkuY2hhbm5lbENvbmZpZyQuc3Vic2NyaWJlKGNoID0+IHRoaXMuY2hhbm5lbCA9IGNoKVxuICAgICAgICB0aGlzLmluamVjdG9yLmdldChDaGFubmVsQ29uZmlnU2VydmljZSkuY2hhbm5lbHMuc3Vic2NyaWJlKGNoID0+IHRoaXMuY2hhbm5lbHMgPSBjaClcbiAgICAgICAgdGhpcy5sb2dnaW5nSW5TdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgIHVzZXIgPSB7IC4uLnVzZXIsIC4uLnRoaXMuY29uc3RhbnRzLmxvZ2luRXh0cmFEYXRhKCkgfTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMudG9rZW5BcGkoKSwgdXNlcikucGlwZShcbiAgICAgICAgICAgIG1hcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoYW5uZWxBY2Nlc3NQZXJtaXNzaW9uKHsgLi4udXNlciwgLi4ucmVzIH0pICYmIHRoaXMuaXNBbGxvd2VkUm9sZSh3aXRoUm9sZXMsIHJlcy50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvTG9naW5Vc2VyKHsgLi4udXNlciwgLi4ucmVzIH0pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2snXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnZXJyb3InXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dpbmdJblN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGVyci50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBjaGFubmVsQWNjZXNzUGVybWlzc2lvbiA9IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5jaGFubmVsc1VzZXJTdWJqZWN0Lm5leHQoW10pXG5cbiAgICAgICAgLyogUGxlYXNlIHJlbW92ZSB0aGlzIEFTQVAgLSBOZWVkcyAqY2hhbm5lbHMqIGFycmF5IGluIHVzZXIgb2JqZWN0IEFMV0FZUyAqL1xuICAgICAgICAvKiBpZiAoVXNlclJvbGVUeXBlLlNFTExFUiA9PSByZXMudHlwZSBhcyBVc2VyUm9sZVR5cGUpIHJldHVybiB0cnVlICovXG5cbiAgICAgICAgLyogTm8gYXV0aG9yaXplZCBjaGFubmVscyAqL1xuICAgICAgICBpZiAocmVzLmNoYW5uZWxzPy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgLyogU29tZSBhdXRob3JpemVkIGNoYW5uZWwocykgaW5jbHVkaW5nIGN1cnJlbnQgY2hhbm5lbCAqL1xuICAgICAgICBpZiAocmVzLmNoYW5uZWxzLmZpbmQodXNlcmNoYW5uZWwgPT4gdXNlcmNoYW5uZWwuY29kZSA9PT0gdGhpcy5jaGFubmVsLmNvZGUpKSB7XG4gICAgICAgICAgICAvKiBNdWx0aXBsZSBhdXRob3JpemVkIGNoYW5uZWxzIGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cbiAgICAgICAgICAgIGlmIChyZXMuY2hhbm5lbHM/Lmxlbmd0aCA+IDEgJiYgdGhpcy5hY3RpdmVDaGFubmVsQ2hhbmdlKVxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5uZXh0KHJlcy5jaGFubmVscylcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgLyogT25lIGF1dGhvcml6ZWQgY2hhbm5lbCBub3QgaW5jbHVkaW5nIGN1cnJlbnQgY2hhbm5lbCAqL1xuICAgICAgICBpZiAocmVzLmNoYW5uZWxzPy5sZW5ndGggPT0gMSAmJiB0aGlzLmFjdGl2ZUNoYW5uZWxDaGFuZ2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSByZXMucGFzc3dvcmRcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbEFjY2VzcyhyZXMuY2hhbm5lbHNbMF0sIHJlcylcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgLyogTXVsdGlwbGUgYXV0aG9yaXplZCBjaGFubmVscyBub3QgaW5jbHVkaW5nIGN1cnJlbnQgY2hhbm5lbCAqL1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVDaGFubmVsQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QubmV4dChyZXMuY2hhbm5lbHMpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNoYW5uZWxBY2Nlc3MgPSAoY2hhbm5lbCwgdXNlciA9IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSAhPSBjaGFubmVsLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICBsZXQgZW5jb2RlZCA9IGJ0b2EoSlNPTi5zdHJpbmdpZnkodXNlciAhPSBudWxsID8gdXNlciA6IHRoaXMudXNlcikpXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShgJHt3aW5kb3cubG9jYXRpb24ucHJvdG9jb2x9Ly8ke2NoYW5uZWwuaG9zdG5hbWV9L2F1dGgvcmVkaXJlY3QvJHtlbmNvZGVkfWApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbnN0YW50cy5tb2RpZnlDaGFubmVsQ29uZmlnKGNoYW5uZWwpXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjIERldnVlbHZlIHVuYSBwcm9tZXNhXG4gICAgICogQHBhcmFtIHVzZXIgT2JqZXRvIHF1ZSBjb250aWVuZSB1c2VybmFtZSB5IHBhc3N3b3JkIFxuICAgICAqL1xuICAgIGRvTG9naW4gPSAodXNlcjogeyB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgdGhpcy5sb2dnaW5nSW5TdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgIHVzZXIgPSB7IC4uLnVzZXIsIC4uLnRoaXMuY29uc3RhbnRzLmxvZ2luRXh0cmFEYXRhKCkgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMudG9rZW5BcGkoKSwgdXNlcikucGlwZShcbiAgICAgICAgICAgIG1hcChyZXMgPT4gdGhpcy5kb0xvZ2luVXNlcihyZXMpKSxcbiAgICAgICAgICAgIG1hcFRvKCdvaycpLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2luZ0luU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoZXJyLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKS50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBnZXRVc2VyUHJvZmlsZSgpOiBPYnNlcnZhYmxlPFVzZXI+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnVzZXIgJiYgT2JzZXJ2YWJsZS5vZih0aGlzLnVzZXIpKSB8fCB0aGlzLmdldEN1cnJlbnRVc2VyKCk7XG4gICAgfVxuXG4gICAgZ2V0VXNlclByb2ZpbGVBc1VzZXIoKTogVXNlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXIgfHwgdGhpcy5nZXRDdXJyZW50VXNlckFzVXNlcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJBc1VzZXIoKTogVXNlciB7XG4gICAgICAgIHRoaXMudXNlciA9IG5ldyBVc2VyKCk7XG4gICAgICAgIGlmICghdGhpcy51c2VyLmxvYWRGcm9tU3RvcmFnZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXIgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy51c2VyPy5jaGFubmVscy5maW5kKHVzZXJjaGFubmVsID0+IHVzZXJjaGFubmVsPy5jb2RlID09PSB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51c2VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dvdXQoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDdXJyZW50VXNlcigpOiBPYnNlcnZhYmxlPFVzZXI+IHtcbiAgICAgICAgdGhpcy51c2VyID0gbmV3IFVzZXIoKTtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIubG9hZEZyb21TdG9yYWdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXNlciA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZih0aGlzLnVzZXIpO1xuICAgIH1cblxuICAgIHNpZ25VcCA9IChkYXRhKSA9PiB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnJlZ2lzdGVyQXBpKCksIGRhdGEpO1xuXG4gICAgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmRvTG9nb3V0VXNlcigpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZXRDdXJyZW50VXNlckFzVXNlcigpXG4gICAgICAgIHRoaXMudXNlckluU3ViamVjdC5uZXh0KHRoaXMudXNlcik7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKCkgJiYgIXRoaXMuaXNUb2tlbkV4cGlyZWQoKSAmJiB0aGlzLnVzZXIgIT0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25maXJtQWNjb3VudCA9ICh0b2tlbjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZ2V0KHRoaXMuY29uZmlybUFjY291bnRBcGkodG9rZW4pKTtcblxuICAgIHBhc3N3b3JkUmVzZXQgPSAobmV3X3Bhc3N3b3JkLCB0b2tlbikgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0geyBwYXNzd29yZDogeyBmaXJzdDogbmV3X3Bhc3N3b3JkLCBzZWNvbmQ6IG5ld19wYXNzd29yZCB9IH07XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24ucHV0KHRoaXMucmVzZXRQYXNzd29yZEFwaSh0b2tlbiksIGRhdGEpO1xuICAgIH1cblxuICAgIHJlY292ZXJQYXNzd29yZCA9IChlbWFpbDogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucHV0KHRoaXMucmVjb3ZlclBhc3N3b3JkQXBpKCksIHsgZW1haWwgfSk7XG5cbiAgICAvKiBUT0tFTiAqL1xuXG4gICAgbG9nb3V0KCkge1xuICAgICAgICB0aGlzLmRvTG9nb3V0VXNlcigpO1xuICAgIH1cblxuICAgIHJlZnJlc2hUb2tlbigpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB7IC4uLnRoaXMuY29uc3RhbnRzLmxvZ2luRXh0cmFEYXRhKCksIHJlZnJlc2hfdG9rZW46IHRoaXMuZ2V0UmVmcmVzaFRva2VuKCkgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy50b2tlbkFwaSgpLCBkYXRhKS5waXBlKG1hcChcbiAgICAgICAgICAgIHJlcyA9PiB0aGlzLmRvTG9naW5Vc2VyKHJlcylcbiAgICAgICAgKSlcbiAgICB9XG5cbiAgICBnZXRUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuSldUX1RPS0VOKTtcbiAgICB9XG5cbiAgICBpc1Rva2VuRXhwaXJlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZmVjaGFfZXhwaXJhY2lvbiA9IHRoaXMuZ2V0RXhwaXJhdGVzQXQoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbW9tZW50KCkgPj0gbW9tZW50KGZlY2hhX2V4cGlyYWNpb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldEV4cGlyYXRlc0F0ID0gKCkgPT4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5FWFBJUkFURVNfSU4pO1xuXG4gICAgcHVibGljIGRvTG9naW5Vc2VyKHRva2Vucykge1xuICAgICAgICB0aGlzLnVzZXIgPSBuZXcgVXNlcigpXG4gICAgICAgIHRoaXMudXNlci5pbml0aWxpemVkKHRva2VucylcbiAgICAgICAgdGhpcy5mb3JjZUNoYW5uZWxzRm9yU2VsbGVyKHRva2VucylcbiAgICAgICAgdGhpcy51c2VyLnBlcnNpc3RJblN0b3JhZ2UoKVxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkVYUElSQVRFU19JTiwgbW9tZW50KHRva2Vucy5leHBpcmVzX2luKS5hZGQoMSwgJ2gnKS5mb3JtYXQoKSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTiwgbW9tZW50KHRva2Vucy5leHBpcmVzX2luKS5hZGQoMSwgJ2gnKS5mb3JtYXQoKSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuSldUX1RPS0VOLCB0b2tlbnMudG9rZW4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLk1BSUwsIHRva2Vucy51c2VybmFtZSk7XG4gICAgICAgIHRoaXMudXNlckluU3ViamVjdC5uZXh0KHRoaXMudXNlcik7XG4gICAgICAgIHRoaXMubG9nZ2VkSW5TdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMubG9nZ2luZ0luU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZG9Mb2dvdXRVc2VyKCkge1xuICAgICAgICB0aGlzLnVzZXIgPSBudWxsXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuVVNFUik7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuRVhQSVJBVEVTX0lOKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5KV1RfVE9LRU4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLlJFRlJFU0hfVE9LRU4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLk1BSUwpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNIQU5ORUwpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNIQU5ORUxTRUxMRVIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkxPQ0FMRSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ1VTVE9NRVIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnTUFTVEVSX0NIQU5ORUwnKTtcbiAgICAgICAgdGhpcy5sb2dnZWRJblN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMudXNlckluU3ViamVjdC5uZXh0KHRoaXMudXNlcik7XG4gICAgICAgIHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5uZXh0KFtdKVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVmcmVzaFRva2VuKCkge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5SRUZSRVNIX1RPS0VOKTtcbiAgICB9XG5cbiAgICBoYXNUb1JlZnJlc2ggPSAoKSA9PiB0aGlzLmdldFJlZnJlc2hUb2tlbigpO1xuXG4gICAgc2lnblVwV2hvbGVzYWxlciA9IChkYXRhKSA9PiB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnJlZ2lzdGVyV2hvbGVzYWxlckFwaSgpLCBkYXRhKTtcblxuICAgIGdldENvdW50cmllc0RhdGEgPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZ2V0KHRoaXMuY291bnRyaWVzQXBpKCkpLnBpcGUobWFwKHJlcyA9PiByZXMuX2VtYmVkZGVkLml0ZW1zKSkudG9Qcm9taXNlKCk7XG5cbiAgICBwdWJsaWMgc2V0QWN0aXZlQ2hhbm5lbENoYW5nZSA9IChhY3RpdmVseUNoYW5nZUNoYW5uZWxzT25Mb2dpbjogYm9vbGVhbikgPT4gdGhpcy5hY3RpdmVDaGFubmVsQ2hhbmdlID0gYWN0aXZlbHlDaGFuZ2VDaGFubmVsc09uTG9naW5cblxuICAgIHByaXZhdGUgaXNBbGxvd2VkUm9sZSA9IChhbGxvd2VkUm9sZXM6IFVzZXJSb2xlVHlwZVtdLCByb2xlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGFsbG93ZWRSb2xlcy5sZW5ndGhcbiAgICAgICAgICAgID8gYWxsb3dlZFJvbGVzLmluY2x1ZGVzKHJvbGUgYXMgVXNlclJvbGVUeXBlKVxuICAgICAgICAgICAgOiB0cnVlXG4gICAgfVxuXG4gICAgLyogUGxlYXNlIHJlbW92ZSB0aGlzIEFTQVAgLSBOZWVkcyAqY2hhbm5lbHMqIGFycmF5IGluIHVzZXIgb2JqZWN0IEFMV0FZUyAqL1xuICAgIHByaXZhdGUgZm9yY2VDaGFubmVsc0ZvclNlbGxlciA9IHRva2VucyA9PiB7XG4gICAgICAgIGlmIChVc2VyUm9sZVR5cGUuU0VMTEVSID09IHRva2Vucy50eXBlIGFzIFVzZXJSb2xlVHlwZSlcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHM/Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gdGhpcy51c2VyLnNldENoYW5uZWxzKC4uLnRoaXMuY2hhbm5lbHMpXG4gICAgICAgICAgICAgICAgOiB0aGlzLnVzZXIuc2V0Q2hhbm5lbHModGhpcy5jaGFubmVsKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDYW1iaWEgZGUgY2FuYWxcbiAgICAgKiBAcGFyYW0gY2hhbm5lbENvbmZpZyBkZWJlIHNlciB1biBvYmpldG8gcXVlIGNvbnRlbmdhIGFsIG1lbm9zIGxhcyBrZXlzIGNoYW5uZWwgeSBsb2NhbGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjaGFuZ2VDaGFubmVsID0gKGNoYW5uZWxDb25maWc6YW55KSA9PiB7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLm1vZGlmeUNoYW5uZWxDb25maWcoe1xuICAgICAgICAgICAgY2hhbm5lbDogY2hhbm5lbENvbmZpZy5jaGFubmVsLFxuICAgICAgICAgICAgbG9jYWxlOiBjaGFubmVsQ29uZmlnLmxvY2FsZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDYXJnYSBlbCBjbGllbnRlIGNvbiBlbCBxdWUgc2UgcmVhbGl6YXJhbiBwZWRpZG9zLiBTaSByZWNpYmUgZWwgdmFsb3IgbnVsbFxuICAgICAqIHNlIHZ1ZWx2ZSBhIGNhcmdhciBlbCB2ZW5kZWRvciBwYXJhIHN1IHVzby4gIFxuICAgICAqIEBwYXJhbSBjdXN0b21lciBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q3VzdG9tZXIgPSBjdXN0b21lciA9PiB7XG4gICAgICAgIGxldCByZWZyZXNoUGFnZSA9IGZhbHNlXG4gICAgICAgIHRoaXMuY3VzdG9tZXIgPSBjdXN0b21lclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkNVU1RPTUVSLCBKU09OLnN0cmluZ2lmeShjdXN0b21lcikpXG4gICAgICAgIFxuICAgICAgICBsZXQgc2FtZUNoYW5uZWwgPSBjdXN0b21lciA/IHRoaXMuc2FtZUNoYW5uZWwoY3VzdG9tZXIuY2hhbm5lbHNbMF0uY29kZSwgY3VzdG9tZXIuY2hhbm5lbHNbMF0ubG9jYWxlcy5jb2RlKSA6IG51bGxcbiAgICAgICAgXG4gICAgICAgIGlmIChjdXN0b21lcikge1xuICAgICAgICAgICAgaWYoIXNhbWVDaGFubmVsKXtcbiAgICAgICAgICAgICAgICAhbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DSEFOTkVMU0VMTEVSKSA/XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmNvbnN0YW50cy5nZXRMb2NhbGUoKVxuICAgICAgICAgICAgICAgICAgICB9KSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ2hhbm5lbCh7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IGN1c3RvbWVyLmNoYW5uZWxzWzBdLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogY3VzdG9tZXIuY2hhbm5lbHNbMF0ubG9jYWxlcy5jb2RlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUikpXG4gICAgICAgICAgICBpZihyZXMpe1xuICAgICAgICAgICAgICAgIGlmKCF0aGlzLnNhbWVDaGFubmVsKHJlcy5jaGFubmVsLCByZXMubG9jYWxlKSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ2hhbm5lbChyZXMpXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNIQU5ORUxTRUxMRVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KENhcnRTZXJ2aWNlKS5jbGVhckFuZFJlc2V0Q3VzdG9tZXJDYXJ0KClcbiAgICAgICAgcmVmcmVzaFBhZ2UgPyBsb2NhdGlvbi5ocmVmID0gbG9jYXRpb24uaHJlZiA6IG51bGxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29tcHJ1ZWJhIHNpIGxvcyB2YWxvcmVzIGRlbCBjYW5hbCBhY3R1YWwgc29uIGlndWFsZXMgYSBsb3MgaW5ncmVzYWRvIHBvciBwYXJhbWV0cm9zLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIE5vbWJyZSBkZWwgY2FuYWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlICBMb2NhbGUgZGVsIGNhbmFsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgc2kgZXMgZWwgbWlzbW8gY2FuYWwsIEZhbHNlIGNhc28gY29udHJhcmlvLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2FtZUNoYW5uZWwgPSAoY2hhbm5lbDpzdHJpbmcsIGxvY2FsZTpzdHJpbmcpOmJvb2xlYW4gPT4gKGNoYW5uZWwgPT0gdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpKSAmJiAobG9jYWxlID09IHRoaXMuY29uc3RhbnRzLmdldExvY2FsZSgpKVxuXG4gICAgLyogcHVibGljIGdldEN1c3RvbWVyID0gKCkgPT4gT2JzZXJ2YWJsZS5vZihKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ1VTVE9NRVIpKSkgKi9cblxuICAgIHB1YmxpYyBnZXRDdXN0b21lciA9ICgpID0+IHtcbiAgICAgICAgLyogdGhpcy5jdXN0b21lclN1YmplY3QubmV4dChKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ1VTVE9NRVIpKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tZXIgKi9cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tZXIgfHwgSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVU1RPTUVSKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SG9tZVJlc29sdmVyID0gcmVzb2x2ZXJGdW5jdGlvbiA9PiB0aGlzLmhvbWVSZXNvbHZlciA9IHJlc29sdmVyRnVuY3Rpb25cblxuICAgIHB1YmxpYyBnZXRIb21lUmVzb2x2ZXIgPSAoKSA9PiB0aGlzLmhvbWVSZXNvbHZlclxuXG4gICAgcHVibGljIGlzQWJsZVRvQnV5ID0gKCk6IGJvb2xlYW4gPT4gIXRoaXMuZ2V0VXNlclByb2ZpbGVBc1VzZXIoKT8uaXNTZWxsZXIoKSB8fCAhIXRoaXMuZ2V0Q3VzdG9tZXIoKVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEV2YWx1YSBzaSBlbCB2YWxvciBxdWUgaW5ncmVzYSBwb3IgcGFyw6FtZXRybyBlcyBtYXlvciBvIGlndWFsIGFsIG3DrW5pbW8gZGUgY29tcHJhXG4gICAgICogcXVlIGVsIHVzdWFyaW8gdGllbmUgYXNpZ25hZG8gYSBlc2UgY2FuYWwsIGRpZmVyZW5jaWFuZG8gc2kgZXMgbWF5b3Jpc3RhIG8gbWlub3Jpc3RhLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBzaSBleGNlZGUgZWwgbW9udG8sIGZhbHNlIGNhc28gY29udHJhcmlvXG4gICAgICovXG4gICAgcHVibGljIGV4Y2VlZHNNaW5pbXVtQW1vdW50ID0gKHZhbHVlOm51bWJlcj0wKTpib29sZWFuID0+ICBcbiAgICAgICAgdGhpcy51c2VyLmlzV2hvbGVzYWxlcigpID8gdGhpcy51c2VyLmNoYW5uZWxzLmZpbmQoIGNoYW5uZWwgPT4gdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpID09IGNoYW5uZWwuY29kZSkud2hvbGVzYWxlck1pbmltdW1QdXJjaGFzZUFtb3VudCA8PSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnVzZXIuY2hhbm5lbHMuZmluZCggY2hhbm5lbCA9PiB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgPT0gY2hhbm5lbC5jb2RlKS5yZXRhaWxlck1pbmltdW1QdXJjaGFzZUFtb3VudCA8PSB2YWx1ZVxufSJdfQ==
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
13
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
17
+ };
18
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
19
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
20
+ return new (P || (P = Promise))(function (resolve, reject) {
21
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
22
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
23
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
24
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
25
+ });
26
+ };
27
+ var __generator = (this && this.__generator) || function (thisArg, body) {
28
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
29
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
30
+ function verb(n) { return function (v) { return step([n, v]); }; }
31
+ function step(op) {
32
+ if (f) throw new TypeError("Generator is already executing.");
33
+ while (_) try {
34
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
35
+ if (y = 0, t) op = [op[0] & 2, t.value];
36
+ switch (op[0]) {
37
+ case 0: case 1: t = op; break;
38
+ case 4: _.label++; return { value: op[1], done: false };
39
+ case 5: _.label++; y = op[1]; op = [0]; continue;
40
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
41
+ default:
42
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
43
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
44
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
45
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
46
+ if (t[2]) _.ops.pop();
47
+ _.trys.pop(); continue;
48
+ }
49
+ op = body.call(thisArg, _);
50
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
51
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
52
+ }
53
+ };
54
+ var __read = (this && this.__read) || function (o, n) {
55
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
56
+ if (!m) return o;
57
+ var i = m.call(o), r, ar = [], e;
58
+ try {
59
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
60
+ }
61
+ catch (error) { e = { error: error }; }
62
+ finally {
63
+ try {
64
+ if (r && !r.done && (m = i["return"])) m.call(i);
65
+ }
66
+ finally { if (e) throw e.error; }
67
+ }
68
+ return ar;
69
+ };
70
+ var __spread = (this && this.__spread) || function () {
71
+ for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
72
+ return ar;
73
+ };
74
+ import { Injectable, Injector } from '@angular/core';
75
+ import { ConnectionService } from '../api/connection.service';
76
+ import { Observable, BehaviorSubject, of } from 'rxjs';
77
+ import { User } from '../classes/user';
78
+ import 'rxjs/add/observable/of';
79
+ import { ToastrService } from 'ngx-toastr';
80
+ import { Constants } from '../core.consts';
81
+ import { map, mapTo, catchError } from 'rxjs/operators';
82
+ import * as moment from "moment";
83
+ import { ChannelConfigService } from './channel-config.service';
84
+ import { CartService } from './cart.service';
85
+ import * as i0 from "@angular/core";
86
+ import * as i1 from "../../public-api";
87
+ import * as i2 from "ngx-toastr";
88
+ var AuthService = /** @class */ (function () {
89
+ function AuthService(connection, toastrService, constants, injector) {
90
+ var _this = this;
91
+ this.connection = connection;
92
+ this.toastrService = toastrService;
93
+ this.constants = constants;
94
+ this.injector = injector;
95
+ this.JWT_TOKEN = 'JWT_TOKEN';
96
+ this.REFRESH_TOKEN = 'REFRESH_TOKEN';
97
+ this.EXPIRATES_IN = 'EXPIRATES_IN';
98
+ this.USER = 'USER';
99
+ this.MAIL = 'mail';
100
+ this.LOCALE = 'LOCALE';
101
+ this.CHANNEL = 'CHANNEL';
102
+ this.CUSTOMER = 'CUSTOMER';
103
+ this.CHANNELSELLER = 'CHANNELSELLER';
104
+ /* activeChannelSwitch? */
105
+ this.activeChannelChange = false;
106
+ this.loggedInSubject = new BehaviorSubject(false);
107
+ this.loggingInSubject = new BehaviorSubject(false);
108
+ this.userInSubject = new BehaviorSubject(null);
109
+ this.channelsUserSubject = new BehaviorSubject([]);
110
+ /* private customerSubject = new BehaviorSubject<any>(null) */
111
+ this.user = null;
112
+ // APIS
113
+ this.tokenApi = function () { return 'shop-api/login_check'; };
114
+ this.registerApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/register'; };
115
+ this.registerWholesalerApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/register-wholesaler'; };
116
+ this.confirmAccountApi = function (token) { return 'shop-api/' + _this.constants.getChannel() + '/verify-account?token=' + token; };
117
+ this.resetPasswordApi = function (token) { return 'shop-api/' + _this.constants.getChannel() + '/password-reset/' + token; };
118
+ this.recoverPasswordApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/request-password-reset'; };
119
+ this.countriesApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/countries'; };
120
+ // Atributos utiles
121
+ this.waiting = false;
122
+ this.loggedIn = this.loggedInSubject.asObservable();
123
+ this.loggingIn = this.loggingInSubject.asObservable();
124
+ this.userAuth = this.userInSubject.asObservable();
125
+ this.channelsUser = this.channelsUserSubject.asObservable();
126
+ /* private customer = this.channelsUserSubject.asObservable() */
127
+ this.customer = null;
128
+ this.channel = null;
129
+ this.channels = [];
130
+ this.homeResolver = null;
131
+ this.channelAccessPermission = function (res) {
132
+ var _a, _b, _c;
133
+ _this.channelsUserSubject.next([]);
134
+ /* Please remove this ASAP - Needs *channels* array in user object ALWAYS */
135
+ /* if (UserRoleType.SELLER == res.type as UserRoleType) return true */
136
+ /* No authorized channels */
137
+ if (((_a = res.channels) === null || _a === void 0 ? void 0 : _a.length) == 0) {
138
+ return false;
139
+ }
140
+ /* Some authorized channel(s) including current channel */
141
+ if (res.channels.find(function (userchannel) { return userchannel.code === _this.channel.code; })) {
142
+ /* Multiple authorized channels including current channel */
143
+ if (((_b = res.channels) === null || _b === void 0 ? void 0 : _b.length) > 1 && _this.activeChannelChange)
144
+ _this.channelsUserSubject.next(res.channels);
145
+ return true;
146
+ }
147
+ /* One authorized channel not including current channel */
148
+ if (((_c = res.channels) === null || _c === void 0 ? void 0 : _c.length) == 1 && _this.activeChannelChange) {
149
+ delete res.password;
150
+ _this.channelAccess(res.channels[0], res);
151
+ return true;
152
+ }
153
+ /* Multiple authorized channels not including current channel */
154
+ if (_this.activeChannelChange) {
155
+ _this.channelsUserSubject.next(res.channels);
156
+ return true;
157
+ }
158
+ return false;
159
+ };
160
+ this.channelAccess = function (channel, user) {
161
+ if (user === void 0) { user = null; }
162
+ if (window.location.hostname != channel.hostname) {
163
+ var encoded = btoa(JSON.stringify(user != null ? user : _this.user));
164
+ window.location.replace(window.location.protocol + "//" + channel.hostname + "/auth/redirect/" + encoded);
165
+ }
166
+ else {
167
+ _this.constants.modifyChannelConfig(channel);
168
+ window.location.reload();
169
+ }
170
+ };
171
+ /**
172
+ * @desc Devuelve una promesa
173
+ * @param user Objeto que contiene username y password
174
+ */
175
+ this.doLogin = function (user) {
176
+ _this.loggingInSubject.next(true);
177
+ user = __assign(__assign({}, user), _this.constants.loginExtraData());
178
+ return _this.connection.post(_this.tokenApi(), user).pipe(map(function (res) { return _this.doLoginUser(res); }), mapTo('ok'), catchError(function (err) {
179
+ _this.loggingInSubject.next(false);
180
+ return of(err.toString());
181
+ })).toPromise();
182
+ };
183
+ this.signUp = function (data) {
184
+ // Convertir el email a minúsculas si existe
185
+ if (data.email) {
186
+ data = __assign(__assign({}, data), { email: data.email.toLowerCase() });
187
+ }
188
+ return _this.connection.post(_this.registerApi(), data);
189
+ };
190
+ this.confirmAccount = function (token) {
191
+ return _this.connection.get(_this.confirmAccountApi(token));
192
+ };
193
+ this.passwordReset = function (new_password, token) {
194
+ var data = { password: { first: new_password, second: new_password } };
195
+ return _this.connection.put(_this.resetPasswordApi(token), data);
196
+ };
197
+ this.recoverPassword = function (email) {
198
+ return _this.connection.put(_this.recoverPasswordApi(), { email: email });
199
+ };
200
+ this.isTokenExpired = function () {
201
+ var fecha_expiracion = _this.getExpiratesAt();
202
+ var result = moment() >= moment(fecha_expiracion);
203
+ return result;
204
+ };
205
+ this.getExpiratesAt = function () { return localStorage.getItem(_this.EXPIRATES_IN); };
206
+ this.hasToRefresh = function () { return _this.getRefreshToken(); };
207
+ this.signUpWholesaler = function (data) {
208
+ // Convertir el email a minúsculas si existe
209
+ if (data.email) {
210
+ data = __assign(__assign({}, data), { email: data.email.toLowerCase() });
211
+ }
212
+ return _this.connection.post(_this.registerWholesalerApi(), data);
213
+ };
214
+ this.getCountriesData = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
215
+ return [2 /*return*/, this.connection.get(this.countriesApi()).pipe(map(function (res) { return res._embedded.items; })).toPromise()];
216
+ }); }); };
217
+ this.setActiveChannelChange = function (activelyChangeChannelsOnLogin) { return _this.activeChannelChange = activelyChangeChannelsOnLogin; };
218
+ this.isAllowedRole = function (allowedRoles, role) {
219
+ return allowedRoles.length
220
+ ? allowedRoles.includes(role)
221
+ : true;
222
+ };
223
+ /* Please remove this ASAP - Needs *channels* array in user object ALWAYS */
224
+ this.forceChannelsForSeller = function (tokens) {
225
+ var _a;
226
+ var _b;
227
+ if ("seller" /* SELLER */ == tokens.type)
228
+ ((_b = _this.channels) === null || _b === void 0 ? void 0 : _b.length) ? (_a = _this.user).setChannels.apply(_a, __spread(_this.channels)) : _this.user.setChannels(_this.channel);
229
+ };
230
+ /**
231
+ * @description Cambia de canal
232
+ * @param channelConfig debe ser un objeto que contenga al menos las keys channel y locale.
233
+ */
234
+ this.changeChannel = function (channelConfig) {
235
+ _this.constants.modifyChannelConfig({
236
+ channel: channelConfig.channel,
237
+ locale: channelConfig.locale
238
+ });
239
+ };
240
+ /**
241
+ * @description Carga el cliente con el que se realizaran pedidos. Si recibe el valor null
242
+ * se vuelve a cargar el vendedor para su uso.
243
+ * @param customer
244
+ */
245
+ this.setCustomer = function (customer) {
246
+ var refreshPage = false;
247
+ _this.customer = customer;
248
+ localStorage.setItem(_this.CUSTOMER, JSON.stringify(customer));
249
+ var sameChannel = customer ? _this.sameChannel(customer.channels[0].code, customer.channels[0].locales.code) : null;
250
+ if (customer) {
251
+ if (!sameChannel) {
252
+ !localStorage.getItem(_this.CHANNELSELLER) ?
253
+ localStorage.setItem(_this.CHANNELSELLER, JSON.stringify({
254
+ channel: _this.constants.getChannel(),
255
+ locale: _this.constants.getLocale()
256
+ })) : null;
257
+ _this.changeChannel({
258
+ channel: customer.channels[0].code,
259
+ locale: customer.channels[0].locales.code
260
+ });
261
+ refreshPage = true;
262
+ }
263
+ }
264
+ else {
265
+ var res = JSON.parse(localStorage.getItem(_this.CHANNELSELLER));
266
+ if (res) {
267
+ if (!_this.sameChannel(res.channel, res.locale)) {
268
+ _this.changeChannel(res);
269
+ refreshPage = true;
270
+ }
271
+ localStorage.removeItem(_this.CHANNELSELLER);
272
+ }
273
+ }
274
+ _this.injector.get(CartService).clearAndResetCustomerCart();
275
+ refreshPage ? location.href = location.href : null;
276
+ };
277
+ /**
278
+ * @description Comprueba si los valores del canal actual son iguales a los ingresado por parametros.
279
+ * @param {string} channel Nombre del canal
280
+ * @param {string} locale Locale del canal
281
+ * @returns {boolean} True si es el mismo canal, False caso contrario.
282
+ */
283
+ this.sameChannel = function (channel, locale) { return (channel == _this.constants.getChannel()) && (locale == _this.constants.getLocale()); };
284
+ /* public getCustomer = () => Observable.of(JSON.parse(localStorage.getItem(this.CUSTOMER))) */
285
+ this.getCustomer = function () {
286
+ /* this.customerSubject.next(JSON.parse(localStorage.getItem(this.CUSTOMER)))
287
+ return this.customer */
288
+ return _this.customer || JSON.parse(localStorage.getItem(_this.CUSTOMER));
289
+ };
290
+ this.setHomeResolver = function (resolverFunction) { return _this.homeResolver = resolverFunction; };
291
+ this.getHomeResolver = function () { return _this.homeResolver; };
292
+ this.isAbleToBuy = function () { var _a; return !((_a = _this.getUserProfileAsUser()) === null || _a === void 0 ? void 0 : _a.isSeller()) || !!_this.getCustomer(); };
293
+ /**
294
+ * @description Evalua si el valor que ingresa por parámetro es mayor o igual al mínimo de compra
295
+ * que el usuario tiene asignado a ese canal, diferenciando si es mayorista o minorista.
296
+ * @param {number} value
297
+ * @returns {boolean} true si excede el monto, false caso contrario
298
+ */
299
+ this.exceedsMinimumAmount = function (value) {
300
+ if (value === void 0) { value = 0; }
301
+ return _this.user.isWholesaler() ? _this.user.channels.find(function (channel) { return _this.constants.getChannel() == channel.code; }).wholesalerMinimumPurchaseAmount <= value
302
+ : _this.user.channels.find(function (channel) { return _this.constants.getChannel() == channel.code; }).retailerMinimumPurchaseAmount <= value;
303
+ };
304
+ this.isAuthenticated() && this.loggedInSubject.next(true);
305
+ }
306
+ /**
307
+ * @desc Devuelve un observable
308
+ * @param user Objeto que contiene username y password
309
+ */
310
+ AuthService.prototype.login = function (user, withRoles) {
311
+ var _this = this;
312
+ if (withRoles === void 0) { withRoles = []; }
313
+ this.injector.get(ChannelConfigService).channelConfig$.subscribe(function (ch) { return _this.channel = ch; });
314
+ this.injector.get(ChannelConfigService).channels.subscribe(function (ch) { return _this.channels = ch; });
315
+ this.loggingInSubject.next(true);
316
+ // Convertir el username a minúsculas
317
+ user = __assign(__assign(__assign({}, user), { username: user.username.toLowerCase() }), this.constants.loginExtraData());
318
+ var result = this.connection.post(this.tokenApi(), user).pipe(map(function (res) {
319
+ if (_this.channelAccessPermission(__assign(__assign({}, user), res)) && _this.isAllowedRole(withRoles, res.type)) {
320
+ _this.doLoginUser(__assign(__assign({}, user), res));
321
+ return 'ok';
322
+ }
323
+ return 'error';
324
+ }), catchError(function (err) {
325
+ _this.loggingInSubject.next(false);
326
+ return of(err.toString());
327
+ }));
328
+ return result;
329
+ };
330
+ AuthService.prototype.getUserProfile = function () {
331
+ return (this.user && Observable.of(this.user)) || this.getCurrentUser();
332
+ };
333
+ AuthService.prototype.getUserProfileAsUser = function () {
334
+ return this.user || this.getCurrentUserAsUser();
335
+ };
336
+ AuthService.prototype.getCurrentUserAsUser = function () {
337
+ var _this = this;
338
+ var _a;
339
+ this.user = new User();
340
+ if (!this.user.loadFromStorage()) {
341
+ this.user = null;
342
+ }
343
+ else if ((_a = this.user) === null || _a === void 0 ? void 0 : _a.channels.find(function (userchannel) { var _a; return ((_a = userchannel) === null || _a === void 0 ? void 0 : _a.code) === _this.constants.getChannel(); })) {
344
+ return this.user;
345
+ }
346
+ else {
347
+ this.logout();
348
+ }
349
+ return this.user;
350
+ };
351
+ AuthService.prototype.getCurrentUser = function () {
352
+ this.user = new User();
353
+ if (!this.user.loadFromStorage()) {
354
+ this.user = null;
355
+ }
356
+ return Observable.of(this.user);
357
+ };
358
+ AuthService.prototype.isAuthenticated = function () {
359
+ if (this.isTokenExpired()) {
360
+ this.doLogoutUser();
361
+ }
362
+ this.getCurrentUserAsUser();
363
+ this.userInSubject.next(this.user);
364
+ return this.getToken() && !this.isTokenExpired() && this.user != null;
365
+ };
366
+ /* TOKEN */
367
+ AuthService.prototype.logout = function () {
368
+ this.doLogoutUser();
369
+ };
370
+ AuthService.prototype.refreshToken = function () {
371
+ var _this = this;
372
+ var data = __assign(__assign({}, this.constants.loginExtraData()), { refresh_token: this.getRefreshToken() });
373
+ return this.connection.post(this.tokenApi(), data).pipe(map(function (res) { return _this.doLoginUser(res); }));
374
+ };
375
+ AuthService.prototype.getToken = function () {
376
+ return localStorage.getItem(this.JWT_TOKEN);
377
+ };
378
+ AuthService.prototype.doLoginUser = function (tokens) {
379
+ this.user = new User();
380
+ this.user.initilized(tokens);
381
+ this.forceChannelsForSeller(tokens);
382
+ this.user.persistInStorage();
383
+ localStorage.setItem(this.EXPIRATES_IN, moment(tokens.expires_in).add(1, 'h').format());
384
+ localStorage.setItem(this.REFRESH_TOKEN, moment(tokens.expires_in).add(1, 'h').format());
385
+ localStorage.setItem(this.JWT_TOKEN, tokens.token);
386
+ localStorage.setItem(this.MAIL, tokens.username);
387
+ this.userInSubject.next(this.user);
388
+ this.loggedInSubject.next(true);
389
+ this.loggingInSubject.next(false);
390
+ };
391
+ AuthService.prototype.doLogoutUser = function () {
392
+ this.user = null;
393
+ localStorage.removeItem(this.USER);
394
+ localStorage.removeItem(this.EXPIRATES_IN);
395
+ localStorage.removeItem(this.JWT_TOKEN);
396
+ localStorage.removeItem(this.REFRESH_TOKEN);
397
+ localStorage.removeItem('cart_token');
398
+ localStorage.removeItem(this.MAIL);
399
+ localStorage.removeItem(this.CHANNEL);
400
+ localStorage.removeItem(this.CHANNELSELLER);
401
+ localStorage.removeItem(this.LOCALE);
402
+ localStorage.removeItem(this.CUSTOMER);
403
+ localStorage.removeItem('MASTER_CHANNEL');
404
+ this.loggedInSubject.next(false);
405
+ this.userInSubject.next(this.user);
406
+ this.channelsUserSubject.next([]);
407
+ };
408
+ AuthService.prototype.getRefreshToken = function () {
409
+ return localStorage.getItem(this.REFRESH_TOKEN);
410
+ };
411
+ AuthService.ctorParameters = function () { return [
412
+ { type: ConnectionService },
413
+ { type: ToastrService },
414
+ { type: Constants },
415
+ { type: Injector }
416
+ ]; };
417
+ AuthService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AuthService_Factory() { return new i1.AuthService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i2.ToastrService), i0.ɵɵinject(i1.Constants), i0.ɵɵinject(i0.INJECTOR)); }, token: i1.AuthService, providedIn: "root" });
418
+ AuthService = __decorate([
419
+ Injectable({
420
+ providedIn: 'root'
421
+ })
422
+ ], AuthService);
423
+ return AuthService;
424
+ }());
425
+ export { AuthService };
426
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQU83QztJQTBDSSxxQkFBb0IsVUFBNkIsRUFDckMsYUFBNEIsRUFDNUIsU0FBb0IsRUFDcEIsUUFBa0I7UUFIOUIsaUJBTUM7UUFObUIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDckMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBM0NiLGNBQVMs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QWlCO2dCQUN0QixhQUFhO2dCQUNqQixTQUFTO2dCQUNWLFFBQVE7OztJQTdDckIsV0FBVztRQUh2QixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csV0FBVyxDQTRXdkI7c0JBOVhEO0NBOFhDLEFBNVdELElBNFdDO1NBNVdZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL2FwaS9jb25uZWN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi9jbGFzc2VzL3VzZXInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29ic2VydmFibGUvb2YnO1xyXG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uL2NvcmUuY29uc3RzJztcclxuaW1wb3J0IHsgbWFwLCBtYXBUbywgY2F0Y2hFcnJvciwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4vY2hhbm5lbC1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzLWNvbXBhdC9vcGVyYXRvci90YWtlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFVzZXJSb2xlVHlwZSB9IGZyb20gJy4uL2NsYXNzZXMvdXNlci1yb2xlLXR5cGUnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBKV1RfVE9LRU4gPSAnSldUX1RPS0VOJ1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBSRUZSRVNIX1RPS0VOID0gJ1JFRlJFU0hfVE9LRU4nXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IEVYUElSQVRFU19JTiA9ICdFWFBJUkFURVNfSU4nXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IFVTRVIgPSAnVVNFUidcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgTUFJTCA9ICdtYWlsJ1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBMT0NBTEUgPSAnTE9DQUxFJ1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBDSEFOTkVMID0gJ0NIQU5ORUwnXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IENVU1RPTUVSID0gJ0NVU1RPTUVSJ1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBDSEFOTkVMU0VMTEVSID0gJ0NIQU5ORUxTRUxMRVInXHJcblxyXG4gICAgLyogYWN0aXZlQ2hhbm5lbFN3aXRjaD8gKi9cclxuICAgIHByaXZhdGUgYWN0aXZlQ2hhbm5lbENoYW5nZTogYm9vbGVhbiA9IGZhbHNlXHJcbiAgICBwcml2YXRlIGxvZ2dlZEluU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihmYWxzZSlcclxuICAgIHByaXZhdGUgbG9nZ2luZ0luU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihmYWxzZSlcclxuICAgIHByaXZhdGUgdXNlckluU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlcj4obnVsbClcclxuICAgIHByaXZhdGUgY2hhbm5lbHNVc2VyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKVxyXG4gICAgLyogcHJpdmF0ZSBjdXN0b21lclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCkgKi9cclxuICAgIHByaXZhdGUgdXNlcjogVXNlciA9IG51bGxcclxuXHJcbiAgICAvLyBBUElTXHJcbiAgICBwdWJsaWMgdG9rZW5BcGkgPSAoKSA9PiAnc2hvcC1hcGkvbG9naW5fY2hlY2snO1xyXG4gICAgcHVibGljIHJlZ2lzdGVyQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3JlZ2lzdGVyJztcclxuICAgIHB1YmxpYyByZWdpc3Rlcldob2xlc2FsZXJBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RhbnRzLmdldENoYW5uZWwoKSArICcvcmVnaXN0ZXItd2hvbGVzYWxlcic7XHJcbiAgICBwdWJsaWMgY29uZmlybUFjY291bnRBcGkgPSAodG9rZW4pID0+ICdzaG9wLWFwaS8nICsgdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpICsgJy92ZXJpZnktYWNjb3VudD90b2tlbj0nICsgdG9rZW47XHJcbiAgICBwdWJsaWMgcmVzZXRQYXNzd29yZEFwaSA9ICh0b2tlbikgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3Bhc3N3b3JkLXJlc2V0LycgKyB0b2tlbjtcclxuICAgIHB1YmxpYyByZWNvdmVyUGFzc3dvcmRBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RhbnRzLmdldENoYW5uZWwoKSArICcvcmVxdWVzdC1wYXNzd29yZC1yZXNldCc7XHJcbiAgICBwdWJsaWMgY291bnRyaWVzQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL2NvdW50cmllcyc7XHJcblxyXG4gICAgLy8gQXRyaWJ1dG9zIHV0aWxlc1xyXG4gICAgcHVibGljIHdhaXRpbmcgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBsb2dnZWRJbiA9IHRoaXMubG9nZ2VkSW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpXHJcbiAgICBwdWJsaWMgbG9nZ2luZ0luID0gdGhpcy5sb2dnaW5nSW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpXHJcbiAgICBwdWJsaWMgdXNlckF1dGggPSB0aGlzLnVzZXJJblN1YmplY3QuYXNPYnNlcnZhYmxlKClcclxuICAgIHB1YmxpYyBjaGFubmVsc1VzZXIgPSB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QuYXNPYnNlcnZhYmxlKClcclxuICAgIC8qIHByaXZhdGUgY3VzdG9tZXIgPSB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QuYXNPYnNlcnZhYmxlKCkgKi9cclxuICAgIHByaXZhdGUgY3VzdG9tZXIgPSBudWxsXHJcbiAgICBwdWJsaWMgY2hhbm5lbCA9IG51bGxcclxuICAgIHB1YmxpYyBjaGFubmVscyA9IFtdXHJcbiAgICBwcml2YXRlIGhvbWVSZXNvbHZlciA9IG51bGxcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbm5lY3Rpb246IENvbm5lY3Rpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvbnN0YW50czogQ29uc3RhbnRzLFxyXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMubG9nZ2VkSW5TdWJqZWN0Lm5leHQodHJ1ZSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjIERldnVlbHZlIHVuIG9ic2VydmFibGVcclxuICAgICAqIEBwYXJhbSB1c2VyIE9iamV0byBxdWUgY29udGllbmUgdXNlcm5hbWUgeSBwYXNzd29yZCBcclxuICAgICAqL1xyXG4gICAgbG9naW4odXNlcjogeyB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nIH0sIHdpdGhSb2xlczogVXNlclJvbGVUeXBlW10gPSBbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgdGhpcy5pbmplY3Rvci5nZXQoQ2hhbm5lbENvbmZpZ1NlcnZpY2UpLmNoYW5uZWxDb25maWckLnN1YnNjcmliZShjaCA9PiB0aGlzLmNoYW5uZWwgPSBjaCk7XHJcbiAgICAgICAgdGhpcy5pbmplY3Rvci5nZXQoQ2hhbm5lbENvbmZpZ1NlcnZpY2UpLmNoYW5uZWxzLnN1YnNjcmliZShjaCA9PiB0aGlzLmNoYW5uZWxzID0gY2gpO1xyXG4gICAgICAgIHRoaXMubG9nZ2luZ0luU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgICAgICAvLyBDb252ZXJ0aXIgZWwgdXNlcm5hbWUgYSBtaW7DunNjdWxhc1xyXG4gICAgICAgIHVzZXIgPSB7IC4uLnVzZXIsIHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lLnRvTG93ZXJDYXNlKCksIC4uLnRoaXMuY29uc3RhbnRzLmxvZ2luRXh0cmFEYXRhKCkgfTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMudG9rZW5BcGkoKSwgdXNlcikucGlwZShcclxuICAgICAgICAgICAgbWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGFubmVsQWNjZXNzUGVybWlzc2lvbih7IC4uLnVzZXIsIC4uLnJlcyB9KSAmJiB0aGlzLmlzQWxsb3dlZFJvbGUod2l0aFJvbGVzLCByZXMudHlwZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvTG9naW5Vc2VyKHsgLi4udXNlciwgLi4ucmVzIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdlcnJvcic7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dpbmdJblN1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoZXJyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBjaGFubmVsQWNjZXNzUGVybWlzc2lvbiA9IChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QubmV4dChbXSlcclxuXHJcbiAgICAgICAgLyogUGxlYXNlIHJlbW92ZSB0aGlzIEFTQVAgLSBOZWVkcyAqY2hhbm5lbHMqIGFycmF5IGluIHVzZXIgb2JqZWN0IEFMV0FZUyAqL1xyXG4gICAgICAgIC8qIGlmIChVc2VyUm9sZVR5cGUuU0VMTEVSID09IHJlcy50eXBlIGFzIFVzZXJSb2xlVHlwZSkgcmV0dXJuIHRydWUgKi9cclxuXHJcbiAgICAgICAgLyogTm8gYXV0aG9yaXplZCBjaGFubmVscyAqL1xyXG4gICAgICAgIGlmIChyZXMuY2hhbm5lbHM/Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICAvKiBTb21lIGF1dGhvcml6ZWQgY2hhbm5lbChzKSBpbmNsdWRpbmcgY3VycmVudCBjaGFubmVsICovXHJcbiAgICAgICAgaWYgKHJlcy5jaGFubmVscy5maW5kKHVzZXJjaGFubmVsID0+IHVzZXJjaGFubmVsLmNvZGUgPT09IHRoaXMuY2hhbm5lbC5jb2RlKSkge1xyXG4gICAgICAgICAgICAvKiBNdWx0aXBsZSBhdXRob3JpemVkIGNoYW5uZWxzIGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cclxuICAgICAgICAgICAgaWYgKHJlcy5jaGFubmVscz8ubGVuZ3RoID4gMSAmJiB0aGlzLmFjdGl2ZUNoYW5uZWxDaGFuZ2UpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QubmV4dChyZXMuY2hhbm5lbHMpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIE9uZSBhdXRob3JpemVkIGNoYW5uZWwgbm90IGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cclxuICAgICAgICBpZiAocmVzLmNoYW5uZWxzPy5sZW5ndGggPT0gMSAmJiB0aGlzLmFjdGl2ZUNoYW5uZWxDaGFuZ2UpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHJlcy5wYXNzd29yZFxyXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxBY2Nlc3MocmVzLmNoYW5uZWxzWzBdLCByZXMpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIE11bHRpcGxlIGF1dGhvcml6ZWQgY2hhbm5lbHMgbm90IGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVDaGFubmVsQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5uZXh0KHJlcy5jaGFubmVscylcclxuICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgY2hhbm5lbEFjY2VzcyA9IChjaGFubmVsLCB1c2VyID0gbnVsbCkgPT4ge1xyXG4gICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgIT0gY2hhbm5lbC5ob3N0bmFtZSkge1xyXG4gICAgICAgICAgICBsZXQgZW5jb2RlZCA9IGJ0b2EoSlNPTi5zdHJpbmdpZnkodXNlciAhPSBudWxsID8gdXNlciA6IHRoaXMudXNlcikpXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0vLyR7Y2hhbm5lbC5ob3N0bmFtZX0vYXV0aC9yZWRpcmVjdC8ke2VuY29kZWR9YClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnN0YW50cy5tb2RpZnlDaGFubmVsQ29uZmlnKGNoYW5uZWwpXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjIERldnVlbHZlIHVuYSBwcm9tZXNhXHJcbiAgICAgKiBAcGFyYW0gdXNlciBPYmpldG8gcXVlIGNvbnRpZW5lIHVzZXJuYW1lIHkgcGFzc3dvcmQgXHJcbiAgICAgKi9cclxuICAgIGRvTG9naW4gPSAodXNlcjogeyB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nIH0pID0+IHtcclxuICAgICAgICB0aGlzLmxvZ2dpbmdJblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgICB1c2VyID0geyAuLi51c2VyLCAuLi50aGlzLmNvbnN0YW50cy5sb2dpbkV4dHJhRGF0YSgpIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMudG9rZW5BcGkoKSwgdXNlcikucGlwZShcclxuICAgICAgICAgICAgbWFwKHJlcyA9PiB0aGlzLmRvTG9naW5Vc2VyKHJlcykpLFxyXG4gICAgICAgICAgICBtYXBUbygnb2snKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnaW5nSW5TdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGVyci50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJQcm9maWxlKCk6IE9ic2VydmFibGU8VXNlcj4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy51c2VyICYmIE9ic2VydmFibGUub2YodGhpcy51c2VyKSkgfHwgdGhpcy5nZXRDdXJyZW50VXNlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJQcm9maWxlQXNVc2VyKCk6IFVzZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXIgfHwgdGhpcy5nZXRDdXJyZW50VXNlckFzVXNlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJBc1VzZXIoKTogVXNlciB7XHJcbiAgICAgICAgdGhpcy51c2VyID0gbmV3IFVzZXIoKTtcclxuICAgICAgICBpZiAoIXRoaXMudXNlci5sb2FkRnJvbVN0b3JhZ2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXIgPSBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudXNlcj8uY2hhbm5lbHMuZmluZCh1c2VyY2hhbm5lbCA9PiB1c2VyY2hhbm5lbD8uY29kZSA9PT0gdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy51c2VyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nb3V0KClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEN1cnJlbnRVc2VyKCk6IE9ic2VydmFibGU8VXNlcj4ge1xyXG4gICAgICAgIHRoaXMudXNlciA9IG5ldyBVc2VyKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIubG9hZEZyb21TdG9yYWdlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy51c2VyID0gbnVsbFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZih0aGlzLnVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25VcCA9IChkYXRhKSA9PiB7XHJcbiAgICAgICAgLy8gQ29udmVydGlyIGVsIGVtYWlsIGEgbWluw7pzY3VsYXMgc2kgZXhpc3RlXHJcbiAgICAgICAgaWYgKGRhdGEuZW1haWwpIHtcclxuICAgICAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgZW1haWw6IGRhdGEuZW1haWwudG9Mb3dlckNhc2UoKSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5yZWdpc3RlckFwaSgpLCBkYXRhKTtcclxuICAgIH07XHJcblxyXG4gICAgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5kb0xvZ291dFVzZXIoKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldEN1cnJlbnRVc2VyQXNVc2VyKClcclxuICAgICAgICB0aGlzLnVzZXJJblN1YmplY3QubmV4dCh0aGlzLnVzZXIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKCkgJiYgIXRoaXMuaXNUb2tlbkV4cGlyZWQoKSAmJiB0aGlzLnVzZXIgIT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25maXJtQWNjb3VudCA9ICh0b2tlbjogc3RyaW5nKSA9PlxyXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5nZXQodGhpcy5jb25maXJtQWNjb3VudEFwaSh0b2tlbikpO1xyXG5cclxuICAgIHBhc3N3b3JkUmVzZXQgPSAobmV3X3Bhc3N3b3JkLCB0b2tlbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IHBhc3N3b3JkOiB7IGZpcnN0OiBuZXdfcGFzc3dvcmQsIHNlY29uZDogbmV3X3Bhc3N3b3JkIH0gfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnB1dCh0aGlzLnJlc2V0UGFzc3dvcmRBcGkodG9rZW4pLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICByZWNvdmVyUGFzc3dvcmQgPSAoZW1haWw6IHN0cmluZykgPT5cclxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucHV0KHRoaXMucmVjb3ZlclBhc3N3b3JkQXBpKCksIHsgZW1haWwgfSk7XHJcblxyXG4gICAgLyogVE9LRU4gKi9cclxuXHJcbiAgICBsb2dvdXQoKSB7XHJcbiAgICAgICAgdGhpcy5kb0xvZ291dFVzZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoVG9rZW4oKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7IC4uLnRoaXMuY29uc3RhbnRzLmxvZ2luRXh0cmFEYXRhKCksIHJlZnJlc2hfdG9rZW46IHRoaXMuZ2V0UmVmcmVzaFRva2VuKCkgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnRva2VuQXBpKCksIGRhdGEpLnBpcGUobWFwKFxyXG4gICAgICAgICAgICByZXMgPT4gdGhpcy5kb0xvZ2luVXNlcihyZXMpXHJcbiAgICAgICAgKSlcclxuICAgIH1cclxuXHJcbiAgICBnZXRUb2tlbigpIHtcclxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5KV1RfVE9LRU4pO1xyXG4gICAgfVxyXG5cclxuICAgIGlzVG9rZW5FeHBpcmVkID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZlY2hhX2V4cGlyYWNpb24gPSB0aGlzLmdldEV4cGlyYXRlc0F0KCk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbW9tZW50KCkgPj0gbW9tZW50KGZlY2hhX2V4cGlyYWNpb24pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RXhwaXJhdGVzQXQgPSAoKSA9PiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkVYUElSQVRFU19JTik7XHJcblxyXG4gICAgcHVibGljIGRvTG9naW5Vc2VyKHRva2Vucykge1xyXG4gICAgICAgIHRoaXMudXNlciA9IG5ldyBVc2VyKClcclxuICAgICAgICB0aGlzLnVzZXIuaW5pdGlsaXplZCh0b2tlbnMpXHJcbiAgICAgICAgdGhpcy5mb3JjZUNoYW5uZWxzRm9yU2VsbGVyKHRva2VucylcclxuICAgICAgICB0aGlzLnVzZXIucGVyc2lzdEluU3RvcmFnZSgpXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5FWFBJUkFURVNfSU4sIG1vbWVudCh0b2tlbnMuZXhwaXJlc19pbikuYWRkKDEsICdoJykuZm9ybWF0KCkpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTiwgbW9tZW50KHRva2Vucy5leHBpcmVzX2luKS5hZGQoMSwgJ2gnKS5mb3JtYXQoKSk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5KV1RfVE9LRU4sIHRva2Vucy50b2tlbik7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5NQUlMLCB0b2tlbnMudXNlcm5hbWUpO1xyXG4gICAgICAgIHRoaXMudXNlckluU3ViamVjdC5uZXh0KHRoaXMudXNlcik7XHJcbiAgICAgICAgdGhpcy5sb2dnZWRJblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgICB0aGlzLmxvZ2dpbmdJblN1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRvTG9nb3V0VXNlcigpIHtcclxuICAgICAgICB0aGlzLnVzZXIgPSBudWxsXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5VU0VSKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkVYUElSQVRFU19JTik7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5KV1RfVE9LRU4pO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTik7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2NhcnRfdG9rZW4nKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLk1BSUwpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ0hBTk5FTCk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5DSEFOTkVMU0VMTEVSKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkxPQ0FMRSk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5DVVNUT01FUik7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ01BU1RFUl9DSEFOTkVMJyk7XHJcbiAgICAgICAgdGhpcy5sb2dnZWRJblN1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy51c2VySW5TdWJqZWN0Lm5leHQodGhpcy51c2VyKTtcclxuICAgICAgICB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QubmV4dChbXSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFJlZnJlc2hUb2tlbigpIHtcclxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5SRUZSRVNIX1RPS0VOKTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNUb1JlZnJlc2ggPSAoKSA9PiB0aGlzLmdldFJlZnJlc2hUb2tlbigpO1xyXG5cclxuICAgIHNpZ25VcFdob2xlc2FsZXIgPSAoZGF0YSkgPT4ge1xyXG4gICAgICAgIC8vIENvbnZlcnRpciBlbCBlbWFpbCBhIG1pbsO6c2N1bGFzIHNpIGV4aXN0ZVxyXG4gICAgICAgIGlmIChkYXRhLmVtYWlsKSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGVtYWlsOiBkYXRhLmVtYWlsLnRvTG93ZXJDYXNlKCkgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMucmVnaXN0ZXJXaG9sZXNhbGVyQXBpKCksIGRhdGEpO1xyXG4gICAgfTtcclxuXHJcbiAgICBnZXRDb3VudHJpZXNEYXRhID0gYXN5bmMgKCkgPT5cclxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZ2V0KHRoaXMuY291bnRyaWVzQXBpKCkpLnBpcGUobWFwKHJlcyA9PiByZXMuX2VtYmVkZGVkLml0ZW1zKSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgcHVibGljIHNldEFjdGl2ZUNoYW5uZWxDaGFuZ2UgPSAoYWN0aXZlbHlDaGFuZ2VDaGFubmVsc09uTG9naW46IGJvb2xlYW4pID0+IHRoaXMuYWN0aXZlQ2hhbm5lbENoYW5nZSA9IGFjdGl2ZWx5Q2hhbmdlQ2hhbm5lbHNPbkxvZ2luXHJcblxyXG4gICAgcHJpdmF0ZSBpc0FsbG93ZWRSb2xlID0gKGFsbG93ZWRSb2xlczogVXNlclJvbGVUeXBlW10sIHJvbGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHJldHVybiBhbGxvd2VkUm9sZXMubGVuZ3RoXHJcbiAgICAgICAgICAgID8gYWxsb3dlZFJvbGVzLmluY2x1ZGVzKHJvbGUgYXMgVXNlclJvbGVUeXBlKVxyXG4gICAgICAgICAgICA6IHRydWVcclxuICAgIH1cclxuXHJcbiAgICAvKiBQbGVhc2UgcmVtb3ZlIHRoaXMgQVNBUCAtIE5lZWRzICpjaGFubmVscyogYXJyYXkgaW4gdXNlciBvYmplY3QgQUxXQVlTICovXHJcbiAgICBwcml2YXRlIGZvcmNlQ2hhbm5lbHNGb3JTZWxsZXIgPSB0b2tlbnMgPT4ge1xyXG4gICAgICAgIGlmIChVc2VyUm9sZVR5cGUuU0VMTEVSID09IHRva2Vucy50eXBlIGFzIFVzZXJSb2xlVHlwZSlcclxuICAgICAgICAgICAgdGhpcy5jaGFubmVscz8ubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMudXNlci5zZXRDaGFubmVscyguLi50aGlzLmNoYW5uZWxzKVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnVzZXIuc2V0Q2hhbm5lbHModGhpcy5jaGFubmVsKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENhbWJpYSBkZSBjYW5hbFxyXG4gICAgICogQHBhcmFtIGNoYW5uZWxDb25maWcgZGViZSBzZXIgdW4gb2JqZXRvIHF1ZSBjb250ZW5nYSBhbCBtZW5vcyBsYXMga2V5cyBjaGFubmVsIHkgbG9jYWxlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNoYW5nZUNoYW5uZWwgPSAoY2hhbm5lbENvbmZpZzphbnkpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnN0YW50cy5tb2RpZnlDaGFubmVsQ29uZmlnKHtcclxuICAgICAgICAgICAgY2hhbm5lbDogY2hhbm5lbENvbmZpZy5jaGFubmVsLFxyXG4gICAgICAgICAgICBsb2NhbGU6IGNoYW5uZWxDb25maWcubG9jYWxlXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDYXJnYSBlbCBjbGllbnRlIGNvbiBlbCBxdWUgc2UgcmVhbGl6YXJhbiBwZWRpZG9zLiBTaSByZWNpYmUgZWwgdmFsb3IgbnVsbFxyXG4gICAgICogc2UgdnVlbHZlIGEgY2FyZ2FyIGVsIHZlbmRlZG9yIHBhcmEgc3UgdXNvLiAgXHJcbiAgICAgKiBAcGFyYW0gY3VzdG9tZXIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDdXN0b21lciA9IGN1c3RvbWVyID0+IHtcclxuICAgICAgICBsZXQgcmVmcmVzaFBhZ2UgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuY3VzdG9tZXIgPSBjdXN0b21lclxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ1VTVE9NRVIsIEpTT04uc3RyaW5naWZ5KGN1c3RvbWVyKSlcclxuICAgICAgICBcclxuICAgICAgICBsZXQgc2FtZUNoYW5uZWwgPSBjdXN0b21lciA/IHRoaXMuc2FtZUNoYW5uZWwoY3VzdG9tZXIuY2hhbm5lbHNbMF0uY29kZSwgY3VzdG9tZXIuY2hhbm5lbHNbMF0ubG9jYWxlcy5jb2RlKSA6IG51bGxcclxuICAgICAgICBcclxuICAgICAgICBpZiAoY3VzdG9tZXIpIHtcclxuICAgICAgICAgICAgaWYoIXNhbWVDaGFubmVsKXtcclxuICAgICAgICAgICAgICAgICFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNIQU5ORUxTRUxMRVIpID9cclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkNIQU5ORUxTRUxMRVIsIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMuY29uc3RhbnRzLmdldExvY2FsZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpIDogbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ2hhbm5lbCh7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogY3VzdG9tZXIuY2hhbm5lbHNbMF0uY29kZSxcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IGN1c3RvbWVyLmNoYW5uZWxzWzBdLmxvY2FsZXMuY29kZVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlID0gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHJlcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DSEFOTkVMU0VMTEVSKSlcclxuICAgICAgICAgICAgaWYocmVzKXtcclxuICAgICAgICAgICAgICAgIGlmKCF0aGlzLnNhbWVDaGFubmVsKHJlcy5jaGFubmVsLCByZXMubG9jYWxlKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDaGFubmVsKHJlcylcclxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSA9IHRydWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbmplY3Rvci5nZXQoQ2FydFNlcnZpY2UpLmNsZWFyQW5kUmVzZXRDdXN0b21lckNhcnQoKVxyXG4gICAgICAgIHJlZnJlc2hQYWdlID8gbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhyZWYgOiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29tcHJ1ZWJhIHNpIGxvcyB2YWxvcmVzIGRlbCBjYW5hbCBhY3R1YWwgc29uIGlndWFsZXMgYSBsb3MgaW5ncmVzYWRvIHBvciBwYXJhbWV0cm9zLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgTm9tYnJlIGRlbCBjYW5hbFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAgTG9jYWxlIGRlbCBjYW5hbFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgc2kgZXMgZWwgbWlzbW8gY2FuYWwsIEZhbHNlIGNhc28gY29udHJhcmlvLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNhbWVDaGFubmVsID0gKGNoYW5uZWw6c3RyaW5nLCBsb2NhbGU6c3RyaW5nKTpib29sZWFuID0+IChjaGFubmVsID09IHRoaXMuY29uc3RhbnRzLmdldENoYW5uZWwoKSkgJiYgKGxvY2FsZSA9PSB0aGlzLmNvbnN0YW50cy5nZXRMb2NhbGUoKSlcclxuXHJcbiAgICAvKiBwdWJsaWMgZ2V0Q3VzdG9tZXIgPSAoKSA9PiBPYnNlcnZhYmxlLm9mKEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DVVNUT01FUikpKSAqL1xyXG5cclxuICAgIHB1YmxpYyBnZXRDdXN0b21lciA9ICgpID0+IHtcclxuICAgICAgICAvKiB0aGlzLmN1c3RvbWVyU3ViamVjdC5uZXh0KEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DVVNUT01FUikpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbWVyICovXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tZXIgfHwgSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVU1RPTUVSKSlcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0SG9tZVJlc29sdmVyID0gcmVzb2x2ZXJGdW5jdGlvbiA9PiB0aGlzLmhvbWVSZXNvbHZlciA9IHJlc29sdmVyRnVuY3Rpb25cclxuXHJcbiAgICBwdWJsaWMgZ2V0SG9tZVJlc29sdmVyID0gKCkgPT4gdGhpcy5ob21lUmVzb2x2ZXJcclxuXHJcbiAgICBwdWJsaWMgaXNBYmxlVG9CdXkgPSAoKTogYm9vbGVhbiA9PiAhdGhpcy5nZXRVc2VyUHJvZmlsZUFzVXNlcigpPy5pc1NlbGxlcigpIHx8ICEhdGhpcy5nZXRDdXN0b21lcigpXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRXZhbHVhIHNpIGVsIHZhbG9yIHF1ZSBpbmdyZXNhIHBvciBwYXLDoW1ldHJvIGVzIG1heW9yIG8gaWd1YWwgYWwgbcOtbmltbyBkZSBjb21wcmFcclxuICAgICAqIHF1ZSBlbCB1c3VhcmlvIHRpZW5lIGFzaWduYWRvIGEgZXNlIGNhbmFsLCBkaWZlcmVuY2lhbmRvIHNpIGVzIG1heW9yaXN0YSBvIG1pbm9yaXN0YS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIHNpIGV4Y2VkZSBlbCBtb250bywgZmFsc2UgY2FzbyBjb250cmFyaW9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGV4Y2VlZHNNaW5pbXVtQW1vdW50ID0gKHZhbHVlOm51bWJlcj0wKTpib29sZWFuID0+ICBcclxuICAgICAgICB0aGlzLnVzZXIuaXNXaG9sZXNhbGVyKCkgPyB0aGlzLnVzZXIuY2hhbm5lbHMuZmluZCggY2hhbm5lbCA9PiB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgPT0gY2hhbm5lbC5jb2RlKS53aG9sZXNhbGVyTWluaW11bVB1cmNoYXNlQW1vdW50IDw9IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy51c2VyLmNoYW5uZWxzLmZpbmQoIGNoYW5uZWwgPT4gdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpID09IGNoYW5uZWwuY29kZSkucmV0YWlsZXJNaW5pbXVtUHVyY2hhc2VBbW91bnQgPD0gdmFsdWVcclxufSJdfQ==