@devx-commerce/plugin-gati 0.0.34-beta.7 → 0.0.34-beta.71

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 (369) hide show
  1. package/.medusa/server/src/admin/index.js +3 -1
  2. package/.medusa/server/src/admin/index.mjs +3 -1
  3. package/.medusa/server/src/api/admin/erp-event/query-config.js +8 -1
  4. package/.medusa/server/src/api/admin/masters/utils.js +29 -1
  5. package/.medusa/server/src/api/admin/masters/validators.js +2 -2
  6. package/.medusa/server/src/api/admin/variant-options/recalculate/route.js +446 -0
  7. package/.medusa/server/src/api/admin/variant-options/sync/route.js +21 -5
  8. package/.medusa/server/src/api/erp/webhook/config.js +71 -5
  9. package/.medusa/server/src/api/erp/webhook/route.js +10 -137
  10. package/.medusa/server/src/api/erp/webhook/utils.js +8 -1
  11. package/.medusa/server/src/api/pos/customer-ledger/middleware.js +13 -0
  12. package/.medusa/server/src/api/pos/customer-ledger/route.js +50 -0
  13. package/.medusa/server/src/api/pos/generate-invoice/route.js +164 -0
  14. package/.medusa/server/src/api/pos/gold/calculate/route.js +104 -0
  15. package/.medusa/server/src/api/pos/gold/item-master-purity.js +46 -0
  16. package/.medusa/server/src/api/pos/gold/middleware.js +18 -0
  17. package/.medusa/server/src/api/pos/gold/route.js +83 -0
  18. package/.medusa/server/src/api/pos/gold-rate/route.js +37 -24
  19. package/.medusa/server/src/api/pos/middleware.js +13 -1
  20. package/.medusa/server/src/api/pos/old-gold-item/middleware.js +10 -0
  21. package/.medusa/server/src/api/pos/old-gold-item/route.js +52 -0
  22. package/.medusa/server/src/api/pos/platinumdata/middleware.js +13 -0
  23. package/.medusa/server/src/api/pos/platinumdata/route.js +41 -0
  24. package/.medusa/server/src/api/pos/silverdata/middleware.js +13 -0
  25. package/.medusa/server/src/api/pos/silverdata/route.js +41 -0
  26. package/.medusa/server/src/api/pos/wallet-balance/middleware.js +13 -0
  27. package/.medusa/server/src/api/pos/wallet-balance/route.js +68 -0
  28. package/.medusa/server/src/api/store/custom-price/validators.js +2 -2
  29. package/.medusa/server/src/api/store/customer-ledger/middleware.js +13 -0
  30. package/.medusa/server/src/api/store/customer-ledger/route.js +49 -0
  31. package/.medusa/server/src/api/store/gold-rate/validators.js +2 -2
  32. package/.medusa/server/src/api/store/middleware.js +5 -1
  33. package/.medusa/server/src/api/store/wallet-balance/middleware.js +13 -0
  34. package/.medusa/server/src/api/store/wallet-balance/route.js +67 -0
  35. package/.medusa/server/src/jobs/process-erp-events.js +128 -0
  36. package/.medusa/server/src/jobs/process-variant-option-sync.js +46 -29
  37. package/.medusa/server/src/jobs/sync-addless-detail.js +65 -0
  38. package/.medusa/server/src/jobs/sync-book-list-and-applicable-policy.js +94 -0
  39. package/.medusa/server/src/jobs/sync-customer-advance-payment-erp.js +105 -0
  40. package/.medusa/server/src/jobs/sync-customer-erp.js +119 -0
  41. package/.medusa/server/src/jobs/sync-item-master.js +26 -0
  42. package/.medusa/server/src/jobs/sync-labour-chart-master.js +26 -0
  43. package/.medusa/server/src/jobs/sync-order-erp.js +46 -20
  44. package/.medusa/server/src/jobs/sync-order-request-erp.js +61 -0
  45. package/.medusa/server/src/jobs/sync-payment-book-master.js +68 -0
  46. package/.medusa/server/src/jobs/sync-rate-chart-master.js +26 -0
  47. package/.medusa/server/src/jobs/sync-report-master.js +51 -0
  48. package/.medusa/server/src/jobs/sync-sale-return-policy-master.js +35 -0
  49. package/.medusa/server/src/jobs/sync-urd-purchase-erp.js +82 -0
  50. package/.medusa/server/src/lib/api-response.js +2 -1
  51. package/.medusa/server/src/links/jewel-trans-master.js +13 -0
  52. package/.medusa/server/src/links/order-master.js +13 -0
  53. package/.medusa/server/src/links/sale-master.js +13 -0
  54. package/.medusa/server/src/modules/addless-detail/index.js +13 -0
  55. package/.medusa/server/src/modules/addless-detail/migrations/Migration20260212101102.js +15 -0
  56. package/.medusa/server/src/modules/addless-detail/migrations/Migration20260213000000.js +47 -0
  57. package/.medusa/server/src/modules/addless-detail/migrations/Migration20260226053037.js +15 -0
  58. package/.medusa/server/src/modules/addless-detail/models/addless-master.js +17 -0
  59. package/.medusa/server/src/modules/addless-detail/service.js +10 -0
  60. package/.medusa/server/src/modules/applicable-sale-return-policy/index.js +13 -0
  61. package/.medusa/server/src/modules/applicable-sale-return-policy/migrations/Migration20260123083526.js +15 -0
  62. package/.medusa/server/src/modules/applicable-sale-return-policy/models/applicable-sale-return-policy.js +23 -0
  63. package/.medusa/server/src/modules/applicable-sale-return-policy/service.js +10 -0
  64. package/.medusa/server/src/modules/book-list/index.js +13 -0
  65. package/.medusa/server/src/modules/book-list/migrations/Migration20260123083525.js +15 -0
  66. package/.medusa/server/src/modules/book-list/migrations/Migration20260401051011.js +14 -0
  67. package/.medusa/server/src/modules/book-list/models/book-list.js +13 -0
  68. package/.medusa/server/src/modules/book-list/service.js +10 -0
  69. package/.medusa/server/src/modules/category-group-master/migrations/Migration20250729035221.js +2 -2
  70. package/.medusa/server/src/modules/category-group-master/migrations/Migration20251031061116.js +2 -2
  71. package/.medusa/server/src/modules/category-group-master/migrations/Migration20251104045912.js +2 -2
  72. package/.medusa/server/src/modules/category-master/migrations/Migration20250513122212.js +2 -2
  73. package/.medusa/server/src/modules/category-master/migrations/Migration20250519180539.js +2 -2
  74. package/.medusa/server/src/modules/category-master/migrations/Migration20250531004724.js +2 -2
  75. package/.medusa/server/src/modules/category-master/migrations/Migration20250729040659.js +2 -2
  76. package/.medusa/server/src/modules/category-master/migrations/Migration20251031061327.js +2 -2
  77. package/.medusa/server/src/modules/category-master/migrations/Migration20251104045755.js +2 -2
  78. package/.medusa/server/src/modules/collection-group-master/migrations/Migration20250531022203.js +2 -2
  79. package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251031061432.js +2 -2
  80. package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251104050102.js +2 -2
  81. package/.medusa/server/src/modules/collection-master/migrations/Migration20250513122211.js +2 -2
  82. package/.medusa/server/src/modules/collection-master/migrations/Migration20250531025048.js +2 -2
  83. package/.medusa/server/src/modules/collection-master/migrations/Migration20251031060941.js +2 -2
  84. package/.medusa/server/src/modules/collection-master/migrations/Migration20251104050012.js +2 -2
  85. package/.medusa/server/src/modules/customer-receive-voucher/index.js +13 -0
  86. package/.medusa/server/src/modules/customer-receive-voucher/migrations/Migration20250115000000.js +51 -0
  87. package/.medusa/server/src/modules/customer-receive-voucher/migrations/Migration20260106050934.js +18 -0
  88. package/.medusa/server/src/modules/customer-receive-voucher/models/customer-receive-voucher.js +35 -0
  89. package/.medusa/server/src/modules/customer-receive-voucher/service.js +10 -0
  90. package/.medusa/server/src/modules/discount-master/migrations/Migration20250707232514.js +2 -2
  91. package/.medusa/server/src/modules/discount-master/migrations/Migration20250708051709.js +2 -2
  92. package/.medusa/server/src/modules/discount-master/migrations/Migration20250708051737.js +2 -2
  93. package/.medusa/server/src/modules/discount-master/migrations/Migration20251031061523.js +2 -2
  94. package/.medusa/server/src/modules/discount-master/migrations/Migration20251104050153.js +2 -2
  95. package/.medusa/server/src/modules/erp/migrations/Migration20250513121436.js +2 -2
  96. package/.medusa/server/src/modules/erp/service.js +601 -8
  97. package/.medusa/server/src/modules/erp-event/migrations/Migration20250908040911.js +2 -2
  98. package/.medusa/server/src/modules/erp-event/migrations/Migration20250922095956.js +2 -2
  99. package/.medusa/server/src/modules/erp-event/migrations/Migration20260529052734.js +14 -0
  100. package/.medusa/server/src/modules/erp-event/models/erp-event.js +6 -1
  101. package/.medusa/server/src/modules/extended-product/migrations/Migration20250620030100.js +2 -2
  102. package/.medusa/server/src/modules/extended-product/migrations/Migration20250716041546.js +2 -2
  103. package/.medusa/server/src/modules/extended-product/migrations/Migration20251103182726.js +2 -2
  104. package/.medusa/server/src/modules/extended-product/migrations/Migration20251119062526.js +2 -2
  105. package/.medusa/server/src/modules/extended-product/migrations/Migration20251202055742.js +2 -2
  106. package/.medusa/server/src/modules/extended-product/migrations/Migration20251202064200.js +2 -2
  107. package/.medusa/server/src/modules/extended-product/migrations/Migration20260323103543.js +14 -0
  108. package/.medusa/server/src/modules/extended-product/models/extended-product.js +2 -1
  109. package/.medusa/server/src/modules/extended-product/service.js +37 -1
  110. package/.medusa/server/src/modules/extended-variant/migrations/Migration20250620030335.js +2 -2
  111. package/.medusa/server/src/modules/extended-variant/migrations/Migration20250620030522.js +2 -2
  112. package/.medusa/server/src/modules/extended-variant/migrations/Migration20250629220100.js +2 -2
  113. package/.medusa/server/src/modules/extended-variant/migrations/Migration20250629223425.js +2 -2
  114. package/.medusa/server/src/modules/extended-variant/migrations/Migration20250704064831.js +2 -2
  115. package/.medusa/server/src/modules/extended-variant/migrations/Migration20250716121609.js +2 -2
  116. package/.medusa/server/src/modules/extended-variant/migrations/Migration20250725104852.js +2 -2
  117. package/.medusa/server/src/modules/extended-variant/migrations/Migration20250726232339.js +2 -2
  118. package/.medusa/server/src/modules/extended-variant/migrations/Migration20250916065103.js +2 -2
  119. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251119063328.js +2 -2
  120. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120045708.js +2 -2
  121. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120051832.js +2 -2
  122. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120052514.js +2 -2
  123. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251202055952.js +2 -2
  124. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251210112341.js +18 -0
  125. package/.medusa/server/src/modules/extended-variant/migrations/Migration20260616000001.js +14 -0
  126. package/.medusa/server/src/modules/extended-variant/models/extended-variant.js +4 -2
  127. package/.medusa/server/src/modules/extended-variant/service.js +37 -1
  128. package/.medusa/server/src/modules/item-master/index.js +13 -0
  129. package/.medusa/server/src/modules/item-master/migrations/Migration20260212101055.js +15 -0
  130. package/.medusa/server/src/modules/item-master/models/item-master.js +20 -0
  131. package/.medusa/server/src/modules/item-master/service.js +10 -0
  132. package/.medusa/server/src/modules/item-size-master/migrations/Migration20251031111036.js +2 -2
  133. package/.medusa/server/src/modules/jewel-trans-master/index.js +13 -0
  134. package/.medusa/server/src/modules/jewel-trans-master/migrations/Migration20260226053036.js +57 -0
  135. package/.medusa/server/src/modules/jewel-trans-master/models/jewel-trans-master.js +151 -0
  136. package/.medusa/server/src/modules/jewel-trans-master/service.js +16 -0
  137. package/.medusa/server/src/modules/labour-chart-master/index.js +13 -0
  138. package/.medusa/server/src/modules/labour-chart-master/migrations/Migration20260101081502.js +15 -0
  139. package/.medusa/server/src/modules/labour-chart-master/models/labour-chart-master.js +16 -0
  140. package/.medusa/server/src/modules/labour-chart-master/service.js +10 -0
  141. package/.medusa/server/src/modules/material-purchase-master/index.js +13 -0
  142. package/.medusa/server/src/modules/material-purchase-master/migrations/Migration20260310090700.js +18 -0
  143. package/.medusa/server/src/modules/material-purchase-master/models/material-purchase-detail-line.js +24 -0
  144. package/.medusa/server/src/modules/material-purchase-master/models/material-purchase-master.js +21 -0
  145. package/.medusa/server/src/modules/material-purchase-master/service.js +12 -0
  146. package/.medusa/server/src/modules/order-master/index.js +13 -0
  147. package/.medusa/server/src/modules/order-master/migrations/Migration20260226053036.js +29 -0
  148. package/.medusa/server/src/modules/order-master/migrations/Migration20260303000001.js +30 -0
  149. package/.medusa/server/src/modules/order-master/migrations/Migration20260319094758.js +26 -0
  150. package/.medusa/server/src/modules/order-master/migrations/Migration20260320000001.js +19 -0
  151. package/.medusa/server/src/modules/order-master/models/order-master.js +112 -0
  152. package/.medusa/server/src/modules/order-master/service.js +13 -0
  153. package/.medusa/server/src/modules/order-proceed-master/index.js +13 -0
  154. package/.medusa/server/src/modules/order-proceed-master/migrations/Migration20260327100226.js +31 -0
  155. package/.medusa/server/src/modules/order-proceed-master/models/order-proceed-master.js +38 -0
  156. package/.medusa/server/src/modules/order-proceed-master/service.js +11 -0
  157. package/.medusa/server/src/modules/party-master/migrations/Migration20250604104235.js +2 -2
  158. package/.medusa/server/src/modules/party-master/migrations/Migration20250604115453.js +2 -2
  159. package/.medusa/server/src/modules/party-master/migrations/Migration20250604120348.js +2 -2
  160. package/.medusa/server/src/modules/party-master/migrations/Migration20250604120701.js +2 -2
  161. package/.medusa/server/src/modules/party-master/migrations/Migration20250608220924.js +2 -2
  162. package/.medusa/server/src/modules/party-master/migrations/Migration20250612225738.js +2 -2
  163. package/.medusa/server/src/modules/party-master/migrations/Migration20250612231031.js +2 -2
  164. package/.medusa/server/src/modules/party-master/migrations/Migration20250708123734.js +2 -2
  165. package/.medusa/server/src/modules/party-master/migrations/Migration20251031061657.js +2 -2
  166. package/.medusa/server/src/modules/party-master/migrations/Migration20251104050242.js +2 -2
  167. package/.medusa/server/src/modules/payment-book-master/index.js +13 -0
  168. package/.medusa/server/src/modules/payment-book-master/migrations/Migration20251203105358.js +15 -0
  169. package/.medusa/server/src/modules/payment-book-master/models/payment-book-master.js +12 -0
  170. package/.medusa/server/src/modules/payment-book-master/service.js +10 -0
  171. package/.medusa/server/src/modules/promocode-master/migrations/Migration20250819123821.js +2 -2
  172. package/.medusa/server/src/modules/promocode-master/migrations/Migration20250918095713.js +2 -2
  173. package/.medusa/server/src/modules/promocode-master/migrations/Migration20251031061829.js +2 -2
  174. package/.medusa/server/src/modules/promocode-master/migrations/Migration20251104050332.js +2 -2
  175. package/.medusa/server/src/modules/quality-master/migrations/Migration20251031095211.js +2 -2
  176. package/.medusa/server/src/modules/quality-master/migrations/Migration20251105045114.js +2 -2
  177. package/.medusa/server/src/modules/rate-chart-master/index.js +13 -0
  178. package/.medusa/server/src/modules/rate-chart-master/migrations/Migration20260101081500.js +15 -0
  179. package/.medusa/server/src/modules/rate-chart-master/models/rate-chart-master.js +13 -0
  180. package/.medusa/server/src/modules/rate-chart-master/service.js +10 -0
  181. package/.medusa/server/src/modules/raw-master/migrations/Migration20250509190057.js +2 -2
  182. package/.medusa/server/src/modules/raw-master/migrations/Migration20250509190322.js +2 -2
  183. package/.medusa/server/src/modules/raw-master/migrations/Migration20251031061912.js +2 -2
  184. package/.medusa/server/src/modules/receive-voucher-master/index.js +13 -0
  185. package/.medusa/server/src/modules/receive-voucher-master/migrations/Migration20260328053649.js +16 -0
  186. package/.medusa/server/src/modules/receive-voucher-master/models/receive-voucher-master.js +27 -0
  187. package/.medusa/server/src/modules/receive-voucher-master/service.js +10 -0
  188. package/.medusa/server/src/modules/report-master/index.js +13 -0
  189. package/.medusa/server/src/modules/report-master/migrations/Migration20260121060955.js +15 -0
  190. package/.medusa/server/src/modules/report-master/migrations/Migration20260121112624.js +15 -0
  191. package/.medusa/server/src/modules/report-master/models/report-master.js +12 -0
  192. package/.medusa/server/src/modules/report-master/service.js +10 -0
  193. package/.medusa/server/src/modules/sale-master/index.js +13 -0
  194. package/.medusa/server/src/modules/sale-master/migrations/Migration20260205092935.js +15 -0
  195. package/.medusa/server/src/modules/sale-master/migrations/Migration20260205100000.js +16 -0
  196. package/.medusa/server/src/modules/sale-master/models/sale-master.js +27 -0
  197. package/.medusa/server/src/modules/sale-master/service.js +10 -0
  198. package/.medusa/server/src/modules/sale-return-master/index.js +13 -0
  199. package/.medusa/server/src/modules/sale-return-master/migrations/Migration20260205093034.js +15 -0
  200. package/.medusa/server/src/modules/sale-return-master/migrations/Migration20260327084135.js +14 -0
  201. package/.medusa/server/src/modules/sale-return-master/models/sale-return-master.js +18 -0
  202. package/.medusa/server/src/modules/sale-return-master/service.js +10 -0
  203. package/.medusa/server/src/modules/sale-return-policy-master/index.js +13 -0
  204. package/.medusa/server/src/modules/sale-return-policy-master/migrations/Migration20260105061449.js +21 -0
  205. package/.medusa/server/src/modules/sale-return-policy-master/migrations/Migration20260129084920.js +14 -0
  206. package/.medusa/server/src/modules/sale-return-policy-master/migrations/Migration20260129085620.js +20 -0
  207. package/.medusa/server/src/modules/sale-return-policy-master/models/sale-return-policy-master.js +37 -0
  208. package/.medusa/server/src/modules/sale-return-policy-master/service.js +12 -0
  209. package/.medusa/server/src/modules/shape-master/migrations/Migration20250509174455.js +2 -2
  210. package/.medusa/server/src/modules/shape-master/migrations/Migration20251031062019.js +2 -2
  211. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20250713113247.js +2 -2
  212. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20250713121440.js +2 -2
  213. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251031062128.js +2 -2
  214. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251104050501.js +2 -2
  215. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251203083315.js +2 -2
  216. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20250513115356.js +2 -2
  217. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20250519180538.js +2 -2
  218. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20250531010409.js +2 -2
  219. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20250730025135.js +2 -2
  220. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20250730025307.js +2 -2
  221. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20250730032130.js +2 -2
  222. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251031062303.js +2 -2
  223. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251104050743.js +2 -2
  224. package/.medusa/server/src/modules/tone-master/migrations/Migration20251031104320.js +2 -2
  225. package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251101082220.js +2 -2
  226. package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251103123857.js +2 -2
  227. package/.medusa/server/src/subscribers/cutomer-updated.js +3 -1
  228. package/.medusa/server/src/subscribers/erp-batch-processor.js +147 -0
  229. package/.medusa/server/src/subscribers/order-item-update.js +11 -0
  230. package/.medusa/server/src/subscribers/party-master.js +39 -35
  231. package/.medusa/server/src/subscribers/product-sync.js +1 -1
  232. package/.medusa/server/src/subscribers/product-variant-deleted.js +27 -0
  233. package/.medusa/server/src/subscribers/shipping-info-master.js +10 -4
  234. package/.medusa/server/src/utils/build-redis-key.js +3 -1
  235. package/.medusa/server/src/utils/state-helper.js +3 -2
  236. package/.medusa/server/src/workflows/addless-detail/index.js +11 -0
  237. package/.medusa/server/src/workflows/addless-detail/steps/create-or-update-addless-detail.js +36 -0
  238. package/.medusa/server/src/workflows/addless-detail/steps/fetch-addless-detail.js +73 -0
  239. package/.medusa/server/src/workflows/applicable-sale-return-policy/index.js +11 -0
  240. package/.medusa/server/src/workflows/applicable-sale-return-policy/steps/create-or-update-applicable-sale-return-policy.js +74 -0
  241. package/.medusa/server/src/workflows/applicable-sale-return-policy/steps/fetch-applicable-sale-return-policy.js +64 -0
  242. package/.medusa/server/src/workflows/book-list/index.js +11 -0
  243. package/.medusa/server/src/workflows/book-list/steps/create-or-update-book-list.js +59 -0
  244. package/.medusa/server/src/workflows/book-list/steps/fetch-book-list.js +64 -0
  245. package/.medusa/server/src/workflows/create-extended-product-from-product/index.js +9 -8
  246. package/.medusa/server/src/workflows/create-extended-variant-from-variant/index.js +9 -18
  247. package/.medusa/server/src/workflows/customer-advance-payment/index.js +18 -0
  248. package/.medusa/server/src/workflows/customer-advance-payment/steps/create-receive-voucher.js +71 -0
  249. package/.medusa/server/src/workflows/customer-advance-payment/steps/index.js +18 -0
  250. package/.medusa/server/src/workflows/customer-advance-payment/workflows/create-receive-voucher-workflow.js +11 -0
  251. package/.medusa/server/src/workflows/customer-advance-payment/workflows/index.js +18 -0
  252. package/.medusa/server/src/workflows/daily-rate/index.js +29 -0
  253. package/.medusa/server/src/workflows/daily-rate/perf.js +89 -0
  254. package/.medusa/server/src/workflows/daily-rate/steps/fetch-gold-rate-step.js +21 -0
  255. package/.medusa/server/src/workflows/daily-rate/steps/update-inward-metal-rates-step.js +154 -0
  256. package/.medusa/server/src/workflows/daily-rate/steps/update-party-style-metal-rates-step.js +224 -0
  257. package/.medusa/server/src/workflows/daily-rate/steps/update-style-master-metal-rates-step.js +180 -0
  258. package/.medusa/server/src/workflows/erp-batch-processing/index.js +19 -0
  259. package/.medusa/server/src/workflows/erp-batch-processing/steps/finalize-batch-processing.js +55 -0
  260. package/.medusa/server/src/workflows/erp-batch-processing/steps/index.js +20 -0
  261. package/.medusa/server/src/workflows/erp-batch-processing/steps/initialize-batch-processing.js +40 -0
  262. package/.medusa/server/src/workflows/erp-batch-processing/steps/start-batch-processing.js +22 -0
  263. package/.medusa/server/src/workflows/erp-batch-processing/workflows/erp-batch-processing.js +25 -0
  264. package/.medusa/server/src/workflows/erp-batch-processing/workflows/index.js +18 -0
  265. package/.medusa/server/src/workflows/erp-event/steps/update-erp-event.js +24 -7
  266. package/.medusa/server/src/workflows/erp-event/workflows/update-erp-event.js +1 -1
  267. package/.medusa/server/src/workflows/helpers/product-helper.js +212 -21
  268. package/.medusa/server/src/workflows/helpers/variant-helper.js +165 -162
  269. package/.medusa/server/src/workflows/hooks/product-updated.js +23 -15
  270. package/.medusa/server/src/workflows/hooks/variant-updated.js +24 -22
  271. package/.medusa/server/src/workflows/index.js +4 -1
  272. package/.medusa/server/src/workflows/inward-master/helper/index.js +23 -8
  273. package/.medusa/server/src/workflows/inward-master/steps/create-order-fulfillment-for-inward.js +73 -0
  274. package/.medusa/server/src/workflows/inward-master/steps/index.js +3 -1
  275. package/.medusa/server/src/workflows/inward-master/steps/notify-inward-skipped.js +37 -0
  276. package/.medusa/server/src/workflows/inward-master/workflows/create-inward.js +51 -43
  277. package/.medusa/server/src/workflows/inward-master/workflows/delete-inward.js +6 -9
  278. package/.medusa/server/src/workflows/inward-master/workflows/update-instock.js +2 -1
  279. package/.medusa/server/src/workflows/inward-master/workflows/update-inward.js +32 -7
  280. package/.medusa/server/src/workflows/item-master/index.js +11 -0
  281. package/.medusa/server/src/workflows/item-master/steps/create-or-update-item-master.js +50 -0
  282. package/.medusa/server/src/workflows/item-master/steps/fetch-item-master.js +29 -0
  283. package/.medusa/server/src/workflows/jewel-trans-master/index.js +18 -0
  284. package/.medusa/server/src/workflows/jewel-trans-master/steps/create-or-update-jewel-trans-master.js +370 -0
  285. package/.medusa/server/src/workflows/jewel-trans-master/steps/index.js +18 -0
  286. package/.medusa/server/src/workflows/labour-chart-master/index.js +11 -0
  287. package/.medusa/server/src/workflows/labour-chart-master/steps/create-or-update-labour-chart-master.js +38 -0
  288. package/.medusa/server/src/workflows/labour-chart-master/steps/fetch-labour-chart.js +31 -0
  289. package/.medusa/server/src/workflows/material-purchase-master/index.js +24 -0
  290. package/.medusa/server/src/workflows/material-purchase-master/steps/create-material-purchase-master.js +119 -0
  291. package/.medusa/server/src/workflows/material-purchase-master/steps/delete-material-purchase-master.js +102 -0
  292. package/.medusa/server/src/workflows/material-purchase-master/steps/fetch-material-purchase-master.js +60 -0
  293. package/.medusa/server/src/workflows/material-purchase-master/steps/update-material-purchase-master.js +149 -0
  294. package/.medusa/server/src/workflows/order-master/index.js +3 -0
  295. package/.medusa/server/src/workflows/order-master/order-master-webhook.js +24 -0
  296. package/.medusa/server/src/workflows/order-master/steps/create-or-update-order-master.js +275 -0
  297. package/.medusa/server/src/workflows/order-master/steps/delete-order-master-by-erp-ids.js +61 -0
  298. package/.medusa/server/src/workflows/order-master/steps/process-order-master-from-webhook.js +1024 -0
  299. package/.medusa/server/src/workflows/order-proceed-master/index.js +6 -0
  300. package/.medusa/server/src/workflows/order-proceed-master/order-proceed-master-webhook.js +26 -0
  301. package/.medusa/server/src/workflows/order-proceed-master/steps/create-or-update-order-proceed-master.js +186 -0
  302. package/.medusa/server/src/workflows/order-proceed-master/steps/delete-order-proceed-master-by-erp-ids.js +28 -0
  303. package/.medusa/server/src/workflows/orders/steps/find-nearest-pincodes-step.js +336 -0
  304. package/.medusa/server/src/workflows/orders/steps/get-today-gold-rate-step.js +77 -0
  305. package/.medusa/server/src/workflows/orders/steps/index.js +15 -1
  306. package/.medusa/server/src/workflows/orders/steps/revert-to-wallet-step.js +165 -0
  307. package/.medusa/server/src/workflows/orders/steps/sync-advance-payment-to-erp-step.js +185 -0
  308. package/.medusa/server/src/workflows/orders/steps/sync-buyback-to-erp-step.js +99 -0
  309. package/.medusa/server/src/workflows/orders/steps/sync-cancel-to-erp-step.js +120 -0
  310. package/.medusa/server/src/workflows/orders/steps/sync-exchange-to-erp-step.js +101 -0
  311. package/.medusa/server/src/workflows/orders/steps/sync-old-gold-to-erp-step.js +161 -0
  312. package/.medusa/server/src/workflows/orders/steps/sync-order-to-erp.js +743 -20
  313. package/.medusa/server/src/workflows/orders/steps/sync-sale-return-to-erp-step.js +277 -0
  314. package/.medusa/server/src/workflows/orders/steps/update-old-gold-sync-status-step.js +64 -0
  315. package/.medusa/server/src/workflows/orders/utils/order-helper.js +183 -38
  316. package/.medusa/server/src/workflows/orders/utils/order-request-helper.js +235 -0
  317. package/.medusa/server/src/workflows/orders/workflows/get-today-gold-rate.js +10 -0
  318. package/.medusa/server/src/workflows/orders/workflows/index.js +4 -1
  319. package/.medusa/server/src/workflows/orders/workflows/sync-advanve-payment-to-erp.js +21 -0
  320. package/.medusa/server/src/workflows/orders/workflows/sync-old-gold-to-erp.js +24 -0
  321. package/.medusa/server/src/workflows/orders/workflows/sync-order-to-erp.js +54 -5
  322. package/.medusa/server/src/workflows/orders/workflows/sync-sale-return-to-erp.js +11 -0
  323. package/.medusa/server/src/workflows/party-master/steps/create-customer-erp.js +53 -33
  324. package/.medusa/server/src/workflows/party-master/steps/create-user-erp.js +115 -0
  325. package/.medusa/server/src/workflows/party-master/steps/fetch-party-master.js +2 -1
  326. package/.medusa/server/src/workflows/party-master/steps/index.js +2 -1
  327. package/.medusa/server/src/workflows/party-master/workflows/create-or-update-party-master.js +2 -2
  328. package/.medusa/server/src/workflows/party-master/workflows/create-user-erp.js +11 -0
  329. package/.medusa/server/src/workflows/party-master/workflows/index.js +2 -1
  330. package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-deletion.js +16 -249
  331. package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-variant-update.js +103 -22
  332. package/.medusa/server/src/workflows/party-style-master/workflows/create-or-update-party-style-master.js +49 -18
  333. package/.medusa/server/src/workflows/party-style-master/workflows/delete-party-style-master.js +4 -15
  334. package/.medusa/server/src/workflows/payment-book-master/index.js +11 -0
  335. package/.medusa/server/src/workflows/payment-book-master/steps/create-or-update-payment-book-master.js +37 -0
  336. package/.medusa/server/src/workflows/payment-book-master/steps/fetch-payment-book.js +64 -0
  337. package/.medusa/server/src/workflows/rate-chart-master/index.js +11 -0
  338. package/.medusa/server/src/workflows/rate-chart-master/steps/create-or-update-rate-chart-master.js +25 -0
  339. package/.medusa/server/src/workflows/rate-chart-master/steps/fetch-rate-chart.js +31 -0
  340. package/.medusa/server/src/workflows/receive-voucher-master/index.js +24 -0
  341. package/.medusa/server/src/workflows/receive-voucher-master/steps/create-receive-voucher-master.js +125 -0
  342. package/.medusa/server/src/workflows/receive-voucher-master/steps/delete-receive-voucher-master.js +45 -0
  343. package/.medusa/server/src/workflows/receive-voucher-master/steps/fetch-receive-voucher-master.js +22 -0
  344. package/.medusa/server/src/workflows/receive-voucher-master/steps/update-receive-voucher-master.js +44 -0
  345. package/.medusa/server/src/workflows/report-master/index.js +11 -0
  346. package/.medusa/server/src/workflows/report-master/steps/create-or-update-report-master.js +53 -0
  347. package/.medusa/server/src/workflows/report-master/steps/fetch-report.js +71 -0
  348. package/.medusa/server/src/workflows/sale-master/index.js +24 -0
  349. package/.medusa/server/src/workflows/sale-master/steps/create-sale-master.js +72 -0
  350. package/.medusa/server/src/workflows/sale-master/steps/delete-sale-master.js +59 -0
  351. package/.medusa/server/src/workflows/sale-master/steps/update-sale-master.js +95 -0
  352. package/.medusa/server/src/workflows/sale-return-master/index.js +6 -0
  353. package/.medusa/server/src/workflows/sale-return-master/sale-return-master-webhook.js +28 -0
  354. package/.medusa/server/src/workflows/sale-return-master/steps/create-or-update-sale-return-master.js +109 -0
  355. package/.medusa/server/src/workflows/sale-return-master/steps/create-sale-return-master.js +45 -0
  356. package/.medusa/server/src/workflows/sale-return-master/steps/delete-sale-return-master-by-erp-ids.js +36 -0
  357. package/.medusa/server/src/workflows/sale-return-master/steps/delete-sale-return-master.js +36 -0
  358. package/.medusa/server/src/workflows/sale-return-master/steps/process-sale-return-from-webhook.js +234 -0
  359. package/.medusa/server/src/workflows/sale-return-master/steps/update-sale-return-master.js +53 -0
  360. package/.medusa/server/src/workflows/sale-return-policy-master/index.js +11 -0
  361. package/.medusa/server/src/workflows/sale-return-policy-master/steps/create-or-update-sale-return-policy-master.js +91 -0
  362. package/.medusa/server/src/workflows/sale-return-policy-master/steps/fetch-sale-return-policy.js +31 -0
  363. package/.medusa/server/src/workflows/shipping-info-master/workflows/create-or-update-shipping-info.js +59 -0
  364. package/.medusa/server/src/workflows/shipping-info-master/workflows/index.js +2 -1
  365. package/.medusa/server/src/workflows/style-master/workflows/create-or-update-style-master.js +116 -10
  366. package/.medusa/server/src/workflows/style-master/workflows/delete-style-master.js +9 -1
  367. package/.medusa/server/src/workflows/update-extended-product-from-product/index.js +6 -16
  368. package/.medusa/server/src/workflows/update-extended-variant-from-variant/workflows/update-extended-variant-status-from-variant.js +5 -17
  369. package/package.json +18 -33
@@ -0,0 +1,1024 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processOrderMasterFromWebhookStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const order_master_1 = require("../../../modules/order-master");
7
+ const party_master_1 = require("../../../modules/party-master");
8
+ const extended_variant_1 = require("../../../modules/extended-variant");
9
+ const shipping_info_master_1 = require("../../../modules/shipping-info-master");
10
+ const framework_1 = require("@medusajs/framework");
11
+ /**
12
+ * Map ERP BookName to Medusa payment provider_id.
13
+ * Matches the reverse of the payment mapping in sync-order-to-erp.ts.
14
+ */
15
+ function getProviderFromBookName(bookName) {
16
+ const name = (bookName ?? "").toLowerCase();
17
+ if (name.includes("upi") || name.includes("card") || name.includes("worldline") || name.includes("pos") || name.includes("swipe")) {
18
+ return "pp_worldline-pos_worldline_pos";
19
+ }
20
+ if (name.includes("delivery") || name.includes("cod") || name.includes("payu") || name.includes("gokwik")) {
21
+ return "pp_gokwik_gokwik";
22
+ }
23
+ if (name.includes("razorpay")) {
24
+ return "pp_razorpay_razorpay";
25
+ }
26
+ if (name.includes("cheque")) {
27
+ return "pp_cheque_cheque";
28
+ }
29
+ if (name.includes("bank") || name.includes("transfer") || name.includes("neft") || name.includes("rtgs") || name.includes("imps")) {
30
+ return "pp_bank_transfer_bank_transfer";
31
+ }
32
+ if (name.includes("wallet")) {
33
+ return "pp_wallet_wallet";
34
+ }
35
+ if (name.includes("cash")) {
36
+ return "pp_cash_cash";
37
+ }
38
+ return "pp_system_default";
39
+ }
40
+ /**
41
+ * Normalize fetch result: getMasterData can return single object or array per id.
42
+ */
43
+ function normalizeOrderDataList(result) {
44
+ if (result == null)
45
+ return [];
46
+ if (Array.isArray(result)) {
47
+ return result.flatMap((item) => Array.isArray(item) ? item : item && typeof item === "object" && "OrderId" in item ? [item] : []);
48
+ }
49
+ return result && typeof result === "object" && "OrderId" in result ? [result] : [];
50
+ }
51
+ // ─── Shared: Create Medusa payment collections from ERP PaymentOption data ───
52
+ async function createPaymentCollectionsFromErp(container, link, medusaOrderId, data) {
53
+ const erpPayments = (data.PaymentOption ?? []).filter((p) => p.Amount > 0);
54
+ if (!erpPayments.length) {
55
+ framework_1.logger.info(`[Webhook] No ERP payments (Amount>0) for order ${medusaOrderId} — skipping payment collection`);
56
+ return;
57
+ }
58
+ try {
59
+ const paymentModule = container.resolve(utils_1.Modules.PAYMENT);
60
+ const orderModule = container.resolve(utils_1.Modules.ORDER);
61
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
62
+ // Check for existing payment collections linked to this order
63
+ const { data: existingOrders } = await query.graph({
64
+ entity: "order",
65
+ fields: [
66
+ "payment_collections.id",
67
+ "payment_collections.status",
68
+ "payment_collections.payments.id",
69
+ "payment_collections.payments.amount",
70
+ "payment_collections.payments.captured_at",
71
+ ],
72
+ filters: { id: medusaOrderId },
73
+ });
74
+ const existingCollections = existingOrders?.[0]?.payment_collections ?? [];
75
+ if (existingCollections.length > 0) {
76
+ // Payment collections already exist — ensure transactions are registered
77
+ for (const col of existingCollections) {
78
+ for (const payment of (col.payments ?? [])) {
79
+ if (payment.captured_at) {
80
+ try {
81
+ await orderModule.addTransactions([{
82
+ order_id: medusaOrderId,
83
+ amount: payment.amount,
84
+ currency_code: "inr",
85
+ reference: "payment",
86
+ reference_id: payment.id,
87
+ }]);
88
+ framework_1.logger.info(`[Webhook] addTransactions for existing payment ${payment.id} on order ${medusaOrderId}`);
89
+ }
90
+ catch (txErr) {
91
+ framework_1.logger.warn(`[Webhook] addTransactions (existing payment) skipped for ${medusaOrderId}: ${txErr?.message}`);
92
+ }
93
+ }
94
+ }
95
+ }
96
+ return;
97
+ }
98
+ const totalAmount = erpPayments.reduce((sum, p) => sum + Math.round(p.Amount), 0);
99
+ const paymentCollection = await paymentModule.createPaymentCollections({
100
+ currency_code: "inr",
101
+ amount: totalAmount,
102
+ });
103
+ // Link payment collection → Medusa order
104
+ await link.create({
105
+ [utils_1.Modules.ORDER]: { order_id: medusaOrderId },
106
+ [utils_1.Modules.PAYMENT]: { payment_collection_id: paymentCollection.id },
107
+ });
108
+ // One session per ERP payment → authorize → capture
109
+ for (const p of erpPayments) {
110
+ const amount = Math.round(p.Amount);
111
+ const providerId = getProviderFromBookName(p.BookName);
112
+ const session = await paymentModule.createPaymentSession(paymentCollection.id, {
113
+ provider_id: providerId,
114
+ currency_code: "inr",
115
+ amount: amount,
116
+ data: {
117
+ book_name: p.BookName ?? "",
118
+ trans_prefix: p.TransPrefix ?? "",
119
+ trans_no: p.TransNo ?? "",
120
+ voucher_entry_id: String(p.VoucherEntryId ?? ""),
121
+ },
122
+ });
123
+ // authorizePaymentSession returns PaymentDTO (the payment itself, not the session)
124
+ const payment = await paymentModule.authorizePaymentSession(session.id, {});
125
+ if (payment?.id) {
126
+ await paymentModule.capturePayment({
127
+ payment_id: payment.id,
128
+ amount: amount,
129
+ });
130
+ // Register transaction with order module so paid_total / pending_difference are correct
131
+ try {
132
+ await orderModule.addTransactions([{
133
+ order_id: medusaOrderId,
134
+ amount: amount,
135
+ currency_code: "inr",
136
+ reference: "payment",
137
+ reference_id: payment.id,
138
+ }]);
139
+ }
140
+ catch (txErr) {
141
+ framework_1.logger.warn(`[Webhook] addTransactions failed for order ${medusaOrderId}: ${txErr?.message}`);
142
+ }
143
+ }
144
+ }
145
+ framework_1.logger.info(`[Webhook] Created payment collection ${paymentCollection.id} with ${erpPayments.length} payments (total: ${totalAmount}) for order ${medusaOrderId}`);
146
+ }
147
+ catch (payErr) {
148
+ framework_1.logger.warn(`[Webhook] Payment collection creation failed for order ${medusaOrderId}: ${payErr?.message}`);
149
+ }
150
+ }
151
+ // ─── Shared: Create or update extended_order record ──────────────────────────
152
+ async function createOrUpdateExtendedOrder(container, link, medusaOrderId, erpOrderIdStr, data, customerInfo = {}) {
153
+ try {
154
+ const extOrderService = container.resolve("extended_order");
155
+ const erpPayments = (data.PaymentOption ?? []).filter((p) => p.Amount > 0);
156
+ const paymentMode = erpPayments.length > 1 ? "split" : erpPayments.length === 1 ? "single" : null;
157
+ const existing = await extOrderService.listExtendedOrders({ order_id: medusaOrderId });
158
+ const erpInvoiceNo = [data.OrderPrefix, data.OrderNo].filter(Boolean).join("/") || erpOrderIdStr;
159
+ if (existing?.length > 0) {
160
+ const updatePayload = {
161
+ id: existing[0].id,
162
+ external_id: erpOrderIdStr,
163
+ sync_erp: true,
164
+ sync_erp_error: null,
165
+ };
166
+ if (paymentMode)
167
+ updatePayload.payment_mode = paymentMode;
168
+ if (customerInfo.customerId)
169
+ updatePayload.customer_id = customerInfo.customerId;
170
+ if (customerInfo.email)
171
+ updatePayload.customer_email = customerInfo.email;
172
+ if (customerInfo.phone)
173
+ updatePayload.customer_phone = customerInfo.phone;
174
+ if (data.Customer)
175
+ updatePayload.customer_name = data.Customer;
176
+ // Set order_type and invoice_no if not already set
177
+ if (!existing[0].order_type)
178
+ updatePayload.order_type = "make_to_order";
179
+ if (!existing[0].invoice_no)
180
+ updatePayload.invoice_no = erpInvoiceNo;
181
+ await extOrderService.updateExtendedOrders(updatePayload);
182
+ framework_1.logger.info(`[Webhook] Updated extended_order ${existing[0].id} for order ${medusaOrderId}`);
183
+ }
184
+ else {
185
+ const extOrder = await extOrderService.createExtendedOrders({
186
+ order_id: medusaOrderId,
187
+ display_id: erpInvoiceNo,
188
+ invoice_no: erpInvoiceNo,
189
+ is_manual: false,
190
+ source: "pos",
191
+ order_type: "make_to_order",
192
+ customer_id: customerInfo.customerId || "",
193
+ customer_name: data.Customer || null,
194
+ customer_email: customerInfo.email || null,
195
+ customer_phone: customerInfo.phone || null,
196
+ payment_mode: paymentMode,
197
+ payment_type: "full",
198
+ external_id: erpOrderIdStr,
199
+ sync_erp: true,
200
+ sync_erp_error: null,
201
+ });
202
+ // Link extended_order → Medusa order via link module
203
+ try {
204
+ await link.create({
205
+ [utils_1.Modules.ORDER]: { order_id: medusaOrderId },
206
+ extended_order: { extended_order_id: extOrder.id },
207
+ });
208
+ }
209
+ catch (linkErr) {
210
+ framework_1.logger.warn(`[Webhook] extended_order link failed for order ${medusaOrderId}: ${linkErr?.message}`);
211
+ }
212
+ framework_1.logger.info(`[Webhook] Created extended_order ${extOrder.id} for order ${medusaOrderId}`);
213
+ }
214
+ }
215
+ catch (err) {
216
+ framework_1.logger.warn(`[Webhook] extended_order create/update failed for order ${medusaOrderId}: ${err?.message}`);
217
+ }
218
+ }
219
+ // ─── Shared: Resolve Medusa customer from party_master + ERP fallback ────────
220
+ async function resolveCustomerIdFromParty(partyNo, party, erpService, query, partyMasterService, container) {
221
+ // Fast path: already mapped
222
+ if (party?.mapping_id) {
223
+ framework_1.logger.info(`[Webhook][resolve] party_no=${partyNo} fast-path mapping_id=${party.mapping_id}`);
224
+ return {
225
+ customerId: party.mapping_id,
226
+ email: party.firm_email || "",
227
+ mobile: party.owner_mobile || "",
228
+ };
229
+ }
230
+ let email = party?.firm_email || "";
231
+ let mobile = party?.owner_mobile || "";
232
+ framework_1.logger.info(`[Webhook][resolve] party_no=${partyNo} party_master: mobile="${mobile}" email="${email}" party_id=${party?.id ?? "null"}`);
233
+ // Fetch fresh contact info from ERP when party_master fields are empty
234
+ if ((!mobile && !email) && partyNo) {
235
+ framework_1.logger.info(`[Webhook][resolve] party_no=${partyNo} fetching from ERP API...`);
236
+ try {
237
+ const erpPartyRaw = await erpService.getMasterData("PartyMst", partyNo);
238
+ const erpParty = Array.isArray(erpPartyRaw) ? erpPartyRaw[0] : erpPartyRaw;
239
+ if (erpParty) {
240
+ email = email || erpParty.FirmEmail || "";
241
+ mobile = mobile || erpParty.OwnerMobile || "";
242
+ framework_1.logger.info(`[Webhook][resolve] ERP party fetch for ${partyNo}: mobile="${mobile}" email="${email}"`);
243
+ }
244
+ else {
245
+ framework_1.logger.warn(`[Webhook][resolve] ERP returned no data for party_no=${partyNo}`);
246
+ }
247
+ }
248
+ catch (e) {
249
+ framework_1.logger.warn(`[Webhook][resolve] ERP party fetch failed for ${partyNo}: ${e?.message}`);
250
+ }
251
+ }
252
+ else {
253
+ framework_1.logger.info(`[Webhook][resolve] party_no=${partyNo} skipping ERP fetch (party_master has data)`);
254
+ }
255
+ const customerModule = container.resolve(utils_1.Modules.CUSTOMER);
256
+ const saveMapping = async (customerId) => {
257
+ if (party?.id) {
258
+ try {
259
+ await partyMasterService.updatePartyMasters({ id: party.id, mapping_id: customerId });
260
+ }
261
+ catch (_) { }
262
+ }
263
+ };
264
+ // Search Medusa customers by phone variants using Customer module
265
+ if (mobile) {
266
+ const digits = mobile.replace(/\D/g, "");
267
+ const variants = digits
268
+ ? [...new Set([digits, `+91${digits}`, mobile.trim()])]
269
+ : [mobile.trim()];
270
+ framework_1.logger.info(`[Webhook][resolve] party_no=${partyNo} trying phone variants: ${JSON.stringify(variants)}`);
271
+ for (const m of variants) {
272
+ if (!m)
273
+ continue;
274
+ try {
275
+ const customers = await customerModule.listCustomers({ phone: m }, { take: 1 });
276
+ framework_1.logger.info(`[Webhook][resolve] phone="${m}" → found ${customers?.length ?? 0} customer(s)`);
277
+ const c = customers?.[0];
278
+ if (c?.id) {
279
+ await saveMapping(c.id);
280
+ framework_1.logger.info(`[Webhook][resolve] Resolved customer ${c.id} for party_no=${partyNo} via phone=${m}`);
281
+ return { customerId: c.id, email: email || c.email || "", mobile };
282
+ }
283
+ }
284
+ catch (e) {
285
+ framework_1.logger.warn(`[Webhook][resolve] phone lookup failed for "${m}": ${e?.message}`);
286
+ }
287
+ }
288
+ }
289
+ else {
290
+ framework_1.logger.warn(`[Webhook][resolve] party_no=${partyNo} no mobile available for lookup`);
291
+ }
292
+ // Fallback: search by email
293
+ if (email) {
294
+ framework_1.logger.info(`[Webhook][resolve] party_no=${partyNo} trying email="${email}"`);
295
+ try {
296
+ const customers = await customerModule.listCustomers({ email }, { take: 1 });
297
+ framework_1.logger.info(`[Webhook][resolve] email="${email}" → found ${customers?.length ?? 0} customer(s)`);
298
+ const c = customers?.[0];
299
+ if (c?.id) {
300
+ await saveMapping(c.id);
301
+ framework_1.logger.info(`[Webhook][resolve] Resolved customer ${c.id} for party_no=${partyNo} via email=${email}`);
302
+ return { customerId: c.id, email, mobile };
303
+ }
304
+ }
305
+ catch (e) {
306
+ framework_1.logger.warn(`[Webhook][resolve] email lookup failed for "${email}": ${e?.message}`);
307
+ }
308
+ }
309
+ else {
310
+ framework_1.logger.warn(`[Webhook][resolve] party_no=${partyNo} no email available for lookup`);
311
+ }
312
+ framework_1.logger.warn(`[Webhook][resolve] party_no=${partyNo} no customer found → guest`);
313
+ return { customerId: null, email, mobile };
314
+ }
315
+ // ─── Sub-scenario B: Link existing Medusa order ─────────────────────────────
316
+ async function handleExistingMedusaOrder(medusaOrderId, master, data, erpOrderIdStr, link, query, container) {
317
+ const partyMasterService = container.resolve(party_master_1.PARTY_MASTER_MODULE);
318
+ const erpService = container.resolve("erp");
319
+ // ─── Resolve customer info ───────────────────────────────────────────────
320
+ const partyList = await partyMasterService.listPartyMasters({
321
+ party_no: data.CustomerId,
322
+ });
323
+ const party = partyList?.[0] ?? null;
324
+ const { customerId: medusaCustomerId, email: resolvedEmail, mobile: resolvedMobile } = await resolveCustomerIdFromParty(data.CustomerId, party, erpService, query, partyMasterService, container);
325
+ let orderEmail = resolvedEmail;
326
+ if (!orderEmail && medusaCustomerId) {
327
+ try {
328
+ const { data: customers } = await query.graph({
329
+ entity: "customer",
330
+ fields: ["email"],
331
+ filters: { id: medusaCustomerId },
332
+ });
333
+ orderEmail = customers?.[0]?.email || "";
334
+ }
335
+ catch (_) { /* ignore */ }
336
+ }
337
+ // Merge ERP fields into order metadata (Medusa does a shallow merge — existing keys are preserved)
338
+ try {
339
+ const orderModule = container.resolve(utils_1.Modules.ORDER);
340
+ const addlessItemsExisting = (data.AddlessDetail ?? []);
341
+ const disAmountExisting = addlessItemsExisting.find((a) => a.Prompt === "DIS")?.AddLessAmount ?? 0;
342
+ const promoAmountExisting = addlessItemsExisting.find((a) => a.Prompt === "PROMOCODE")?.AddLessAmount ?? 0;
343
+ const roundingAmountExisting = addlessItemsExisting.find((a) => /rounding/i.test(a.Prompt ?? ""))?.AddLessAmount ?? 0;
344
+ await orderModule.updateOrders({
345
+ id: medusaOrderId,
346
+ ...(medusaCustomerId ? { customer_id: medusaCustomerId } : {}),
347
+ ...(orderEmail ? { email: orderEmail } : {}),
348
+ metadata: {
349
+ external_id: erpOrderIdStr,
350
+ sync_erp: true,
351
+ OrderId: data.OrderId ?? null,
352
+ OrderPrefix: data.OrderPrefix ?? null,
353
+ OrderNo: data.OrderNo ?? null,
354
+ OrderDate: data.OrderDate ?? null,
355
+ Detail: (data.OrderDetail ?? []).map((item) => ({
356
+ SrNo: item.SrNo,
357
+ JewelId: item.JewelId,
358
+ StyleId: item.StyleId,
359
+ OrderItemId: item.OrderItemId,
360
+ PartyStyleId: item.PartyStyleId,
361
+ })),
362
+ ...(disAmountExisting !== 0 ? { store_discount: { code: "STORE_DISCOUNT", amount: disAmountExisting } } : {}),
363
+ ...(roundingAmountExisting !== 0 ? { rounded_discount: { code: "ROUNDED_DISCOUNT", amount: roundingAmountExisting } } : {}),
364
+ ...(promoAmountExisting > 0 ? { discount: { code: data.Promocode || "PROMOCODE", amount: promoAmountExisting } } : {}),
365
+ },
366
+ });
367
+ framework_1.logger.info(`[Webhook] Updated order ${medusaOrderId}: external_id=${erpOrderIdStr} customer_id=${medusaCustomerId ?? "null"}`);
368
+ }
369
+ catch (updateErr) {
370
+ framework_1.logger.warn(`[Webhook] metadata update failed for order ${medusaOrderId}: ${updateErr?.message}`);
371
+ }
372
+ // Link order_master → Medusa order
373
+ try {
374
+ await link.create({
375
+ [order_master_1.ORDER_MASTER_MODULE]: { order_master_id: master.id },
376
+ [utils_1.Modules.ORDER]: { order_id: medusaOrderId },
377
+ });
378
+ framework_1.logger.info(`[Webhook] Linked order_master ${master.id} → order ${medusaOrderId}`);
379
+ }
380
+ catch (linkError) {
381
+ const msg = linkError?.message || "";
382
+ if (msg.includes("Cannot create multiple links") ||
383
+ msg.includes("already exists") ||
384
+ msg.includes("argument of AND must be type boolean") ||
385
+ linkError?.code === "23505" ||
386
+ linkError?.name === "UniqueConstraintViolationError") {
387
+ framework_1.logger.info(`[Webhook] Link already exists (or entity verify failed) for order_master ${master.id} → order ${medusaOrderId}`);
388
+ }
389
+ else {
390
+ throw linkError;
391
+ }
392
+ }
393
+ // ─── Create extended_order and payment collections ───────────────────────
394
+ await createOrUpdateExtendedOrder(container, link, medusaOrderId, erpOrderIdStr, data, {
395
+ customerId: medusaCustomerId,
396
+ email: orderEmail,
397
+ phone: party?.owner_mobile || "",
398
+ });
399
+ await createPaymentCollectionsFromErp(container, link, medusaOrderId, data);
400
+ // Set order status to "completed" if ERP reports captured payments
401
+ const erpPaymentsExist = (data.PaymentOption ?? []).some((p) => p.Amount > 0);
402
+ if (erpPaymentsExist) {
403
+ try {
404
+ const orderModule = container.resolve(utils_1.Modules.ORDER);
405
+ await orderModule.updateOrders({ id: medusaOrderId, status: "completed" });
406
+ framework_1.logger.info(`[Webhook] Set order ${medusaOrderId} status → completed`);
407
+ }
408
+ catch (e) {
409
+ framework_1.logger.warn(`[Webhook] Failed to set order status completed for ${medusaOrderId}: ${e?.message}`);
410
+ }
411
+ }
412
+ }
413
+ // ─── Sub-scenario A: Create new Medusa order from ERP data ──────────────────
414
+ async function handleNewMedusaOrderFromErp(master, data, erpOrderIdStr, link, container) {
415
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
416
+ const orderModule = container.resolve(utils_1.Modules.ORDER);
417
+ const regionModule = container.resolve(utils_1.Modules.REGION);
418
+ const partyMasterService = container.resolve(party_master_1.PARTY_MASTER_MODULE);
419
+ const extendedVariantService = container.resolve(extended_variant_1.EXTENDED_VARIANT_MODULE);
420
+ const shippingInfoService = container.resolve(shipping_info_master_1.SHIPPING_INFO_MASTER_MODULE);
421
+ // ─── Resolve customer ───────────────────────────────────────────────────
422
+ const partyList = await partyMasterService.listPartyMasters({
423
+ party_no: data.CustomerId,
424
+ });
425
+ const party = partyList?.[0] ?? null;
426
+ const erpService = container.resolve("erp");
427
+ const { customerId: medusaCustomerId, email: resolvedEmail, mobile: resolvedMobile } = await resolveCustomerIdFromParty(data.CustomerId, party, erpService, query, partyMasterService, container);
428
+ if (!medusaCustomerId) {
429
+ framework_1.logger.warn(`[Webhook] No Medusa customer mapping for party_no=${data.CustomerId}, will create as guest`);
430
+ }
431
+ // Resolve order email: resolved email → Medusa customer email → ""
432
+ let orderEmail = resolvedEmail;
433
+ if (!orderEmail && medusaCustomerId) {
434
+ try {
435
+ const { data: customers } = await query.graph({
436
+ entity: "customer",
437
+ fields: ["email"],
438
+ filters: { id: medusaCustomerId },
439
+ });
440
+ orderEmail = customers?.[0]?.email || "";
441
+ }
442
+ catch (_) { /* ignore */ }
443
+ }
444
+ // ─── Resolve region ─────────────────────────────────────────────────────
445
+ const regions = await regionModule.listRegions({ currency_code: "inr" });
446
+ const region = regions?.[0] ?? null;
447
+ if (!region) {
448
+ framework_1.logger.error(`[Webhook] No INR region found — cannot create Medusa order for ERP order ${erpOrderIdStr}. ` +
449
+ `order_master ${master.id} was created/updated but has no linked Medusa order. ` +
450
+ `Create an INR region and re-trigger the webhook to complete the link.`);
451
+ return;
452
+ }
453
+ // ─── Parse taxes and discounts from AddlessDetail ────────────────────────
454
+ const addlessItems = (data.AddlessDetail ?? []);
455
+ const igstEntry = addlessItems.find((a) => /igst/i.test(a.Prompt ?? ""));
456
+ const sgstEntry = addlessItems.find((a) => /sgst/i.test(a.Prompt ?? ""));
457
+ const cgstEntry = addlessItems.find((a) => /cgst/i.test(a.Prompt ?? ""));
458
+ let gstRate = 0;
459
+ if (igstEntry && (igstEntry.AddlessPer ?? 0) > 0) {
460
+ gstRate = igstEntry.AddlessPer;
461
+ }
462
+ else {
463
+ gstRate = (sgstEntry?.AddlessPer ?? 0) + (cgstEntry?.AddlessPer ?? 0);
464
+ }
465
+ const disAmount = addlessItems.find((a) => a.Prompt === "DIS")?.AddLessAmount ?? 0;
466
+ const promoAmount = addlessItems.find((a) => a.Prompt === "PROMOCODE")?.AddLessAmount ?? 0;
467
+ const roundingAmount = addlessItems.find((a) => /rounding/i.test(a.Prompt ?? ""))?.AddLessAmount ?? 0;
468
+ const promoCode = data.Promocode || "PROMOCODE";
469
+ // Look up GST tax_rate_id via Tax Module (best-effort)
470
+ let gstTaxRateId = null;
471
+ if (gstRate > 0) {
472
+ try {
473
+ const taxModule = container.resolve(utils_1.Modules.TAX);
474
+ const taxRegions = await taxModule.listTaxRegions({ country_code: "in" });
475
+ if (taxRegions.length > 0) {
476
+ const taxRates = await taxModule.listTaxRates({
477
+ tax_region_id: taxRegions.map((r) => r.id),
478
+ });
479
+ const match = taxRates.find((r) => Math.abs((r.rate ?? 0) - gstRate) < 0.5);
480
+ gstTaxRateId = match?.id ?? null;
481
+ }
482
+ }
483
+ catch (_) { /* ignore */ }
484
+ }
485
+ // ─── Resolve variants per OrderDetail ────────────────────────────────────
486
+ const resolvedItems = await Promise.all((data.OrderDetail ?? []).map(async (item) => {
487
+ let variants = [];
488
+ // Priority 1: party_style_id (most precise — unique per variant)
489
+ if (item.PartyStyleId && item.PartyStyleId > 0) {
490
+ variants = await extendedVariantService.listExtendedVariants({
491
+ party_style_id: item.PartyStyleId,
492
+ });
493
+ }
494
+ // Priority 2: style_code + metal
495
+ if (!variants.length && item.StyleCode && item.Metal) {
496
+ variants = await extendedVariantService.listExtendedVariants({
497
+ style_code: item.StyleCode,
498
+ metal: item.Metal,
499
+ });
500
+ }
501
+ // Priority 3: style_code only
502
+ if (!variants.length && item.StyleCode) {
503
+ variants = await extendedVariantService.listExtendedVariants({
504
+ style_code: item.StyleCode,
505
+ });
506
+ }
507
+ const variantMappingId = variants?.[0]?.mapping_id ?? null;
508
+ if (!variantMappingId) {
509
+ framework_1.logger.warn(`[Webhook] No variant found for StyleCode=${item.StyleCode} PartyStyleId=${item.PartyStyleId}`);
510
+ }
511
+ // Fetch product info for line item denormalization
512
+ let variantInfo = null;
513
+ if (variantMappingId) {
514
+ try {
515
+ const { data: variantData } = await query.graph({
516
+ entity: "product_variant",
517
+ fields: ["id", "title", "sku", "product.id", "product.title", "product.handle", "product.thumbnail", "product.subtitle"],
518
+ filters: { id: variantMappingId },
519
+ });
520
+ variantInfo = variantData?.[0] ?? null;
521
+ }
522
+ catch (_) { /* ignore */ }
523
+ }
524
+ return {
525
+ item,
526
+ variantMappingId,
527
+ variantInfo,
528
+ unitPrice: Math.round(item.MRP ?? 0),
529
+ };
530
+ }));
531
+ // ─── Build line items (only resolvable variants) ─────────────────────────
532
+ const resolvedFiltered = resolvedItems.filter((i) => i.variantMappingId);
533
+ const totalSubtotal = resolvedFiltered.reduce((sum, i) => sum + i.unitPrice * (i.item.OrderItemPcs ?? 1), 0);
534
+ const lineItems = resolvedFiltered.map((i) => {
535
+ const itemSubtotal = i.unitPrice * (i.item.OrderItemPcs ?? 1);
536
+ const proportion = totalSubtotal > 0 ? itemSubtotal / totalSubtotal : 1;
537
+ const taxLines = [];
538
+ if (gstRate > 0) {
539
+ taxLines.push({
540
+ description: "GST",
541
+ ...(gstTaxRateId ? { tax_rate_id: gstTaxRateId } : {}),
542
+ code: "GST",
543
+ provider_id: "system",
544
+ rate: gstRate,
545
+ });
546
+ }
547
+ const adjustments = [];
548
+ if (disAmount > 0) {
549
+ adjustments.push({
550
+ code: "STORE_DISCOUNT",
551
+ amount: Math.round(disAmount * proportion * 100) / 100,
552
+ });
553
+ }
554
+ if (promoAmount > 0) {
555
+ adjustments.push({
556
+ code: promoCode,
557
+ amount: Math.round(promoAmount * proportion * 100) / 100,
558
+ });
559
+ }
560
+ if (roundingAmount !== 0) {
561
+ adjustments.push({
562
+ code: "ROUNDED_DISCOUNT",
563
+ amount: Math.round(roundingAmount * proportion * 100) / 100,
564
+ });
565
+ }
566
+ return {
567
+ variant_id: i.variantMappingId,
568
+ product_id: i.variantInfo?.product?.id ?? null,
569
+ product_title: i.variantInfo?.product?.title ?? null,
570
+ product_handle: i.variantInfo?.product?.handle ?? null,
571
+ product_subtitle: i.variantInfo?.product?.subtitle ?? null,
572
+ thumbnail: i.variantInfo?.product?.thumbnail ?? null,
573
+ variant_title: i.variantInfo?.title ?? null,
574
+ variant_sku: i.variantInfo?.sku ?? null,
575
+ quantity: i.item.OrderItemPcs ?? 1,
576
+ unit_price: i.unitPrice,
577
+ title: i.variantInfo?.product?.title ?? [i.item.StyleCode, i.item.ItemSizeName, i.item.Metal, i.item.Tone].filter(Boolean).join(" - "),
578
+ subtitle: i.variantInfo?.title ?? null,
579
+ ...(taxLines.length > 0 ? { tax_lines: taxLines } : {}),
580
+ ...(adjustments.length > 0 ? { adjustments } : {}),
581
+ metadata: {
582
+ erp_order_item_id: String(i.item.OrderItemId ?? ""),
583
+ erp_style_id: String(i.item.StyleId ?? ""),
584
+ erp_make_type: i.item.MakeType ?? null,
585
+ erp_stock_type: i.item.StockType ?? null,
586
+ erp_expected_delivery: i.item.Expecteddeliverydate ?? null,
587
+ item_po_no: i.item.ItemPoNo || null,
588
+ },
589
+ };
590
+ });
591
+ if (!lineItems.length) {
592
+ framework_1.logger.warn(`[Webhook] No resolvable variants for ERP order ${erpOrderIdStr} — Medusa order not created. ` +
593
+ `order_master ${master.id} was created/updated but has no linked Medusa order. ` +
594
+ `Resolve variant mappings and re-trigger the webhook to complete the link.`);
595
+ return;
596
+ }
597
+ // ─── Resolve shipping address ─────────────────────────────────────────────
598
+ let shippingAddress = undefined;
599
+ let billingAddress = undefined;
600
+ // Try ShippingId from ERP order first
601
+ if (data.ShippingId) {
602
+ try {
603
+ const shippingList = await shippingInfoService.listShippingInfoMasters({
604
+ shipping_id: data.ShippingId,
605
+ });
606
+ const si = shippingList?.[0];
607
+ if (si) {
608
+ shippingAddress = {
609
+ first_name: si.shipping_name || data.Customer || "",
610
+ last_name: "",
611
+ address_1: si.address1 || "",
612
+ address_2: si.address2 || "",
613
+ city: si.city || "",
614
+ country_code: "in",
615
+ province: si.state || "",
616
+ postal_code: si.pin_code || "",
617
+ phone: si.mobile_no || party?.owner_mobile || "",
618
+ company: "",
619
+ metadata: { party_shipping_id: String(si.shipping_id ?? "") },
620
+ };
621
+ }
622
+ }
623
+ catch (_) { /* ignore */ }
624
+ }
625
+ // Fallback: build address from party_master firm address
626
+ if (!shippingAddress && party) {
627
+ const addrLine = [party.firm_add1, party.firm_add2, party.firm_add3].filter(Boolean).join(", ");
628
+ if (addrLine) {
629
+ shippingAddress = {
630
+ first_name: party.firm_name || data.Customer || "",
631
+ last_name: "",
632
+ address_1: party.firm_add1 || "",
633
+ address_2: [party.firm_add2, party.firm_add3].filter(Boolean).join(", ") || "",
634
+ city: party.firm_city || "",
635
+ country_code: "in",
636
+ province: party.state || "",
637
+ postal_code: party.firm_pin_code || "",
638
+ phone: party.owner_mobile || "",
639
+ company: "",
640
+ };
641
+ }
642
+ }
643
+ billingAddress = shippingAddress;
644
+ // ─── Create Medusa order ─────────────────────────────────────────────────
645
+ const erpPaymentsForNewOrder = (data.PaymentOption ?? []).filter((p) => p.Amount > 0);
646
+ const newMedusaOrder = await orderModule.createOrders({
647
+ region_id: region.id,
648
+ currency_code: "inr",
649
+ status: erpPaymentsForNewOrder.length > 0 ? "completed" : "pending",
650
+ customer_id: medusaCustomerId ?? undefined,
651
+ email: orderEmail || undefined,
652
+ shipping_address: shippingAddress,
653
+ billing_address: billingAddress,
654
+ items: lineItems,
655
+ metadata: {
656
+ external_id: erpOrderIdStr, // ERP OrderId — prevents Flow 1 re-sync
657
+ sync_erp: true, // tells Flow 1 cron: already synced, skip
658
+ source: "erp", // origin marker
659
+ code: null,
660
+ OrderId: data.OrderId ?? null,
661
+ OrderPrefix: data.OrderPrefix ?? null,
662
+ OrderNo: data.OrderNo ?? null,
663
+ OrderDate: data.OrderDate ?? null,
664
+ customer: {
665
+ name: data.Customer ?? "",
666
+ email: "",
667
+ phone: "",
668
+ },
669
+ branch_no: data.BranchNo ?? null,
670
+ cart_type: "POS_CART",
671
+ sales_person_name: data.SalesPerson ?? null,
672
+ payment_mode: erpPaymentsForNewOrder.length > 1 ? "split" : "single",
673
+ payment_type: "full",
674
+ cart_order_type: "make_to_order",
675
+ store_discount: disAmount !== 0 ? { code: "STORE_DISCOUNT", amount: disAmount } : null,
676
+ rounded_discount: roundingAmount !== 0 ? { code: "ROUNDED_DISCOUNT", amount: roundingAmount } : null,
677
+ discount: promoAmount > 0
678
+ ? { code: data.Promocode || "PROMOCODE", amount: promoAmount }
679
+ : (data.Promocode ? { code: data.Promocode, amount: data.PromocodeAmount ?? 0 } : null),
680
+ Detail: (data.OrderDetail ?? []).map((item) => ({
681
+ SrNo: item.SrNo,
682
+ JewelId: item.JewelId,
683
+ StyleId: item.StyleId,
684
+ OrderItemId: item.OrderItemId,
685
+ PartyStyleId: item.PartyStyleId,
686
+ })),
687
+ },
688
+ });
689
+ framework_1.logger.info(`[Webhook] Created Medusa order ${newMedusaOrder.id} for ERP order ${erpOrderIdStr}`);
690
+ // ─── Link order_master → new Medusa order ────────────────────────────────
691
+ try {
692
+ await link.create({
693
+ [order_master_1.ORDER_MASTER_MODULE]: { order_master_id: master.id },
694
+ [utils_1.Modules.ORDER]: { order_id: newMedusaOrder.id },
695
+ });
696
+ framework_1.logger.info(`[Webhook] Linked order_master ${master.id} → new order ${newMedusaOrder.id}`);
697
+ }
698
+ catch (linkError) {
699
+ if (linkError?.message?.includes("Cannot create multiple links") ||
700
+ linkError?.message?.includes("already exists") ||
701
+ linkError?.code === "23505" ||
702
+ linkError?.name === "UniqueConstraintViolationError") {
703
+ framework_1.logger.info(`[Webhook] Link already exists for order_master ${master.id}`);
704
+ }
705
+ else {
706
+ throw linkError;
707
+ }
708
+ }
709
+ // ─── Create payment collections and extended_order ──────────────────────
710
+ await createPaymentCollectionsFromErp(container, link, newMedusaOrder.id, data);
711
+ await createOrUpdateExtendedOrder(container, link, newMedusaOrder.id, erpOrderIdStr, data, {
712
+ customerId: medusaCustomerId,
713
+ email: orderEmail,
714
+ phone: party?.owner_mobile || "",
715
+ });
716
+ }
717
+ // ─── Main Step ───────────────────────────────────────────────────────────────
718
+ exports.processOrderMasterFromWebhookStep = (0, workflows_sdk_1.createStep)("process-order-master-from-webhook-step", async (fetchResult, { container }) => {
719
+ const orderMasterService = container.resolve(order_master_1.ORDER_MASTER_MODULE);
720
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
721
+ const link = container.resolve("link");
722
+ const orderDataList = normalizeOrderDataList(fetchResult);
723
+ if (!orderDataList.length) {
724
+ framework_1.logger.info("No order data to process from webhook");
725
+ return new workflows_sdk_1.StepResponse([]);
726
+ }
727
+ const processed = [];
728
+ for (const data of orderDataList) {
729
+ const orderId = data?.OrderId ?? data?.erp_order_id;
730
+ if (orderId == null)
731
+ continue;
732
+ const existing = await orderMasterService.listOrderMasters({
733
+ erp_order_id: Number(orderId),
734
+ });
735
+ let master;
736
+ // ─── STEP 1: Upsert order_master ──────────────────────────────────────
737
+ if (existing?.length > 0) {
738
+ framework_1.logger.info(`[Webhook] Updating Order ${orderId}`);
739
+ master = existing[0];
740
+ await orderMasterService.updateOrderMasters({
741
+ id: master.id,
742
+ erp_order_id: data.OrderId,
743
+ branch_no: data.BranchNo ?? null,
744
+ branch_name: data.BranchName ?? null,
745
+ order_prefix: data.OrderPrefix ?? "",
746
+ order_no: data.OrderNo ?? "",
747
+ order_date: data.OrderDate,
748
+ customer_id: data.CustomerId ?? null,
749
+ customer_name: data.Customer ?? null,
750
+ po_no: data.PoNo ?? null,
751
+ po_date: data.PoDate ?? null,
752
+ sales_person: data.SalesPerson ?? null,
753
+ work_order_no: data.WorkOrderNo ?? null,
754
+ remarks: data.Remarks ?? null,
755
+ shipping_id: data.ShippingId ?? null,
756
+ promocode_series_id: data.PromocodeSeriesId ?? null,
757
+ promocode: data.Promocode ?? null,
758
+ promocode_percentage: data.PromocodePercentage ?? null,
759
+ promocode_amount: data.PromocodeAmount ?? null,
760
+ });
761
+ // ─── STEP 2: Upsert order_detail_master ───────────────────────────
762
+ if (data?.OrderDetail?.length) {
763
+ for (const d of data.OrderDetail) {
764
+ const existingDetail = await orderMasterService.listOrderDetailMasters({
765
+ erp_order_id: d.OrderId,
766
+ order_item_id: d.OrderItemId,
767
+ order_master: master.id,
768
+ });
769
+ const detailData = {
770
+ erp_order_id: d.OrderId,
771
+ order_item_id: d.OrderItemId,
772
+ order_master: master.id,
773
+ sr_no: d.SrNo,
774
+ style_id: d.StyleId,
775
+ style_code: d.StyleCode,
776
+ party_style_id: d.PartyStyleId,
777
+ party_style_code: d.PartyStyleCode ?? null,
778
+ jewel_id: d.JewelId ?? null,
779
+ jewel_code: d.JewelCode ?? null,
780
+ item_size_id: d.ItemSizeId,
781
+ item_size: d.ItemSize,
782
+ item_size_name: d.ItemSizeName,
783
+ order_qty: d.OrderQty,
784
+ order_item_pcs: d.OrderItemPcs,
785
+ metal_item_id: d.MetalItemId,
786
+ metal: d.Metal,
787
+ metal_name: d.MetalName,
788
+ metal_tone_no: d.MetalToneNo,
789
+ tone: d.Tone,
790
+ tone_name: d.ToneName,
791
+ item_po_no: d.ItemPoNo ?? null,
792
+ item_ref_no: d.ItemRefNo ?? null,
793
+ priority_id: d.PriorityId,
794
+ priority: d.Priority,
795
+ priority_name: d.PriorityName,
796
+ stock_type_no: d.StockTypeNo,
797
+ stock_type: d.StockType,
798
+ stock_type_code: d.StockTypeCode,
799
+ make_type_no: d.MakeTypeNo,
800
+ make_type: d.MakeType,
801
+ make_type_code: d.MakeTypeCode,
802
+ customer_production_instruction: d.CustomerProductionInstruction ?? null,
803
+ special_remarks: d.SpecialRemarks ?? null,
804
+ design_production_instruction: d.DesignProductionInstruction ?? null,
805
+ stamp_instruction: d.StampInstruction ?? null,
806
+ expected_delivery_date: d.Expecteddeliverydate ?? d.ExpectedDeliveryDate,
807
+ mrp: d.MRP,
808
+ };
809
+ if (existingDetail?.length > 0) {
810
+ await orderMasterService.updateOrderDetailMasters({
811
+ id: existingDetail[0].id,
812
+ ...detailData,
813
+ });
814
+ }
815
+ else {
816
+ await orderMasterService.createOrderDetailMasters(detailData);
817
+ }
818
+ }
819
+ }
820
+ // ─── STEP 3: Upsert order_payment_option_master ───────────────────
821
+ if (data?.PaymentOption?.length) {
822
+ for (const p of data.PaymentOption) {
823
+ let existingPayment = await orderMasterService.listOrderPaymentOptionMasters({
824
+ erp_order_id: p.OrderId,
825
+ voucher_entry_id: p.VoucherEntryId,
826
+ trans_no: p.TransNo,
827
+ order_master: master.id,
828
+ });
829
+ if (existingPayment?.length === 0 && p.TransNo) {
830
+ existingPayment = await orderMasterService.listOrderPaymentOptionMasters({
831
+ erp_order_id: p.OrderId,
832
+ voucher_entry_id: p.VoucherEntryId,
833
+ order_master: master.id,
834
+ });
835
+ }
836
+ const paymentData = {
837
+ erp_order_id: p.OrderId,
838
+ book_name: p.BookName,
839
+ order_master: master.id,
840
+ voucher_entry_id: p.VoucherEntryId,
841
+ trans_prefix: p.TransPrefix,
842
+ trans_no: p.TransNo,
843
+ transaction_date: p.TransactionDate,
844
+ doc_no: p.DocNo ?? null,
845
+ remarks: p.Remarks ?? null,
846
+ amount: p.Amount,
847
+ };
848
+ if (existingPayment?.length > 0) {
849
+ await orderMasterService.updateOrderPaymentOptionMasters({
850
+ id: existingPayment[0].id,
851
+ ...paymentData,
852
+ });
853
+ }
854
+ else {
855
+ await orderMasterService.createOrderPaymentOptionMasters(paymentData);
856
+ }
857
+ }
858
+ }
859
+ // ─── STEP 4: Upsert order_addless_detail_master (update path) ────
860
+ if (data?.AddlessDetail?.length) {
861
+ for (const a of data.AddlessDetail) {
862
+ const existingAddless = await orderMasterService.listOrderAddlessDetailMasters({
863
+ erp_order_id: a.OrderId,
864
+ prompt: a.Prompt,
865
+ order_master: master.id,
866
+ });
867
+ const addlessData = {
868
+ erp_order_id: a.OrderId,
869
+ addless_id: a.Id ?? null,
870
+ prompt: a.Prompt,
871
+ addless_per: a.AddlessPer ?? null,
872
+ addless_amount: a.AddLessAmount,
873
+ order_master: master.id,
874
+ };
875
+ if (existingAddless?.length > 0) {
876
+ await orderMasterService.updateOrderAddlessDetailMasters({
877
+ id: existingAddless[0].id,
878
+ ...addlessData,
879
+ });
880
+ }
881
+ else {
882
+ await orderMasterService.createOrderAddlessDetailMasters(addlessData);
883
+ }
884
+ }
885
+ }
886
+ }
887
+ else {
888
+ // ─── Create new order_master ───────────────────────────────────────
889
+ framework_1.logger.info(`[Webhook] Creating new Order ${orderId}`);
890
+ master = await orderMasterService.createOrderMasters({
891
+ erp_order_id: data.OrderId,
892
+ branch_no: data.BranchNo ?? null,
893
+ branch_name: data.BranchName ?? null,
894
+ order_prefix: data.OrderPrefix ?? "",
895
+ order_no: data.OrderNo ?? "",
896
+ order_date: data.OrderDate,
897
+ customer_id: data.CustomerId ?? null,
898
+ customer_name: data.Customer ?? null,
899
+ po_no: data.PoNo ?? null,
900
+ po_date: data.PoDate ?? null,
901
+ sales_person: data.SalesPerson ?? null,
902
+ work_order_no: data.WorkOrderNo ?? null,
903
+ remarks: data.Remarks ?? null,
904
+ shipping_id: data.ShippingId ?? null,
905
+ promocode_series_id: data.PromocodeSeriesId ?? null,
906
+ promocode: data.Promocode ?? null,
907
+ promocode_percentage: data.PromocodePercentage ?? null,
908
+ promocode_amount: data.PromocodeAmount ?? null,
909
+ });
910
+ if (data?.OrderDetail?.length) {
911
+ await orderMasterService.createOrderDetailMasters(data.OrderDetail.map((d) => ({
912
+ erp_order_id: d.OrderId,
913
+ order_item_id: d.OrderItemId,
914
+ order_master: master.id,
915
+ sr_no: d.SrNo,
916
+ style_id: d.StyleId,
917
+ style_code: d.StyleCode,
918
+ party_style_id: d.PartyStyleId,
919
+ party_style_code: d.PartyStyleCode ?? null,
920
+ jewel_id: d.JewelId ?? null,
921
+ jewel_code: d.JewelCode ?? null,
922
+ item_size_id: d.ItemSizeId,
923
+ item_size: d.ItemSize,
924
+ item_size_name: d.ItemSizeName,
925
+ order_qty: d.OrderQty,
926
+ order_item_pcs: d.OrderItemPcs,
927
+ metal_item_id: d.MetalItemId,
928
+ metal: d.Metal,
929
+ metal_name: d.MetalName,
930
+ metal_tone_no: d.MetalToneNo,
931
+ tone: d.Tone,
932
+ tone_name: d.ToneName,
933
+ item_po_no: d.ItemPoNo ?? null,
934
+ item_ref_no: d.ItemRefNo ?? null,
935
+ priority_id: d.PriorityId,
936
+ priority: d.Priority,
937
+ priority_name: d.PriorityName,
938
+ stock_type_no: d.StockTypeNo,
939
+ stock_type: d.StockType,
940
+ stock_type_code: d.StockTypeCode,
941
+ make_type_no: d.MakeTypeNo,
942
+ make_type: d.MakeType,
943
+ make_type_code: d.MakeTypeCode,
944
+ customer_production_instruction: d.CustomerProductionInstruction ?? null,
945
+ special_remarks: d.SpecialRemarks ?? null,
946
+ design_production_instruction: d.DesignProductionInstruction ?? null,
947
+ stamp_instruction: d.StampInstruction ?? null,
948
+ expected_delivery_date: d.Expecteddeliverydate ?? d.ExpectedDeliveryDate,
949
+ mrp: d.MRP,
950
+ })));
951
+ }
952
+ if (data?.PaymentOption?.length) {
953
+ await orderMasterService.createOrderPaymentOptionMasters(data.PaymentOption.map((p) => ({
954
+ erp_order_id: p.OrderId,
955
+ book_name: p.BookName,
956
+ order_master: master.id,
957
+ voucher_entry_id: p.VoucherEntryId,
958
+ trans_prefix: p.TransPrefix,
959
+ trans_no: p.TransNo,
960
+ transaction_date: p.TransactionDate,
961
+ doc_no: p.DocNo ?? null,
962
+ remarks: p.Remarks ?? null,
963
+ amount: p.Amount,
964
+ })));
965
+ }
966
+ if (data?.AddlessDetail?.length) {
967
+ await orderMasterService.createOrderAddlessDetailMasters(data.AddlessDetail.map((a) => ({
968
+ erp_order_id: a.OrderId,
969
+ addless_id: a.Id ?? null,
970
+ prompt: a.Prompt,
971
+ addless_per: a.AddlessPer ?? null,
972
+ addless_amount: a.AddLessAmount,
973
+ order_master: master.id,
974
+ })));
975
+ }
976
+ }
977
+ // ─── STEP 5: Detect sub-scenario ────────────────────────────────────
978
+ const erpOrderIdStr = String(orderId);
979
+ // CHECK 1: PoNo is a Medusa order ID (Sub-scenario B)
980
+ const poNoIsMedusaOrderId = typeof data.PoNo === "string" && data.PoNo.startsWith("order_");
981
+ let medusaOrderId = null;
982
+ if (poNoIsMedusaOrderId) {
983
+ medusaOrderId = data.PoNo;
984
+ framework_1.logger.info(`[Webhook] Order ${erpOrderIdStr} is a returning Medusa order via PoNo: ${medusaOrderId}`);
985
+ }
986
+ // CHECK 2: Existing Medusa order by metadata.external_id (Sub-scenario B)
987
+ if (!medusaOrderId) {
988
+ try {
989
+ const { data: existingOrders } = await query.graph({
990
+ entity: "order",
991
+ fields: ["id"],
992
+ filters: {
993
+ // @ts-ignore - metadata filter for external_id
994
+ metadata: { external_id: erpOrderIdStr || "" },
995
+ },
996
+ });
997
+ if (existingOrders?.length > 0) {
998
+ medusaOrderId = existingOrders[0].id;
999
+ framework_1.logger.info(`[Webhook] Found Medusa order ${medusaOrderId} by metadata.external_id=${erpOrderIdStr}`);
1000
+ }
1001
+ }
1002
+ catch (queryErr) {
1003
+ framework_1.logger.warn(`[Webhook] metadata.external_id lookup failed: ${queryErr?.message}`);
1004
+ }
1005
+ }
1006
+ // ─── STEP 6/7-9: Route to correct handler ───────────────────────────
1007
+ try {
1008
+ if (medusaOrderId) {
1009
+ // Sub-scenario B: link existing Medusa order
1010
+ await handleExistingMedusaOrder(medusaOrderId, master, data, erpOrderIdStr, link, query, container);
1011
+ }
1012
+ else {
1013
+ // Sub-scenario A: create new Medusa order from ERP data
1014
+ await handleNewMedusaOrderFromErp(master, data, erpOrderIdStr, link, container);
1015
+ }
1016
+ }
1017
+ catch (handlerError) {
1018
+ framework_1.logger.warn(`[Webhook] Order handler error for ERP order ${erpOrderIdStr}: ${handlerError?.message}`);
1019
+ }
1020
+ processed.push(master);
1021
+ }
1022
+ return new workflows_sdk_1.StepResponse(processed);
1023
+ });
1024
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1vcmRlci1tYXN0ZXItZnJvbS13ZWJob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9vcmRlci1tYXN0ZXIvc3RlcHMvcHJvY2Vzcy1vcmRlci1tYXN0ZXItZnJvbS13ZWJob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE2RTtBQUM3RSxxREFBK0U7QUFFL0UsZ0VBQW9FO0FBQ3BFLGdFQUFvRTtBQUNwRSx3RUFBNEU7QUFDNUUsZ0ZBQW9GO0FBQ3BGLG1EQUE2QztBQUc3Qzs7O0dBR0c7QUFDSCxTQUFTLHVCQUF1QixDQUFDLFFBQWdCO0lBQy9DLE1BQU0sSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEksT0FBTyxnQ0FBZ0MsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDMUcsT0FBTyxrQkFBa0IsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTyxrQkFBa0IsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNsSSxPQUFPLGdDQUFnQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLGtCQUFrQixDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsT0FBTyxtQkFBbUIsQ0FBQztBQUM3QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLHNCQUFzQixDQUFDLE1BQVc7SUFDekMsSUFBSSxNQUFNLElBQUksSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzdCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2pHLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNyRixDQUFDO0FBRUQsZ0ZBQWdGO0FBRWhGLEtBQUssVUFBVSwrQkFBK0IsQ0FDNUMsU0FBYyxFQUNkLElBQVMsRUFDVCxhQUFxQixFQUNyQixJQUFTO0lBRVQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLGtCQUFNLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxhQUFhLGdDQUFnQyxDQUFDLENBQUM7UUFDN0csT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpFLDhEQUE4RDtRQUM5RCxNQUFNLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNqRCxNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRTtnQkFDTix3QkFBd0I7Z0JBQ3hCLDRCQUE0QjtnQkFDNUIsaUNBQWlDO2dCQUNqQyxxQ0FBcUM7Z0JBQ3JDLDBDQUEwQzthQUMzQztZQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUU7U0FDL0IsQ0FBQyxDQUFDO1FBRUgsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsSUFBSSxFQUFFLENBQUM7UUFFM0UsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMseUVBQXlFO1lBQ3pFLEtBQUssTUFBTSxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEMsS0FBSyxNQUFNLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDM0MsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ3hCLElBQUksQ0FBQzs0QkFDSCxNQUFNLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQ0FDakMsUUFBUSxFQUFFLGFBQWE7b0NBQ3ZCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtvQ0FDdEIsYUFBYSxFQUFFLEtBQUs7b0NBQ3BCLFNBQVMsRUFBRSxTQUFTO29DQUNwQixZQUFZLEVBQUUsT0FBTyxDQUFDLEVBQUU7aUNBQ3pCLENBQUMsQ0FBQyxDQUFDOzRCQUNKLGtCQUFNLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxPQUFPLENBQUMsRUFBRSxhQUFhLGFBQWEsRUFBRSxDQUFDLENBQUM7d0JBQ3hHLENBQUM7d0JBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQzs0QkFDcEIsa0JBQU0sQ0FBQyxJQUFJLENBQUMsNERBQTRELGFBQWEsS0FBSyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQzt3QkFDOUcsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUNwQyxDQUFDLEdBQVcsRUFBRSxDQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFDbkQsQ0FBQyxDQUNGLENBQUM7UUFFRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQ3JFLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxXQUFXO1NBQ3BCLENBQUMsQ0FBQztRQUVILHlDQUF5QztRQUN6QyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDaEIsQ0FBQyxlQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFO1lBQzVDLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxFQUFFO1NBQ25FLENBQUMsQ0FBQztRQUVILG9EQUFvRDtRQUNwRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sVUFBVSxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV2RCxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdFLFdBQVcsRUFBRSxVQUFVO2dCQUN2QixhQUFhLEVBQUUsS0FBSztnQkFDcEIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFO29CQUNKLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUU7b0JBQzNCLFlBQVksRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLEVBQUU7b0JBQ2pDLFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUU7b0JBQ3pCLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztpQkFDakQ7YUFDRixDQUFDLENBQUM7WUFFSCxtRkFBbUY7WUFDbkYsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUU1RSxJQUFJLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxhQUFhLENBQUMsY0FBYyxDQUFDO29CQUNqQyxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0JBQ3RCLE1BQU0sRUFBRSxNQUFNO2lCQUNmLENBQUMsQ0FBQztnQkFFSCx3RkFBd0Y7Z0JBQ3hGLElBQUksQ0FBQztvQkFDSCxNQUFNLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQzs0QkFDakMsUUFBUSxFQUFFLGFBQWE7NEJBQ3ZCLE1BQU0sRUFBRSxNQUFNOzRCQUNkLGFBQWEsRUFBRSxLQUFLOzRCQUNwQixTQUFTLEVBQUUsU0FBUzs0QkFDcEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxFQUFFO3lCQUN6QixDQUFDLENBQUMsQ0FBQztnQkFDTixDQUFDO2dCQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7b0JBQ3BCLGtCQUFNLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxhQUFhLEtBQUssS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ2hHLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELGtCQUFNLENBQUMsSUFBSSxDQUNULHdDQUF3QyxpQkFBaUIsQ0FBQyxFQUFFLFNBQVMsV0FBVyxDQUFDLE1BQU0scUJBQXFCLFdBQVcsZUFBZSxhQUFhLEVBQUUsQ0FDdEosQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLE1BQVcsRUFBRSxDQUFDO1FBQ3JCLGtCQUFNLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxhQUFhLEtBQUssTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0csQ0FBQztBQUNILENBQUM7QUFFRCxnRkFBZ0Y7QUFFaEYsS0FBSyxVQUFVLDJCQUEyQixDQUN4QyxTQUFjLEVBQ2QsSUFBUyxFQUNULGFBQXFCLEVBQ3JCLGFBQXFCLEVBQ3JCLElBQVMsRUFDVCxlQUErRSxFQUFFO0lBRWpGLElBQUksQ0FBQztRQUNILE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQVEsQ0FBQztRQUVuRSxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUVsRyxNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRXZGLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxhQUFhLENBQUM7UUFFakcsSUFBSSxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sYUFBYSxHQUFRO2dCQUN6QixFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2xCLFdBQVcsRUFBRSxhQUFhO2dCQUMxQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxjQUFjLEVBQUUsSUFBSTthQUNyQixDQUFDO1lBQ0YsSUFBSSxXQUFXO2dCQUFFLGFBQWEsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1lBQzFELElBQUksWUFBWSxDQUFDLFVBQVU7Z0JBQUUsYUFBYSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQ2pGLElBQUksWUFBWSxDQUFDLEtBQUs7Z0JBQUUsYUFBYSxDQUFDLGNBQWMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQzFFLElBQUksWUFBWSxDQUFDLEtBQUs7Z0JBQUUsYUFBYSxDQUFDLGNBQWMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQzFFLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQUUsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQy9ELG1EQUFtRDtZQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7Z0JBQUUsYUFBYSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUM7WUFDeEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO2dCQUFFLGFBQWEsQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO1lBRXJFLE1BQU0sZUFBZSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFELGtCQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDL0YsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDMUQsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLFVBQVUsRUFBRSxZQUFZO2dCQUN4QixVQUFVLEVBQUUsWUFBWTtnQkFDeEIsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFVBQVUsRUFBRSxlQUFlO2dCQUMzQixXQUFXLEVBQUUsWUFBWSxDQUFDLFVBQVUsSUFBSSxFQUFFO2dCQUMxQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJO2dCQUNwQyxjQUFjLEVBQUUsWUFBWSxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUMxQyxjQUFjLEVBQUUsWUFBWSxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUMxQyxZQUFZLEVBQUUsV0FBVztnQkFDekIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLFdBQVcsRUFBRSxhQUFhO2dCQUMxQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxjQUFjLEVBQUUsSUFBSTthQUNyQixDQUFDLENBQUM7WUFFSCxxREFBcUQ7WUFDckQsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQztvQkFDaEIsQ0FBQyxlQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFO29CQUM1QyxjQUFjLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO2lCQUNuRCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxPQUFZLEVBQUUsQ0FBQztnQkFDdEIsa0JBQU0sQ0FBQyxJQUFJLENBQUMsa0RBQWtELGFBQWEsS0FBSyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN0RyxDQUFDO1lBRUQsa0JBQU0sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLFFBQVEsQ0FBQyxFQUFFLGNBQWMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUM1RixDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDbEIsa0JBQU0sQ0FBQyxJQUFJLENBQUMsMkRBQTJELGFBQWEsS0FBSyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMzRyxDQUFDO0FBQ0gsQ0FBQztBQUVELGdGQUFnRjtBQUVoRixLQUFLLFVBQVUsMEJBQTBCLENBQ3ZDLE9BQWUsRUFDZixLQUFVLEVBQ1YsVUFBNEIsRUFDNUIsS0FBVSxFQUNWLGtCQUF1QixFQUN2QixTQUFjO0lBRWQsNEJBQTRCO0lBQzVCLElBQUksS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLGtCQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixPQUFPLHlCQUF5QixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMvRixPQUFPO1lBQ0wsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLEVBQUU7WUFDN0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRTtTQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksS0FBSyxHQUFHLEtBQUssRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO0lBQ3BDLElBQUksTUFBTSxHQUFHLEtBQUssRUFBRSxZQUFZLElBQUksRUFBRSxDQUFDO0lBRXZDLGtCQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixPQUFPLDBCQUEwQixNQUFNLFlBQVksS0FBSyxjQUFjLEtBQUssRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztJQUV4SSx1RUFBdUU7SUFDdkUsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbkMsa0JBQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLE9BQU8sMkJBQTJCLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sUUFBUSxHQUFRLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ2hGLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsS0FBSyxHQUFHLEtBQUssSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztnQkFDOUMsa0JBQU0sQ0FBQyxJQUFJLENBQUMsMENBQTBDLE9BQU8sYUFBYSxNQUFNLFlBQVksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN4RyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sa0JBQU0sQ0FBQyxJQUFJLENBQUMsd0RBQXdELE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDakYsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLGtCQUFNLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekYsQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sa0JBQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLE9BQU8sNkNBQTZDLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFM0QsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLFVBQWtCLEVBQUUsRUFBRTtRQUMvQyxJQUFJLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQztnQkFDSCxNQUFNLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDeEYsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixrRUFBa0U7SUFDbEUsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sUUFBUSxHQUFHLE1BQU07WUFDckIsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkQsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEIsa0JBQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLE9BQU8sMkJBQTJCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLENBQUM7Z0JBQUUsU0FBUztZQUNqQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxTQUFTLEdBQUcsTUFBTSxjQUFjLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hGLGtCQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLGFBQWEsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUM3RixNQUFNLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7b0JBQ1YsTUFBTSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUN4QixrQkFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLE9BQU8sY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDckUsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQixrQkFBTSxDQUFDLElBQUksQ0FBQywrQ0FBK0MsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixrQkFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsT0FBTyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLGtCQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixPQUFPLGtCQUFrQixLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLE1BQU0sY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0Usa0JBQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEtBQUssYUFBYSxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDakcsTUFBTSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QixrQkFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLE9BQU8sY0FBYyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixrQkFBTSxDQUFDLElBQUksQ0FBQywrQ0FBK0MsS0FBSyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLGtCQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixPQUFPLGdDQUFnQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELGtCQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixPQUFPLDRCQUE0QixDQUFDLENBQUM7SUFDaEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCwrRUFBK0U7QUFFL0UsS0FBSyxVQUFVLHlCQUF5QixDQUN0QyxhQUFxQixFQUNyQixNQUFXLEVBQ1gsSUFBUyxFQUNULGFBQXFCLEVBQ3JCLElBQVMsRUFDVCxLQUFVLEVBQ1YsU0FBYztJQUVkLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBUSxDQUFDO0lBQ3pFLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFxQixDQUFDO0lBRWhFLDRFQUE0RTtJQUM1RSxNQUFNLFNBQVMsR0FBRyxNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDO1FBQzFELFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVTtLQUMxQixDQUFDLENBQUM7SUFDSCxNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFFckMsTUFBTSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FDbEYsTUFBTSwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTdHLElBQUksVUFBVSxHQUFXLGFBQWEsQ0FBQztJQUN2QyxJQUFJLENBQUMsVUFBVSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQzVDLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUM7Z0JBQ2pCLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRTthQUNsQyxDQUFDLENBQUM7WUFDSCxVQUFVLEdBQUksU0FBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDdEQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsbUdBQW1HO0lBQ25HLElBQUksQ0FBQztRQUNILE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBVSxDQUFDO1FBQ2pFLE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLGFBQWEsSUFBSSxDQUFDLENBQUM7UUFDeEcsTUFBTSxtQkFBbUIsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLEVBQUUsYUFBYSxJQUFJLENBQUMsQ0FBQztRQUNoSCxNQUFNLHNCQUFzQixHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsYUFBYSxJQUFJLENBQUMsQ0FBQztRQUUzSCxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUM7WUFDN0IsRUFBRSxFQUFFLGFBQWE7WUFDakIsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxRQUFRLEVBQUU7Z0JBQ1IsV0FBVyxFQUFFLGFBQWE7Z0JBQzFCLFFBQVEsRUFBRSxJQUFJO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUk7Z0JBQzdCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUk7Z0JBQ3JDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUk7Z0JBQzdCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUk7Z0JBQ2pDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNuRCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNyQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztvQkFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2lCQUNoQyxDQUFDLENBQUM7Z0JBQ0gsR0FBRyxDQUFDLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3RyxHQUFHLENBQUMsc0JBQXNCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0gsR0FBRyxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxXQUFXLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZIO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsa0JBQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLGFBQWEsaUJBQWlCLGFBQWEsZ0JBQWdCLGdCQUFnQixJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbEksQ0FBQztJQUFDLE9BQU8sU0FBYyxFQUFFLENBQUM7UUFDeEIsa0JBQU0sQ0FBQyxJQUFJLENBQUMsOENBQThDLGFBQWEsS0FBSyxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNoQixDQUFDLGtDQUFtQixDQUFDLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxDQUFDLGVBQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUU7U0FDN0MsQ0FBQyxDQUFDO1FBQ0gsa0JBQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLE1BQU0sQ0FBQyxFQUFFLFlBQVksYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBQUMsT0FBTyxTQUFjLEVBQUUsQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxTQUFTLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxJQUNFLEdBQUcsQ0FBQyxRQUFRLENBQUMsOEJBQThCLENBQUM7WUFDNUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztZQUM5QixHQUFHLENBQUMsUUFBUSxDQUFDLHNDQUFzQyxDQUFDO1lBQ3BELFNBQVMsRUFBRSxJQUFJLEtBQUssT0FBTztZQUMzQixTQUFTLEVBQUUsSUFBSSxLQUFLLGdDQUFnQyxFQUNwRCxDQUFDO1lBQ0Qsa0JBQU0sQ0FBQyxJQUFJLENBQUMsNEVBQTRFLE1BQU0sQ0FBQyxFQUFFLFlBQVksYUFBYSxFQUFFLENBQUMsQ0FBQztRQUNoSSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sU0FBUyxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLE1BQU0sMkJBQTJCLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRTtRQUNyRixVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLEtBQUssRUFBRSxVQUFVO1FBQ2pCLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxJQUFJLEVBQUU7S0FDakMsQ0FBQyxDQUFDO0lBRUgsTUFBTSwrQkFBK0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUU1RSxtRUFBbUU7SUFDbkUsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25GLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLGtCQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixhQUFhLHFCQUFxQixDQUFDLENBQUM7UUFDekUsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsa0JBQU0sQ0FBQyxJQUFJLENBQUMsc0RBQXNELGFBQWEsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNwRyxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCwrRUFBK0U7QUFFL0UsS0FBSyxVQUFVLDJCQUEyQixDQUN4QyxNQUFXLEVBQ1gsSUFBUyxFQUNULGFBQXFCLEVBQ3JCLElBQVMsRUFDVCxTQUFjO0lBRWQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0NBQW1CLENBQVEsQ0FBQztJQUN6RSxNQUFNLHNCQUFzQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsMENBQXVCLENBQVEsQ0FBQztJQUNqRixNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0RBQTJCLENBQVEsQ0FBQztJQUVsRiwyRUFBMkU7SUFDM0UsTUFBTSxTQUFTLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMxRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVU7S0FDMUIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBRXJDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFxQixDQUFDO0lBQ2hFLE1BQU0sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQ2xGLE1BQU0sMEJBQTBCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU3RyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QixrQkFBTSxDQUFDLElBQUksQ0FBQyxxREFBcUQsSUFBSSxDQUFDLFVBQVUsd0JBQXdCLENBQUMsQ0FBQztJQUM1RyxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLElBQUksVUFBVSxHQUFXLGFBQWEsQ0FBQztJQUN2QyxJQUFJLENBQUMsVUFBVSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQzVDLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUM7Z0JBQ2pCLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRTthQUNsQyxDQUFDLENBQUM7WUFDSCxVQUFVLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMzQyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekUsTUFBTSxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3BDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLGtCQUFNLENBQUMsS0FBSyxDQUNWLDRFQUE0RSxhQUFhLElBQUk7WUFDN0YsZ0JBQWdCLE1BQU0sQ0FBQyxFQUFFLHVEQUF1RDtZQUNoRix1RUFBdUUsQ0FDeEUsQ0FBQztRQUNGLE9BQU87SUFDVCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQVUsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDaEIsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pELE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDO0lBQ2pDLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsYUFBYSxJQUFJLENBQUMsQ0FBQztJQUN4RixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxFQUFFLGFBQWEsSUFBSSxDQUFDLENBQUM7SUFDaEcsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsYUFBYSxJQUFJLENBQUMsQ0FBQztJQUMzRyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQztJQUVoRCx1REFBdUQ7SUFDdkQsSUFBSSxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUN2QyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRCxNQUFNLFVBQVUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFDNUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ2hELENBQUMsQ0FBQztnQkFDSCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUN6QixDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUNwRCxDQUFDO2dCQUNGLFlBQVksR0FBRyxLQUFLLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLE1BQU0sYUFBYSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDckMsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBUyxFQUFFLEVBQUU7UUFDL0MsSUFBSSxRQUFRLEdBQVUsRUFBRSxDQUFDO1FBRXpCLGlFQUFpRTtRQUNqRSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxRQUFRLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDM0QsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZO2FBQ2xDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckQsUUFBUSxHQUFHLE1BQU0sc0JBQXNCLENBQUMsb0JBQW9CLENBQUM7Z0JBQzNELFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDMUIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2FBQ2xCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLFFBQVEsR0FBRyxNQUFNLHNCQUFzQixDQUFDLG9CQUFvQixDQUFDO2dCQUMzRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDM0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQWtCLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUM7UUFDMUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsa0JBQU0sQ0FBQyxJQUFJLENBQ1QsNENBQTRDLElBQUksQ0FBQyxTQUFTLGlCQUFpQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQy9GLENBQUM7UUFDSixDQUFDO1FBRUQsbURBQW1EO1FBQ25ELElBQUksV0FBVyxHQUFRLElBQUksQ0FBQztRQUM1QixJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDO2dCQUNILE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUM5QyxNQUFNLEVBQUUsaUJBQWlCO29CQUN6QixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDO29CQUN4SCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUU7aUJBQ2xDLENBQUMsQ0FBQztnQkFDSCxXQUFXLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ3pDLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU87WUFDTCxJQUFJO1lBQ0osZ0JBQWdCO1lBQ2hCLFdBQVc7WUFDWCxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztTQUNyQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUVGLDRFQUE0RTtJQUM1RSxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FDM0MsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxFQUMxRCxDQUFDLENBQ0YsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQzNDLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLFVBQVUsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEUsTUFBTSxRQUFRLEdBQVUsRUFBRSxDQUFDO1FBQzNCLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hCLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1osV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELElBQUksRUFBRSxLQUFLO2dCQUNYLFdBQVcsRUFBRSxRQUFRO2dCQUNyQixJQUFJLEVBQUUsT0FBTzthQUNkLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBVSxFQUFFLENBQUM7UUFDOUIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEIsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDZixJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsVUFBVSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7YUFDdkQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BCLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ2YsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLFVBQVUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHO2FBQ3pELENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNmLElBQUksRUFBRSxrQkFBa0I7Z0JBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxVQUFVLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRzthQUM1RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTztZQUNMLFVBQVUsRUFBRSxDQUFDLENBQUMsZ0JBQWdCO1lBQzlCLFVBQVUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSTtZQUM5QyxhQUFhLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLElBQUk7WUFDcEQsY0FBYyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxJQUFJO1lBQ3RELGdCQUFnQixFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsSUFBSSxJQUFJO1lBQzFELFNBQVMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLElBQUksSUFBSTtZQUNwRCxhQUFhLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksSUFBSTtZQUMzQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksSUFBSTtZQUN2QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQztZQUNsQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVM7WUFDdkIsS0FBSyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDdEksUUFBUSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLElBQUk7WUFDdEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZELEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xELFFBQVEsRUFBRTtnQkFDUixpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO2dCQUNuRCxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDMUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUk7Z0JBQ3RDLGNBQWMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJO2dCQUN4QyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUk7Z0JBQzFELFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJO2FBQ3BDO1NBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0QixrQkFBTSxDQUFDLElBQUksQ0FDVCxrREFBa0QsYUFBYSwrQkFBK0I7WUFDOUYsZ0JBQWdCLE1BQU0sQ0FBQyxFQUFFLHVEQUF1RDtZQUNoRiwyRUFBMkUsQ0FDNUUsQ0FBQztRQUNGLE9BQU87SUFDVCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLElBQUksZUFBZSxHQUFRLFNBQVMsQ0FBQztJQUNyQyxJQUFJLGNBQWMsR0FBUSxTQUFTLENBQUM7SUFFcEMsc0NBQXNDO0lBQ3RDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQztZQUNILE1BQU0sWUFBWSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsdUJBQXVCLENBQUM7Z0JBQ3JFLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVTthQUM3QixDQUFDLENBQUM7WUFDSCxNQUFNLEVBQUUsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNQLGVBQWUsR0FBRztvQkFDaEIsVUFBVSxFQUFFLEVBQUUsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFO29CQUNuRCxTQUFTLEVBQUUsRUFBRTtvQkFDYixTQUFTLEVBQUUsRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFO29CQUM1QixTQUFTLEVBQUUsRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFO29CQUM1QixJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFO29CQUNuQixZQUFZLEVBQUUsSUFBSTtvQkFDbEIsUUFBUSxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDeEIsV0FBVyxFQUFFLEVBQUUsQ0FBQyxRQUFRLElBQUksRUFBRTtvQkFDOUIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxTQUFTLElBQUksS0FBSyxFQUFFLFlBQVksSUFBSSxFQUFFO29CQUNoRCxPQUFPLEVBQUUsRUFBRTtvQkFDWCxRQUFRLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsRUFBRTtpQkFDOUQsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsSUFBSSxDQUFDLGVBQWUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsZUFBZSxHQUFHO2dCQUNoQixVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUU7Z0JBQ2xELFNBQVMsRUFBRSxFQUFFO2dCQUNiLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxJQUFJLEVBQUU7Z0JBQ2hDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDOUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRTtnQkFDM0IsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQzNCLFdBQVcsRUFBRSxLQUFLLENBQUMsYUFBYSxJQUFJLEVBQUU7Z0JBQ3RDLEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxFQUFFO2FBQ1osQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxHQUFHLGVBQWUsQ0FBQztJQUVqQyw0RUFBNEU7SUFDNUUsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNGLE1BQU0sY0FBYyxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQztRQUNwRCxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUU7UUFDcEIsYUFBYSxFQUFFLEtBQUs7UUFDcEIsTUFBTSxFQUFFLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNuRSxXQUFXLEVBQUUsZ0JBQWdCLElBQUksU0FBUztRQUMxQyxLQUFLLEVBQUUsVUFBVSxJQUFJLFNBQVM7UUFDOUIsZ0JBQWdCLEVBQUUsZUFBZTtRQUNqQyxlQUFlLEVBQUUsY0FBYztRQUMvQixLQUFLLEVBQUUsU0FBUztRQUNoQixRQUFRLEVBQUU7WUFDUixXQUFXLEVBQUUsYUFBYSxFQUFRLHdDQUF3QztZQUMxRSxRQUFRLEVBQUUsSUFBSSxFQUFvQiwwQ0FBMEM7WUFDNUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsZ0JBQWdCO1lBQ2xELElBQUksRUFBRSxJQUFJO1lBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSTtZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJO1lBQ3JDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUk7WUFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSTtZQUNqQyxRQUFRLEVBQUU7Z0JBQ1IsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRTtnQkFDekIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFLEVBQUU7YUFDVjtZQUNELFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUk7WUFDaEMsU0FBUyxFQUFFLFVBQVU7WUFDckIsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJO1lBQzNDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVE7WUFDcEUsWUFBWSxFQUFFLE1BQU07WUFDcEIsZUFBZSxFQUFFLGVBQWU7WUFDaEMsY0FBYyxFQUFFLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUN0RixnQkFBZ0IsRUFBRSxjQUFjLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDcEcsUUFBUSxFQUFFLFdBQVcsR0FBRyxDQUFDO2dCQUN2QixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtnQkFDOUQsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3pGLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2FBQ2hDLENBQUMsQ0FBQztTQUNKO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsa0JBQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLGNBQWMsQ0FBQyxFQUFFLGtCQUFrQixhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBRWxHLDRFQUE0RTtJQUM1RSxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDaEIsQ0FBQyxrQ0FBbUIsQ0FBQyxFQUFFLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7WUFDckQsQ0FBQyxlQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRTtTQUNqRCxDQUFDLENBQUM7UUFDSCxrQkFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsTUFBTSxDQUFDLEVBQUUsZ0JBQWdCLGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFBQyxPQUFPLFNBQWMsRUFBRSxDQUFDO1FBQ3hCLElBQ0UsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsOEJBQThCLENBQUM7WUFDNUQsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUM7WUFDOUMsU0FBUyxFQUFFLElBQUksS0FBSyxPQUFPO1lBQzNCLFNBQVMsRUFBRSxJQUFJLEtBQUssZ0NBQWdDLEVBQ3BELENBQUM7WUFDRCxrQkFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0UsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFNBQVMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxNQUFNLCtCQUErQixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUVoRixNQUFNLDJCQUEyQixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFO1FBQ3pGLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsS0FBSyxFQUFFLFVBQVU7UUFDakIsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZLElBQUksRUFBRTtLQUNqQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsZ0ZBQWdGO0FBRW5FLFFBQUEsaUNBQWlDLEdBQUcsSUFBQSwwQkFBVSxFQUN6RCx3Q0FBd0MsRUFDeEMsS0FBSyxFQUFFLFdBQWdCLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3hDLE1BQU0sa0JBQWtCLEdBQXVCLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0NBQW1CLENBQUMsQ0FBQztJQUN0RixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdkMsTUFBTSxhQUFhLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixrQkFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBVSxFQUFFLENBQUM7SUFFNUIsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLEVBQUUsT0FBTyxJQUFJLElBQUksRUFBRSxZQUFZLENBQUM7UUFDcEQsSUFBSSxPQUFPLElBQUksSUFBSTtZQUFFLFNBQVM7UUFFOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN6RCxZQUFZLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQztTQUM5QixDQUFDLENBQUM7UUFFSCxJQUFJLE1BQVcsQ0FBQztRQUVoQix5RUFBeUU7UUFDekUsSUFBSSxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLGtCQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsTUFBTSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDMUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNiLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSTtnQkFDaEMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSTtnQkFDcEMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRTtnQkFDcEMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRTtnQkFDNUIsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUMxQixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJO2dCQUNwQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJO2dCQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJO2dCQUN4QixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJO2dCQUM1QixZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJO2dCQUN0QyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJO2dCQUN2QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJO2dCQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJO2dCQUNwQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSTtnQkFDbkQsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSTtnQkFDakMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUk7Z0JBQ3RELGdCQUFnQixFQUFFLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSTthQUMvQyxDQUFDLENBQUM7WUFFSCxxRUFBcUU7WUFDckUsSUFBSSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUM5QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDakMsTUFBTSxjQUFjLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxzQkFBc0IsQ0FBQzt3QkFDckUsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPO3dCQUN2QixhQUFhLEVBQUUsQ0FBQyxDQUFDLFdBQVc7d0JBQzVCLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRTtxQkFDeEIsQ0FBQyxDQUFDO29CQUVILE1BQU0sVUFBVSxHQUFHO3dCQUNqQixZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU87d0JBQ3ZCLGFBQWEsRUFBRSxDQUFDLENBQUMsV0FBVzt3QkFDNUIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFO3dCQUN2QixLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUk7d0JBQ2IsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPO3dCQUNuQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVM7d0JBQ3ZCLGNBQWMsRUFBRSxDQUFDLENBQUMsWUFBWTt3QkFDOUIsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLGNBQWMsSUFBSSxJQUFJO3dCQUMxQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJO3dCQUMzQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJO3dCQUMvQixZQUFZLEVBQUUsQ0FBQyxDQUFDLFVBQVU7d0JBQzFCLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUTt3QkFDckIsY0FBYyxFQUFFLENBQUMsQ0FBQyxZQUFZO3dCQUM5QixTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVE7d0JBQ3JCLGNBQWMsRUFBRSxDQUFDLENBQUMsWUFBWTt3QkFDOUIsYUFBYSxFQUFFLENBQUMsQ0FBQyxXQUFXO3dCQUM1QixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7d0JBQ2QsVUFBVSxFQUFFLENBQUMsQ0FBQyxTQUFTO3dCQUN2QixhQUFhLEVBQUUsQ0FBQyxDQUFDLFdBQVc7d0JBQzVCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTt3QkFDWixTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVE7d0JBQ3JCLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUk7d0JBQzlCLFdBQVcsRUFBRSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUk7d0JBQ2hDLFdBQVcsRUFBRSxDQUFDLENBQUMsVUFBVTt3QkFDekIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO3dCQUNwQixhQUFhLEVBQUUsQ0FBQyxDQUFDLFlBQVk7d0JBQzdCLGFBQWEsRUFBRSxDQUFDLENBQUMsV0FBVzt3QkFDNUIsVUFBVSxFQUFFLENBQUMsQ0FBQyxTQUFTO3dCQUN2QixlQUFlLEVBQUUsQ0FBQyxDQUFDLGFBQWE7d0JBQ2hDLFlBQVksRUFBRSxDQUFDLENBQUMsVUFBVTt3QkFDMUIsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRO3dCQUNyQixjQUFjLEVBQUUsQ0FBQyxDQUFDLFlBQVk7d0JBQzlCLCtCQUErQixFQUFFLENBQUMsQ0FBQyw2QkFBNkIsSUFBSSxJQUFJO3dCQUN4RSxlQUFlLEVBQUUsQ0FBQyxDQUFDLGNBQWMsSUFBSSxJQUFJO3dCQUN6Qyw2QkFBNkIsRUFBRSxDQUFDLENBQUMsMkJBQTJCLElBQUksSUFBSTt3QkFDcEUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixJQUFJLElBQUk7d0JBQzdDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQUMsb0JBQW9CO3dCQUN4RSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUc7cUJBQ1gsQ0FBQztvQkFFRixJQUFJLGNBQWMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQy9CLE1BQU0sa0JBQWtCLENBQUMsd0JBQXdCLENBQUM7NEJBQ2hELEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDeEIsR0FBRyxVQUFVO3lCQUNkLENBQUMsQ0FBQztvQkFDTCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDaEUsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELHFFQUFxRTtZQUNyRSxJQUFJLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQ2hDLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNuQyxJQUFJLGVBQWUsR0FBRyxNQUFNLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDO3dCQUMzRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU87d0JBQ3ZCLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxjQUFjO3dCQUNsQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU87d0JBQ25CLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRTtxQkFDeEIsQ0FBQyxDQUFDO29CQUNILElBQUksZUFBZSxFQUFFLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUMvQyxlQUFlLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyw2QkFBNkIsQ0FBQzs0QkFDdkUsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPOzRCQUN2QixnQkFBZ0IsRUFBRSxDQUFDLENBQUMsY0FBYzs0QkFDbEMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFO3lCQUN4QixDQUFDLENBQUM7b0JBQ0wsQ0FBQztvQkFFRCxNQUFNLFdBQVcsR0FBRzt3QkFDbEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPO3dCQUN2QixTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVE7d0JBQ3JCLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRTt3QkFDdkIsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLGNBQWM7d0JBQ2xDLFlBQVksRUFBRSxDQUFDLENBQUMsV0FBVzt3QkFDM0IsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPO3dCQUNuQixnQkFBZ0IsRUFBRSxDQUFDLENBQUMsZUFBZTt3QkFDbkMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSTt3QkFDdkIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSTt3QkFDMUIsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO3FCQUNqQixDQUFDO29CQUVGLElBQUksZUFBZSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDaEMsTUFBTSxrQkFBa0IsQ0FBQywrQkFBK0IsQ0FBQzs0QkFDdkQsRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOzRCQUN6QixHQUFHLFdBQVc7eUJBQ2YsQ0FBQyxDQUFDO29CQUNMLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLGtCQUFrQixDQUFDLCtCQUErQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN4RSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsb0VBQW9FO1lBQ3BFLElBQUksSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDaEMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ25DLE1BQU0sZUFBZSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsNkJBQTZCLENBQUM7d0JBQzdFLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTzt3QkFDdkIsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO3dCQUNoQixZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQUU7cUJBQ3hCLENBQUMsQ0FBQztvQkFFSCxNQUFNLFdBQVcsR0FBRzt3QkFDbEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPO3dCQUN2QixVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJO3dCQUN4QixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07d0JBQ2hCLFdBQVcsRUFBRSxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUk7d0JBQ2pDLGNBQWMsRUFBRSxDQUFDLENBQUMsYUFBYTt3QkFDL0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFO3FCQUN4QixDQUFDO29CQUVGLElBQUksZUFBZSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDaEMsTUFBTSxrQkFBa0IsQ0FBQywrQkFBK0IsQ0FBQzs0QkFDdkQsRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOzRCQUN6QixHQUFHLFdBQVc7eUJBQ2YsQ0FBQyxDQUFDO29CQUNMLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLGtCQUFrQixDQUFDLCtCQUErQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN4RSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixzRUFBc0U7WUFDdEUsa0JBQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDdkQsTUFBTSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsa0JBQWtCLENBQUM7Z0JBQ25ELFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSTtnQkFDaEMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSTtnQkFDcEMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRTtnQkFDcEMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRTtnQkFDNUIsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUMxQixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJO2dCQUNwQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJO2dCQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJO2dCQUN4QixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJO2dCQUM1QixZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJO2dCQUN0QyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJO2dCQUN2QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJO2dCQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJO2dCQUNwQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSTtnQkFDbkQsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSTtnQkFDakMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUk7Z0JBQ3RELGdCQUFnQixFQUFFLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSTthQUMvQyxDQUFDLENBQUM7WUFFSCxJQUFJLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sa0JBQWtCLENBQUMsd0JBQXdCLENBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNoQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ3ZCLGFBQWEsRUFBRSxDQUFDLENBQUMsV0FBVztvQkFDNUIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFO29CQUN2QixLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUk7b0JBQ2IsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPO29CQUNuQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVM7b0JBQ3ZCLGNBQWMsRUFBRSxDQUFDLENBQUMsWUFBWTtvQkFDOUIsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLGNBQWMsSUFBSSxJQUFJO29CQUMxQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJO29CQUMzQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJO29CQUMvQixZQUFZLEVBQUUsQ0FBQyxDQUFDLFVBQVU7b0JBQzFCLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUTtvQkFDckIsY0FBYyxFQUFFLENBQUMsQ0FBQyxZQUFZO29CQUM5QixTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVE7b0JBQ3JCLGNBQWMsRUFBRSxDQUFDLENBQUMsWUFBWTtvQkFDOUIsYUFBYSxFQUFFLENBQUMsQ0FBQyxXQUFXO29CQUM1QixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7b0JBQ2QsVUFBVSxFQUFFLENBQUMsQ0FBQyxTQUFTO29CQUN2QixhQUFhLEVBQUUsQ0FBQyxDQUFDLFdBQVc7b0JBQzVCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtvQkFDWixTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVE7b0JBQ3JCLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUk7b0JBQzlCLFdBQVcsRUFBRSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUk7b0JBQ2hDLFdBQVcsRUFBRSxDQUFDLENBQUMsVUFBVTtvQkFDekIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO29CQUNwQixhQUFhLEVBQUUsQ0FBQyxDQUFDLFlBQVk7b0JBQzdCLGFBQWEsRUFBRSxDQUFDLENBQUMsV0FBVztvQkFDNUIsVUFBVSxFQUFFLENBQUMsQ0FBQyxTQUFTO29CQUN2QixlQUFlLEVBQUUsQ0FBQyxDQUFDLGFBQWE7b0JBQ2hDLFlBQVksRUFBRSxDQUFDLENBQUMsVUFBVTtvQkFDMUIsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRO29CQUNyQixjQUFjLEVBQUUsQ0FBQyxDQUFDLFlBQVk7b0JBQzlCLCtCQUErQixFQUFFLENBQUMsQ0FBQyw2QkFBNkIsSUFBSSxJQUFJO29CQUN4RSxlQUFlLEVBQUUsQ0FBQyxDQUFDLGNBQWMsSUFBSSxJQUFJO29CQUN6Qyw2QkFBNkIsRUFBRSxDQUFDLENBQUMsMkJBQTJCLElBQUksSUFBSTtvQkFDcEUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixJQUFJLElBQUk7b0JBQzdDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQUMsb0JBQW9CO29CQUN4RSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUc7aUJBQ1gsQ0FBQyxDQUFDLENBQ0osQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sa0JBQWtCLENBQUMsK0JBQStCLENBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNsQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ3ZCLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUTtvQkFDckIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFO29CQUN2QixnQkFBZ0IsRUFBRSxDQUFDLENBQUMsY0FBYztvQkFDbEMsWUFBWSxFQUFFLENBQUMsQ0FBQyxXQUFXO29CQUMzQixRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ25CLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxlQUFlO29CQUNuQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJO29CQUN2QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJO29CQUMxQixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07aUJBQ2pCLENBQUMsQ0FBQyxDQUNKLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUNoQyxNQUFNLGtCQUFrQixDQUFDLCtCQUErQixDQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDbEMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPO29CQUN2QixVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJO29CQUN4QixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07b0JBQ2hCLFdBQVcsRUFBRSxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUk7b0JBQ2pDLGNBQWMsRUFBRSxDQUFDLENBQUMsYUFBYTtvQkFDL0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2lCQUN4QixDQUFDLENBQUMsQ0FDSixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCx1RUFBdUU7UUFDdkUsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXRDLHNEQUFzRDtRQUN0RCxNQUFNLG1CQUFtQixHQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWxFLElBQUksYUFBYSxHQUFrQixJQUFJLENBQUM7UUFFeEMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hCLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzFCLGtCQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixhQUFhLDBDQUEwQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7UUFFRCwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQztnQkFDSCxNQUFNLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztvQkFDakQsTUFBTSxFQUFFLE9BQU87b0JBQ2YsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO29CQUNkLE9BQU8sRUFBRTt3QkFDUCwrQ0FBK0M7d0JBQy9DLFFBQVEsRUFBRSxFQUFFLFdBQVcsRUFBRSxhQUFhLElBQUksRUFBRSxFQUFFO3FCQUMvQztpQkFDRixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxjQUFjLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUMvQixhQUFhLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDckMsa0JBQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLGFBQWEsNEJBQTRCLGFBQWEsRUFBRSxDQUFDLENBQUM7Z0JBQ3hHLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxRQUFhLEVBQUUsQ0FBQztnQkFDdkIsa0JBQU0sQ0FBQyxJQUFJLENBQUMsaURBQWlELFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7UUFDSCxDQUFDO1FBRUQsdUVBQXVFO1FBQ3ZFLElBQUksQ0FBQztZQUNILElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLDZDQUE2QztnQkFDN0MsTUFBTSx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN0RyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sd0RBQXdEO2dCQUN4RCxNQUFNLDJCQUEyQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sWUFBaUIsRUFBRSxDQUFDO1lBQzNCLGtCQUFNLENBQUMsSUFBSSxDQUFDLCtDQUErQyxhQUFhLEtBQUssWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUVELFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FDRixDQUFDIn0=