@esolve/ng-esolve-connect 0.127.0 → 0.128.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (737) hide show
  1. package/README.md +1 -0
  2. package/fesm2022/esolve-ng-esolve-connect-media.mjs +19 -19
  3. package/fesm2022/esolve-ng-esolve-connect-media.mjs.map +1 -1
  4. package/fesm2022/esolve-ng-esolve-connect-notifications.mjs +3 -3
  5. package/fesm2022/esolve-ng-esolve-connect-notifications.mjs.map +1 -1
  6. package/fesm2022/esolve-ng-esolve-connect-survey.mjs +3 -3
  7. package/fesm2022/esolve-ng-esolve-connect-survey.mjs.map +1 -1
  8. package/fesm2022/esolve-ng-esolve-connect.mjs +135 -136
  9. package/fesm2022/esolve-ng-esolve-connect.mjs.map +1 -1
  10. package/lib/auth/providers/esolve-eurus-auto-login.provider.d.ts +1 -2
  11. package/package.json +1 -9
  12. package/esm2022/esolve-ng-esolve-connect.mjs +0 -5
  13. package/esm2022/index.mjs +0 -76
  14. package/esm2022/lib/account/address/classes/esolve-address-result.model.mjs +0 -11
  15. package/esm2022/lib/account/address/classes/esolve-address.model.mjs +0 -41
  16. package/esm2022/lib/account/address/classes/esolve-session-address-update-result.model.mjs +0 -11
  17. package/esm2022/lib/account/address/classes/index.mjs +0 -4
  18. package/esm2022/lib/account/address/index.mjs +0 -4
  19. package/esm2022/lib/account/address/interfaces/esolve-address-post-data.interface.mjs +0 -2
  20. package/esm2022/lib/account/address/interfaces/esolve-address-record.interface.mjs +0 -2
  21. package/esm2022/lib/account/address/interfaces/esolve-address-response.interface.mjs +0 -2
  22. package/esm2022/lib/account/address/interfaces/index.mjs +0 -4
  23. package/esm2022/lib/account/address/types/esolve-address-place-type.type.mjs +0 -2
  24. package/esm2022/lib/account/address/types/esolve-address-type.type.mjs +0 -2
  25. package/esm2022/lib/account/address/types/index.mjs +0 -3
  26. package/esm2022/lib/account/confirmation/esolve-account-confirmation-post-response-item.interface.mjs +0 -2
  27. package/esm2022/lib/account/confirmation/esolve-account-confirmation-result.model.mjs +0 -10
  28. package/esm2022/lib/account/confirmation/index.mjs +0 -3
  29. package/esm2022/lib/account/esolve-account.service.mjs +0 -703
  30. package/esm2022/lib/account/esolve-geocode-response.interface.mjs +0 -2
  31. package/esm2022/lib/account/esolve-session-client-update-result.model.mjs +0 -11
  32. package/esm2022/lib/account/esolve-session-shipping-update-result.model.mjs +0 -11
  33. package/esm2022/lib/account/index.mjs +0 -11
  34. package/esm2022/lib/account/location/classes/esolve-location-update-result.model.mjs +0 -11
  35. package/esm2022/lib/account/location/classes/index.mjs +0 -2
  36. package/esm2022/lib/account/location/index.mjs +0 -3
  37. package/esm2022/lib/account/location/interfaces/esolve-location-options.interface.mjs +0 -2
  38. package/esm2022/lib/account/location/interfaces/index.mjs +0 -2
  39. package/esm2022/lib/account/password/esolve-change-password-result.model.mjs +0 -8
  40. package/esm2022/lib/account/password/esolve-forgot-password-get-result.interface.mjs +0 -2
  41. package/esm2022/lib/account/password/esolve-forgot-password-response.interface.mjs +0 -2
  42. package/esm2022/lib/account/password/esolve-reset-password-result.model.mjs +0 -11
  43. package/esm2022/lib/account/password/index.mjs +0 -5
  44. package/esm2022/lib/account/registration/esolve-registration-data.interface.mjs +0 -2
  45. package/esm2022/lib/account/registration/esolve-registration-post-response-item.interface.mjs +0 -2
  46. package/esm2022/lib/account/registration/esolve-registration-result.model.mjs +0 -12
  47. package/esm2022/lib/account/registration/index.mjs +0 -4
  48. package/esm2022/lib/account/user-account/classes/esolve-client-asset-list.model.mjs +0 -4
  49. package/esm2022/lib/account/user-account/classes/esolve-client-asset.model.mjs +0 -14
  50. package/esm2022/lib/account/user-account/classes/esolve-erp-document-request.model.mjs +0 -20
  51. package/esm2022/lib/account/user-account/classes/esolve-erp-documents-request-result.model.mjs +0 -7
  52. package/esm2022/lib/account/user-account/classes/esolve-statement-ageing.model.mjs +0 -9
  53. package/esm2022/lib/account/user-account/classes/esolve-statement-balances.model.mjs +0 -15
  54. package/esm2022/lib/account/user-account/classes/esolve-statement-transaction.model.mjs +0 -17
  55. package/esm2022/lib/account/user-account/classes/esolve-statement.model.mjs +0 -12
  56. package/esm2022/lib/account/user-account/classes/esolve-user-account-business.model.mjs +0 -11
  57. package/esm2022/lib/account/user-account/classes/esolve-user-account-contact.model.mjs +0 -10
  58. package/esm2022/lib/account/user-account/classes/esolve-user-account-result.model.mjs +0 -9
  59. package/esm2022/lib/account/user-account/classes/esolve-user-account.model.mjs +0 -25
  60. package/esm2022/lib/account/user-account/classes/esolve-user-client-account-balances.model.mjs +0 -13
  61. package/esm2022/lib/account/user-account/classes/esolve-user-client-account.model.mjs +0 -93
  62. package/esm2022/lib/account/user-account/classes/index.mjs +0 -15
  63. package/esm2022/lib/account/user-account/index.mjs +0 -3
  64. package/esm2022/lib/account/user-account/interfaces/esolve-client-asset-record.interface.mjs +0 -2
  65. package/esm2022/lib/account/user-account/interfaces/esolve-client-assets-options.interface.mjs +0 -2
  66. package/esm2022/lib/account/user-account/interfaces/esolve-erp-document-request-record.interface.mjs +0 -2
  67. package/esm2022/lib/account/user-account/interfaces/esolve-statement-ageing-record.interface.mjs +0 -2
  68. package/esm2022/lib/account/user-account/interfaces/esolve-statement-balances-record.interface.mjs +0 -2
  69. package/esm2022/lib/account/user-account/interfaces/esolve-statement-record.interface.mjs +0 -2
  70. package/esm2022/lib/account/user-account/interfaces/esolve-statement-transaction-record.interface.mjs +0 -2
  71. package/esm2022/lib/account/user-account/interfaces/esolve-user-account-data.interface.mjs +0 -2
  72. package/esm2022/lib/account/user-account/interfaces/esolve-user-account-record.interface.mjs +0 -2
  73. package/esm2022/lib/account/user-account/interfaces/esolve-user-client-account-balances-record.interface.mjs +0 -2
  74. package/esm2022/lib/account/user-account/interfaces/esolve-user-client-account-record.interface.mjs +0 -2
  75. package/esm2022/lib/account/user-account/interfaces/index.mjs +0 -12
  76. package/esm2022/lib/account/user-account/types/esolve-client-assets-sort-field.type.mjs +0 -2
  77. package/esm2022/lib/account/user-account/types/index.mjs +0 -2
  78. package/esm2022/lib/affiliates/classes/esolve-affiliate-check-result.model.mjs +0 -43
  79. package/esm2022/lib/affiliates/classes/esolve-affiliate-link-result.model.mjs +0 -9
  80. package/esm2022/lib/affiliates/classes/esolve-affiliate.model.mjs +0 -47
  81. package/esm2022/lib/affiliates/classes/index.mjs +0 -4
  82. package/esm2022/lib/affiliates/index.mjs +0 -5
  83. package/esm2022/lib/affiliates/interfaces/esolve-affiliate-check-record.interface.mjs +0 -2
  84. package/esm2022/lib/affiliates/interfaces/esolve-affiliate-link-options.interface.mjs +0 -2
  85. package/esm2022/lib/affiliates/interfaces/esolve-affiliate-record.interface.mjs +0 -2
  86. package/esm2022/lib/affiliates/interfaces/esolve-affiliates-options.interface.mjs +0 -2
  87. package/esm2022/lib/affiliates/interfaces/index.mjs +0 -5
  88. package/esm2022/lib/affiliates/services/esolve-affiliate.service.mjs +0 -168
  89. package/esm2022/lib/affiliates/services/index.mjs +0 -2
  90. package/esm2022/lib/affiliates/types/esolve-affiliate-link-response.type.mjs +0 -2
  91. package/esm2022/lib/affiliates/types/index.mjs +0 -2
  92. package/esm2022/lib/albums/classes/esolve-album-image-list.model.mjs +0 -4
  93. package/esm2022/lib/albums/classes/esolve-album-image.model.mjs +0 -50
  94. package/esm2022/lib/albums/classes/esolve-album-list.model.mjs +0 -4
  95. package/esm2022/lib/albums/classes/esolve-album.model.mjs +0 -17
  96. package/esm2022/lib/albums/classes/index.mjs +0 -5
  97. package/esm2022/lib/albums/index.mjs +0 -5
  98. package/esm2022/lib/albums/interfaces/esolve-album-image-options.interface.mjs +0 -2
  99. package/esm2022/lib/albums/interfaces/esolve-album-image-record.interface.mjs +0 -2
  100. package/esm2022/lib/albums/interfaces/esolve-album-options.interface.mjs +0 -2
  101. package/esm2022/lib/albums/interfaces/esolve-album-record.interface.mjs +0 -2
  102. package/esm2022/lib/albums/interfaces/index.mjs +0 -5
  103. package/esm2022/lib/albums/services/esolve-albums.service.mjs +0 -158
  104. package/esm2022/lib/albums/services/index.mjs +0 -2
  105. package/esm2022/lib/albums/types/esolve-album-image-size.type.mjs +0 -2
  106. package/esm2022/lib/albums/types/index.mjs +0 -2
  107. package/esm2022/lib/assets/classes/esolve-asset.model.mjs +0 -77
  108. package/esm2022/lib/assets/classes/esolve-linked-asset.model.mjs +0 -29
  109. package/esm2022/lib/assets/classes/index.mjs +0 -3
  110. package/esm2022/lib/assets/esolve-assets.service.mjs +0 -154
  111. package/esm2022/lib/assets/index.mjs +0 -6
  112. package/esm2022/lib/assets/interfaces/esolve-asset-options.interface.mjs +0 -2
  113. package/esm2022/lib/assets/interfaces/esolve-asset-record.interface.mjs +0 -2
  114. package/esm2022/lib/assets/interfaces/esolve-linked-asset-record.interface.mjs +0 -2
  115. package/esm2022/lib/assets/interfaces/esolve-media-asset-options.interface.mjs +0 -2
  116. package/esm2022/lib/assets/interfaces/esolve-stock-asset-options.interface.mjs +0 -2
  117. package/esm2022/lib/assets/interfaces/index.mjs +0 -6
  118. package/esm2022/lib/assets/types/esolve-asset-list.type.mjs +0 -2
  119. package/esm2022/lib/assets/types/esolve-asset-type.type.mjs +0 -2
  120. package/esm2022/lib/assets/types/index.mjs +0 -3
  121. package/esm2022/lib/auth/index.mjs +0 -7
  122. package/esm2022/lib/auth/interceptors/esolve-auth.interceptor.mjs +0 -32
  123. package/esm2022/lib/auth/interceptors/index.mjs +0 -2
  124. package/esm2022/lib/auth/interfaces/esolve-auth-check-data.interface.mjs +0 -2
  125. package/esm2022/lib/auth/interfaces/esolve-auth-data.interface.mjs +0 -2
  126. package/esm2022/lib/auth/interfaces/esolve-auth-get-data.interface.mjs +0 -2
  127. package/esm2022/lib/auth/interfaces/esolve-auth-response.interface.mjs +0 -2
  128. package/esm2022/lib/auth/interfaces/esolve-login-post-response-item.interface.mjs +0 -2
  129. package/esm2022/lib/auth/interfaces/esolve-otp-options.interface.mjs +0 -2
  130. package/esm2022/lib/auth/interfaces/esolve-otp-record.interface.mjs +0 -2
  131. package/esm2022/lib/auth/interfaces/esolve-otp-validation-record.interface.mjs +0 -2
  132. package/esm2022/lib/auth/interfaces/index.mjs +0 -9
  133. package/esm2022/lib/auth/models/esolve-otp-validation.model.mjs +0 -20
  134. package/esm2022/lib/auth/models/esolve-otp.model.mjs +0 -16
  135. package/esm2022/lib/auth/models/index.mjs +0 -3
  136. package/esm2022/lib/auth/providers/esolve-eurus-auto-login.provider.mjs +0 -12
  137. package/esm2022/lib/auth/providers/index.mjs +0 -2
  138. package/esm2022/lib/auth/services/esolve-auth.service.mjs +0 -296
  139. package/esm2022/lib/auth/services/esolve-otp.service.mjs +0 -80
  140. package/esm2022/lib/auth/services/index.mjs +0 -3
  141. package/esm2022/lib/auth/types/esolve-auth-check-response.type.mjs +0 -2
  142. package/esm2022/lib/auth/types/esolve-auth-get-response.type.mjs +0 -2
  143. package/esm2022/lib/auth/types/esolve-auth-response-data.type.mjs +0 -2
  144. package/esm2022/lib/auth/types/esolve-auth-result.type.mjs +0 -2
  145. package/esm2022/lib/auth/types/esolve-login-response.type.mjs +0 -2
  146. package/esm2022/lib/auth/types/esolve-logout-response.type.mjs +0 -2
  147. package/esm2022/lib/auth/types/esolve-otp-action.type.mjs +0 -2
  148. package/esm2022/lib/auth/types/esolve-validate-otp-response.type.mjs +0 -2
  149. package/esm2022/lib/auth/types/index.mjs +0 -9
  150. package/esm2022/lib/banners/classes/esolve-banner-image-hotspot.model.mjs +0 -9
  151. package/esm2022/lib/banners/classes/esolve-banner-image.model.mjs +0 -14
  152. package/esm2022/lib/banners/classes/esolve-banner.model.mjs +0 -29
  153. package/esm2022/lib/banners/classes/index.mjs +0 -4
  154. package/esm2022/lib/banners/esolve-banner.service.mjs +0 -99
  155. package/esm2022/lib/banners/index.mjs +0 -6
  156. package/esm2022/lib/banners/interfaces/esolve-banner-image-hotspot-coords.interface.mjs +0 -2
  157. package/esm2022/lib/banners/interfaces/esolve-banner-image-hotspot-record.interface.mjs +0 -2
  158. package/esm2022/lib/banners/interfaces/esolve-banner-image-record.interface.mjs +0 -2
  159. package/esm2022/lib/banners/interfaces/esolve-banner-image-set.interface.mjs +0 -2
  160. package/esm2022/lib/banners/interfaces/esolve-banner-link.interface.mjs +0 -2
  161. package/esm2022/lib/banners/interfaces/esolve-banner-record.interface.mjs +0 -2
  162. package/esm2022/lib/banners/interfaces/index.mjs +0 -7
  163. package/esm2022/lib/banners/types/esolve-banner-image-type.type.mjs +0 -2
  164. package/esm2022/lib/banners/types/esolve-banner-type.type.mjs +0 -2
  165. package/esm2022/lib/banners/types/index.mjs +0 -3
  166. package/esm2022/lib/captcha/classes/esolve-captcha.model.mjs +0 -11
  167. package/esm2022/lib/captcha/classes/index.mjs +0 -2
  168. package/esm2022/lib/captcha/esolve-captcha.service.mjs +0 -44
  169. package/esm2022/lib/captcha/index.mjs +0 -5
  170. package/esm2022/lib/captcha/interfaces/esolve-captcha-options.interface.mjs +0 -2
  171. package/esm2022/lib/captcha/interfaces/esolve-captcha-record.interface.mjs +0 -2
  172. package/esm2022/lib/captcha/interfaces/index.mjs +0 -3
  173. package/esm2022/lib/captcha/types/esolve-captcha-action.type.mjs +0 -2
  174. package/esm2022/lib/captcha/types/index.mjs +0 -2
  175. package/esm2022/lib/cart/classes/esolve-cart-alternative.model.mjs +0 -69
  176. package/esm2022/lib/cart/classes/esolve-cart-item.model.mjs +0 -31
  177. package/esm2022/lib/cart/classes/esolve-cart-stock-item.model.mjs +0 -56
  178. package/esm2022/lib/cart/classes/esolve-cart-tax-breakdown.model.mjs +0 -7
  179. package/esm2022/lib/cart/classes/esolve-cart-totals.model.mjs +0 -88
  180. package/esm2022/lib/cart/classes/esolve-checkout-result.model.mjs +0 -10
  181. package/esm2022/lib/cart/classes/esolve-delivery-category-totals.model.mjs +0 -27
  182. package/esm2022/lib/cart/classes/esolve-empty-cart-result.model.mjs +0 -4
  183. package/esm2022/lib/cart/classes/esolve-transaction-analytics-data.model.mjs +0 -14
  184. package/esm2022/lib/cart/classes/index.mjs +0 -9
  185. package/esm2022/lib/cart/esolve-cart.service.mjs +0 -308
  186. package/esm2022/lib/cart/index.mjs +0 -5
  187. package/esm2022/lib/cart/interfaces/esolve-cart-additional-params.interface.mjs +0 -2
  188. package/esm2022/lib/cart/interfaces/esolve-cart-additional-where.interface.mjs +0 -2
  189. package/esm2022/lib/cart/interfaces/esolve-cart-alternative-record.interface.mjs +0 -2
  190. package/esm2022/lib/cart/interfaces/esolve-cart-item-record.interface.mjs +0 -2
  191. package/esm2022/lib/cart/interfaces/esolve-cart-item-response.interface.mjs +0 -2
  192. package/esm2022/lib/cart/interfaces/esolve-cart-set-item.interface.mjs +0 -2
  193. package/esm2022/lib/cart/interfaces/esolve-cart-totals-record.interface.mjs +0 -2
  194. package/esm2022/lib/cart/interfaces/esolve-checkout-body.interface.mjs +0 -2
  195. package/esm2022/lib/cart/interfaces/esolve-checkout-response.interface.mjs +0 -2
  196. package/esm2022/lib/cart/interfaces/esolve-time-slot-checkout.interface.mjs +0 -2
  197. package/esm2022/lib/cart/interfaces/esolve-tracking-code.interface.mjs +0 -2
  198. package/esm2022/lib/cart/interfaces/esolve-transaction-analytics-data-record.interface.mjs +0 -2
  199. package/esm2022/lib/cart/interfaces/esovle-delivery-category-totals-record.interface.mjs +0 -2
  200. package/esm2022/lib/cart/interfaces/index.mjs +0 -14
  201. package/esm2022/lib/cart/types/esolve-cart-alternatives-map.type.mjs +0 -2
  202. package/esm2022/lib/cart/types/esolve-cart-empty-response.type.mjs +0 -2
  203. package/esm2022/lib/cart/types/esolve-cart-set-action.type.mjs +0 -2
  204. package/esm2022/lib/cart/types/esolve-cart.type.mjs +0 -2
  205. package/esm2022/lib/cart/types/esolve-delivery-category-totals-map-record.type.mjs +0 -2
  206. package/esm2022/lib/cart/types/esolve-delivery-category-totals-map.type.mjs +0 -2
  207. package/esm2022/lib/cart/types/index.mjs +0 -7
  208. package/esm2022/lib/category-tree/classes/esolve-category-tree-item.model.mjs +0 -48
  209. package/esm2022/lib/category-tree/classes/index.mjs +0 -2
  210. package/esm2022/lib/category-tree/esolve-category-tree.service.mjs +0 -153
  211. package/esm2022/lib/category-tree/index.mjs +0 -4
  212. package/esm2022/lib/category-tree/interfaces/esolve-category-identifier.interface.mjs +0 -2
  213. package/esm2022/lib/category-tree/interfaces/esolve-category-record.interface.mjs +0 -2
  214. package/esm2022/lib/category-tree/interfaces/esolve-category-tree-item-options.interface.mjs +0 -2
  215. package/esm2022/lib/category-tree/interfaces/esolve-category-tree-item-record.interface.mjs +0 -2
  216. package/esm2022/lib/category-tree/interfaces/esolve-subcategory-record.interface.mjs +0 -2
  217. package/esm2022/lib/category-tree/interfaces/index.mjs +0 -6
  218. package/esm2022/lib/competitions/classes/esolve-competition-dates.model.mjs +0 -15
  219. package/esm2022/lib/competitions/classes/esolve-competition-entry-result.model.mjs +0 -9
  220. package/esm2022/lib/competitions/classes/esolve-competition-winner.model.mjs +0 -22
  221. package/esm2022/lib/competitions/classes/esolve-competition.model.mjs +0 -102
  222. package/esm2022/lib/competitions/classes/index.mjs +0 -5
  223. package/esm2022/lib/competitions/index.mjs +0 -7
  224. package/esm2022/lib/competitions/interfaces/esolve-competition-options.interface.mjs +0 -2
  225. package/esm2022/lib/competitions/interfaces/esolve-competition-record.interface.mjs +0 -2
  226. package/esm2022/lib/competitions/interfaces/esolve-competition-winner-record.interface.mjs +0 -2
  227. package/esm2022/lib/competitions/interfaces/index.mjs +0 -4
  228. package/esm2022/lib/competitions/services/esolve-competitions.service.mjs +0 -124
  229. package/esm2022/lib/competitions/services/index.mjs +0 -2
  230. package/esm2022/lib/competitions/types/esolve-competition-entry-response.type.mjs +0 -2
  231. package/esm2022/lib/competitions/types/index.mjs +0 -2
  232. package/esm2022/lib/core/esolve-config.service.mjs +0 -55
  233. package/esm2022/lib/core/esolve-connect-config.interface.mjs +0 -2
  234. package/esm2022/lib/core/esolve-connect-config.token.mjs +0 -3
  235. package/esm2022/lib/core/index.mjs +0 -5
  236. package/esm2022/lib/core/providers/index.mjs +0 -2
  237. package/esm2022/lib/core/providers/ng-esolve-connect.provider.mjs +0 -19
  238. package/esm2022/lib/coupons/classes/esolve-coupon.model.mjs +0 -29
  239. package/esm2022/lib/coupons/classes/index.mjs +0 -2
  240. package/esm2022/lib/coupons/esolve-coupons.service.mjs +0 -225
  241. package/esm2022/lib/coupons/index.mjs +0 -9
  242. package/esm2022/lib/coupons/interfaces/esolve-coupon-record.interface.mjs +0 -2
  243. package/esm2022/lib/coupons/interfaces/esolve-coupon-validation-error.interface.mjs +0 -2
  244. package/esm2022/lib/coupons/interfaces/esolve-coupon-validation-result.interface.mjs +0 -2
  245. package/esm2022/lib/coupons/interfaces/esolve-coupon-validation.interface.mjs +0 -2
  246. package/esm2022/lib/coupons/interfaces/index.mjs +0 -5
  247. package/esm2022/lib/coupons/types/esolve-coupons-cache.type.mjs +0 -2
  248. package/esm2022/lib/coupons/types/index.mjs +0 -2
  249. package/esm2022/lib/deliveries/classes/esolve-delivery-list.model.mjs +0 -4
  250. package/esm2022/lib/deliveries/classes/esolve-delivery-status.model.mjs +0 -27
  251. package/esm2022/lib/deliveries/classes/esolve-delivery.model.mjs +0 -41
  252. package/esm2022/lib/deliveries/classes/index.mjs +0 -4
  253. package/esm2022/lib/deliveries/esolve-deliveries.service.mjs +0 -119
  254. package/esm2022/lib/deliveries/index.mjs +0 -5
  255. package/esm2022/lib/deliveries/interfaces/esolve-deliveries-options.interface.mjs +0 -2
  256. package/esm2022/lib/deliveries/interfaces/esolve-delivery-record.interface.mjs +0 -2
  257. package/esm2022/lib/deliveries/interfaces/esolve-delivery-status-record.interface.mjs +0 -2
  258. package/esm2022/lib/deliveries/interfaces/index.mjs +0 -4
  259. package/esm2022/lib/deliveries/types/esolve-deliveries-sort-field.type.mjs +0 -2
  260. package/esm2022/lib/deliveries/types/esolve-delivery-status.type.mjs +0 -2
  261. package/esm2022/lib/deliveries/types/esolve-delivery-type.type.mjs +0 -2
  262. package/esm2022/lib/deliveries/types/index.mjs +0 -4
  263. package/esm2022/lib/device/classes/esolve-set-device-result.model.mjs +0 -9
  264. package/esm2022/lib/device/classes/esolve-user-device.model.mjs +0 -26
  265. package/esm2022/lib/device/classes/index.mjs +0 -3
  266. package/esm2022/lib/device/esolve-device.service.mjs +0 -75
  267. package/esm2022/lib/device/index.mjs +0 -5
  268. package/esm2022/lib/device/interfaces/esolve-device.interface.mjs +0 -2
  269. package/esm2022/lib/device/interfaces/esolve-user-device-options.interface.mjs +0 -2
  270. package/esm2022/lib/device/interfaces/esolve-user-device-record.interface.mjs +0 -2
  271. package/esm2022/lib/device/interfaces/index.mjs +0 -4
  272. package/esm2022/lib/device/types/esolve-device-type.type.mjs +0 -2
  273. package/esm2022/lib/device/types/index.mjs +0 -2
  274. package/esm2022/lib/enquiry/classes/esolve-enquiry-result.model.mjs +0 -9
  275. package/esm2022/lib/enquiry/classes/index.mjs +0 -2
  276. package/esm2022/lib/enquiry/esolve-enquiry.service.mjs +0 -38
  277. package/esm2022/lib/enquiry/index.mjs +0 -4
  278. package/esm2022/lib/enquiry/types/esolve-enquiry-response.type.mjs +0 -2
  279. package/esm2022/lib/enquiry/types/index.mjs +0 -2
  280. package/esm2022/lib/geocoder/classes/esolve-geocode-address-result.model.mjs +0 -12
  281. package/esm2022/lib/geocoder/classes/esolve-geocode-coords-result.model.mjs +0 -7
  282. package/esm2022/lib/geocoder/classes/esolve-geocode-result.model.mjs +0 -11
  283. package/esm2022/lib/geocoder/classes/index.mjs +0 -4
  284. package/esm2022/lib/geocoder/esolve-geocoder.service.mjs +0 -66
  285. package/esm2022/lib/geocoder/index.mjs +0 -4
  286. package/esm2022/lib/geocoder/interfaces/esolve-geocode-address-record.interface.mjs +0 -2
  287. package/esm2022/lib/geocoder/interfaces/esolve-geocode-result-record.interface.mjs +0 -2
  288. package/esm2022/lib/geocoder/interfaces/index.mjs +0 -3
  289. package/esm2022/lib/images/directives/cdn-src.directive.mjs +0 -71
  290. package/esm2022/lib/images/directives/index.mjs +0 -2
  291. package/esm2022/lib/images/esolve-image-loader.provider.mjs +0 -16
  292. package/esm2022/lib/images/functions/index.mjs +0 -5
  293. package/esm2022/lib/images/functions/is-esolve-cdn-path.function.mjs +0 -5
  294. package/esm2022/lib/images/functions/is-ftg-cdn-path.function.mjs +0 -5
  295. package/esm2022/lib/images/functions/is-legacy-esolve-cdn-path.function.mjs +0 -5
  296. package/esm2022/lib/images/functions/process-image-src.function.mjs +0 -38
  297. package/esm2022/lib/images/index.mjs +0 -4
  298. package/esm2022/lib/locations/classes/esolve-location-address.model.mjs +0 -13
  299. package/esm2022/lib/locations/classes/esolve-location-contact-info.model.mjs +0 -10
  300. package/esm2022/lib/locations/classes/esolve-location-geo.model.mjs +0 -8
  301. package/esm2022/lib/locations/classes/esolve-location-list.model.mjs +0 -11
  302. package/esm2022/lib/locations/classes/esolve-location-pobox-address.model.mjs +0 -8
  303. package/esm2022/lib/locations/classes/esolve-location-trading-day.model.mjs +0 -7
  304. package/esm2022/lib/locations/classes/esolve-location-trading-times.model.mjs +0 -14
  305. package/esm2022/lib/locations/classes/esolve-location.model.mjs +0 -93
  306. package/esm2022/lib/locations/classes/index.mjs +0 -10
  307. package/esm2022/lib/locations/esolve-locations.service.mjs +0 -188
  308. package/esm2022/lib/locations/index.mjs +0 -5
  309. package/esm2022/lib/locations/interfaces/esolve-location-filter-options.interface.mjs +0 -2
  310. package/esm2022/lib/locations/interfaces/esolve-location-geo-options.interface.mjs +0 -2
  311. package/esm2022/lib/locations/interfaces/esolve-location-options.interface.mjs +0 -2
  312. package/esm2022/lib/locations/interfaces/esolve-location-record.interface.mjs +0 -2
  313. package/esm2022/lib/locations/interfaces/index.mjs +0 -5
  314. package/esm2022/lib/locations/types/esolve-location-image-size.type.mjs +0 -2
  315. package/esm2022/lib/locations/types/esolve-location-sort-field.type.mjs +0 -2
  316. package/esm2022/lib/locations/types/index.mjs +0 -4
  317. package/esm2022/lib/manufacturers/classes/esolve-manufacturer.model.mjs +0 -61
  318. package/esm2022/lib/manufacturers/classes/index.mjs +0 -2
  319. package/esm2022/lib/manufacturers/esolve-manufacturers.service.mjs +0 -71
  320. package/esm2022/lib/manufacturers/index.mjs +0 -6
  321. package/esm2022/lib/manufacturers/interfaces/esolve-manufacturer-options.interface.mjs +0 -2
  322. package/esm2022/lib/manufacturers/interfaces/esolve-manufacturer-record.interface.mjs +0 -2
  323. package/esm2022/lib/manufacturers/interfaces/index.mjs +0 -3
  324. package/esm2022/lib/manufacturers/types/esolve-manufacturer-image-size.type.mjs +0 -2
  325. package/esm2022/lib/manufacturers/types/index.mjs +0 -2
  326. package/esm2022/lib/menu/classes/esolve-menu-item.model.mjs +0 -31
  327. package/esm2022/lib/menu/classes/index.mjs +0 -2
  328. package/esm2022/lib/menu/esolve-menu.service.mjs +0 -45
  329. package/esm2022/lib/menu/index.mjs +0 -5
  330. package/esm2022/lib/menu/interfaces/esolve-menu-tree-record.interface.mjs +0 -2
  331. package/esm2022/lib/menu/interfaces/index.mjs +0 -2
  332. package/esm2022/lib/menu/types/esolve-menu.type.mjs +0 -2
  333. package/esm2022/lib/menu/types/index.mjs +0 -2
  334. package/esm2022/lib/news/classes/esolve-news-article-author.model.mjs +0 -9
  335. package/esm2022/lib/news/classes/esolve-news-article-list.model.mjs +0 -8
  336. package/esm2022/lib/news/classes/esolve-news-article.model.mjs +0 -73
  337. package/esm2022/lib/news/classes/esolve-news-group.model.mjs +0 -25
  338. package/esm2022/lib/news/classes/esolve-newsletter-result.model.mjs +0 -9
  339. package/esm2022/lib/news/classes/index.mjs +0 -6
  340. package/esm2022/lib/news/esolve-news.service.mjs +0 -130
  341. package/esm2022/lib/news/index.mjs +0 -5
  342. package/esm2022/lib/news/interfaces/esolve-news-article-author-record.interface.mjs +0 -2
  343. package/esm2022/lib/news/interfaces/esolve-news-article-options.interface.mjs +0 -2
  344. package/esm2022/lib/news/interfaces/esolve-news-article-record.interface.mjs +0 -2
  345. package/esm2022/lib/news/interfaces/esolve-news-group-record.interface.mjs +0 -2
  346. package/esm2022/lib/news/interfaces/index.mjs +0 -5
  347. package/esm2022/lib/news/types/esolve-newsletter-response.type.mjs +0 -2
  348. package/esm2022/lib/news/types/index.mjs +0 -2
  349. package/esm2022/lib/ng-esolve-connect.module.mjs +0 -24
  350. package/esm2022/lib/payment/classes/esolve-account-payment.model.mjs +0 -13
  351. package/esm2022/lib/payment/classes/esolve-banking-details.model.mjs +0 -11
  352. package/esm2022/lib/payment/classes/esolve-payment-method.model.mjs +0 -32
  353. package/esm2022/lib/payment/classes/esolve-payment-result.model.mjs +0 -37
  354. package/esm2022/lib/payment/classes/esolve-vault-item-result.model.mjs +0 -20
  355. package/esm2022/lib/payment/classes/esolve-vault-item.model.mjs +0 -26
  356. package/esm2022/lib/payment/classes/index.mjs +0 -7
  357. package/esm2022/lib/payment/esolve-payment.service.mjs +0 -311
  358. package/esm2022/lib/payment/index.mjs +0 -5
  359. package/esm2022/lib/payment/interfaces/esolve-account-payment-options.interface.mjs +0 -2
  360. package/esm2022/lib/payment/interfaces/esolve-account-payment-record.interface.mjs +0 -2
  361. package/esm2022/lib/payment/interfaces/esolve-card-data.interface.mjs +0 -2
  362. package/esm2022/lib/payment/interfaces/esolve-payment-form-input.interface.mjs +0 -2
  363. package/esm2022/lib/payment/interfaces/esolve-payment-method-options.interface.mjs +0 -2
  364. package/esm2022/lib/payment/interfaces/esolve-payment-method-record.interface.mjs +0 -2
  365. package/esm2022/lib/payment/interfaces/esolve-payment-redirect-links.interface.mjs +0 -2
  366. package/esm2022/lib/payment/interfaces/esolve-payment-response.interface.mjs +0 -2
  367. package/esm2022/lib/payment/interfaces/esolve-payment-set-body.interface.mjs +0 -2
  368. package/esm2022/lib/payment/interfaces/esolve-payment-status.interface.mjs +0 -2
  369. package/esm2022/lib/payment/interfaces/esolve-vault-record.interface.mjs +0 -2
  370. package/esm2022/lib/payment/interfaces/esolve-vault-response.interface.mjs +0 -2
  371. package/esm2022/lib/payment/interfaces/index.mjs +0 -13
  372. package/esm2022/lib/payment/types/esolve-integration-type.type.mjs +0 -2
  373. package/esm2022/lib/payment/types/esolve-service-provider.type.mjs +0 -2
  374. package/esm2022/lib/payment/types/index.mjs +0 -3
  375. package/esm2022/lib/ranges/classes/esolve-range.model.mjs +0 -54
  376. package/esm2022/lib/ranges/classes/index.mjs +0 -2
  377. package/esm2022/lib/ranges/esolve-ranges.service.mjs +0 -74
  378. package/esm2022/lib/ranges/index.mjs +0 -4
  379. package/esm2022/lib/ranges/interfaces/esolve-range-options.interface.mjs +0 -2
  380. package/esm2022/lib/ranges/interfaces/esolve-range-record.interface.mjs +0 -2
  381. package/esm2022/lib/ranges/interfaces/index.mjs +0 -3
  382. package/esm2022/lib/reviews/classes/esolve-review-list.model.mjs +0 -8
  383. package/esm2022/lib/reviews/classes/esolve-review-result.model.mjs +0 -9
  384. package/esm2022/lib/reviews/classes/esolve-review.model.mjs +0 -22
  385. package/esm2022/lib/reviews/classes/index.mjs +0 -4
  386. package/esm2022/lib/reviews/index.mjs +0 -5
  387. package/esm2022/lib/reviews/interfaces/esolve-review-list-record.interface.mjs +0 -2
  388. package/esm2022/lib/reviews/interfaces/esolve-review-options.interface.mjs +0 -2
  389. package/esm2022/lib/reviews/interfaces/esolve-review-record.interface.mjs +0 -2
  390. package/esm2022/lib/reviews/interfaces/esolve-review-report.interface.mjs +0 -2
  391. package/esm2022/lib/reviews/interfaces/esolve-review-user.interface.mjs +0 -2
  392. package/esm2022/lib/reviews/interfaces/index.mjs +0 -6
  393. package/esm2022/lib/reviews/services/esolve-reviews.service.mjs +0 -134
  394. package/esm2022/lib/reviews/services/index.mjs +0 -2
  395. package/esm2022/lib/reviews/types/esolve-review-response.type.mjs +0 -2
  396. package/esm2022/lib/reviews/types/esolve-review-sort-field.type.mjs +0 -2
  397. package/esm2022/lib/reviews/types/index.mjs +0 -3
  398. package/esm2022/lib/seo/classes/esolve-seo-info.model.mjs +0 -12
  399. package/esm2022/lib/seo/classes/index.mjs +0 -2
  400. package/esm2022/lib/seo/esolve-seo.service.mjs +0 -112
  401. package/esm2022/lib/seo/index.mjs +0 -4
  402. package/esm2022/lib/seo/interfaces/esolve-seo-details.interface.mjs +0 -2
  403. package/esm2022/lib/seo/interfaces/index.mjs +0 -2
  404. package/esm2022/lib/session/esolve-session-metadata.service.mjs +0 -71
  405. package/esm2022/lib/session/esolve-session.service.mjs +0 -241
  406. package/esm2022/lib/session/index.mjs +0 -4
  407. package/esm2022/lib/session/interfaces/esolve-session-data.interface.mjs +0 -2
  408. package/esm2022/lib/session/interfaces/esolve-session-update-options.interface.mjs +0 -2
  409. package/esm2022/lib/session/interfaces/esolve-session.interface.mjs +0 -2
  410. package/esm2022/lib/session/interfaces/index.mjs +0 -4
  411. package/esm2022/lib/shared/cookie/esolve-cookie-options.interface.mjs +0 -2
  412. package/esm2022/lib/shared/cookie/esolve-cookie.service.mjs +0 -29
  413. package/esm2022/lib/shared/cookie/index.mjs +0 -2
  414. package/esm2022/lib/shared/custom-fields/index.mjs +0 -2
  415. package/esm2022/lib/shared/custom-fields/interfaces/esolve-custom-fields.interface.mjs +0 -2
  416. package/esm2022/lib/shared/custom-fields/interfaces/index.mjs +0 -2
  417. package/esm2022/lib/shared/errors/esolve-error-handler.service.mjs +0 -94
  418. package/esm2022/lib/shared/errors/esolve-http-error.model.mjs +0 -15
  419. package/esm2022/lib/shared/errors/index.mjs +0 -3
  420. package/esm2022/lib/shared/esolve-hex-hash.function.mjs +0 -26
  421. package/esm2022/lib/shared/esolve-list.model.mjs +0 -9
  422. package/esm2022/lib/shared/esolve-result.model.mjs +0 -8
  423. package/esm2022/lib/shared/esolve-url-target.type.mjs +0 -2
  424. package/esm2022/lib/shared/filters/classes/esolve-generic-filter.model.mjs +0 -27
  425. package/esm2022/lib/shared/filters/classes/esolve-multiple-select-filter.model.mjs +0 -31
  426. package/esm2022/lib/shared/filters/classes/esolve-range-filter.model.mjs +0 -46
  427. package/esm2022/lib/shared/filters/classes/esolve-single-select-filter.model.mjs +0 -34
  428. package/esm2022/lib/shared/filters/classes/esolve-toggle-filter.model.mjs +0 -22
  429. package/esm2022/lib/shared/filters/classes/index.mjs +0 -7
  430. package/esm2022/lib/shared/filters/esolve-filter-factory.mjs +0 -72
  431. package/esm2022/lib/shared/filters/index.mjs +0 -5
  432. package/esm2022/lib/shared/filters/interfaces/esolve-filter-definitions.interface.mjs +0 -2
  433. package/esm2022/lib/shared/filters/interfaces/esolve-filter-record.interface.mjs +0 -2
  434. package/esm2022/lib/shared/filters/interfaces/esolve-filter.interface.mjs +0 -2
  435. package/esm2022/lib/shared/filters/interfaces/esolve-generic-filter-definition.interface.mjs +0 -2
  436. package/esm2022/lib/shared/filters/interfaces/esolve-range-filter-definition.interface.mjs +0 -2
  437. package/esm2022/lib/shared/filters/interfaces/esolve-range-filter-record.interface.mjs +0 -2
  438. package/esm2022/lib/shared/filters/interfaces/esolve-select-filter-record.interface.mjs +0 -2
  439. package/esm2022/lib/shared/filters/interfaces/esolve-select-filter.interface.mjs +0 -2
  440. package/esm2022/lib/shared/filters/interfaces/index.mjs +0 -10
  441. package/esm2022/lib/shared/filters/types/esolve-filter-list.type.mjs +0 -2
  442. package/esm2022/lib/shared/filters/types/esolve-filter-record-list.type.mjs +0 -2
  443. package/esm2022/lib/shared/filters/types/esolve-filter-toggle.type.mjs +0 -2
  444. package/esm2022/lib/shared/filters/types/esolve-filter-type.type.mjs +0 -2
  445. package/esm2022/lib/shared/filters/types/esolve-range-filter-type.type.mjs +0 -2
  446. package/esm2022/lib/shared/filters/types/esolve-select-filter-type.type.mjs +0 -2
  447. package/esm2022/lib/shared/filters/types/index.mjs +0 -8
  448. package/esm2022/lib/shared/index.mjs +0 -11
  449. package/esm2022/lib/shared/response/classes/esolve-response-result.model.mjs +0 -9
  450. package/esm2022/lib/shared/response/classes/index.mjs +0 -2
  451. package/esm2022/lib/shared/response/esolve-response-handler.service.mjs +0 -33
  452. package/esm2022/lib/shared/response/index.mjs +0 -4
  453. package/esm2022/lib/shared/response/interfaces/esolve-delete-response.interface.mjs +0 -2
  454. package/esm2022/lib/shared/response/interfaces/esolve-delete-result.interface.mjs +0 -2
  455. package/esm2022/lib/shared/response/interfaces/esolve-get-response.interface.mjs +0 -2
  456. package/esm2022/lib/shared/response/interfaces/esolve-post-response-item.interface.mjs +0 -2
  457. package/esm2022/lib/shared/response/interfaces/esolve-post-response-status.interface.mjs +0 -2
  458. package/esm2022/lib/shared/response/interfaces/esolve-response-log-item.interface.mjs +0 -2
  459. package/esm2022/lib/shared/response/interfaces/esolve-response.interface.mjs +0 -2
  460. package/esm2022/lib/shared/response/interfaces/esolve-set-response.interface.mjs +0 -2
  461. package/esm2022/lib/shared/response/interfaces/index.mjs +0 -9
  462. package/esm2022/lib/shared/sort/esolve-sort-order.type.mjs +0 -2
  463. package/esm2022/lib/shared/sort/esolve-sort.interface.mjs +0 -2
  464. package/esm2022/lib/shared/sort/index.mjs +0 -5
  465. package/esm2022/lib/shipping/classes/esolve-shipping-cost.model.mjs +0 -12
  466. package/esm2022/lib/shipping/classes/esolve-shipping-method.model.mjs +0 -37
  467. package/esm2022/lib/shipping/classes/esolve-shipping-totals.model.mjs +0 -8
  468. package/esm2022/lib/shipping/classes/esolve-time-slot-config.model.mjs +0 -17
  469. package/esm2022/lib/shipping/classes/esolve-time-slot-date.model.mjs +0 -14
  470. package/esm2022/lib/shipping/classes/esolve-time-slot-days.model.mjs +0 -21
  471. package/esm2022/lib/shipping/classes/esolve-time-slot-times.model.mjs +0 -11
  472. package/esm2022/lib/shipping/classes/esolve-time-slot.model.mjs +0 -19
  473. package/esm2022/lib/shipping/classes/index.mjs +0 -9
  474. package/esm2022/lib/shipping/esolve-shipping.service.mjs +0 -149
  475. package/esm2022/lib/shipping/index.mjs +0 -5
  476. package/esm2022/lib/shipping/interfaces/esolve-shipping-cost-record.interface.mjs +0 -2
  477. package/esm2022/lib/shipping/interfaces/esolve-shipping-method-options.interface.mjs +0 -2
  478. package/esm2022/lib/shipping/interfaces/esolve-shipping-method-record.interface.mjs +0 -2
  479. package/esm2022/lib/shipping/interfaces/esolve-time-slot-config-record.interface.mjs +0 -2
  480. package/esm2022/lib/shipping/interfaces/esolve-time-slot-date-record.interface.mjs +0 -2
  481. package/esm2022/lib/shipping/interfaces/esolve-time-slot-days-record.interface.mjs +0 -2
  482. package/esm2022/lib/shipping/interfaces/esolve-time-slot-record.interface.mjs +0 -2
  483. package/esm2022/lib/shipping/interfaces/esolve-time-slot-times-record.interface.mjs +0 -2
  484. package/esm2022/lib/shipping/interfaces/index.mjs +0 -9
  485. package/esm2022/lib/shipping/types/esolve-delivery_integration.type.mjs +0 -2
  486. package/esm2022/lib/shipping/types/esolve-insurance-calculation-method.type.mjs +0 -2
  487. package/esm2022/lib/shipping/types/esolve-shipping-calculation-method.type.mjs +0 -2
  488. package/esm2022/lib/shipping/types/esolve-shipping-location.type.mjs +0 -2
  489. package/esm2022/lib/shipping/types/index.mjs +0 -5
  490. package/esm2022/lib/specials/classes/esolve-special-dates.model.mjs +0 -7
  491. package/esm2022/lib/specials/classes/esolve-special-image-collection.model.mjs +0 -25
  492. package/esm2022/lib/specials/classes/esolve-special-image.model.mjs +0 -9
  493. package/esm2022/lib/specials/classes/esolve-special.model.mjs +0 -40
  494. package/esm2022/lib/specials/classes/index.mjs +0 -5
  495. package/esm2022/lib/specials/esolve-specials.service.mjs +0 -78
  496. package/esm2022/lib/specials/index.mjs +0 -4
  497. package/esm2022/lib/specials/interfaces/esolve-special-image-collection-record.interface.mjs +0 -2
  498. package/esm2022/lib/specials/interfaces/esolve-special-image-record.interface.mjs +0 -2
  499. package/esm2022/lib/specials/interfaces/esolve-special-options.interface.mjs +0 -2
  500. package/esm2022/lib/specials/interfaces/esolve-special-record.interface.mjs +0 -2
  501. package/esm2022/lib/specials/interfaces/index.mjs +0 -5
  502. package/esm2022/lib/stock/classes/esolve-additional-stock-image.model.mjs +0 -21
  503. package/esm2022/lib/stock/classes/esolve-colour.model.mjs +0 -23
  504. package/esm2022/lib/stock/classes/esolve-dependant-item.model.mjs +0 -11
  505. package/esm2022/lib/stock/classes/esolve-linked-stock-item.model.mjs +0 -9
  506. package/esm2022/lib/stock/classes/esolve-media-stock-item.model.mjs +0 -7
  507. package/esm2022/lib/stock/classes/esolve-recipe-stock-item.model.mjs +0 -9
  508. package/esm2022/lib/stock/classes/esolve-set-notify-result.model.mjs +0 -9
  509. package/esm2022/lib/stock/classes/esolve-stock-badge.model.mjs +0 -11
  510. package/esm2022/lib/stock/classes/esolve-stock-group-item.model.mjs +0 -7
  511. package/esm2022/lib/stock/classes/esolve-stock-group.model.mjs +0 -13
  512. package/esm2022/lib/stock/classes/esolve-stock-image-collection.model.mjs +0 -25
  513. package/esm2022/lib/stock/classes/esolve-stock-image.model.mjs +0 -50
  514. package/esm2022/lib/stock/classes/esolve-stock-item-base.model.mjs +0 -393
  515. package/esm2022/lib/stock/classes/esolve-stock-item-list.model.mjs +0 -11
  516. package/esm2022/lib/stock/classes/esolve-stock-item-location-level.model.mjs +0 -17
  517. package/esm2022/lib/stock/classes/esolve-stock-item.model.mjs +0 -24
  518. package/esm2022/lib/stock/classes/esolve-stock-lead-times.model.mjs +0 -9
  519. package/esm2022/lib/stock/classes/esolve-stock-price.model.mjs +0 -52
  520. package/esm2022/lib/stock/classes/esolve-stock-reviews-report.model.mjs +0 -18
  521. package/esm2022/lib/stock/classes/esolve-stock-transaction-history.model.mjs +0 -7
  522. package/esm2022/lib/stock/classes/esolve-stock-transaction-sales.model.mjs +0 -9
  523. package/esm2022/lib/stock/classes/esolve-suggested-stock-item.model.mjs +0 -7
  524. package/esm2022/lib/stock/classes/index.mjs +0 -23
  525. package/esm2022/lib/stock/esolve-stock.service.mjs +0 -505
  526. package/esm2022/lib/stock/index.mjs +0 -6
  527. package/esm2022/lib/stock/interfaces/esolve-additional-stock-image-record.interface.mjs +0 -2
  528. package/esm2022/lib/stock/interfaces/esolve-colour-record.interface.mjs +0 -2
  529. package/esm2022/lib/stock/interfaces/esolve-dependant-item-record.interface.mjs +0 -2
  530. package/esm2022/lib/stock/interfaces/esolve-linked-stock-record.interface.mjs +0 -2
  531. package/esm2022/lib/stock/interfaces/esolve-media-stock-item-options.interface.mjs +0 -2
  532. package/esm2022/lib/stock/interfaces/esolve-recipe-item-record.interface.mjs +0 -2
  533. package/esm2022/lib/stock/interfaces/esolve-recipe-stock-options.interface.mjs +0 -2
  534. package/esm2022/lib/stock/interfaces/esolve-stock-badge-record.interface.mjs +0 -2
  535. package/esm2022/lib/stock/interfaces/esolve-stock-base-record.interface.mjs +0 -2
  536. package/esm2022/lib/stock/interfaces/esolve-stock-cart-parameter.interface.mjs +0 -2
  537. package/esm2022/lib/stock/interfaces/esolve-stock-filter-options.interface.mjs +0 -2
  538. package/esm2022/lib/stock/interfaces/esolve-stock-image-collection-record.interface.mjs +0 -2
  539. package/esm2022/lib/stock/interfaces/esolve-stock-item-base-options.interface.mjs +0 -2
  540. package/esm2022/lib/stock/interfaces/esolve-stock-item-history-options.interface.mjs +0 -2
  541. package/esm2022/lib/stock/interfaces/esolve-stock-item-location-level-record.interface.mjs +0 -2
  542. package/esm2022/lib/stock/interfaces/esolve-stock-item-options.interface.mjs +0 -2
  543. package/esm2022/lib/stock/interfaces/esolve-stock-lead-times-record.interface.mjs +0 -2
  544. package/esm2022/lib/stock/interfaces/esolve-stock-linked-category-record.interface.mjs +0 -2
  545. package/esm2022/lib/stock/interfaces/esolve-stock-record.interface.mjs +0 -2
  546. package/esm2022/lib/stock/interfaces/esolve-stock-reviews-report-record.interface.mjs +0 -2
  547. package/esm2022/lib/stock/interfaces/esolve-transaction-sales-stock-item-options.interface.mjs +0 -2
  548. package/esm2022/lib/stock/interfaces/index.mjs +0 -23
  549. package/esm2022/lib/stock/types/esolve-erp-sales-stock-sort-field.type.mjs +0 -2
  550. package/esm2022/lib/stock/types/esolve-media-stock-item-list.type.mjs +0 -2
  551. package/esm2022/lib/stock/types/esolve-media-stock-item-record.type.mjs +0 -2
  552. package/esm2022/lib/stock/types/esolve-media-stock-sort-field.type.mjs +0 -2
  553. package/esm2022/lib/stock/types/esolve-stock-cart-parameter-input.type.mjs +0 -2
  554. package/esm2022/lib/stock/types/esolve-stock-group-item-record.type.mjs +0 -2
  555. package/esm2022/lib/stock/types/esolve-stock-history-sort-field.type.mjs +0 -2
  556. package/esm2022/lib/stock/types/esolve-stock-image-size.type.mjs +0 -2
  557. package/esm2022/lib/stock/types/esolve-stock-sort-field.type.mjs +0 -2
  558. package/esm2022/lib/stock/types/esolve-stock-type.type.mjs +0 -2
  559. package/esm2022/lib/stock/types/esolve-stock-unit-of-measure.type.mjs +0 -2
  560. package/esm2022/lib/stock/types/index.mjs +0 -13
  561. package/esm2022/lib/suppliers/classes/esolve-supplier.model.mjs +0 -27
  562. package/esm2022/lib/suppliers/classes/index.mjs +0 -2
  563. package/esm2022/lib/suppliers/esolve-suppliers.service.mjs +0 -56
  564. package/esm2022/lib/suppliers/index.mjs +0 -5
  565. package/esm2022/lib/suppliers/interfaces/esolve-supplier-options.interface.mjs +0 -2
  566. package/esm2022/lib/suppliers/interfaces/esolve-supplier-record.interface.mjs +0 -2
  567. package/esm2022/lib/suppliers/interfaces/index.mjs +0 -3
  568. package/esm2022/lib/tags/classes/esolve-tag.model.mjs +0 -35
  569. package/esm2022/lib/tags/classes/index.mjs +0 -2
  570. package/esm2022/lib/tags/esolve-tags.service.mjs +0 -75
  571. package/esm2022/lib/tags/index.mjs +0 -6
  572. package/esm2022/lib/tags/interfaces/esolve-tag-options.interface.mjs +0 -2
  573. package/esm2022/lib/tags/interfaces/esolve-tag-record.interface.mjs +0 -2
  574. package/esm2022/lib/tags/interfaces/index.mjs +0 -3
  575. package/esm2022/lib/tags/types/esolve-tag-phrase-match-mode.type.mjs +0 -2
  576. package/esm2022/lib/tags/types/index.mjs +0 -2
  577. package/esm2022/lib/topics/classes/esolve-topic.model.mjs +0 -15
  578. package/esm2022/lib/topics/classes/index.mjs +0 -2
  579. package/esm2022/lib/topics/esolve-topic.service.mjs +0 -53
  580. package/esm2022/lib/topics/index.mjs +0 -4
  581. package/esm2022/lib/topics/interfaces/esolve-topic-record.interface.mjs +0 -2
  582. package/esm2022/lib/topics/interfaces/index.mjs +0 -2
  583. package/esm2022/lib/transactions/classes/esolve-transaction-address.model.mjs +0 -17
  584. package/esm2022/lib/transactions/classes/esolve-transaction-approval-result.model.mjs +0 -11
  585. package/esm2022/lib/transactions/classes/esolve-transaction-client.model.mjs +0 -13
  586. package/esm2022/lib/transactions/classes/esolve-transaction-delivery.model.mjs +0 -37
  587. package/esm2022/lib/transactions/classes/esolve-transaction-item-price.model.mjs +0 -25
  588. package/esm2022/lib/transactions/classes/esolve-transaction-item.model.mjs +0 -90
  589. package/esm2022/lib/transactions/classes/esolve-transaction-list.model.mjs +0 -4
  590. package/esm2022/lib/transactions/classes/esolve-transaction-location.model.mjs +0 -4
  591. package/esm2022/lib/transactions/classes/esolve-transaction-payment-method.model.mjs +0 -11
  592. package/esm2022/lib/transactions/classes/esolve-transaction-pick.model.mjs +0 -8
  593. package/esm2022/lib/transactions/classes/esolve-transaction-shipping-method.model.mjs +0 -13
  594. package/esm2022/lib/transactions/classes/esolve-transaction-time-slot.model.mjs +0 -9
  595. package/esm2022/lib/transactions/classes/esolve-transaction-user.model.mjs +0 -11
  596. package/esm2022/lib/transactions/classes/esolve-transaction.model.mjs +0 -89
  597. package/esm2022/lib/transactions/classes/index.mjs +0 -15
  598. package/esm2022/lib/transactions/esolve-transactions.service.mjs +0 -198
  599. package/esm2022/lib/transactions/index.mjs +0 -5
  600. package/esm2022/lib/transactions/interfaces/esolve-transaction-approval.interface.mjs +0 -2
  601. package/esm2022/lib/transactions/interfaces/esolve-transaction-client-record.interface.mjs +0 -2
  602. package/esm2022/lib/transactions/interfaces/esolve-transaction-item-record.interface.mjs +0 -2
  603. package/esm2022/lib/transactions/interfaces/esolve-transaction-options.interface.mjs +0 -2
  604. package/esm2022/lib/transactions/interfaces/esolve-transaction-payment-method-record.interface.mjs +0 -2
  605. package/esm2022/lib/transactions/interfaces/esolve-transaction-record.interface.mjs +0 -2
  606. package/esm2022/lib/transactions/interfaces/esolve-transaction-shipping-method-record.interface.mjs +0 -2
  607. package/esm2022/lib/transactions/interfaces/esolve-transaction-time-slot-record.interface.mjs +0 -2
  608. package/esm2022/lib/transactions/interfaces/esolve-transaction-user-record.interface.mjs +0 -2
  609. package/esm2022/lib/transactions/interfaces/index.mjs +0 -10
  610. package/esm2022/lib/transactions/types/esolve-pick-status.type.mjs +0 -2
  611. package/esm2022/lib/transactions/types/esolve-transaction-approval-state.type.mjs +0 -2
  612. package/esm2022/lib/transactions/types/esolve-transaction-location-record.type.mjs +0 -2
  613. package/esm2022/lib/transactions/types/esolve-transaction-sort-field.type.mjs +0 -2
  614. package/esm2022/lib/transactions/types/esolve-transaction-type.type.mjs +0 -2
  615. package/esm2022/lib/transactions/types/index.mjs +0 -6
  616. package/esm2022/lib/vouchers/classes/esolve-voucher.model.mjs +0 -18
  617. package/esm2022/lib/vouchers/classes/index.mjs +0 -2
  618. package/esm2022/lib/vouchers/esolve-vouchers.service.mjs +0 -225
  619. package/esm2022/lib/vouchers/index.mjs +0 -9
  620. package/esm2022/lib/vouchers/interfaces/esolve-voucher-record.interface.mjs +0 -2
  621. package/esm2022/lib/vouchers/interfaces/esolve-voucher-validation-error.interface.mjs +0 -2
  622. package/esm2022/lib/vouchers/interfaces/esolve-voucher-validation-result.interface.mjs +0 -2
  623. package/esm2022/lib/vouchers/interfaces/esolve-voucher-validation.interface.mjs +0 -2
  624. package/esm2022/lib/vouchers/interfaces/index.mjs +0 -5
  625. package/esm2022/lib/vouchers/types/esolve-vouchers-cache.type.mjs +0 -2
  626. package/esm2022/lib/vouchers/types/index.mjs +0 -2
  627. package/esm2022/lib/wallet/classes/esolve-wallet-balances.model.mjs +0 -15
  628. package/esm2022/lib/wallet/classes/esolve-wallet-transaction.model.mjs +0 -24
  629. package/esm2022/lib/wallet/classes/esolve-wallet-transactions-list.model.mjs +0 -4
  630. package/esm2022/lib/wallet/classes/index.mjs +0 -4
  631. package/esm2022/lib/wallet/esolve-wallet.service.mjs +0 -135
  632. package/esm2022/lib/wallet/index.mjs +0 -5
  633. package/esm2022/lib/wallet/interfaces/esolve-wallet-balances-record.interface.mjs +0 -2
  634. package/esm2022/lib/wallet/interfaces/esolve-wallet-cash-out-options.interface.mjs +0 -2
  635. package/esm2022/lib/wallet/interfaces/esolve-wallet-transaction-options.interface.mjs +0 -2
  636. package/esm2022/lib/wallet/interfaces/esolve-wallet-transaction-record.interface.mjs +0 -2
  637. package/esm2022/lib/wallet/interfaces/index.mjs +0 -5
  638. package/esm2022/lib/wallet/types/esolve-wallet-cash-out-response.type.mjs +0 -2
  639. package/esm2022/lib/wallet/types/esolve-wallet-transaction-type.type.mjs +0 -2
  640. package/esm2022/lib/wallet/types/index.mjs +0 -3
  641. package/esm2022/lib/wishlist/classes/esolve-empty-wishlist-result.model.mjs +0 -4
  642. package/esm2022/lib/wishlist/classes/esolve-wishlist-item.model.mjs +0 -14
  643. package/esm2022/lib/wishlist/classes/index.mjs +0 -3
  644. package/esm2022/lib/wishlist/esolve-wishlist.service.mjs +0 -113
  645. package/esm2022/lib/wishlist/index.mjs +0 -6
  646. package/esm2022/lib/wishlist/interfaces/esolve-wishlist-item-record.interface.mjs +0 -2
  647. package/esm2022/lib/wishlist/interfaces/esolve-wishlist-item-response.interface.mjs +0 -2
  648. package/esm2022/lib/wishlist/interfaces/esolve-wishlist-set-item.interface.mjs +0 -2
  649. package/esm2022/lib/wishlist/interfaces/index.mjs +0 -4
  650. package/esm2022/lib/wishlist/types/esolve-wishlist-set-action.type.mjs +0 -2
  651. package/esm2022/lib/wishlist/types/esolve-wishlist.type.mjs +0 -2
  652. package/esm2022/lib/wishlist/types/index.mjs +0 -3
  653. package/esm2022/media/esolve-ng-esolve-connect-media.mjs +0 -5
  654. package/esm2022/media/index.mjs +0 -9
  655. package/esm2022/media/lib/classes/esolve-heading.model.mjs +0 -7
  656. package/esm2022/media/lib/classes/esolve-media-article.model.mjs +0 -75
  657. package/esm2022/media/lib/classes/esolve-media-group.model.mjs +0 -15
  658. package/esm2022/media/lib/classes/esolve-media-layout-section.model.mjs +0 -18
  659. package/esm2022/media/lib/classes/esolve-media-link.model.mjs +0 -8
  660. package/esm2022/media/lib/classes/index.mjs +0 -6
  661. package/esm2022/media/lib/components/index.mjs +0 -3
  662. package/esm2022/media/lib/components/media-layout/esolve-media-layout.component.mjs +0 -40
  663. package/esm2022/media/lib/components/media-section/esolve-media-section.component.mjs +0 -52
  664. package/esm2022/media/lib/esolve-connect-media-config.token.mjs +0 -3
  665. package/esm2022/media/lib/functions/index.mjs +0 -2
  666. package/esm2022/media/lib/functions/provide-ng-esolve-connect-media.function.mjs +0 -8
  667. package/esm2022/media/lib/interfaces/esolve-connect-media-config.interface.mjs +0 -2
  668. package/esm2022/media/lib/interfaces/esolve-heading-record.interface.mjs +0 -2
  669. package/esm2022/media/lib/interfaces/esolve-layout-config.interface.mjs +0 -2
  670. package/esm2022/media/lib/interfaces/esolve-layout-section-config.interface.mjs +0 -2
  671. package/esm2022/media/lib/interfaces/esolve-media-group-record.interface.mjs +0 -2
  672. package/esm2022/media/lib/interfaces/esolve-media-layout-section-record.interface.mjs +0 -2
  673. package/esm2022/media/lib/interfaces/esolve-media-link-record.interface.mjs +0 -2
  674. package/esm2022/media/lib/interfaces/esolve-media-record.interface.mjs +0 -2
  675. package/esm2022/media/lib/interfaces/esolve-media-section-data-generic.interface.mjs +0 -2
  676. package/esm2022/media/lib/interfaces/esolve-media-stock-section-data.interface.mjs +0 -2
  677. package/esm2022/media/lib/interfaces/esolve-section-key-options.interface.mjs +0 -2
  678. package/esm2022/media/lib/interfaces/index.mjs +0 -12
  679. package/esm2022/media/lib/ng-esolve-connect-media.module.mjs +0 -23
  680. package/esm2022/media/lib/services/esolve-media-layout.service.mjs +0 -151
  681. package/esm2022/media/lib/services/esolve-media.service.mjs +0 -117
  682. package/esm2022/media/lib/services/index.mjs +0 -3
  683. package/esm2022/media/lib/types/esolve-media-layout-section-type.type.mjs +0 -2
  684. package/esm2022/media/lib/types/index.mjs +0 -2
  685. package/esm2022/notifications/esolve-ng-esolve-connect-notifications.mjs +0 -5
  686. package/esm2022/notifications/index.mjs +0 -5
  687. package/esm2022/notifications/lib/classes/esolve-notification-button-action.model.mjs +0 -15
  688. package/esm2022/notifications/lib/classes/esolve-notification-dates.model.mjs +0 -7
  689. package/esm2022/notifications/lib/classes/esolve-system-notification-type.model.mjs +0 -16
  690. package/esm2022/notifications/lib/classes/esolve-system-notification.model.mjs +0 -28
  691. package/esm2022/notifications/lib/classes/index.mjs +0 -5
  692. package/esm2022/notifications/lib/interfaces/esolve-notification-button-action-record.interface.mjs +0 -2
  693. package/esm2022/notifications/lib/interfaces/esolve-notification-date-record.interface.mjs +0 -2
  694. package/esm2022/notifications/lib/interfaces/esolve-notification-dates-record.interface.mjs +0 -2
  695. package/esm2022/notifications/lib/interfaces/esolve-system-notification-options.interface.mjs +0 -2
  696. package/esm2022/notifications/lib/interfaces/esolve-system-notification-record.interface.mjs +0 -2
  697. package/esm2022/notifications/lib/interfaces/esolve-system-notification-type-record.interface.mjs +0 -2
  698. package/esm2022/notifications/lib/interfaces/index.mjs +0 -7
  699. package/esm2022/notifications/lib/services/esolve-notifications.service.mjs +0 -45
  700. package/esm2022/notifications/lib/services/index.mjs +0 -2
  701. package/esm2022/notifications/lib/types/esolve-notification-position.type.mjs +0 -2
  702. package/esm2022/notifications/lib/types/esolve-notification-size.type.mjs +0 -2
  703. package/esm2022/notifications/lib/types/esolve-notification-type.type.mjs +0 -2
  704. package/esm2022/notifications/lib/types/index.mjs +0 -4
  705. package/esm2022/survey/esolve-ng-esolve-connect-survey.mjs +0 -5
  706. package/esm2022/survey/index.mjs +0 -5
  707. package/esm2022/survey/lib/classes/esolve-survey-answer-result.model.mjs +0 -11
  708. package/esm2022/survey/lib/classes/esolve-survey-check-question.model.mjs +0 -11
  709. package/esm2022/survey/lib/classes/esolve-survey-input-question.model.mjs +0 -11
  710. package/esm2022/survey/lib/classes/esolve-survey-options-question.model.mjs +0 -24
  711. package/esm2022/survey/lib/classes/esolve-survey-question.model.mjs +0 -10
  712. package/esm2022/survey/lib/classes/esolve-survey-radio-question.model.mjs +0 -11
  713. package/esm2022/survey/lib/classes/esolve-survey-rating-question.model.mjs +0 -17
  714. package/esm2022/survey/lib/classes/esolve-survey-select-question.model.mjs +0 -27
  715. package/esm2022/survey/lib/classes/esolve-survey-text-question.model.mjs +0 -10
  716. package/esm2022/survey/lib/classes/esolve-survey-textarea-question.model.mjs +0 -11
  717. package/esm2022/survey/lib/classes/esolve-survey-values-question.model.mjs +0 -11
  718. package/esm2022/survey/lib/classes/esolve-survey.model.mjs +0 -60
  719. package/esm2022/survey/lib/classes/index.mjs +0 -13
  720. package/esm2022/survey/lib/interfaces/esolve-survey-answer-response.interface.mjs +0 -2
  721. package/esm2022/survey/lib/interfaces/esolve-survey-option.interface.mjs +0 -2
  722. package/esm2022/survey/lib/interfaces/esolve-survey-options-question-record.interface.mjs +0 -2
  723. package/esm2022/survey/lib/interfaces/esolve-survey-options.interface.mjs +0 -2
  724. package/esm2022/survey/lib/interfaces/esolve-survey-question-record.type.mjs +0 -2
  725. package/esm2022/survey/lib/interfaces/esolve-survey-record.interface.mjs +0 -2
  726. package/esm2022/survey/lib/interfaces/esolve-survey-text-question-record.interface.mjs +0 -2
  727. package/esm2022/survey/lib/interfaces/esolve-survey-values-question-record.interface.mjs +0 -2
  728. package/esm2022/survey/lib/interfaces/index.mjs +0 -9
  729. package/esm2022/survey/lib/services/esolve-survey.service.mjs +0 -100
  730. package/esm2022/survey/lib/services/index.mjs +0 -2
  731. package/esm2022/survey/lib/types/esolve-survey-options-question-type.type.mjs +0 -2
  732. package/esm2022/survey/lib/types/esolve-survey-question-record-list.type.mjs +0 -2
  733. package/esm2022/survey/lib/types/esolve-survey-question-type.type.mjs +0 -2
  734. package/esm2022/survey/lib/types/esolve-survey-text-question-type.type.mjs +0 -2
  735. package/esm2022/survey/lib/types/esolve-survey-type.type.mjs +0 -2
  736. package/esm2022/survey/lib/types/esolve-survey-values-question-type.type.mjs +0 -2
  737. package/esm2022/survey/lib/types/index.mjs +0 -7
@@ -1,703 +0,0 @@
1
- import { Injectable, inject } from '@angular/core';
2
- import { HttpClient, HttpParams, } from '@angular/common/http';
3
- import { throwError, catchError, map } from 'rxjs';
4
- import { EsolveConfigService } from '../core';
5
- import { EsolveErrorHandlerService, EsolveResponseHandlerService, EsolveResult, EsolveFilterFactory, } from '../shared';
6
- import { EsolveAuthService } from '../auth';
7
- import { EsolveSessionService } from '../session';
8
- import { EsolveCartTotals } from '../cart';
9
- import { EsolveTransaction, EsolveTransactionList, } from '../transactions';
10
- import { EsolveRegistrationResult, } from './registration';
11
- import { EsolveAddress, EsolveAddressResult, EsolveSessionAddressUpdateResult, } from './address';
12
- import { EsolveChangePasswordResult, EsolveResetPasswordResult, } from './password';
13
- import { EsolveErpDocumentRequest, EsolveUserAccount, EsolveUserAccountResult, EsolveUserClientAccountBalances, EsolveErpDocumentsRequestResult, EsolveUserClientAccount, EsolveClientAsset, EsolveClientAssetList, } from './user-account';
14
- import { EsolveAccountConfirmationResult, } from './confirmation';
15
- import { EsolveLocationUpdateResult } from './location';
16
- import { EsolveSessionShippingUpdateResult } from './esolve-session-shipping-update-result.model';
17
- import { EsolveSessionClientUpdateResult } from './esolve-session-client-update-result.model';
18
- import * as i0 from "@angular/core";
19
- export class EsolveAccountService {
20
- get user_id() {
21
- return this._user_id;
22
- }
23
- set user_id(value) {
24
- value = value > 0 ? value : 0;
25
- if (this._user_id !== value) {
26
- this._user_id = value;
27
- }
28
- }
29
- constructor() {
30
- this.config = inject(EsolveConfigService);
31
- this.http = inject(HttpClient);
32
- this.sessionService = inject(EsolveSessionService);
33
- this.errorHandler = inject(EsolveErrorHandlerService);
34
- this.responseHandler = inject(EsolveResponseHandlerService);
35
- this.authService = inject(EsolveAuthService);
36
- this._user_id = 0;
37
- this.sessionService.getSession().subscribe((session) => {
38
- if (session.token !== '') {
39
- this.user_id = session.user_id;
40
- }
41
- });
42
- }
43
- updateUserAccount(user_account_data) {
44
- const body = {
45
- account: user_account_data,
46
- };
47
- return this.http
48
- .post(`${this.config.api_url}/set-user-account.php`, body, {
49
- headers: {
50
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
51
- },
52
- responseType: 'json',
53
- observe: 'body',
54
- })
55
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => new EsolveUserAccountResult(response))), catchError((errorRes) => {
56
- return this.errorHandler.handleHttpPostError('set-user-account', errorRes);
57
- }));
58
- }
59
- getUserAccount() {
60
- return this.http
61
- .get(`${this.config.api_url}/get-account.php`)
62
- .pipe(map((response) => {
63
- if (response.records === undefined ||
64
- response.records.length === 0) {
65
- throw response;
66
- }
67
- const record = response.records[0];
68
- return this.processUserAccount(record);
69
- }));
70
- }
71
- deleteUserAccount() {
72
- return this.http
73
- .delete(`${this.config.api_url}/delete-account.php`, {
74
- responseType: 'json',
75
- observe: 'body',
76
- })
77
- .pipe(map((http_response) => {
78
- if (http_response.result === undefined ||
79
- http_response.result === null ||
80
- http_response.result.status !== 'success') {
81
- throw http_response;
82
- }
83
- this.authService.handleExternalAuthentication(http_response.additional_data);
84
- return new EsolveResult(http_response.result.status, http_response.result.code, http_response.result.message);
85
- }), catchError((errorRes) => {
86
- return this.errorHandler.handleHttpDeleteError('delete-account', errorRes);
87
- }));
88
- }
89
- setAddress(address_post_data) {
90
- const body = {
91
- address: address_post_data,
92
- };
93
- return this.http
94
- .post(`${this.config.api_url}/set-address.php`, body, {
95
- headers: {
96
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
97
- },
98
- responseType: 'json',
99
- observe: 'body',
100
- })
101
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => new EsolveAddressResult(response))), catchError((errorRes) => {
102
- return this.errorHandler.handleHttpPostError('set-address', errorRes);
103
- }));
104
- }
105
- getAddresses() {
106
- try {
107
- this.loginGuard();
108
- return this.http
109
- .get(`${this.config.api_url}/get-addresses.php`, {
110
- params: { user_id: this.user_id },
111
- })
112
- .pipe(map((response) => {
113
- if (response.records === undefined) {
114
- throw response;
115
- }
116
- return this.processUserAddress(response.records);
117
- }));
118
- }
119
- catch (error) {
120
- return throwError(() => error);
121
- }
122
- }
123
- getClients() {
124
- try {
125
- this.loginGuard();
126
- return this.http
127
- .get(`${this.config.api_url}/get-user-clients.php`)
128
- .pipe(map((response) => {
129
- if (response.records === undefined) {
130
- throw response;
131
- }
132
- return this.processUserClients(response.records);
133
- }));
134
- }
135
- catch (error) {
136
- return throwError(() => error);
137
- }
138
- }
139
- deleteAddress(id) {
140
- return this.http
141
- .delete(`${this.config.api_url}/delete-address.php`, {
142
- params: { id },
143
- responseType: 'json',
144
- observe: 'body',
145
- })
146
- .pipe(map((http_response) => {
147
- if (http_response.result === undefined ||
148
- http_response.result === null ||
149
- http_response.result.status !== 'success') {
150
- throw http_response;
151
- }
152
- return new EsolveResult(http_response.result.status, http_response.result.code, http_response.result.message);
153
- }), catchError((errorRes) => {
154
- return this.errorHandler.handleHttpDeleteError('delete-address', errorRes);
155
- }));
156
- }
157
- register(user_registration, guest = false) {
158
- const body = {
159
- user: user_registration,
160
- guest_registration: guest,
161
- };
162
- return this.http
163
- .post(`${this.config.api_url}/set-registration.php`, body, {
164
- headers: {
165
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
166
- },
167
- responseType: 'json',
168
- observe: 'body',
169
- })
170
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response, additional_data) => {
171
- if (response.auto_login) {
172
- const session_data = response.session_data;
173
- let token = '';
174
- if (!Array.isArray(additional_data)) {
175
- token = additional_data.key;
176
- }
177
- this.sessionService.handleUpdateSession({
178
- user_id: +response.esolve_id,
179
- location_id: +session_data.location_id,
180
- addresses_id: +session_data.addresses_id,
181
- shipping_id: +session_data.shipping_id,
182
- clients_id: +session_data.clients_id,
183
- token,
184
- });
185
- }
186
- return new EsolveRegistrationResult(response);
187
- })), catchError((errorRes) => {
188
- return this.errorHandler.handleHttpPostError('set-registration', errorRes);
189
- }));
190
- }
191
- changePassword(password, confirm_password) {
192
- const body = {
193
- password,
194
- confirm_password,
195
- };
196
- return this.http
197
- .post(`${this.config.api_url}/set-change-password.php`, body, {
198
- headers: {
199
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
200
- },
201
- responseType: 'json',
202
- observe: 'body',
203
- })
204
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
205
- return new EsolveChangePasswordResult(response);
206
- })), catchError((errorRes) => {
207
- return this.errorHandler.handleHttpPostError('set-change-password', errorRes);
208
- }));
209
- }
210
- /**
211
- * Submits the users confirmation key to the relevant backend server in order to
212
- * confirm the accounts validity. The key was emailed to the user hence if he received
213
- * it and enters the value, the email account can be seen as valid.
214
- *
215
- * @param key The key that was emailed to the registered user's email account.
216
- * @returns An `Observable` that contains the result of the account confirmation request.
217
- */
218
- accountConfirmationRequest(key) {
219
- const body = {
220
- key,
221
- };
222
- return this.http
223
- .post(`${this.config.api_url}/set-account-confirmation.php`, body, {
224
- headers: {
225
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
226
- },
227
- responseType: 'json',
228
- observe: 'body',
229
- })
230
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
231
- if (response.auto_login) {
232
- this.sessionService.handleUpdateSession({
233
- user_id: +response.esolve_id,
234
- location_id: +response.location_id,
235
- addresses_id: +response.addresses_id,
236
- shipping_id: +response.shipping_id,
237
- clients_id: +response.clients_id,
238
- });
239
- }
240
- return new EsolveAccountConfirmationResult(response);
241
- })), catchError((errorRes) => {
242
- return this.errorHandler.handleHttpPostError('set-account-confirmation', errorRes);
243
- }));
244
- }
245
- sendForgotPasswordRequest(email, captcha_options) {
246
- let params = new HttpParams({
247
- fromObject: {
248
- email,
249
- },
250
- });
251
- if (captcha_options) {
252
- params = params.set('captcha_key', captcha_options.captcha_key);
253
- params = params.set('captcha_code', captcha_options.captcha_code);
254
- }
255
- return this.http
256
- .get(`${this.config.api_url}/get-forgot-password.php`, {
257
- params,
258
- })
259
- .pipe(map((response) => {
260
- if (response.records === undefined ||
261
- !('reset_link_sent' in response.records)) {
262
- throw response;
263
- }
264
- return response.records.reset_link_sent;
265
- }));
266
- }
267
- resetPassword(reset_key, password, confirm_password, auto_login = true) {
268
- return this.http
269
- .post(`${this.config.api_url}/set-forgot-password.php`, {
270
- reset_key,
271
- password,
272
- confirm_password,
273
- auto_login,
274
- }, {
275
- headers: {
276
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
277
- },
278
- responseType: 'json',
279
- observe: 'body',
280
- })
281
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
282
- if (!response.login_required) {
283
- const session_data = response.session_data;
284
- this.sessionService.handleUpdateSession({
285
- user_id: +response.esolve_id,
286
- location_id: +session_data.location_id,
287
- addresses_id: +session_data.addresses_id,
288
- shipping_id: +session_data.shipping_id,
289
- clients_id: +session_data.clients_id,
290
- });
291
- }
292
- return new EsolveResetPasswordResult(response);
293
- })), catchError((errorRes) => {
294
- return this.errorHandler.handleHttpPostError('set-forgot-password', errorRes);
295
- }));
296
- }
297
- updateLocation(location_id) {
298
- return this.updateUserLocation({ location_id });
299
- }
300
- updateLocationOnErp(erp) {
301
- return this.updateUserLocation({ erp });
302
- }
303
- updateSessionClient(clients_id) {
304
- return this.http
305
- .post(`${this.config.api_url}/set-session-client.php`, {
306
- clients_id,
307
- }, {
308
- headers: {
309
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
310
- },
311
- responseType: 'json',
312
- observe: 'body',
313
- })
314
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
315
- if (typeof response.esolve_id === 'string') {
316
- throw new Error('Invalid response id.');
317
- }
318
- this.sessionService.handleUpdateSession({
319
- clients_id: +response.esolve_id,
320
- });
321
- return new EsolveSessionClientUpdateResult(response);
322
- })));
323
- }
324
- updateSessionAddress(addresses_id) {
325
- return this.http
326
- .post(`${this.config.api_url}/set-session-address.php`, {
327
- addresses_id,
328
- }, {
329
- headers: {
330
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
331
- },
332
- responseType: 'json',
333
- observe: 'body',
334
- })
335
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
336
- if (typeof response.esolve_id === 'string') {
337
- throw new Error('Invalid response id.');
338
- }
339
- this.sessionService.handleUpdateSession({
340
- addresses_id: +response.esolve_id,
341
- });
342
- return new EsolveSessionAddressUpdateResult(response);
343
- })));
344
- }
345
- updateSessionShipping(shipping_id) {
346
- return this.http
347
- .post(`${this.config.api_url}/set-session-shipping.php`, {
348
- shipping_id,
349
- }, {
350
- headers: {
351
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
352
- },
353
- responseType: 'json',
354
- observe: 'body',
355
- })
356
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
357
- if (typeof response.esolve_id === 'string') {
358
- throw new Error('Invalid response id.');
359
- }
360
- this.sessionService.handleUpdateSession({
361
- shipping_id: +response.esolve_id,
362
- });
363
- return new EsolveSessionShippingUpdateResult(response);
364
- })));
365
- }
366
- /**
367
- * @deprecated Use EsolveTransactionsService for future transaction requests
368
- */
369
- getTransactions(options = {}) {
370
- try {
371
- this.loginGuard();
372
- let params = new HttpParams();
373
- params = params.set('user_id', this.user_id);
374
- if (options.type) {
375
- params = params.set('type', options.type);
376
- }
377
- if (options.page) {
378
- params = params.set('page', options.page);
379
- }
380
- if (options.rows) {
381
- params = params.set('rows', options.rows);
382
- }
383
- if (options.from_date) {
384
- params = params.set('from_date', options.from_date);
385
- }
386
- if (options.to_date) {
387
- params = params.set('to_date', options.to_date);
388
- }
389
- if (options.filters) {
390
- let filters = options.filters;
391
- if (!Array.isArray(filters)) {
392
- filters = EsolveFilterFactory.covertFromObj(filters);
393
- }
394
- params = EsolveFilterFactory.convertToHttpParams(filters, params);
395
- }
396
- return this.http
397
- .get(`${this.config.api_url}/get-transactions.php`, {
398
- params,
399
- })
400
- .pipe(map((response) => {
401
- if (response.records === undefined) {
402
- throw response;
403
- }
404
- const items = this.processTransactions(response.records);
405
- const total = +(response.additional_data.total_records ?? 0);
406
- const rows = options.rows ?? total;
407
- const page = options.page || 1;
408
- return new EsolveTransactionList(items, page, rows, total);
409
- }));
410
- }
411
- catch (error) {
412
- return throwError(() => error);
413
- }
414
- }
415
- /**
416
- * @deprecated Use EsolveTransactionsService for future transaction requests
417
- */
418
- getTransaction(id) {
419
- try {
420
- this.loginGuard();
421
- return this.http
422
- .get(`${this.config.api_url}/get-transactions.php`, {
423
- params: {
424
- user_id: this.user_id,
425
- transaction_id: id,
426
- },
427
- })
428
- .pipe(map((response) => {
429
- if (response.records === undefined ||
430
- response.records.length <= 0) {
431
- throw response;
432
- }
433
- const items = this.processTransactions(response.records);
434
- return items[0];
435
- }));
436
- }
437
- catch (error) {
438
- return throwError(() => error);
439
- }
440
- }
441
- getClientAccountBalances() {
442
- try {
443
- this.loginGuard();
444
- return this.http
445
- .get(`${this.config.api_url}/get-client-account-balances.php`)
446
- .pipe(map((response) => {
447
- if (response.records === undefined) {
448
- throw response;
449
- }
450
- return this.processClientBalances(response.records);
451
- }));
452
- }
453
- catch (error) {
454
- return throwError(() => error);
455
- }
456
- }
457
- generateStatementDownloadLink(clients_id) {
458
- try {
459
- this.loginGuard();
460
- if (clients_id <= 0) {
461
- return '';
462
- }
463
- const base_url = `${this.config.api_url}/get-generated-pdf.php`;
464
- const queries = [
465
- {
466
- key: 'ws_id',
467
- value: this.config.wsid,
468
- },
469
- {
470
- key: 'clients_id',
471
- value: clients_id,
472
- },
473
- {
474
- key: 'key',
475
- value: this.sessionService.getToken(),
476
- },
477
- ];
478
- const query_string = queries
479
- .map((query) => `${query.key}=${query.value}`)
480
- .join('&');
481
- return `${base_url}?${query_string}`;
482
- }
483
- catch (error) {
484
- console.error(error);
485
- return '';
486
- }
487
- }
488
- generateClientAssetDownloadLink(clients_id, document_number, modified_date) {
489
- try {
490
- this.loginGuard();
491
- if (clients_id <= 0) {
492
- return '';
493
- }
494
- const base_url = `${this.config.api_url}/get-client-asset-download.php`;
495
- const queries = [
496
- {
497
- key: 'ws_id',
498
- value: this.config.wsid,
499
- },
500
- {
501
- key: 'key',
502
- value: this.sessionService.getToken(),
503
- },
504
- {
505
- key: 'clients_id',
506
- value: clients_id,
507
- },
508
- {
509
- key: 'document_number',
510
- value: document_number,
511
- },
512
- {
513
- key: 'date',
514
- value: modified_date,
515
- },
516
- ];
517
- const query_string = queries
518
- .map((query) => `${query.key}=${query.value}`)
519
- .join('&');
520
- return `${base_url}?${query_string}`;
521
- }
522
- catch (error) {
523
- console.error(error);
524
- return '';
525
- }
526
- }
527
- requestErpDocuments(requested_documents) {
528
- const body = {
529
- requested_documents,
530
- };
531
- return this.http
532
- .post(`${this.config.api_url}/set-request-erp-document.php`, body, {
533
- headers: {
534
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
535
- },
536
- responseType: 'json',
537
- observe: 'body',
538
- })
539
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => new EsolveErpDocumentsRequestResult(response))), catchError((errorRes) => {
540
- return this.errorHandler.handleHttpPostError('set-request-erp-document', errorRes);
541
- }));
542
- }
543
- getErpDocumentRequests(clients_id, type = 'invoice') {
544
- try {
545
- this.loginGuard();
546
- let params = new HttpParams();
547
- params = params.set('clients_id', clients_id);
548
- params = params.set('type', type);
549
- return this.http
550
- .get(`${this.config.api_url}/get-erp-document-request.php`, {
551
- params,
552
- })
553
- .pipe(map((response) => {
554
- if (response.records === undefined) {
555
- throw response;
556
- }
557
- return this.processErpDocumentRequest(response.records);
558
- }));
559
- }
560
- catch (error) {
561
- return throwError(() => error);
562
- }
563
- }
564
- getClientAssets(options) {
565
- try {
566
- this.loginGuard();
567
- let params = new HttpParams();
568
- params = params.set('clients_id', options.clients_id ?? 0);
569
- params = params.set('asset_type', options.asset_type ?? 'quote');
570
- if (options.page) {
571
- params = params.set('page', options.page);
572
- }
573
- if (options.rows) {
574
- params = params.set('rows', options.rows);
575
- }
576
- if (options.sort) {
577
- const sort = options.sort;
578
- if (sort.field) {
579
- params = params = params.set('sort', sort.field);
580
- }
581
- if (sort.order) {
582
- params = params.set('order', sort.order);
583
- }
584
- }
585
- return this.http
586
- .get(`${this.config.api_url}/get-client-assets.php`, {
587
- params,
588
- })
589
- .pipe(map((response) => {
590
- if (response.records === undefined) {
591
- throw response;
592
- }
593
- const items = this.processClientAssets(response.records);
594
- const total = +(response.additional_data.total_records ?? 0);
595
- const rows = options.rows ?? total;
596
- const page = options.page || 1;
597
- return new EsolveClientAssetList(items, page, rows, total);
598
- }));
599
- }
600
- catch (error) {
601
- return throwError(() => error);
602
- }
603
- }
604
- processUserAccount(record) {
605
- if (!record) {
606
- throw new Error('Invalid record');
607
- }
608
- if (+record.userid !== this._user_id) {
609
- throw new Error('Invalid user account retrieved');
610
- }
611
- return new EsolveUserAccount(record);
612
- }
613
- processUserAddress(records) {
614
- const user_addresses = [];
615
- if (!records || this._user_id === 0) {
616
- return user_addresses;
617
- }
618
- for (const record of records) {
619
- if (+record.userid !== this._user_id) {
620
- continue;
621
- }
622
- user_addresses.push(new EsolveAddress(record));
623
- }
624
- return user_addresses;
625
- }
626
- processUserClients(records) {
627
- const user_clients = [];
628
- if (!records || this._user_id === 0) {
629
- return user_clients;
630
- }
631
- for (const record of records) {
632
- user_clients.push(new EsolveUserClientAccount(record));
633
- }
634
- return user_clients;
635
- }
636
- processTransactions(records) {
637
- const transactions = [];
638
- if (records) {
639
- for (const record of records) {
640
- const transaction = new EsolveTransaction(record);
641
- transactions.push(transaction);
642
- }
643
- }
644
- return transactions;
645
- }
646
- processClientBalances(records) {
647
- for (const record of records) {
648
- if (+record.clients_id <= 0) {
649
- return undefined;
650
- }
651
- const cart_totals = new EsolveCartTotals(record.cart_totals);
652
- return new EsolveUserClientAccountBalances(+record.clients_id, record.account, cart_totals, +record.credit_limit, +record.external_account_balance, +record.external_available_balance, +record.new_external_available_balance, !!+record.credit_limit_okay);
653
- }
654
- return undefined;
655
- }
656
- loginGuard() {
657
- if (this.user_id <= 0) {
658
- this.errorHandler.throwError('login_required', 'Login is required');
659
- }
660
- }
661
- updateUserLocation(body) {
662
- return this.http
663
- .post(`${this.config.api_url}/set-session-location.php`, body, {
664
- headers: {
665
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
666
- },
667
- responseType: 'json',
668
- observe: 'body',
669
- })
670
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
671
- if (typeof response.esolve_id === 'string') {
672
- throw new Error('Invalid response id.');
673
- }
674
- this.sessionService.handleUpdateSession({
675
- location_id: +response.esolve_id,
676
- });
677
- return new EsolveLocationUpdateResult(response);
678
- })));
679
- }
680
- processErpDocumentRequest(records) {
681
- const requests = [];
682
- for (const record of records) {
683
- requests.push(new EsolveErpDocumentRequest(record));
684
- }
685
- return requests;
686
- }
687
- processClientAssets(records) {
688
- const assets = [];
689
- for (const record of records) {
690
- assets.push(new EsolveClientAsset(record));
691
- }
692
- return assets;
693
- }
694
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: EsolveAccountService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
695
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: EsolveAccountService, providedIn: 'root' }); }
696
- }
697
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: EsolveAccountService, decorators: [{
698
- type: Injectable,
699
- args: [{
700
- providedIn: 'root',
701
- }]
702
- }], ctorParameters: () => [] });
703
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNvbHZlLWFjY291bnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmctZXNvbHZlLWNvbm5lY3Qvc3JjL2xpYi9hY2NvdW50L2Vzb2x2ZS1hY2NvdW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUNILFVBQVUsRUFFVixVQUFVLEdBQ2IsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQWMsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlDLE9BQU8sRUFDSCx5QkFBeUIsRUFDekIsNEJBQTRCLEVBRzVCLFlBQVksRUFFWixtQkFBbUIsR0FDdEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFvQixpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzNDLE9BQU8sRUFFSCxpQkFBaUIsRUFFakIscUJBQXFCLEdBQ3hCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUdILHdCQUF3QixHQUMzQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDSCxhQUFhLEVBRWIsbUJBQW1CLEVBR25CLGdDQUFnQyxHQUNuQyxNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQ0gsMEJBQTBCLEVBQzFCLHlCQUF5QixHQUc1QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0gsd0JBQXdCLEVBRXhCLGlCQUFpQixFQUdqQix1QkFBdUIsRUFDdkIsK0JBQStCLEVBRS9CLCtC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Q0FBQyxTQUFTO2FBQ25DLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQ0osQ0FDSixDQUNKLENBQUM7SUFDVixDQUFDO0lBRU8seUJBQXlCLENBQzdCLE9BQXlDO1FBRXpDLE1BQU0sUUFBUSxHQUErQixFQUFFLENBQUM7UUFFaEQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVPLG1CQUFtQixDQUN2QixPQUFrQztRQUVsQyxNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDO1FBRXZDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7OEdBcm5DUSxvQkFBb0I7a0hBQXBCLG9CQUFvQixjQUZqQixNQUFNOzsyRkFFVCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEh0dHBDbGllbnQsXG4gICAgSHR0cEVycm9yUmVzcG9uc2UsXG4gICAgSHR0cFBhcmFtcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRXNvbHZlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBFc29sdmVFcnJvckhhbmRsZXJTZXJ2aWNlLFxuICAgIEVzb2x2ZVJlc3BvbnNlSGFuZGxlclNlcnZpY2UsXG4gICAgRXNvbHZlU2V0UmVzcG9uc2UsXG4gICAgRXNvbHZlR2V0UmVzcG9uc2UsXG4gICAgRXNvbHZlUmVzdWx0LFxuICAgIEVzb2x2ZURlbGV0ZVJlc3BvbnNlLFxuICAgIEVzb2x2ZUZpbHRlckZhY3RvcnksXG59IGZyb20gJy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBFc29sdmVBdXRoUmVzdWx0LCBFc29sdmVBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGgnO1xuaW1wb3J0IHsgRXNvbHZlU2Vzc2lvblNlcnZpY2UgfSBmcm9tICcuLi9zZXNzaW9uJztcbmltcG9ydCB7IEVzb2x2ZUNhcnRUb3RhbHMgfSBmcm9tICcuLi9jYXJ0JztcbmltcG9ydCB7XG4gICAgRXNvbHZlVHJhbnNhY3Rpb25SZWNvcmQsXG4gICAgRXNvbHZlVHJhbnNhY3Rpb24sXG4gICAgRXNvbHZlVHJhbnNhY3Rpb25PcHRpb25zLFxuICAgIEVzb2x2ZVRyYW5zYWN0aW9uTGlzdCxcbn0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7XG4gICAgRXNvbHZlUmVnaXN0cmF0aW9uUG9zdFJlc3BvbnNlSXRlbSxcbiAgICBFc29sdmVSZWdpc3RyYXRpb25EYXRhLFxuICAgIEVzb2x2ZVJlZ2lzdHJhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi9yZWdpc3RyYXRpb24nO1xuaW1wb3J0IHtcbiAgICBFc29sdmVBZGRyZXNzLFxuICAgIEVzb2x2ZUFkZHJlc3NSZWNvcmQsXG4gICAgRXNvbHZlQWRkcmVzc1Jlc3VsdCxcbiAgICBFc29sdmVBZGRyZXNzUG9zdERhdGEsXG4gICAgRXNvbHZlQWRkcmVzc1Jlc3BvbnNlLFxuICAgIEVzb2x2ZVNlc3Npb25BZGRyZXNzVXBkYXRlUmVzdWx0LFxufSBmcm9tICcuL2FkZHJlc3MnO1xuaW1wb3J0IHtcbiAgICBFc29sdmVDaGFuZ2VQYXNzd29yZFJlc3VsdCxcbiAgICBFc29sdmVSZXNldFBhc3N3b3JkUmVzdWx0LFxuICAgIEVzb2x2ZUZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gICAgRXNvbHZlRm9yZ290UGFzc3dvcmRHZXRSZXN1bHQsXG59IGZyb20gJy4vcGFzc3dvcmQnO1xuaW1wb3J0IHtcbiAgICBFc29sdmVFcnBEb2N1bWVudFJlcXVlc3QsXG4gICAgRXNvbHZlRXJwRG9jdW1lbnRSZXF1ZXN0UmVjb3JkLFxuICAgIEVzb2x2ZVVzZXJBY2NvdW50LFxuICAgIEVzb2x2ZVVzZXJBY2NvdW50RGF0YSxcbiAgICBFc29sdmVVc2VyQWNjb3VudFJlY29yZCxcbiAgICBFc29sdmVVc2VyQWNjb3VudFJlc3VsdCxcbiAgICBFc29sdmVVc2VyQ2xpZW50QWNjb3VudEJhbGFuY2VzLFxuICAgIEVzb2x2ZVVzZXJDbGllbnRBY2NvdW50QmFsYW5jZXNSZWNvcmQsXG4gICAgRXNvbHZlRXJwRG9jdW1lbnRzUmVxdWVzdFJlc3VsdCxcbiAgICBFc29sdmVVc2VyQ2xpZW50QWNjb3VudCxcbiAgICBFc29sdmVVc2VyQ2xpZW50QWNjb3VudFJlY29yZCxcbiAgICBFc29sdmVDbGllbnRBc3NldFJlY29yZCxcbiAgICBFc29sdmVDbGllbnRBc3NldCxcbiAgICBFc29sdmVDbGllbnRBc3NldHNPcHRpb25zLFxuICAgIEVzb2x2ZUNsaWVudEFzc2V0TGlzdCxcbn0gZnJvbSAnLi91c2VyLWFjY291bnQnO1xuaW1wb3J0IHtcbiAgICBFc29sdmVBY2NvdW50Q29uZmlybWF0aW9uUG9zdFJlc3BvbnNlSXRlbSxcbiAgICBFc29sdmVBY2NvdW50Q29uZmlybWF0aW9uUmVzdWx0LFxufSBmcm9tICcuL2NvbmZpcm1hdGlvbic7XG5pbXBvcnQgeyBFc29sdmVMb2NhdGlvbk9wdGlvbiwgRXNvbHZlTG9jYXRpb25VcGRhdGVSZXN1bHQgfSBmcm9tICcuL2xvY2F0aW9uJztcbmltcG9ydCB7IEVzb2x2ZUNhcHRjaGFPcHRpb25zIH0gZnJvbSAnLi4vY2FwdGNoYSc7XG5cbmltcG9ydCB7IEVzb2x2ZVNlc3Npb25TaGlwcGluZ1VwZGF0ZVJlc3VsdCB9IGZyb20gJy4vZXNvbHZlLXNlc3Npb24tc2hpcHBpbmctdXBkYXRlLXJlc3VsdC5tb2RlbCc7XG5pbXBvcnQgeyBFc29sdmVTZXNzaW9uQ2xpZW50VXBkYXRlUmVzdWx0IH0gZnJvbSAnLi9lc29sdmUtc2Vzc2lvbi1jbGllbnQtdXBkYXRlLXJlc3VsdC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEVzb2x2ZUFjY291bnRTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZyA9IGluamVjdChFc29sdmVDb25maWdTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uU2VydmljZSA9IGluamVjdChFc29sdmVTZXNzaW9uU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlcnJvckhhbmRsZXIgPSBpbmplY3QoRXNvbHZlRXJyb3JIYW5kbGVyU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNwb25zZUhhbmRsZXIgPSBpbmplY3QoRXNvbHZlUmVzcG9uc2VIYW5kbGVyU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoU2VydmljZSA9IGluamVjdChFc29sdmVBdXRoU2VydmljZSk7XG5cbiAgICBwcml2YXRlIF91c2VyX2lkID0gMDtcblxuICAgIHB1YmxpYyBnZXQgdXNlcl9pZCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlcl9pZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHVzZXJfaWQodmFsdWU6IG51bWJlcikge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlID4gMCA/IHZhbHVlIDogMDtcblxuICAgICAgICBpZiAodGhpcy5fdXNlcl9pZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJfaWQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldFNlc3Npb24oKS5zdWJzY3JpYmUoKHNlc3Npb24pID0+IHtcbiAgICAgICAgICAgIGlmIChzZXNzaW9uLnRva2VuICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlcl9pZCA9IHNlc3Npb24udXNlcl9pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVVzZXJBY2NvdW50KFxuICAgICAgICB1c2VyX2FjY291bnRfZGF0YTogRXNvbHZlVXNlckFjY291bnREYXRhLFxuICAgICk6IE9ic2VydmFibGU8RXNvbHZlVXNlckFjY291bnRSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IHtcbiAgICAgICAgICAgIGFjY291bnQ6IHVzZXJfYWNjb3VudF9kYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wb3N0PEVzb2x2ZVNldFJlc3BvbnNlPihcbiAgICAgICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy5hcGlfdXJsfS9zZXQtdXNlci1hY2NvdW50LnBocGAsXG4gICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtODsnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGh0dHBfcmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VIYW5kbGVyLnZhbGlkYXRlU2luZ2xlSHR0cFJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4gbmV3IEVzb2x2ZVVzZXJBY2NvdW50UmVzdWx0KHJlc3BvbnNlKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yUmVzOiBIdHRwRXJyb3JSZXNwb25zZSB8IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlSHR0cFBvc3RFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZXQtdXNlci1hY2NvdW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yUmVzLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VXNlckFjY291bnQoKTogT2JzZXJ2YWJsZTxFc29sdmVVc2VyQWNjb3VudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAuZ2V0PFxuICAgICAgICAgICAgICAgIEVzb2x2ZUdldFJlc3BvbnNlPEVzb2x2ZVVzZXJBY2NvdW50UmVjb3JkW10+XG4gICAgICAgICAgICA+KGAke3RoaXMuY29uZmlnLmFwaV91cmx9L2dldC1hY2NvdW50LnBocGApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlY29yZHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVjb3Jkcy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IHJlc3BvbnNlLnJlY29yZHNbMF07XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1VzZXJBY2NvdW50KHJlY29yZCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVVc2VyQWNjb3VudCgpOiBPYnNlcnZhYmxlPEVzb2x2ZVJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAuZGVsZXRlPEVzb2x2ZURlbGV0ZVJlc3BvbnNlPihcbiAgICAgICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy5hcGlfdXJsfS9kZWxldGUtYWNjb3VudC5waHBgLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmU6ICdib2R5JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChodHRwX3Jlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfcmVzcG9uc2UucmVzdWx0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfcmVzcG9uc2UucmVzdWx0ID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwX3Jlc3BvbnNlLnJlc3VsdC5zdGF0dXMgIT09ICdzdWNjZXNzJ1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGh0dHBfcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmhhbmRsZUV4dGVybmFsQXV0aGVudGljYXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwX3Jlc3BvbnNlLmFkZGl0aW9uYWxfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVzb2x2ZVJlc3VsdChcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfcmVzcG9uc2UucmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfcmVzcG9uc2UucmVzdWx0LmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwX3Jlc3BvbnNlLnJlc3VsdC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yUmVzOiBIdHRwRXJyb3JSZXNwb25zZSB8IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlSHR0cERlbGV0ZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2RlbGV0ZS1hY2NvdW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yUmVzLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWRkcmVzcyhcbiAgICAgICAgYWRkcmVzc19wb3N0X2RhdGE6IEVzb2x2ZUFkZHJlc3NQb3N0RGF0YSxcbiAgICApOiBPYnNlcnZhYmxlPEVzb2x2ZUFkZHJlc3NSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3NfcG9zdF9kYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wb3N0PEVzb2x2ZVNldFJlc3BvbnNlPEVzb2x2ZUFkZHJlc3NSZXNwb25zZT4+KFxuICAgICAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLmFwaV91cmx9L3NldC1hZGRyZXNzLnBocGAsXG4gICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtODsnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGh0dHBfcmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VIYW5kbGVyLnZhbGlkYXRlU2luZ2xlSHR0cFJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4gbmV3IEVzb2x2ZUFkZHJlc3NSZXN1bHQocmVzcG9uc2UpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXM6IEh0dHBFcnJvclJlc3BvbnNlIHwgYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVIdHRwUG9zdEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NldC1hZGRyZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yUmVzLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWRkcmVzc2VzKCk6IE9ic2VydmFibGU8RXNvbHZlQWRkcmVzc1tdPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luR3VhcmQoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAgICAgICAgIC5nZXQ8RXNvbHZlR2V0UmVzcG9uc2U8RXNvbHZlQWRkcmVzc1JlY29yZFtdPj4oXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLmFwaV91cmx9L2dldC1hZGRyZXNzZXMucGhwYCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IHVzZXJfaWQ6IHRoaXMudXNlcl9pZCB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlY29yZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzVXNlckFkZHJlc3MocmVzcG9uc2UucmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2xpZW50cygpOiBPYnNlcnZhYmxlPEVzb2x2ZVVzZXJDbGllbnRBY2NvdW50W10+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubG9naW5HdWFyZCgpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAgICAgLmdldDxcbiAgICAgICAgICAgICAgICAgICAgRXNvbHZlR2V0UmVzcG9uc2U8RXNvbHZlVXNlckNsaWVudEFjY291bnRSZWNvcmRbXT5cbiAgICAgICAgICAgICAgICA+KGAke3RoaXMuY29uZmlnLmFwaV91cmx9L2dldC11c2VyLWNsaWVudHMucGhwYClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlY29yZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzVXNlckNsaWVudHMocmVzcG9uc2UucmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlQWRkcmVzcyhpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxFc29sdmVSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAgICAgLmRlbGV0ZTxFc29sdmVEZWxldGVSZXNwb25zZT4oXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5jb25maWcuYXBpX3VybH0vZGVsZXRlLWFkZHJlc3MucGhwYCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBpZCB9LFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGh0dHBfcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZS5yZXN1bHQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZS5yZXN1bHQgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfcmVzcG9uc2UucmVzdWx0LnN0YXR1cyAhPT0gJ3N1Y2Nlc3MnXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaHR0cF9yZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXNvbHZlUmVzdWx0KFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZS5yZXN1bHQuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZS5yZXN1bHQuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfcmVzcG9uc2UucmVzdWx0Lm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXM6IEh0dHBFcnJvclJlc3BvbnNlIHwgYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVIdHRwRGVsZXRlRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGVsZXRlLWFkZHJlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JSZXMsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlcihcbiAgICAgICAgdXNlcl9yZWdpc3RyYXRpb246IEVzb2x2ZVJlZ2lzdHJhdGlvbkRhdGEsXG4gICAgICAgIGd1ZXN0ID0gZmFsc2UsXG4gICAgKTogT2JzZXJ2YWJsZTxFc29sdmVSZWdpc3RyYXRpb25SZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IHtcbiAgICAgICAgICAgIHVzZXI6IHVzZXJfcmVnaXN0cmF0aW9uLFxuICAgICAgICAgICAgZ3Vlc3RfcmVnaXN0cmF0aW9uOiBndWVzdCxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAucG9zdDxcbiAgICAgICAgICAgICAgICBFc29sdmVTZXRSZXNwb25zZTxcbiAgICAgICAgICAgICAgICAgICAgRXNvbHZlUmVnaXN0cmF0aW9uUG9zdFJlc3BvbnNlSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgRXNvbHZlQXV0aFJlc3VsdFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgID4oYCR7dGhpcy5jb25maWcuYXBpX3VybH0vc2V0LXJlZ2lzdHJhdGlvbi5waHBgLCBib2R5LCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtODsnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgoaHR0cF9yZXNwb25zZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZUhhbmRsZXIudmFsaWRhdGVTaW5nbGVIdHRwUmVzcG9uc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwX3Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlLCBhZGRpdGlvbmFsX2RhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuYXV0b19sb2dpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uX2RhdGEgPSByZXNwb25zZS5zZXNzaW9uX2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2tlbiA9ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhZGRpdGlvbmFsX2RhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGFkZGl0aW9uYWxfZGF0YS5rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLmhhbmRsZVVwZGF0ZVNlc3Npb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9pZDogK3Jlc3BvbnNlLmVzb2x2ZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2lkOiArc2Vzc2lvbl9kYXRhLmxvY2F0aW9uX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzX2lkOiArc2Vzc2lvbl9kYXRhLmFkZHJlc3Nlc19pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nX2lkOiArc2Vzc2lvbl9kYXRhLnNoaXBwaW5nX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50c19pZDogK3Nlc3Npb25fZGF0YS5jbGllbnRzX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXNvbHZlUmVnaXN0cmF0aW9uUmVzdWx0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlczogSHR0cEVycm9yUmVzcG9uc2UgfCBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUh0dHBQb3N0RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2V0LXJlZ2lzdHJhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclJlcyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZVBhc3N3b3JkKFxuICAgICAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgICAgICBjb25maXJtX3Bhc3N3b3JkOiBzdHJpbmcsXG4gICAgKTogT2JzZXJ2YWJsZTxFc29sdmVDaGFuZ2VQYXNzd29yZFJlc3VsdD4ge1xuICAgICAgICBjb25zdCBib2R5ID0ge1xuICAgICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgICBjb25maXJtX3Bhc3N3b3JkLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wb3N0PEVzb2x2ZVNldFJlc3BvbnNlPihcbiAgICAgICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy5hcGlfdXJsfS9zZXQtY2hhbmdlLXBhc3N3b3JkLnBocGAsXG4gICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtODsnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGh0dHBfcmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VIYW5kbGVyLnZhbGlkYXRlU2luZ2xlSHR0cFJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXNvbHZlQ2hhbmdlUGFzc3dvcmRSZXN1bHQocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yUmVzOiBIdHRwRXJyb3JSZXNwb25zZSB8IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlSHR0cFBvc3RFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZXQtY2hhbmdlLXBhc3N3b3JkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yUmVzLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJtaXRzIHRoZSB1c2VycyBjb25maXJtYXRpb24ga2V5IHRvIHRoZSByZWxldmFudCBiYWNrZW5kIHNlcnZlciBpbiBvcmRlciB0b1xuICAgICAqIGNvbmZpcm0gdGhlIGFjY291bnRzIHZhbGlkaXR5LiBUaGUga2V5IHdhcyBlbWFpbGVkIHRvIHRoZSB1c2VyIGhlbmNlIGlmIGhlIHJlY2VpdmVkXG4gICAgICogaXQgYW5kIGVudGVycyB0aGUgdmFsdWUsIHRoZSBlbWFpbCBhY2NvdW50IGNhbiBiZSBzZWVuIGFzIHZhbGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRoYXQgd2FzIGVtYWlsZWQgdG8gdGhlIHJlZ2lzdGVyZWQgdXNlcidzIGVtYWlsIGFjY291bnQuXG4gICAgICogQHJldHVybnMgQW4gYE9ic2VydmFibGVgIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgYWNjb3VudCBjb25maXJtYXRpb24gcmVxdWVzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWNjb3VudENvbmZpcm1hdGlvblJlcXVlc3QoXG4gICAgICAgIGtleTogc3RyaW5nLFxuICAgICk6IE9ic2VydmFibGU8RXNvbHZlQWNjb3VudENvbmZpcm1hdGlvblJlc3VsdD4ge1xuICAgICAgICBjb25zdCBib2R5ID0ge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wb3N0PEVzb2x2ZVNldFJlc3BvbnNlPEVzb2x2ZUFjY291bnRDb25maXJtYXRpb25Qb3N0UmVzcG9uc2VJdGVtPj4oXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5jb25maWcuYXBpX3VybH0vc2V0LWFjY291bnQtY29uZmlybWF0aW9uLnBocGAsXG4gICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtODsnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGh0dHBfcmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VIYW5kbGVyLnZhbGlkYXRlU2luZ2xlSHR0cFJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5hdXRvX2xvZ2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UuaGFuZGxlVXBkYXRlU2Vzc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2lkOiArcmVzcG9uc2UuZXNvbHZlX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25faWQ6ICtyZXNwb25zZS5sb2NhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nlc19pZDogK3Jlc3BvbnNlLmFkZHJlc3Nlc19pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nX2lkOiArcmVzcG9uc2Uuc2hpcHBpbmdfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzX2lkOiArcmVzcG9uc2UuY2xpZW50c19pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFc29sdmVBY2NvdW50Q29uZmlybWF0aW9uUmVzdWx0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yUmVzOiBIdHRwRXJyb3JSZXNwb25zZSB8IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlSHR0cFBvc3RFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZXQtYWNjb3VudC1jb25maXJtYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JSZXMsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kRm9yZ290UGFzc3dvcmRSZXF1ZXN0KFxuICAgICAgICBlbWFpbDogc3RyaW5nLFxuICAgICAgICBjYXB0Y2hhX29wdGlvbnM/OiBFc29sdmVDYXB0Y2hhT3B0aW9ucyxcbiAgICApOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgICAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjYXB0Y2hhX29wdGlvbnMpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NhcHRjaGFfa2V5JywgY2FwdGNoYV9vcHRpb25zLmNhcHRjaGFfa2V5KTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NhcHRjaGFfY29kZScsIGNhcHRjaGFfb3B0aW9ucy5jYXB0Y2hhX2NvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAgICAgLmdldDxFc29sdmVHZXRSZXNwb25zZTxFc29sdmVGb3Jnb3RQYXNzd29yZEdldFJlc3VsdD4+KFxuICAgICAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLmFwaV91cmx9L2dldC1mb3Jnb3QtcGFzc3dvcmQucGhwYCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZWNvcmRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICEoJ3Jlc2V0X2xpbmtfc2VudCcgaW4gcmVzcG9uc2UucmVjb3JkcylcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5yZWNvcmRzLnJlc2V0X2xpbmtfc2VudDtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0UGFzc3dvcmQoXG4gICAgICAgIHJlc2V0X2tleTogc3RyaW5nLFxuICAgICAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgICAgICBjb25maXJtX3Bhc3N3b3JkOiBzdHJpbmcsXG4gICAgICAgIGF1dG9fbG9naW4gPSB0cnVlLFxuICAgICk6IE9ic2VydmFibGU8RXNvbHZlUmVzZXRQYXNzd29yZFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAucG9zdDxFc29sdmVTZXRSZXNwb25zZTxFc29sdmVGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPj4oXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5jb25maWcuYXBpX3VybH0vc2V0LWZvcmdvdC1wYXNzd29yZC5waHBgLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzZXRfa2V5LFxuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybV9wYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b19sb2dpbixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04OycsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlOiAnYm9keScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgoaHR0cF9yZXNwb25zZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZUhhbmRsZXIudmFsaWRhdGVTaW5nbGVIdHRwUmVzcG9uc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwX3Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5sb2dpbl9yZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uX2RhdGEgPSByZXNwb25zZS5zZXNzaW9uX2RhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5oYW5kbGVVcGRhdGVTZXNzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfaWQ6ICtyZXNwb25zZS5lc29sdmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9pZDogK3Nlc3Npb25fZGF0YS5sb2NhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nlc19pZDogK3Nlc3Npb25fZGF0YS5hZGRyZXNzZXNfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ19pZDogK3Nlc3Npb25fZGF0YS5zaGlwcGluZ19pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHNfaWQ6ICtzZXNzaW9uX2RhdGEuY2xpZW50c19pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFc29sdmVSZXNldFBhc3N3b3JkUmVzdWx0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlczogSHR0cEVycm9yUmVzcG9uc2UgfCBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUh0dHBQb3N0RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2V0LWZvcmdvdC1wYXNzd29yZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclJlcyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUxvY2F0aW9uKFxuICAgICAgICBsb2NhdGlvbl9pZDogbnVtYmVyLFxuICAgICk6IE9ic2VydmFibGU8RXNvbHZlTG9jYXRpb25VcGRhdGVSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlVXNlckxvY2F0aW9uKHsgbG9jYXRpb25faWQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUxvY2F0aW9uT25FcnAoXG4gICAgICAgIGVycDogc3RyaW5nLFxuICAgICk6IE9ic2VydmFibGU8RXNvbHZlTG9jYXRpb25VcGRhdGVSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlVXNlckxvY2F0aW9uKHsgZXJwIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVTZXNzaW9uQ2xpZW50KFxuICAgICAgICBjbGllbnRzX2lkOiBudW1iZXIsXG4gICAgKTogT2JzZXJ2YWJsZTxFc29sdmVTZXNzaW9uQ2xpZW50VXBkYXRlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wb3N0PEVzb2x2ZVNldFJlc3BvbnNlPihcbiAgICAgICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy5hcGlfdXJsfS9zZXQtc2Vzc2lvbi1jbGllbnQucGhwYCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWVudHNfaWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtODsnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGh0dHBfcmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VIYW5kbGVyLnZhbGlkYXRlU2luZ2xlSHR0cFJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZXNvbHZlX2lkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVzcG9uc2UgaWQuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5oYW5kbGVVcGRhdGVTZXNzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50c19pZDogK3Jlc3BvbnNlLmVzb2x2ZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXNvbHZlU2Vzc2lvbkNsaWVudFVwZGF0ZVJlc3VsdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVNlc3Npb25BZGRyZXNzKFxuICAgICAgICBhZGRyZXNzZXNfaWQ6IG51bWJlcixcbiAgICApOiBPYnNlcnZhYmxlPEVzb2x2ZVNlc3Npb25BZGRyZXNzVXBkYXRlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wb3N0PEVzb2x2ZVNldFJlc3BvbnNlPihcbiAgICAgICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy5hcGlfdXJsfS9zZXQtc2Vzc2lvbi1hZGRyZXNzLnBocGAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZXNfaWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtODsnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGh0dHBfcmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VIYW5kbGVyLnZhbGlkYXRlU2luZ2xlSHR0cFJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZXNvbHZlX2lkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVzcG9uc2UgaWQuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5oYW5kbGVVcGRhdGVTZXNzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzX2lkOiArcmVzcG9uc2UuZXNvbHZlX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFc29sdmVTZXNzaW9uQWRkcmVzc1VwZGF0ZVJlc3VsdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVNlc3Npb25TaGlwcGluZyhcbiAgICAgICAgc2hpcHBpbmdfaWQ6IG51bWJlcixcbiAgICApOiBPYnNlcnZhYmxlPEVzb2x2ZVNlc3Npb25TaGlwcGluZ1VwZGF0ZVJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAucG9zdDxFc29sdmVTZXRSZXNwb25zZT4oXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5jb25maWcuYXBpX3VybH0vc2V0LXNlc3Npb24tc2hpcHBpbmcucGhwYCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nX2lkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTg7JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmU6ICdib2R5JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChodHRwX3Jlc3BvbnNlKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlSGFuZGxlci52YWxpZGF0ZVNpbmdsZUh0dHBSZXNwb25zZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlLmVzb2x2ZV9pZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGlkLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UuaGFuZGxlVXBkYXRlU2Vzc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nX2lkOiArcmVzcG9uc2UuZXNvbHZlX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFc29sdmVTZXNzaW9uU2hpcHBpbmdVcGRhdGVSZXN1bHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBFc29sdmVUcmFuc2FjdGlvbnNTZXJ2aWNlIGZvciBmdXR1cmUgdHJhbnNhY3Rpb24gcmVxdWVzdHNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VHJhbnNhY3Rpb25zKFxuICAgICAgICBvcHRpb25zOiBFc29sdmVUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSxcbiAgICApOiBPYnNlcnZhYmxlPEVzb2x2ZVRyYW5zYWN0aW9uTGlzdD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5sb2dpbkd1YXJkKCk7XG5cbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCd1c2VyX2lkJywgdGhpcy51c2VyX2lkKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3R5cGUnLCBvcHRpb25zLnR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wYWdlKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncGFnZScsIG9wdGlvbnMucGFnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJvd3MpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdyb3dzJywgb3B0aW9ucy5yb3dzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZnJvbV9kYXRlKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnZnJvbV9kYXRlJywgb3B0aW9ucy5mcm9tX2RhdGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50b19kYXRlKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgndG9fZGF0ZScsIG9wdGlvbnMudG9fZGF0ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVycyA9IG9wdGlvbnMuZmlsdGVycztcblxuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gRXNvbHZlRmlsdGVyRmFjdG9yeS5jb3ZlcnRGcm9tT2JqKGZpbHRlcnMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcmFtcyA9IEVzb2x2ZUZpbHRlckZhY3RvcnkuY29udmVydFRvSHR0cFBhcmFtcyhcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgICAgICAuZ2V0PEVzb2x2ZUdldFJlc3BvbnNlPEVzb2x2ZVRyYW5zYWN0aW9uUmVjb3JkW10+PihcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jb25maWcuYXBpX3VybH0vZ2V0LXRyYW5zYWN0aW9ucy5waHBgLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UucmVjb3JkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5wcm9jZXNzVHJhbnNhY3Rpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWwgPSArKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZGl0aW9uYWxfZGF0YS50b3RhbF9yZWNvcmRzID8/IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dzID0gb3B0aW9ucy5yb3dzID8/IHRvdGFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IG9wdGlvbnMucGFnZSB8fCAxO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVzb2x2ZVRyYW5zYWN0aW9uTGlzdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIEVzb2x2ZVRyYW5zYWN0aW9uc1NlcnZpY2UgZm9yIGZ1dHVyZSB0cmFuc2FjdGlvbiByZXF1ZXN0c1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUcmFuc2FjdGlvbihpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxFc29sdmVUcmFuc2FjdGlvbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5sb2dpbkd1YXJkKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgICAgICAuZ2V0PEVzb2x2ZUdldFJlc3BvbnNlPEVzb2x2ZVRyYW5zYWN0aW9uUmVjb3JkW10+PihcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jb25maWcuYXBpX3VybH0vZ2V0LXRyYW5zYWN0aW9ucy5waHBgLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2lkOiB0aGlzLnVzZXJfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25faWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZWNvcmRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZWNvcmRzLmxlbmd0aCA8PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLnByb2Nlc3NUcmFuc2FjdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDbGllbnRBY2NvdW50QmFsYW5jZXMoKTogT2JzZXJ2YWJsZTxcbiAgICAgICAgRXNvbHZlVXNlckNsaWVudEFjY291bnRCYWxhbmNlcyB8IHVuZGVmaW5lZFxuICAgID4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5sb2dpbkd1YXJkKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgICAgICAuZ2V0PFxuICAgICAgICAgICAgICAgICAgICBFc29sdmVHZXRSZXNwb25zZTxFc29sdmVVc2VyQ2xpZW50QWNjb3VudEJhbGFuY2VzUmVjb3JkW10+XG4gICAgICAgICAgICAgICAgPihgJHt0aGlzLmNvbmZpZy5hcGlfdXJsfS9nZXQtY2xpZW50LWFjY291bnQtYmFsYW5jZXMucGhwYClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlY29yZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQ2xpZW50QmFsYW5jZXMocmVzcG9uc2UucmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVTdGF0ZW1lbnREb3dubG9hZExpbmsoY2xpZW50c19pZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubG9naW5HdWFyZCgpO1xuXG4gICAgICAgICAgICBpZiAoY2xpZW50c19pZCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBiYXNlX3VybCA9IGAke3RoaXMuY29uZmlnLmFwaV91cmx9L2dldC1nZW5lcmF0ZWQtcGRmLnBocGA7XG4gICAgICAgICAgICBjb25zdCBxdWVyaWVzID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiAnd3NfaWQnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jb25maWcud3NpZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiAnY2xpZW50c19pZCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjbGllbnRzX2lkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdrZXknLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5zZXNzaW9uU2VydmljZS5nZXRUb2tlbigpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBjb25zdCBxdWVyeV9zdHJpbmcgPSBxdWVyaWVzXG4gICAgICAgICAgICAgICAgLm1hcCgocXVlcnkpID0+IGAke3F1ZXJ5LmtleX09JHtxdWVyeS52YWx1ZX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCcmJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBgJHtiYXNlX3VybH0/JHtxdWVyeV9zdHJpbmd9YDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVDbGllbnRBc3NldERvd25sb2FkTGluayhcbiAgICAgICAgY2xpZW50c19pZDogbnVtYmVyLFxuICAgICAgICBkb2N1bWVudF9udW1iZXI6IHN0cmluZyxcbiAgICAgICAgbW9kaWZpZWRfZGF0ZTogc3RyaW5nLFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luR3VhcmQoKTtcblxuICAgICAgICAgICAgaWYgKGNsaWVudHNfaWQgPD0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYmFzZV91cmwgPSBgJHt0aGlzLmNvbmZpZy5hcGlfdXJsfS9nZXQtY2xpZW50LWFzc2V0LWRvd25sb2FkLnBocGA7XG4gICAgICAgICAgICBjb25zdCBxdWVyaWVzID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiAnd3NfaWQnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jb25maWcud3NpZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiAna2V5JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0VG9rZW4oKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiAnY2xpZW50c19pZCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjbGllbnRzX2lkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdkb2N1bWVudF9udW1iZXInLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZG9jdW1lbnRfbnVtYmVyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdkYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1vZGlmaWVkX2RhdGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5X3N0cmluZyA9IHF1ZXJpZXNcbiAgICAgICAgICAgICAgICAubWFwKChxdWVyeSkgPT4gYCR7cXVlcnkua2V5fT0ke3F1ZXJ5LnZhbHVlfWApXG4gICAgICAgICAgICAgICAgLmpvaW4oJyYnKTtcblxuICAgICAgICAgICAgcmV0dXJuIGAke2Jhc2VfdXJsfT8ke3F1ZXJ5X3N0cmluZ31gO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXF1ZXN0RXJwRG9jdW1lbnRzKFxuICAgICAgICByZXF1ZXN0ZWRfZG9jdW1lbnRzOiBFc29sdmVFcnBEb2N1bWVudFJlcXVlc3RbXSxcbiAgICApOiBPYnNlcnZhYmxlPEVzb2x2ZUVycERvY3VtZW50c1JlcXVlc3RSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IHtcbiAgICAgICAgICAgIHJlcXVlc3RlZF9kb2N1bWVudHMsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAgICAgLnBvc3Q8RXNvbHZlU2V0UmVzcG9uc2U+KFxuICAgICAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLmFwaV91cmx9L3NldC1yZXF1ZXN0LWVycC1kb2N1bWVudC5waHBgLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTg7JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmU6ICdib2R5JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChodHRwX3Jlc3BvbnNlKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlSGFuZGxlci52YWxpZGF0ZVNpbmdsZUh0dHBSZXNwb25zZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVzb2x2ZUVycERvY3VtZW50c1JlcXVlc3RSZXN1bHQocmVzcG9uc2UpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXM6IEh0dHBFcnJvclJlc3BvbnNlIHwgYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVIdHRwUG9zdEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NldC1yZXF1ZXN0LWVycC1kb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclJlcyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVycERvY3VtZW50UmVxdWVzdHMoXG4gICAgICAgIGNsaWVudHNfaWQ6IG51bWJlcixcbiAgICAgICAgdHlwZSA9ICdpbnZvaWNlJyxcbiAgICApOiBPYnNlcnZhYmxlPEVzb2x2ZUVycERvY3VtZW50UmVxdWVzdFtdPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luR3VhcmQoKTtcblxuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG5cbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NsaWVudHNfaWQnLCBjbGllbnRzX2lkKTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3R5cGUnLCB0eXBlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAgICAgICAgIC5nZXQ8RXNvbHZlR2V0UmVzcG9uc2U8RXNvbHZlRXJwRG9jdW1lbnRSZXF1ZXN0UmVjb3JkW10+PihcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jb25maWcuYXBpX3VybH0vZ2V0LWVycC1kb2N1bWVudC1yZXF1ZXN0LnBocGAsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZWNvcmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0VycERvY3VtZW50UmVxdWVzdChyZXNwb25zZS5yZWNvcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDbGllbnRBc3NldHMoXG4gICAgICAgIG9wdGlvbnM6IEVzb2x2ZUNsaWVudEFzc2V0c09wdGlvbnMsXG4gICAgKTogT2JzZXJ2YWJsZTxFc29sdmVDbGllbnRBc3NldExpc3Q+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubG9naW5HdWFyZCgpO1xuXG4gICAgICAgICAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcblxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnY2xpZW50c19pZCcsIG9wdGlvbnMuY2xpZW50c19pZCA/PyAwKTtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2Fzc2V0X3R5cGUnLCBvcHRpb25zLmFzc2V0X3R5cGUgPz8gJ3F1b3RlJyk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnBhZ2UpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwYWdlJywgb3B0aW9ucy5wYWdlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucm93cykge1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3Jvd3MnLCBvcHRpb25zLnJvd3MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydCA9IG9wdGlvbnMuc29ydDtcblxuICAgICAgICAgICAgICAgIGlmIChzb3J0LmZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3NvcnQnLCBzb3J0LmZpZWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc29ydC5vcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdvcmRlcicsIHNvcnQub3JkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAgICAgICAgIC5nZXQ8RXNvbHZlR2V0UmVzcG9uc2U8RXNvbHZlQ2xpZW50QXNzZXRSZWNvcmRbXT4+KFxuICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy5hcGlfdXJsfS9nZXQtY2xpZW50LWFzc2V0cy5waHBgLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UucmVjb3JkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5wcm9jZXNzQ2xpZW50QXNzZXRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3RhbCA9ICsoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkaXRpb25hbF9kYXRhLnRvdGFsX3JlY29yZHMgPz8gMFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSBvcHRpb25zLnJvd3MgPz8gdG90YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucy5wYWdlIHx8IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXNvbHZlQ2xpZW50QXNzZXRMaXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NVc2VyQWNjb3VudChcbiAgICAgICAgcmVjb3JkOiBFc29sdmVVc2VyQWNjb3VudFJlY29yZCxcbiAgICApOiBFc29sdmVVc2VyQWNjb3VudCB7XG4gICAgICAgIGlmICghcmVjb3JkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVjb3JkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoK3JlY29yZC51c2VyaWQgIT09IHRoaXMuX3VzZXJfaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGFjY291bnQgcmV0cmlldmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEVzb2x2ZVVzZXJBY2NvdW50KHJlY29yZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzVXNlckFkZHJlc3MoXG4gICAgICAgIHJlY29yZHM6IEVzb2x2ZUFkZHJlc3NSZWNvcmRbXSxcbiAgICApOiBFc29sdmVBZGRyZXNzW10ge1xuICAgICAgICBjb25zdCB1c2VyX2FkZHJlc3NlczogRXNvbHZlQWRkcmVzc1tdID0gW107XG5cbiAgICAgICAgaWYgKCFyZWNvcmRzIHx8IHRoaXMuX3VzZXJfaWQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB1c2VyX2FkZHJlc3NlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgICAgIGlmICgrcmVjb3JkLnVzZXJpZCAhPT0gdGhpcy5fdXNlcl9pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1c2VyX2FkZHJlc3Nlcy5wdXNoKG5ldyBFc29sdmVBZGRyZXNzKHJlY29yZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVzZXJfYWRkcmVzc2VzO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1VzZXJDbGllbnRzKFxuICAgICAgICByZWNvcmRzOiBFc29sdmVVc2VyQ2xpZW50QWNjb3VudFJlY29yZFtdLFxuICAgICk6IEVzb2x2ZVVzZXJDbGllbnRBY2NvdW50W10ge1xuICAgICAgICBjb25zdCB1c2VyX2NsaWVudHM6IEVzb2x2ZVVzZXJDbGllbnRBY2NvdW50W10gPSBbXTtcblxuICAgICAgICBpZiAoIXJlY29yZHMgfHwgdGhpcy5fdXNlcl9pZCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVzZXJfY2xpZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgICAgIHVzZXJfY2xpZW50cy5wdXNoKG5ldyBFc29sdmVVc2VyQ2xpZW50QWNjb3VudChyZWNvcmQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1c2VyX2NsaWVudHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzVHJhbnNhY3Rpb25zKFxuICAgICAgICByZWNvcmRzOiBFc29sdmVUcmFuc2FjdGlvblJlY29yZFtdLFxuICAgICk6IEVzb2x2ZVRyYW5zYWN0aW9uW10ge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbnM6IEVzb2x2ZVRyYW5zYWN0aW9uW10gPSBbXTtcblxuICAgICAgICBpZiAocmVjb3Jkcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEVzb2x2ZVRyYW5zYWN0aW9uKHJlY29yZCk7XG5cbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25zO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc0NsaWVudEJhbGFuY2VzKFxuICAgICAgICByZWNvcmRzOiBFc29sdmVVc2VyQ2xpZW50QWNjb3VudEJhbGFuY2VzUmVjb3JkW10sXG4gICAgKTogRXNvbHZlVXNlckNsaWVudEFjY291bnRCYWxhbmNlcyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgICAgIGlmICgrcmVjb3JkLmNsaWVudHNfaWQgPD0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNhcnRfdG90YWxzID0gbmV3IEVzb2x2ZUNhcnRUb3RhbHMocmVjb3JkLmNhcnRfdG90YWxzKTtcblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFc29sdmVVc2VyQ2xpZW50QWNjb3VudEJhbGFuY2VzKFxuICAgICAgICAgICAgICAgICtyZWNvcmQuY2xpZW50c19pZCxcbiAgICAgICAgICAgICAgICByZWNvcmQuYWNjb3VudCxcbiAgICAgICAgICAgICAgICBjYXJ0X3RvdGFscyxcbiAgICAgICAgICAgICAgICArcmVjb3JkLmNyZWRpdF9saW1pdCxcbiAgICAgICAgICAgICAgICArcmVjb3JkLmV4dGVybmFsX2FjY291bnRfYmFsYW5jZSxcbiAgICAgICAgICAgICAgICArcmVjb3JkLmV4dGVybmFsX2F2YWlsYWJsZV9iYWxhbmNlLFxuICAgICAgICAgICAgICAgICtyZWNvcmQubmV3X2V4dGVybmFsX2F2YWlsYWJsZV9iYWxhbmNlLFxuICAgICAgICAgICAgICAgICEhK3JlY29yZC5jcmVkaXRfbGltaXRfb2theSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9naW5HdWFyZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudXNlcl9pZCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci50aHJvd0Vycm9yKCdsb2dpbl9yZXF1aXJlZCcsICdMb2dpbiBpcyByZXF1aXJlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVVc2VyTG9jYXRpb24oXG4gICAgICAgIGJvZHk6IEVzb2x2ZUxvY2F0aW9uT3B0aW9uLFxuICAgICk6IE9ic2VydmFibGU8RXNvbHZlTG9jYXRpb25VcGRhdGVSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAgICAgLnBvc3Q8RXNvbHZlU2V0UmVzcG9uc2U+KFxuICAgICAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLmFwaV91cmx9L3NldC1zZXNzaW9uLWxvY2F0aW9uLnBocGAsXG4gICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtODsnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGh0dHBfcmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VIYW5kbGVyLnZhbGlkYXRlU2luZ2xlSHR0cFJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZXNvbHZlX2lkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVzcG9uc2UgaWQuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5oYW5kbGVVcGRhdGVTZXNzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25faWQ6ICtyZXNwb25zZS5lc29sdmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVzb2x2ZUxvY2F0aW9uVXBkYXRlUmVzdWx0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzRXJwRG9jdW1lbnRSZXF1ZXN0KFxuICAgICAgICByZWNvcmRzOiBFc29sdmVFcnBEb2N1bWVudFJlcXVlc3RSZWNvcmRbXSxcbiAgICApOiBFc29sdmVFcnBEb2N1bWVudFJlcXVlc3RbXSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RzOiBFc29sdmVFcnBEb2N1bWVudFJlcXVlc3RbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgICAgIHJlcXVlc3RzLnB1c2gobmV3IEVzb2x2ZUVycERvY3VtZW50UmVxdWVzdChyZWNvcmQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXF1ZXN0cztcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NDbGllbnRBc3NldHMoXG4gICAgICAgIHJlY29yZHM6IEVzb2x2ZUNsaWVudEFzc2V0UmVjb3JkW10sXG4gICAgKTogRXNvbHZlQ2xpZW50QXNzZXRbXSB7XG4gICAgICAgIGNvbnN0IGFzc2V0czogRXNvbHZlQ2xpZW50QXNzZXRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgICAgIGFzc2V0cy5wdXNoKG5ldyBFc29sdmVDbGllbnRBc3NldChyZWNvcmQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhc3NldHM7XG4gICAgfVxufVxuIl19