@infrab4a/connect 3.3.2-beta.0 → 3.3.3-beta.0

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 (596) hide show
  1. package/README.md +24 -24
  2. package/bundles/infrab4a-connect.umd.js +4739 -4614
  3. package/bundles/infrab4a-connect.umd.js.map +1 -1
  4. package/domain/catalog/index.d.ts +2 -2
  5. package/domain/catalog/models/category.d.ts +24 -24
  6. package/domain/catalog/models/enums/index.d.ts +2 -2
  7. package/domain/catalog/models/enums/product-genders.enum.d.ts +5 -5
  8. package/domain/catalog/models/enums/shops.enum.d.ts +6 -6
  9. package/domain/catalog/models/index.d.ts +6 -6
  10. package/domain/catalog/models/kit-product.d.ts +12 -12
  11. package/domain/catalog/models/product.d.ts +39 -39
  12. package/domain/catalog/models/types/category-condition.type.d.ts +4 -4
  13. package/domain/catalog/models/types/category-filter.type.d.ts +4 -4
  14. package/domain/catalog/models/types/category-metadata.type.d.ts +4 -4
  15. package/domain/catalog/models/types/index.d.ts +10 -10
  16. package/domain/catalog/models/types/product-gender.type.d.ts +1 -1
  17. package/domain/catalog/models/types/product-metadata.type.d.ts +4 -4
  18. package/domain/catalog/models/types/product-review.type.d.ts +17 -17
  19. package/domain/catalog/models/types/shop-description.type.d.ts +7 -7
  20. package/domain/catalog/models/types/shop-price.type.d.ts +6 -6
  21. package/domain/catalog/models/types/stock.type.d.ts +3 -3
  22. package/domain/catalog/models/types/variant-grade.type.d.ts +4 -4
  23. package/domain/catalog/models/variant.d.ts +18 -18
  24. package/domain/catalog/repositories/category.repository.d.ts +15 -15
  25. package/domain/catalog/repositories/index.d.ts +4 -4
  26. package/domain/catalog/repositories/product.repository.d.ts +12 -12
  27. package/domain/catalog/repositories/subscription-product.repository.d.ts +4 -4
  28. package/domain/catalog/repositories/variant.repository.d.ts +4 -4
  29. package/domain/generic/index.d.ts +2 -2
  30. package/domain/generic/model/base.model.d.ts +10 -10
  31. package/domain/generic/model/identifier-fields.d.ts +4 -4
  32. package/domain/generic/model/index.d.ts +3 -3
  33. package/domain/generic/model/types/base-model-builder.type.d.ts +15 -15
  34. package/domain/generic/model/types/identifier-model.type.d.ts +7 -7
  35. package/domain/generic/model/types/index.d.ts +5 -5
  36. package/domain/generic/model/types/model-base-structure.type.d.ts +6 -6
  37. package/domain/generic/model/types/non-function-properties.type.d.ts +12 -12
  38. package/domain/generic/model/types/non-function-property-name.type.d.ts +4 -4
  39. package/domain/generic/repository/create.repository.d.ts +8 -8
  40. package/domain/generic/repository/crud.repository.d.ts +19 -19
  41. package/domain/generic/repository/delete.repository.d.ts +7 -7
  42. package/domain/generic/repository/enums/index.d.ts +2 -2
  43. package/domain/generic/repository/enums/update-option-actions.enum.d.ts +7 -7
  44. package/domain/generic/repository/enums/where.enum.d.ts +14 -14
  45. package/domain/generic/repository/find.repository.d.ts +14 -14
  46. package/domain/generic/repository/get.repository.d.ts +5 -5
  47. package/domain/generic/repository/index.d.ts +9 -9
  48. package/domain/generic/repository/read.repository.d.ts +14 -14
  49. package/domain/generic/repository/types/index.d.ts +6 -6
  50. package/domain/generic/repository/types/repository-find-filters.type.d.ts +13 -13
  51. package/domain/generic/repository/types/repository-find-result.type.d.ts +4 -4
  52. package/domain/generic/repository/types/repository-limit-options.type.d.ts +4 -4
  53. package/domain/generic/repository/types/repository-order-by-list.type.d.ts +5 -5
  54. package/domain/generic/repository/types/repository-update-params.type.d.ts +11 -11
  55. package/domain/generic/repository/types/where-options.type.d.ts +2 -2
  56. package/domain/generic/repository/update.repository.d.ts +6 -6
  57. package/domain/index.d.ts +6 -6
  58. package/domain/location/index.d.ts +1 -1
  59. package/domain/location/models/address.d.ts +22 -22
  60. package/domain/location/models/index.d.ts +2 -2
  61. package/domain/location/models/types/index.d.ts +3 -3
  62. package/domain/location/models/types/location-bound.type.d.ts +6 -6
  63. package/domain/location/models/types/location-geometry.type.d.ts +7 -7
  64. package/domain/location/models/types/location-lat-lng.type.d.ts +4 -4
  65. package/domain/shop-settings/enums/filter-type.enum.d.ts +19 -19
  66. package/domain/shop-settings/enums/index.d.ts +2 -2
  67. package/domain/shop-settings/enums/questions-filters.enum.d.ts +19 -19
  68. package/domain/shop-settings/helpers/beauty-questions.helper.d.ts +9 -9
  69. package/domain/shop-settings/helpers/index.d.ts +1 -1
  70. package/domain/shop-settings/index.d.ts +4 -4
  71. package/domain/shop-settings/models/home.d.ts +18 -18
  72. package/domain/shop-settings/models/index.d.ts +3 -3
  73. package/domain/shop-settings/models/shop-menu.d.ts +7 -7
  74. package/domain/shop-settings/models/types/banner.type.d.ts +6 -6
  75. package/domain/shop-settings/models/types/benefit.type.d.ts +5 -5
  76. package/domain/shop-settings/models/types/home-data.type.d.ts +15 -15
  77. package/domain/shop-settings/models/types/index.d.ts +5 -5
  78. package/domain/shop-settings/models/types/menu-nav.type.d.ts +8 -8
  79. package/domain/shop-settings/models/types/sub-menu.type.d.ts +8 -8
  80. package/domain/shop-settings/repositories/home.repository.d.ts +4 -4
  81. package/domain/shop-settings/repositories/index.d.ts +2 -2
  82. package/domain/shop-settings/repositories/shop-menu.repository.d.ts +4 -4
  83. package/domain/shopping/index.d.ts +2 -2
  84. package/domain/shopping/models/buy-2-win.d.ts +16 -16
  85. package/domain/shopping/models/campaign-dashboard.d.ts +15 -0
  86. package/domain/shopping/models/campaign-hashtag.d.ts +18 -0
  87. package/domain/shopping/models/checkout.d.ts +27 -27
  88. package/domain/shopping/models/coupons/coupon.d.ts +32 -32
  89. package/domain/shopping/models/coupons/enums/coupon-club-mens.enum.d.ts +5 -5
  90. package/domain/shopping/models/coupons/enums/coupon-subtypes.enum.d.ts +4 -4
  91. package/domain/shopping/models/coupons/enums/coupon-types.enum.d.ts +4 -4
  92. package/domain/shopping/models/coupons/enums/exclusivities.enum.d.ts +8 -8
  93. package/domain/shopping/models/coupons/enums/index.d.ts +3 -3
  94. package/domain/shopping/models/coupons/index.d.ts +2 -2
  95. package/domain/shopping/models/enums/checkout-types.enum.d.ts +5 -5
  96. package/domain/shopping/models/enums/index.d.ts +2 -2
  97. package/domain/shopping/models/enums/order-status.enum.d.ts +10 -10
  98. package/domain/shopping/models/index.d.ts +12 -11
  99. package/domain/shopping/models/line-item.d.ts +8 -8
  100. package/domain/shopping/models/order.d.ts +9 -9
  101. package/domain/shopping/models/payment.d.ts +67 -67
  102. package/domain/shopping/models/shipping-method.d.ts +16 -16
  103. package/domain/shopping/models/subscription/checkout.d.ts +21 -21
  104. package/domain/shopping/models/subscription/index.d.ts +2 -2
  105. package/domain/shopping/models/subscription/plan.d.ts +10 -10
  106. package/domain/shopping/models/types/index.d.ts +7 -7
  107. package/domain/shopping/models/types/payment-address.type.d.ts +12 -12
  108. package/domain/shopping/models/types/payment-billing.type.d.ts +7 -7
  109. package/domain/shopping/models/types/payment-card.type.d.ts +14 -14
  110. package/domain/shopping/models/types/payment-customer.type.d.ts +18 -18
  111. package/domain/shopping/models/types/payment-document.type.d.ts +6 -6
  112. package/domain/shopping/models/types/payment-item.type.d.ts +11 -11
  113. package/domain/shopping/models/types/payment-shipping.type.d.ts +10 -10
  114. package/domain/shopping/repositories/buy-2-win.repository.d.ts +4 -4
  115. package/domain/shopping/repositories/campaign-dashboard.repository.d.ts +4 -0
  116. package/domain/shopping/repositories/campaign-hashtag.repository.d.ts +4 -0
  117. package/domain/shopping/repositories/checkout.repository.d.ts +4 -4
  118. package/domain/shopping/repositories/coupon.repository.d.ts +4 -4
  119. package/domain/shopping/repositories/index.d.ts +9 -7
  120. package/domain/shopping/repositories/legacy-order.repository.d.ts +3 -3
  121. package/domain/shopping/repositories/order.repository.d.ts +4 -4
  122. package/domain/shopping/repositories/payment.repository.d.ts +4 -4
  123. package/domain/shopping/repositories/subscription/checkout.repository.d.ts +4 -4
  124. package/domain/shopping/repositories/subscription/index.d.ts +2 -2
  125. package/domain/shopping/repositories/subscription/plan.repository.d.ts +4 -4
  126. package/domain/users/errors/index.d.ts +3 -3
  127. package/domain/users/errors/unauthorized.error.d.ts +5 -5
  128. package/domain/users/errors/user-already-registered.error.d.ts +5 -5
  129. package/domain/users/errors/weak-password.error.d.ts +5 -5
  130. package/domain/users/index.d.ts +5 -5
  131. package/domain/users/models/beauty-profile.d.ts +11 -11
  132. package/domain/users/models/enums/accessory-importances.enum.d.ts +5 -5
  133. package/domain/users/models/enums/area.enum.d.ts +11 -11
  134. package/domain/users/models/enums/beard-problems.enum.d.ts +9 -9
  135. package/domain/users/models/enums/beard-sizes.enum.d.ts +7 -7
  136. package/domain/users/models/enums/beauty-product-importances.enum.d.ts +6 -6
  137. package/domain/users/models/enums/body-problems.enum.d.ts +11 -11
  138. package/domain/users/models/enums/body-shapes.enum.d.ts +7 -7
  139. package/domain/users/models/enums/body-tattoos.enum.d.ts +5 -5
  140. package/domain/users/models/enums/face-skin-oilinesses.enum.d.ts +7 -7
  141. package/domain/users/models/enums/face-skin-problems.enum.d.ts +10 -10
  142. package/domain/users/models/enums/face-skin-tones.enum.d.ts +8 -8
  143. package/domain/users/models/enums/family-incomes.enum.d.ts +8 -8
  144. package/domain/users/models/enums/fragrance-importances.enum.d.ts +5 -5
  145. package/domain/users/models/enums/hair-colors.enum.d.ts +10 -10
  146. package/domain/users/models/enums/hair-problems.enum.d.ts +10 -10
  147. package/domain/users/models/enums/hair-strands.enum.d.ts +8 -8
  148. package/domain/users/models/enums/hair-types.enum.d.ts +7 -7
  149. package/domain/users/models/enums/index.d.ts +20 -20
  150. package/domain/users/models/enums/office-position.enum.d.ts +6 -6
  151. package/domain/users/models/enums/product-spents.enum.d.ts +8 -8
  152. package/domain/users/models/enums/user-type.enum.d.ts +8 -8
  153. package/domain/users/models/index.d.ts +7 -7
  154. package/domain/users/models/lead.d.ts +7 -7
  155. package/domain/users/models/subscription/edition.d.ts +16 -16
  156. package/domain/users/models/subscription/enums/billing-status.enum.d.ts +3 -3
  157. package/domain/users/models/subscription/enums/edition-status.enum.d.ts +4 -4
  158. package/domain/users/models/subscription/enums/index.d.ts +4 -4
  159. package/domain/users/models/subscription/enums/payment-type.enum.d.ts +5 -5
  160. package/domain/users/models/subscription/enums/status.enum.d.ts +4 -4
  161. package/domain/users/models/subscription/index.d.ts +4 -4
  162. package/domain/users/models/subscription/payment.d.ts +13 -13
  163. package/domain/users/models/subscription/subscription.d.ts +28 -28
  164. package/domain/users/models/user-address.d.ts +7 -7
  165. package/domain/users/models/user-payment-method.d.ts +14 -14
  166. package/domain/users/models/user.d.ts +28 -28
  167. package/domain/users/repositories/beauty-profile.repository.d.ts +4 -4
  168. package/domain/users/repositories/edition.repository.d.ts +4 -4
  169. package/domain/users/repositories/index.d.ts +8 -8
  170. package/domain/users/repositories/lead.repository.d.ts +4 -4
  171. package/domain/users/repositories/subscription-payment.repository.d.ts +4 -4
  172. package/domain/users/repositories/subscription.repository.d.ts +4 -4
  173. package/domain/users/repositories/user-address.repository.d.ts +4 -4
  174. package/domain/users/repositories/user-payment-method.repository.d.ts +4 -4
  175. package/domain/users/repositories/user.repository.d.ts +6 -6
  176. package/domain/users/services/authentication.service.d.ts +12 -12
  177. package/domain/users/services/index.d.ts +3 -3
  178. package/domain/users/services/register.service.d.ts +7 -7
  179. package/domain/users/services/types/basic-user-data.type.d.ts +4 -4
  180. package/domain/users/services/types/index.d.ts +1 -1
  181. package/domain/users/use-cases/authentication.d.ts +21 -21
  182. package/domain/users/use-cases/index.d.ts +4 -4
  183. package/domain/users/use-cases/recovery-password.d.ts +6 -6
  184. package/domain/users/use-cases/register.d.ts +13 -13
  185. package/domain/users/use-cases/signout.d.ts +6 -6
  186. package/errors/duplicated-results.error.d.ts +5 -5
  187. package/errors/index.d.ts +4 -4
  188. package/errors/invalid-argument.error.d.ts +5 -5
  189. package/errors/not-found.error.d.ts +5 -5
  190. package/errors/required-argument.error.d.ts +6 -6
  191. package/esm2015/domain/catalog/index.js +3 -3
  192. package/esm2015/domain/catalog/models/category.js +10 -10
  193. package/esm2015/domain/catalog/models/enums/index.js +3 -3
  194. package/esm2015/domain/catalog/models/enums/product-genders.enum.js +7 -7
  195. package/esm2015/domain/catalog/models/enums/shops.enum.js +8 -8
  196. package/esm2015/domain/catalog/models/index.js +7 -7
  197. package/esm2015/domain/catalog/models/kit-product.js +18 -18
  198. package/esm2015/domain/catalog/models/product.js +17 -17
  199. package/esm2015/domain/catalog/models/types/category-condition.type.js +2 -2
  200. package/esm2015/domain/catalog/models/types/category-filter.type.js +2 -2
  201. package/esm2015/domain/catalog/models/types/category-metadata.type.js +2 -2
  202. package/esm2015/domain/catalog/models/types/index.js +11 -11
  203. package/esm2015/domain/catalog/models/types/product-gender.type.js +2 -2
  204. package/esm2015/domain/catalog/models/types/product-metadata.type.js +2 -2
  205. package/esm2015/domain/catalog/models/types/product-review.type.js +2 -2
  206. package/esm2015/domain/catalog/models/types/shop-description.type.js +2 -2
  207. package/esm2015/domain/catalog/models/types/shop-price.type.js +2 -2
  208. package/esm2015/domain/catalog/models/types/stock.type.js +2 -2
  209. package/esm2015/domain/catalog/models/types/variant-grade.type.js +2 -2
  210. package/esm2015/domain/catalog/models/variant.js +10 -10
  211. package/esm2015/domain/catalog/repositories/category.repository.js +2 -2
  212. package/esm2015/domain/catalog/repositories/index.js +5 -5
  213. package/esm2015/domain/catalog/repositories/product.repository.js +2 -2
  214. package/esm2015/domain/catalog/repositories/subscription-product.repository.js +2 -2
  215. package/esm2015/domain/catalog/repositories/variant.repository.js +2 -2
  216. package/esm2015/domain/generic/index.js +3 -3
  217. package/esm2015/domain/generic/model/base.model.js +23 -23
  218. package/esm2015/domain/generic/model/identifier-fields.js +2 -2
  219. package/esm2015/domain/generic/model/index.js +4 -4
  220. package/esm2015/domain/generic/model/types/base-model-builder.type.js +2 -2
  221. package/esm2015/domain/generic/model/types/identifier-model.type.js +2 -2
  222. package/esm2015/domain/generic/model/types/index.js +6 -6
  223. package/esm2015/domain/generic/model/types/model-base-structure.type.js +2 -2
  224. package/esm2015/domain/generic/model/types/non-function-properties.type.js +2 -2
  225. package/esm2015/domain/generic/model/types/non-function-property-name.type.js +2 -2
  226. package/esm2015/domain/generic/repository/create.repository.js +2 -2
  227. package/esm2015/domain/generic/repository/crud.repository.js +2 -2
  228. package/esm2015/domain/generic/repository/delete.repository.js +2 -2
  229. package/esm2015/domain/generic/repository/enums/index.js +3 -3
  230. package/esm2015/domain/generic/repository/enums/update-option-actions.enum.js +9 -9
  231. package/esm2015/domain/generic/repository/enums/where.enum.js +16 -16
  232. package/esm2015/domain/generic/repository/find.repository.js +2 -2
  233. package/esm2015/domain/generic/repository/get.repository.js +2 -2
  234. package/esm2015/domain/generic/repository/index.js +10 -10
  235. package/esm2015/domain/generic/repository/read.repository.js +2 -2
  236. package/esm2015/domain/generic/repository/types/index.js +7 -7
  237. package/esm2015/domain/generic/repository/types/repository-find-filters.type.js +2 -2
  238. package/esm2015/domain/generic/repository/types/repository-find-result.type.js +2 -2
  239. package/esm2015/domain/generic/repository/types/repository-limit-options.type.js +2 -2
  240. package/esm2015/domain/generic/repository/types/repository-order-by-list.type.js +2 -2
  241. package/esm2015/domain/generic/repository/types/repository-update-params.type.js +2 -2
  242. package/esm2015/domain/generic/repository/types/where-options.type.js +2 -2
  243. package/esm2015/domain/generic/repository/update.repository.js +2 -2
  244. package/esm2015/domain/index.js +7 -7
  245. package/esm2015/domain/location/index.js +2 -2
  246. package/esm2015/domain/location/models/address.js +7 -7
  247. package/esm2015/domain/location/models/index.js +3 -3
  248. package/esm2015/domain/location/models/types/index.js +4 -4
  249. package/esm2015/domain/location/models/types/location-bound.type.js +2 -2
  250. package/esm2015/domain/location/models/types/location-geometry.type.js +2 -2
  251. package/esm2015/domain/location/models/types/location-lat-lng.type.js +2 -2
  252. package/esm2015/domain/shop-settings/enums/filter-type.enum.js +21 -21
  253. package/esm2015/domain/shop-settings/enums/index.js +3 -3
  254. package/esm2015/domain/shop-settings/enums/questions-filters.enum.js +21 -21
  255. package/esm2015/domain/shop-settings/helpers/beauty-questions.helper.js +46 -46
  256. package/esm2015/domain/shop-settings/helpers/index.js +2 -2
  257. package/esm2015/domain/shop-settings/index.js +5 -5
  258. package/esm2015/domain/shop-settings/models/home.js +7 -7
  259. package/esm2015/domain/shop-settings/models/index.js +4 -4
  260. package/esm2015/domain/shop-settings/models/shop-menu.js +7 -7
  261. package/esm2015/domain/shop-settings/models/types/banner.type.js +2 -2
  262. package/esm2015/domain/shop-settings/models/types/benefit.type.js +2 -2
  263. package/esm2015/domain/shop-settings/models/types/home-data.type.js +2 -2
  264. package/esm2015/domain/shop-settings/models/types/index.js +6 -6
  265. package/esm2015/domain/shop-settings/models/types/menu-nav.type.js +2 -2
  266. package/esm2015/domain/shop-settings/models/types/sub-menu.type.js +2 -2
  267. package/esm2015/domain/shop-settings/repositories/home.repository.js +2 -2
  268. package/esm2015/domain/shop-settings/repositories/index.js +3 -3
  269. package/esm2015/domain/shop-settings/repositories/shop-menu.repository.js +2 -2
  270. package/esm2015/domain/shopping/index.js +3 -3
  271. package/esm2015/domain/shopping/models/buy-2-win.js +14 -14
  272. package/esm2015/domain/shopping/models/campaign-dashboard.js +7 -0
  273. package/esm2015/domain/shopping/models/campaign-hashtag.js +7 -0
  274. package/esm2015/domain/shopping/models/checkout.js +38 -38
  275. package/esm2015/domain/shopping/models/coupons/coupon.js +38 -38
  276. package/esm2015/domain/shopping/models/coupons/enums/coupon-club-mens.enum.js +7 -7
  277. package/esm2015/domain/shopping/models/coupons/enums/coupon-subtypes.enum.js +6 -6
  278. package/esm2015/domain/shopping/models/coupons/enums/coupon-types.enum.js +10 -10
  279. package/esm2015/domain/shopping/models/coupons/enums/exclusivities.enum.js +10 -10
  280. package/esm2015/domain/shopping/models/coupons/enums/index.js +4 -4
  281. package/esm2015/domain/shopping/models/coupons/index.js +3 -3
  282. package/esm2015/domain/shopping/models/enums/checkout-types.enum.js +7 -7
  283. package/esm2015/domain/shopping/models/enums/index.js +3 -3
  284. package/esm2015/domain/shopping/models/enums/order-status.enum.js +12 -12
  285. package/esm2015/domain/shopping/models/index.js +13 -12
  286. package/esm2015/domain/shopping/models/line-item.js +4 -4
  287. package/esm2015/domain/shopping/models/order.js +11 -11
  288. package/esm2015/domain/shopping/models/payment.js +169 -169
  289. package/esm2015/domain/shopping/models/shipping-method.js +7 -7
  290. package/esm2015/domain/shopping/models/subscription/checkout.js +28 -28
  291. package/esm2015/domain/shopping/models/subscription/index.js +3 -3
  292. package/esm2015/domain/shopping/models/subscription/plan.js +7 -7
  293. package/esm2015/domain/shopping/models/types/index.js +8 -8
  294. package/esm2015/domain/shopping/models/types/payment-address.type.js +2 -2
  295. package/esm2015/domain/shopping/models/types/payment-billing.type.js +2 -2
  296. package/esm2015/domain/shopping/models/types/payment-card.type.js +2 -2
  297. package/esm2015/domain/shopping/models/types/payment-customer.type.js +2 -2
  298. package/esm2015/domain/shopping/models/types/payment-document.type.js +2 -2
  299. package/esm2015/domain/shopping/models/types/payment-item.type.js +2 -2
  300. package/esm2015/domain/shopping/models/types/payment-shipping.type.js +2 -2
  301. package/esm2015/domain/shopping/repositories/buy-2-win.repository.js +2 -2
  302. package/esm2015/domain/shopping/repositories/campaign-dashboard.repository.js +2 -0
  303. package/esm2015/domain/shopping/repositories/campaign-hashtag.repository.js +2 -0
  304. package/esm2015/domain/shopping/repositories/checkout.repository.js +2 -2
  305. package/esm2015/domain/shopping/repositories/coupon.repository.js +2 -2
  306. package/esm2015/domain/shopping/repositories/index.js +10 -8
  307. package/esm2015/domain/shopping/repositories/legacy-order.repository.js +2 -2
  308. package/esm2015/domain/shopping/repositories/order.repository.js +2 -2
  309. package/esm2015/domain/shopping/repositories/payment.repository.js +2 -2
  310. package/esm2015/domain/shopping/repositories/subscription/checkout.repository.js +2 -2
  311. package/esm2015/domain/shopping/repositories/subscription/index.js +3 -3
  312. package/esm2015/domain/shopping/repositories/subscription/plan.repository.js +2 -2
  313. package/esm2015/domain/users/errors/index.js +4 -4
  314. package/esm2015/domain/users/errors/unauthorized.error.js +8 -8
  315. package/esm2015/domain/users/errors/user-already-registered.error.js +8 -8
  316. package/esm2015/domain/users/errors/weak-password.error.js +8 -8
  317. package/esm2015/domain/users/index.js +6 -6
  318. package/esm2015/domain/users/models/beauty-profile.js +12 -12
  319. package/esm2015/domain/users/models/enums/accessory-importances.enum.js +7 -7
  320. package/esm2015/domain/users/models/enums/area.enum.js +13 -13
  321. package/esm2015/domain/users/models/enums/beard-problems.enum.js +11 -11
  322. package/esm2015/domain/users/models/enums/beard-sizes.enum.js +9 -9
  323. package/esm2015/domain/users/models/enums/beauty-product-importances.enum.js +8 -8
  324. package/esm2015/domain/users/models/enums/body-problems.enum.js +13 -13
  325. package/esm2015/domain/users/models/enums/body-shapes.enum.js +9 -9
  326. package/esm2015/domain/users/models/enums/body-tattoos.enum.js +7 -7
  327. package/esm2015/domain/users/models/enums/face-skin-oilinesses.enum.js +9 -9
  328. package/esm2015/domain/users/models/enums/face-skin-problems.enum.js +12 -12
  329. package/esm2015/domain/users/models/enums/face-skin-tones.enum.js +10 -10
  330. package/esm2015/domain/users/models/enums/family-incomes.enum.js +10 -10
  331. package/esm2015/domain/users/models/enums/fragrance-importances.enum.js +7 -7
  332. package/esm2015/domain/users/models/enums/hair-colors.enum.js +12 -12
  333. package/esm2015/domain/users/models/enums/hair-problems.enum.js +12 -12
  334. package/esm2015/domain/users/models/enums/hair-strands.enum.js +10 -10
  335. package/esm2015/domain/users/models/enums/hair-types.enum.js +9 -9
  336. package/esm2015/domain/users/models/enums/index.js +21 -21
  337. package/esm2015/domain/users/models/enums/office-position.enum.js +8 -8
  338. package/esm2015/domain/users/models/enums/product-spents.enum.js +10 -10
  339. package/esm2015/domain/users/models/enums/user-type.enum.js +10 -10
  340. package/esm2015/domain/users/models/index.js +8 -8
  341. package/esm2015/domain/users/models/lead.js +7 -7
  342. package/esm2015/domain/users/models/subscription/edition.js +7 -7
  343. package/esm2015/domain/users/models/subscription/enums/billing-status.enum.js +5 -5
  344. package/esm2015/domain/users/models/subscription/enums/edition-status.enum.js +6 -6
  345. package/esm2015/domain/users/models/subscription/enums/index.js +5 -5
  346. package/esm2015/domain/users/models/subscription/enums/payment-type.enum.js +7 -7
  347. package/esm2015/domain/users/models/subscription/enums/status.enum.js +6 -6
  348. package/esm2015/domain/users/models/subscription/index.js +5 -5
  349. package/esm2015/domain/users/models/subscription/payment.js +14 -14
  350. package/esm2015/domain/users/models/subscription/subscription.js +43 -43
  351. package/esm2015/domain/users/models/user-address.js +7 -7
  352. package/esm2015/domain/users/models/user-payment-method.js +7 -7
  353. package/esm2015/domain/users/models/user.js +26 -26
  354. package/esm2015/domain/users/repositories/beauty-profile.repository.js +2 -2
  355. package/esm2015/domain/users/repositories/edition.repository.js +2 -2
  356. package/esm2015/domain/users/repositories/index.js +9 -9
  357. package/esm2015/domain/users/repositories/lead.repository.js +2 -2
  358. package/esm2015/domain/users/repositories/subscription-payment.repository.js +2 -2
  359. package/esm2015/domain/users/repositories/subscription.repository.js +2 -2
  360. package/esm2015/domain/users/repositories/user-address.repository.js +2 -2
  361. package/esm2015/domain/users/repositories/user-payment-method.repository.js +2 -2
  362. package/esm2015/domain/users/repositories/user.repository.js +2 -2
  363. package/esm2015/domain/users/services/authentication.service.js +2 -2
  364. package/esm2015/domain/users/services/index.js +4 -4
  365. package/esm2015/domain/users/services/register.service.js +2 -2
  366. package/esm2015/domain/users/services/types/basic-user-data.type.js +2 -2
  367. package/esm2015/domain/users/services/types/index.js +2 -2
  368. package/esm2015/domain/users/use-cases/authentication.js +40 -40
  369. package/esm2015/domain/users/use-cases/index.js +5 -5
  370. package/esm2015/domain/users/use-cases/recovery-password.js +12 -12
  371. package/esm2015/domain/users/use-cases/register.js +34 -34
  372. package/esm2015/domain/users/use-cases/signout.js +12 -12
  373. package/esm2015/errors/duplicated-results.error.js +8 -8
  374. package/esm2015/errors/index.js +5 -5
  375. package/esm2015/errors/invalid-argument.error.js +8 -8
  376. package/esm2015/errors/not-found.error.js +8 -8
  377. package/esm2015/errors/required-argument.error.js +9 -9
  378. package/esm2015/index.js +6 -6
  379. package/esm2015/infra/elasticsearch/adapters/axios.adapter.js +57 -57
  380. package/esm2015/infra/elasticsearch/adapters/elastic-search.adapter.js +2 -2
  381. package/esm2015/infra/elasticsearch/adapters/index.js +3 -3
  382. package/esm2015/infra/elasticsearch/index.js +4 -4
  383. package/esm2015/infra/elasticsearch/indexes/index.js +2 -2
  384. package/esm2015/infra/elasticsearch/indexes/products-index.js +93 -93
  385. package/esm2015/infra/elasticsearch/types/elastic-search-result.js +2 -2
  386. package/esm2015/infra/elasticsearch/types/index.js +2 -2
  387. package/esm2015/infra/firebase/auth/authentication-firebase-auth.service.js +52 -52
  388. package/esm2015/infra/firebase/auth/index.js +3 -3
  389. package/esm2015/infra/firebase/auth/register-firebase-auth.service.js +26 -26
  390. package/esm2015/infra/firebase/auth/types/firebase-user-with-id.type.js +2 -2
  391. package/esm2015/infra/firebase/firestore/enums/firestore-field-type.enum.js +10 -10
  392. package/esm2015/infra/firebase/firestore/enums/index.js +2 -2
  393. package/esm2015/infra/firebase/firestore/index.js +4 -4
  394. package/esm2015/infra/firebase/firestore/mixins/index.js +10 -10
  395. package/esm2015/infra/firebase/firestore/mixins/with-create-firestore.mixin.js +31 -31
  396. package/esm2015/infra/firebase/firestore/mixins/with-crud-firestore.mixin.js +10 -10
  397. package/esm2015/infra/firebase/firestore/mixins/with-delete-firestore.mixin.js +18 -18
  398. package/esm2015/infra/firebase/firestore/mixins/with-find-firestore.mixin.js +98 -98
  399. package/esm2015/infra/firebase/firestore/mixins/with-firestore.mixin.js +49 -49
  400. package/esm2015/infra/firebase/firestore/mixins/with-get-firestore.mixin.js +24 -24
  401. package/esm2015/infra/firebase/firestore/mixins/with-helpers.mixin.js +17 -17
  402. package/esm2015/infra/firebase/firestore/mixins/with-sub-collection.mixin.js +11 -11
  403. package/esm2015/infra/firebase/firestore/mixins/with-update-firestore.mixin.js +45 -45
  404. package/esm2015/infra/firebase/firestore/repositories/catalog/category-firestore.repository.js +71 -71
  405. package/esm2015/infra/firebase/firestore/repositories/catalog/index.js +5 -5
  406. package/esm2015/infra/firebase/firestore/repositories/catalog/product-firestore.repository.js +52 -52
  407. package/esm2015/infra/firebase/firestore/repositories/catalog/product-variant-firestore.repository.js +14 -14
  408. package/esm2015/infra/firebase/firestore/repositories/catalog/subscription-product-firestore.repository.js +12 -12
  409. package/esm2015/infra/firebase/firestore/repositories/index.js +5 -5
  410. package/esm2015/infra/firebase/firestore/repositories/shop-settings/home-firestore.repository.js +56 -56
  411. package/esm2015/infra/firebase/firestore/repositories/shop-settings/index.js +3 -3
  412. package/esm2015/infra/firebase/firestore/repositories/shop-settings/shop-menu-firestore.repository.js +12 -12
  413. package/esm2015/infra/firebase/firestore/repositories/shopping/buy-2-win-firestore.repository.js +12 -12
  414. package/esm2015/infra/firebase/firestore/repositories/shopping/campaign-dashboard-firestore.repository.js +12 -0
  415. package/esm2015/infra/firebase/firestore/repositories/shopping/campaign-hashtag-firestore.repository.js +12 -0
  416. package/esm2015/infra/firebase/firestore/repositories/shopping/checkout-firestore.repository.js +12 -12
  417. package/esm2015/infra/firebase/firestore/repositories/shopping/checkout-subscription-firestore.repository.js +12 -12
  418. package/esm2015/infra/firebase/firestore/repositories/shopping/coupon-firestore.repository.js +29 -29
  419. package/esm2015/infra/firebase/firestore/repositories/shopping/index.js +11 -9
  420. package/esm2015/infra/firebase/firestore/repositories/shopping/legacy-order-firestore.repository.js +9 -9
  421. package/esm2015/infra/firebase/firestore/repositories/shopping/order-firestore.repository.js +40 -40
  422. package/esm2015/infra/firebase/firestore/repositories/shopping/payment-firestore.repository.js +12 -12
  423. package/esm2015/infra/firebase/firestore/repositories/shopping/subscription-plan-firestore.repository.js +12 -12
  424. package/esm2015/infra/firebase/firestore/repositories/users/index.js +9 -9
  425. package/esm2015/infra/firebase/firestore/repositories/users/lead-firestore.repository.js +12 -12
  426. package/esm2015/infra/firebase/firestore/repositories/users/subscription-edition-firestore.repository.js +14 -14
  427. package/esm2015/infra/firebase/firestore/repositories/users/subscription-firestore.repository.js +12 -12
  428. package/esm2015/infra/firebase/firestore/repositories/users/subscription-payment-firestore.repository.js +14 -14
  429. package/esm2015/infra/firebase/firestore/repositories/users/user-address-firestore.repository.js +14 -14
  430. package/esm2015/infra/firebase/firestore/repositories/users/user-beauty-profile-firestore.repository.js +14 -14
  431. package/esm2015/infra/firebase/firestore/repositories/users/user-firestore.repository.js +68 -68
  432. package/esm2015/infra/firebase/firestore/repositories/users/user-payment-method-firestore.repository.js +14 -14
  433. package/esm2015/infra/firebase/firestore/types/firestore-sub.repository.type.js +2 -2
  434. package/esm2015/infra/firebase/firestore/types/firestore.helpers.type.js +2 -2
  435. package/esm2015/infra/firebase/firestore/types/firestore.repository.type.js +2 -2
  436. package/esm2015/infra/firebase/firestore/types/index.js +4 -4
  437. package/esm2015/infra/firebase/index.js +3 -3
  438. package/esm2015/infra/hasura-graphql/enums/hasura-graphql-column-type.enum.js +13 -13
  439. package/esm2015/infra/hasura-graphql/enums/hasura-graphql-where.enum.js +15 -15
  440. package/esm2015/infra/hasura-graphql/enums/index.js +3 -3
  441. package/esm2015/infra/hasura-graphql/index.js +5 -5
  442. package/esm2015/infra/hasura-graphql/mixins/helpers/attribute-option.helper.js +31 -31
  443. package/esm2015/infra/hasura-graphql/mixins/helpers/bind-filter-query.helper.js +53 -53
  444. package/esm2015/infra/hasura-graphql/mixins/helpers/filter-option.helper.js +22 -22
  445. package/esm2015/infra/hasura-graphql/mixins/helpers/graphql-field.helper.js +86 -86
  446. package/esm2015/infra/hasura-graphql/mixins/helpers/index.js +5 -5
  447. package/esm2015/infra/hasura-graphql/mixins/index.js +8 -8
  448. package/esm2015/infra/hasura-graphql/mixins/with-create-hasura-graphql.mixin.js +45 -45
  449. package/esm2015/infra/hasura-graphql/mixins/with-crud-hasura-graphql.mixin.js +10 -10
  450. package/esm2015/infra/hasura-graphql/mixins/with-delete-hasura-graphql.mixin.js +29 -29
  451. package/esm2015/infra/hasura-graphql/mixins/with-find-hasura-graphql.mixin.js +50 -50
  452. package/esm2015/infra/hasura-graphql/mixins/with-get-hasura-graphql.mixin.js +35 -35
  453. package/esm2015/infra/hasura-graphql/mixins/with-hasura-graphql.mixin.js +94 -94
  454. package/esm2015/infra/hasura-graphql/mixins/with-update-hasura-graphql.mixin.js +56 -56
  455. package/esm2015/infra/hasura-graphql/models/category-hasura-graphql.js +4 -4
  456. package/esm2015/infra/hasura-graphql/models/index.js +5 -5
  457. package/esm2015/infra/hasura-graphql/models/kit-product-hasura-graphql.js +15 -15
  458. package/esm2015/infra/hasura-graphql/models/product-hasura-graphql.js +11 -11
  459. package/esm2015/infra/hasura-graphql/models/variant-hasura-graphql.js +9 -9
  460. package/esm2015/infra/hasura-graphql/repositories/catalog/category-hasura-graphql.repository.js +241 -241
  461. package/esm2015/infra/hasura-graphql/repositories/catalog/index.js +4 -4
  462. package/esm2015/infra/hasura-graphql/repositories/catalog/product-hasura-graphql.repository.js +465 -465
  463. package/esm2015/infra/hasura-graphql/repositories/catalog/variant-hasura-graphql.repository.js +116 -116
  464. package/esm2015/infra/hasura-graphql/repositories/index.js +2 -2
  465. package/esm2015/infra/hasura-graphql/types/fields.type.js +2 -2
  466. package/esm2015/infra/hasura-graphql/types/graphql.repository.type.js +2 -2
  467. package/esm2015/infra/hasura-graphql/types/hasura-graphql-auth-options.type.js +2 -2
  468. package/esm2015/infra/hasura-graphql/types/hasura-graphql-fields.type.js +2 -2
  469. package/esm2015/infra/hasura-graphql/types/hasura-graphql-headers.type.js +2 -2
  470. package/esm2015/infra/hasura-graphql/types/index.js +9 -9
  471. package/esm2015/infra/hasura-graphql/types/nested-field.type.js +2 -2
  472. package/esm2015/infra/hasura-graphql/types/query-builder-options.type.js +2 -2
  473. package/esm2015/infra/hasura-graphql/types/variable-options.type.js +2 -2
  474. package/esm2015/infra/index.js +4 -4
  475. package/esm2015/infrab4a-connect.js +4 -4
  476. package/esm2015/utils/index.js +8 -8
  477. package/esm2015/utils/is-uuid.js +3 -3
  478. package/esm2015/utils/mixins/base.mixin.js +6 -6
  479. package/esm2015/utils/mixins/index.js +4 -4
  480. package/esm2015/utils/mixins/merge-constructor-params.type.js +2 -2
  481. package/esm2015/utils/mixins/mixin-ctor.type.js +2 -2
  482. package/esm2015/utils/parse-datetime.js +14 -14
  483. package/esm2015/utils/types/array-element.type.js +2 -2
  484. package/esm2015/utils/types/index.js +3 -3
  485. package/esm2015/utils/types/prop.type.js +2 -2
  486. package/fesm2015/infrab4a-connect.js +3192 -3162
  487. package/fesm2015/infrab4a-connect.js.map +1 -1
  488. package/index.d.ts +5 -5
  489. package/infra/elasticsearch/adapters/axios.adapter.d.ts +14 -14
  490. package/infra/elasticsearch/adapters/elastic-search.adapter.d.ts +7 -7
  491. package/infra/elasticsearch/adapters/index.d.ts +2 -2
  492. package/infra/elasticsearch/index.d.ts +3 -3
  493. package/infra/elasticsearch/indexes/index.d.ts +1 -1
  494. package/infra/elasticsearch/indexes/products-index.d.ts +15 -15
  495. package/infra/elasticsearch/types/elastic-search-result.d.ts +7 -7
  496. package/infra/elasticsearch/types/index.d.ts +1 -1
  497. package/infra/firebase/auth/authentication-firebase-auth.service.d.ts +12 -12
  498. package/infra/firebase/auth/index.d.ts +2 -2
  499. package/infra/firebase/auth/register-firebase-auth.service.d.ts +8 -8
  500. package/infra/firebase/auth/types/firebase-user-with-id.type.d.ts +3 -3
  501. package/infra/firebase/firestore/enums/firestore-field-type.enum.d.ts +8 -8
  502. package/infra/firebase/firestore/enums/index.d.ts +1 -1
  503. package/infra/firebase/firestore/index.d.ts +3 -3
  504. package/infra/firebase/firestore/mixins/index.d.ts +9 -9
  505. package/infra/firebase/firestore/mixins/with-create-firestore.mixin.d.ts +4 -4
  506. package/infra/firebase/firestore/mixins/with-crud-firestore.mixin.d.ts +4 -4
  507. package/infra/firebase/firestore/mixins/with-delete-firestore.mixin.d.ts +4 -4
  508. package/infra/firebase/firestore/mixins/with-find-firestore.mixin.d.ts +4 -4
  509. package/infra/firebase/firestore/mixins/with-firestore.mixin.d.ts +4 -4
  510. package/infra/firebase/firestore/mixins/with-get-firestore.mixin.d.ts +4 -4
  511. package/infra/firebase/firestore/mixins/with-helpers.mixin.d.ts +11 -11
  512. package/infra/firebase/firestore/mixins/with-sub-collection.mixin.d.ts +7 -7
  513. package/infra/firebase/firestore/mixins/with-update-firestore.mixin.d.ts +7 -7
  514. package/infra/firebase/firestore/repositories/catalog/category-firestore.repository.d.ts +17 -17
  515. package/infra/firebase/firestore/repositories/catalog/index.d.ts +4 -4
  516. package/infra/firebase/firestore/repositories/catalog/product-firestore.repository.d.ts +11 -11
  517. package/infra/firebase/firestore/repositories/catalog/product-variant-firestore.repository.d.ts +13 -13
  518. package/infra/firebase/firestore/repositories/catalog/subscription-product-firestore.repository.d.ts +8 -8
  519. package/infra/firebase/firestore/repositories/index.d.ts +4 -4
  520. package/infra/firebase/firestore/repositories/shop-settings/home-firestore.repository.d.ts +16 -16
  521. package/infra/firebase/firestore/repositories/shop-settings/index.d.ts +2 -2
  522. package/infra/firebase/firestore/repositories/shop-settings/shop-menu-firestore.repository.d.ts +8 -8
  523. package/infra/firebase/firestore/repositories/shopping/buy-2-win-firestore.repository.d.ts +8 -8
  524. package/infra/firebase/firestore/repositories/shopping/campaign-dashboard-firestore.repository.d.ts +9 -0
  525. package/infra/firebase/firestore/repositories/shopping/campaign-hashtag-firestore.repository.d.ts +9 -0
  526. package/infra/firebase/firestore/repositories/shopping/checkout-firestore.repository.d.ts +8 -8
  527. package/infra/firebase/firestore/repositories/shopping/checkout-subscription-firestore.repository.d.ts +8 -8
  528. package/infra/firebase/firestore/repositories/shopping/coupon-firestore.repository.d.ts +12 -12
  529. package/infra/firebase/firestore/repositories/shopping/index.d.ts +10 -8
  530. package/infra/firebase/firestore/repositories/shopping/legacy-order-firestore.repository.d.ts +7 -7
  531. package/infra/firebase/firestore/repositories/shopping/order-firestore.repository.d.ts +13 -13
  532. package/infra/firebase/firestore/repositories/shopping/payment-firestore.repository.d.ts +8 -8
  533. package/infra/firebase/firestore/repositories/shopping/subscription-plan-firestore.repository.d.ts +8 -8
  534. package/infra/firebase/firestore/repositories/users/index.d.ts +8 -8
  535. package/infra/firebase/firestore/repositories/users/lead-firestore.repository.d.ts +8 -8
  536. package/infra/firebase/firestore/repositories/users/subscription-edition-firestore.repository.d.ts +13 -13
  537. package/infra/firebase/firestore/repositories/users/subscription-firestore.repository.d.ts +8 -8
  538. package/infra/firebase/firestore/repositories/users/subscription-payment-firestore.repository.d.ts +13 -13
  539. package/infra/firebase/firestore/repositories/users/user-address-firestore.repository.d.ts +13 -13
  540. package/infra/firebase/firestore/repositories/users/user-beauty-profile-firestore.repository.d.ts +13 -13
  541. package/infra/firebase/firestore/repositories/users/user-firestore.repository.d.ts +17 -17
  542. package/infra/firebase/firestore/repositories/users/user-payment-method-firestore.repository.d.ts +13 -13
  543. package/infra/firebase/firestore/types/firestore-sub.repository.type.d.ts +6 -6
  544. package/infra/firebase/firestore/types/firestore.helpers.type.d.ts +8 -8
  545. package/infra/firebase/firestore/types/firestore.repository.type.d.ts +14 -14
  546. package/infra/firebase/firestore/types/index.d.ts +3 -3
  547. package/infra/firebase/index.d.ts +2 -2
  548. package/infra/hasura-graphql/enums/hasura-graphql-column-type.enum.d.ts +11 -11
  549. package/infra/hasura-graphql/enums/hasura-graphql-where.enum.d.ts +13 -13
  550. package/infra/hasura-graphql/enums/index.d.ts +2 -2
  551. package/infra/hasura-graphql/index.d.ts +4 -4
  552. package/infra/hasura-graphql/mixins/helpers/attribute-option.helper.d.ts +13 -13
  553. package/infra/hasura-graphql/mixins/helpers/bind-filter-query.helper.d.ts +10 -10
  554. package/infra/hasura-graphql/mixins/helpers/filter-option.helper.d.ts +6 -6
  555. package/infra/hasura-graphql/mixins/helpers/graphql-field.helper.d.ts +8 -8
  556. package/infra/hasura-graphql/mixins/helpers/index.d.ts +4 -4
  557. package/infra/hasura-graphql/mixins/index.d.ts +7 -7
  558. package/infra/hasura-graphql/mixins/with-create-hasura-graphql.mixin.d.ts +8 -8
  559. package/infra/hasura-graphql/mixins/with-crud-hasura-graphql.mixin.d.ts +11 -11
  560. package/infra/hasura-graphql/mixins/with-delete-hasura-graphql.mixin.d.ts +7 -7
  561. package/infra/hasura-graphql/mixins/with-find-hasura-graphql.mixin.d.ts +20 -20
  562. package/infra/hasura-graphql/mixins/with-get-hasura-graphql.mixin.d.ts +24 -24
  563. package/infra/hasura-graphql/mixins/with-hasura-graphql.mixin.d.ts +11 -11
  564. package/infra/hasura-graphql/mixins/with-update-hasura-graphql.mixin.d.ts +14 -14
  565. package/infra/hasura-graphql/models/category-hasura-graphql.d.ts +6 -6
  566. package/infra/hasura-graphql/models/index.d.ts +4 -4
  567. package/infra/hasura-graphql/models/kit-product-hasura-graphql.d.ts +6 -6
  568. package/infra/hasura-graphql/models/product-hasura-graphql.d.ts +14 -14
  569. package/infra/hasura-graphql/models/variant-hasura-graphql.d.ts +9 -9
  570. package/infra/hasura-graphql/repositories/catalog/category-hasura-graphql.repository.d.ts +27 -27
  571. package/infra/hasura-graphql/repositories/catalog/index.d.ts +3 -3
  572. package/infra/hasura-graphql/repositories/catalog/product-hasura-graphql.repository.d.ts +28 -28
  573. package/infra/hasura-graphql/repositories/catalog/variant-hasura-graphql.repository.d.ts +14 -14
  574. package/infra/hasura-graphql/repositories/index.d.ts +1 -1
  575. package/infra/hasura-graphql/types/fields.type.d.ts +2 -2
  576. package/infra/hasura-graphql/types/graphql.repository.type.d.ts +21 -21
  577. package/infra/hasura-graphql/types/hasura-graphql-auth-options.type.d.ts +8 -8
  578. package/infra/hasura-graphql/types/hasura-graphql-fields.type.d.ts +40 -40
  579. package/infra/hasura-graphql/types/hasura-graphql-headers.type.d.ts +7 -7
  580. package/infra/hasura-graphql/types/index.d.ts +8 -8
  581. package/infra/hasura-graphql/types/nested-field.type.d.ts +7 -7
  582. package/infra/hasura-graphql/types/query-builder-options.type.d.ts +7 -7
  583. package/infra/hasura-graphql/types/variable-options.type.d.ts +9 -9
  584. package/infra/index.d.ts +3 -3
  585. package/infrab4a-connect.d.ts +5 -5
  586. package/package.json +2 -2
  587. package/utils/index.d.ts +7 -7
  588. package/utils/is-uuid.d.ts +1 -1
  589. package/utils/mixins/base.mixin.d.ts +3 -3
  590. package/utils/mixins/index.d.ts +3 -3
  591. package/utils/mixins/merge-constructor-params.type.d.ts +3 -3
  592. package/utils/mixins/mixin-ctor.type.d.ts +1 -1
  593. package/utils/parse-datetime.d.ts +1 -1
  594. package/utils/types/array-element.type.d.ts +1 -1
  595. package/utils/types/index.d.ts +2 -2
  596. package/utils/types/prop.type.d.ts +1 -1
@@ -1,465 +1,465 @@
1
- import { __awaiter, __rest } from "tslib";
2
- import { Where, } from '../../../../domain';
3
- import { NotFoundError } from '../../../../errors';
4
- import { Base, isNil, omit } from '../../../../utils';
5
- import { HasuraGraphQLColumnType, HasuraGraphQLWhere } from '../../enums';
6
- import { withCrudHasuraGraphQL, withHasuraGraphQL } from '../../mixins';
7
- import { ProductHasuraGraphQL } from '../../models';
8
- export class ProductHasuraGraphQLRepository extends withCrudHasuraGraphQL(withHasuraGraphQL(Base)) {
9
- constructor(endpoint, authOptions) {
10
- super({
11
- tableName: 'product',
12
- model: ProductHasuraGraphQL,
13
- endpoint,
14
- authOptions,
15
- fields: [],
16
- });
17
- this.bindReviewToModel = (plain) => (Object.assign(Object.assign({}, omit(plain, ['product_id', 'created_at', 'updated_at', 'person_id', 'order_id'])), { createdAt: typeof plain.created_at === 'string' ? new Date(plain.created_at) : plain.created_at, updatedAt: typeof plain.updated_at === 'string' ? new Date(plain.updated_at) : plain.updated_at, personId: plain.person_id, orderId: plain.order_id }));
18
- this.bindReviewToHasura = (review) => (Object.assign(Object.assign({}, omit(review, ['productId', 'createdAt', 'updatedAt', 'personId', 'orderId'])), { person_id: review.personId, order_id: review.orderId }));
19
- const commonFields = [
20
- { id: { columnName: 'id', to: (value) => +value, from: (value) => value.toString() } },
21
- { firestoreId: { columnName: 'firestore_id' } },
22
- { productId: { columnName: 'main_product_id' } },
23
- { CEST: { columnName: 'cest' } },
24
- { EAN: { columnName: 'ean' } },
25
- { NCM: { columnName: 'ncm' } },
26
- 'brand',
27
- { costPrice: { columnName: 'cost_price' } },
28
- {
29
- description: {
30
- columnName: 'description',
31
- from: (description, data) => ({
32
- description,
33
- differentials: data.differentials,
34
- whoMustUse: data.who_must_use,
35
- howToUse: data.how_to_use,
36
- brand: data.brand_description,
37
- }),
38
- bindFindFilter: (sentence) => {
39
- const filters = Object.values(sentence).shift();
40
- return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((filters === null || filters === void 0 ? void 0 : filters.description) && { description: filters.description })), (filters.differentials && { differentials: filters.differentials })), (filters.whoMustUse && {
41
- who_must_use: filters.whoMustUse,
42
- })), (filters.howToUse && {
43
- how_to_use: filters.howToUse,
44
- })), (filters.brand && {
45
- brand_description: filters.brand,
46
- }));
47
- },
48
- bindPersistData: (descriptionData) => (Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((descriptionData === null || descriptionData === void 0 ? void 0 : descriptionData.description) && { description: descriptionData.description })), (descriptionData.differentials && { differentials: descriptionData.differentials })), (descriptionData.whoMustUse && {
49
- who_must_use: descriptionData.whoMustUse,
50
- })), (descriptionData.howToUse && { how_to_use: descriptionData.howToUse })), (descriptionData.brand && { brand_description: descriptionData.brand }))),
51
- },
52
- },
53
- { differentials: { columnName: 'differentials' } },
54
- { whoMustUse: { columnName: 'who_must_use' } },
55
- { howToUse: { columnName: 'how_to_use' } },
56
- { brandDescription: { columnName: 'brand_description' } },
57
- { hasVariants: { columnName: 'has_variants' } },
58
- {
59
- images: {
60
- columnName: 'images',
61
- to: (value) => { var _a; return ((value === null || value === void 0 ? void 0 : value.length) > 0 ? `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}` : `{}`); },
62
- },
63
- },
64
- {
65
- miniatures: {
66
- columnName: 'miniatures',
67
- to: (value) => { var _a; return ((value === null || value === void 0 ? void 0 : value.length) > 0 ? `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}` : `{}`); },
68
- },
69
- },
70
- 'name',
71
- {
72
- price: {
73
- columnName: 'price',
74
- from: (price, data) => ({
75
- price,
76
- fullPrice: data.full_price,
77
- subscriberDiscountPercentage: data.subscriber_discount_percentage,
78
- subscriberPrice: data.subscriber_price,
79
- }),
80
- bindFindFilter: (sentence) => {
81
- const filters = Object.values(sentence).shift();
82
- return Object.assign(Object.assign(Object.assign(Object.assign({}, (((filters === null || filters === void 0 ? void 0 : filters.price) || (filters === null || filters === void 0 ? void 0 : filters.price) === 0) && { price: filters.price })), ((filters.fullPrice || filters.fullPrice === 0) && { full_price: filters.fullPrice })), ((filters.subscriberDiscountPercentage || filters.subscriberDiscountPercentage === 0) && {
83
- subscriber_discount_percentage: filters.subscriberDiscountPercentage,
84
- })), ((filters.subscriberPrice || filters.subscriberPrice === 0) && {
85
- subscriber_price: filters.subscriberPrice,
86
- }));
87
- },
88
- bindPersistData: (priceData) => (Object.assign(Object.assign(Object.assign(Object.assign({}, ((priceData === null || priceData === void 0 ? void 0 : priceData.price) >= 0 && { price: priceData.price })), (priceData.fullPrice >= 0 && { full_price: priceData.fullPrice })), (priceData.subscriberDiscountPercentage >= 0 && {
89
- subscriber_discount_percentage: priceData.subscriberDiscountPercentage,
90
- })), (priceData.subscriberPrice >= 0 && { subscriber_price: priceData.subscriberPrice }))),
91
- },
92
- },
93
- { fullPrice: { columnName: 'full_price' } },
94
- { subscriberDiscountPercentage: { columnName: 'subscriber_discount_percentage' } },
95
- { subscriberPrice: { columnName: 'subscriber_price' } },
96
- 'published',
97
- 'sku',
98
- {
99
- stock: {
100
- columnName: 'stock',
101
- from: (quantity) => ({ quantity }),
102
- to: (value) => (isNil(value === null || value === void 0 ? void 0 : value.quantity) ? value : value === null || value === void 0 ? void 0 : value.quantity),
103
- },
104
- },
105
- 'slug',
106
- 'type',
107
- 'video',
108
- 'weight',
109
- 'gender',
110
- { tags: { columnName: 'tags', type: HasuraGraphQLColumnType.Jsonb } },
111
- { isKit: { columnName: 'is_kit' } },
112
- { createdAt: { columnName: 'created_at' } },
113
- { updatedAt: { columnName: 'updated_at' } },
114
- {
115
- rate: {
116
- columnName: 'reviews_aggregate',
117
- filters: {
118
- filters: { status: true },
119
- filterType: 'product_review_bool_exp',
120
- },
121
- fields: [{ aggregate: [{ avg: ['rate'] }] }],
122
- from: (value) => value.aggregate.avg.rate,
123
- },
124
- },
125
- { shoppingCount: { columnName: 'shopping_count' } },
126
- ];
127
- this.fields = [
128
- ...commonFields,
129
- {
130
- categories: {
131
- columnName: 'categories',
132
- fields: ['category_id'],
133
- bindPersistData: (value) => ({
134
- categories: { data: value.map((category) => ({ category_id: +category })) },
135
- }),
136
- to: (categories) => categories.map((categoryId) => +categoryId),
137
- from: (categories) => (categories === null || categories === void 0 ? void 0 : categories.map((category) => { var _a; return (_a = category === null || category === void 0 ? void 0 : category.category_id) === null || _a === void 0 ? void 0 : _a.toString(); })) || [],
138
- },
139
- },
140
- {
141
- kitProducts: {
142
- columnName: 'kit_products',
143
- foreignKeyColumn: { productId: 'id' },
144
- fields: [
145
- { productId: { columnName: 'product_id' } },
146
- { kitProductId: { columnName: 'kit_product_id' } },
147
- 'quantity',
148
- { product: { columnName: 'product', foreignKeyColumn: { id: 'product_id' }, fields: commonFields } },
149
- ],
150
- },
151
- },
152
- {
153
- reviews: {
154
- columnName: 'reviews',
155
- foreignKeyColumn: { product_id: 'id' },
156
- fields: this.reviewsFields,
157
- },
158
- },
159
- {
160
- metadata: {
161
- columnName: 'metadata',
162
- fields: ['title', 'description'],
163
- bindPersistData: (value) => ({
164
- metadata: { data: value },
165
- }),
166
- },
167
- },
168
- ];
169
- }
170
- get reviewsFields() {
171
- return [
172
- 'id',
173
- 'shop',
174
- 'rate',
175
- 'author',
176
- 'email',
177
- 'location',
178
- 'review',
179
- 'status',
180
- 'title',
181
- { personId: { columnName: 'person_id' } },
182
- 'points',
183
- { orderId: { columnName: 'order_id' } },
184
- { createdAt: { columnName: 'created_at' } },
185
- { updatedAt: { columnName: 'updated_at' } },
186
- ];
187
- }
188
- create(params) {
189
- const _super = Object.create(null, {
190
- create: { get: () => super.create }
191
- });
192
- return __awaiter(this, void 0, void 0, function* () {
193
- const { metadata } = params, data = __rest(params, ["metadata"]);
194
- const product = yield _super.create.call(this, omit(Object.assign(Object.assign({}, data), { metadata: metadata || { description: null, title: null } }), ['reviews']));
195
- try {
196
- product.reviews = data.reviews && (yield this.updateReviews(+product.id, data));
197
- }
198
- catch (error) {
199
- yield this.delete({ id: product.id });
200
- throw error;
201
- }
202
- return product;
203
- });
204
- }
205
- get(identifiers) {
206
- const _super = Object.create(null, {
207
- get: { get: () => super.get }
208
- });
209
- var _a;
210
- return __awaiter(this, void 0, void 0, function* () {
211
- const product = Number.isNaN(+identifiers.id)
212
- ? (_a = (yield this.find({ filters: { firestoreId: identifiers.id }, options: { enableCount: false } })).data) === null || _a === void 0 ? void 0 : _a[0]
213
- : yield _super.get.call(this, identifiers);
214
- if (product.productId)
215
- throw new NotFoundError('Product not found, it is a variant');
216
- product.reviews = product.reviews || (yield this.findReviewsByProduct(+product.id));
217
- return product;
218
- });
219
- }
220
- find(params) {
221
- const _super = Object.create(null, {
222
- find: { get: () => super.find }
223
- });
224
- return __awaiter(this, void 0, void 0, function* () {
225
- const _a = params || {}, { filters, fields } = _a, options = __rest(_a, ["filters", "fields"]);
226
- const bindFields = fields ||
227
- this.fields
228
- .map((field) => (typeof field === 'string' ? field : Object.keys(field).shift()))
229
- .filter((field) => field !== 'reviews');
230
- return _super.find.call(this, Object.assign(Object.assign({}, options), { filters: Object.assign(Object.assign({}, filters), { productId: { operator: Where.ISNULL } }), fields: bindFields }));
231
- });
232
- }
233
- getBySlug(slug) {
234
- var _a;
235
- return __awaiter(this, void 0, void 0, function* () {
236
- const result = yield this.find({
237
- filters: {
238
- slug,
239
- },
240
- fields: this.fields.map((field) => typeof field === 'string' ? field : Object.keys(field).shift()),
241
- options: {
242
- enableCount: false,
243
- },
244
- });
245
- const product = (_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.shift();
246
- return product;
247
- });
248
- }
249
- update(params) {
250
- const _super = Object.create(null, {
251
- update: { get: () => super.update }
252
- });
253
- return __awaiter(this, void 0, void 0, function* () {
254
- const { categories, kitProducts, reviews, id: checkId, rate, metadata } = params, data = __rest(params, ["categories", "kitProducts", "reviews", "id", "rate", "metadata"]);
255
- const plainData = this.paramsToPlain({ id: checkId });
256
- const id = yield this.getId(plainData.id);
257
- const product = yield _super.update.call(this, Object.assign({ id }, data));
258
- product.categories = categories && (yield this.updateCategories(+id, { categories }));
259
- product.kitProducts = kitProducts && (yield this.updateKitProducts(+id, { kitProducts }));
260
- product.reviews = reviews && (yield this.updateReviews(+id, { reviews }));
261
- product.metadata = metadata && (yield this.updateMetadata(+id, { metadata }));
262
- return product;
263
- });
264
- }
265
- fetchReviews(status) {
266
- return __awaiter(this, void 0, void 0, function* () {
267
- const reviewsExpression = {
268
- status: status === 'pending'
269
- ? { [HasuraGraphQLWhere.ISNULL]: true }
270
- : { [HasuraGraphQLWhere.EQUALS]: status === 'approved' },
271
- };
272
- const { product: data } = yield this.query('product', ['id', 'name', 'sku', { reviews: { columnName: 'reviews', fields: this.reviewsFields } }], {
273
- where: { value: { reviews: reviewsExpression }, type: 'product_bool_exp', required: true },
274
- });
275
- return data.reduce((reviews, product) => [
276
- ...reviews,
277
- ...product.reviews
278
- .filter((review) => (status === 'pending' && [undefined, null].includes(review.status)) ||
279
- (status === 'approved' && review.status === true) ||
280
- (status === 'rejected' && review.status === false))
281
- .map((review) => (Object.assign(Object.assign({}, this.bindReviewToModel(review)), { productId: product.id, productName: product.name, productSku: product.sku }))),
282
- ], []);
283
- });
284
- }
285
- updateCategories(productId, { categories }) {
286
- return __awaiter(this, void 0, void 0, function* () {
287
- if ('action' in categories && categories.action === 'remove') {
288
- yield this.mutation('delete_category_product', ['affected_rows'], {
289
- where: {
290
- type: 'category_product_bool_exp',
291
- required: true,
292
- value: { product_id: { _eq: productId } },
293
- },
294
- });
295
- return [];
296
- }
297
- const plainData = this.paramsToPlain({ categories });
298
- if (!plainData.categories || plainData.categories.length <= 0)
299
- return [];
300
- yield this.mutation('delete_category_product', ['affected_rows'], {
301
- where: {
302
- type: 'category_product_bool_exp',
303
- required: true,
304
- value: { product_id: { _eq: productId } },
305
- },
306
- });
307
- yield this.mutation('insert_category_product', ['affected_rows'], {
308
- objects: {
309
- type: '[category_product_insert_input!]',
310
- required: true,
311
- value: plainData.categories.map((categoryId) => ({ category_id: categoryId, product_id: productId })),
312
- },
313
- });
314
- return plainData.categories;
315
- });
316
- }
317
- updateKitProducts(productId, { kitProducts }) {
318
- return __awaiter(this, void 0, void 0, function* () {
319
- const plainData = this.paramsToPlain({ kitProducts });
320
- yield this.mutation('delete_product_kit', ['affected_rows'], {
321
- where: {
322
- type: 'product_kit_bool_exp',
323
- required: true,
324
- value: { kit_product_id: { _eq: productId } },
325
- },
326
- });
327
- yield this.mutation('insert_product_kit', ['affected_rows'], {
328
- objects: {
329
- type: '[product_kit_insert_input!]',
330
- required: true,
331
- value: plainData.kitProducts.map((kitProduct) => ({
332
- kit_product_id: productId,
333
- product_id: kitProduct.productId || kitProduct.product.id,
334
- quantity: kitProduct.quantity,
335
- })),
336
- },
337
- });
338
- return plainData.kitProducts;
339
- });
340
- }
341
- updateReviews(productId, { reviews }) {
342
- return __awaiter(this, void 0, void 0, function* () {
343
- if (!reviews)
344
- return [];
345
- if ('action' in reviews && reviews.action === 'remove') {
346
- const reviewIds = yield Promise.all(reviews.value.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
347
- const review = yield this.findReview(reviewData, productId);
348
- return review === null || review === void 0 ? void 0 : review.id;
349
- })));
350
- yield this.mutation('delete_product_review', ['affected_rows'], {
351
- where: { value: { id: { _in: reviewIds.filter(Boolean) } }, type: 'product_review_bool_exp', required: true },
352
- });
353
- return reviews.value.map((review, index) => !reviewIds[index] && review).filter(Boolean);
354
- }
355
- const plainData = this.paramsToPlain({ reviews });
356
- if (!plainData.reviews || plainData.reviews.length <= 0)
357
- return [];
358
- return Promise.all(plainData.reviews.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
359
- const review = yield this.findReview(reviewData, productId);
360
- if (review.id)
361
- return this.bindReviewToModel((yield this.mutation('update_product_review_by_pk', this.reviewsFields, {
362
- pk_columns: {
363
- value: { id: review.id },
364
- type: 'product_review_pk_columns_input',
365
- required: true,
366
- },
367
- _set: {
368
- value: omit(this.bindReviewToHasura(reviewData), ['id', 'product_id']),
369
- type: 'product_review_set_input',
370
- required: true,
371
- },
372
- })).update_product_review_by_pk);
373
- return this.bindReviewToModel((yield this.mutation('insert_product_review_one', this.reviewsFields, {
374
- object: {
375
- value: omit(Object.assign(Object.assign({}, this.bindReviewToHasura(reviewData)), { product_id: productId }), ['id']),
376
- type: 'product_review_insert_input',
377
- required: true,
378
- },
379
- })).insert_product_review_one);
380
- })));
381
- });
382
- }
383
- updateMetadata(productId, { metadata }) {
384
- return __awaiter(this, void 0, void 0, function* () {
385
- const plainData = this.paramsToPlain({ metadata });
386
- if (!plainData.metadata)
387
- return;
388
- yield this.mutation('update_product_metadata_by_pk', ['product_id'], {
389
- pk_columns: {
390
- value: { product_id: productId },
391
- type: 'product_metadata_pk_columns_input',
392
- required: true,
393
- },
394
- _set: {
395
- value: omit(metadata, ['product_id']),
396
- type: 'product_metadata_set_input',
397
- required: true,
398
- },
399
- });
400
- return plainData.metadata;
401
- });
402
- }
403
- getId(id) {
404
- var _a, _b;
405
- return __awaiter(this, void 0, void 0, function* () {
406
- if (!Number.isNaN(+id))
407
- return id;
408
- const { data } = yield this.find({ filters: { firestoreId: id }, options: { enableCount: false } });
409
- if ((_a = data === null || data === void 0 ? void 0 : data[0]) === null || _a === void 0 ? void 0 : _a.id)
410
- return (_b = data === null || data === void 0 ? void 0 : data[0]) === null || _b === void 0 ? void 0 : _b.id;
411
- throw new NotFoundError(`Product with id ${id} not found`);
412
- });
413
- }
414
- findReviewsByProduct(productId) {
415
- return __awaiter(this, void 0, void 0, function* () {
416
- const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
417
- where: {
418
- value: {
419
- product_id: { _eq: productId },
420
- },
421
- type: 'product_review_bool_exp',
422
- required: true,
423
- },
424
- });
425
- return data && data.map((review) => this.bindReviewToModel(review));
426
- });
427
- }
428
- findReview(review, productId) {
429
- return __awaiter(this, void 0, void 0, function* () {
430
- if (review.id)
431
- return review;
432
- let loadedReview;
433
- if (review.personId)
434
- loadedReview = yield this.getReviewByPersonId(review.personId, productId, review.orderId);
435
- if (!loadedReview && review.author && review.email)
436
- loadedReview = yield this.getReviewByAuthorAndEmail(review.author, review.email, productId, review.orderId);
437
- return loadedReview || review;
438
- });
439
- }
440
- getReviewByPersonId(personId, productId, orderId) {
441
- return __awaiter(this, void 0, void 0, function* () {
442
- const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
443
- where: {
444
- value: Object.assign({ product_id: { _eq: productId }, person_id: { _eq: personId } }, (orderId && { order_id: { _eq: orderId } })),
445
- type: `product_review_bool_exp`,
446
- required: true,
447
- },
448
- });
449
- return data && data[0] && this.bindReviewToModel(data[0]);
450
- });
451
- }
452
- getReviewByAuthorAndEmail(author, email, productId, orderId) {
453
- return __awaiter(this, void 0, void 0, function* () {
454
- const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
455
- where: {
456
- value: Object.assign({ product_id: { _eq: productId }, author: { _eq: author }, email: { _eq: email } }, (orderId && { order_id: { _eq: orderId } })),
457
- type: `product_review_bool_exp`,
458
- required: true,
459
- },
460
- });
461
- return data && data[0] && this.bindReviewToModel(data[0]);
462
- });
463
- }
464
- }
465
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC9zcmMvaW5mcmEvaGFzdXJhLWdyYXBocWwvcmVwb3NpdG9yaWVzL2NhdGFsb2cvcHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBY0wsS0FBSyxHQUNOLE1BQU0sb0JBQW9CLENBQUE7QUFDM0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBb0JuRCxNQUFNLE9BQU8sOEJBQ1gsU0FBUSxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFzQjVFLFlBQVksUUFBZ0IsRUFBRSxXQUFxQztRQUNqRSxLQUFLLENBQUM7WUFDSixTQUFTLEVBQUUsU0FBUztZQUNwQixLQUFLLEVBQUUsb0JBQW9CO1lBQzNCLFFBQVE7WUFDUixXQUFXO1lBQ1gsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDLENBQUE7UUEyZ0JJLHNCQUFpQixHQUFHLENBQUMsS0FBMEIsRUFBaUIsRUFBRSxDQUFDLGlDQUN0RSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEtBQ25GLFNBQVMsRUFBRSxPQUFP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Q0FBQyxDQUFBO1lBRUYsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMzRCxDQUFDO0tBQUE7SUFFYSx5QkFBeUIsQ0FDckMsTUFBYyxFQUNkLEtBQWEsRUFDYixTQUFpQixFQUNqQixPQUFnQjs7WUFFaEIsTUFBTSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEYsS0FBSyxFQUFFO29CQUNMLEtBQUssa0JBQ0gsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUM5QixNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQ3ZCLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFDbEIsQ0FBQyxPQUFPLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUMvQztvQkFDRCxJQUFJLEVBQUUseUJBQXlCO29CQUMvQixRQUFRLEVBQUUsSUFBSTtpQkFDZjthQUNGLENBQUMsQ0FBQTtZQUVGLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDM0QsQ0FBQztLQUFBO0NBZUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDcmVhdGVSZXBvc2l0b3J5UGFyYW1zLFxuICBGaW5kUmVwb3NpdG9yeVBhcmFtcyxcbiAgR2V0UmVwb3NpdG9yeVBhcmFtcyxcbiAgTm9uRnVuY3Rpb25Qcm9wZXJ0eU5hbWVzLFxuICBQcm9kdWN0TWV0YWRhdGEsXG4gIFByb2R1Y3RSZXBvc2l0b3J5LFxuICBQcm9kdWN0UmV2aWV3LFxuICBSZXBvc2l0b3J5RmluZFJlc3VsdCxcbiAgUmV2aWV3U3RhdHVzUGFyYW1zLFxuICBSZXZpZXdXaXRoUHJvZHVjdERhdGEsXG4gIFNob3BQcmljZSxcbiAgU2hvcHMsXG4gIFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXMsXG4gIFdoZXJlLFxufSBmcm9tICcuLi8uLi8uLi8uLi9kb21haW4nXG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vZXJyb3JzJ1xuaW1wb3J0IHsgQmFzZSwgaXNOaWwsIG9taXQgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscydcbmltcG9ydCB7IEhhc3VyYUdyYXBoUUxDb2x1bW5UeXBlLCBIYXN1cmFHcmFwaFFMV2hlcmUgfSBmcm9tICcuLi8uLi9lbnVtcydcbmltcG9ydCB7IHdpdGhDcnVkSGFzdXJhR3JhcGhRTCwgd2l0aEhhc3VyYUdyYXBoUUwgfSBmcm9tICcuLi8uLi9taXhpbnMnXG5pbXBvcnQgeyBQcm9kdWN0SGFzdXJhR3JhcGhRTCB9IGZyb20gJy4uLy4uL21vZGVscydcbmltcG9ydCB7IEhhc3VyYUdyYXBoUUxBdXRoT3B0aW9ucywgSGFzdXJhR3JhcGhRTEZpZWxkcyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuXG50eXBlIFByb2R1Y3RSZXZpZXdGaWVsZHMgPSB7XG4gIGlkPzogc3RyaW5nXG4gIHNob3A6IFNob3BzXG4gIHJhdGU6IG51bWJlclxuICBhdXRob3I/OiBzdHJpbmdcbiAgZW1haWw/OiBzdHJpbmdcbiAgbG9jYXRpb24/OiBzdHJpbmdcbiAgcmV2aWV3Pzogc3RyaW5nXG4gIHN0YXR1cz86IGJvb2xlYW5cbiAgdGl0bGU/OiBzdHJpbmdcbiAgcGVyc29uSWQ/OiBudW1iZXJcbiAgcG9pbnRzPzogbnVtYmVyXG4gIG9yZGVySWQ/OiBzdHJpbmdcbiAgY3JlYXRlZEF0PzogRGF0ZVxuICB1cGRhdGVkQXQ/OiBEYXRlXG59XG5cbmV4cG9ydCBjbGFzcyBQcm9kdWN0SGFzdXJhR3JhcGhRTFJlcG9zaXRvcnlcbiAgZXh0ZW5kcyB3aXRoQ3J1ZEhhc3VyYUdyYXBoUUwod2l0aEhhc3VyYUdyYXBoUUw8UHJvZHVjdEhhc3VyYUdyYXBoUUw+KEJhc2UpKVxuICBpbXBsZW1lbnRzIFByb2R1Y3RSZXBvc2l0b3J5XG57XG4gIHByaXZhdGUgZ2V0IHJldmlld3NGaWVsZHMoKTogYW55IHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2lkJyxcbiAgICAgICdzaG9wJyxcbiAgICAgICdyYXRlJyxcbiAgICAgICdhdXRob3InLFxuICAgICAgJ2VtYWlsJyxcbiAgICAgICdsb2NhdGlvbicsXG4gICAgICAncmV2aWV3JyxcbiAgICAgICdzdGF0dXMnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgIHsgcGVyc29uSWQ6IHsgY29sdW1uTmFtZTogJ3BlcnNvbl9pZCcgfSB9LFxuICAgICAgJ3BvaW50cycsXG4gICAgICB7IG9yZGVySWQ6IHsgY29sdW1uTmFtZTogJ29yZGVyX2lkJyB9IH0sXG4gICAgICB7IGNyZWF0ZWRBdDogeyBjb2x1bW5OYW1lOiAnY3JlYXRlZF9hdCcgfSB9LFxuICAgICAgeyB1cGRhdGVkQXQ6IHsgY29sdW1uTmFtZTogJ3VwZGF0ZWRfYXQnIH0gfSxcbiAgICBdXG4gIH1cblxuICBjb25zdHJ1Y3RvcihlbmRwb2ludDogc3RyaW5nLCBhdXRoT3B0aW9uczogSGFzdXJhR3JhcGhRTEF1dGhPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdGFibGVOYW1lOiAncHJvZHVjdCcsXG4gICAgICBtb2RlbDogUHJvZHVjdEhhc3VyYUdyYXBoUUwsXG4gICAgICBlbmRwb2ludCxcbiAgICAgIGF1dGhPcHRpb25zLFxuICAgICAgZmllbGRzOiBbXSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29tbW9uRmllbGRzOiBIYXN1cmFHcmFwaFFMRmllbGRzPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiA9IFtcbiAgICAgIHsgaWQ6IHsgY29sdW1uTmFtZTogJ2lkJywgdG86ICh2YWx1ZSkgPT4gK3ZhbHVlLCBmcm9tOiAodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKCkgfSB9LFxuICAgICAgeyBmaXJlc3RvcmVJZDogeyBjb2x1bW5OYW1lOiAnZmlyZXN0b3JlX2lkJyB9IH0sXG4gICAgICB7IHByb2R1Y3RJZDogeyBjb2x1bW5OYW1lOiAnbWFpbl9wcm9kdWN0X2lkJyB9IH0sXG4gICAgICB7IENFU1Q6IHsgY29sdW1uTmFtZTogJ2Nlc3QnIH0gfSxcbiAgICAgIHsgRUFOOiB7IGNvbHVtbk5hbWU6ICdlYW4nIH0gfSxcbiAgICAgIHsgTkNNOiB7IGNvbHVtbk5hbWU6ICduY20nIH0gfSxcbiAgICAgICdicmFuZCcsXG4gICAgICB7IGNvc3RQcmljZTogeyBjb2x1bW5OYW1lOiAnY29zdF9wcmljZScgfSB9LFxuICAgICAge1xuICAgICAgICBkZXNjcmlwdGlvbjoge1xuICAgICAgICAgIGNvbHVtbk5hbWU6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgZnJvbTogKGRlc2NyaXB0aW9uLCBkYXRhKSA9PiAoe1xuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBkaWZmZXJlbnRpYWxzOiBkYXRhLmRpZmZlcmVudGlhbHMsXG4gICAgICAgICAgICB3aG9NdXN0VXNlOiBkYXRhLndob19tdXN0X3VzZSxcbiAgICAgICAgICAgIGhvd1RvVXNlOiBkYXRhLmhvd190b191c2UsXG4gICAgICAgICAgICBicmFuZDogZGF0YS5icmFuZF9kZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBiaW5kRmluZEZpbHRlcjogKHNlbnRlbmNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gT2JqZWN0LnZhbHVlcyhzZW50ZW5jZSkuc2hpZnQoKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi4oZmlsdGVycz8uZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbjogZmlsdGVycy5kZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICAgICAgLi4uKGZpbHRlcnMuZGlmZmVyZW50aWFscyAmJiB7IGRpZmZlcmVudGlhbHM6IGZpbHRlcnMuZGlmZmVyZW50aWFscyB9KSxcbiAgICAgICAgICAgICAgLi4uKGZpbHRlcnMud2hvTXVzdFVzZSAmJiB7XG4gICAgICAgICAgICAgICAgd2hvX211c3RfdXNlOiBmaWx0ZXJzLndob011c3RVc2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAuLi4oZmlsdGVycy5ob3dUb1VzZSAmJiB7XG4gICAgICAgICAgICAgICAgaG93X3RvX3VzZTogZmlsdGVycy5ob3dUb1VzZSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC4uLihmaWx0ZXJzLmJyYW5kICYmIHtcbiAgICAgICAgICAgICAgICBicmFuZF9kZXNjcmlwdGlvbjogZmlsdGVycy5icmFuZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBiaW5kUGVyc2lzdERhdGE6IChkZXNjcmlwdGlvbkRhdGEpID0+ICh7XG4gICAgICAgICAgICAuLi4oZGVzY3JpcHRpb25EYXRhPy5kZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbkRhdGEuZGVzY3JpcHRpb24gfSksXG4gICAgICAgICAgICAuLi4oZGVzY3JpcHRpb25EYXRhLmRpZmZlcmVudGlhbHMgJiYgeyBkaWZmZXJlbnRpYWxzOiBkZXNjcmlwdGlvbkRhdGEuZGlmZmVyZW50aWFscyB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbkRhdGEud2hvTXVzdFVzZSAmJiB7XG4gICAgICAgICAgICAgIHdob19tdXN0X3VzZTogZGVzY3JpcHRpb25EYXRhLndob011c3RVc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbkRhdGEuaG93VG9Vc2UgJiYgeyBob3dfdG9fdXNlOiBkZXNjcmlwdGlvbkRhdGEuaG93VG9Vc2UgfSksXG4gICAgICAgICAgICAuLi4oZGVzY3JpcHRpb25EYXRhLmJyYW5kICYmIHsgYnJhbmRfZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uRGF0YS5icmFuZCB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IGRpZmZlcmVudGlhbHM6IHsgY29sdW1uTmFtZTogJ2RpZmZlcmVudGlhbHMnIH0gfSxcbiAgICAgIHsgd2hvTXVzdFVzZTogeyBjb2x1bW5OYW1lOiAnd2hvX211c3RfdXNlJyB9IH0sXG4gICAgICB7IGhvd1RvVXNlOiB7IGNvbHVtbk5hbWU6ICdob3dfdG9fdXNlJyB9IH0sXG4gICAgICB7IGJyYW5kRGVzY3JpcHRpb246IHsgY29sdW1uTmFtZTogJ2JyYW5kX2Rlc2NyaXB0aW9uJyB9IH0sXG4gICAgICB7IGhhc1ZhcmlhbnRzOiB7IGNvbHVtbk5hbWU6ICdoYXNfdmFyaWFudHMnIH0gfSxcbiAgICAgIHtcbiAgICAgICAgaW1hZ2VzOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ2ltYWdlcycsXG4gICAgICAgICAgdG86ICh2YWx1ZSkgPT4gKHZhbHVlPy5sZW5ndGggPiAwID8gYHtcIiR7dmFsdWU/LmpvaW4/LihgXCIsXCJgKSB8fCAnJ31cIn1gIDogYHt9YCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtaW5pYXR1cmVzOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ21pbmlhdHVyZXMnLFxuICAgICAgICAgIHRvOiAodmFsdWUpID0+ICh2YWx1ZT8ubGVuZ3RoID4gMCA/IGB7XCIke3ZhbHVlPy5qb2luPy4oYFwiLFwiYCkgfHwgJyd9XCJ9YCA6IGB7fWApLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgICduYW1lJyxcbiAgICAgIHtcbiAgICAgICAgcHJpY2U6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAncHJpY2UnLFxuICAgICAgICAgIGZyb206IChwcmljZSwgZGF0YSk6IFNob3BQcmljZSA9PiAoe1xuICAgICAgICAgICAgcHJpY2UsXG4gICAgICAgICAgICBmdWxsUHJpY2U6IGRhdGEuZnVsbF9wcmljZSxcbiAgICAgICAgICAgIHN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2U6IGRhdGEuc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlLFxuICAgICAgICAgICAgc3Vic2NyaWJlclByaWNlOiBkYXRhLnN1YnNjcmliZXJfcHJpY2UsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgYmluZEZpbmRGaWx0ZXI6IChzZW50ZW5jZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IE9iamVjdC52YWx1ZXMoc2VudGVuY2UpLnNoaWZ0KClcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzPy5wcmljZSB8fCBmaWx0ZXJzPy5wcmljZSA9PT0gMCkgJiYgeyBwcmljZTogZmlsdGVycy5wcmljZSB9KSxcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzLmZ1bGxQcmljZSB8fCBmaWx0ZXJzLmZ1bGxQcmljZSA9PT0gMCkgJiYgeyBmdWxsX3ByaWNlOiBmaWx0ZXJzLmZ1bGxQcmljZSB9KSxcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UgfHwgZmlsdGVycy5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlID09PSAwKSAmJiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlOiBmaWx0ZXJzLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAuLi4oKGZpbHRlcnMuc3Vic2NyaWJlclByaWNlIHx8IGZpbHRlcnMuc3Vic2NyaWJlclByaWNlID09PSAwKSAmJiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9wcmljZTogZmlsdGVycy5zdWJzY3JpYmVyUHJpY2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmluZFBlcnNpc3REYXRhOiAocHJpY2VEYXRhKSA9PiAoe1xuICAgICAgICAgICAgLi4uKHByaWNlRGF0YT8ucHJpY2UgPj0gMCAmJiB7IHByaWNlOiBwcmljZURhdGEucHJpY2UgfSksXG4gICAgICAgICAgICAuLi4ocHJpY2VEYXRhLmZ1bGxQcmljZSA+PSAwICYmIHsgZnVsbF9wcmljZTogcHJpY2VEYXRhLmZ1bGxQcmljZSB9KSxcbiAgICAgICAgICAgIC4uLihwcmljZURhdGEuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSA+PSAwICYmIHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlOiBwcmljZURhdGEuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLi4uKHByaWNlRGF0YS5zdWJzY3JpYmVyUHJpY2UgPj0gMCAmJiB7IHN1YnNjcmliZXJfcHJpY2U6IHByaWNlRGF0YS5zdWJzY3JpYmVyUHJpY2UgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgeyBmdWxsUHJpY2U6IHsgY29sdW1uTmFtZTogJ2Z1bGxfcHJpY2UnIH0gfSxcbiAgICAgIHsgc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZTogeyBjb2x1bW5OYW1lOiAnc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlJyB9IH0sXG4gICAgICB7IHN1YnNjcmliZXJQcmljZTogeyBjb2x1bW5OYW1lOiAnc3Vic2NyaWJlcl9wcmljZScgfSB9LFxuICAgICAgJ3B1Ymxpc2hlZCcsXG4gICAgICAnc2t1JyxcbiAgICAgIHtcbiAgICAgICAgc3RvY2s6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnc3RvY2snLFxuICAgICAgICAgIGZyb206IChxdWFudGl0eTogbnVtYmVyKSA9PiAoeyBxdWFudGl0eSB9KSxcbiAgICAgICAgICB0bzogKHZhbHVlKSA9PiAoaXNOaWwodmFsdWU/LnF1YW50aXR5KSA/IHZhbHVlIDogdmFsdWU/LnF1YW50aXR5KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAnc2x1ZycsXG4gICAgICAndHlwZScsXG4gICAgICAndmlkZW8nLFxuICAgICAgJ3dlaWdodCcsXG4gICAgICAnZ2VuZGVyJyxcbiAgICAgIHsgdGFnczogeyBjb2x1bW5OYW1lOiAndGFncycsIHR5cGU6IEhhc3VyYUdyYXBoUUxDb2x1bW5UeXBlLkpzb25iIH0gfSxcbiAgICAgIHsgaXNLaXQ6IHsgY29sdW1uTmFtZTogJ2lzX2tpdCcgfSB9LFxuICAgICAgeyBjcmVhdGVkQXQ6IHsgY29sdW1uTmFtZTogJ2NyZWF0ZWRfYXQnIH0gfSxcbiAgICAgIHsgdXBkYXRlZEF0OiB7IGNvbHVtbk5hbWU6ICd1cGRhdGVkX2F0JyB9IH0sXG4gICAgICB7XG4gICAgICAgIHJhdGU6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAncmV2aWV3c19hZ2dyZWdhdGUnLFxuICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgIGZpbHRlcnM6IHsgc3RhdHVzOiB0cnVlIH0sXG4gICAgICAgICAgICBmaWx0ZXJUeXBlOiAncHJvZHVjdF9yZXZpZXdfYm9vbF9leHAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbeyBhZ2dyZWdhdGU6IFt7IGF2ZzogWydyYXRlJ10gfV0gfV0sXG4gICAgICAgICAgZnJvbTogKHZhbHVlKSA9PiB2YWx1ZS5hZ2dyZWdhdGUuYXZnLnJhdGUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgeyBzaG9wcGluZ0NvdW50OiB7IGNvbHVtbk5hbWU6ICdzaG9wcGluZ19jb3VudCcgfSB9LFxuICAgIF1cblxuICAgIHRoaXMuZmllbGRzID0gW1xuICAgICAgLi4uY29tbW9uRmllbGRzLFxuICAgICAge1xuICAgICAgICBjYXRlZ29yaWVzOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgIGZpZWxkczogWydjYXRlZ29yeV9pZCddLFxuICAgICAgICAgIGJpbmRQZXJzaXN0RGF0YTogKHZhbHVlKSA9PiAoe1xuICAgICAgICAgICAgY2F0ZWdvcmllczogeyBkYXRhOiB2YWx1ZS5tYXAoKGNhdGVnb3J5KSA9PiAoeyBjYXRlZ29yeV9pZDogK2NhdGVnb3J5IH0pKSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRvOiAoY2F0ZWdvcmllcykgPT4gY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5SWQpID0+ICtjYXRlZ29yeUlkKSxcbiAgICAgICAgICBmcm9tOiAoY2F0ZWdvcmllczogeyBjYXRlZ29yeV9pZDogbnVtYmVyIH1bXSkgPT5cbiAgICAgICAgICAgIGNhdGVnb3JpZXM/Lm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5Py5jYXRlZ29yeV9pZD8udG9TdHJpbmcoKSkgfHwgW10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBraXRQcm9kdWN0czoge1xuICAgICAgICAgIGNvbHVtbk5hbWU6ICdraXRfcHJvZHVjdHMnLFxuICAgICAgICAgIGZvcmVpZ25LZXlDb2x1bW46IHsgcHJvZHVjdElkOiAnaWQnIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IHByb2R1Y3RJZDogeyBjb2x1bW5OYW1lOiAncHJvZHVjdF9pZCcgfSB9LFxuICAgICAgICAgICAgeyBraXRQcm9kdWN0SWQ6IHsgY29sdW1uTmFtZTogJ2tpdF9wcm9kdWN0X2lkJyB9IH0sXG4gICAgICAgICAgICAncXVhbnRpdHknLFxuICAgICAgICAgICAgeyBwcm9kdWN0OiB7IGNvbHVtbk5hbWU6ICdwcm9kdWN0JywgZm9yZWlnbktleUNvbHVtbjogeyBpZDogJ3Byb2R1Y3RfaWQnIH0sIGZpZWxkczogY29tbW9uRmllbGRzIH0gfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcmV2aWV3czoge1xuICAgICAgICAgIGNvbHVtbk5hbWU6ICdyZXZpZXdzJyxcbiAgICAgICAgICBmb3JlaWduS2V5Q29sdW1uOiB7IHByb2R1Y3RfaWQ6ICdpZCcgfSxcbiAgICAgICAgICBmaWVsZHM6IHRoaXMucmV2aWV3c0ZpZWxkcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ21ldGFkYXRhJyxcbiAgICAgICAgICBmaWVsZHM6IFsndGl0bGUnLCAnZGVzY3JpcHRpb24nXSxcbiAgICAgICAgICBiaW5kUGVyc2lzdERhdGE6ICh2YWx1ZSkgPT4gKHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7IGRhdGE6IHZhbHVlIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShwYXJhbXM6IENyZWF0ZVJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+KTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTD4ge1xuICAgIGNvbnN0IHsgbWV0YWRhdGEsIC4uLmRhdGEgfSA9IHBhcmFtc1xuICAgIGNvbnN0IHByb2R1Y3QgPSBhd2FpdCBzdXBlci5jcmVhdGUoXG4gICAgICBvbWl0KHsgLi4uZGF0YSwgbWV0YWRhdGE6IG1ldGFkYXRhIHx8IHsgZGVzY3JpcHRpb246IG51bGwsIHRpdGxlOiBudWxsIH0gfSwgWydyZXZpZXdzJ10pLFxuICAgIClcblxuICAgIHRyeSB7XG4gICAgICBwcm9kdWN0LnJldmlld3MgPSBkYXRhLnJldmlld3MgJiYgKGF3YWl0IHRoaXMudXBkYXRlUmV2aWV3cygrcHJvZHVjdC5pZCwgZGF0YSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKHsgaWQ6IHByb2R1Y3QuaWQgfSlcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvZHVjdFxuICB9XG5cbiAgYXN5bmMgZ2V0KGlkZW50aWZpZXJzOiBHZXRSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPik6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcbiAgICBjb25zdCBwcm9kdWN0ID0gTnVtYmVyLmlzTmFOKCtpZGVudGlmaWVycy5pZClcbiAgICAgID8gKGF3YWl0IHRoaXMuZmluZCh7IGZpbHRlcnM6IHsgZmlyZXN0b3JlSWQ6IGlkZW50aWZpZXJzLmlkIH0sIG9wdGlvbnM6IHsgZW5hYmxlQ291bnQ6IGZhbHNlIH0gfSkpLmRhdGE/LlswXVxuICAgICAgOiBhd2FpdCBzdXBlci5nZXQoaWRlbnRpZmllcnMpXG5cbiAgICBpZiAocHJvZHVjdC5wcm9kdWN0SWQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdQcm9kdWN0IG5vdCBmb3VuZCwgaXQgaXMgYSB2YXJpYW50JylcblxuICAgIHByb2R1Y3QucmV2aWV3cyA9IHByb2R1Y3QucmV2aWV3cyB8fCAoYXdhaXQgdGhpcy5maW5kUmV2aWV3c0J5UHJvZHVjdCgrcHJvZHVjdC5pZCkpXG5cbiAgICByZXR1cm4gcHJvZHVjdFxuICB9XG5cbiAgYXN5bmMgZmluZChwYXJhbXM/OiBGaW5kUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4pOiBQcm9taXNlPFJlcG9zaXRvcnlGaW5kUmVzdWx0PFByb2R1Y3RIYXN1cmFHcmFwaFFMPj4ge1xuICAgIGNvbnN0IHsgZmlsdGVycywgZmllbGRzLCAuLi5vcHRpb25zIH0gPSBwYXJhbXMgfHwge31cbiAgICBjb25zdCBiaW5kRmllbGRzID1cbiAgICAgIGZpZWxkcyB8fFxuICAgICAgKHRoaXMuZmllbGRzXG4gICAgICAgIC5tYXAoKGZpZWxkKSA9PiAodHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJyA/IGZpZWxkIDogT2JqZWN0LmtleXMoZmllbGQpLnNoaWZ0KCkpKVxuICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gZmllbGQgIT09ICdyZXZpZXdzJykgYXMgTm9uRnVuY3Rpb25Qcm9wZXJ0eU5hbWVzPFxuICAgICAgICBQcm9kdWN0SGFzdXJhR3JhcGhRTCxcbiAgICAgICAga2V5b2YgUHJvZHVjdEhhc3VyYUdyYXBoUUxcbiAgICAgID5bXSlcblxuICAgIHJldHVybiBzdXBlci5maW5kKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBmaWx0ZXJzOiB7IC4uLmZpbHRlcnMsIHByb2R1Y3RJZDogeyBvcGVyYXRvcjogV2hlcmUuSVNOVUxMIH0gfSxcbiAgICAgIGZpZWxkczogYmluZEZpZWxkcyxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZ2V0QnlTbHVnKHNsdWc6IHN0cmluZyk6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmZpbmQoe1xuICAgICAgZmlsdGVyczoge1xuICAgICAgICBzbHVnLFxuICAgICAgfSxcbiAgICAgIGZpZWxkczogdGhpcy5maWVsZHMubWFwKChmaWVsZCkgPT5cbiAgICAgICAgdHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJyA/IGZpZWxkIDogT2JqZWN0LmtleXMoZmllbGQpLnNoaWZ0KCksXG4gICAgICApIGFzIE5vbkZ1bmN0aW9uUHJvcGVydHlOYW1lczxQcm9kdWN0SGFzdXJhR3JhcGhRTCwga2V5b2YgUHJvZHVjdEhhc3VyYUdyYXBoUUw+W10sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGVuYWJsZUNvdW50OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHByb2R1Y3QgPSByZXN1bHQ/LmRhdGE/LnNoaWZ0KClcblxuICAgIHJldHVybiBwcm9kdWN0XG4gIH1cblxuICBhc3luYyB1cGRhdGUocGFyYW1zOiBVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPik6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcbiAgICBjb25zdCB7IGNhdGVnb3JpZXMsIGtpdFByb2R1Y3RzLCByZXZpZXdzLCBpZDogY2hlY2tJZCwgcmF0ZSwgbWV0YWRhdGEsIC4uLmRhdGEgfSA9IHBhcmFtc1xuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IGlkOiBjaGVja0lkIH0pXG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLmdldElkKHBsYWluRGF0YS5pZClcbiAgICBjb25zdCBwcm9kdWN0ID0gYXdhaXQgc3VwZXIudXBkYXRlKHsgaWQsIC4uLmRhdGEgfSlcblxuICAgIHByb2R1Y3QuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXMgJiYgKGF3YWl0IHRoaXMudXBkYXRlQ2F0ZWdvcmllcygraWQsIHsgY2F0ZWdvcmllcyB9KSlcbiAgICBwcm9kdWN0LmtpdFByb2R1Y3RzID0ga2l0UHJvZHVjdHMgJiYgKGF3YWl0IHRoaXMudXBkYXRlS2l0UHJvZHVjdHMoK2lkLCB7IGtpdFByb2R1Y3RzIH0pKVxuICAgIHByb2R1Y3QucmV2aWV3cyA9IHJldmlld3MgJiYgKGF3YWl0IHRoaXMudXBkYXRlUmV2aWV3cygraWQsIHsgcmV2aWV3cyB9KSlcbiAgICBwcm9kdWN0Lm1ldGFkYXRhID0gbWV0YWRhdGEgJiYgKGF3YWl0IHRoaXMudXBkYXRlTWV0YWRhdGEoK2lkLCB7IG1ldGFkYXRhIH0pKVxuXG4gICAgcmV0dXJuIHByb2R1Y3RcbiAgfVxuXG4gIGFzeW5jIGZldGNoUmV2aWV3cyhzdGF0dXM6IFJldmlld1N0YXR1c1BhcmFtcyk6IFByb21pc2U8UmV2aWV3V2l0aFByb2R1Y3REYXRhW10+IHtcbiAgICBjb25zdCByZXZpZXdzRXhwcmVzc2lvbiA9IHtcbiAgICAgIHN0YXR1czpcbiAgICAgICAgc3RhdHVzID09PSAncGVuZGluZydcbiAgICAgICAgICA/IHsgW0hhc3VyYUdyYXBoUUxXaGVyZS5JU05VTExdOiB0cnVlIH1cbiAgICAgICAgICA6IHsgW0hhc3VyYUdyYXBoUUxXaGVyZS5FUVVBTFNdOiBzdGF0dXMgPT09ICdhcHByb3ZlZCcgfSxcbiAgICB9XG4gICAgY29uc3QgeyBwcm9kdWN0OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KFxuICAgICAgJ3Byb2R1Y3QnLFxuICAgICAgWydpZCcsICduYW1lJywgJ3NrdScsIHsgcmV2aWV3czogeyBjb2x1bW5OYW1lOiAncmV2aWV3cycsIGZpZWxkczogdGhpcy5yZXZpZXdzRmllbGRzIH0gfV0sXG4gICAgICB7XG4gICAgICAgIHdoZXJlOiB7IHZhbHVlOiB7IHJldmlld3M6IHJldmlld3NFeHByZXNzaW9uIH0sIHR5cGU6ICdwcm9kdWN0X2Jvb2xfZXhwJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgcmV0dXJuIGRhdGEucmVkdWNlKFxuICAgICAgKHJldmlld3MsIHByb2R1Y3QpID0+IFtcbiAgICAgICAgLi4ucmV2aWV3cyxcbiAgICAgICAgLi4ucHJvZHVjdC5yZXZpZXdzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChyZXZpZXcpID0+XG4gICAgICAgICAgICAgIChzdGF0dXMgPT09ICdwZW5kaW5nJyAmJiBbdW5kZWZpbmVkLCBudWxsXS5pbmNsdWRlcyhyZXZpZXcuc3RhdHVzKSkgfHxcbiAgICAgICAgICAgICAgKHN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJiByZXZpZXcuc3RhdHVzID09PSB0cnVlKSB8fFxuICAgICAgICAgICAgICAoc3RhdHVzID09PSAncmVqZWN0ZWQnICYmIHJldmlldy5zdGF0dXMgPT09IGZhbHNlKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgocmV2aWV3KSA9PiAoe1xuICAgICAgICAgICAgLi4udGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChyZXZpZXcpLFxuICAgICAgICAgICAgcHJvZHVjdElkOiBwcm9kdWN0LmlkLFxuICAgICAgICAgICAgcHJvZHVjdE5hbWU6IHByb2R1Y3QubmFtZSxcbiAgICAgICAgICAgIHByb2R1Y3RTa3U6IHByb2R1Y3Quc2t1LFxuICAgICAgICAgIH0pKSxcbiAgICAgIF0sXG4gICAgICBbXSBhcyBSZXZpZXdXaXRoUHJvZHVjdERhdGFbXSxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUNhdGVnb3JpZXMoXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXG4gICAgeyBjYXRlZ29yaWVzIH06IFBpY2s8VXBkYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4sICdjYXRlZ29yaWVzJz4sXG4gICk6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUxbJ2NhdGVnb3JpZXMnXT4ge1xuICAgIGlmICgnYWN0aW9uJyBpbiBjYXRlZ29yaWVzICYmIGNhdGVnb3JpZXMuYWN0aW9uID09PSAncmVtb3ZlJykge1xuICAgICAgYXdhaXQgdGhpcy5tdXRhdGlvbignZGVsZXRlX2NhdGVnb3J5X3Byb2R1Y3QnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xuICAgICAgICB3aGVyZToge1xuICAgICAgICAgIHR5cGU6ICdjYXRlZ29yeV9wcm9kdWN0X2Jvb2xfZXhwJyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogeyBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0gfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IGNhdGVnb3JpZXMgfSlcblxuICAgIGlmICghcGxhaW5EYXRhLmNhdGVnb3JpZXMgfHwgcGxhaW5EYXRhLmNhdGVnb3JpZXMubGVuZ3RoIDw9IDApIHJldHVybiBbXVxuXG4gICAgYXdhaXQgdGhpcy5tdXRhdGlvbignZGVsZXRlX2NhdGVnb3J5X3Byb2R1Y3QnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgdHlwZTogJ2NhdGVnb3J5X3Byb2R1Y3RfYm9vbF9leHAnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHsgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9IH0sXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdpbnNlcnRfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XG4gICAgICBvYmplY3RzOiB7XG4gICAgICAgIHR5cGU6ICdbY2F0ZWdvcnlfcHJvZHVjdF9pbnNlcnRfaW5wdXQhXScsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogcGxhaW5EYXRhLmNhdGVnb3JpZXMubWFwKChjYXRlZ29yeUlkKSA9PiAoeyBjYXRlZ29yeV9pZDogY2F0ZWdvcnlJZCwgcHJvZHVjdF9pZDogcHJvZHVjdElkIH0pKSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiBwbGFpbkRhdGEuY2F0ZWdvcmllc1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVLaXRQcm9kdWN0cyhcbiAgICBwcm9kdWN0SWQ6IG51bWJlcixcbiAgICB7IGtpdFByb2R1Y3RzIH06IFBpY2s8VXBkYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4sICdraXRQcm9kdWN0cyc+LFxuICApOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMWydraXRQcm9kdWN0cyddPiB7XG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsga2l0UHJvZHVjdHMgfSlcblxuICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2RlbGV0ZV9wcm9kdWN0X2tpdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XG4gICAgICB3aGVyZToge1xuICAgICAgICB0eXBlOiAncHJvZHVjdF9raXRfYm9vbF9leHAnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHsga2l0X3Byb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSB9LFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5tdXRhdGlvbignaW5zZXJ0X3Byb2R1Y3Rfa2l0JywgWydhZmZlY3RlZF9yb3dzJ10sIHtcbiAgICAgIG9iamVjdHM6IHtcbiAgICAgICAgdHlwZTogJ1twcm9kdWN0X2tpdF9pbnNlcnRfaW5wdXQhXScsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogcGxhaW5EYXRhLmtpdFByb2R1Y3RzLm1hcCgoa2l0UHJvZHVjdCkgPT4gKHtcbiAgICAgICAgICBraXRfcHJvZHVjdF9pZDogcHJvZHVjdElkLFxuICAgICAgICAgIHByb2R1Y3RfaWQ6IGtpdFByb2R1Y3QucHJvZHVjdElkIHx8IGtpdFByb2R1Y3QucHJvZHVjdC5pZCxcbiAgICAgICAgICBxdWFudGl0eToga2l0UHJvZHVjdC5xdWFudGl0eSxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHBsYWluRGF0YS5raXRQcm9kdWN0c1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZXZpZXdzKFxuICAgIHByb2R1Y3RJZDogbnVtYmVyLFxuICAgIHsgcmV2aWV3cyB9OiBQaWNrPFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+LCAncmV2aWV3cyc+LFxuICApOiBQcm9taXNlPFByb2R1Y3RSZXZpZXdbXT4ge1xuICAgIGlmICghcmV2aWV3cykgcmV0dXJuIFtdXG4gICAgaWYgKCdhY3Rpb24nIGluIHJldmlld3MgJiYgcmV2aWV3cy5hY3Rpb24gPT09ICdyZW1vdmUnKSB7XG4gICAgICBjb25zdCByZXZpZXdJZHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmV2aWV3cy52YWx1ZS5tYXAoYXN5bmMgKHJldmlld0RhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCByZXZpZXcgPSBhd2FpdCB0aGlzLmZpbmRSZXZpZXcocmV2aWV3RGF0YSwgcHJvZHVjdElkKVxuXG4gICAgICAgICAgcmV0dXJuIHJldmlldz8uaWRcbiAgICAgICAgfSksXG4gICAgICApXG5cbiAgICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2RlbGV0ZV9wcm9kdWN0X3JldmlldycsIFsnYWZmZWN0ZWRfcm93cyddLCB7XG4gICAgICAgIHdoZXJlOiB7IHZhbHVlOiB7IGlkOiB7IF9pbjogcmV2aWV3SWRzLmZpbHRlcihCb29sZWFuKSB9IH0sIHR5cGU6ICdwcm9kdWN0X3Jldmlld19ib29sX2V4cCcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gcmV2aWV3cy52YWx1ZS5tYXAoKHJldmlldywgaW5kZXgpID0+ICFyZXZpZXdJZHNbaW5kZXhdICYmIHJldmlldykuZmlsdGVyKEJvb2xlYW4pXG4gICAgfVxuXG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsgcmV2aWV3cyB9KVxuXG4gICAgaWYgKCFwbGFpbkRhdGEucmV2aWV3cyB8fCBwbGFpbkRhdGEucmV2aWV3cy5sZW5ndGggPD0gMCkgcmV0dXJuIFtdXG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBwbGFpbkRhdGEucmV2aWV3cy5tYXAoYXN5bmMgKHJldmlld0RhdGEpID0+IHtcbiAgICAgICAgY29uc3QgcmV2aWV3ID0gYXdhaXQgdGhpcy5maW5kUmV2aWV3KHJldmlld0RhdGEsIHByb2R1Y3RJZClcblxuICAgICAgICBpZiAocmV2aWV3LmlkKVxuICAgICAgICAgIHJldHVybiB0aGlzLmJpbmRSZXZpZXdUb01vZGVsKFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCd1cGRhdGVfcHJvZHVjdF9yZXZpZXdfYnlfcGsnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcbiAgICAgICAgICAgICAgICBwa19jb2x1bW5zOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogeyBpZDogcmV2aWV3LmlkIH0sXG4gICAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfcGtfY29sdW1uc19pbnB1dCcsXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF9zZXQ6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBvbWl0KHRoaXMuYmluZFJldmlld1RvSGFzdXJhKHJldmlld0RhdGEpLCBbJ2lkJywgJ3Byb2R1Y3RfaWQnXSksXG4gICAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfc2V0X2lucHV0JyxcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnVwZGF0ZV9wcm9kdWN0X3Jldmlld19ieV9wayxcbiAgICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZFJldmlld1RvTW9kZWwoXG4gICAgICAgICAgKFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tdXRhdGlvbignaW5zZXJ0X3Byb2R1Y3RfcmV2aWV3X29uZScsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xuICAgICAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogb21pdCh7IC4uLnRoaXMuYmluZFJldmlld1RvSGFzdXJhKHJldmlld0RhdGEpLCBwcm9kdWN0X2lkOiBwcm9kdWN0SWQgfSwgWydpZCddKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfaW5zZXJ0X2lucHV0JyxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKS5pbnNlcnRfcHJvZHVjdF9yZXZpZXdfb25lLFxuICAgICAgICApXG4gICAgICB9KSxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU1ldGFkYXRhKFxuICAgIHByb2R1Y3RJZDogbnVtYmVyLFxuICAgIHsgbWV0YWRhdGEgfTogUGljazxVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiwgJ21ldGFkYXRhJz4sXG4gICk6IFByb21pc2U8UHJvZHVjdE1ldGFkYXRhPiB7XG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsgbWV0YWRhdGEgfSlcblxuICAgIGlmICghcGxhaW5EYXRhLm1ldGFkYXRhKSByZXR1cm5cblxuICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ3VwZGF0ZV9wcm9kdWN0X21ldGFkYXRhX2J5X3BrJywgWydwcm9kdWN0X2lkJ10sIHtcbiAgICAgIHBrX2NvbHVtbnM6IHtcbiAgICAgICAgdmFsdWU6IHsgcHJvZHVjdF9pZDogcHJvZHVjdElkIH0sXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X21ldGFkYXRhX3BrX2NvbHVtbnNfaW5wdXQnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBfc2V0OiB7XG4gICAgICAgIHZhbHVlOiBvbWl0KG1ldGFkYXRhLCBbJ3Byb2R1Y3RfaWQnXSksXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X21ldGFkYXRhX3NldF9pbnB1dCcsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHBsYWluRGF0YS5tZXRhZGF0YVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRJZChpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIU51bWJlci5pc05hTigraWQpKSByZXR1cm4gaWRcblxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5maW5kKHsgZmlsdGVyczogeyBmaXJlc3RvcmVJZDogaWQgfSwgb3B0aW9uczogeyBlbmFibGVDb3VudDogZmFsc2UgfSB9KVxuXG4gICAgaWYgKGRhdGE/LlswXT8uaWQpIHJldHVybiBkYXRhPy5bMF0/LmlkXG5cbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgUHJvZHVjdCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRSZXZpZXdzQnlQcm9kdWN0KHByb2R1Y3RJZDogbnVtYmVyKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3W10+IHtcbiAgICBjb25zdCB7IHByb2R1Y3RfcmV2aWV3OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KCdwcm9kdWN0X3JldmlldycsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X3Jldmlld19ib29sX2V4cCcsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5tYXAoKHJldmlldykgPT4gdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChyZXZpZXcpKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kUmV2aWV3KHJldmlldzogUHJvZHVjdFJldmlldywgcHJvZHVjdElkOiBudW1iZXIpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXc+IHtcbiAgICBpZiAocmV2aWV3LmlkKSByZXR1cm4gcmV2aWV3XG5cbiAgICBsZXQgbG9hZGVkUmV2aWV3OiBQcm9kdWN0UmV2aWV3XG5cbiAgICBpZiAocmV2aWV3LnBlcnNvbklkKSBsb2FkZWRSZXZpZXcgPSBhd2FpdCB0aGlzLmdldFJldmlld0J5UGVyc29uSWQocmV2aWV3LnBlcnNvbklkLCBwcm9kdWN0SWQsIHJldmlldy5vcmRlcklkKVxuICAgIGlmICghbG9hZGVkUmV2aWV3ICYmIHJldmlldy5hdXRob3IgJiYgcmV2aWV3LmVtYWlsKVxuICAgICAgbG9hZGVkUmV2aWV3ID0gYXdhaXQgdGhpcy5nZXRSZXZpZXdCeUF1dGhvckFuZEVtYWlsKHJldmlldy5hdXRob3IsIHJldmlldy5lbWFpbCwgcHJvZHVjdElkLCByZXZpZXcub3JkZXJJZClcblxuICAgIHJldHVybiBsb2FkZWRSZXZpZXcgfHwgcmV2aWV3XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFJldmlld0J5UGVyc29uSWQocGVyc29uSWQ6IG51bWJlciwgcHJvZHVjdElkOiBudW1iZXIsIG9yZGVySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXc+IHtcbiAgICBjb25zdCB7IHByb2R1Y3RfcmV2aWV3OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KCdwcm9kdWN0X3JldmlldycsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0sXG4gICAgICAgICAgcGVyc29uX2lkOiB7IF9lcTogcGVyc29uSWQgfSxcbiAgICAgICAgICAuLi4ob3JkZXJJZCAmJiB7IG9yZGVyX2lkOiB7IF9lcTogb3JkZXJJZCB9IH0pLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBgcHJvZHVjdF9yZXZpZXdfYm9vbF9leHBgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiBkYXRhICYmIGRhdGFbMF0gJiYgdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChkYXRhWzBdKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZXZpZXdCeUF1dGhvckFuZEVtYWlsKFxuICAgIGF1dGhvcjogc3RyaW5nLFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXG4gICAgb3JkZXJJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3PiB7XG4gICAgY29uc3QgeyBwcm9kdWN0X3JldmlldzogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeSgncHJvZHVjdF9yZXZpZXcnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9LFxuICAgICAgICAgIGF1dGhvcjogeyBfZXE6IGF1dGhvciB9LFxuICAgICAgICAgIGVtYWlsOiB7IF9lcTogZW1haWwgfSxcbiAgICAgICAgICAuLi4ob3JkZXJJZCAmJiB7IG9yZGVyX2lkOiB7IF9lcTogb3JkZXJJZCB9IH0pLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBgcHJvZHVjdF9yZXZpZXdfYm9vbF9leHBgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiBkYXRhICYmIGRhdGFbMF0gJiYgdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChkYXRhWzBdKVxuICB9XG5cbiAgcHJpdmF0ZSBiaW5kUmV2aWV3VG9Nb2RlbCA9IChwbGFpbjogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb2R1Y3RSZXZpZXcgPT4gKHtcbiAgICAuLi5vbWl0KHBsYWluLCBbJ3Byb2R1Y3RfaWQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ3BlcnNvbl9pZCcsICdvcmRlcl9pZCddKSxcbiAgICBjcmVhdGVkQXQ6IHR5cGVvZiBwbGFpbi5jcmVhdGVkX2F0ID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHBsYWluLmNyZWF0ZWRfYXQpIDogcGxhaW4uY3JlYXRlZF9hdCxcbiAgICB1cGRhdGVkQXQ6IHR5cGVvZiBwbGFpbi51cGRhdGVkX2F0ID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHBsYWluLnVwZGF0ZWRfYXQpIDogcGxhaW4udXBkYXRlZF9hdCxcbiAgICBwZXJzb25JZDogcGxhaW4ucGVyc29uX2lkLFxuICAgIG9yZGVySWQ6IHBsYWluLm9yZGVyX2lkLFxuICB9KVxuXG4gIHByaXZhdGUgYmluZFJldmlld1RvSGFzdXJhID0gKHJldmlldzogUHJvZHVjdFJldmlldyk6IFByb2R1Y3RSZXZpZXdGaWVsZHMgPT4gKHtcbiAgICAuLi5vbWl0KHJldmlldywgWydwcm9kdWN0SWQnLCAnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCcsICdwZXJzb25JZCcsICdvcmRlcklkJ10pLFxuICAgIHBlcnNvbl9pZDogcmV2aWV3LnBlcnNvbklkLFxuICAgIG9yZGVyX2lkOiByZXZpZXcub3JkZXJJZCxcbiAgfSlcbn1cbiJdfQ==
1
+ import { __awaiter, __rest } from "tslib";
2
+ import { Where, } from '../../../../domain';
3
+ import { NotFoundError } from '../../../../errors';
4
+ import { Base, isNil, omit } from '../../../../utils';
5
+ import { HasuraGraphQLColumnType, HasuraGraphQLWhere } from '../../enums';
6
+ import { withCrudHasuraGraphQL, withHasuraGraphQL } from '../../mixins';
7
+ import { ProductHasuraGraphQL } from '../../models';
8
+ export class ProductHasuraGraphQLRepository extends withCrudHasuraGraphQL(withHasuraGraphQL(Base)) {
9
+ constructor(endpoint, authOptions) {
10
+ super({
11
+ tableName: 'product',
12
+ model: ProductHasuraGraphQL,
13
+ endpoint,
14
+ authOptions,
15
+ fields: [],
16
+ });
17
+ this.bindReviewToModel = (plain) => (Object.assign(Object.assign({}, omit(plain, ['product_id', 'created_at', 'updated_at', 'person_id', 'order_id'])), { createdAt: typeof plain.created_at === 'string' ? new Date(plain.created_at) : plain.created_at, updatedAt: typeof plain.updated_at === 'string' ? new Date(plain.updated_at) : plain.updated_at, personId: plain.person_id, orderId: plain.order_id }));
18
+ this.bindReviewToHasura = (review) => (Object.assign(Object.assign({}, omit(review, ['productId', 'createdAt', 'updatedAt', 'personId', 'orderId'])), { person_id: review.personId, order_id: review.orderId }));
19
+ const commonFields = [
20
+ { id: { columnName: 'id', to: (value) => +value, from: (value) => value.toString() } },
21
+ { firestoreId: { columnName: 'firestore_id' } },
22
+ { productId: { columnName: 'main_product_id' } },
23
+ { CEST: { columnName: 'cest' } },
24
+ { EAN: { columnName: 'ean' } },
25
+ { NCM: { columnName: 'ncm' } },
26
+ 'brand',
27
+ { costPrice: { columnName: 'cost_price' } },
28
+ {
29
+ description: {
30
+ columnName: 'description',
31
+ from: (description, data) => ({
32
+ description,
33
+ differentials: data.differentials,
34
+ whoMustUse: data.who_must_use,
35
+ howToUse: data.how_to_use,
36
+ brand: data.brand_description,
37
+ }),
38
+ bindFindFilter: (sentence) => {
39
+ const filters = Object.values(sentence).shift();
40
+ return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((filters === null || filters === void 0 ? void 0 : filters.description) && { description: filters.description })), (filters.differentials && { differentials: filters.differentials })), (filters.whoMustUse && {
41
+ who_must_use: filters.whoMustUse,
42
+ })), (filters.howToUse && {
43
+ how_to_use: filters.howToUse,
44
+ })), (filters.brand && {
45
+ brand_description: filters.brand,
46
+ }));
47
+ },
48
+ bindPersistData: (descriptionData) => (Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((descriptionData === null || descriptionData === void 0 ? void 0 : descriptionData.description) && { description: descriptionData.description })), (descriptionData.differentials && { differentials: descriptionData.differentials })), (descriptionData.whoMustUse && {
49
+ who_must_use: descriptionData.whoMustUse,
50
+ })), (descriptionData.howToUse && { how_to_use: descriptionData.howToUse })), (descriptionData.brand && { brand_description: descriptionData.brand }))),
51
+ },
52
+ },
53
+ { differentials: { columnName: 'differentials' } },
54
+ { whoMustUse: { columnName: 'who_must_use' } },
55
+ { howToUse: { columnName: 'how_to_use' } },
56
+ { brandDescription: { columnName: 'brand_description' } },
57
+ { hasVariants: { columnName: 'has_variants' } },
58
+ {
59
+ images: {
60
+ columnName: 'images',
61
+ to: (value) => { var _a; return ((value === null || value === void 0 ? void 0 : value.length) > 0 ? `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}` : `{}`); },
62
+ },
63
+ },
64
+ {
65
+ miniatures: {
66
+ columnName: 'miniatures',
67
+ to: (value) => { var _a; return ((value === null || value === void 0 ? void 0 : value.length) > 0 ? `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}` : `{}`); },
68
+ },
69
+ },
70
+ 'name',
71
+ {
72
+ price: {
73
+ columnName: 'price',
74
+ from: (price, data) => ({
75
+ price,
76
+ fullPrice: data.full_price,
77
+ subscriberDiscountPercentage: data.subscriber_discount_percentage,
78
+ subscriberPrice: data.subscriber_price,
79
+ }),
80
+ bindFindFilter: (sentence) => {
81
+ const filters = Object.values(sentence).shift();
82
+ return Object.assign(Object.assign(Object.assign(Object.assign({}, (((filters === null || filters === void 0 ? void 0 : filters.price) || (filters === null || filters === void 0 ? void 0 : filters.price) === 0) && { price: filters.price })), ((filters.fullPrice || filters.fullPrice === 0) && { full_price: filters.fullPrice })), ((filters.subscriberDiscountPercentage || filters.subscriberDiscountPercentage === 0) && {
83
+ subscriber_discount_percentage: filters.subscriberDiscountPercentage,
84
+ })), ((filters.subscriberPrice || filters.subscriberPrice === 0) && {
85
+ subscriber_price: filters.subscriberPrice,
86
+ }));
87
+ },
88
+ bindPersistData: (priceData) => (Object.assign(Object.assign(Object.assign(Object.assign({}, ((priceData === null || priceData === void 0 ? void 0 : priceData.price) >= 0 && { price: priceData.price })), (priceData.fullPrice >= 0 && { full_price: priceData.fullPrice })), (priceData.subscriberDiscountPercentage >= 0 && {
89
+ subscriber_discount_percentage: priceData.subscriberDiscountPercentage,
90
+ })), (priceData.subscriberPrice >= 0 && { subscriber_price: priceData.subscriberPrice }))),
91
+ },
92
+ },
93
+ { fullPrice: { columnName: 'full_price' } },
94
+ { subscriberDiscountPercentage: { columnName: 'subscriber_discount_percentage' } },
95
+ { subscriberPrice: { columnName: 'subscriber_price' } },
96
+ 'published',
97
+ 'sku',
98
+ {
99
+ stock: {
100
+ columnName: 'stock',
101
+ from: (quantity) => ({ quantity }),
102
+ to: (value) => (isNil(value === null || value === void 0 ? void 0 : value.quantity) ? value : value === null || value === void 0 ? void 0 : value.quantity),
103
+ },
104
+ },
105
+ 'slug',
106
+ 'type',
107
+ 'video',
108
+ 'weight',
109
+ 'gender',
110
+ { tags: { columnName: 'tags', type: HasuraGraphQLColumnType.Jsonb } },
111
+ { isKit: { columnName: 'is_kit' } },
112
+ { createdAt: { columnName: 'created_at' } },
113
+ { updatedAt: { columnName: 'updated_at' } },
114
+ {
115
+ rate: {
116
+ columnName: 'reviews_aggregate',
117
+ filters: {
118
+ filters: { status: true },
119
+ filterType: 'product_review_bool_exp',
120
+ },
121
+ fields: [{ aggregate: [{ avg: ['rate'] }] }],
122
+ from: (value) => value.aggregate.avg.rate,
123
+ },
124
+ },
125
+ { shoppingCount: { columnName: 'shopping_count' } },
126
+ ];
127
+ this.fields = [
128
+ ...commonFields,
129
+ {
130
+ categories: {
131
+ columnName: 'categories',
132
+ fields: ['category_id'],
133
+ bindPersistData: (value) => ({
134
+ categories: { data: value.map((category) => ({ category_id: +category })) },
135
+ }),
136
+ to: (categories) => categories.map((categoryId) => +categoryId),
137
+ from: (categories) => (categories === null || categories === void 0 ? void 0 : categories.map((category) => { var _a; return (_a = category === null || category === void 0 ? void 0 : category.category_id) === null || _a === void 0 ? void 0 : _a.toString(); })) || [],
138
+ },
139
+ },
140
+ {
141
+ kitProducts: {
142
+ columnName: 'kit_products',
143
+ foreignKeyColumn: { productId: 'id' },
144
+ fields: [
145
+ { productId: { columnName: 'product_id' } },
146
+ { kitProductId: { columnName: 'kit_product_id' } },
147
+ 'quantity',
148
+ { product: { columnName: 'product', foreignKeyColumn: { id: 'product_id' }, fields: commonFields } },
149
+ ],
150
+ },
151
+ },
152
+ {
153
+ reviews: {
154
+ columnName: 'reviews',
155
+ foreignKeyColumn: { product_id: 'id' },
156
+ fields: this.reviewsFields,
157
+ },
158
+ },
159
+ {
160
+ metadata: {
161
+ columnName: 'metadata',
162
+ fields: ['title', 'description'],
163
+ bindPersistData: (value) => ({
164
+ metadata: { data: value },
165
+ }),
166
+ },
167
+ },
168
+ ];
169
+ }
170
+ get reviewsFields() {
171
+ return [
172
+ 'id',
173
+ 'shop',
174
+ 'rate',
175
+ 'author',
176
+ 'email',
177
+ 'location',
178
+ 'review',
179
+ 'status',
180
+ 'title',
181
+ { personId: { columnName: 'person_id' } },
182
+ 'points',
183
+ { orderId: { columnName: 'order_id' } },
184
+ { createdAt: { columnName: 'created_at' } },
185
+ { updatedAt: { columnName: 'updated_at' } },
186
+ ];
187
+ }
188
+ create(params) {
189
+ const _super = Object.create(null, {
190
+ create: { get: () => super.create }
191
+ });
192
+ return __awaiter(this, void 0, void 0, function* () {
193
+ const { metadata } = params, data = __rest(params, ["metadata"]);
194
+ const product = yield _super.create.call(this, omit(Object.assign(Object.assign({}, data), { metadata: metadata || { description: null, title: null } }), ['reviews']));
195
+ try {
196
+ product.reviews = data.reviews && (yield this.updateReviews(+product.id, data));
197
+ }
198
+ catch (error) {
199
+ yield this.delete({ id: product.id });
200
+ throw error;
201
+ }
202
+ return product;
203
+ });
204
+ }
205
+ get(identifiers) {
206
+ const _super = Object.create(null, {
207
+ get: { get: () => super.get }
208
+ });
209
+ var _a;
210
+ return __awaiter(this, void 0, void 0, function* () {
211
+ const product = Number.isNaN(+identifiers.id)
212
+ ? (_a = (yield this.find({ filters: { firestoreId: identifiers.id }, options: { enableCount: false } })).data) === null || _a === void 0 ? void 0 : _a[0]
213
+ : yield _super.get.call(this, identifiers);
214
+ if (product.productId)
215
+ throw new NotFoundError('Product not found, it is a variant');
216
+ product.reviews = product.reviews || (yield this.findReviewsByProduct(+product.id));
217
+ return product;
218
+ });
219
+ }
220
+ find(params) {
221
+ const _super = Object.create(null, {
222
+ find: { get: () => super.find }
223
+ });
224
+ return __awaiter(this, void 0, void 0, function* () {
225
+ const _a = params || {}, { filters, fields } = _a, options = __rest(_a, ["filters", "fields"]);
226
+ const bindFields = fields ||
227
+ this.fields
228
+ .map((field) => (typeof field === 'string' ? field : Object.keys(field).shift()))
229
+ .filter((field) => field !== 'reviews');
230
+ return _super.find.call(this, Object.assign(Object.assign({}, options), { filters: Object.assign(Object.assign({}, filters), { productId: { operator: Where.ISNULL } }), fields: bindFields }));
231
+ });
232
+ }
233
+ getBySlug(slug) {
234
+ var _a;
235
+ return __awaiter(this, void 0, void 0, function* () {
236
+ const result = yield this.find({
237
+ filters: {
238
+ slug,
239
+ },
240
+ fields: this.fields.map((field) => typeof field === 'string' ? field : Object.keys(field).shift()),
241
+ options: {
242
+ enableCount: false,
243
+ },
244
+ });
245
+ const product = (_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.shift();
246
+ return product;
247
+ });
248
+ }
249
+ update(params) {
250
+ const _super = Object.create(null, {
251
+ update: { get: () => super.update }
252
+ });
253
+ return __awaiter(this, void 0, void 0, function* () {
254
+ const { categories, kitProducts, reviews, id: checkId, rate, metadata } = params, data = __rest(params, ["categories", "kitProducts", "reviews", "id", "rate", "metadata"]);
255
+ const plainData = this.paramsToPlain({ id: checkId });
256
+ const id = yield this.getId(plainData.id);
257
+ const product = yield _super.update.call(this, Object.assign({ id }, data));
258
+ product.categories = categories && (yield this.updateCategories(+id, { categories }));
259
+ product.kitProducts = kitProducts && (yield this.updateKitProducts(+id, { kitProducts }));
260
+ product.reviews = reviews && (yield this.updateReviews(+id, { reviews }));
261
+ product.metadata = metadata && (yield this.updateMetadata(+id, { metadata }));
262
+ return product;
263
+ });
264
+ }
265
+ fetchReviews(status) {
266
+ return __awaiter(this, void 0, void 0, function* () {
267
+ const reviewsExpression = {
268
+ status: status === 'pending'
269
+ ? { [HasuraGraphQLWhere.ISNULL]: true }
270
+ : { [HasuraGraphQLWhere.EQUALS]: status === 'approved' },
271
+ };
272
+ const { product: data } = yield this.query('product', ['id', 'name', 'sku', { reviews: { columnName: 'reviews', fields: this.reviewsFields } }], {
273
+ where: { value: { reviews: reviewsExpression }, type: 'product_bool_exp', required: true },
274
+ });
275
+ return data.reduce((reviews, product) => [
276
+ ...reviews,
277
+ ...product.reviews
278
+ .filter((review) => (status === 'pending' && [undefined, null].includes(review.status)) ||
279
+ (status === 'approved' && review.status === true) ||
280
+ (status === 'rejected' && review.status === false))
281
+ .map((review) => (Object.assign(Object.assign({}, this.bindReviewToModel(review)), { productId: product.id, productName: product.name, productSku: product.sku }))),
282
+ ], []);
283
+ });
284
+ }
285
+ updateCategories(productId, { categories }) {
286
+ return __awaiter(this, void 0, void 0, function* () {
287
+ if ('action' in categories && categories.action === 'remove') {
288
+ yield this.mutation('delete_category_product', ['affected_rows'], {
289
+ where: {
290
+ type: 'category_product_bool_exp',
291
+ required: true,
292
+ value: { product_id: { _eq: productId } },
293
+ },
294
+ });
295
+ return [];
296
+ }
297
+ const plainData = this.paramsToPlain({ categories });
298
+ if (!plainData.categories || plainData.categories.length <= 0)
299
+ return [];
300
+ yield this.mutation('delete_category_product', ['affected_rows'], {
301
+ where: {
302
+ type: 'category_product_bool_exp',
303
+ required: true,
304
+ value: { product_id: { _eq: productId } },
305
+ },
306
+ });
307
+ yield this.mutation('insert_category_product', ['affected_rows'], {
308
+ objects: {
309
+ type: '[category_product_insert_input!]',
310
+ required: true,
311
+ value: plainData.categories.map((categoryId) => ({ category_id: categoryId, product_id: productId })),
312
+ },
313
+ });
314
+ return plainData.categories;
315
+ });
316
+ }
317
+ updateKitProducts(productId, { kitProducts }) {
318
+ return __awaiter(this, void 0, void 0, function* () {
319
+ const plainData = this.paramsToPlain({ kitProducts });
320
+ yield this.mutation('delete_product_kit', ['affected_rows'], {
321
+ where: {
322
+ type: 'product_kit_bool_exp',
323
+ required: true,
324
+ value: { kit_product_id: { _eq: productId } },
325
+ },
326
+ });
327
+ yield this.mutation('insert_product_kit', ['affected_rows'], {
328
+ objects: {
329
+ type: '[product_kit_insert_input!]',
330
+ required: true,
331
+ value: plainData.kitProducts.map((kitProduct) => ({
332
+ kit_product_id: productId,
333
+ product_id: kitProduct.productId || kitProduct.product.id,
334
+ quantity: kitProduct.quantity,
335
+ })),
336
+ },
337
+ });
338
+ return plainData.kitProducts;
339
+ });
340
+ }
341
+ updateReviews(productId, { reviews }) {
342
+ return __awaiter(this, void 0, void 0, function* () {
343
+ if (!reviews)
344
+ return [];
345
+ if ('action' in reviews && reviews.action === 'remove') {
346
+ const reviewIds = yield Promise.all(reviews.value.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
347
+ const review = yield this.findReview(reviewData, productId);
348
+ return review === null || review === void 0 ? void 0 : review.id;
349
+ })));
350
+ yield this.mutation('delete_product_review', ['affected_rows'], {
351
+ where: { value: { id: { _in: reviewIds.filter(Boolean) } }, type: 'product_review_bool_exp', required: true },
352
+ });
353
+ return reviews.value.map((review, index) => !reviewIds[index] && review).filter(Boolean);
354
+ }
355
+ const plainData = this.paramsToPlain({ reviews });
356
+ if (!plainData.reviews || plainData.reviews.length <= 0)
357
+ return [];
358
+ return Promise.all(plainData.reviews.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
359
+ const review = yield this.findReview(reviewData, productId);
360
+ if (review.id)
361
+ return this.bindReviewToModel((yield this.mutation('update_product_review_by_pk', this.reviewsFields, {
362
+ pk_columns: {
363
+ value: { id: review.id },
364
+ type: 'product_review_pk_columns_input',
365
+ required: true,
366
+ },
367
+ _set: {
368
+ value: omit(this.bindReviewToHasura(reviewData), ['id', 'product_id']),
369
+ type: 'product_review_set_input',
370
+ required: true,
371
+ },
372
+ })).update_product_review_by_pk);
373
+ return this.bindReviewToModel((yield this.mutation('insert_product_review_one', this.reviewsFields, {
374
+ object: {
375
+ value: omit(Object.assign(Object.assign({}, this.bindReviewToHasura(reviewData)), { product_id: productId }), ['id']),
376
+ type: 'product_review_insert_input',
377
+ required: true,
378
+ },
379
+ })).insert_product_review_one);
380
+ })));
381
+ });
382
+ }
383
+ updateMetadata(productId, { metadata }) {
384
+ return __awaiter(this, void 0, void 0, function* () {
385
+ const plainData = this.paramsToPlain({ metadata });
386
+ if (!plainData.metadata)
387
+ return;
388
+ yield this.mutation('update_product_metadata_by_pk', ['product_id'], {
389
+ pk_columns: {
390
+ value: { product_id: productId },
391
+ type: 'product_metadata_pk_columns_input',
392
+ required: true,
393
+ },
394
+ _set: {
395
+ value: omit(metadata, ['product_id']),
396
+ type: 'product_metadata_set_input',
397
+ required: true,
398
+ },
399
+ });
400
+ return plainData.metadata;
401
+ });
402
+ }
403
+ getId(id) {
404
+ var _a, _b;
405
+ return __awaiter(this, void 0, void 0, function* () {
406
+ if (!Number.isNaN(+id))
407
+ return id;
408
+ const { data } = yield this.find({ filters: { firestoreId: id }, options: { enableCount: false } });
409
+ if ((_a = data === null || data === void 0 ? void 0 : data[0]) === null || _a === void 0 ? void 0 : _a.id)
410
+ return (_b = data === null || data === void 0 ? void 0 : data[0]) === null || _b === void 0 ? void 0 : _b.id;
411
+ throw new NotFoundError(`Product with id ${id} not found`);
412
+ });
413
+ }
414
+ findReviewsByProduct(productId) {
415
+ return __awaiter(this, void 0, void 0, function* () {
416
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
417
+ where: {
418
+ value: {
419
+ product_id: { _eq: productId },
420
+ },
421
+ type: 'product_review_bool_exp',
422
+ required: true,
423
+ },
424
+ });
425
+ return data && data.map((review) => this.bindReviewToModel(review));
426
+ });
427
+ }
428
+ findReview(review, productId) {
429
+ return __awaiter(this, void 0, void 0, function* () {
430
+ if (review.id)
431
+ return review;
432
+ let loadedReview;
433
+ if (review.personId)
434
+ loadedReview = yield this.getReviewByPersonId(review.personId, productId, review.orderId);
435
+ if (!loadedReview && review.author && review.email)
436
+ loadedReview = yield this.getReviewByAuthorAndEmail(review.author, review.email, productId, review.orderId);
437
+ return loadedReview || review;
438
+ });
439
+ }
440
+ getReviewByPersonId(personId, productId, orderId) {
441
+ return __awaiter(this, void 0, void 0, function* () {
442
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
443
+ where: {
444
+ value: Object.assign({ product_id: { _eq: productId }, person_id: { _eq: personId } }, (orderId && { order_id: { _eq: orderId } })),
445
+ type: `product_review_bool_exp`,
446
+ required: true,
447
+ },
448
+ });
449
+ return data && data[0] && this.bindReviewToModel(data[0]);
450
+ });
451
+ }
452
+ getReviewByAuthorAndEmail(author, email, productId, orderId) {
453
+ return __awaiter(this, void 0, void 0, function* () {
454
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
455
+ where: {
456
+ value: Object.assign({ product_id: { _eq: productId }, author: { _eq: author }, email: { _eq: email } }, (orderId && { order_id: { _eq: orderId } })),
457
+ type: `product_review_bool_exp`,
458
+ required: true,
459
+ },
460
+ });
461
+ return data && data[0] && this.bindReviewToModel(data[0]);
462
+ });
463
+ }
464
+ }
465
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC9zcmMvaW5mcmEvaGFzdXJhLWdyYXBocWwvcmVwb3NpdG9yaWVzL2NhdGFsb2cvcHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBY0wsS0FBSyxHQUNOLE1BQU0sb0JBQW9CLENBQUE7QUFDM0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBb0JuRCxNQUFNLE9BQU8sOEJBQ1gsU0FBUSxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFzQjVFLFlBQVksUUFBZ0IsRUFBRSxXQUFxQztRQUNqRSxLQUFLLENBQUM7WUFDSixTQUFTLEVBQUUsU0FBUztZQUNwQixLQUFLLEVBQUUsb0JBQW9CO1lBQzNCLFFBQVE7WUFDUixXQUFXO1lBQ1gsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDLENBQUE7UUEyZ0JJLHNCQUFpQixHQUFHLENBQUMsS0FBMEIsRUFBaUIsRUFBRSxDQUFDLGlDQUN0RSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEtBQ25GLFNBQVMsRUFBRSxPQUFP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Q0FBQyxDQUFBO1lBRUYsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMzRCxDQUFDO0tBQUE7SUFFYSx5QkFBeUIsQ0FDckMsTUFBYyxFQUNkLEtBQWEsRUFDYixTQUFpQixFQUNqQixPQUFnQjs7WUFFaEIsTUFBTSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEYsS0FBSyxFQUFFO29CQUNMLEtBQUssa0JBQ0gsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUM5QixNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQ3ZCLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFDbEIsQ0FBQyxPQUFPLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUMvQztvQkFDRCxJQUFJLEVBQUUseUJBQXlCO29CQUMvQixRQUFRLEVBQUUsSUFBSTtpQkFDZjthQUNGLENBQUMsQ0FBQTtZQUVGLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDM0QsQ0FBQztLQUFBO0NBZUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENyZWF0ZVJlcG9zaXRvcnlQYXJhbXMsXHJcbiAgRmluZFJlcG9zaXRvcnlQYXJhbXMsXHJcbiAgR2V0UmVwb3NpdG9yeVBhcmFtcyxcclxuICBOb25GdW5jdGlvblByb3BlcnR5TmFtZXMsXHJcbiAgUHJvZHVjdE1ldGFkYXRhLFxyXG4gIFByb2R1Y3RSZXBvc2l0b3J5LFxyXG4gIFByb2R1Y3RSZXZpZXcsXHJcbiAgUmVwb3NpdG9yeUZpbmRSZXN1bHQsXHJcbiAgUmV2aWV3U3RhdHVzUGFyYW1zLFxyXG4gIFJldmlld1dpdGhQcm9kdWN0RGF0YSxcclxuICBTaG9wUHJpY2UsXHJcbiAgU2hvcHMsXHJcbiAgVXBkYXRlUmVwb3NpdG9yeVBhcmFtcyxcclxuICBXaGVyZSxcclxufSBmcm9tICcuLi8uLi8uLi8uLi9kb21haW4nXHJcbmltcG9ydCB7IE5vdEZvdW5kRXJyb3IgfSBmcm9tICcuLi8uLi8uLi8uLi9lcnJvcnMnXHJcbmltcG9ydCB7IEJhc2UsIGlzTmlsLCBvbWl0IH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnXHJcbmltcG9ydCB7IEhhc3VyYUdyYXBoUUxDb2x1bW5UeXBlLCBIYXN1cmFHcmFwaFFMV2hlcmUgfSBmcm9tICcuLi8uLi9lbnVtcydcclxuaW1wb3J0IHsgd2l0aENydWRIYXN1cmFHcmFwaFFMLCB3aXRoSGFzdXJhR3JhcGhRTCB9IGZyb20gJy4uLy4uL21peGlucydcclxuaW1wb3J0IHsgUHJvZHVjdEhhc3VyYUdyYXBoUUwgfSBmcm9tICcuLi8uLi9tb2RlbHMnXHJcbmltcG9ydCB7IEhhc3VyYUdyYXBoUUxBdXRoT3B0aW9ucywgSGFzdXJhR3JhcGhRTEZpZWxkcyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxudHlwZSBQcm9kdWN0UmV2aWV3RmllbGRzID0ge1xyXG4gIGlkPzogc3RyaW5nXHJcbiAgc2hvcDogU2hvcHNcclxuICByYXRlOiBudW1iZXJcclxuICBhdXRob3I/OiBzdHJpbmdcclxuICBlbWFpbD86IHN0cmluZ1xyXG4gIGxvY2F0aW9uPzogc3RyaW5nXHJcbiAgcmV2aWV3Pzogc3RyaW5nXHJcbiAgc3RhdHVzPzogYm9vbGVhblxyXG4gIHRpdGxlPzogc3RyaW5nXHJcbiAgcGVyc29uSWQ/OiBudW1iZXJcclxuICBwb2ludHM/OiBudW1iZXJcclxuICBvcmRlcklkPzogc3RyaW5nXHJcbiAgY3JlYXRlZEF0PzogRGF0ZVxyXG4gIHVwZGF0ZWRBdD86IERhdGVcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByb2R1Y3RIYXN1cmFHcmFwaFFMUmVwb3NpdG9yeVxyXG4gIGV4dGVuZHMgd2l0aENydWRIYXN1cmFHcmFwaFFMKHdpdGhIYXN1cmFHcmFwaFFMPFByb2R1Y3RIYXN1cmFHcmFwaFFMPihCYXNlKSlcclxuICBpbXBsZW1lbnRzIFByb2R1Y3RSZXBvc2l0b3J5XHJcbntcclxuICBwcml2YXRlIGdldCByZXZpZXdzRmllbGRzKCk6IGFueSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAnaWQnLFxyXG4gICAgICAnc2hvcCcsXHJcbiAgICAgICdyYXRlJyxcclxuICAgICAgJ2F1dGhvcicsXHJcbiAgICAgICdlbWFpbCcsXHJcbiAgICAgICdsb2NhdGlvbicsXHJcbiAgICAgICdyZXZpZXcnLFxyXG4gICAgICAnc3RhdHVzJyxcclxuICAgICAgJ3RpdGxlJyxcclxuICAgICAgeyBwZXJzb25JZDogeyBjb2x1bW5OYW1lOiAncGVyc29uX2lkJyB9IH0sXHJcbiAgICAgICdwb2ludHMnLFxyXG4gICAgICB7IG9yZGVySWQ6IHsgY29sdW1uTmFtZTogJ29yZGVyX2lkJyB9IH0sXHJcbiAgICAgIHsgY3JlYXRlZEF0OiB7IGNvbHVtbk5hbWU6ICdjcmVhdGVkX2F0JyB9IH0sXHJcbiAgICAgIHsgdXBkYXRlZEF0OiB7IGNvbHVtbk5hbWU6ICd1cGRhdGVkX2F0JyB9IH0sXHJcbiAgICBdXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihlbmRwb2ludDogc3RyaW5nLCBhdXRoT3B0aW9uczogSGFzdXJhR3JhcGhRTEF1dGhPcHRpb25zKSB7XHJcbiAgICBzdXBlcih7XHJcbiAgICAgIHRhYmxlTmFtZTogJ3Byb2R1Y3QnLFxyXG4gICAgICBtb2RlbDogUHJvZHVjdEhhc3VyYUdyYXBoUUwsXHJcbiAgICAgIGVuZHBvaW50LFxyXG4gICAgICBhdXRoT3B0aW9ucyxcclxuICAgICAgZmllbGRzOiBbXSxcclxuICAgIH0pXHJcblxyXG4gICAgY29uc3QgY29tbW9uRmllbGRzOiBIYXN1cmFHcmFwaFFMRmllbGRzPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiA9IFtcclxuICAgICAgeyBpZDogeyBjb2x1bW5OYW1lOiAnaWQnLCB0bzogKHZhbHVlKSA9PiArdmFsdWUsIGZyb206ICh2YWx1ZSkgPT4gdmFsdWUudG9TdHJpbmcoKSB9IH0sXHJcbiAgICAgIHsgZmlyZXN0b3JlSWQ6IHsgY29sdW1uTmFtZTogJ2ZpcmVzdG9yZV9pZCcgfSB9LFxyXG4gICAgICB7IHByb2R1Y3RJZDogeyBjb2x1bW5OYW1lOiAnbWFpbl9wcm9kdWN0X2lkJyB9IH0sXHJcbiAgICAgIHsgQ0VTVDogeyBjb2x1bW5OYW1lOiAnY2VzdCcgfSB9LFxyXG4gICAgICB7IEVBTjogeyBjb2x1bW5OYW1lOiAnZWFuJyB9IH0sXHJcbiAgICAgIHsgTkNNOiB7IGNvbHVtbk5hbWU6ICduY20nIH0gfSxcclxuICAgICAgJ2JyYW5kJyxcclxuICAgICAgeyBjb3N0UHJpY2U6IHsgY29sdW1uTmFtZTogJ2Nvc3RfcHJpY2UnIH0gfSxcclxuICAgICAge1xyXG4gICAgICAgIGRlc2NyaXB0aW9uOiB7XHJcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnZGVzY3JpcHRpb24nLFxyXG4gICAgICAgICAgZnJvbTogKGRlc2NyaXB0aW9uLCBkYXRhKSA9PiAoe1xyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgZGlmZmVyZW50aWFsczogZGF0YS5kaWZmZXJlbnRpYWxzLFxyXG4gICAgICAgICAgICB3aG9NdXN0VXNlOiBkYXRhLndob19tdXN0X3VzZSxcclxuICAgICAgICAgICAgaG93VG9Vc2U6IGRhdGEuaG93X3RvX3VzZSxcclxuICAgICAgICAgICAgYnJhbmQ6IGRhdGEuYnJhbmRfZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGJpbmRGaW5kRmlsdGVyOiAoc2VudGVuY2UpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IE9iamVjdC52YWx1ZXMoc2VudGVuY2UpLnNoaWZ0KClcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4uKGZpbHRlcnM/LmRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb246IGZpbHRlcnMuZGVzY3JpcHRpb24gfSksXHJcbiAgICAgICAgICAgICAgLi4uKGZpbHRlcnMuZGlmZmVyZW50aWFscyAmJiB7IGRpZmZlcmVudGlhbHM6IGZpbHRlcnMuZGlmZmVyZW50aWFscyB9KSxcclxuICAgICAgICAgICAgICAuLi4oZmlsdGVycy53aG9NdXN0VXNlICYmIHtcclxuICAgICAgICAgICAgICAgIHdob19tdXN0X3VzZTogZmlsdGVycy53aG9NdXN0VXNlLFxyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgIC4uLihmaWx0ZXJzLmhvd1RvVXNlICYmIHtcclxuICAgICAgICAgICAgICAgIGhvd190b191c2U6IGZpbHRlcnMuaG93VG9Vc2UsXHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgLi4uKGZpbHRlcnMuYnJhbmQgJiYge1xyXG4gICAgICAgICAgICAgICAgYnJhbmRfZGVzY3JpcHRpb246IGZpbHRlcnMuYnJhbmQsXHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBiaW5kUGVyc2lzdERhdGE6IChkZXNjcmlwdGlvbkRhdGEpID0+ICh7XHJcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbkRhdGE/LmRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uRGF0YS5kZXNjcmlwdGlvbiB9KSxcclxuICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uRGF0YS5kaWZmZXJlbnRpYWxzICYmIHsgZGlmZmVyZW50aWFsczogZGVzY3JpcHRpb25EYXRhLmRpZmZlcmVudGlhbHMgfSksXHJcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbkRhdGEud2hvTXVzdFVzZSAmJiB7XHJcbiAgICAgICAgICAgICAgd2hvX211c3RfdXNlOiBkZXNjcmlwdGlvbkRhdGEud2hvTXVzdFVzZSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbkRhdGEuaG93VG9Vc2UgJiYgeyBob3dfdG9fdXNlOiBkZXNjcmlwdGlvbkRhdGEuaG93VG9Vc2UgfSksXHJcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbkRhdGEuYnJhbmQgJiYgeyBicmFuZF9kZXNjcmlwdGlvbjogZGVzY3JpcHRpb25EYXRhLmJyYW5kIH0pLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAgeyBkaWZmZXJlbnRpYWxzOiB7IGNvbHVtbk5hbWU6ICdkaWZmZXJlbnRpYWxzJyB9IH0sXHJcbiAgICAgIHsgd2hvTXVzdFVzZTogeyBjb2x1bW5OYW1lOiAnd2hvX211c3RfdXNlJyB9IH0sXHJcbiAgICAgIHsgaG93VG9Vc2U6IHsgY29sdW1uTmFtZTogJ2hvd190b191c2UnIH0gfSxcclxuICAgICAgeyBicmFuZERlc2NyaXB0aW9uOiB7IGNvbHVtbk5hbWU6ICdicmFuZF9kZXNjcmlwdGlvbicgfSB9LFxyXG4gICAgICB7IGhhc1ZhcmlhbnRzOiB7IGNvbHVtbk5hbWU6ICdoYXNfdmFyaWFudHMnIH0gfSxcclxuICAgICAge1xyXG4gICAgICAgIGltYWdlczoge1xyXG4gICAgICAgICAgY29sdW1uTmFtZTogJ2ltYWdlcycsXHJcbiAgICAgICAgICB0bzogKHZhbHVlKSA9PiAodmFsdWU/Lmxlbmd0aCA+IDAgPyBge1wiJHt2YWx1ZT8uam9pbj8uKGBcIixcImApIHx8ICcnfVwifWAgOiBge31gKSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbWluaWF0dXJlczoge1xyXG4gICAgICAgICAgY29sdW1uTmFtZTogJ21pbmlhdHVyZXMnLFxyXG4gICAgICAgICAgdG86ICh2YWx1ZSkgPT4gKHZhbHVlPy5sZW5ndGggPiAwID8gYHtcIiR7dmFsdWU/LmpvaW4/LihgXCIsXCJgKSB8fCAnJ31cIn1gIDogYHt9YCksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAgJ25hbWUnLFxyXG4gICAgICB7XHJcbiAgICAgICAgcHJpY2U6IHtcclxuICAgICAgICAgIGNvbHVtbk5hbWU6ICdwcmljZScsXHJcbiAgICAgICAgICBmcm9tOiAocHJpY2UsIGRhdGEpOiBTaG9wUHJpY2UgPT4gKHtcclxuICAgICAgICAgICAgcHJpY2UsXHJcbiAgICAgICAgICAgIGZ1bGxQcmljZTogZGF0YS5mdWxsX3ByaWNlLFxyXG4gICAgICAgICAgICBzdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlOiBkYXRhLnN1YnNjcmliZXJfZGlzY291bnRfcGVyY2VudGFnZSxcclxuICAgICAgICAgICAgc3Vic2NyaWJlclByaWNlOiBkYXRhLnN1YnNjcmliZXJfcHJpY2UsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGJpbmRGaW5kRmlsdGVyOiAoc2VudGVuY2UpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IE9iamVjdC52YWx1ZXMoc2VudGVuY2UpLnNoaWZ0KClcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzPy5wcmljZSB8fCBmaWx0ZXJzPy5wcmljZSA9PT0gMCkgJiYgeyBwcmljZTogZmlsdGVycy5wcmljZSB9KSxcclxuICAgICAgICAgICAgICAuLi4oKGZpbHRlcnMuZnVsbFByaWNlIHx8IGZpbHRlcnMuZnVsbFByaWNlID09PSAwKSAmJiB7IGZ1bGxfcHJpY2U6IGZpbHRlcnMuZnVsbFByaWNlIH0pLFxyXG4gICAgICAgICAgICAgIC4uLigoZmlsdGVycy5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlIHx8IGZpbHRlcnMuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSA9PT0gMCkgJiYge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlOiBmaWx0ZXJzLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UsXHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzLnN1YnNjcmliZXJQcmljZSB8fCBmaWx0ZXJzLnN1YnNjcmliZXJQcmljZSA9PT0gMCkgJiYge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9wcmljZTogZmlsdGVycy5zdWJzY3JpYmVyUHJpY2UsXHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBiaW5kUGVyc2lzdERhdGE6IChwcmljZURhdGEpID0+ICh7XHJcbiAgICAgICAgICAgIC4uLihwcmljZURhdGE/LnByaWNlID49IDAgJiYgeyBwcmljZTogcHJpY2VEYXRhLnByaWNlIH0pLFxyXG4gICAgICAgICAgICAuLi4ocHJpY2VEYXRhLmZ1bGxQcmljZSA+PSAwICYmIHsgZnVsbF9wcmljZTogcHJpY2VEYXRhLmZ1bGxQcmljZSB9KSxcclxuICAgICAgICAgICAgLi4uKHByaWNlRGF0YS5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlID49IDAgJiYge1xyXG4gICAgICAgICAgICAgIHN1YnNjcmliZXJfZGlzY291bnRfcGVyY2VudGFnZTogcHJpY2VEYXRhLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UsXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAuLi4ocHJpY2VEYXRhLnN1YnNjcmliZXJQcmljZSA+PSAwICYmIHsgc3Vic2NyaWJlcl9wcmljZTogcHJpY2VEYXRhLnN1YnNjcmliZXJQcmljZSB9KSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgZnVsbFByaWNlOiB7IGNvbHVtbk5hbWU6ICdmdWxsX3ByaWNlJyB9IH0sXHJcbiAgICAgIHsgc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZTogeyBjb2x1bW5OYW1lOiAnc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlJyB9IH0sXHJcbiAgICAgIHsgc3Vic2NyaWJlclByaWNlOiB7IGNvbHVtbk5hbWU6ICdzdWJzY3JpYmVyX3ByaWNlJyB9IH0sXHJcbiAgICAgICdwdWJsaXNoZWQnLFxyXG4gICAgICAnc2t1JyxcclxuICAgICAge1xyXG4gICAgICAgIHN0b2NrOiB7XHJcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnc3RvY2snLFxyXG4gICAgICAgICAgZnJvbTogKHF1YW50aXR5OiBudW1iZXIpID0+ICh7IHF1YW50aXR5IH0pLFxyXG4gICAgICAgICAgdG86ICh2YWx1ZSkgPT4gKGlzTmlsKHZhbHVlPy5xdWFudGl0eSkgPyB2YWx1ZSA6IHZhbHVlPy5xdWFudGl0eSksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAgJ3NsdWcnLFxyXG4gICAgICAndHlwZScsXHJcbiAgICAgICd2aWRlbycsXHJcbiAgICAgICd3ZWlnaHQnLFxyXG4gICAgICAnZ2VuZGVyJyxcclxuICAgICAgeyB0YWdzOiB7IGNvbHVtbk5hbWU6ICd0YWdzJywgdHlwZTogSGFzdXJhR3JhcGhRTENvbHVtblR5cGUuSnNvbmIgfSB9LFxyXG4gICAgICB7IGlzS2l0OiB7IGNvbHVtbk5hbWU6ICdpc19raXQnIH0gfSxcclxuICAgICAgeyBjcmVhdGVkQXQ6IHsgY29sdW1uTmFtZTogJ2NyZWF0ZWRfYXQnIH0gfSxcclxuICAgICAgeyB1cGRhdGVkQXQ6IHsgY29sdW1uTmFtZTogJ3VwZGF0ZWRfYXQnIH0gfSxcclxuICAgICAge1xyXG4gICAgICAgIHJhdGU6IHtcclxuICAgICAgICAgIGNvbHVtbk5hbWU6ICdyZXZpZXdzX2FnZ3JlZ2F0ZScsXHJcbiAgICAgICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgICAgIGZpbHRlcnM6IHsgc3RhdHVzOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIGZpbHRlclR5cGU6ICdwcm9kdWN0X3Jldmlld19ib29sX2V4cCcsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZmllbGRzOiBbeyBhZ2dyZWdhdGU6IFt7IGF2ZzogWydyYXRlJ10gfV0gfV0sXHJcbiAgICAgICAgICBmcm9tOiAodmFsdWUpID0+IHZhbHVlLmFnZ3JlZ2F0ZS5hdmcucmF0ZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7IHNob3BwaW5nQ291bnQ6IHsgY29sdW1uTmFtZTogJ3Nob3BwaW5nX2NvdW50JyB9IH0sXHJcbiAgICBdXHJcblxyXG4gICAgdGhpcy5maWVsZHMgPSBbXHJcbiAgICAgIC4uLmNvbW1vbkZpZWxkcyxcclxuICAgICAge1xyXG4gICAgICAgIGNhdGVnb3JpZXM6IHtcclxuICAgICAgICAgIGNvbHVtbk5hbWU6ICdjYXRlZ29yaWVzJyxcclxuICAgICAgICAgIGZpZWxkczogWydjYXRlZ29yeV9pZCddLFxyXG4gICAgICAgICAgYmluZFBlcnNpc3REYXRhOiAodmFsdWUpID0+ICh7XHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IHsgZGF0YTogdmFsdWUubWFwKChjYXRlZ29yeSkgPT4gKHsgY2F0ZWdvcnlfaWQ6ICtjYXRlZ29yeSB9KSkgfSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdG86IChjYXRlZ29yaWVzKSA9PiBjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnlJZCkgPT4gK2NhdGVnb3J5SWQpLFxyXG4gICAgICAgICAgZnJvbTogKGNhdGVnb3JpZXM6IHsgY2F0ZWdvcnlfaWQ6IG51bWJlciB9W10pID0+XHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM/Lm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5Py5jYXRlZ29yeV9pZD8udG9TdHJpbmcoKSkgfHwgW10sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGtpdFByb2R1Y3RzOiB7XHJcbiAgICAgICAgICBjb2x1bW5OYW1lOiAna2l0X3Byb2R1Y3RzJyxcclxuICAgICAgICAgIGZvcmVpZ25LZXlDb2x1bW46IHsgcHJvZHVjdElkOiAnaWQnIH0sXHJcbiAgICAgICAgICBmaWVsZHM6IFtcclxuICAgICAgICAgICAgeyBwcm9kdWN0SWQ6IHsgY29sdW1uTmFtZTogJ3Byb2R1Y3RfaWQnIH0gfSxcclxuICAgICAgICAgICAgeyBraXRQcm9kdWN0SWQ6IHsgY29sdW1uTmFtZTogJ2tpdF9wcm9kdWN0X2lkJyB9IH0sXHJcbiAgICAgICAgICAgICdxdWFudGl0eScsXHJcbiAgICAgICAgICAgIHsgcHJvZHVjdDogeyBjb2x1bW5OYW1lOiAncHJvZHVjdCcsIGZvcmVpZ25LZXlDb2x1bW46IHsgaWQ6ICdwcm9kdWN0X2lkJyB9LCBmaWVsZHM6IGNvbW1vbkZpZWxkcyB9IH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICByZXZpZXdzOiB7XHJcbiAgICAgICAgICBjb2x1bW5OYW1lOiAncmV2aWV3cycsXHJcbiAgICAgICAgICBmb3JlaWduS2V5Q29sdW1uOiB7IHByb2R1Y3RfaWQ6ICdpZCcgfSxcclxuICAgICAgICAgIGZpZWxkczogdGhpcy5yZXZpZXdzRmllbGRzLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRhZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uTmFtZTogJ21ldGFkYXRhJyxcclxuICAgICAgICAgIGZpZWxkczogWyd0aXRsZScsICdkZXNjcmlwdGlvbiddLFxyXG4gICAgICAgICAgYmluZFBlcnNpc3REYXRhOiAodmFsdWUpID0+ICh7XHJcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7IGRhdGE6IHZhbHVlIH0sXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlKHBhcmFtczogQ3JlYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4pOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiB7XHJcbiAgICBjb25zdCB7IG1ldGFkYXRhLCAuLi5kYXRhIH0gPSBwYXJhbXNcclxuICAgIGNvbnN0IHByb2R1Y3QgPSBhd2FpdCBzdXBlci5jcmVhdGUoXHJcbiAgICAgIG9taXQoeyAuLi5kYXRhLCBtZXRhZGF0YTogbWV0YWRhdGEgfHwgeyBkZXNjcmlwdGlvbjogbnVsbCwgdGl0bGU6IG51bGwgfSB9LCBbJ3Jldmlld3MnXSksXHJcbiAgICApXHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcHJvZHVjdC5yZXZpZXdzID0gZGF0YS5yZXZpZXdzICYmIChhd2FpdCB0aGlzLnVwZGF0ZVJldmlld3MoK3Byb2R1Y3QuaWQsIGRhdGEpKVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgYXdhaXQgdGhpcy5kZWxldGUoeyBpZDogcHJvZHVjdC5pZCB9KVxyXG5cclxuICAgICAgdGhyb3cgZXJyb3JcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcHJvZHVjdFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0KGlkZW50aWZpZXJzOiBHZXRSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPik6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcclxuICAgIGNvbnN0IHByb2R1Y3QgPSBOdW1iZXIuaXNOYU4oK2lkZW50aWZpZXJzLmlkKVxyXG4gICAgICA/IChhd2FpdCB0aGlzLmZpbmQoeyBmaWx0ZXJzOiB7IGZpcmVzdG9yZUlkOiBpZGVudGlmaWVycy5pZCB9LCBvcHRpb25zOiB7IGVuYWJsZUNvdW50OiBmYWxzZSB9IH0pKS5kYXRhPy5bMF1cclxuICAgICAgOiBhd2FpdCBzdXBlci5nZXQoaWRlbnRpZmllcnMpXHJcblxyXG4gICAgaWYgKHByb2R1Y3QucHJvZHVjdElkKSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUHJvZHVjdCBub3QgZm91bmQsIGl0IGlzIGEgdmFyaWFudCcpXHJcblxyXG4gICAgcHJvZHVjdC5yZXZpZXdzID0gcHJvZHVjdC5yZXZpZXdzIHx8IChhd2FpdCB0aGlzLmZpbmRSZXZpZXdzQnlQcm9kdWN0KCtwcm9kdWN0LmlkKSlcclxuXHJcbiAgICByZXR1cm4gcHJvZHVjdFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZChwYXJhbXM/OiBGaW5kUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4pOiBQcm9taXNlPFJlcG9zaXRvcnlGaW5kUmVzdWx0PFByb2R1Y3RIYXN1cmFHcmFwaFFMPj4ge1xyXG4gICAgY29uc3QgeyBmaWx0ZXJzLCBmaWVsZHMsIC4uLm9wdGlvbnMgfSA9IHBhcmFtcyB8fCB7fVxyXG4gICAgY29uc3QgYmluZEZpZWxkcyA9XHJcbiAgICAgIGZpZWxkcyB8fFxyXG4gICAgICAodGhpcy5maWVsZHNcclxuICAgICAgICAubWFwKChmaWVsZCkgPT4gKHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycgPyBmaWVsZCA6IE9iamVjdC5rZXlzKGZpZWxkKS5zaGlmdCgpKSlcclxuICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gZmllbGQgIT09ICdyZXZpZXdzJykgYXMgTm9uRnVuY3Rpb25Qcm9wZXJ0eU5hbWVzPFxyXG4gICAgICAgIFByb2R1Y3RIYXN1cmFHcmFwaFFMLFxyXG4gICAgICAgIGtleW9mIFByb2R1Y3RIYXN1cmFHcmFwaFFMXHJcbiAgICAgID5bXSlcclxuXHJcbiAgICByZXR1cm4gc3VwZXIuZmluZCh7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGZpbHRlcnM6IHsgLi4uZmlsdGVycywgcHJvZHVjdElkOiB7IG9wZXJhdG9yOiBXaGVyZS5JU05VTEwgfSB9LFxyXG4gICAgICBmaWVsZHM6IGJpbmRGaWVsZHMsXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0QnlTbHVnKHNsdWc6IHN0cmluZyk6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZmluZCh7XHJcbiAgICAgIGZpbHRlcnM6IHtcclxuICAgICAgICBzbHVnLFxyXG4gICAgICB9LFxyXG4gICAgICBmaWVsZHM6IHRoaXMuZmllbGRzLm1hcCgoZmllbGQpID0+XHJcbiAgICAgICAgdHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJyA/IGZpZWxkIDogT2JqZWN0LmtleXMoZmllbGQpLnNoaWZ0KCksXHJcbiAgICAgICkgYXMgTm9uRnVuY3Rpb25Qcm9wZXJ0eU5hbWVzPFByb2R1Y3RIYXN1cmFHcmFwaFFMLCBrZXlvZiBQcm9kdWN0SGFzdXJhR3JhcGhRTD5bXSxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVuYWJsZUNvdW50OiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgIH0pXHJcblxyXG4gICAgY29uc3QgcHJvZHVjdCA9IHJlc3VsdD8uZGF0YT8uc2hpZnQoKVxyXG5cclxuICAgIHJldHVybiBwcm9kdWN0XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGUocGFyYW1zOiBVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPik6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcclxuICAgIGNvbnN0IHsgY2F0ZWdvcmllcywga2l0UHJvZHVjdHMsIHJldmlld3MsIGlkOiBjaGVja0lkLCByYXRlLCBtZXRhZGF0YSwgLi4uZGF0YSB9ID0gcGFyYW1zXHJcbiAgICBjb25zdCBwbGFpbkRhdGEgPSB0aGlzLnBhcmFtc1RvUGxhaW4oeyBpZDogY2hlY2tJZCB9KVxyXG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLmdldElkKHBsYWluRGF0YS5pZClcclxuICAgIGNvbnN0IHByb2R1Y3QgPSBhd2FpdCBzdXBlci51cGRhdGUoeyBpZCwgLi4uZGF0YSB9KVxyXG5cclxuICAgIHByb2R1Y3QuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXMgJiYgKGF3YWl0IHRoaXMudXBkYXRlQ2F0ZWdvcmllcygraWQsIHsgY2F0ZWdvcmllcyB9KSlcclxuICAgIHByb2R1Y3Qua2l0UHJvZHVjdHMgPSBraXRQcm9kdWN0cyAmJiAoYXdhaXQgdGhpcy51cGRhdGVLaXRQcm9kdWN0cygraWQsIHsga2l0UHJvZHVjdHMgfSkpXHJcbiAgICBwcm9kdWN0LnJldmlld3MgPSByZXZpZXdzICYmIChhd2FpdCB0aGlzLnVwZGF0ZVJldmlld3MoK2lkLCB7IHJldmlld3MgfSkpXHJcbiAgICBwcm9kdWN0Lm1ldGFkYXRhID0gbWV0YWRhdGEgJiYgKGF3YWl0IHRoaXMudXBkYXRlTWV0YWRhdGEoK2lkLCB7IG1ldGFkYXRhIH0pKVxyXG5cclxuICAgIHJldHVybiBwcm9kdWN0XHJcbiAgfVxyXG5cclxuICBhc3luYyBmZXRjaFJldmlld3Moc3RhdHVzOiBSZXZpZXdTdGF0dXNQYXJhbXMpOiBQcm9taXNlPFJldmlld1dpdGhQcm9kdWN0RGF0YVtdPiB7XHJcbiAgICBjb25zdCByZXZpZXdzRXhwcmVzc2lvbiA9IHtcclxuICAgICAgc3RhdHVzOlxyXG4gICAgICAgIHN0YXR1cyA9PT0gJ3BlbmRpbmcnXHJcbiAgICAgICAgICA/IHsgW0hhc3VyYUdyYXBoUUxXaGVyZS5JU05VTExdOiB0cnVlIH1cclxuICAgICAgICAgIDogeyBbSGFzdXJhR3JhcGhRTFdoZXJlLkVRVUFMU106IHN0YXR1cyA9PT0gJ2FwcHJvdmVkJyB9LFxyXG4gICAgfVxyXG4gICAgY29uc3QgeyBwcm9kdWN0OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KFxyXG4gICAgICAncHJvZHVjdCcsXHJcbiAgICAgIFsnaWQnLCAnbmFtZScsICdza3UnLCB7IHJldmlld3M6IHsgY29sdW1uTmFtZTogJ3Jldmlld3MnLCBmaWVsZHM6IHRoaXMucmV2aWV3c0ZpZWxkcyB9IH1dLFxyXG4gICAgICB7XHJcbiAgICAgICAgd2hlcmU6IHsgdmFsdWU6IHsgcmV2aWV3czogcmV2aWV3c0V4cHJlc3Npb24gfSwgdHlwZTogJ3Byb2R1Y3RfYm9vbF9leHAnLCByZXF1aXJlZDogdHJ1ZSB9LFxyXG4gICAgICB9LFxyXG4gICAgKVxyXG5cclxuICAgIHJldHVybiBkYXRhLnJlZHVjZShcclxuICAgICAgKHJldmlld3MsIHByb2R1Y3QpID0+IFtcclxuICAgICAgICAuLi5yZXZpZXdzLFxyXG4gICAgICAgIC4uLnByb2R1Y3QucmV2aWV3c1xyXG4gICAgICAgICAgLmZpbHRlcihcclxuICAgICAgICAgICAgKHJldmlldykgPT5cclxuICAgICAgICAgICAgICAoc3RhdHVzID09PSAncGVuZGluZycgJiYgW3VuZGVmaW5lZCwgbnVsbF0uaW5jbHVkZXMocmV2aWV3LnN0YXR1cykpIHx8XHJcbiAgICAgICAgICAgICAgKHN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJiByZXZpZXcuc3RhdHVzID09PSB0cnVlKSB8fFxyXG4gICAgICAgICAgICAgIChzdGF0dXMgPT09ICdyZWplY3RlZCcgJiYgcmV2aWV3LnN0YXR1cyA9PT0gZmFsc2UpLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLm1hcCgocmV2aWV3KSA9PiAoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmJpbmRSZXZpZXdUb01vZGVsKHJldmlldyksXHJcbiAgICAgICAgICAgIHByb2R1Y3RJZDogcHJvZHVjdC5pZCxcclxuICAgICAgICAgICAgcHJvZHVjdE5hbWU6IHByb2R1Y3QubmFtZSxcclxuICAgICAgICAgICAgcHJvZHVjdFNrdTogcHJvZHVjdC5za3UsXHJcbiAgICAgICAgICB9KSksXHJcbiAgICAgIF0sXHJcbiAgICAgIFtdIGFzIFJldmlld1dpdGhQcm9kdWN0RGF0YVtdLFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDYXRlZ29yaWVzKFxyXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXHJcbiAgICB7IGNhdGVnb3JpZXMgfTogUGljazxVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiwgJ2NhdGVnb3JpZXMnPixcclxuICApOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMWydjYXRlZ29yaWVzJ10+IHtcclxuICAgIGlmICgnYWN0aW9uJyBpbiBjYXRlZ29yaWVzICYmIGNhdGVnb3JpZXMuYWN0aW9uID09PSAncmVtb3ZlJykge1xyXG4gICAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgICAgd2hlcmU6IHtcclxuICAgICAgICAgIHR5cGU6ICdjYXRlZ29yeV9wcm9kdWN0X2Jvb2xfZXhwJyxcclxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgICAgdmFsdWU6IHsgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9IH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IGNhdGVnb3JpZXMgfSlcclxuXHJcbiAgICBpZiAoIXBsYWluRGF0YS5jYXRlZ29yaWVzIHx8IHBsYWluRGF0YS5jYXRlZ29yaWVzLmxlbmd0aCA8PSAwKSByZXR1cm4gW11cclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgdHlwZTogJ2NhdGVnb3J5X3Byb2R1Y3RfYm9vbF9leHAnLFxyXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiB7IHByb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSB9LFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdpbnNlcnRfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgIG9iamVjdHM6IHtcclxuICAgICAgICB0eXBlOiAnW2NhdGVnb3J5X3Byb2R1Y3RfaW5zZXJ0X2lucHV0IV0nLFxyXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiBwbGFpbkRhdGEuY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5SWQpID0+ICh7IGNhdGVnb3J5X2lkOiBjYXRlZ29yeUlkLCBwcm9kdWN0X2lkOiBwcm9kdWN0SWQgfSkpLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gcGxhaW5EYXRhLmNhdGVnb3JpZXNcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlS2l0UHJvZHVjdHMoXHJcbiAgICBwcm9kdWN0SWQ6IG51bWJlcixcclxuICAgIHsga2l0UHJvZHVjdHMgfTogUGljazxVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiwgJ2tpdFByb2R1Y3RzJz4sXHJcbiAgKTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTFsna2l0UHJvZHVjdHMnXT4ge1xyXG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsga2l0UHJvZHVjdHMgfSlcclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfcHJvZHVjdF9raXQnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X2tpdF9ib29sX2V4cCcsXHJcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgdmFsdWU6IHsga2l0X3Byb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSB9LFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdpbnNlcnRfcHJvZHVjdF9raXQnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xyXG4gICAgICBvYmplY3RzOiB7XHJcbiAgICAgICAgdHlwZTogJ1twcm9kdWN0X2tpdF9pbnNlcnRfaW5wdXQhXScsXHJcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgdmFsdWU6IHBsYWluRGF0YS5raXRQcm9kdWN0cy5tYXAoKGtpdFByb2R1Y3QpID0+ICh7XHJcbiAgICAgICAgICBraXRfcHJvZHVjdF9pZDogcHJvZHVjdElkLFxyXG4gICAgICAgICAgcHJvZHVjdF9pZDoga2l0UHJvZHVjdC5wcm9kdWN0SWQgfHwga2l0UHJvZHVjdC5wcm9kdWN0LmlkLFxyXG4gICAgICAgICAgcXVhbnRpdHk6IGtpdFByb2R1Y3QucXVhbnRpdHksXHJcbiAgICAgICAgfSkpLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gcGxhaW5EYXRhLmtpdFByb2R1Y3RzXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVJldmlld3MoXHJcbiAgICBwcm9kdWN0SWQ6IG51bWJlcixcclxuICAgIHsgcmV2aWV3cyB9OiBQaWNrPFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+LCAncmV2aWV3cyc+LFxyXG4gICk6IFByb21pc2U8UHJvZHVjdFJldmlld1tdPiB7XHJcbiAgICBpZiAoIXJldmlld3MpIHJldHVybiBbXVxyXG4gICAgaWYgKCdhY3Rpb24nIGluIHJldmlld3MgJiYgcmV2aWV3cy5hY3Rpb24gPT09ICdyZW1vdmUnKSB7XHJcbiAgICAgIGNvbnN0IHJldmlld0lkcyA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgIHJldmlld3MudmFsdWUubWFwKGFzeW5jIChyZXZpZXdEYXRhKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCByZXZpZXcgPSBhd2FpdCB0aGlzLmZpbmRSZXZpZXcocmV2aWV3RGF0YSwgcHJvZHVjdElkKVxyXG5cclxuICAgICAgICAgIHJldHVybiByZXZpZXc/LmlkXHJcbiAgICAgICAgfSksXHJcbiAgICAgIClcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2RlbGV0ZV9wcm9kdWN0X3JldmlldycsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgICAgd2hlcmU6IHsgdmFsdWU6IHsgaWQ6IHsgX2luOiByZXZpZXdJZHMuZmlsdGVyKEJvb2xlYW4pIH0gfSwgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X2Jvb2xfZXhwJywgcmVxdWlyZWQ6IHRydWUgfSxcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHJldHVybiByZXZpZXdzLnZhbHVlLm1hcCgocmV2aWV3LCBpbmRleCkgPT4gIXJldmlld0lkc1tpbmRleF0gJiYgcmV2aWV3KS5maWx0ZXIoQm9vbGVhbilcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwbGFpbkRhdGEgPSB0aGlzLnBhcmFtc1RvUGxhaW4oeyByZXZpZXdzIH0pXHJcblxyXG4gICAgaWYgKCFwbGFpbkRhdGEucmV2aWV3cyB8fCBwbGFpbkRhdGEucmV2aWV3cy5sZW5ndGggPD0gMCkgcmV0dXJuIFtdXHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxyXG4gICAgICBwbGFpbkRhdGEucmV2aWV3cy5tYXAoYXN5bmMgKHJldmlld0RhdGEpID0+IHtcclxuICAgICAgICBjb25zdCByZXZpZXcgPSBhd2FpdCB0aGlzLmZpbmRSZXZpZXcocmV2aWV3RGF0YSwgcHJvZHVjdElkKVxyXG5cclxuICAgICAgICBpZiAocmV2aWV3LmlkKVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmluZFJldmlld1RvTW9kZWwoXHJcbiAgICAgICAgICAgIChcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCd1cGRhdGVfcHJvZHVjdF9yZXZpZXdfYnlfcGsnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcclxuICAgICAgICAgICAgICAgIHBrX2NvbHVtbnM6IHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgaWQ6IHJldmlldy5pZCB9LFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfcGtfY29sdW1uc19pbnB1dCcsXHJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIF9zZXQ6IHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IG9taXQodGhpcy5iaW5kUmV2aWV3VG9IYXN1cmEocmV2aWV3RGF0YSksIFsnaWQnLCAncHJvZHVjdF9pZCddKSxcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X3NldF9pbnB1dCcsXHJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApLnVwZGF0ZV9wcm9kdWN0X3Jldmlld19ieV9wayxcclxuICAgICAgICAgIClcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZFJldmlld1RvTW9kZWwoXHJcbiAgICAgICAgICAoXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2luc2VydF9wcm9kdWN0X3Jldmlld19vbmUnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcclxuICAgICAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBvbWl0KHsgLi4udGhpcy5iaW5kUmV2aWV3VG9IYXN1cmEocmV2aWV3RGF0YSksIHByb2R1Y3RfaWQ6IHByb2R1Y3RJZCB9LCBbJ2lkJ10pLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X2luc2VydF9pbnB1dCcsXHJcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKS5pbnNlcnRfcHJvZHVjdF9yZXZpZXdfb25lLFxyXG4gICAgICAgIClcclxuICAgICAgfSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU1ldGFkYXRhKFxyXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXHJcbiAgICB7IG1ldGFkYXRhIH06IFBpY2s8VXBkYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4sICdtZXRhZGF0YSc+LFxyXG4gICk6IFByb21pc2U8UHJvZHVjdE1ldGFkYXRhPiB7XHJcbiAgICBjb25zdCBwbGFpbkRhdGEgPSB0aGlzLnBhcmFtc1RvUGxhaW4oeyBtZXRhZGF0YSB9KVxyXG5cclxuICAgIGlmICghcGxhaW5EYXRhLm1ldGFkYXRhKSByZXR1cm5cclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCd1cGRhdGVfcHJvZHVjdF9tZXRhZGF0YV9ieV9waycsIFsncHJvZHVjdF9pZCddLCB7XHJcbiAgICAgIHBrX2NvbHVtbnM6IHtcclxuICAgICAgICB2YWx1ZTogeyBwcm9kdWN0X2lkOiBwcm9kdWN0SWQgfSxcclxuICAgICAgICB0eXBlOiAncHJvZHVjdF9tZXRhZGF0YV9wa19jb2x1bW5zX2lucHV0JyxcclxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAgX3NldDoge1xyXG4gICAgICAgIHZhbHVlOiBvbWl0KG1ldGFkYXRhLCBbJ3Byb2R1Y3RfaWQnXSksXHJcbiAgICAgICAgdHlwZTogJ3Byb2R1Y3RfbWV0YWRhdGFfc2V0X2lucHV0JyxcclxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIHBsYWluRGF0YS5tZXRhZGF0YVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRJZChpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGlmICghTnVtYmVyLmlzTmFOKCtpZCkpIHJldHVybiBpZFxyXG5cclxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5maW5kKHsgZmlsdGVyczogeyBmaXJlc3RvcmVJZDogaWQgfSwgb3B0aW9uczogeyBlbmFibGVDb3VudDogZmFsc2UgfSB9KVxyXG5cclxuICAgIGlmIChkYXRhPy5bMF0/LmlkKSByZXR1cm4gZGF0YT8uWzBdPy5pZFxyXG5cclxuICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBQcm9kdWN0IHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZmluZFJldmlld3NCeVByb2R1Y3QocHJvZHVjdElkOiBudW1iZXIpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXdbXT4ge1xyXG4gICAgY29uc3QgeyBwcm9kdWN0X3JldmlldzogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeSgncHJvZHVjdF9yZXZpZXcnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcclxuICAgICAgd2hlcmU6IHtcclxuICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X2Jvb2xfZXhwJyxcclxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5tYXAoKHJldmlldykgPT4gdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChyZXZpZXcpKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBmaW5kUmV2aWV3KHJldmlldzogUHJvZHVjdFJldmlldywgcHJvZHVjdElkOiBudW1iZXIpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXc+IHtcclxuICAgIGlmIChyZXZpZXcuaWQpIHJldHVybiByZXZpZXdcclxuXHJcbiAgICBsZXQgbG9hZGVkUmV2aWV3OiBQcm9kdWN0UmV2aWV3XHJcblxyXG4gICAgaWYgKHJldmlldy5wZXJzb25JZCkgbG9hZGVkUmV2aWV3ID0gYXdhaXQgdGhpcy5nZXRSZXZpZXdCeVBlcnNvbklkKHJldmlldy5wZXJzb25JZCwgcHJvZHVjdElkLCByZXZpZXcub3JkZXJJZClcclxuICAgIGlmICghbG9hZGVkUmV2aWV3ICYmIHJldmlldy5hdXRob3IgJiYgcmV2aWV3LmVtYWlsKVxyXG4gICAgICBsb2FkZWRSZXZpZXcgPSBhd2FpdCB0aGlzLmdldFJldmlld0J5QXV0aG9yQW5kRW1haWwocmV2aWV3LmF1dGhvciwgcmV2aWV3LmVtYWlsLCBwcm9kdWN0SWQsIHJldmlldy5vcmRlcklkKVxyXG5cclxuICAgIHJldHVybiBsb2FkZWRSZXZpZXcgfHwgcmV2aWV3XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldFJldmlld0J5UGVyc29uSWQocGVyc29uSWQ6IG51bWJlciwgcHJvZHVjdElkOiBudW1iZXIsIG9yZGVySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXc+IHtcclxuICAgIGNvbnN0IHsgcHJvZHVjdF9yZXZpZXc6IGRhdGEgfSA9IGF3YWl0IHRoaXMucXVlcnkoJ3Byb2R1Y3RfcmV2aWV3JywgdGhpcy5yZXZpZXdzRmllbGRzLCB7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgIHByb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSxcclxuICAgICAgICAgIHBlcnNvbl9pZDogeyBfZXE6IHBlcnNvbklkIH0sXHJcbiAgICAgICAgICAuLi4ob3JkZXJJZCAmJiB7IG9yZGVyX2lkOiB7IF9lcTogb3JkZXJJZCB9IH0pLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHlwZTogYHByb2R1Y3RfcmV2aWV3X2Jvb2xfZXhwYCxcclxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YVswXSAmJiB0aGlzLmJpbmRSZXZpZXdUb01vZGVsKGRhdGFbMF0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldFJldmlld0J5QXV0aG9yQW5kRW1haWwoXHJcbiAgICBhdXRob3I6IHN0cmluZyxcclxuICAgIGVtYWlsOiBzdHJpbmcsXHJcbiAgICBwcm9kdWN0SWQ6IG51bWJlcixcclxuICAgIG9yZGVySWQ/OiBzdHJpbmcsXHJcbiAgKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3PiB7XHJcbiAgICBjb25zdCB7IHByb2R1Y3RfcmV2aWV3OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KCdwcm9kdWN0X3JldmlldycsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0sXHJcbiAgICAgICAgICBhdXRob3I6IHsgX2VxOiBhdXRob3IgfSxcclxuICAgICAgICAgIGVtYWlsOiB7IF9lcTogZW1haWwgfSxcclxuICAgICAgICAgIC4uLihvcmRlcklkICYmIHsgb3JkZXJfaWQ6IHsgX2VxOiBvcmRlcklkIH0gfSksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0eXBlOiBgcHJvZHVjdF9yZXZpZXdfYm9vbF9leHBgLFxyXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gZGF0YSAmJiBkYXRhWzBdICYmIHRoaXMuYmluZFJldmlld1RvTW9kZWwoZGF0YVswXSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmluZFJldmlld1RvTW9kZWwgPSAocGxhaW46IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9kdWN0UmV2aWV3ID0+ICh7XHJcbiAgICAuLi5vbWl0KHBsYWluLCBbJ3Byb2R1Y3RfaWQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ3BlcnNvbl9pZCcsICdvcmRlcl9pZCddKSxcclxuICAgIGNyZWF0ZWRBdDogdHlwZW9mIHBsYWluLmNyZWF0ZWRfYXQgPT09ICdzdHJpbmcnID8gbmV3IERhdGUocGxhaW4uY3JlYXRlZF9hdCkgOiBwbGFpbi5jcmVhdGVkX2F0LFxyXG4gICAgdXBkYXRlZEF0OiB0eXBlb2YgcGxhaW4udXBkYXRlZF9hdCA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZShwbGFpbi51cGRhdGVkX2F0KSA6IHBsYWluLnVwZGF0ZWRfYXQsXHJcbiAgICBwZXJzb25JZDogcGxhaW4ucGVyc29uX2lkLFxyXG4gICAgb3JkZXJJZDogcGxhaW4ub3JkZXJfaWQsXHJcbiAgfSlcclxuXHJcbiAgcHJpdmF0ZSBiaW5kUmV2aWV3VG9IYXN1cmEgPSAocmV2aWV3OiBQcm9kdWN0UmV2aWV3KTogUHJvZHVjdFJldmlld0ZpZWxkcyA9PiAoe1xyXG4gICAgLi4ub21pdChyZXZpZXcsIFsncHJvZHVjdElkJywgJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnLCAncGVyc29uSWQnLCAnb3JkZXJJZCddKSxcclxuICAgIHBlcnNvbl9pZDogcmV2aWV3LnBlcnNvbklkLFxyXG4gICAgb3JkZXJfaWQ6IHJldmlldy5vcmRlcklkLFxyXG4gIH0pXHJcbn1cclxuIl19