tango-app-ui-shared 3.7.3-dev6-demo7 → 3.7.3-dev6-demo9

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 (402) hide show
  1. package/esm2022/lib/guards/auth.guard.mjs +26 -0
  2. package/esm2022/lib/guards/lead.guard.mjs +16 -0
  3. package/esm2022/lib/guards/stores.guard.mjs +16 -0
  4. package/esm2022/lib/guards/tickets.guard.mjs +16 -0
  5. package/esm2022/lib/i18n/index.mjs +3 -0
  6. package/esm2022/lib/i18n/translation.module.mjs +17 -0
  7. package/esm2022/lib/i18n/translation.service.mjs +53 -0
  8. package/esm2022/lib/i18n/vocabs/ch.mjs +106 -0
  9. package/esm2022/lib/i18n/vocabs/de.mjs +106 -0
  10. package/esm2022/lib/i18n/vocabs/en.mjs +106 -0
  11. package/esm2022/lib/i18n/vocabs/es.mjs +106 -0
  12. package/esm2022/lib/i18n/vocabs/fr.mjs +106 -0
  13. package/esm2022/lib/i18n/vocabs/jp.mjs +106 -0
  14. package/esm2022/lib/interceptors/http-auth-interceptor.mjs +124 -0
  15. package/esm2022/lib/interfaces/global-state.mjs +2 -0
  16. package/esm2022/lib/modules/common/common-shared.module.mjs +31 -0
  17. package/esm2022/lib/modules/common/custom-select/custom-select.component.mjs +155 -0
  18. package/esm2022/lib/modules/common/filters/filters.component.mjs +179 -0
  19. package/esm2022/lib/modules/common/pagination/pagination.component.mjs +49 -0
  20. package/esm2022/lib/modules/errors/error403/error403.component.mjs +33 -0
  21. package/esm2022/lib/modules/errors/error404/error404.component.mjs +44 -0
  22. package/esm2022/lib/modules/errors/error500/error500.component.mjs +45 -0
  23. package/esm2022/lib/modules/errors/errors-routing.module.mjs +48 -0
  24. package/esm2022/lib/modules/errors/errors.component.mjs +39 -0
  25. package/esm2022/lib/modules/errors/errors.module.mjs +37 -0
  26. package/esm2022/lib/modules/errors/invalid-ip/invalid-ip.component.mjs +44 -0
  27. package/esm2022/lib/modules/intro/contact-support/contact-support.component.mjs +19 -0
  28. package/esm2022/lib/modules/intro/intro-routing.module.mjs +24 -0
  29. package/esm2022/lib/modules/intro/intro.module.mjs +32 -0
  30. package/esm2022/lib/modules/intro/lead-intro/lead-intro.component.mjs +110 -0
  31. package/esm2022/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.mjs +31 -0
  32. package/esm2022/lib/modules/layout/content/content.component.mjs +107 -0
  33. package/esm2022/lib/modules/layout/footer/footer.component.mjs +17 -0
  34. package/esm2022/lib/modules/layout/header/header-menu/header-menu.component.mjs +41 -0
  35. package/esm2022/lib/modules/layout/header/header.component.mjs +100 -0
  36. package/esm2022/lib/modules/layout/header/navbar/navbar.component.mjs +256 -0
  37. package/esm2022/lib/modules/layout/header/notifications-inner/notifications-inner.component.mjs +79 -0
  38. package/esm2022/lib/modules/layout/header/page-title/page-title.component.mjs +56 -0
  39. package/esm2022/lib/modules/layout/keenicon/icons.json +1 -0
  40. package/esm2022/lib/modules/layout/keenicon/keenicon.component.mjs +37 -0
  41. package/esm2022/lib/modules/layout/layout/layout.component.mjs +314 -0
  42. package/esm2022/lib/modules/layout/layout.module.mjs +198 -0
  43. package/esm2022/lib/modules/layout/scripts-init/scripts-init.component.mjs +74 -0
  44. package/esm2022/lib/modules/layout/scroll-top/scroll-top.component.mjs +74 -0
  45. package/esm2022/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.mjs +159 -0
  46. package/esm2022/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.mjs +45 -0
  47. package/esm2022/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.mjs +122 -0
  48. package/esm2022/lib/modules/layout/sidebar/sidebar.component.mjs +134 -0
  49. package/esm2022/lib/modules/layout/toolbar/accounting/accounting.component.mjs +16 -0
  50. package/esm2022/lib/modules/layout/toolbar/classic/classic.component.mjs +331 -0
  51. package/esm2022/lib/modules/layout/toolbar/client-settings/client-settings.component.mjs +88 -0
  52. package/esm2022/lib/modules/layout/toolbar/date-single-select/date-single-select.component.mjs +207 -0
  53. package/esm2022/lib/modules/layout/toolbar/datepicker/datepicker.component.mjs +158 -0
  54. package/esm2022/lib/modules/layout/toolbar/extended/extended.component.mjs +15 -0
  55. package/esm2022/lib/modules/layout/toolbar/metrics-header/metrics-header.component.mjs +1321 -0
  56. package/esm2022/lib/modules/layout/toolbar/reports/reports.component.mjs +18 -0
  57. package/esm2022/lib/modules/layout/toolbar/saas/saas.component.mjs +18 -0
  58. package/esm2022/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.mjs +216 -0
  59. package/esm2022/lib/modules/layout/toolbar/single-store/single-store.component.mjs +178 -0
  60. package/esm2022/lib/modules/layout/toolbar/single-storedate/single-storedate.component.mjs +166 -0
  61. package/esm2022/lib/modules/layout/toolbar/storesingle/storesingle.component.mjs +105 -0
  62. package/esm2022/lib/modules/layout/toolbar/toolbar.component.mjs +372 -0
  63. package/esm2022/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.mjs +1062 -0
  64. package/esm2022/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.mjs +795 -0
  65. package/esm2022/lib/modules/layout/toolbar/trax-header/trax-header.component.mjs +880 -0
  66. package/esm2022/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.mjs +729 -0
  67. package/esm2022/lib/modules/layout/toolbar/zone-header/zone-header.component.mjs +1090 -0
  68. package/esm2022/lib/modules/notification/conformation/conformation.component.mjs +22 -0
  69. package/esm2022/lib/modules/notification/notification/notification.component.mjs +317 -0
  70. package/esm2022/lib/modules/notification/notification-routing.module.mjs +28 -0
  71. package/esm2022/lib/modules/notification/notification.module.mjs +32 -0
  72. package/esm2022/lib/pipes/customDate.pipe.mjs +22 -0
  73. package/esm2022/lib/routes/route-wraper-modules/edge-wrapper.module.mjs +18 -0
  74. package/esm2022/lib/routes/route-wraper-modules/manage-wrapper.module.mjs +18 -0
  75. package/esm2022/lib/routes/route-wraper-modules/profile-wrapper.module.mjs +18 -0
  76. package/esm2022/lib/routes/route-wraper-modules/store-wrapper.module.mjs +18 -0
  77. package/esm2022/lib/routes/route-wraper-modules/ticket-wrapper.module.mjs +18 -0
  78. package/esm2022/lib/routes/routing.mjs +53 -0
  79. package/esm2022/lib/services/auth.service.mjs +141 -0
  80. package/esm2022/lib/services/notification.service.mjs +74 -0
  81. package/esm2022/lib/services/toast.service.mjs +83 -0
  82. package/esm2022/public-api.mjs +56 -0
  83. package/esm2022/tango-app-ui-shared.mjs +5 -0
  84. package/fesm2022/tango-app-ui-shared-edge-wrapper.module-CFDk0tvS.mjs +21 -0
  85. package/fesm2022/tango-app-ui-shared-edge-wrapper.module-CFDk0tvS.mjs.map +1 -0
  86. package/fesm2022/tango-app-ui-shared-intro.module-DYh4ZRha.mjs +188 -0
  87. package/fesm2022/tango-app-ui-shared-intro.module-DYh4ZRha.mjs.map +1 -0
  88. package/fesm2022/tango-app-ui-shared-manage-wrapper.module-BHyh4Njw.mjs +21 -0
  89. package/fesm2022/tango-app-ui-shared-manage-wrapper.module-BHyh4Njw.mjs.map +1 -0
  90. package/fesm2022/tango-app-ui-shared-notification.module-C5ZmCf8U.mjs +400 -0
  91. package/fesm2022/tango-app-ui-shared-notification.module-C5ZmCf8U.mjs.map +1 -0
  92. package/fesm2022/tango-app-ui-shared-profile-wrapper.module-BNC1AGOk.mjs +21 -0
  93. package/fesm2022/tango-app-ui-shared-profile-wrapper.module-BNC1AGOk.mjs.map +1 -0
  94. package/fesm2022/tango-app-ui-shared-store-wrapper.module-DdaCYHdv.mjs +21 -0
  95. package/fesm2022/tango-app-ui-shared-store-wrapper.module-DdaCYHdv.mjs.map +1 -0
  96. package/fesm2022/tango-app-ui-shared-ticket-wrapper.module-r32uKkDO.mjs +21 -0
  97. package/fesm2022/tango-app-ui-shared-ticket-wrapper.module-r32uKkDO.mjs.map +1 -0
  98. package/fesm2022/tango-app-ui-shared.mjs +12440 -0
  99. package/fesm2022/tango-app-ui-shared.mjs.map +1 -0
  100. package/index.d.ts +5 -0
  101. package/lib/guards/auth.guard.d.ts +10 -0
  102. package/lib/guards/lead.guard.d.ts +2 -0
  103. package/lib/guards/stores.guard.d.ts +2 -0
  104. package/lib/guards/tickets.guard.d.ts +2 -0
  105. package/{src/lib/i18n/index.ts → lib/i18n/index.d.ts} +2 -2
  106. package/lib/i18n/translation.module.d.ts +8 -0
  107. package/lib/i18n/translation.service.d.ts +19 -0
  108. package/lib/i18n/vocabs/ch.d.ts +104 -0
  109. package/lib/i18n/vocabs/de.d.ts +104 -0
  110. package/lib/i18n/vocabs/en.d.ts +104 -0
  111. package/lib/i18n/vocabs/es.d.ts +104 -0
  112. package/lib/i18n/vocabs/fr.d.ts +104 -0
  113. package/lib/i18n/vocabs/jp.d.ts +104 -0
  114. package/lib/interceptors/http-auth-interceptor.d.ts +19 -0
  115. package/lib/interfaces/global-state.d.ts +5 -0
  116. package/lib/modules/common/common-shared.module.d.ts +13 -0
  117. package/lib/modules/common/custom-select/custom-select.component.d.ts +33 -0
  118. package/lib/modules/common/filters/filters.component.d.ts +38 -0
  119. package/lib/modules/common/pagination/pagination.component.d.ts +18 -0
  120. package/lib/modules/errors/error403/error403.component.d.ts +14 -0
  121. package/lib/modules/errors/error404/error404.component.d.ts +15 -0
  122. package/lib/modules/errors/error500/error500.component.d.ts +15 -0
  123. package/lib/modules/errors/errors-routing.module.d.ts +7 -0
  124. package/lib/modules/errors/errors.component.d.ts +13 -0
  125. package/lib/modules/errors/errors.module.d.ts +13 -0
  126. package/lib/modules/errors/invalid-ip/invalid-ip.component.d.ts +17 -0
  127. package/lib/modules/intro/contact-support/contact-support.component.d.ts +9 -0
  128. package/lib/modules/intro/intro-routing.module.d.ts +7 -0
  129. package/lib/modules/intro/intro.module.d.ts +11 -0
  130. package/lib/modules/intro/lead-intro/lead-intro.component.d.ts +31 -0
  131. package/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.d.ts +13 -0
  132. package/lib/modules/layout/content/content.component.d.ts +25 -0
  133. package/lib/modules/layout/footer/footer.component.d.ts +8 -0
  134. package/lib/modules/layout/header/header-menu/header-menu.component.d.ts +18 -0
  135. package/lib/modules/layout/header/header.component.d.ts +30 -0
  136. package/lib/modules/layout/header/navbar/navbar.component.d.ts +45 -0
  137. package/lib/modules/layout/header/notifications-inner/notifications-inner.component.d.ts +25 -0
  138. package/lib/modules/layout/header/page-title/page-title.component.d.ts +23 -0
  139. package/lib/modules/layout/keenicon/keenicon.component.d.ts +13 -0
  140. package/lib/modules/layout/layout/layout.component.d.ts +82 -0
  141. package/lib/modules/layout/layout.module.d.ts +50 -0
  142. package/lib/modules/layout/scripts-init/scripts-init.component.d.ts +19 -0
  143. package/lib/modules/layout/scroll-top/scroll-top.component.d.ts +19 -0
  144. package/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.d.ts +45 -0
  145. package/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.d.ts +19 -0
  146. package/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.d.ts +26 -0
  147. package/lib/modules/layout/sidebar/sidebar.component.d.ts +36 -0
  148. package/lib/modules/layout/toolbar/accounting/accounting.component.d.ts +8 -0
  149. package/lib/modules/layout/toolbar/classic/classic.component.d.ts +48 -0
  150. package/lib/modules/layout/toolbar/client-settings/client-settings.component.d.ts +16 -0
  151. package/lib/modules/layout/toolbar/date-single-select/date-single-select.component.d.ts +28 -0
  152. package/lib/modules/layout/toolbar/datepicker/datepicker.component.d.ts +28 -0
  153. package/lib/modules/layout/toolbar/extended/extended.component.d.ts +8 -0
  154. package/lib/modules/layout/toolbar/metrics-header/metrics-header.component.d.ts +103 -0
  155. package/lib/modules/layout/toolbar/reports/reports.component.d.ts +9 -0
  156. package/lib/modules/layout/toolbar/saas/saas.component.d.ts +9 -0
  157. package/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.d.ts +32 -0
  158. package/lib/modules/layout/toolbar/single-store/single-store.component.d.ts +33 -0
  159. package/lib/modules/layout/toolbar/single-storedate/single-storedate.component.d.ts +34 -0
  160. package/lib/modules/layout/toolbar/storesingle/storesingle.component.d.ts +24 -0
  161. package/lib/modules/layout/toolbar/toolbar.component.d.ts +57 -0
  162. package/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.d.ts +93 -0
  163. package/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.d.ts +80 -0
  164. package/lib/modules/layout/toolbar/trax-header/trax-header.component.d.ts +83 -0
  165. package/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.d.ts +74 -0
  166. package/lib/modules/layout/toolbar/zone-header/zone-header.component.d.ts +97 -0
  167. package/lib/modules/notification/conformation/conformation.component.d.ts +10 -0
  168. package/lib/modules/notification/notification/notification.component.d.ts +63 -0
  169. package/lib/modules/notification/notification-routing.module.d.ts +7 -0
  170. package/lib/modules/notification/notification.module.d.ts +11 -0
  171. package/lib/pipes/customDate.pipe.d.ts +7 -0
  172. package/lib/routes/route-wraper-modules/edge-wrapper.module.d.ts +7 -0
  173. package/lib/routes/route-wraper-modules/manage-wrapper.module.d.ts +7 -0
  174. package/lib/routes/route-wraper-modules/profile-wrapper.module.d.ts +7 -0
  175. package/lib/routes/route-wraper-modules/store-wrapper.module.d.ts +7 -0
  176. package/lib/routes/route-wraper-modules/ticket-wrapper.module.d.ts +7 -0
  177. package/lib/routes/routing.d.ts +3 -0
  178. package/lib/services/auth.service.d.ts +49 -0
  179. package/lib/services/notification.service.d.ts +30 -0
  180. package/lib/services/toast.service.d.ts +10 -0
  181. package/package.json +25 -12
  182. package/{src/public-api.ts → public-api.d.ts} +44 -71
  183. package/.eslintrc.json +0 -37
  184. package/ng-package.json +0 -7
  185. package/src/lib/guards/auth.guard.ts +0 -20
  186. package/src/lib/guards/lead.guard.ts +0 -16
  187. package/src/lib/guards/stores.guard.ts +0 -16
  188. package/src/lib/guards/tickets.guard.ts +0 -16
  189. package/src/lib/i18n/translation.module.ts +0 -9
  190. package/src/lib/i18n/translation.service.ts +0 -61
  191. package/src/lib/i18n/vocabs/ch.ts +0 -105
  192. package/src/lib/i18n/vocabs/de.ts +0 -105
  193. package/src/lib/i18n/vocabs/en.ts +0 -105
  194. package/src/lib/i18n/vocabs/es.ts +0 -105
  195. package/src/lib/i18n/vocabs/fr.ts +0 -105
  196. package/src/lib/i18n/vocabs/jp.ts +0 -105
  197. package/src/lib/interceptors/http-auth-interceptor.ts +0 -225
  198. package/src/lib/interfaces/global-state.ts +0 -6
  199. package/src/lib/modules/common/common-shared.module.ts +0 -20
  200. package/src/lib/modules/common/custom-select/custom-select.component.html +0 -42
  201. package/src/lib/modules/common/custom-select/custom-select.component.scss +0 -131
  202. package/src/lib/modules/common/custom-select/custom-select.component.spec.ts +0 -23
  203. package/src/lib/modules/common/custom-select/custom-select.component.ts +0 -149
  204. package/src/lib/modules/common/filters/filters.component.html +0 -76
  205. package/src/lib/modules/common/filters/filters.component.scss +0 -131
  206. package/src/lib/modules/common/filters/filters.component.spec.ts +0 -23
  207. package/src/lib/modules/common/filters/filters.component.ts +0 -181
  208. package/src/lib/modules/common/pagination/pagination.component.html +0 -26
  209. package/src/lib/modules/common/pagination/pagination.component.scss +0 -63
  210. package/src/lib/modules/common/pagination/pagination.component.spec.ts +0 -23
  211. package/src/lib/modules/common/pagination/pagination.component.ts +0 -46
  212. package/src/lib/modules/errors/error403/error403.component.html +0 -25
  213. package/src/lib/modules/errors/error403/error403.component.scss +0 -0
  214. package/src/lib/modules/errors/error403/error403.component.spec.ts +0 -23
  215. package/src/lib/modules/errors/error403/error403.component.ts +0 -28
  216. package/src/lib/modules/errors/error404/error404.component.html +0 -24
  217. package/src/lib/modules/errors/error404/error404.component.scss +0 -0
  218. package/src/lib/modules/errors/error404/error404.component.spec.ts +0 -25
  219. package/src/lib/modules/errors/error404/error404.component.ts +0 -50
  220. package/src/lib/modules/errors/error500/error500.component.html +0 -24
  221. package/src/lib/modules/errors/error500/error500.component.scss +0 -0
  222. package/src/lib/modules/errors/error500/error500.component.spec.ts +0 -25
  223. package/src/lib/modules/errors/error500/error500.component.ts +0 -50
  224. package/src/lib/modules/errors/errors-routing.module.ts +0 -40
  225. package/src/lib/modules/errors/errors.component.html +0 -15
  226. package/src/lib/modules/errors/errors.component.scss +0 -4
  227. package/src/lib/modules/errors/errors.component.spec.ts +0 -25
  228. package/src/lib/modules/errors/errors.component.ts +0 -42
  229. package/src/lib/modules/errors/errors.module.ts +0 -25
  230. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.html +0 -16
  231. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.scss +0 -0
  232. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.spec.ts +0 -23
  233. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.ts +0 -43
  234. package/src/lib/modules/intro/contact-support/contact-support.component.html +0 -30
  235. package/src/lib/modules/intro/contact-support/contact-support.component.scss +0 -60
  236. package/src/lib/modules/intro/contact-support/contact-support.component.spec.ts +0 -23
  237. package/src/lib/modules/intro/contact-support/contact-support.component.ts +0 -17
  238. package/src/lib/modules/intro/intro-routing.module.ts +0 -16
  239. package/src/lib/modules/intro/intro.module.ts +0 -21
  240. package/src/lib/modules/intro/lead-intro/lead-intro.component.html +0 -325
  241. package/src/lib/modules/intro/lead-intro/lead-intro.component.scss +0 -185
  242. package/src/lib/modules/intro/lead-intro/lead-intro.component.spec.ts +0 -23
  243. package/src/lib/modules/intro/lead-intro/lead-intro.component.ts +0 -120
  244. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.html +0 -44
  245. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.scss +0 -28
  246. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.spec.ts +0 -23
  247. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.ts +0 -24
  248. package/src/lib/modules/layout/content/content.component.html +0 -12
  249. package/src/lib/modules/layout/content/content.component.scss +0 -0
  250. package/src/lib/modules/layout/content/content.component.ts +0 -102
  251. package/src/lib/modules/layout/footer/footer.component.html +0 -29
  252. package/src/lib/modules/layout/footer/footer.component.scss +0 -7
  253. package/src/lib/modules/layout/footer/footer.component.spec.ts +0 -25
  254. package/src/lib/modules/layout/footer/footer.component.ts +0 -13
  255. package/src/lib/modules/layout/header/header-menu/header-menu.component.html +0 -27
  256. package/src/lib/modules/layout/header/header-menu/header-menu.component.scss +0 -4
  257. package/src/lib/modules/layout/header/header-menu/header-menu.component.spec.ts +0 -25
  258. package/src/lib/modules/layout/header/header-menu/header-menu.component.ts +0 -38
  259. package/src/lib/modules/layout/header/header.component.html +0 -90
  260. package/src/lib/modules/layout/header/header.component.scss +0 -7
  261. package/src/lib/modules/layout/header/header.component.spec.ts +0 -25
  262. package/src/lib/modules/layout/header/header.component.ts +0 -139
  263. package/src/lib/modules/layout/header/navbar/navbar.component.html +0 -156
  264. package/src/lib/modules/layout/header/navbar/navbar.component.scss +0 -223
  265. package/src/lib/modules/layout/header/navbar/navbar.component.spec.ts +0 -23
  266. package/src/lib/modules/layout/header/navbar/navbar.component.ts +0 -255
  267. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.html +0 -200
  268. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.scss +0 -139
  269. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.ts +0 -76
  270. package/src/lib/modules/layout/header/page-title/page-title.component.html +0 -32
  271. package/src/lib/modules/layout/header/page-title/page-title.component.scss +0 -11
  272. package/src/lib/modules/layout/header/page-title/page-title.component.ts +0 -47
  273. package/src/lib/modules/layout/keenicon/icons.json +0 -1
  274. package/src/lib/modules/layout/keenicon/keenicon.component.html +0 -4
  275. package/src/lib/modules/layout/keenicon/keenicon.component.scss +0 -0
  276. package/src/lib/modules/layout/keenicon/keenicon.component.spec.ts +0 -23
  277. package/src/lib/modules/layout/keenicon/keenicon.component.ts +0 -30
  278. package/src/lib/modules/layout/layout/layout.component.html +0 -71
  279. package/src/lib/modules/layout/layout/layout.component.scss +0 -23
  280. package/src/lib/modules/layout/layout/layout.component.ts +0 -425
  281. package/src/lib/modules/layout/layout.module.ts +0 -129
  282. package/src/lib/modules/layout/scripts-init/scripts-init.component.html +0 -0
  283. package/src/lib/modules/layout/scripts-init/scripts-init.component.ts +0 -81
  284. package/src/lib/modules/layout/scroll-top/scroll-top.component.html +0 -1
  285. package/src/lib/modules/layout/scroll-top/scroll-top.component.ts +0 -75
  286. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.html +0 -70
  287. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.scss +0 -57
  288. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.spec.ts +0 -23
  289. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.ts +0 -136
  290. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.html +0 -26
  291. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.scss +0 -0
  292. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.spec.ts +0 -23
  293. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.ts +0 -36
  294. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.html +0 -761
  295. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.scss +0 -38
  296. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.spec.ts +0 -23
  297. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.ts +0 -130
  298. package/src/lib/modules/layout/sidebar/sidebar.component.html +0 -16
  299. package/src/lib/modules/layout/sidebar/sidebar.component.scss +0 -3
  300. package/src/lib/modules/layout/sidebar/sidebar.component.spec.ts +0 -23
  301. package/src/lib/modules/layout/sidebar/sidebar.component.ts +0 -203
  302. package/src/lib/modules/layout/toolbar/accounting/accounting.component.html +0 -84
  303. package/src/lib/modules/layout/toolbar/accounting/accounting.component.scss +0 -0
  304. package/src/lib/modules/layout/toolbar/accounting/accounting.component.spec.ts +0 -23
  305. package/src/lib/modules/layout/toolbar/accounting/accounting.component.ts +0 -14
  306. package/src/lib/modules/layout/toolbar/classic/classic.component.html +0 -69
  307. package/src/lib/modules/layout/toolbar/classic/classic.component.scss +0 -238
  308. package/src/lib/modules/layout/toolbar/classic/classic.component.spec.ts +0 -23
  309. package/src/lib/modules/layout/toolbar/classic/classic.component.ts +0 -389
  310. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.html +0 -4
  311. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.scss +0 -3
  312. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.spec.ts +0 -23
  313. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.ts +0 -91
  314. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.html +0 -22
  315. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.scss +0 -156
  316. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.spec.ts +0 -23
  317. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.ts +0 -238
  318. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.html +0 -14
  319. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.scss +0 -149
  320. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.spec.ts +0 -23
  321. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.ts +0 -183
  322. package/src/lib/modules/layout/toolbar/extended/extended.component.html +0 -100
  323. package/src/lib/modules/layout/toolbar/extended/extended.component.scss +0 -0
  324. package/src/lib/modules/layout/toolbar/extended/extended.component.spec.ts +0 -23
  325. package/src/lib/modules/layout/toolbar/extended/extended.component.ts +0 -12
  326. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.html +0 -311
  327. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.scss +0 -311
  328. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.spec.ts +0 -23
  329. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.ts +0 -1555
  330. package/src/lib/modules/layout/toolbar/reports/reports.component.html +0 -62
  331. package/src/lib/modules/layout/toolbar/reports/reports.component.scss +0 -0
  332. package/src/lib/modules/layout/toolbar/reports/reports.component.spec.ts +0 -23
  333. package/src/lib/modules/layout/toolbar/reports/reports.component.ts +0 -14
  334. package/src/lib/modules/layout/toolbar/saas/saas.component.html +0 -77
  335. package/src/lib/modules/layout/toolbar/saas/saas.component.scss +0 -0
  336. package/src/lib/modules/layout/toolbar/saas/saas.component.spec.ts +0 -23
  337. package/src/lib/modules/layout/toolbar/saas/saas.component.ts +0 -14
  338. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.html +0 -26
  339. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.scss +0 -176
  340. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.spec.ts +0 -23
  341. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.ts +0 -235
  342. package/src/lib/modules/layout/toolbar/single-store/single-store.component.html +0 -39
  343. package/src/lib/modules/layout/toolbar/single-store/single-store.component.scss +0 -176
  344. package/src/lib/modules/layout/toolbar/single-store/single-store.component.spec.ts +0 -23
  345. package/src/lib/modules/layout/toolbar/single-store/single-store.component.ts +0 -188
  346. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.html +0 -17
  347. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.scss +0 -172
  348. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.spec.ts +0 -23
  349. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.ts +0 -179
  350. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.html +0 -4
  351. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.scss +0 -19
  352. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.spec.ts +0 -23
  353. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.ts +0 -105
  354. package/src/lib/modules/layout/toolbar/toolbar.component.html +0 -64
  355. package/src/lib/modules/layout/toolbar/toolbar.component.scss +0 -0
  356. package/src/lib/modules/layout/toolbar/toolbar.component.spec.ts +0 -25
  357. package/src/lib/modules/layout/toolbar/toolbar.component.ts +0 -400
  358. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.html +0 -259
  359. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.scss +0 -305
  360. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.spec.ts +0 -23
  361. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.ts +0 -1202
  362. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.html +0 -199
  363. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.scss +0 -311
  364. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.spec.ts +0 -23
  365. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.ts +0 -899
  366. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.html +0 -204
  367. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.scss +0 -311
  368. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.spec.ts +0 -23
  369. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.ts +0 -1045
  370. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.html +0 -190
  371. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.scss +0 -311
  372. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.spec.ts +0 -23
  373. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.ts +0 -825
  374. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.html +0 -259
  375. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.scss +0 -305
  376. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.spec.ts +0 -23
  377. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.ts +0 -1242
  378. package/src/lib/modules/notification/conformation/conformation.component.html +0 -25
  379. package/src/lib/modules/notification/conformation/conformation.component.scss +0 -0
  380. package/src/lib/modules/notification/conformation/conformation.component.spec.ts +0 -23
  381. package/src/lib/modules/notification/conformation/conformation.component.ts +0 -23
  382. package/src/lib/modules/notification/notification/notification.component.html +0 -209
  383. package/src/lib/modules/notification/notification/notification.component.scss +0 -211
  384. package/src/lib/modules/notification/notification/notification.component.spec.ts +0 -23
  385. package/src/lib/modules/notification/notification/notification.component.ts +0 -310
  386. package/src/lib/modules/notification/notification-routing.module.ts +0 -20
  387. package/src/lib/modules/notification/notification.module.ts +0 -21
  388. package/src/lib/pipes/customDate.pipe.ts +0 -18
  389. package/src/lib/routes/route-wraper-modules/analyse-wrapper.module.ts +0 -12
  390. package/src/lib/routes/route-wraper-modules/edge-wrapper.module.ts +0 -11
  391. package/src/lib/routes/route-wraper-modules/manage-wrapper.module.ts +0 -11
  392. package/src/lib/routes/route-wraper-modules/profile-wrapper.module.ts +0 -12
  393. package/src/lib/routes/route-wraper-modules/store-wrapper.module.ts +0 -11
  394. package/src/lib/routes/route-wraper-modules/ticket-wrapper.module.ts +0 -10
  395. package/src/lib/routes/routing.ts +0 -56
  396. package/src/lib/services/auth.service.ts +0 -178
  397. package/src/lib/services/notification.service.spec.ts +0 -16
  398. package/src/lib/services/notification.service.ts +0 -73
  399. package/src/lib/services/toast.service.ts +0 -82
  400. package/tsconfig.lib.json +0 -14
  401. package/tsconfig.lib.prod.json +0 -10
  402. package/tsconfig.spec.json +0 -14
@@ -0,0 +1,1090 @@
1
+ import { Component, HostListener, } from "@angular/core";
2
+ import dayjs from "dayjs";
3
+ import "dayjs/locale/en";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../../../services/auth.service";
6
+ import * as i2 from "@angular/router";
7
+ import * as i3 from "tango-app-ui-global";
8
+ import * as i4 from "@angular/common";
9
+ import * as i5 from "../../../common/custom-select/custom-select.component";
10
+ import * as i6 from "@angular/forms";
11
+ export class ZoneHeaderComponent {
12
+ auth;
13
+ router;
14
+ gs;
15
+ cd;
16
+ dayjs = dayjs;
17
+ isCustomDate = (m) => {
18
+ if (m.isSame(this.dayjs(), "day")) {
19
+ return "invalid-date"; // disable today
20
+ }
21
+ return false;
22
+ };
23
+ selectedDateRange = { startDate: dayjs().subtract(30, 'days'),
24
+ endDate: dayjs().subtract(1, "days"), };
25
+ selectedFilters = {
26
+ client: null,
27
+ clientName: null,
28
+ clients: [],
29
+ store: null,
30
+ stores: [],
31
+ date: null,
32
+ group: [],
33
+ location: [],
34
+ country: [],
35
+ };
36
+ Opendropdown = false;
37
+ dropdownOpen = null; // 'location' or 'group'
38
+ searchLocationText = "";
39
+ searchGroupText = "";
40
+ locations = [];
41
+ filteredLocations = [];
42
+ groupsData = [];
43
+ filteredGroups = [];
44
+ filteredStores = [];
45
+ stores = [];
46
+ searchStoreText = '';
47
+ clientList = [];
48
+ selectedClient;
49
+ locationLabel = [];
50
+ groupLabel = [];
51
+ users;
52
+ url;
53
+ filteredCountries = [];
54
+ countryLabel = [];
55
+ searchCountryText = "";
56
+ countries = [];
57
+ constructor(auth, router, gs, cd) {
58
+ this.auth = auth;
59
+ this.router = router;
60
+ this.gs = gs;
61
+ this.cd = cd;
62
+ }
63
+ onClick(event) {
64
+ const target = event.target;
65
+ if (!target.closest('.dropdown2')) {
66
+ this.Opendropdown = false;
67
+ }
68
+ }
69
+ closeDropdown1() {
70
+ this.Opendropdown = false;
71
+ }
72
+ zoneData = [
73
+ {
74
+ "storeId": "11-1578",
75
+ "storeName": "LKST1757"
76
+ },
77
+ {
78
+ "storeId": "11-1919",
79
+ "storeName": "LKST2329"
80
+ },
81
+ {
82
+ "storeId": "11-2222",
83
+ "storeName": "LKST2554"
84
+ },
85
+ {
86
+ "storeId": "11-2391",
87
+ "storeName": "LKST2598"
88
+ },
89
+ {
90
+ "storeId": "11-376",
91
+ "storeName": "LKST646"
92
+ },
93
+ {
94
+ "storeId": "11-82",
95
+ "storeName": "LKST84"
96
+ }
97
+ ];
98
+ ngOnInit() {
99
+ // this.setRangesBasedOnRoute();
100
+ // Listen for route changes to update ranges
101
+ // this.router?.events?.subscribe((event) => {
102
+ // if (event instanceof NavigationEnd) {
103
+ // this.setRangesBasedOnRoute();
104
+ // }
105
+ // });
106
+ this.url = this.router.url.split("?")[0].split('/');
107
+ const user = JSON.parse(localStorage.getItem('user-info'));
108
+ this.users = user;
109
+ this.gs?.manageRefreshTrigger?.subscribe((e) => {
110
+ if (e) {
111
+ if (user.userType === 'tango') {
112
+ this.getClient();
113
+ }
114
+ else {
115
+ const storedFilters = localStorage.getItem("header-filters");
116
+ if (storedFilters) {
117
+ const headerFilters = JSON.parse(storedFilters);
118
+ this.filteredStores = headerFilters?.stores.map((store) => ({
119
+ ...store,
120
+ checked: store.checked
121
+ }));
122
+ }
123
+ }
124
+ }
125
+ });
126
+ // Fetch client data if the user is of type 'tango'
127
+ if (user.userType === 'tango') {
128
+ this.getClient();
129
+ }
130
+ else {
131
+ this.getCountry();
132
+ this.getLocations();
133
+ this.getGroups();
134
+ this.getStore();
135
+ const clientFilters = localStorage.getItem("client-details");
136
+ if (clientFilters) {
137
+ const headerclientFilters = JSON.parse(clientFilters);
138
+ this.selectedClient = {
139
+ trafficDateRange: headerclientFilters.trafficDateRange
140
+ };
141
+ }
142
+ }
143
+ // Load filters from localStorage if they exist
144
+ const storedFilters = localStorage.getItem("header-filters1");
145
+ if (storedFilters) {
146
+ const headerFilters = JSON.parse(storedFilters);
147
+ if (headerFilters.date) {
148
+ this.selectedDateRange = {
149
+ startDate: this.dayjs("09-09-2025").format("YYYY-MM-DD"),
150
+ endDate: this.dayjs("09-09-2025").format("YYYY-MM-DD"),
151
+ };
152
+ headerFilters.date = this.selectedDateRange;
153
+ }
154
+ // Initialize selectedFilters with defaults or existing values
155
+ this.selectedFilters = {
156
+ client: headerFilters.client || this.users.client || '11',
157
+ clientName: headerFilters.clientName || '',
158
+ clients: headerFilters.clients || [],
159
+ store: headerFilters.store || null,
160
+ date: headerFilters.date || {},
161
+ stores: headerFilters.stores || [],
162
+ group: headerFilters.group || [],
163
+ location: headerFilters.location || [],
164
+ country: headerFilters.country || []
165
+ };
166
+ // Sync filtered data with stored selections
167
+ this.filteredCountries = this.syncWithLocalStorage(headerFilters.country);
168
+ this.filteredLocations = this.syncWithLocalStorage(headerFilters.location);
169
+ this.filteredGroups = this.syncWithLocalStorage(headerFilters.group);
170
+ this.filteredStores = this.syncWithLocalStorage(headerFilters.stores);
171
+ // Format date range if it exists
172
+ if (headerFilters.date) {
173
+ this.selectedDateRange = {
174
+ startDate: this.dayjs("09-09-2025").format("YYYY-MM-DD"),
175
+ endDate: this.dayjs("09-09-2025").format("YYYY-MM-DD"),
176
+ };
177
+ }
178
+ headerFilters.date = this.selectedDateRange;
179
+ // console.log("3")
180
+ // Emit data via service and update localStorage
181
+ this.emitAndStoreFilters();
182
+ }
183
+ else {
184
+ // Initialize empty states if no header filters are present in localStorage
185
+ this.resetFilters();
186
+ // console.log("2")
187
+ }
188
+ }
189
+ syncWithLocalStorage(items) {
190
+ return items
191
+ ? items.map((item) => ({
192
+ ...item,
193
+ checked: item.checked === true
194
+ }))
195
+ : [];
196
+ }
197
+ emitAndStoreFilters() {
198
+ this.gs.dataRangeValue.next(this.selectedFilters);
199
+ localStorage.setItem("header-filters1", JSON.stringify(this.selectedFilters));
200
+ // console.log("1")
201
+ }
202
+ /**
203
+ * Reset selectedFilters and all related arrays to empty states
204
+ */
205
+ resetFilters() {
206
+ this.selectedFilters = {
207
+ client: null,
208
+ clientName: '',
209
+ clients: [],
210
+ store: null,
211
+ date: {},
212
+ stores: [],
213
+ group: [],
214
+ location: [],
215
+ country: []
216
+ };
217
+ this.filteredLocations = [];
218
+ this.filteredGroups = [];
219
+ this.filteredStores = [];
220
+ this.filteredCountries = [];
221
+ }
222
+ getClient() {
223
+ this.auth.getClients().subscribe({
224
+ next: (e) => {
225
+ if (e) {
226
+ this.clientList = e.data.result;
227
+ const headerFilters = JSON.parse(localStorage.getItem("header-filters1") || "{}");
228
+ if (headerFilters.client) {
229
+ this.clientList.find((obj) => {
230
+ if (obj.clientId === headerFilters.client) {
231
+ this.selectedClient = obj;
232
+ }
233
+ });
234
+ // const startDate = this.dayjs(headerFilters.date.startDate);
235
+ // const endDate = this.dayjs(headerFilters.date.endDate);
236
+ // const differenceInDays = endDate.diff(startDate, 'days');
237
+ // if (differenceInDays >= 90 && this.selectedClient?.trafficDateRange === 90) {
238
+ // this.selectedDateRange = {
239
+ // startDate: this.dayjs(headerFilters.date.startDate, "YYYY-MM-DD").subtract(-90, 'days').format("DD-MM-YYYY"),
240
+ // endDate: this.dayjs(headerFilters.date.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
241
+ // };
242
+ // } else {
243
+ // this.selectedDateRange = {
244
+ // startDate: this.dayjs(this.selectedDateRange.startDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
245
+ // endDate: this.dayjs(this.selectedDateRange.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
246
+ // };
247
+ // }
248
+ this.selectedFilters.client = headerFilters.client;
249
+ this.selectedFilters.clientName = headerFilters.clientName;
250
+ this.selectedFilters.clients = headerFilters.clients;
251
+ this.selectedFilters.store = headerFilters.store;
252
+ this.selectedFilters.date = headerFilters.date;
253
+ this.selectedFilters.stores = headerFilters.stores;
254
+ this.selectedFilters.group = headerFilters.group;
255
+ this.selectedFilters.location = headerFilters.location;
256
+ this.selectedFilters.country = headerFilters.country;
257
+ this.gs.dataRangeValue.next(this.selectedFilters);
258
+ // console.log("2")
259
+ // Ensure locations and groups are loaded before fetching stores
260
+ this.getCountry();
261
+ this.getLocations();
262
+ this.getGroups();
263
+ // Fetch stores only after locations and groups are set
264
+ this.getStore();
265
+ }
266
+ else {
267
+ this.selectedClient = this.clientList[0];
268
+ this.selectedFilters.client = this.selectedClient.clientId ? this.selectedClient.clientId : '11';
269
+ this.selectedFilters.clientName = this.selectedClient.clientName;
270
+ this.selectedFilters.clients = headerFilters.clients;
271
+ this.selectedFilters.store = headerFilters.store;
272
+ this.selectedFilters.date = headerFilters.date;
273
+ this.selectedFilters.stores = headerFilters.stores;
274
+ this.selectedFilters.group = headerFilters.group;
275
+ this.selectedFilters.location = headerFilters.location;
276
+ this.selectedFilters.country = headerFilters.country;
277
+ localStorage.setItem("header-filters1", JSON.stringify(this.selectedFilters));
278
+ this.gs.dataRangeValue.next(this.selectedFilters);
279
+ // console.log("3")
280
+ this.cd.detectChanges();
281
+ // Ensure locations and groups are loaded before fetching stores
282
+ this.getCountry();
283
+ this.getLocations();
284
+ this.getGroups();
285
+ // Fetch stores only after locations and groups are set
286
+ this.getStore();
287
+ }
288
+ }
289
+ else {
290
+ this.selectedClient = this.clientList[0];
291
+ this.selectedFilters.client = this.selectedClient.clientId ? this.selectedClient.clientId : '11';
292
+ this.selectedFilters.clientName = this.selectedClient.clientName;
293
+ // Ensure locations and groups are loaded before fetching stores
294
+ this.getCountry();
295
+ this.getLocations();
296
+ this.getGroups();
297
+ // Fetch stores only after locations and groups are set
298
+ this.getStore();
299
+ localStorage.setItem("header-filters1", JSON.stringify(this.selectedFilters));
300
+ this.gs.dataRangeValue.next(this.selectedFilters);
301
+ // console.log("4")
302
+ this.cd.detectChanges();
303
+ }
304
+ this.getUserInfo(this.selectedFilters.client);
305
+ },
306
+ });
307
+ }
308
+ getUserInfo(client) {
309
+ let obj = {
310
+ clientId: client ? client : '11'
311
+ };
312
+ if (client) {
313
+ this.auth.getHeaderUsers(obj).subscribe({
314
+ next: (e) => {
315
+ localStorage.setItem("usersEmail-info", JSON.stringify(e?.data?.userEmailData || []));
316
+ }
317
+ });
318
+ }
319
+ }
320
+ onClientSelect(event) {
321
+ // Update the selected client
322
+ this.selectedClient = event;
323
+ // Clear previous filtered data and selections
324
+ this.filteredGroups = [];
325
+ this.filteredStores = [];
326
+ this.filteredLocations = [];
327
+ this.selectedFilters.stores = [];
328
+ this.selectedFilters.group = [];
329
+ this.selectedFilters.location = [];
330
+ this.selectedFilters.country = [];
331
+ // Fetch header filters from localStorage
332
+ const headerFilters = JSON.parse(localStorage.getItem("header-filters1") || "{}");
333
+ // Update the selected filters with the new client
334
+ this.selectedFilters.client = this.selectedClient.clientId ? this.selectedClient.clientId : '11';
335
+ this.selectedFilters.clientName = this.selectedClient.clientName;
336
+ // Remove old store, group, and location data from the header filters
337
+ delete headerFilters.stores;
338
+ delete headerFilters.groups;
339
+ delete headerFilters.location;
340
+ delete headerFilters.country;
341
+ // Fetch new data based on the new client
342
+ this.getCountry();
343
+ this.getLocations();
344
+ this.getStore();
345
+ this.getGroups();
346
+ // Update localStorage with the new client selection and empty filter data
347
+ localStorage.setItem('header-filters1', JSON.stringify(this.selectedFilters));
348
+ window.location.reload();
349
+ // Emit data to the global service
350
+ // this.gs.dataRangeValue.next(this.selectedFilters);
351
+ // Trigger change detection to reflect UI changes
352
+ this.cd.detectChanges();
353
+ }
354
+ ranges = {
355
+ // Today: [dayjs(), dayjs()],
356
+ Yesterday: [dayjs().subtract(1, 'days'), dayjs().subtract(1, 'days')],
357
+ 'This Week': [dayjs().subtract(7, 'days'), dayjs().subtract(1, 'days')],
358
+ 'Last Week': [
359
+ dayjs().subtract(14, 'days').startOf('day'),
360
+ dayjs().subtract(8, 'days').endOf('day'),
361
+ ],
362
+ 'This Month': [dayjs().subtract(30, 'days'), dayjs().subtract(1, 'days')],
363
+ 'Last Month': [
364
+ dayjs().subtract(1, 'month').startOf('month'),
365
+ dayjs().subtract(1, 'month').endOf('month'),
366
+ ],
367
+ };
368
+ onStartDateChange(event) {
369
+ if (this.dayjs(event.startDate).isValid()) {
370
+ if (this.selectedClient?.traxDateRange === 90) {
371
+ this.isCustomDate = (m) => {
372
+ const isValidDate = m > this.dayjs() || m > this.dayjs(event.startDate.add(90, "days"));
373
+ return isValidDate ? "invalid-date" : false;
374
+ };
375
+ }
376
+ else {
377
+ this.isCustomDate = (m) => {
378
+ const isValidDate = m > this.dayjs() || m > this.dayjs(event.startDate.add(180, "days"));
379
+ return isValidDate ? "invalid-date" : false;
380
+ };
381
+ }
382
+ }
383
+ }
384
+ datechange(event) {
385
+ if (event && event.startDate && event.endDate) {
386
+ if (this.dayjs(event.startDate).isValid() &&
387
+ this.dayjs(event.endDate).isValid()) {
388
+ this.selectedDateRange.startDate = event.startDate;
389
+ this.selectedDateRange.endDate = event.endDate;
390
+ var datetime = {
391
+ startDate: this.dayjs(event.startDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
392
+ endDate: this.dayjs(event.endDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
393
+ };
394
+ this.selectedFilters.date = datetime;
395
+ localStorage.setItem("header-filters1", JSON.stringify(this.selectedFilters));
396
+ window.location.reload();
397
+ // this.gs.dataRangeValue.next(this.selectedFilters);
398
+ }
399
+ }
400
+ }
401
+ opendropdown(e) {
402
+ e.stopPropagation();
403
+ this.Opendropdown = !this.Opendropdown;
404
+ }
405
+ getLocations() {
406
+ const country = this.countries
407
+ .filter(country => country.checked)
408
+ .map(country => country.country);
409
+ // const headerFilters: any = JSON.parse(localStorage.getItem("header-filters1") || "{}");
410
+ let obj = {
411
+ clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId || '11',
412
+ country,
413
+ city: [],
414
+ group: [],
415
+ };
416
+ this.auth.getLocation(obj).subscribe({
417
+ next: (res) => {
418
+ let cityList = this.selectedFilters?.location?.filter((location) => location.checked).map((loc) => loc.city);
419
+ // Map the fetched locations with default unchecked state
420
+ this.locations = res?.data?.locationData.map((city) => ({
421
+ city: city.city,
422
+ // checked: cityList?.length ? cityList.includes(city.city) : true,
423
+ checked: cityList?.includes(city.city) ? true : false,
424
+ }));
425
+ // Sync the fetched locations with any stored checked values in localStorage
426
+ if (this.selectedFilters.location && Array.isArray(this.selectedFilters.location)) {
427
+ this.filteredLocations = this.locations.map(location => {
428
+ const matchedLocation = this.selectedFilters.location.find((loc) => loc.city === location.city);
429
+ return matchedLocation ? { ...location, checked: matchedLocation.checked } : location;
430
+ });
431
+ }
432
+ else {
433
+ this.filteredLocations = this.locations;
434
+ }
435
+ if (this.searchLocationText) {
436
+ this.filteredLocations = this.locations.filter((location) => location.city.toLowerCase().includes(this.searchLocationText.toLowerCase()));
437
+ }
438
+ const selectedLocations = this.locations.filter((location) => location.checked).map((location) => location.city);
439
+ if (selectedLocations.length > 0) {
440
+ setTimeout(() => {
441
+ this.getGroups();
442
+ this.getStore(); // Fetch stores based on selected groups
443
+ }, 1000);
444
+ }
445
+ if (!selectedLocations.length && country.length) {
446
+ this.getGroups();
447
+ }
448
+ },
449
+ error: (err) => {
450
+ console.error("Failed to fetch locations", err);
451
+ },
452
+ });
453
+ }
454
+ isAllLocationsSelected() {
455
+ return this.filteredLocations.every(location => location.checked);
456
+ }
457
+ selectedLocationsLabel() {
458
+ const selectedLocations = this.locationLabel = this.searchLocationText.length ? this.locations
459
+ .filter(location => location.checked).map(location => location.city) : this.filteredLocations
460
+ .filter(location => location.checked).map(location => location.city);
461
+ return selectedLocations.length === 0
462
+ ? ''
463
+ : selectedLocations.length === 1
464
+ ? selectedLocations[0]
465
+ : `${selectedLocations.length} Regions`;
466
+ }
467
+ removeLocation() {
468
+ this.Reset();
469
+ }
470
+ getGroups() {
471
+ const country = this.countries
472
+ .filter(country => country.checked)
473
+ .map(country => country.country);
474
+ let city;
475
+ city = this.locations
476
+ .filter(location => location.checked)
477
+ .map(location => location.city);
478
+ if (!city.length && country.length) {
479
+ city = this.locations.map((loc) => loc.city);
480
+ }
481
+ const obj = { country, city, clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId, group: [] };
482
+ this.auth.getGroups(obj).subscribe({
483
+ next: (res) => {
484
+ let checkedGroup = this.selectedFilters?.group?.filter((group) => group.checked).map((group) => group.groupName);
485
+ const combinedGroups = res?.data?.groupData?.map((groupName) => ({
486
+ groupName: groupName.groupName,
487
+ checked: checkedGroup?.includes(groupName.groupName) ? true : false,
488
+ // checked: checkedGroup?.length ? checkedGroup.includes(groupName.groupName) : true,
489
+ }));
490
+ this.groupsData = combinedGroups;
491
+ if (this.searchGroupText.length) {
492
+ this.filteredGroups = combinedGroups.filter((item) => item.groupName.toLowerCase().includes(this.searchGroupText));
493
+ }
494
+ else {
495
+ this.filteredGroups = combinedGroups;
496
+ }
497
+ // Auto-fetch stores when groups are selected
498
+ const selectedGroups = this.groupsData.filter((group) => group.checked).map((group) => group.groupName);
499
+ if (selectedGroups.length > 0) {
500
+ setTimeout(() => {
501
+ this.getStore(); // Fetch stores based on selected groups
502
+ }, 1000);
503
+ }
504
+ },
505
+ error: (err) => {
506
+ console.error("Failed to fetch groups", err);
507
+ },
508
+ });
509
+ }
510
+ toggleDropdown(type) {
511
+ if (this.dropdownOpen === type) {
512
+ // If the dropdown is open, close it and avoid resetting the selected values unnecessarily
513
+ this.dropdownOpen = null;
514
+ }
515
+ else {
516
+ // Open the specific dropdown and handle data fetching only if necessary
517
+ this.dropdownOpen = type;
518
+ if (type === 'country') {
519
+ // Fetch countries only if not already fetched and no search text exists
520
+ if ((!this.filteredCountries || this.filteredCountries.length === 0) && !this.searchCountryText.trim()) {
521
+ this.getCountry();
522
+ }
523
+ }
524
+ if (type === 'group') {
525
+ // Fetch groups only if there are selected cities and no active search text
526
+ const selectedCities = this.locations
527
+ .filter((location) => location.checked)
528
+ .map((location) => location.city);
529
+ // Fetch groups only if locations are selected, no search text exists, and dropdown is opened
530
+ if (this.filteredLocations.length > 0 || (selectedCities.length > 0 && !this.searchGroupText.trim())) {
531
+ this.getGroups();
532
+ }
533
+ else {
534
+ this.filteredGroups = []; // Clear groups if no locations are selected
535
+ }
536
+ }
537
+ if (type === 'store') {
538
+ // Fetch stores only if not already fetched and no search text is active
539
+ if ((!this.filteredStores || this.filteredStores.length === 0) && !this.searchStoreText.trim()) {
540
+ this.getStore();
541
+ }
542
+ }
543
+ }
544
+ }
545
+ handleGroupDropdownClick() {
546
+ if (this.dropdownOpen === 'group') {
547
+ this.resetSelectedGroups();
548
+ }
549
+ this.toggleDropdown('group');
550
+ }
551
+ resetSelectedGroups() {
552
+ this.filteredGroups.forEach((group) => (group.checked = false));
553
+ this.searchGroupText = "";
554
+ }
555
+ selectedGroupsLabel() {
556
+ const selectedGroups = this.groupLabel = this.searchGroupText.length ? this.groupsData.filter((group) => group.checked) : this.filteredGroups.filter((group) => group.checked);
557
+ return selectedGroups.length === 0
558
+ ? ""
559
+ : selectedGroups.length === 1
560
+ ? selectedGroups[0].groupName
561
+ : `${selectedGroups.length} Clusters`;
562
+ }
563
+ removeGroup() {
564
+ this.Reset();
565
+ }
566
+ isAllGroupsSelected() {
567
+ return this.filteredGroups.length ? this.filteredGroups.every((group) => group.checked) : false;
568
+ }
569
+ getStore() {
570
+ const country = this.countries
571
+ .filter(country => country.checked)
572
+ .map(country => country.country);
573
+ const city = this.locations
574
+ .filter(location => location.checked)
575
+ .map(location => location.city);
576
+ const group = this.groupsData
577
+ .filter(group => group.checked)
578
+ .map(group => group.groupName);
579
+ const data = {
580
+ country,
581
+ city,
582
+ clusters: group,
583
+ clientId: this.users.clientId || this.selectedFilters.client
584
+ };
585
+ this.auth.getHeaderStores(data).subscribe({
586
+ next: (res) => {
587
+ if (res && res.code === 200) {
588
+ // Initialize stores from API response
589
+ this.stores = this.zoneData;
590
+ // Check if there are previously selected stores
591
+ const checkedStoreIds = this.selectedFilters?.stores
592
+ ? this.selectedFilters.stores.filter((store) => store.checked).map((store) => store.storeId)
593
+ : [];
594
+ // Sync the `checked` state
595
+ this.stores.forEach(store => {
596
+ store.checked = checkedStoreIds.length
597
+ ? checkedStoreIds.includes(store.storeId) // Use previous selection
598
+ : true; // Default to true if no previous selection
599
+ });
600
+ // Apply search filter if search text is present
601
+ if (this.searchStoreText.length) {
602
+ this.filteredStores = this.stores.filter(store => store.storeName.toLowerCase().includes(this.searchStoreText.toLowerCase()));
603
+ }
604
+ else {
605
+ this.filteredStores = [...this.stores];
606
+ }
607
+ // Update `selectedFilters.stores` to reflect the current state
608
+ this.selectedFilters.stores = this.filteredStores.map(store => ({
609
+ storeId: store.storeId,
610
+ storeName: store.storeName,
611
+ checked: store.checked
612
+ }));
613
+ // this.selectedFilters.country = country;
614
+ // Save updated filters to localStorage
615
+ localStorage.setItem('header-filters1', JSON.stringify(this.selectedFilters));
616
+ // Trigger UI change detection
617
+ this.cd.detectChanges();
618
+ }
619
+ else {
620
+ // Handle empty or error response
621
+ this.clearStoresState();
622
+ }
623
+ },
624
+ error: (err) => {
625
+ console.error("Failed to fetch stores", err);
626
+ this.clearStoresState();
627
+ }
628
+ });
629
+ }
630
+ // Clear stores state and reset filters
631
+ clearStoresState() {
632
+ this.stores = [];
633
+ this.filteredStores = [];
634
+ this.selectedFilters.stores = [];
635
+ localStorage.setItem('header-filters1', JSON.stringify(this.selectedFilters));
636
+ }
637
+ resetSelectedStores() {
638
+ this.filteredStores.forEach((store) => (store.checked = false));
639
+ this.searchStoreText = "";
640
+ }
641
+ selectedStoresLabel() {
642
+ const selectedStores = this.searchStoreText.length ? this.stores.filter((store) => store.checked) : this.filteredStores.filter((store) => store.checked);
643
+ return selectedStores.length === 0
644
+ ? "0 Stores"
645
+ : selectedStores.length === 1
646
+ ? selectedStores[0].storeName
647
+ : `${selectedStores.length} Stores`;
648
+ }
649
+ isAllStoresSelected() {
650
+ return this.filteredStores.length > 0 && this.filteredStores.every(store => store.checked);
651
+ }
652
+ // Method to handle dropdown item selection
653
+ updateSelectedStores() {
654
+ this.filteredStores.forEach(store => {
655
+ const filteredStore = this.stores.findIndex(fStore => fStore.storeId === store.storeId);
656
+ if (filteredStore != -1) {
657
+ this.stores[filteredStore].checked = store.checked; // Sync the checked state with full store list
658
+ }
659
+ });
660
+ // Update selectedFilters based on the current store selection
661
+ this.selectedFilters.stores = this.stores.filter(store => store.checked);
662
+ // Update localStorage with the latest selection
663
+ localStorage.setItem('header-filters1', JSON.stringify(this.selectedFilters));
664
+ // Emit updated filters via service
665
+ // this.gs.dataRangeValue.next(this.selectedFilters);
666
+ // Trigger change detection if necessary
667
+ this.cd.detectChanges();
668
+ }
669
+ toggleSelectAllLocations(event) {
670
+ const isChecked = event.target.checked;
671
+ this.filteredLocations.forEach((location) => (location.checked = isChecked));
672
+ this.updateSelectedLocations();
673
+ }
674
+ toggleSelectAllStores(event) {
675
+ const checked = event.target.checked;
676
+ // Apply the selection to both filtered and full list of stores
677
+ this.filteredStores.forEach(store => store.checked = checked);
678
+ this.stores.forEach(store => {
679
+ const filteredStore = this.filteredStores.find(fStore => fStore.storeId === store.storeId);
680
+ if (filteredStore) {
681
+ store.checked = checked; // Sync the checked state with full store list
682
+ }
683
+ });
684
+ // Update the selected stores and persist the selection
685
+ this.updateSelectedStores();
686
+ }
687
+ updateSelectedLocations() {
688
+ // When locations are selected, fetch the related groups
689
+ const selectedCities = this.filteredLocations
690
+ .filter((location) => location.checked)
691
+ .map((location) => location.city);
692
+ this.filteredLocations.forEach((location) => {
693
+ let findLocationIndex = this.locations.findIndex((loc) => loc.city == location.city);
694
+ if (findLocationIndex != -1) {
695
+ this.locations[findLocationIndex].checked = location.checked;
696
+ }
697
+ });
698
+ if (selectedCities.length > 0 || !selectedCities.length) {
699
+ this.selectedFilters.stores = [];
700
+ this.groupsData = [];
701
+ this.getGroups(); // Fetch groups based on selected cities
702
+ // If there are selected groups, fetch the stores based on selected groups
703
+ this.getStore();
704
+ this.selectedFilters.location = this.locations;
705
+ }
706
+ else {
707
+ this.filteredGroups = []; // Clear groups if no locations are selected
708
+ this.selectedFilters.location = [];
709
+ }
710
+ this.selectedFilters.group = [];
711
+ this.filteredStores = []; // Reset stores as well
712
+ this.searchGroupText = '';
713
+ this.searchStoreText = '';
714
+ // this.Opendropdown = false;
715
+ }
716
+ toggleSelectAllGroups(event) {
717
+ const isChecked = event.target.checked;
718
+ this.filteredGroups.forEach((group) => (group.checked = isChecked));
719
+ this.updateSelectedGroups();
720
+ }
721
+ updateSelectedGroups() {
722
+ // Fetch the relevant stores after groups are selected
723
+ const selectedGroups = this.filteredGroups
724
+ .filter((group) => group.checked)
725
+ .map((group) => group.groupName);
726
+ this.filteredGroups.forEach((group) => {
727
+ let findGroupIndex = this.groupsData.findIndex((item) => item.groupName == group.groupName);
728
+ if (findGroupIndex != -1) {
729
+ this.groupsData[findGroupIndex].checked = group.checked;
730
+ }
731
+ });
732
+ if (selectedGroups.length > 0 || !selectedGroups.length) {
733
+ this.selectedFilters.stores = [];
734
+ // If there are selected groups, fetch the stores based on selected groups
735
+ this.getStore();
736
+ this.selectedFilters.group = this.groupsData;
737
+ }
738
+ else {
739
+ // If no groups are selected, clear the stores list
740
+ this.filteredStores = [];
741
+ // Also, update localStorage to reflect the cleared store selection
742
+ this.selectedFilters.stores = [];
743
+ localStorage.setItem('header-filters1', JSON.stringify(this.selectedFilters));
744
+ // Emit data via service
745
+ // this.gs.dataRangeValue.next(this.selectedFilters);
746
+ }
747
+ // Clear the search store text when groups are updated
748
+ this.searchStoreText = '';
749
+ }
750
+ Reset() {
751
+ setTimeout(() => {
752
+ // Clear selected groups, stores, and locations
753
+ this.filteredCountries = [];
754
+ this.filteredGroups = [];
755
+ this.filteredStores = [];
756
+ this.filteredLocations = []; // Reset locations as well
757
+ this.locations = [];
758
+ this.groupsData = [];
759
+ this.stores = [];
760
+ this.countries = [];
761
+ // Clear search input fields
762
+ this.searchLocationText = "";
763
+ this.searchGroupText = "";
764
+ this.searchStoreText = "";
765
+ this.selectedFilters.stores = [];
766
+ this.selectedFilters.group = [];
767
+ this.selectedFilters.location = [];
768
+ this.selectedFilters.country = [];
769
+ // Fetch locations, groups, and stores again
770
+ this.getCountry();
771
+ this.getLocations();
772
+ this.getStore();
773
+ this.getGroups();
774
+ // Reset the filters in selectedFilters
775
+ // // Once stores are fetched, mark all as checked
776
+ // setTimeout(() => {
777
+ // this.filteredStores = this.stores.map(store => ({
778
+ // ...store,
779
+ // checked: true // Mark all stores as checked
780
+ // }));
781
+ // // Sync selectedFilters with the updated store state
782
+ // this.selectedFilters.stores = this.filteredStores.map(store => ({
783
+ // ...store,
784
+ // checked: true
785
+ // }));
786
+ // Update localStorage with the latest selectedFilters
787
+ localStorage.setItem('header-filters1', JSON.stringify(this.selectedFilters));
788
+ window.location.reload();
789
+ // Emit the reset filters to update other components if needed
790
+ // this.gs.dataRangeValue.next(this.selectedFilters);
791
+ // Trigger change detection
792
+ this.cd.detectChanges();
793
+ // Adding a slight delay to ensure stores are fetched first
794
+ // Close dropdown after reset if necessary
795
+ this.Opendropdown = false;
796
+ }, 100);
797
+ }
798
+ filterLocations() {
799
+ const searchText = this.searchLocationText.toLowerCase();
800
+ if (searchText) {
801
+ // Preserve the checked state during filtering
802
+ this.filteredLocations = this.locations
803
+ .map(location => ({
804
+ ...location,
805
+ checked: this.filteredLocations.find(l => l.city === location.city)?.checked || false
806
+ }))
807
+ .filter(location => location?.city?.toLowerCase().includes(searchText));
808
+ }
809
+ else {
810
+ // Restore the original checked state when search text is cleared
811
+ this.filteredLocations = this.locations.map(location => ({
812
+ ...location,
813
+ checked: this.selectedFilters.location.find((l) => l.city === location.city)?.checked || false
814
+ }));
815
+ }
816
+ }
817
+ filterGroups() {
818
+ const searchText = this.searchGroupText.toLowerCase();
819
+ if (searchText) {
820
+ // Preserve the checked state during filtering
821
+ this.filteredGroups = this.groupsData
822
+ .map(group => ({
823
+ ...group,
824
+ checked: this.filteredGroups.find(g => g.groupName === group.groupName)?.checked || false
825
+ }))
826
+ .filter(group => group?.groupName?.toLowerCase().includes(searchText));
827
+ }
828
+ else {
829
+ // Restore the original checked state when search text is cleared
830
+ this.filteredGroups = this.groupsData.map(group => ({
831
+ ...group,
832
+ checked: this.selectedFilters.group.find((g) => g.groupName === group.groupName)?.checked || false
833
+ }));
834
+ }
835
+ }
836
+ filterStores() {
837
+ const searchText = this.searchStoreText.toLowerCase();
838
+ // Preserve checked states during filtering
839
+ if (searchText) {
840
+ // Filter based on search text while preserving checked state
841
+ this.filteredStores = this.stores
842
+ .map(store => ({
843
+ ...store,
844
+ // Check if the store is already checked in filteredStores, fallback to original stores' checked state
845
+ checked: this.selectedFilters.stores.find((s) => s.storeId === store.storeId)?.checked || store.checked || false
846
+ }))
847
+ .filter(store => store.storeName.toLowerCase().includes(searchText));
848
+ }
849
+ else {
850
+ // When the search text is cleared, restore the original list with preserved checked states
851
+ this.filteredStores = this.stores.map(store => ({
852
+ ...store,
853
+ // Preserve the checked state based on the selected filters
854
+ checked: this.selectedFilters.stores.find((s) => s.storeId === store.storeId)?.checked || store.checked || false
855
+ }));
856
+ }
857
+ }
858
+ closeDropdown() {
859
+ this.dropdownOpen = null;
860
+ }
861
+ clickOutside(event) {
862
+ const clickedInside = event.target.closest(".dropdown-container");
863
+ const clickedoutSide = event.target.closest(".dropdown2");
864
+ if (!clickedInside) {
865
+ this.closeDropdown();
866
+ }
867
+ if (!clickedoutSide) {
868
+ this.closeDropdown1();
869
+ }
870
+ }
871
+ // getCountry(): void {
872
+ // // const headerFilters: any = JSON.parse(localStorage.getItem("header-filters1") || "{}");
873
+ // let obj ={
874
+ // clientId: this.selectedFilters.client ? this.selectedFilters.client :this.users.clientId,
875
+ // }
876
+ // this.auth.getCountry(obj).subscribe({
877
+ // next: (res: any) => {
878
+ // let countryList = this.selectedFilters?.country?.filter((country:any) => country.checked).map((loc:any) => loc.allCountry);
879
+ // // Map the fetched countries with default unchecked state
880
+ // this.countires = res?.data?.countryData.map((allCountry: any) => ({
881
+ // allCountry: allCountry.allCountry,
882
+ // checked: countryList?.includes(allCountry.allCountry) ? true : false,
883
+ // }));
884
+ // // Sync the fetched countries with any stored checked values in localStorage
885
+ // if (this.selectedFilters.country && Array.isArray(this.selectedFilters.country)) {
886
+ // this.filteredCountries = this.countries.map(country => {
887
+ // const matchedLocation = this.selectedFilters.country.find((loc: any) => loc.allCountry === country.allCountry);
888
+ // return matchedLocation ? { ...country, checked: matchedLocation.checked } : country;
889
+ // });
890
+ // } else {
891
+ // this.filteredCountries = this.countries;
892
+ // }
893
+ // if(this.searchLocationText) {
894
+ // this.filteredCountries = this.countries.filter((country:any) => country.city.toLowerCase().includes(this.searchLocationText.toLowerCase()))
895
+ // }
896
+ // const selectedCountries = this.countries.filter((country) => country.checked).map((country) => country.allCountry);
897
+ // if (selectedCountries.length > 0) {
898
+ // setTimeout(()=>{
899
+ // this.getStore(); // Fetch stores based on selected groups
900
+ // },1000)
901
+ // }
902
+ // },
903
+ // error: (err) => {
904
+ // console.error("Failed to fetch countries", err);
905
+ // },
906
+ // });
907
+ // }
908
+ // selectedCountriesLabel(): string {
909
+ // const selectedCountries = this.countryLabel = this.searchLocationText.length ? this.countries
910
+ // .filter(country => country.checked).map(country => country.allCountry) : this.filteredCountries
911
+ // .filter(country => country.checked).map(country => country.allCountry);
912
+ // return selectedCountries.length === 0
913
+ // ? ''
914
+ // : selectedCountries.length === 1
915
+ // ? selectedCountries[0]
916
+ // : `${selectedCountries.length} countries`;
917
+ // }
918
+ // isAllCountriesSelected(): boolean {
919
+ // return this.filteredCountries.every(country => country.checked);
920
+ // }
921
+ // filterCountries(): void {
922
+ // const searchText = this.searchCountryText.toLowerCase();
923
+ // if (searchText) {
924
+ // // Preserve the checked state during filtering
925
+ // this.filteredCountries = this.countires
926
+ // .map(country => ({
927
+ // ...country,
928
+ // checked: this.filteredCountries.find(l => l.allCountry === country.allCountry)?.checked || false
929
+ // }))
930
+ // .filter(location =>
931
+ // location?.allCountry?.toLowerCase().includes(searchText)
932
+ // );
933
+ // } else {
934
+ // // Restore the original checked state when search text is cleared
935
+ // this.filteredCountries = this.countires.map(country => ({
936
+ // ...country,
937
+ // checked: this.selectedFilters.country.find((l:any) => l.allCountry === country.allCountry)?.checked || false
938
+ // }));
939
+ // }
940
+ // }
941
+ getCountry() {
942
+ let obj = {
943
+ clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId,
944
+ };
945
+ this.auth.getCountry(obj).subscribe({
946
+ next: (res) => {
947
+ // Extract selected countries from existing filters (if any)
948
+ let countryList = this.selectedFilters?.country?.filter((country) => country.checked).map((loc) => loc.country);
949
+ // Map API response to frontend model
950
+ this.countries = res?.data?.countryData.map((item) => ({
951
+ country: item.country,
952
+ // checked: countryList?.length ? countryList.includes(item.country) : true,
953
+ // checked: cityList?.length ? cityList.includes(city.city) : true,
954
+ checked: countryList?.includes(item.country) ? true : false,
955
+ }));
956
+ if (this.selectedFilters.country && Array.isArray(this.selectedFilters.country)) {
957
+ this.filteredCountries = this.countries.map(location => {
958
+ const matchedLocation = this.selectedFilters.country.find((loc) => loc.country === location.country);
959
+ return matchedLocation ? { ...location, checked: matchedLocation.checked } : location;
960
+ });
961
+ }
962
+ else {
963
+ this.filteredCountries = this.countries;
964
+ }
965
+ // Initially, all countries are visible
966
+ this.filteredCountries = [...this.countries];
967
+ // If a search text already exists, filter immediately
968
+ if (this.searchCountryText) {
969
+ this.filterCountries();
970
+ }
971
+ // Fetch stores if at least one country is selected
972
+ let selectedCountries = this.countries.filter((country) => country.checked);
973
+ if (selectedCountries.length > 0) {
974
+ setTimeout(() => {
975
+ this.getLocations();
976
+ this.getStore(); // fetch stores
977
+ }, 1000);
978
+ }
979
+ },
980
+ error: (err) => {
981
+ console.error("Failed to fetch countries", err);
982
+ },
983
+ });
984
+ }
985
+ selectedCountriesLabel() {
986
+ const selectedCountries = this.searchCountryText.length
987
+ ? this.filteredCountries.filter(country => country.checked).map(country => country.country)
988
+ : this.countries.filter(country => country.checked).map(country => country.country);
989
+ return selectedCountries.length === 0
990
+ ? ''
991
+ : selectedCountries.length === 1
992
+ ? selectedCountries[0]
993
+ : `${selectedCountries.length} countries`;
994
+ }
995
+ filterCountries() {
996
+ const searchText = this.searchCountryText.toLowerCase();
997
+ if (searchText) {
998
+ // Filter and preserve checked state
999
+ this.filteredCountries = this.countries
1000
+ .map(country => ({
1001
+ ...country,
1002
+ checked: this.filteredCountries.find(c => c.country === country.country)?.checked || false
1003
+ }))
1004
+ .filter(country => country.country.toLowerCase().includes(searchText));
1005
+ }
1006
+ else {
1007
+ // Reset to full list
1008
+ this.filteredCountries = this.countries.map((country) => ({
1009
+ ...country,
1010
+ checked: this.selectedFilters.country?.find((c) => c.country === country.country)?.checked || false
1011
+ }));
1012
+ }
1013
+ }
1014
+ isAllCountriesSelected() {
1015
+ return this.filteredCountries.length > 0 && this.filteredCountries.every(country => country.checked);
1016
+ }
1017
+ toggleSelectAllCountries(event) {
1018
+ const isChecked = event.target.checked;
1019
+ this.filteredCountries.forEach((country) => (country.checked = isChecked));
1020
+ this.updateSelectedCountries();
1021
+ }
1022
+ updateSelectedCountries() {
1023
+ // When locations are selected, fetch the related groups
1024
+ const selectedCountries = this.filteredCountries
1025
+ .filter((country) => country.checked)
1026
+ .map((country) => country.country);
1027
+ this.filteredCountries.forEach((country) => {
1028
+ let findCountryIndex = this.countries.findIndex((loc) => loc.country == country.country);
1029
+ if (findCountryIndex != -1) {
1030
+ this.countries[findCountryIndex].checked = country.checked;
1031
+ }
1032
+ });
1033
+ if (selectedCountries.length > 0 || !selectedCountries.length) {
1034
+ this.selectedFilters.stores = [];
1035
+ this.groupsData = [];
1036
+ this.locations = [];
1037
+ this.getLocations();
1038
+ this.getGroups(); // Fetch groups based on selected cities
1039
+ // If there are selected groups, fetch the stores based on selected groups
1040
+ this.getStore();
1041
+ this.selectedFilters.country = this.filteredCountries;
1042
+ }
1043
+ else {
1044
+ this.filteredGroups = []; // Clear groups if no locations are selected
1045
+ this.selectedFilters.country = [];
1046
+ }
1047
+ this.selectedFilters.group = [];
1048
+ this.filteredStores = []; // Reset stores as well
1049
+ this.searchGroupText = '';
1050
+ this.searchStoreText = '';
1051
+ // this.Opendropdown = false;
1052
+ }
1053
+ removeCountry() {
1054
+ this.Reset();
1055
+ }
1056
+ Apply() {
1057
+ // Close the dropdown
1058
+ this.Opendropdown = false;
1059
+ // Fetch existing filters from localStorage
1060
+ const headerFilters = JSON.parse(localStorage.getItem("header-filters1") || "{}");
1061
+ this.selectedFilters.store = null;
1062
+ // Ensure current selections are reflected
1063
+ this.selectedFilters.country = this.filteredCountries;
1064
+ this.selectedFilters.location = this.locations;
1065
+ this.selectedFilters.group = this.groupsData;
1066
+ this.selectedFilters.stores = headerFilters.stores ? headerFilters.stores : this.stores;
1067
+ // Store updated filters back in localStorage
1068
+ localStorage.setItem("header-filters1", JSON.stringify(this.selectedFilters));
1069
+ // this.gs.dataRangeValue.next(this.selectedFilters);
1070
+ window.location.reload();
1071
+ // Emit the updated filters via the service
1072
+ // this.gs.dataRangeValue.next(this.selectedFilters);
1073
+ // Trigger refresh if necessary
1074
+ // this.gs.manageRefreshTrigger.next(true);
1075
+ this.cd.detectChanges();
1076
+ }
1077
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ZoneHeaderComponent, deps: [{ token: i1.AuthService }, { token: i2.Router }, { token: i3.GlobalStateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1078
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ZoneHeaderComponent, selector: "lib-zone-header", host: { listeners: { "document:click": "clickOutside($event)" } }, ngImport: i0, template: "<div class=\"\">\r\n <label *ngIf=\"selectedCountriesLabel()\" class=\"badge badge-light-default mx-2\">{{selectedCountriesLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeCountry()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedLocationsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedLocationsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeLocation()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedGroupsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedGroupsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeGroup()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label class=\"badge badge-light-default\">{{selectedStoresLabel()}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"wrapper me-3\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n<lib-select [items]=\"clientList\" [multi]=\"false\" [searchField]=\"'clientName'\" [disabled]=\"false\" [idField]=\"'clientId'\"\r\n(selected)=\"onClientSelect($event)\" [selectedValues]=\"[selectedClient]\"></lib-select>\r\n</div>\r\n<!-- <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput\r\n ngxDaterangepickerMd [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [autoApply]=\"true\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\" autocomplete=\"off\"\r\n [(ngModel)]=\"selectedDateRange\" (startDateChanged)=\"onStartDateChange($event)\" [isCustomDate]=\"isCustomDate\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" [readonly]=\"true\" />\r\n</div> -->\r\n<div class=\"position-relative\">\r\n <button type=\"button\" (click)=\"opendropdown($event)\" class=\"btn btn-default mx-2 rounded-3 text-nowrap border-val\">\r\n <!-- <span class=\"me-2\">Filter</span> -->\r\n <svg class=\"pl-3\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <div *ngIf=\"Opendropdown\" class=\"card p-5 dropdown2 position-absolute z-1 end-0\" style=\"z-index: 1 !important;\" (clickOutside)=\"closeDropdown1()\">\r\n <div class=\"dropdown-title d-flex justify-content-between mb-2\">Filter Options\r\n <button class=\"btn btn-outline w-25 ms-3 btn-resize\" (click)=\"Reset()\"> Reset </button>\r\n <button class=\"btn btn-primary w-25 btn-resize\" (click)=\"Apply()\">Apply</button>\r\n </div>\r\n\r\n <!-- Country Dropdown -->\r\n<div class=\"dropdown-container\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('country')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedCountriesLabel()\"\r\n readonly\r\n placeholder=\"Select country\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'country'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search country\" \r\n [(ngModel)]=\"searchCountryText\" \r\n (ngModelChange)=\"filterCountries()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllCountries\" \r\n [checked]=\"isAllCountriesSelected()\" \r\n (change)=\"toggleSelectAllCountries($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllCountries\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let country of filteredCountries\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"country.country\" \r\n [(ngModel)]=\"country.checked\"\r\n (change)=\"updateSelectedCountries()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"country.country\">\r\n {{ country.country }}\r\n </label>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n\r\n <!-- Location Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('location')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedLocationsLabel()\"\r\n readonly\r\n placeholder=\"Select Region\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'location'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search Region\" \r\n [(ngModel)]=\"searchLocationText\" \r\n (ngModelChange)=\"filterLocations()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllLocations\" \r\n [checked]=\"isAllLocationsSelected()\" \r\n (change)=\"toggleSelectAllLocations($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllLocations\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let location of filteredLocations\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"location.city\" \r\n [(ngModel)]=\"location.checked\"\r\n (change)=\"updateSelectedLocations()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"location.city\">\r\n {{ location.city }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Group Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('group')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedGroupsLabel()\" readonly\r\n placeholder=\"Select clusters\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'group'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search clusters\" \r\n [(ngModel)]=\"searchGroupText\" \r\n (ngModelChange)=\"filterGroups()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllGroups\" \r\n [checked]=\"isAllGroupsSelected()\" \r\n (change)=\"toggleSelectAllGroups($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllGroups\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let group of filteredGroups\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"group.groupName\"\r\n [(ngModel)]=\"group.checked\"\r\n (change)=\"updateSelectedGroups()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"group.groupName\">\r\n {{ group.groupName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- Store Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('store')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\"\r\n [value]=\"selectedStoresLabel()\"\r\n readonly\r\n placeholder=\"Select stores\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'store'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search \" \r\n placeholder=\"Search stores\" \r\n [(ngModel)]=\"searchStoreText\" \r\n (ngModelChange)=\"filterStores()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllStores\" \r\n [checked]=\"isAllStoresSelected()\" \r\n (change)=\"toggleSelectAllStores($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllStores\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let store of filteredStores\"\r\n >\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n [id]=\"store.storeId\"\r\n [(ngModel)]=\"store.checked\"\r\n (change)=\"updateSelectedStores()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"store.storeId\">\r\n {{ store.storeName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n</div>", styles: [".daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker td.available.today{pointer-events:none;text-decoration:line-through;color:#a9a9a9}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}.wrapper{min-width:200px}.btn-primary{line-height:18px!important}.filter-label{color:var(--Gray-500, #667085)!important;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.position-relative{position:relative}.filter-icon{cursor:pointer}.dropdown-container{position:relative;display:inline-block;width:100%}.dropdown-header{cursor:pointer;width:100%}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize;width:100%;box-sizing:border-box}.dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;max-height:230px;overflow-y:auto;display:block;box-sizing:border-box;padding:10px 5px}.dropdown-item{padding:6px 0}.dropdown-item:hover{background-color:#f1f1f1}.dropdown-item input[type=checkbox]{margin-right:10px}.custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.custom-dropdown-item{display:flex;align-items:center}.custom-dropdown-item input{margin-left:10px}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:3px!important}.dropdown2{position:absolute;top:70px;min-width:270px!important}.dropdown2 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown2 .dropdown{position:relative;display:inline-block}.dropdown2 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px;font-style:normal;font-weight:500;line-height:20px}input[type=checkbox]{width:16px!important;height:16px!important;margin:0 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.CustomSelectComponent, selector: "lib-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
1079
+ }
1080
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ZoneHeaderComponent, decorators: [{
1081
+ type: Component,
1082
+ args: [{ selector: 'lib-zone-header', template: "<div class=\"\">\r\n <label *ngIf=\"selectedCountriesLabel()\" class=\"badge badge-light-default mx-2\">{{selectedCountriesLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeCountry()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedLocationsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedLocationsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeLocation()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedGroupsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedGroupsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeGroup()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label class=\"badge badge-light-default\">{{selectedStoresLabel()}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"wrapper me-3\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n<lib-select [items]=\"clientList\" [multi]=\"false\" [searchField]=\"'clientName'\" [disabled]=\"false\" [idField]=\"'clientId'\"\r\n(selected)=\"onClientSelect($event)\" [selectedValues]=\"[selectedClient]\"></lib-select>\r\n</div>\r\n<!-- <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput\r\n ngxDaterangepickerMd [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [autoApply]=\"true\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\" autocomplete=\"off\"\r\n [(ngModel)]=\"selectedDateRange\" (startDateChanged)=\"onStartDateChange($event)\" [isCustomDate]=\"isCustomDate\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" [readonly]=\"true\" />\r\n</div> -->\r\n<div class=\"position-relative\">\r\n <button type=\"button\" (click)=\"opendropdown($event)\" class=\"btn btn-default mx-2 rounded-3 text-nowrap border-val\">\r\n <!-- <span class=\"me-2\">Filter</span> -->\r\n <svg class=\"pl-3\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <div *ngIf=\"Opendropdown\" class=\"card p-5 dropdown2 position-absolute z-1 end-0\" style=\"z-index: 1 !important;\" (clickOutside)=\"closeDropdown1()\">\r\n <div class=\"dropdown-title d-flex justify-content-between mb-2\">Filter Options\r\n <button class=\"btn btn-outline w-25 ms-3 btn-resize\" (click)=\"Reset()\"> Reset </button>\r\n <button class=\"btn btn-primary w-25 btn-resize\" (click)=\"Apply()\">Apply</button>\r\n </div>\r\n\r\n <!-- Country Dropdown -->\r\n<div class=\"dropdown-container\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('country')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedCountriesLabel()\"\r\n readonly\r\n placeholder=\"Select country\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'country'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search country\" \r\n [(ngModel)]=\"searchCountryText\" \r\n (ngModelChange)=\"filterCountries()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllCountries\" \r\n [checked]=\"isAllCountriesSelected()\" \r\n (change)=\"toggleSelectAllCountries($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllCountries\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let country of filteredCountries\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"country.country\" \r\n [(ngModel)]=\"country.checked\"\r\n (change)=\"updateSelectedCountries()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"country.country\">\r\n {{ country.country }}\r\n </label>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n\r\n <!-- Location Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('location')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedLocationsLabel()\"\r\n readonly\r\n placeholder=\"Select Region\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'location'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search Region\" \r\n [(ngModel)]=\"searchLocationText\" \r\n (ngModelChange)=\"filterLocations()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllLocations\" \r\n [checked]=\"isAllLocationsSelected()\" \r\n (change)=\"toggleSelectAllLocations($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllLocations\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let location of filteredLocations\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"location.city\" \r\n [(ngModel)]=\"location.checked\"\r\n (change)=\"updateSelectedLocations()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"location.city\">\r\n {{ location.city }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Group Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('group')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedGroupsLabel()\" readonly\r\n placeholder=\"Select clusters\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'group'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search clusters\" \r\n [(ngModel)]=\"searchGroupText\" \r\n (ngModelChange)=\"filterGroups()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllGroups\" \r\n [checked]=\"isAllGroupsSelected()\" \r\n (change)=\"toggleSelectAllGroups($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllGroups\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let group of filteredGroups\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"group.groupName\"\r\n [(ngModel)]=\"group.checked\"\r\n (change)=\"updateSelectedGroups()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"group.groupName\">\r\n {{ group.groupName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- Store Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('store')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\"\r\n [value]=\"selectedStoresLabel()\"\r\n readonly\r\n placeholder=\"Select stores\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'store'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search \" \r\n placeholder=\"Search stores\" \r\n [(ngModel)]=\"searchStoreText\" \r\n (ngModelChange)=\"filterStores()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllStores\" \r\n [checked]=\"isAllStoresSelected()\" \r\n (change)=\"toggleSelectAllStores($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllStores\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let store of filteredStores\"\r\n >\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n [id]=\"store.storeId\"\r\n [(ngModel)]=\"store.checked\"\r\n (change)=\"updateSelectedStores()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"store.storeId\">\r\n {{ store.storeName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n</div>", styles: [".daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker td.available.today{pointer-events:none;text-decoration:line-through;color:#a9a9a9}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}.wrapper{min-width:200px}.btn-primary{line-height:18px!important}.filter-label{color:var(--Gray-500, #667085)!important;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.position-relative{position:relative}.filter-icon{cursor:pointer}.dropdown-container{position:relative;display:inline-block;width:100%}.dropdown-header{cursor:pointer;width:100%}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize;width:100%;box-sizing:border-box}.dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;max-height:230px;overflow-y:auto;display:block;box-sizing:border-box;padding:10px 5px}.dropdown-item{padding:6px 0}.dropdown-item:hover{background-color:#f1f1f1}.dropdown-item input[type=checkbox]{margin-right:10px}.custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.custom-dropdown-item{display:flex;align-items:center}.custom-dropdown-item input{margin-left:10px}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:3px!important}.dropdown2{position:absolute;top:70px;min-width:270px!important}.dropdown2 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown2 .dropdown{position:relative;display:inline-block}.dropdown2 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px;font-style:normal;font-weight:500;line-height:20px}input[type=checkbox]{width:16px!important;height:16px!important;margin:0 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}\n"] }]
1083
+ }], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.Router }, { type: i3.GlobalStateService }, { type: i0.ChangeDetectorRef }], propDecorators: { onClick: [{
1084
+ type: HostListener,
1085
+ args: ['document:click', ['$event']]
1086
+ }], clickOutside: [{
1087
+ type: HostListener,
1088
+ args: ["document:click", ["$event"]]
1089
+ }] } });
1090
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9uZS1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYXBwLXNoYXJlZC9zcmMvbGliL21vZHVsZXMvbGF5b3V0L3Rvb2xiYXIvem9uZS1oZWFkZXIvem9uZS1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYXBwLXNoYXJlZC9zcmMvbGliL21vZHVsZXMvbGF5b3V0L3Rvb2xiYXIvem9uZS1oZWFkZXIvem9uZS1oZWFkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8saUJBQWlCLENBQUM7Ozs7Ozs7O0FBVXpCLE1BQU0sT0FBTyxtQkFBbUI7SUE0Q3BCO0lBQThCO0lBQy9CO0lBQ0M7SUE3Q1osS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNkLFlBQVksR0FBRyxDQUFDLENBQWMsRUFBRSxFQUFFO1FBQ2hDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDakMsT0FBTyxjQUFjLENBQUMsQ0FBQyxnQkFBZ0I7U0FDeEM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztJQUVBLGlCQUFpQixHQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDO1FBQ2hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFFLENBQUM7SUFDekMsZUFBZSxHQUFRO1FBQ3JCLE1BQU0sRUFBRSxJQUFJO1FBQ1osVUFBVSxF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LElBQUksQ0FBQyxTQUFTLENBQUM7UUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3hGLDZDQUE2QztRQUM3QyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDOUUscURBQXFEO1FBQ3JELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDeEIsMkNBQTJDO1FBQzNDLHFEQUFxRDtRQUNyRCwrQkFBK0I7UUFDL0IsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUIsQ0FBQzt3R0FsckNVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLDBIQ2pCaEMseWtZQWtRTTs7NEZEalBPLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7c0tBc0QzQixPQUFPO3NCQUROLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMDRCMUMsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIE9uSW5pdCxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgZGF5anMgZnJvbSBcImRheWpzXCI7XHJcbmltcG9ydCBcImRheWpzL2xvY2FsZS9lblwiO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItem9uZS1oZWFkZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi96b25lLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3pvbmUtaGVhZGVyLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgWm9uZUhlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbmRheWpzID0gZGF5anM7XHJcbmlzQ3VzdG9tRGF0ZSA9IChtOiBkYXlqcy5EYXlqcykgPT4ge1xyXG4gIGlmIChtLmlzU2FtZSh0aGlzLmRheWpzKCksIFwiZGF5XCIpKSB7XHJcbiAgICByZXR1cm4gXCJpbnZhbGlkLWRhdGVcIjsgLy8gZGlzYWJsZSB0b2RheVxyXG4gIH1cclxuICByZXR1cm4gZmFsc2U7XHJcbn07XHJcblxyXG4gIHNlbGVjdGVkRGF0ZVJhbmdlOiBhbnkgPSB7IHN0YXJ0RGF0ZTogZGF5anMoKS5zdWJ0cmFjdCgzMCwgJ2RheXMnKSxcclxuICAgIGVuZERhdGU6IGRheWpzKCkuc3VidHJhY3QoMSwgXCJkYXlzXCIpLH07XHJcbiAgc2VsZWN0ZWRGaWx0ZXJzOiBhbnkgPSB7XHJcbiAgICBjbGllbnQ6IG51bGwsXHJcbiAgICBjbGllbnROYW1lOiBudWxsLFxyXG4gICAgY2xpZW50czogW10sXHJcbiAgICBzdG9yZTogbnVsbCxcclxuICAgIHN0b3JlczogW10sXHJcbiAgICBkYXRlOiBudWxsLFxyXG4gICAgZ3JvdXA6IFtdLFxyXG4gICAgbG9jYXRpb246IFtdLFxyXG4gICAgY291bnRyeTogW10sXHJcbiAgfTtcclxuICBPcGVuZHJvcGRvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkcm9wZG93bk9wZW46IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyAnbG9jYXRpb24nIG9yICdncm91cCdcclxuICBzZWFyY2hMb2NhdGlvblRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgc2VhcmNoR3JvdXBUZXh0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIGxvY2F0aW9uczogYW55W10gPSBbXTtcclxuICBmaWx0ZXJlZExvY2F0aW9uczogYW55W10gPSBbXTtcclxuICBncm91cHNEYXRhOiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkR3JvdXBzOiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkU3RvcmVzOiBhbnlbXSA9IFtdO1xyXG4gIHN0b3JlczphbnlbXSA9IFtdXHJcbiAgc2VhcmNoU3RvcmVUZXh0OnN0cmluZyA9ICcnO1xyXG4gIGNsaWVudExpc3Q6YW55ID0gW11cclxuICBzZWxlY3RlZENsaWVudDphbnlcclxuICBsb2NhdGlvbkxhYmVsOiBhbnlbXT1bXTtcclxuICBncm91cExhYmVsOiBhbnlbXT1bXTtcclxuICB1c2VyczogYW55O1xyXG4gIHVybDogYW55O1xyXG4gIGZpbHRlcmVkQ291bnRyaWVzOiBhbnlbXSA9IFtdO1xyXG4gIGNvdW50cnlMYWJlbDogYW55W109W107XHJcbiAgc2VhcmNoQ291bnRyeVRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgY291bnRyaWVzOiBhbnlbXSA9IFtdO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSwgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHB1YmxpYyBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgKSB7fVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGljayAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmKCF0YXJnZXQuY2xvc2VzdCgnLmRyb3Bkb3duMicpKSB7XHJcbiAgICAgIHRoaXMuT3BlbmRyb3Bkb3duID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNsb3NlRHJvcGRvd24xKCl7XHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgem9uZURhdGEgPVtcclxuICAgIHtcclxuICAgICAgICBcInN0b3JlSWRcIjogXCIxMS0xNTc4XCIsXHJcbiAgICAgICAgXCJzdG9yZU5hbWVcIjogXCJMS1NUMTc1N1wiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIFwic3RvcmVJZFwiOiBcIjExLTE5MTlcIixcclxuICAgICAgICBcInN0b3JlTmFtZVwiOiBcIkxLU1QyMzI5XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzdG9yZUlkXCI6IFwiMTEtMjIyMlwiLFxyXG4gICAgICAgIFwic3RvcmVOYW1lXCI6IFwiTEtTVDI1NTRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBcInN0b3JlSWRcIjogXCIxMS0yMzkxXCIsXHJcbiAgICAgICAgXCJzdG9yZU5hbWVcIjogXCJMS1NUMjU5OFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIFwic3RvcmVJZFwiOiBcIjExLTM3NlwiLFxyXG4gICAgICAgIFwic3RvcmVOYW1lXCI6IFwiTEtTVDY0NlwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIFwic3RvcmVJZFwiOiBcIjExLTgyXCIsXHJcbiAgICAgICAgXCJzdG9yZU5hbWVcIjogXCJMS1NUODRcIlxyXG4gICAgfVxyXG5dXHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gdGhpcy5zZXRSYW5nZXNCYXNlZE9uUm91dGUoKTtcclxuXHJcbiAgICAvLyBMaXN0ZW4gZm9yIHJvdXRlIGNoYW5nZXMgdG8gdXBkYXRlIHJhbmdlc1xyXG4gICAgLy8gdGhpcy5yb3V0ZXI/LmV2ZW50cz8uc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgLy8gICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XHJcbiAgICAvLyAgICAgdGhpcy5zZXRSYW5nZXNCYXNlZE9uUm91dGUoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgICB0aGlzLnVybCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIj9cIilbMF0uc3BsaXQoJy8nKTtcclxuICAgIGNvbnN0IHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSBhcyBzdHJpbmcpO1xyXG4gICAgdGhpcy51c2VycyA9IHVzZXI7XHJcbiAgICB0aGlzLmdzPy5tYW5hZ2VSZWZyZXNoVHJpZ2dlcj8uc3Vic2NyaWJlKChlKSA9PiB7ICAgICAgXHJcbiAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgaWYgKHVzZXIudXNlclR5cGUgPT09ICd0YW5nbycpIHtcclxuICAgICAgICB0aGlzLmdldENsaWVudCgpO1xyXG4gICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgIGNvbnN0IHN0b3JlZEZpbHRlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpO1xyXG4gICAgICAgICAgaWYgKHN0b3JlZEZpbHRlcnMpIHtcclxuICAgICAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnMgPSBKU09OLnBhcnNlKHN0b3JlZEZpbHRlcnMpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IGhlYWRlckZpbHRlcnM/LnN0b3Jlcy5tYXAoKHN0b3JlOmFueSkgPT4gKHtcclxuICAgICAgICAgICAgLi4uc3RvcmUsXHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHN0b3JlLmNoZWNrZWRcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuIFxyXG4gICAgLy8gRmV0Y2ggY2xpZW50IGRhdGEgaWYgdGhlIHVzZXIgaXMgb2YgdHlwZSAndGFuZ28nXHJcbiAgICBpZiAodXNlci51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICB0aGlzLmdldENsaWVudCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRDb3VudHJ5KCk7XHJcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgY29uc3QgY2xpZW50RmlsdGVycyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY2xpZW50LWRldGFpbHNcIik7XHJcbiAgICAgIGlmIChjbGllbnRGaWx0ZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyY2xpZW50RmlsdGVycyA9IEpTT04ucGFyc2UoY2xpZW50RmlsdGVycyk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDbGllbnQgPSB7XHJcbiAgICAgIHRyYWZmaWNEYXRlUmFuZ2UgOiBoZWFkZXJjbGllbnRGaWx0ZXJzLnRyYWZmaWNEYXRlUmFuZ2VcclxuICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgIFxyXG4gICAgLy8gTG9hZCBmaWx0ZXJzIGZyb20gbG9jYWxTdG9yYWdlIGlmIHRoZXkgZXhpc3RcclxuICAgIGNvbnN0IHN0b3JlZEZpbHRlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzMVwiKTtcclxuICAgIGlmIChzdG9yZWRGaWx0ZXJzKSB7XHJcbiAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnMgPSBKU09OLnBhcnNlKHN0b3JlZEZpbHRlcnMpO1xyXG4gICBpZiAoaGVhZGVyRmlsdGVycy5kYXRlKSB7XHJcbiAgICBcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0ge1xyXG4gICAgICAgICAgc3RhcnREYXRlOiB0aGlzLmRheWpzKFwiMDktMDktMjAyNVwiKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpLFxyXG4gICAgICAgICAgZW5kRGF0ZTogdGhpcy5kYXlqcyhcIjA5LTA5LTIwMjVcIikuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSxcclxuICAgICAgICAgIFxyXG4gICAgICAgIH07XHJcbiAgICAgIGhlYWRlckZpbHRlcnMuZGF0ZSA9IHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2U7XHJcbiAgICAgIH0gXHJcbiAgICAgIFxyXG4gICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGVkRmlsdGVycyB3aXRoIGRlZmF1bHRzIG9yIGV4aXN0aW5nIHZhbHVlc1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycyA9IHtcclxuICAgICAgICBjbGllbnQ6IGhlYWRlckZpbHRlcnMuY2xpZW50IHx8IHRoaXMudXNlcnMuY2xpZW50IHx8ICcxMScsXHJcbiAgICAgICAgY2xpZW50TmFtZTogaGVhZGVyRmlsdGVycy5jbGllbnROYW1lIHx8ICcnLFxyXG4gICAgICAgIGNsaWVudHM6IGhlYWRlckZpbHRlcnMuY2xpZW50cyB8fCBbXSxcclxuICAgICAgICBzdG9yZTogaGVhZGVyRmlsdGVycy5zdG9yZSB8fCBudWxsLFxyXG4gICAgICAgIGRhdGU6IGhlYWRlckZpbHRlcnMuZGF0ZSB8fCB7fSxcclxuICAgICAgICBzdG9yZXM6IGhlYWRlckZpbHRlcnMuc3RvcmVzIHx8IFtdLFxyXG4gICAgICAgIGdyb3VwOiBoZWFkZXJGaWx0ZXJzLmdyb3VwIHx8IFtdLFxyXG4gICAgICAgIGxvY2F0aW9uOiBoZWFkZXJGaWx0ZXJzLmxvY2F0aW9uIHx8IFtdLFxyXG4gICAgICAgIGNvdW50cnk6IGhlYWRlckZpbHRlcnMuY291bnRyeSB8fCBbXVxyXG4gICAgICB9O1xyXG4gIFxyXG4gICAgICAvLyBTeW5jIGZpbHRlcmVkIGRhdGEgd2l0aCBzdG9yZWQgc2VsZWN0aW9uc1xyXG4gICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5zeW5jV2l0aExvY2FsU3RvcmFnZShoZWFkZXJGaWx0ZXJzLmNvdW50cnkpO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5zeW5jV2l0aExvY2FsU3RvcmFnZShoZWFkZXJGaWx0ZXJzLmxvY2F0aW9uKTtcclxuICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IHRoaXMuc3luY1dpdGhMb2NhbFN0b3JhZ2UoaGVhZGVyRmlsdGVycy5ncm91cCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN5bmNXaXRoTG9jYWxTdG9yYWdlKGhlYWRlckZpbHRlcnMuc3RvcmVzKTtcclxuICBcclxuICAgICAgLy8gRm9ybWF0IGRhdGUgcmFuZ2UgaWYgaXQgZXhpc3RzXHJcbiAgICAgIGlmIChoZWFkZXJGaWx0ZXJzLmRhdGUpIHtcclxuICAgIFxyXG4gICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0ge1xyXG4gICAgICAgICAgc3RhcnREYXRlOiB0aGlzLmRheWpzKFwiMDktMDktMjAyNVwiKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpLFxyXG4gICAgICAgICAgZW5kRGF0ZTogdGhpcy5kYXlqcyhcIjA5LTA5LTIwMjVcIikuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSxcclxuICAgICAgICB9O1xyXG4gICAgICB9IFxyXG4gICAgICAgaGVhZGVyRmlsdGVycy5kYXRlID0gdGhpcy5zZWxlY3RlZERhdGVSYW5nZTtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCIzXCIpXHJcbiAgICAgIC8vIEVtaXQgZGF0YSB2aWEgc2VydmljZSBhbmQgdXBkYXRlIGxvY2FsU3RvcmFnZVxyXG50aGlzLmVtaXRBbmRTdG9yZUZpbHRlcnMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEluaXRpYWxpemUgZW1wdHkgc3RhdGVzIGlmIG5vIGhlYWRlciBmaWx0ZXJzIGFyZSBwcmVzZW50IGluIGxvY2FsU3RvcmFnZVxyXG4gICAgICB0aGlzLnJlc2V0RmlsdGVycygpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIjJcIilcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBzeW5jV2l0aExvY2FsU3RvcmFnZShpdGVtczogYW55W10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gaXRlbXNcclxuICAgICAgPyBpdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICBjaGVja2VkOiBpdGVtLmNoZWNrZWQgPT09IHRydWVcclxuICAgICAgICB9KSlcclxuICAgICAgOiBbXTtcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBlbWl0QW5kU3RvcmVGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnMxXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcIjFcIilcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgc2VsZWN0ZWRGaWx0ZXJzIGFuZCBhbGwgcmVsYXRlZCBhcnJheXMgdG8gZW1wdHkgc3RhdGVzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXNldEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycyA9IHtcclxuICAgICAgY2xpZW50OiBudWxsLFxyXG4gICAgICBjbGllbnROYW1lOiAnJyxcclxuICAgICAgY2xpZW50czogW10sXHJcbiAgICAgIHN0b3JlOiBudWxsLFxyXG4gICAgICBkYXRlOiB7fSxcclxuICAgICAgc3RvcmVzOiBbXSxcclxuICAgICAgZ3JvdXA6IFtdLFxyXG4gICAgICBsb2NhdGlvbjogW10sXHJcbiAgICAgIGNvdW50cnk6IFtdXHJcbiAgICB9O1xyXG4gICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IFtdO1xyXG4gIH1cclxuZ2V0Q2xpZW50KCl7XHJcbiAgdGhpcy5hdXRoLmdldENsaWVudHMoKS5zdWJzY3JpYmUoe1xyXG4gICAgbmV4dDogKGUpID0+IHtcclxuICAgICAgaWYgKGUpIHtcclxuICAgICAgICB0aGlzLmNsaWVudExpc3QgPSBlLmRhdGEucmVzdWx0O1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnM6IGFueSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzMVwiKSB8fCBcInt9XCJcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChoZWFkZXJGaWx0ZXJzLmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRMaXN0LmZpbmQoKG9iajogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChvYmouY2xpZW50SWQgPT09IGhlYWRlckZpbHRlcnMuY2xpZW50KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENsaWVudCA9IG9iajtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvLyBjb25zdCBzdGFydERhdGUgPSB0aGlzLmRheWpzKGhlYWRlckZpbHRlcnMuZGF0ZS5zdGFydERhdGUpO1xyXG4gICAgICAgICAgLy8gY29uc3QgZW5kRGF0ZSA9IHRoaXMuZGF5anMoaGVhZGVyRmlsdGVycy5kYXRlLmVuZERhdGUpO1xyXG4gICAgICAgICAgLy8gY29uc3QgZGlmZmVyZW5jZUluRGF5cyA9IGVuZERhdGUuZGlmZihzdGFydERhdGUsICdkYXlzJyk7XHJcbiAgICAgICAgICAvLyBpZiAoZGlmZmVyZW5jZUluRGF5cyA+PSA5MCAmJiB0aGlzLnNlbGVjdGVkQ2xpZW50Py50cmFmZmljRGF0ZVJhbmdlID09PSA5MCkge1xyXG4gICAgICAgICAgLy8gICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0ge1xyXG4gICAgICAgICAgLy8gICAgIHN0YXJ0RGF0ZTogdGhpcy5kYXlqcyhoZWFkZXJGaWx0ZXJzLmRhdGUuc3RhcnREYXRlLCBcIllZWVktTU0tRERcIikuc3VidHJhY3QoLTkwLCAnZGF5cycpLmZvcm1hdChcIkRELU1NLVlZWVlcIiksXHJcbiAgICAgICAgICAvLyAgICAgZW5kRGF0ZTogdGhpcy5kYXlqcyhoZWFkZXJGaWx0ZXJzLmRhdGUuZW5kRGF0ZSwgXCJZWVlZLU1NLUREXCIpLmZvcm1hdChcIkRELU1NLVlZWVlcIiksXHJcbiAgICAgICAgICAvLyAgIH07XHJcbiAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0ge1xyXG4gICAgICAgICAgLy8gICAgIHN0YXJ0RGF0ZTogdGhpcy5kYXlqcyh0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLnN0YXJ0RGF0ZSwgXCJZWVlZLU1NLUREXCIpLmZvcm1hdChcIkRELU1NLVlZWVlcIiksXHJcbiAgICAgICAgICAvLyAgICAgZW5kRGF0ZTogdGhpcy5kYXlqcyh0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLmVuZERhdGUsIFwiWVlZWS1NTS1ERFwiKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpLFxyXG4gICAgICAgICAgLy8gICB9O1xyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID0gaGVhZGVyRmlsdGVycy5jbGllbnQ7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnROYW1lID0gaGVhZGVyRmlsdGVycy5jbGllbnROYW1lO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50cyA9IGhlYWRlckZpbHRlcnMuY2xpZW50cztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlID0gaGVhZGVyRmlsdGVycy5zdG9yZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmRhdGUgPSBoZWFkZXJGaWx0ZXJzLmRhdGU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlcztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gaGVhZGVyRmlsdGVycy5ncm91cDtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gaGVhZGVyRmlsdGVycy5sb2NhdGlvbjtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkgPSBoZWFkZXJGaWx0ZXJzLmNvdW50cnk7XHJcbiAgICAgICAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCIyXCIpXHJcbiAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBsb2FkZWQgYmVmb3JlIGZldGNoaW5nIHN0b3Jlc1xyXG4gdGhpcy5nZXRDb3VudHJ5KCk7ICBcclxuIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiB0aGlzLmdldEdyb3VwcygpO1xyXG4gIC8vIEZldGNoIHN0b3JlcyBvbmx5IGFmdGVyIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBzZXRcclxuICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENsaWVudCA9IHRoaXMuY2xpZW50TGlzdFswXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPSAgdGhpcy5zZWxlY3RlZENsaWVudC5jbGllbnRJZCA/IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50SWQgOicxMScgO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudE5hbWUgPSB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudE5hbWVcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50cyA9IGhlYWRlckZpbHRlcnMuY2xpZW50cztcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmUgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5kYXRlID0gaGVhZGVyRmlsdGVycy5kYXRlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlcztcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSBoZWFkZXJGaWx0ZXJzLmdyb3VwO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IGhlYWRlckZpbHRlcnMubG9jYXRpb247XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkgPSBoZWFkZXJGaWx0ZXJzLmNvdW50cnk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICBcImhlYWRlci1maWx0ZXJzMVwiLFxyXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpIFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjNcIilcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgLy8gRW5zdXJlIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBsb2FkZWQgYmVmb3JlIGZldGNoaW5nIHN0b3Jlc1xyXG4gdGhpcy5nZXRDb3VudHJ5KCk7XHJcbiB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gdGhpcy5nZXRHcm91cHMoKTtcclxuICAvLyBGZXRjaCBzdG9yZXMgb25seSBhZnRlciBsb2NhdGlvbnMgYW5kIGdyb3VwcyBhcmUgc2V0XHJcbiAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDbGllbnQgPSB0aGlzLmNsaWVudExpc3RbMF07XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9ICB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudElkID8gdGhpcy5zZWxlY3RlZENsaWVudC5jbGllbnRJZCA6JzExJztcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50TmFtZSA9IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50TmFtZVxyXG4gICAgICAgLy8gRW5zdXJlIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBsb2FkZWQgYmVmb3JlIGZldGNoaW5nIHN0b3Jlc1xyXG4gdGhpcy5nZXRDb3VudHJ5KCk7XHJcbiB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gdGhpcy5nZXRHcm91cHMoKTtcclxuIC8vIEZldGNoIHN0b3JlcyBvbmx5IGFmdGVyIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBzZXRcclxuIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgXCJoZWFkZXItZmlsdGVyczFcIixcclxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykgXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiNFwiKVxyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB0aGlzLmdldFVzZXJJbmZvKHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCk7XHJcblxyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5nZXRVc2VySW5mbyhjbGllbnQ6YW55KXtcclxuICBsZXQgb2JqID17XHJcbiAgICAgIGNsaWVudElkOiBjbGllbnQgPyBjbGllbnQgOicxMSdcclxuICB9XHJcbiAgaWYoY2xpZW50KXtcclxuICAgIHRoaXMuYXV0aC5nZXRIZWFkZXJVc2VycyhvYmopLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChlKSA9PiB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICBcInVzZXJzRW1haWwtaW5mb1wiLFxyXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZT8uZGF0YT8udXNlckVtYWlsRGF0YSB8fCBbXSlcclxuICAgICAgICApO1xyXG4gICAgICB9IFxyXG4gICAgfSlcclxuICB9XHJcbn1cclxub25DbGllbnRTZWxlY3QoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gIC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgY2xpZW50XHJcbiAgdGhpcy5zZWxlY3RlZENsaWVudCA9IGV2ZW50O1xyXG4gIC8vIENsZWFyIHByZXZpb3VzIGZpbHRlcmVkIGRhdGEgYW5kIHNlbGVjdGlvbnNcclxuICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107XHJcbiAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdO1xyXG4gIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSBbXTtcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBbXTtcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gW107XHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSA9IFtdO1xyXG5cclxuXHJcbiAgLy8gRmV0Y2ggaGVhZGVyIGZpbHRlcnMgZnJvbSBsb2NhbFN0b3JhZ2VcclxuICBjb25zdCBoZWFkZXJGaWx0ZXJzOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnMxXCIpIHx8IFwie31cIik7XHJcbiAgXHJcbiAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCBmaWx0ZXJzIHdpdGggdGhlIG5ldyBjbGllbnRcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPSB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudElkID8gdGhpcy5zZWxlY3RlZENsaWVudC5jbGllbnRJZCA6JzExJztcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnROYW1lID0gdGhpcy5zZWxlY3RlZENsaWVudC5jbGllbnROYW1lO1xyXG4gIFxyXG4gIC8vIFJlbW92ZSBvbGQgc3RvcmUsIGdyb3VwLCBhbmQgbG9jYXRpb24gZGF0YSBmcm9tIHRoZSBoZWFkZXIgZmlsdGVyc1xyXG4gIGRlbGV0ZSBoZWFkZXJGaWx0ZXJzLnN0b3JlcztcclxuICBkZWxldGUgaGVhZGVyRmlsdGVycy5ncm91cHM7XHJcbiAgZGVsZXRlIGhlYWRlckZpbHRlcnMubG9jYXRpb247XHJcbiAgZGVsZXRlIGhlYWRlckZpbHRlcnMuY291bnRyeTtcclxuXHJcbiAgXHJcbiAgLy8gRmV0Y2ggbmV3IGRhdGEgYmFzZWQgb24gdGhlIG5ldyBjbGllbnRcclxuICB0aGlzLmdldENvdW50cnkoKTtcclxuICB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gIHRoaXMuZ2V0U3RvcmUoKTtcclxuICB0aGlzLmdldEdyb3VwcygpO1xyXG5cclxuICAvLyBVcGRhdGUgbG9jYWxTdG9yYWdlIHdpdGggdGhlIG5ldyBjbGllbnQgc2VsZWN0aW9uIGFuZCBlbXB0eSBmaWx0ZXIgZGF0YVxyXG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVyczEnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gIC8vIEVtaXQgZGF0YSB0byB0aGUgZ2xvYmFsIHNlcnZpY2VcclxuICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byByZWZsZWN0IFVJIGNoYW5nZXNcclxuICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxufVxyXG5cclxuXHJcblxyXG5yYW5nZXM6YW55ID0ge1xyXG4gIC8vIFRvZGF5OiBbZGF5anMoKSwgZGF5anMoKV0sXHJcbiAgWWVzdGVyZGF5OiBbZGF5anMoKS5zdWJ0cmFjdCgxLCAnZGF5cycpLCBkYXlqcygpLnN1YnRyYWN0KDEsICdkYXlzJyldLFxyXG4gICdUaGlzIFdlZWsnOiBbZGF5anMoKS5zdWJ0cmFjdCg3LCAnZGF5cycpLCBkYXlqcygpLnN1YnRyYWN0KDEsICdkYXlzJyldLFxyXG4gICdMYXN0IFdlZWsnOiBbXHJcbiAgICBkYXlqcygpLnN1YnRyYWN0KDE0LCAnZGF5cycpLnN0YXJ0T2YoJ2RheScpLFxyXG4gICAgZGF5anMoKS5zdWJ0cmFjdCg4LCAnZGF5cycpLmVuZE9mKCdkYXknKSxcclxuICBdLFxyXG4gICdUaGlzIE1vbnRoJzogW2RheWpzKCkuc3VidHJhY3QoMzAsICdkYXlzJyksIGRheWpzKCkuc3VidHJhY3QoMSwgJ2RheXMnKV0sXHJcbiAgJ0xhc3QgTW9udGgnOiBbXHJcbiAgICBkYXlqcygpLnN1YnRyYWN0KDEsICdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJyksXHJcbiAgICBkYXlqcygpLnN1YnRyYWN0KDEsICdtb250aCcpLmVuZE9mKCdtb250aCcpLFxyXG4gIF0sXHJcbn07XHJcblxyXG4gIG9uU3RhcnREYXRlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZSkuaXNWYWxpZCgpKSB7XHJcbiAgICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRDbGllbnQ/LnRyYXhEYXRlUmFuZ2UgPT09IDkwKXtcclxuICAgICAgICAgICAgIHRoaXMuaXNDdXN0b21EYXRlID0gKG06IGRheWpzLkRheWpzKSA9PiB7XHJcbiAgICAgICAgICAgICAgIGNvbnN0IGlzVmFsaWREYXRlID1cclxuICAgICAgICAgICAgICAgICBtID4gdGhpcy5kYXlqcygpIHx8IG0gPiB0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZS5hZGQoOTAsIFwiZGF5c1wiKSk7XHJcbiAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZSA/IFwiaW52YWxpZC1kYXRlXCIgOiBmYWxzZTtcclxuICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc0N1c3RvbURhdGUgPSAobTogZGF5anMuRGF5anMpID0+IHtcclxuICAgICAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9XHJcbiAgICAgICAgICBtID4gdGhpcy5kYXlqcygpIHx8IG0gPiB0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZS5hZGQoMTgwLCBcImRheXNcIikpO1xyXG4gICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZSA/IFwiaW52YWxpZC1kYXRlXCIgOiBmYWxzZTtcclxuICAgICAgfTtcclxuICAgICAgICAgfVxyXG4gICAgXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkYXRlY2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmIChldmVudCAmJiBldmVudC5zdGFydERhdGUgJiYgZXZlbnQuZW5kRGF0ZSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5kYXlqcyhldmVudC5zdGFydERhdGUpLmlzVmFsaWQoKSAmJlxyXG4gICAgICAgIHRoaXMuZGF5anMoZXZlbnQuZW5kRGF0ZSkuaXNWYWxpZCgpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2Uuc3RhcnREYXRlID0gZXZlbnQuc3RhcnREYXRlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UuZW5kRGF0ZSA9IGV2ZW50LmVuZERhdGU7XHJcbiAgICAgICAgdmFyIGRhdGV0aW1lID0ge1xyXG4gICAgICAgICAgc3RhcnREYXRlOiB0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZSwgXCJERC1NTS1ZWVlZXCIpLmZvcm1hdChcclxuICAgICAgICAgICAgXCJZWVlZLU1NLUREXCJcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBlbmREYXRlOiB0aGlzLmRheWpzKGV2ZW50LmVuZERhdGUsIFwiREQtTU0tWVlZWVwiKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZGF0ZSA9IGRhdGV0aW1lO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgXCJoZWFkZXItZmlsdGVyczFcIixcclxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXHJcbiAgICAgIC8vIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAgIH1cclxuICAgIH0gXHJcbiAgfVxyXG4gIG9wZW5kcm9wZG93bihlOk1vdXNlRXZlbnQpIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9ICF0aGlzLk9wZW5kcm9wZG93bjtcclxuICB9XHJcbiAgZ2V0TG9jYXRpb25zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY291bnRyeSA9IHRoaXMuY291bnRyaWVzXHJcbiAgICAuZmlsdGVyKGNvdW50cnkgPT4gY291bnRyeS5jaGVja2VkKVxyXG4gICAgLm1hcChjb3VudHJ5ID0+IGNvdW50cnkuY291bnRyeSk7ICBcclxuICAgIC8vIGNvbnN0IGhlYWRlckZpbHRlcnM6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyczFcIikgfHwgXCJ7fVwiKTtcclxuICAgIGxldCBvYmogPXtcclxuICAgICBjbGllbnRJZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID8gdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50IDp0aGlzLnVzZXJzLmNsaWVudElkIHx8ICcxMScsXHJcbiAgICAgY291bnRyeSxcclxuICAgICBjaXR5OiBbXSxcclxuICAgICBncm91cDogW10sXHJcbiAgICB9XHJcbiAgICB0aGlzLmF1dGguZ2V0TG9jYXRpb24ob2JqKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgY2l0eUxpc3QgPSB0aGlzLnNlbGVjdGVkRmlsdGVycz8ubG9jYXRpb24/LmZpbHRlcigobG9jYXRpb246YW55KSA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAoKGxvYzphbnkpID0+IGxvYy5jaXR5KTtcclxuICAgICAgICAvLyBNYXAgdGhlIGZldGNoZWQgbG9jYXRpb25zIHdpdGggZGVmYXVsdCB1bmNoZWNrZWQgc3RhdGVcclxuICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IHJlcz8uZGF0YT8ubG9jYXRpb25EYXRhLm1hcCgoY2l0eTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgY2l0eTogY2l0eS5jaXR5LFxyXG4gICAgICAgICAgLy8gY2hlY2tlZDogY2l0eUxpc3Q/Lmxlbmd0aCA/IGNpdHlMaXN0LmluY2x1ZGVzKGNpdHkuY2l0eSkgOiB0cnVlLFxyXG4gICAgICAgICAgY2hlY2tlZDogY2l0eUxpc3Q/LmluY2x1ZGVzKGNpdHkuY2l0eSkgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgfSkpO1xyXG4gIFxyXG4gICAgICAgIC8vIFN5bmMgdGhlIGZldGNoZWQgbG9jYXRpb25zIHdpdGggYW55IHN0b3JlZCBjaGVja2VkIHZhbHVlcyBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbikpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5tYXAobG9jYXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkTG9jYXRpb24gPSB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbi5maW5kKChsb2M6IGFueSkgPT4gbG9jLmNpdHkgPT09IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlZExvY2F0aW9uID8geyAuLi5sb2NhdGlvbiwgY2hlY2tlZDogbWF0Y2hlZExvY2F0aW9uLmNoZWNrZWQgfSA6IGxvY2F0aW9uO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0KSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnMuZmlsdGVyKChsb2NhdGlvbjphbnkpID0+IGxvY2F0aW9uLmNpdHkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC50b0xvd2VyQ2FzZSgpKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5maWx0ZXIoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLmdldEdyb3VwcygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFN0b3JlKCk7IC8vIEZldGNoIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgICAgIH0sMTAwMClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCFzZWxlY3RlZExvY2F0aW9ucy5sZW5ndGggJiYgY291bnRyeS5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggbG9jYXRpb25zXCIsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgaXNBbGxMb2NhdGlvbnNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmV2ZXJ5KGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpO1xyXG5cclxuICB9XHJcbiAgXHJcbiAgc2VsZWN0ZWRMb2NhdGlvbnNMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9uTGFiZWwgPSB0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC5sZW5ndGggPyB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAuZmlsdGVyKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpLm1hcChsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaXR5KSA6ICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZCkubWFwKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkTG9jYXRpb25zLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/ICcnXHJcbiAgICAgIDogc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID09PSAxXHJcbiAgICAgID8gc2VsZWN0ZWRMb2NhdGlvbnNbMF1cclxuICAgICAgOiBgJHtzZWxlY3RlZExvY2F0aW9ucy5sZW5ndGh9IFJlZ2lvbnNgO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTG9jYXRpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlc2V0KCk7XHJcbiAgfVxyXG4gIFxyXG4gIGdldEdyb3VwcygpOiB2b2lkIHsgIFxyXG4gICAgY29uc3QgY291bnRyeSA9IHRoaXMuY291bnRyaWVzXHJcbiAgICAgIC5maWx0ZXIoY291bnRyeSA9PiBjb3VudHJ5LmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoY291bnRyeSA9PiBjb3VudHJ5LmNvdW50cnkpOyAgXHJcbiAgICBsZXQgY2l0eTtcclxuICAgIGNpdHkgPSB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAuZmlsdGVyKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAobG9jYXRpb24gPT4gbG9jYXRpb24uY2l0eSk7XHJcblxyXG4gICAgICBpZighY2l0eS5sZW5ndGggJiYgY291bnRyeS5sZW5ndGgpIHtcclxuICAgICAgICBjaXR5ID0gdGhpcy5sb2NhdGlvbnMubWFwKChsb2MpID0+IGxvYy5jaXR5KTtcclxuICAgICAgfVxyXG4gICAgY29uc3Qgb2JqID0geyBjb3VudHJ5LGNpdHksY2xpZW50SWQ6dGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID8gdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50IDp0aGlzLnVzZXJzLmNsaWVudElkLGdyb3VwOltdIH07XHJcbiAgICB0aGlzLmF1dGguZ2V0R3JvdXBzKG9iaikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGNoZWNrZWRHcm91cCA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzPy5ncm91cD8uZmlsdGVyKChncm91cDphbnkpID0+IGdyb3VwLmNoZWNrZWQpLm1hcCgoZ3JvdXA6YW55KSA9PiBncm91cC5ncm91cE5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkR3JvdXBzID0gcmVzPy5kYXRhPy5ncm91cERhdGE/Lm1hcCgoZ3JvdXBOYW1lOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICBncm91cE5hbWU6IGdyb3VwTmFtZS5ncm91cE5hbWUsXHJcbiAgICAgICAgICBjaGVja2VkOiBjaGVja2VkR3JvdXA/LmluY2x1ZGVzKGdyb3VwTmFtZS5ncm91cE5hbWUpID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgICAgLy8gY2hlY2tlZDogY2hlY2tlZEdyb3VwPy5sZW5ndGggPyBjaGVja2VkR3JvdXAuaW5jbHVkZXMoZ3JvdXBOYW1lLmdyb3VwTmFtZSkgOiB0cnVlLFxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICB0aGlzLmdyb3Vwc0RhdGEgPSBjb21iaW5lZEdyb3VwcztcclxuICAgICAgICBpZih0aGlzLnNlYXJjaEdyb3VwVGV4dC5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSBjb21iaW5lZEdyb3Vwcy5maWx0ZXIoKGl0ZW06YW55KSA9PiBpdGVtLmdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoR3JvdXBUZXh0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IGNvbWJpbmVkR3JvdXBzO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICAvLyBBdXRvLWZldGNoIHN0b3JlcyB3aGVuIGdyb3VwcyBhcmUgc2VsZWN0ZWRcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZ3JvdXBzRGF0YS5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKS5tYXAoKGdyb3VwKSA9PiBncm91cC5ncm91cE5hbWUpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZEdyb3Vwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RvcmUoKTsgLy8gRmV0Y2ggc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gICAgICAgICAgfSwxMDAwKVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIGdyb3Vwc1wiLCBlcnIpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVEcm9wZG93bih0eXBlOiAnY291bnRyeScgfCAnbG9jYXRpb24nIHwgJ2dyb3VwJyB8ICdzdG9yZScpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRyb3Bkb3duT3BlbiA9PT0gdHlwZSkge1xyXG4gICAgICAvLyBJZiB0aGUgZHJvcGRvd24gaXMgb3BlbiwgY2xvc2UgaXQgYW5kIGF2b2lkIHJlc2V0dGluZyB0aGUgc2VsZWN0ZWQgdmFsdWVzIHVubmVjZXNzYXJpbHlcclxuICAgICAgdGhpcy5kcm9wZG93bk9wZW4gPSBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gT3BlbiB0aGUgc3BlY2lmaWMgZHJvcGRvd24gYW5kIGhhbmRsZSBkYXRhIGZldGNoaW5nIG9ubHkgaWYgbmVjZXNzYXJ5XHJcbiAgICAgIHRoaXMuZHJvcGRvd25PcGVuID0gdHlwZTtcclxuXHJcbiAgICAgIGlmICh0eXBlID09PSAnY291bnRyeScpIHtcclxuICAgICAgICAvLyBGZXRjaCBjb3VudHJpZXMgb25seSBpZiBub3QgYWxyZWFkeSBmZXRjaGVkIGFuZCBubyBzZWFyY2ggdGV4dCBleGlzdHNcclxuICAgICAgICBpZiAoKCF0aGlzLmZpbHRlcmVkQ291bnRyaWVzIHx8IHRoaXMuZmlsdGVyZWRDb3VudHJpZXMubGVuZ3RoID09PSAwKSAmJiAhdGhpcy5zZWFyY2hDb3VudHJ5VGV4dC50cmltKCkpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0Q291bnRyeSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBpZiAodHlwZSA9PT0gJ2dyb3VwJykge1xyXG4gICAgICAgIC8vIEZldGNoIGdyb3VwcyBvbmx5IGlmIHRoZXJlIGFyZSBzZWxlY3RlZCBjaXRpZXMgYW5kIG5vIGFjdGl2ZSBzZWFyY2ggdGV4dFxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2l0aWVzID0gdGhpcy5sb2NhdGlvbnNcclxuICAgICAgICAgIC5maWx0ZXIoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaGVja2VkKVxyXG4gICAgICAgICAgLm1hcCgobG9jYXRpb24pID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gIFxyXG4gICAgICAgIC8vIEZldGNoIGdyb3VwcyBvbmx5IGlmIGxvY2F0aW9ucyBhcmUgc2VsZWN0ZWQsIG5vIHNlYXJjaCB0ZXh0IGV4aXN0cywgYW5kIGRyb3Bkb3duIGlzIG9wZW5lZFxyXG4gICAgICBpZiAodGhpcy5maWx0ZXJlZExvY2F0aW9ucy5sZW5ndGggPiAwIHx8IChzZWxlY3RlZENpdGllcy5sZW5ndGggPiAwICYmICF0aGlzLnNlYXJjaEdyb3VwVGV4dC50cmltKCkpKSB7XHJcbiAgICAgICAgdGhpcy5nZXRHcm91cHMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107IC8vIENsZWFyIGdyb3VwcyBpZiBubyBsb2NhdGlvbnMgYXJlIHNlbGVjdGVkXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAvLyBGZXRjaCBzdG9yZXMgb25seSBpZiBub3QgYWxyZWFkeSBmZXRjaGVkIGFuZCBubyBzZWFyY2ggdGV4dCBpcyBhY3RpdmVcclxuICAgICAgaWYgKCghdGhpcy5maWx0ZXJlZFN0b3JlcyB8fCB0aGlzLmZpbHRlcmVkU3RvcmVzLmxlbmd0aCA9PT0gMCkgJiYgIXRoaXMuc2VhcmNoU3RvcmVUZXh0LnRyaW0oKSkge1xyXG4gICAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgfSBcclxuICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgaGFuZGxlR3JvdXBEcm9wZG93bkNsaWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZHJvcGRvd25PcGVuID09PSAnZ3JvdXAnKSB7XHJcbiAgICAgIHRoaXMucmVzZXRTZWxlY3RlZEdyb3VwcygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy50b2dnbGVEcm9wZG93bignZ3JvdXAnKTtcclxuICB9XHJcblxyXG4gIHJlc2V0U2VsZWN0ZWRHcm91cHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlcmVkR3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiAoZ3JvdXAuY2hlY2tlZCA9IGZhbHNlKSk7XHJcbiAgICB0aGlzLnNlYXJjaEdyb3VwVGV4dCA9IFwiXCI7XHJcbiAgfVxyXG4gIHNlbGVjdGVkR3JvdXBzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBzID0gdGhpcy5ncm91cExhYmVsID0gdGhpcy5zZWFyY2hHcm91cFRleHQubGVuZ3RoID8gdGhpcy5ncm91cHNEYXRhLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmNoZWNrZWQpIDogdGhpcy5maWx0ZXJlZEdyb3Vwcy5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKTtcclxuICAgIHJldHVybiBzZWxlY3RlZEdyb3Vwcy5sZW5ndGggPT09IDBcclxuICAgICAgPyBcIlwiXHJcbiAgICAgIDogc2VsZWN0ZWRHcm91cHMubGVuZ3RoID09PSAxXHJcbiAgICAgID8gc2VsZWN0ZWRHcm91cHNbMF0uZ3JvdXBOYW1lXHJcbiAgICAgIDogYCR7c2VsZWN0ZWRHcm91cHMubGVuZ3RofSBDbHVzdGVyc2A7XHJcbiAgfVxyXG4gIHJlbW92ZUdyb3VwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5SZXNldCgpO1xyXG4gICBcclxuICB9XHJcbiAgXHJcblxyXG4gIGlzQWxsR3JvdXBzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICBcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkR3JvdXBzLmxlbmd0aCA/IHRoaXMuZmlsdGVyZWRHcm91cHMuZXZlcnkoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKSA6IGZhbHNlO1xyXG4gIH1cclxuICAgICAgICBcclxuICBnZXRTdG9yZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvdW50cnkgPSB0aGlzLmNvdW50cmllc1xyXG4gICAgLmZpbHRlcihjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZClcclxuICAgIC5tYXAoY291bnRyeSA9PiBjb3VudHJ5LmNvdW50cnkpO1xyXG4gICAgY29uc3QgY2l0eSA9IHRoaXMubG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZClcclxuICAgICAgLm1hcChsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHNEYXRhXHJcbiAgICAgIC5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAuY2hlY2tlZClcclxuICAgICAgLm1hcChncm91cCA9PiBncm91cC5ncm91cE5hbWUpO1xyXG4gIFxyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgY291bnRyeSxcclxuICAgICAgY2l0eSxcclxuICAgICAgY2x1c3RlcnM6IGdyb3VwLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy51c2Vycy5jbGllbnRJZCB8fCB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnRcclxuICAgIH07XHJcbiAgXHJcbiAgICB0aGlzLmF1dGguZ2V0SGVhZGVyU3RvcmVzKGRhdGEpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSBzdG9yZXMgZnJvbSBBUEkgcmVzcG9uc2VcclxuICAgICAgICAgIHRoaXMuc3RvcmVzID0gdGhpcy56b25lRGF0YTtcclxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBwcmV2aW91c2x5IHNlbGVjdGVkIHN0b3Jlc1xyXG4gICAgICAgICAgY29uc3QgY2hlY2tlZFN0b3JlSWRzID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/LnN0b3Jlc1xyXG4gICAgICAgICAgICA/IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3Jlcy5maWx0ZXIoKHN0b3JlOmFueSkgPT4gc3RvcmUuY2hlY2tlZCkubWFwKChzdG9yZTphbnkpID0+IHN0b3JlLnN0b3JlSWQpXHJcbiAgICAgICAgICAgIDogW107XHJcbiAgICAgICAgICAvLyBTeW5jIHRoZSBgY2hlY2tlZGAgc3RhdGVcclxuICAgICAgICAgIHRoaXMuc3RvcmVzLmZvckVhY2goc3RvcmUgPT4ge1xyXG4gICAgICAgICAgICBzdG9yZS5jaGVja2VkID0gY2hlY2tlZFN0b3JlSWRzLmxlbmd0aFxyXG4gICAgICAgICAgICAgID8gY2hlY2tlZFN0b3JlSWRzLmluY2x1ZGVzKHN0b3JlLnN0b3JlSWQpIC8vIFVzZSBwcmV2aW91cyBzZWxlY3Rpb25cclxuICAgICAgICAgICAgICA6IHRydWU7IC8vIERlZmF1bHQgdG8gdHJ1ZSBpZiBubyBwcmV2aW91cyBzZWxlY3Rpb25cclxuICAgICAgICAgIH0pO1xyXG4gIFxyXG4gICAgICAgICAgLy8gQXBwbHkgc2VhcmNoIGZpbHRlciBpZiBzZWFyY2ggdGV4dCBpcyBwcmVzZW50XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hTdG9yZVRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN0b3Jlcy5maWx0ZXIoc3RvcmUgPT5cclxuICAgICAgICAgICAgICBzdG9yZS5zdG9yZU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaFN0b3JlVGV4dC50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFsuLi50aGlzLnN0b3Jlc107XHJcbiAgICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgICAvLyBVcGRhdGUgYHNlbGVjdGVkRmlsdGVycy5zdG9yZXNgIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdGVcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IHRoaXMuZmlsdGVyZWRTdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgICAgICAgICAgIHN0b3JlSWQ6IHN0b3JlLnN0b3JlSWQsXHJcbiAgICAgICAgICAgIHN0b3JlTmFtZTogc3RvcmUuc3RvcmVOYW1lLFxyXG4gICAgICAgICAgICBjaGVja2VkOiBzdG9yZS5jaGVja2VkXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAvLyB0aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5ID0gY291bnRyeTtcclxuICBcclxuICAgICAgICAgIC8vIFNhdmUgdXBkYXRlZCBmaWx0ZXJzIHRvIGxvY2FsU3RvcmFnZVxyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzMScsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgXHJcbiAgICAgICAgICAvLyBUcmlnZ2VyIFVJIGNoYW5nZSBkZXRlY3Rpb25cclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBIYW5kbGUgZW1wdHkgb3IgZXJyb3IgcmVzcG9uc2VcclxuICAgICAgICAgIHRoaXMuY2xlYXJTdG9yZXNTdGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIHN0b3Jlc1wiLCBlcnIpO1xyXG4gICAgICAgIHRoaXMuY2xlYXJTdG9yZXNTdGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgLy8gQ2xlYXIgc3RvcmVzIHN0YXRlIGFuZCByZXNldCBmaWx0ZXJzXHJcbiAgcHJpdmF0ZSBjbGVhclN0b3Jlc1N0YXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9yZXMgPSBbXTtcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IFtdO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzMScsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgfVxyXG4gIFxyXG4gIHJlc2V0U2VsZWN0ZWRTdG9yZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlcmVkU3RvcmVzLmZvckVhY2goKHN0b3JlKSA9PiAoc3RvcmUuY2hlY2tlZCA9IGZhbHNlKSk7XHJcbiAgICB0aGlzLnNlYXJjaFN0b3JlVGV4dCA9IFwiXCI7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZFN0b3Jlc0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZFN0b3JlcyA9IHRoaXMuc2VhcmNoU3RvcmVUZXh0Lmxlbmd0aCA/IHRoaXMuc3RvcmVzLmZpbHRlcigoc3RvcmUpID0+IHN0b3JlLmNoZWNrZWQpIDogdGhpcy5maWx0ZXJlZFN0b3Jlcy5maWx0ZXIoKHN0b3JlKSA9PiBzdG9yZS5jaGVja2VkKTtcclxuICAgIHJldHVybiBzZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDBcclxuICAgICAgPyBcIjAgU3RvcmVzXCJcclxuICAgICAgOiBzZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDFcclxuICAgICAgPyBzZWxlY3RlZFN0b3Jlc1swXS5zdG9yZU5hbWVcclxuICAgICAgOiBgJHtzZWxlY3RlZFN0b3Jlcy5sZW5ndGh9IFN0b3Jlc2A7XHJcbiAgfVxyXG5cclxuICBpc0FsbFN0b3Jlc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRTdG9yZXMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkU3RvcmVzLmV2ZXJ5KHN0b3JlID0+IHN0b3JlLmNoZWNrZWQpO1xyXG4gIH1cclxuLy8gTWV0aG9kIHRvIGhhbmRsZSBkcm9wZG93biBpdGVtIHNlbGVjdGlvblxyXG51cGRhdGVTZWxlY3RlZFN0b3JlcygpOiB2b2lkIHtcclxuICB0aGlzLmZpbHRlcmVkU3RvcmVzLmZvckVhY2goc3RvcmUgPT4ge1xyXG4gICAgY29uc3QgZmlsdGVyZWRTdG9yZSA9IHRoaXMuc3RvcmVzLmZpbmRJbmRleChmU3RvcmUgPT4gZlN0b3JlLnN0b3JlSWQgPT09IHN0b3JlLnN0b3JlSWQpO1xyXG4gICAgaWYgKGZpbHRlcmVkU3RvcmUgIT0gLTEpIHtcclxuICAgICAgdGhpcy5zdG9yZXNbZmlsdGVyZWRTdG9yZV0uY2hlY2tlZCA9IHN0b3JlLmNoZWNrZWQ7IC8vIFN5bmMgdGhlIGNoZWNrZWQgc3RhdGUgd2l0aCBmdWxsIHN0b3JlIGxpc3RcclxuICAgIH1cclxuICB9KTsgIFxyXG4gIC8vIFVwZGF0ZSBzZWxlY3RlZEZpbHRlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RvcmUgc2VsZWN0aW9uXHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gdGhpcy5zdG9yZXMuZmlsdGVyKHN0b3JlID0+IHN0b3JlLmNoZWNrZWQpO1xyXG5cclxuICAvLyBVcGRhdGUgbG9jYWxTdG9yYWdlIHdpdGggdGhlIGxhdGVzdCBzZWxlY3Rpb25cclxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMxJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuXHJcbiAgLy8gRW1pdCB1cGRhdGVkIGZpbHRlcnMgdmlhIHNlcnZpY2VcclxuICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG5cclxuICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gaWYgbmVjZXNzYXJ5XHJcbiAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbn1cclxuICB0b2dnbGVTZWxlY3RBbGxMb2NhdGlvbnMoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmZvckVhY2goKGxvY2F0aW9uKSA9PiAobG9jYXRpb24uY2hlY2tlZCA9IGlzQ2hlY2tlZCkpO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsU3RvcmVzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcclxuICBcclxuICAgIC8vIEFwcGx5IHRoZSBzZWxlY3Rpb24gdG8gYm90aCBmaWx0ZXJlZCBhbmQgZnVsbCBsaXN0IG9mIHN0b3Jlc1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3Jlcy5mb3JFYWNoKHN0b3JlID0+IHN0b3JlLmNoZWNrZWQgPSBjaGVja2VkKTtcclxuICAgIHRoaXMuc3RvcmVzLmZvckVhY2goc3RvcmUgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZFN0b3JlID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5maW5kKGZTdG9yZSA9PiBmU3RvcmUuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk7XHJcbiAgICAgIGlmIChmaWx0ZXJlZFN0b3JlKSB7XHJcbiAgICAgICAgc3RvcmUuY2hlY2tlZCA9IGNoZWNrZWQ7IC8vIFN5bmMgdGhlIGNoZWNrZWQgc3RhdGUgd2l0aCBmdWxsIHN0b3JlIGxpc3RcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIHN0b3JlcyBhbmQgcGVyc2lzdCB0aGUgc2VsZWN0aW9uXHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkU3RvcmVzKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpOiB2b2lkIHtcclxuICAgIC8vIFdoZW4gbG9jYXRpb25zIGFyZSBzZWxlY3RlZCwgZmV0Y2ggdGhlIHJlbGF0ZWQgZ3JvdXBzXHJcbiAgICBjb25zdCBzZWxlY3RlZENpdGllcyA9IHRoaXMuZmlsdGVyZWRMb2NhdGlvbnNcclxuICAgICAgLmZpbHRlcigobG9jYXRpb24pID0+IGxvY2F0aW9uLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMuZm9yRWFjaCgobG9jYXRpb246YW55KSA9PiB7XHJcbiAgICAgIGxldCBmaW5kTG9jYXRpb25JbmRleCA9IHRoaXMubG9jYXRpb25zLmZpbmRJbmRleCgobG9jOmFueSkgPT4gbG9jLmNpdHkgPT0gbG9jYXRpb24uY2l0eSk7XHJcbiAgICAgIGlmKGZpbmRMb2NhdGlvbkluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbnNbZmluZExvY2F0aW9uSW5kZXhdLmNoZWNrZWQgPSBsb2NhdGlvbi5jaGVja2VkO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKHNlbGVjdGVkQ2l0aWVzLmxlbmd0aCA+IDAgfHwgIXNlbGVjdGVkQ2l0aWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPVtdO1xyXG4gICAgICB0aGlzLmdyb3Vwc0RhdGEgPVtdXHJcbiAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7IC8vIEZldGNoIGdyb3VwcyBiYXNlZCBvbiBzZWxlY3RlZCBjaXRpZXNcclxuICAgICAgLy8gSWYgdGhlcmUgYXJlIHNlbGVjdGVkIGdyb3VwcywgZmV0Y2ggdGhlIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IHRoaXMubG9jYXRpb25zO1xyXG4gICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdOyAvLyBDbGVhciBncm91cHMgaWYgbm8gbG9jYXRpb25zIGFyZSBzZWxlY3RlZFxyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IFtdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdOyAvLyBSZXNldCBzdG9yZXMgYXMgd2VsbFxyXG4gICAgdGhpcy5zZWFyY2hHcm91cFRleHQgPSAnJztcclxuICAgIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gJyc7XHJcbiAgICAvLyB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsR3JvdXBzKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xyXG4gICAgdGhpcy5maWx0ZXJlZEdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gKGdyb3VwLmNoZWNrZWQgPSBpc0NoZWNrZWQpKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRHcm91cHMoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVNlbGVjdGVkR3JvdXBzKCk6IHZvaWQge1xyXG4gICAgLy8gRmV0Y2ggdGhlIHJlbGV2YW50IHN0b3JlcyBhZnRlciBncm91cHMgYXJlIHNlbGVjdGVkXHJcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZmlsdGVyZWRHcm91cHNcclxuICAgICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoKGdyb3VwKSA9PiBncm91cC5ncm91cE5hbWUpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyZWRHcm91cHMuZm9yRWFjaCgoZ3JvdXA6YW55KSA9PiB7XHJcbiAgICAgIGxldCBmaW5kR3JvdXBJbmRleCA9IHRoaXMuZ3JvdXBzRGF0YS5maW5kSW5kZXgoKGl0ZW06YW55KSA9PiBpdGVtLmdyb3VwTmFtZSA9PSBncm91cC5ncm91cE5hbWUpO1xyXG4gICAgICBpZihmaW5kR3JvdXBJbmRleCAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMuZ3JvdXBzRGF0YVtmaW5kR3JvdXBJbmRleF0uY2hlY2tlZCA9IGdyb3VwLmNoZWNrZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pIFxyXG4gICAgaWYgKHNlbGVjdGVkR3JvdXBzLmxlbmd0aCA+IDAgfHwgIXNlbGVjdGVkR3JvdXBzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPVtdO1xyXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgc2VsZWN0ZWQgZ3JvdXBzLCBmZXRjaCB0aGUgc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gICAgICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gdGhpcy5ncm91cHNEYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSWYgbm8gZ3JvdXBzIGFyZSBzZWxlY3RlZCwgY2xlYXIgdGhlIHN0b3JlcyBsaXN0XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTtcclxuICAgICAgXHJcbiAgICAgIC8vIEFsc28sIHVwZGF0ZSBsb2NhbFN0b3JhZ2UgdG8gcmVmbGVjdCB0aGUgY2xlYXJlZCBzdG9yZSBzZWxlY3Rpb25cclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gW107XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVyczEnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gIFxyXG4gICAgICAvLyBFbWl0IGRhdGEgdmlhIHNlcnZpY2VcclxuICAgICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIH1cclxuICBcclxuICAgIC8vIENsZWFyIHRoZSBzZWFyY2ggc3RvcmUgdGV4dCB3aGVuIGdyb3VwcyBhcmUgdXBkYXRlZFxyXG4gICAgdGhpcy5zZWFyY2hTdG9yZVRleHQgPSAnJztcclxuICB9XHJcbiAgXHJcblxyXG4gIFJlc2V0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgIC8vIENsZWFyIHNlbGVjdGVkIGdyb3Vwcywgc3RvcmVzLCBhbmQgbG9jYXRpb25zXHJcbiAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IFtdXHJcbiAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdO1xyXG4gIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTtcclxuICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gW107IC8vIFJlc2V0IGxvY2F0aW9ucyBhcyB3ZWxsXHJcbnRoaXMubG9jYXRpb25zID1bXTt0aGlzLmdyb3Vwc0RhdGEgPVtdOyB0aGlzLnN0b3JlcyA9W107IHRoaXMuY291bnRyaWVzID1bXTtcclxuICAvLyBDbGVhciBzZWFyY2ggaW5wdXQgZmllbGRzXHJcbiAgdGhpcy5zZWFyY2hMb2NhdGlvblRleHQgPSBcIlwiO1xyXG4gIHRoaXMuc2VhcmNoR3JvdXBUZXh0ID0gXCJcIjtcclxuICB0aGlzLnNlYXJjaFN0b3JlVGV4dCA9IFwiXCI7XHJcbnRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9W107XHJcbnRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID1bXTtcclxudGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPVtdO1xyXG50aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5ID1bXTtcclxuXHJcbiBcclxuICAvLyBGZXRjaCBsb2NhdGlvbnMsIGdyb3VwcywgYW5kIHN0b3JlcyBhZ2FpblxyXG4gIHRoaXMuZ2V0Q291bnRyeSgpO1xyXG4gIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgLy8gUmVzZXQgdGhlIGZpbHRlcnMgaW4gc2VsZWN0ZWRGaWx0ZXJzXHJcblxyXG5cclxuICAvLyAvLyBPbmNlIHN0b3JlcyBhcmUgZmV0Y2hlZCwgbWFyayBhbGwgYXMgY2hlY2tlZFxyXG4gIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gIC8vICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IHRoaXMuc3RvcmVzLm1hcChzdG9yZSA9PiAoe1xyXG4gIC8vICAgICAuLi5zdG9yZSxcclxuICAvLyAgICAgY2hlY2tlZDogdHJ1ZSAgLy8gTWFyayBhbGwgc3RvcmVzIGFzIGNoZWNrZWRcclxuICAvLyAgIH0pKTtcclxuXHJcbiAgLy8gICAvLyBTeW5jIHNlbGVjdGVkRmlsdGVycyB3aXRoIHRoZSB1cGRhdGVkIHN0b3JlIHN0YXRlXHJcbiAgLy8gICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSB0aGlzLmZpbHRlcmVkU3RvcmVzLm1hcChzdG9yZSA9PiAoe1xyXG4gIC8vICAgICAuLi5zdG9yZSxcclxuICAvLyAgICAgY2hlY2tlZDogdHJ1ZVxyXG4gIC8vICAgfSkpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2Ugd2l0aCB0aGUgbGF0ZXN0IHNlbGVjdGVkRmlsdGVyc1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzMScsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcclxuICAgIC8vIEVtaXQgdGhlIHJlc2V0IGZpbHRlcnMgdG8gdXBkYXRlIG90aGVyIGNvbXBvbmVudHMgaWYgbmVlZGVkXHJcbiAgICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgLy8gQWRkaW5nIGEgc2xpZ2h0IGRlbGF5IHRvIGVuc3VyZSBzdG9yZXMgYXJlIGZldGNoZWQgZmlyc3RcclxuIFxyXG4gIFxyXG4gICAgLy8gQ2xvc2UgZHJvcGRvd24gYWZ0ZXIgcmVzZXQgaWYgbmVjZXNzYXJ5XHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIH0sMTAwKVxyXG4gIH1cclxuICBcclxuICBcclxuICBcclxuXHJcbiAgZmlsdGVyTG9jYXRpb25zKCk6IHZvaWQgeyAgICBcclxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgXHJcbiAgICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgY2hlY2tlZCBzdGF0ZSBkdXJpbmcgZmlsdGVyaW5nXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAgIC5tYXAobG9jYXRpb24gPT4gKHtcclxuICAgICAgICAgIC4uLmxvY2F0aW9uLFxyXG4gICAgICAgICAgY2hlY2tlZDogdGhpcy5maWx0ZXJlZExvY2F0aW9ucy5maW5kKGwgPT4gbC5jaXR5ID09PSBsb2NhdGlvbi5jaXR5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIobG9jYXRpb24gPT5cclxuICAgICAgICAgIGxvY2F0aW9uPy5jaXR5Py50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNoZWNrZWQgc3RhdGUgd2hlbiBzZWFyY2ggdGV4dCBpcyBjbGVhcmVkXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5tYXAobG9jYXRpb24gPT4gKHtcclxuICAgICAgICAuLi5sb2NhdGlvbixcclxuICAgICAgICBjaGVja2VkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbi5maW5kKChsOmFueSkgPT4gbC5jaXR5ID09PSBsb2NhdGlvbi5jaXR5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG5cclxuICBmaWx0ZXJHcm91cHMoKTogdm9pZCB7ICBcclxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaEdyb3VwVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgXHJcbiAgICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgY2hlY2tlZCBzdGF0ZSBkdXJpbmcgZmlsdGVyaW5nXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSB0aGlzLmdyb3Vwc0RhdGFcclxuICAgICAgICAubWFwKGdyb3VwID0+ICh7XHJcbiAgICAgICAgICAuLi5ncm91cCxcclxuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuZmlsdGVyZWRHcm91cHMuZmluZChnID0+IGcuZ3JvdXBOYW1lID09PSBncm91cC5ncm91cE5hbWUpPy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgLmZpbHRlcihncm91cCA9PlxyXG4gICAgICAgICAgZ3JvdXA/Lmdyb3VwTmFtZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjaGVja2VkIHN0YXRlIHdoZW4gc2VhcmNoIHRleHQgaXMgY2xlYXJlZFxyXG4gICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gdGhpcy5ncm91cHNEYXRhLm1hcChncm91cCA9PiAoe1xyXG4gICAgICAgIC4uLmdyb3VwLFxyXG4gICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwLmZpbmQoKGc6YW55KSA9PiBnLmdyb3VwTmFtZSA9PT0gZ3JvdXAuZ3JvdXBOYW1lKT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIFxyXG4gIGZpbHRlclN0b3JlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaFN0b3JlVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgLy8gUHJlc2VydmUgY2hlY2tlZCBzdGF0ZXMgZHVyaW5nIGZpbHRlcmluZ1xyXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgLy8gRmlsdGVyIGJhc2VkIG9uIHNlYXJjaCB0ZXh0IHdoaWxlIHByZXNlcnZpbmcgY2hlY2tlZCBzdGF0ZVxyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXNcclxuICAgICAgICAubWFwKHN0b3JlID0+ICh7XHJcbiAgICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdG9yZSBpcyBhbHJlYWR5IGNoZWNrZWQgaW4gZmlsdGVyZWRTdG9yZXMsIGZhbGxiYWNrIHRvIG9yaWdpbmFsIHN0b3JlcycgY2hlY2tlZCBzdGF0ZVxyXG4gICAgICAgICAgY2hlY2tlZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzLmZpbmQoKHM6IGFueSkgPT4gcy5zdG9yZUlkID09PSBzdG9yZS5zdG9yZUlkKT8uY2hlY2tlZCB8fCBzdG9yZS5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgLmZpbHRlcihzdG9yZSA9PiBzdG9yZS5zdG9yZU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBXaGVuIHRoZSBzZWFyY2ggdGV4dCBpcyBjbGVhcmVkLCByZXN0b3JlIHRoZSBvcmlnaW5hbCBsaXN0IHdpdGggcHJlc2VydmVkIGNoZWNrZWQgc3RhdGVzXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN0b3Jlcy5tYXAoc3RvcmUgPT4gKHtcclxuICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgY2hlY2tlZCBzdGF0ZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgZmlsdGVyc1xyXG4gICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3Jlcy5maW5kKChzOiBhbnkpID0+IHMuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk/LmNoZWNrZWQgfHwgc3RvcmUuY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZURyb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kcm9wZG93bk9wZW4gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OmNsaWNrXCIsIFtcIiRldmVudFwiXSlcclxuICBjbGlja091dHNpZGUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFxyXG4gICAgICBcIi5kcm9wZG93bi1jb250YWluZXJcIlxyXG4gICAgKTtcclxuICAgIGNvbnN0IGNsaWNrZWRvdXRTaWRlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcclxuICAgICAgXCIuZHJvcGRvd24yXCJcclxuICAgICk7XHJcbiAgICBpZiAoIWNsaWNrZWRJbnNpZGUpIHtcclxuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XHJcbiAgICB9XHJcbiAgICBpZighY2xpY2tlZG91dFNpZGUpIHtcclxuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duMSgpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8vIGdldENvdW50cnkoKTogdm9pZCB7XHJcbiAgLy8gICAvLyBjb25zdCBoZWFkZXJGaWx0ZXJzOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnMxXCIpIHx8IFwie31cIik7XHJcbiAgLy8gICBsZXQgb2JqID17XHJcbiAgLy8gICAgY2xpZW50SWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA/IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA6dGhpcy51c2Vycy5jbGllbnRJZCxcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuYXV0aC5nZXRDb3VudHJ5KG9iaikuc3Vic2NyaWJlKHtcclxuICAvLyAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgbGV0IGNvdW50cnlMaXN0ID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/LmNvdW50cnk/LmZpbHRlcigoY291bnRyeTphbnkpID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKChsb2M6YW55KSA9PiBsb2MuYWxsQ291bnRyeSk7XHJcbiAgLy8gICAgICAgLy8gTWFwIHRoZSBmZXRjaGVkIGNvdW50cmllcyB3aXRoIGRlZmF1bHQgdW5jaGVja2VkIHN0YXRlXHJcbiAgLy8gICAgICAgdGhpcy5jb3VudGlyZXMgPSByZXM/LmRhdGE/LmNvdW50cnlEYXRhLm1hcCgoYWxsQ291bnRyeTogYW55KSA9PiAoe1xyXG4gIC8vICAgICAgICAgYWxsQ291bnRyeTogYWxsQ291bnRyeS5hbGxDb3VudHJ5LFxyXG4gIC8vICAgICAgICAgY2hlY2tlZDogY291bnRyeUxpc3Q/LmluY2x1ZGVzKGFsbENvdW50cnkuYWxsQ291bnRyeSkgPyB0cnVlIDogZmFsc2UsXHJcbiAgLy8gICAgICAgfSkpO1xyXG4gIFxyXG4gIC8vICAgICAgIC8vIFN5bmMgdGhlIGZldGNoZWQgY291bnRyaWVzIHdpdGggYW55IHN0b3JlZCBjaGVja2VkIHZhbHVlcyBpbiBsb2NhbFN0b3JhZ2VcclxuICAvLyAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkpKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudHJpZXMubWFwKGNvdW50cnkgPT4ge1xyXG4gIC8vICAgICAgICAgICBjb25zdCBtYXRjaGVkTG9jYXRpb24gPSB0aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5LmZpbmQoKGxvYzogYW55KSA9PiBsb2MuYWxsQ291bnRyeSA9PT0gY291bnRyeS5hbGxDb3VudHJ5KTtcclxuICAvLyAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRMb2NhdGlvbiA/IHsgLi4uY291bnRyeSwgY2hlY2tlZDogbWF0Y2hlZExvY2F0aW9uLmNoZWNrZWQgfSA6IGNvdW50cnk7XHJcbiAgLy8gICAgICAgICB9KTtcclxuICAvLyAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IHRoaXMuY291bnRyaWVzO1xyXG4gIC8vICAgICAgIH1cclxuXHJcbiAgLy8gICAgICAgaWYodGhpcy5zZWFyY2hMb2NhdGlvblRleHQpIHtcclxuICAvLyAgICAgICAgIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50cmllcy5maWx0ZXIoKGNvdW50cnk6YW55KSA9PiBjb3VudHJ5LmNpdHkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC50b0xvd2VyQ2FzZSgpKSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50cmllcy5maWx0ZXIoKGNvdW50cnkpID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKChjb3VudHJ5KSA9PiBjb3VudHJ5LmFsbENvdW50cnkpO1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RlZENvdW50cmllcy5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgICAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgLy8gICAgICAgICAgIHRoaXMuZ2V0U3RvcmUoKTsgLy8gRmV0Y2ggc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gIC8vICAgICAgICAgfSwxMDAwKVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAvLyAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIGNvdW50cmllc1wiLCBlcnIpO1xyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZWxlY3RlZENvdW50cmllc0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgLy8gICBjb25zdCBzZWxlY3RlZENvdW50cmllcyA9IHRoaXMuY291bnRyeUxhYmVsID0gdGhpcy5zZWFyY2hMb2NhdGlvblRleHQubGVuZ3RoID8gdGhpcy5jb3VudHJpZXNcclxuICAvLyAgICAgLmZpbHRlcihjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKGNvdW50cnkgPT4gY291bnRyeS5hbGxDb3VudHJ5KSA6ICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzXHJcbiAgLy8gICAgIC5maWx0ZXIoY291bnRyeSA9PiBjb3VudHJ5LmNoZWNrZWQpLm1hcChjb3VudHJ5ID0+IGNvdW50cnkuYWxsQ291bnRyeSk7XHJcbiAgLy8gICByZXR1cm4gc2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RoID09PSAwXHJcbiAgLy8gICAgID8gJydcclxuICAvLyAgICAgOiBzZWxlY3RlZENvdW50cmllcy5sZW5ndGggPT09IDFcclxuICAvLyAgICAgPyBzZWxlY3RlZENvdW50cmllc1swXVxyXG4gIC8vICAgICA6IGAke3NlbGVjdGVkQ291bnRyaWVzLmxlbmd0aH0gY291bnRyaWVzYDtcclxuICAvLyB9XHJcblxyXG4gIC8vIGlzQWxsQ291bnRyaWVzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5maWx0ZXJlZENvdW50cmllcy5ldmVyeShjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZCk7XHJcblxyXG4gIC8vIH1cclxuICAvLyBmaWx0ZXJDb3VudHJpZXMoKTogdm9pZCB7ICAgIFxyXG4gIC8vICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoQ291bnRyeVRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIFxyXG4gIC8vICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAvLyAgICAgLy8gUHJlc2VydmUgdGhlIGNoZWNrZWQgc3RhdGUgZHVyaW5nIGZpbHRlcmluZ1xyXG4gIC8vICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudGlyZXNcclxuICAvLyAgICAgICAubWFwKGNvdW50cnkgPT4gKHtcclxuICAvLyAgICAgICAgIC4uLmNvdW50cnksXHJcbiAgLy8gICAgICAgICBjaGVja2VkOiB0aGlzLmZpbHRlcmVkQ291bnRyaWVzLmZpbmQobCA9PiBsLmFsbENvdW50cnkgPT09IGNvdW50cnkuYWxsQ291bnRyeSk/LmNoZWNrZWQgfHwgZmFsc2VcclxuICAvLyAgICAgICB9KSlcclxuICAvLyAgICAgICAuZmlsdGVyKGxvY2F0aW9uID0+XHJcbiAgLy8gICAgICAgICBsb2NhdGlvbj8uYWxsQ291bnRyeT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxyXG4gIC8vICAgICAgICk7XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjaGVja2VkIHN0YXRlIHdoZW4gc2VhcmNoIHRleHQgaXMgY2xlYXJlZFxyXG4gIC8vICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudGlyZXMubWFwKGNvdW50cnkgPT4gKHtcclxuICAvLyAgICAgICAuLi5jb3VudHJ5LFxyXG4gIC8vICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkuZmluZCgobDphbnkpID0+IGwuYWxsQ291bnRyeSA9PT0gY291bnRyeS5hbGxDb3VudHJ5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gIC8vICAgICB9KSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIFxyXG5cclxuICAgIGdldENvdW50cnkoKTogdm9pZCB7XHJcbiAgICBsZXQgb2JqID0ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID8gdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50IDogdGhpcy51c2Vycy5jbGllbnRJZCxcclxuICAgIH07XHJcbiAgICBcclxuICAgIHRoaXMuYXV0aC5nZXRDb3VudHJ5KG9iaikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gRXh0cmFjdCBzZWxlY3RlZCBjb3VudHJpZXMgZnJvbSBleGlzdGluZyBmaWx0ZXJzIChpZiBhbnkpXHJcbiAgICAgICAgbGV0IGNvdW50cnlMaXN0ID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/LmNvdW50cnk/LmZpbHRlcigoY291bnRyeTogYW55KSA9PiBjb3VudHJ5LmNoZWNrZWQpLm1hcCgobG9jOiBhbnkpID0+IGxvYy5jb3VudHJ5KTtcclxuICBcclxuICAgICAgICAvLyBNYXAgQVBJIHJlc3BvbnNlIHRvIGZyb250ZW5kIG1vZGVsXHJcbiAgICAgICAgdGhpcy5jb3VudHJpZXMgPSByZXM/LmRhdGE/LmNvdW50cnlEYXRhLm1hcCgoaXRlbTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgY291bnRyeTogaXRlbS5jb3VudHJ5LFxyXG4gICAgICAgICAgLy8gY2hlY2tlZDogY291bnRyeUxpc3Q/Lmxlbmd0aCA/IGNvdW50cnlMaXN0LmluY2x1ZGVzKGl0ZW0uY291bnRyeSkgOiB0cnVlLFxyXG4gICAgICAgICAgLy8gY2hlY2tlZDogY2l0eUxpc3Q/Lmxlbmd0aCA/IGNpdHlMaXN0LmluY2x1ZGVzKGNpdHkuY2l0eSkgOiB0cnVlLFxyXG4gICAgICAgICAgY2hlY2tlZDogY291bnRyeUxpc3Q/LmluY2x1ZGVzKGl0ZW0uY291bnRyeSkgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgICBcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5KSkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IHRoaXMuY291bnRyaWVzLm1hcChsb2NhdGlvbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRMb2NhdGlvbiA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkuZmluZCgobG9jOiBhbnkpID0+IGxvYy5jb3VudHJ5ID09PSBsb2NhdGlvbi5jb3VudHJ5KTtcclxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRMb2NhdGlvbiA/IHsgLi4ubG9jYXRpb24sIGNoZWNrZWQ6IG1hdGNoZWRMb2NhdGlvbi5jaGVja2VkIH0gOiBsb2NhdGlvbjtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudHJpZXM7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy8gSW5pdGlhbGx5LCBhbGwgY291bnRyaWVzIGFyZSB2aXNpYmxlXHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IFsuLi50aGlzLmNvdW50cmllc107XHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIC8vIElmIGEgc2VhcmNoIHRleHQgYWxyZWFkeSBleGlzdHMsIGZpbHRlciBpbW1lZGlhdGVseVxyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaENvdW50cnlUZXh0KSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlckNvdW50cmllcygpO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICAvLyBGZXRjaCBzdG9yZXMgaWYgYXQgbGVhc3Qgb25lIGNvdW50cnkgaXMgc2VsZWN0ZWRcclxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50cmllcy5maWx0ZXIoKGNvdW50cnkpID0+IGNvdW50cnkuY2hlY2tlZCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyaWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFN0b3JlKCk7IC8vIGZldGNoIHN0b3Jlc1xyXG4gICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggY291bnRyaWVzXCIsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkQ291bnRyaWVzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkQ291bnRyaWVzID0gdGhpcy5zZWFyY2hDb3VudHJ5VGV4dC5sZW5ndGhcclxuICAgICAgPyB0aGlzLmZpbHRlcmVkQ291bnRyaWVzLmZpbHRlcihjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKGNvdW50cnkgPT4gY291bnRyeS5jb3VudHJ5KVxyXG4gICAgICA6IHRoaXMuY291bnRyaWVzLmZpbHRlcihjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKGNvdW50cnkgPT4gY291bnRyeS5jb3VudHJ5KTtcclxuICBcclxuICAgIHJldHVybiBzZWxlY3RlZENvdW50cmllcy5sZW5ndGggPT09IDBcclxuICAgICAgPyAnJ1xyXG4gICAgICA6IHNlbGVjdGVkQ291bnRyaWVzLmxlbmd0aCA9PT0gMVxyXG4gICAgICA/IHNlbGVjdGVkQ291bnRyaWVzWzBdXHJcbiAgICAgIDogYCR7c2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RofSBjb3VudHJpZXNgO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQ291bnRyaWVzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoQ291bnRyeVRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIFxyXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgLy8gRmlsdGVyIGFuZCBwcmVzZXJ2ZSBjaGVja2VkIHN0YXRlXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50cmllc1xyXG4gICAgICAgIC5tYXAoY291bnRyeSA9PiAoe1xyXG4gICAgICAgICAgLi4uY291bnRyeSxcclxuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuZmlsdGVyZWRDb3VudHJpZXMuZmluZChjID0+IGMuY291bnRyeSA9PT0gY291bnRyeS5jb3VudHJ5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoY291bnRyeSA9PiBjb3VudHJ5LmNvdW50cnkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZXNldCB0byBmdWxsIGxpc3RcclxuICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IHRoaXMuY291bnRyaWVzLm1hcCgoY291bnRyeTogQ291bnRyeSkgPT4gKHtcclxuICAgICAgICAuLi5jb3VudHJ5LFxyXG4gICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnk/LmZpbmQoKGM6IGFueSkgPT4gYy5jb3VudHJ5ID09PSBjb3VudHJ5LmNvdW50cnkpPy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzQWxsQ291bnRyaWVzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZENvdW50cmllcy5sZW5ndGggPiAwICYmIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMuZXZlcnkoY291bnRyeSA9PiBjb3VudHJ5LmNoZWNrZWQpO1xyXG4gIH1cclxuICB0b2dnbGVTZWxlY3RBbGxDb3VudHJpZXMoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzLmZvckVhY2goKGNvdW50cnkpID0+IChjb3VudHJ5LmNoZWNrZWQgPSBpc0NoZWNrZWQpKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRDb3VudHJpZXMoKTtcclxuICAgIFxyXG4gIH1cclxuICBcclxuICB1cGRhdGVTZWxlY3RlZENvdW50cmllcygpOiB2b2lkIHtcclxuICAgIC8vIFdoZW4gbG9jYXRpb25zIGFyZSBzZWxlY3RlZCwgZmV0Y2ggdGhlIHJlbGF0ZWQgZ3JvdXBzXHJcbiAgICBjb25zdCBzZWxlY3RlZENvdW50cmllcyA9IHRoaXMuZmlsdGVyZWRDb3VudHJpZXNcclxuICAgICAgLmZpbHRlcigoY291bnRyeSkgPT4gY291bnRyeS5jaGVja2VkKVxyXG4gICAgICAubWFwKChjb3VudHJ5KSA9PiBjb3VudHJ5LmNvdW50cnkpO1xyXG4gICAgdGhpcy5maWx0ZXJlZENvdW50cmllcy5mb3JFYWNoKChjb3VudHJ5OmFueSkgPT4ge1xyXG4gICAgICBsZXQgZmluZENvdW50cnlJbmRleCA9IHRoaXMuY291bnRyaWVzLmZpbmRJbmRleCgobG9jOmFueSkgPT4gbG9jLmNvdW50cnkgPT0gY291bnRyeS5jb3VudHJ5KTtcclxuICAgICAgaWYoZmluZENvdW50cnlJbmRleCAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMuY291bnRyaWVzW2ZpbmRDb3VudHJ5SW5kZXhdLmNoZWNrZWQgPSBjb3VudHJ5LmNoZWNrZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAoc2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RoID4gMCB8fCAhc2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9W107XHJcbiAgICAgIHRoaXMuZ3JvdXBzRGF0YSA9W11cclxuICAgICAgdGhpcy5sb2NhdGlvbnMgPVtdO1xyXG4gICAgICB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gICAgICB0aGlzLmdldEdyb3VwcygpOyAvLyBGZXRjaCBncm91cHMgYmFzZWQgb24gc2VsZWN0ZWQgY2l0aWVzXHJcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBzZWxlY3RlZCBncm91cHMsIGZldGNoIHRoZSBzdG9yZXMgYmFzZWQgb24gc2VsZWN0ZWQgZ3JvdXBzXHJcbiAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSA9IHRoaXMuZmlsdGVyZWRDb3VudHJpZXM7XHJcbiAgICAgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107IC8vIENsZWFyIGdyb3VwcyBpZiBubyBsb2NhdGlvbnMgYXJlIHNlbGVjdGVkXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkgPSBbXTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSBbXTtcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTsgLy8gUmVzZXQgc3RvcmVzIGFzIHdlbGxcclxuICAgIHRoaXMuc2VhcmNoR3JvdXBUZXh0ID0gJyc7XHJcbiAgICB0aGlzLnNlYXJjaFN0b3JlVGV4dCA9ICcnO1xyXG4gICAgLy8gdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUNvdW50cnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICBBcHBseSgpOiB2b2lkIHtcclxuICAgIC8vIENsb3NlIHRoZSBkcm9wZG93blxyXG4gICAgdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICBcclxuICAgIC8vIEZldGNoIGV4aXN0aW5nIGZpbHRlcnMgZnJvbSBsb2NhbFN0b3JhZ2VcclxuICAgIGNvbnN0IGhlYWRlckZpbHRlcnM6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyczFcIikgfHwgXCJ7fVwiKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlID0gIG51bGxcclxuICBcclxuICAgIC8vIEVuc3VyZSBjdXJyZW50IHNlbGVjdGlvbnMgYXJlIHJlZmxlY3RlZFxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSA9IHRoaXMuZmlsdGVyZWRDb3VudHJpZXM7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IHRoaXMubG9jYXRpb25zO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSB0aGlzLmdyb3Vwc0RhdGE7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlcyA/IGhlYWRlckZpbHRlcnMuc3RvcmVzIDogdGhpcy5zdG9yZXM7XHJcbiAgICAvLyBTdG9yZSB1cGRhdGVkIGZpbHRlcnMgYmFjayBpbiBsb2NhbFN0b3JhZ2VcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnMxXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXHJcbiAgICAvLyBFbWl0IHRoZSB1cGRhdGVkIGZpbHRlcnMgdmlhIHRoZSBzZXJ2aWNlXHJcbiAgICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgLy8gVHJpZ2dlciByZWZyZXNoIGlmIG5lY2Vzc2FyeVxyXG4gICAgLy8gdGhpcy5ncy5tYW5hZ2VSZWZyZXNoVHJpZ2dlci5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIFxyXG5cclxuXHJcbn1cclxuaW50ZXJmYWNlIENpdHkge1xyXG4gIGNpdHk6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIExvY2F0aW9uIHtcclxuICBjaXR5OiBDaXR5O1xyXG4gIGNoZWNrZWQ6IGJvb2xlYW47XHJcbn1cclxuaW50ZXJmYWNlIENvdW50cnkge1xyXG4gIGNvdW50cnk6IHN0cmluZztcclxuICBjaGVja2VkOiBib29sZWFuO1xyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJcIj5cclxuICAgIDxsYWJlbCAqbmdJZj1cInNlbGVjdGVkQ291bnRyaWVzTGFiZWwoKVwiIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdCBteC0yXCI+e3tzZWxlY3RlZENvdW50cmllc0xhYmVsKCl9fSBcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInJlbW92ZUNvdW50cnkoKVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gICAgPGxhYmVsICpuZ0lmPVwic2VsZWN0ZWRMb2NhdGlvbnNMYWJlbCgpXCIgY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1kZWZhdWx0IG14LTJcIj57e3NlbGVjdGVkTG9jYXRpb25zTGFiZWwoKX19IFxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicmVtb3ZlTG9jYXRpb24oKVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gICAgPGxhYmVsICpuZ0lmPVwic2VsZWN0ZWRHcm91cHNMYWJlbCgpXCIgIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdCBteC0yXCI+e3tzZWxlY3RlZEdyb3Vwc0xhYmVsKCl9fSBcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInJlbW92ZUdyb3VwKClcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuICAgIDxsYWJlbCAgY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1kZWZhdWx0XCI+e3tzZWxlY3RlZFN0b3Jlc0xhYmVsKCl9fTwvbGFiZWw+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJ3cmFwcGVyIG1lLTNcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxyXG48bGliLXNlbGVjdCBbaXRlbXNdPVwiY2xpZW50TGlzdFwiIFttdWx0aV09XCJmYWxzZVwiIFtzZWFyY2hGaWVsZF09XCInY2xpZW50TmFtZSdcIiBbZGlzYWJsZWRdPVwiZmFsc2VcIiBbaWRGaWVsZF09XCInY2xpZW50SWQnXCJcclxuKHNlbGVjdGVkKT1cIm9uQ2xpZW50U2VsZWN0KCRldmVudClcIiBbc2VsZWN0ZWRWYWx1ZXNdPVwiW3NlbGVjdGVkQ2xpZW50XVwiPjwvbGliLXNlbGVjdD5cclxuPC9kaXY+XHJcbjwhLS0gPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbXktMVwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIG1zLTNcIj5cclxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJNMTMuMzMzMyAxLjY2NjYzVjQuOTk5OTZNNi42NjY2NyAxLjY2NjYzVjQuOTk5OTZNMi41IDguMzMzMjlIMTcuNU00LjE2NjY3IDMuMzMzMjlIMTUuODMzM0MxNi43NTM4IDMuMzMzMjkgMTcuNSA0LjA3OTQ4IDE3LjUgNC45OTk5NlYxNi42NjY2QzE3LjUgMTcuNTg3MSAxNi43NTM4IDE4LjMzMzMgMTUuODMzMyAxOC4zMzMzSDQuMTY2NjdDMy4yNDYxOSAxOC4zMzMzIDIuNSAxNy41ODcxIDIuNSAxNi42NjY2VjQuOTk5OTZDMi41IDQuMDc5NDggMy4yNDYxOSAzLjMzMzI5IDQuMTY2NjcgMy4zMzMyOVpcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPGlucHV0IGNsYXNzPVwiZngtZGF0ZS1yYW5nZSBmb3JtLWNvbnRyb2wgcHMtMTRcIiBzdHlsZT1cIm1pbi13aWR0aDogMjYwcHggIWltcG9ydGFudDtcIiB0eXBlPVwidGV4dFwiIG1hdElucHV0XHJcbiAgICAgICAgbmd4RGF0ZXJhbmdlcGlja2VyTWQgW2Ryb3BzXT1cIidkb3duJ1wiIFtvcGVuc109XCIncmlnaHQnXCIgW3Jhbmdlc109XCJyYW5nZXNcIiBbc2hvd0N1c3RvbVJhbmdlTGFiZWxdPVwidHJ1ZVwiIFthdXRvQXBwbHldPVwidHJ1ZVwiXHJcbiAgICAgICAgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwiZmFsc2VcIiBba2VlcENhbGVuZGFyT3BlbmluZ1dpdGhSYW5nZV09XCJ0cnVlXCIgW3Nob3dDYW5jZWxdPVwidHJ1ZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZERhdGVSYW5nZVwiIChzdGFydERhdGVDaGFuZ2VkKT1cIm9uU3RhcnREYXRlQ2hhbmdlKCRldmVudClcIiBbaXNDdXN0b21EYXRlXT1cImlzQ3VzdG9tRGF0ZVwiXHJcbiAgICAgICAgW2xvY2FsZV09XCJ7IGZvcm1hdDogJ0RELU1NLVlZWVknLCBmaXJzdERheTogMSwgbW9udGhOYW1lczogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ10gfVwiXHJcbiAgICAgICAgKGRhdGVzVXBkYXRlZCk9XCJkYXRlY2hhbmdlKCRldmVudClcIiBuYW1lPVwiZGF0ZXJhbmdlXCIgW3JlYWRvbmx5XT1cInRydWVcIiAvPlxyXG48L2Rpdj4gLS0+XHJcbjxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9wZW5kcm9wZG93bigkZXZlbnQpXCIgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IG14LTIgcm91bmRlZC0zIHRleHQtbm93cmFwIGJvcmRlci12YWxcIj5cclxuICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwibWUtMlwiPkZpbHRlcjwvc3Bhbj4gLS0+XHJcbiAgICAgICAgPHN2ZyBjbGFzcz1cInBsLTNcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSAxMEgxNU0yLjUgNUgxNy41TTcuNSAxNUgxMi41XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJPcGVuZHJvcGRvd25cIiBjbGFzcz1cImNhcmQgcC01IGRyb3Bkb3duMiBwb3NpdGlvbi1hYnNvbHV0ZSB6LTEgZW5kLTBcIiBzdHlsZT1cInotaW5kZXg6IDEgIWltcG9ydGFudDtcIiAoY2xpY2tPdXRzaWRlKT1cImNsb3NlRHJvcGRvd24xKClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdGl0bGUgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTJcIj5GaWx0ZXIgT3B0aW9uc1xyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMjUgbXMtMyBidG4tcmVzaXplXCIgKGNsaWNrKT1cIlJlc2V0KClcIj4gUmVzZXQgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0yNSAgYnRuLXJlc2l6ZVwiIChjbGljayk9XCJBcHBseSgpXCI+QXBwbHk8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICA8IS0tIENvdW50cnkgRHJvcGRvd24gLS0+XHJcbjxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250YWluZXJcIiAoY2xpY2tPdXRzaWRlKT1cImNsb3NlRHJvcGRvd24oKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bignY291bnRyeScpXCI+XHJcbiAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiIFxyXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBkcm9wZG93bi1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRDb3VudHJpZXNMYWJlbCgpXCJcclxuICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgY291bnRyeVwiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUgY3VzdG9tLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImRyb3Bkb3duT3BlbiA9PT0gJ2NvdW50cnknXCI+XHJcbiAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiIFxyXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBtYi0yIGRyb3Bkb3duLXNlYXJjaFwiIFxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjb3VudHJ5XCIgXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoQ291bnRyeVRleHRcIiBcclxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyQ291bnRyaWVzKClcIiBcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1iLTIgZHJvcGRvd24taXRlbSBjdXN0b20tZHJvcGRvd24taXRlbVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RBbGxDb3VudHJpZXNcIiBcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsQ291bnRyaWVzU2VsZWN0ZWQoKVwiIFxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGxDb3VudHJpZXMoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2VsZWN0QWxsQ291bnRyaWVzXCI+XHJcbiAgICAgICAgICAgICAgICBTZWxlY3QgQWxsXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBcclxuICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGZvcm0tY2hlY2sgY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIiBcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvdW50cnkgb2YgZmlsdGVyZWRDb3VudHJpZXNcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgW2lkXT1cImNvdW50cnkuY291bnRyeVwiIFxyXG4gICAgICAgIFsobmdNb2RlbCldPVwiY291bnRyeS5jaGVja2VkXCJcclxuICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkQ291bnRyaWVzKClcIiBcclxuICAgICAgLz5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwiY291bnRyeS5jb3VudHJ5XCI+XHJcbiAgICAgICAge3sgY291bnRyeS5jb3VudHJ5IH19XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuICAgICA8IS0tIExvY2F0aW9uIERyb3Bkb3duIC0tPlxyXG48ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyIG10LTNcIiAoY2xpY2tPdXRzaWRlKT1cImNsb3NlRHJvcGRvd24oKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bignbG9jYXRpb24nKVwiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZHJvcGRvd24taW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkTG9jYXRpb25zTGFiZWwoKVwiXHJcbiAgICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFJlZ2lvblwiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUgY3VzdG9tLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImRyb3Bkb3duT3BlbiA9PT0gJ2xvY2F0aW9uJ1wiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWItMiBkcm9wZG93bi1zZWFyY2hcIiBcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggUmVnaW9uXCIgXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoTG9jYXRpb25UZXh0XCIgXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckxvY2F0aW9ucygpXCIgXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yIGRyb3Bkb3duLWl0ZW0gY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0QWxsTG9jYXRpb25zXCIgXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbExvY2F0aW9uc1NlbGVjdGVkKClcIiBcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsTG9jYXRpb25zKCRldmVudClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbExvY2F0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgU2VsZWN0IEFsbFxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBmb3JtLWNoZWNrIGN1c3RvbS1kcm9wZG93bi1pdGVtXCIgXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsb2NhdGlvbiBvZiBmaWx0ZXJlZExvY2F0aW9uc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImxvY2F0aW9uLmNpdHlcIiBcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibG9jYXRpb24uY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkTG9jYXRpb25zKClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwibG9jYXRpb24uY2l0eVwiPlxyXG4gICAgICAgICAgICAgICAge3sgbG9jYXRpb24uY2l0eSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBHcm91cCBEcm9wZG93biAtLT5cclxuPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lciBtdC0zXCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJ2dyb3VwJylcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGRyb3Bkb3duLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZEdyb3Vwc0xhYmVsKClcIiByZWFkb25seVxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjbHVzdGVyc1wiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUgY3VzdG9tLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImRyb3Bkb3duT3BlbiA9PT0gJ2dyb3VwJ1wiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWItMiBkcm9wZG93bi1zZWFyY2hcIiBcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggY2x1c3RlcnNcIiBcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hHcm91cFRleHRcIiBcclxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyR3JvdXBzKClcIiBcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1iLTIgZHJvcGRvd24taXRlbSBjdXN0b20tZHJvcGRvd24taXRlbVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RBbGxHcm91cHNcIiBcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsR3JvdXBzU2VsZWN0ZWQoKVwiIFxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGxHcm91cHMoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2VsZWN0QWxsR3JvdXBzXCI+XHJcbiAgICAgICAgICAgICAgICBTZWxlY3QgQWxsXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBcclxuICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGZvcm0tY2hlY2sgY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIiBcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGZpbHRlcmVkR3JvdXBzXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBbaWRdPVwiZ3JvdXAuZ3JvdXBOYW1lXCJcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ3JvdXAuY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkR3JvdXBzKClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwiZ3JvdXAuZ3JvdXBOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBncm91cC5ncm91cE5hbWUgfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcblxyXG48IS0tIFN0b3JlIERyb3Bkb3duIC0tPlxyXG48ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyIG10LTNcIiAoY2xpY2tPdXRzaWRlKT1cImNsb3NlRHJvcGRvd24oKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bignc3RvcmUnKVwiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZHJvcGRvd24taW5wdXQgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRTdG9yZXNMYWJlbCgpXCJcclxuICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3Qgc3RvcmVzXCJcclxuICAgICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudSBjdXN0b20tZHJvcGRvd24tbWVudVwiICpuZ0lmPVwiZHJvcGRvd25PcGVuID09PSAnc3RvcmUnXCI+XHJcbiAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiIFxyXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBtYi0yIGRyb3Bkb3duLXNlYXJjaCBcIiBcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RvcmVzXCIgXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoU3RvcmVUZXh0XCIgXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlclN0b3JlcygpXCIgXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yIGRyb3Bkb3duLWl0ZW0gY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0QWxsU3RvcmVzXCIgXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbFN0b3Jlc1NlbGVjdGVkKClcIiBcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsU3RvcmVzKCRldmVudClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbFN0b3Jlc1wiPlxyXG4gICAgICAgICAgICAgICAgU2VsZWN0IEFsbFxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBmb3JtLWNoZWNrIGN1c3RvbS1kcm9wZG93bi1pdGVtXCIgXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzdG9yZSBvZiBmaWx0ZXJlZFN0b3Jlc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgW2lkXT1cInN0b3JlLnN0b3JlSWRcIlxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdG9yZS5jaGVja2VkXCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlU2VsZWN0ZWRTdG9yZXMoKVwiIFxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCJzdG9yZS5zdG9yZUlkXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBzdG9yZS5zdG9yZU5hbWUgfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19