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

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 (404) hide show
  1. package/.eslintrc.json +37 -0
  2. package/ng-package.json +7 -0
  3. package/package.json +12 -25
  4. package/src/lib/guards/auth.guard.ts +20 -0
  5. package/src/lib/guards/lead.guard.ts +16 -0
  6. package/src/lib/guards/stores.guard.ts +16 -0
  7. package/src/lib/guards/tickets.guard.ts +16 -0
  8. package/{lib/i18n/index.d.ts → src/lib/i18n/index.ts} +2 -2
  9. package/src/lib/i18n/translation.module.ts +9 -0
  10. package/src/lib/i18n/translation.service.ts +61 -0
  11. package/src/lib/i18n/vocabs/ch.ts +105 -0
  12. package/src/lib/i18n/vocabs/de.ts +105 -0
  13. package/src/lib/i18n/vocabs/en.ts +105 -0
  14. package/src/lib/i18n/vocabs/es.ts +105 -0
  15. package/src/lib/i18n/vocabs/fr.ts +105 -0
  16. package/src/lib/i18n/vocabs/jp.ts +105 -0
  17. package/src/lib/interceptors/http-auth-interceptor.ts +225 -0
  18. package/src/lib/interfaces/global-state.ts +6 -0
  19. package/src/lib/modules/common/common-shared.module.ts +20 -0
  20. package/src/lib/modules/common/custom-select/custom-select.component.html +42 -0
  21. package/src/lib/modules/common/custom-select/custom-select.component.scss +131 -0
  22. package/src/lib/modules/common/custom-select/custom-select.component.spec.ts +23 -0
  23. package/src/lib/modules/common/custom-select/custom-select.component.ts +149 -0
  24. package/src/lib/modules/common/filters/filters.component.html +76 -0
  25. package/src/lib/modules/common/filters/filters.component.scss +131 -0
  26. package/src/lib/modules/common/filters/filters.component.spec.ts +23 -0
  27. package/src/lib/modules/common/filters/filters.component.ts +181 -0
  28. package/src/lib/modules/common/pagination/pagination.component.html +26 -0
  29. package/src/lib/modules/common/pagination/pagination.component.scss +63 -0
  30. package/src/lib/modules/common/pagination/pagination.component.spec.ts +23 -0
  31. package/src/lib/modules/common/pagination/pagination.component.ts +46 -0
  32. package/src/lib/modules/errors/error403/error403.component.html +25 -0
  33. package/src/lib/modules/errors/error403/error403.component.scss +0 -0
  34. package/src/lib/modules/errors/error403/error403.component.spec.ts +23 -0
  35. package/src/lib/modules/errors/error403/error403.component.ts +28 -0
  36. package/src/lib/modules/errors/error404/error404.component.html +24 -0
  37. package/src/lib/modules/errors/error404/error404.component.scss +0 -0
  38. package/src/lib/modules/errors/error404/error404.component.spec.ts +25 -0
  39. package/src/lib/modules/errors/error404/error404.component.ts +50 -0
  40. package/src/lib/modules/errors/error500/error500.component.html +24 -0
  41. package/src/lib/modules/errors/error500/error500.component.scss +0 -0
  42. package/src/lib/modules/errors/error500/error500.component.spec.ts +25 -0
  43. package/src/lib/modules/errors/error500/error500.component.ts +50 -0
  44. package/src/lib/modules/errors/errors-routing.module.ts +40 -0
  45. package/src/lib/modules/errors/errors.component.html +15 -0
  46. package/src/lib/modules/errors/errors.component.scss +4 -0
  47. package/src/lib/modules/errors/errors.component.spec.ts +25 -0
  48. package/src/lib/modules/errors/errors.component.ts +42 -0
  49. package/src/lib/modules/errors/errors.module.ts +25 -0
  50. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.html +16 -0
  51. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.scss +0 -0
  52. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.spec.ts +23 -0
  53. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.ts +43 -0
  54. package/src/lib/modules/intro/contact-support/contact-support.component.html +30 -0
  55. package/src/lib/modules/intro/contact-support/contact-support.component.scss +60 -0
  56. package/src/lib/modules/intro/contact-support/contact-support.component.spec.ts +23 -0
  57. package/src/lib/modules/intro/contact-support/contact-support.component.ts +17 -0
  58. package/src/lib/modules/intro/intro-routing.module.ts +16 -0
  59. package/src/lib/modules/intro/intro.module.ts +21 -0
  60. package/src/lib/modules/intro/lead-intro/lead-intro.component.html +325 -0
  61. package/src/lib/modules/intro/lead-intro/lead-intro.component.scss +185 -0
  62. package/src/lib/modules/intro/lead-intro/lead-intro.component.spec.ts +23 -0
  63. package/src/lib/modules/intro/lead-intro/lead-intro.component.ts +120 -0
  64. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.html +44 -0
  65. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.scss +28 -0
  66. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.spec.ts +23 -0
  67. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.ts +24 -0
  68. package/src/lib/modules/layout/content/content.component.html +12 -0
  69. package/src/lib/modules/layout/content/content.component.scss +0 -0
  70. package/src/lib/modules/layout/content/content.component.ts +102 -0
  71. package/src/lib/modules/layout/footer/footer.component.html +29 -0
  72. package/src/lib/modules/layout/footer/footer.component.scss +7 -0
  73. package/src/lib/modules/layout/footer/footer.component.spec.ts +25 -0
  74. package/src/lib/modules/layout/footer/footer.component.ts +13 -0
  75. package/src/lib/modules/layout/header/header-menu/header-menu.component.html +27 -0
  76. package/src/lib/modules/layout/header/header-menu/header-menu.component.scss +4 -0
  77. package/src/lib/modules/layout/header/header-menu/header-menu.component.spec.ts +25 -0
  78. package/src/lib/modules/layout/header/header-menu/header-menu.component.ts +38 -0
  79. package/src/lib/modules/layout/header/header.component.html +90 -0
  80. package/src/lib/modules/layout/header/header.component.scss +7 -0
  81. package/src/lib/modules/layout/header/header.component.spec.ts +25 -0
  82. package/src/lib/modules/layout/header/header.component.ts +139 -0
  83. package/src/lib/modules/layout/header/navbar/navbar.component.html +156 -0
  84. package/src/lib/modules/layout/header/navbar/navbar.component.scss +223 -0
  85. package/src/lib/modules/layout/header/navbar/navbar.component.spec.ts +23 -0
  86. package/src/lib/modules/layout/header/navbar/navbar.component.ts +255 -0
  87. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.html +200 -0
  88. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.scss +139 -0
  89. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.ts +76 -0
  90. package/src/lib/modules/layout/header/page-title/page-title.component.html +32 -0
  91. package/src/lib/modules/layout/header/page-title/page-title.component.scss +11 -0
  92. package/src/lib/modules/layout/header/page-title/page-title.component.ts +47 -0
  93. package/src/lib/modules/layout/keenicon/icons.json +1 -0
  94. package/src/lib/modules/layout/keenicon/keenicon.component.html +4 -0
  95. package/src/lib/modules/layout/keenicon/keenicon.component.scss +0 -0
  96. package/src/lib/modules/layout/keenicon/keenicon.component.spec.ts +23 -0
  97. package/src/lib/modules/layout/keenicon/keenicon.component.ts +30 -0
  98. package/src/lib/modules/layout/layout/layout.component.html +71 -0
  99. package/src/lib/modules/layout/layout/layout.component.scss +23 -0
  100. package/src/lib/modules/layout/layout/layout.component.ts +425 -0
  101. package/src/lib/modules/layout/layout.module.ts +129 -0
  102. package/src/lib/modules/layout/scripts-init/scripts-init.component.html +0 -0
  103. package/src/lib/modules/layout/scripts-init/scripts-init.component.ts +81 -0
  104. package/src/lib/modules/layout/scroll-top/scroll-top.component.html +1 -0
  105. package/src/lib/modules/layout/scroll-top/scroll-top.component.ts +75 -0
  106. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.html +70 -0
  107. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.scss +57 -0
  108. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.spec.ts +23 -0
  109. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.ts +136 -0
  110. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.html +26 -0
  111. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.scss +0 -0
  112. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.spec.ts +23 -0
  113. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.ts +36 -0
  114. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.html +761 -0
  115. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.scss +38 -0
  116. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.spec.ts +23 -0
  117. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.ts +130 -0
  118. package/src/lib/modules/layout/sidebar/sidebar.component.html +16 -0
  119. package/src/lib/modules/layout/sidebar/sidebar.component.scss +3 -0
  120. package/src/lib/modules/layout/sidebar/sidebar.component.spec.ts +23 -0
  121. package/src/lib/modules/layout/sidebar/sidebar.component.ts +203 -0
  122. package/src/lib/modules/layout/toolbar/accounting/accounting.component.html +84 -0
  123. package/src/lib/modules/layout/toolbar/accounting/accounting.component.scss +0 -0
  124. package/src/lib/modules/layout/toolbar/accounting/accounting.component.spec.ts +23 -0
  125. package/src/lib/modules/layout/toolbar/accounting/accounting.component.ts +14 -0
  126. package/src/lib/modules/layout/toolbar/classic/classic.component.html +69 -0
  127. package/src/lib/modules/layout/toolbar/classic/classic.component.scss +238 -0
  128. package/src/lib/modules/layout/toolbar/classic/classic.component.spec.ts +23 -0
  129. package/src/lib/modules/layout/toolbar/classic/classic.component.ts +389 -0
  130. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.html +4 -0
  131. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.scss +3 -0
  132. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.spec.ts +23 -0
  133. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.ts +91 -0
  134. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.html +22 -0
  135. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.scss +156 -0
  136. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.spec.ts +23 -0
  137. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.ts +238 -0
  138. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.html +14 -0
  139. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.scss +149 -0
  140. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.spec.ts +23 -0
  141. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.ts +183 -0
  142. package/src/lib/modules/layout/toolbar/extended/extended.component.html +100 -0
  143. package/src/lib/modules/layout/toolbar/extended/extended.component.scss +0 -0
  144. package/src/lib/modules/layout/toolbar/extended/extended.component.spec.ts +23 -0
  145. package/src/lib/modules/layout/toolbar/extended/extended.component.ts +12 -0
  146. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.html +311 -0
  147. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.scss +311 -0
  148. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.spec.ts +23 -0
  149. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.ts +1555 -0
  150. package/src/lib/modules/layout/toolbar/reports/reports.component.html +62 -0
  151. package/src/lib/modules/layout/toolbar/reports/reports.component.scss +0 -0
  152. package/src/lib/modules/layout/toolbar/reports/reports.component.spec.ts +23 -0
  153. package/src/lib/modules/layout/toolbar/reports/reports.component.ts +14 -0
  154. package/src/lib/modules/layout/toolbar/saas/saas.component.html +77 -0
  155. package/src/lib/modules/layout/toolbar/saas/saas.component.scss +0 -0
  156. package/src/lib/modules/layout/toolbar/saas/saas.component.spec.ts +23 -0
  157. package/src/lib/modules/layout/toolbar/saas/saas.component.ts +14 -0
  158. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.html +26 -0
  159. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.scss +176 -0
  160. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.spec.ts +23 -0
  161. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.ts +235 -0
  162. package/src/lib/modules/layout/toolbar/single-store/single-store.component.html +39 -0
  163. package/src/lib/modules/layout/toolbar/single-store/single-store.component.scss +176 -0
  164. package/src/lib/modules/layout/toolbar/single-store/single-store.component.spec.ts +23 -0
  165. package/src/lib/modules/layout/toolbar/single-store/single-store.component.ts +188 -0
  166. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.html +17 -0
  167. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.scss +172 -0
  168. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.spec.ts +23 -0
  169. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.ts +179 -0
  170. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.html +4 -0
  171. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.scss +19 -0
  172. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.spec.ts +23 -0
  173. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.ts +105 -0
  174. package/src/lib/modules/layout/toolbar/toolbar.component.html +64 -0
  175. package/src/lib/modules/layout/toolbar/toolbar.component.scss +0 -0
  176. package/src/lib/modules/layout/toolbar/toolbar.component.spec.ts +25 -0
  177. package/src/lib/modules/layout/toolbar/toolbar.component.ts +400 -0
  178. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.html +259 -0
  179. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.scss +305 -0
  180. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.spec.ts +23 -0
  181. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.ts +1202 -0
  182. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.html +199 -0
  183. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.scss +311 -0
  184. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.spec.ts +23 -0
  185. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.ts +899 -0
  186. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.html +204 -0
  187. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.scss +311 -0
  188. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.spec.ts +23 -0
  189. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.ts +1045 -0
  190. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.html +190 -0
  191. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.scss +311 -0
  192. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.spec.ts +23 -0
  193. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.ts +825 -0
  194. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.html +259 -0
  195. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.scss +305 -0
  196. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.spec.ts +23 -0
  197. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.ts +1242 -0
  198. package/src/lib/modules/notification/conformation/conformation.component.html +25 -0
  199. package/src/lib/modules/notification/conformation/conformation.component.scss +0 -0
  200. package/src/lib/modules/notification/conformation/conformation.component.spec.ts +23 -0
  201. package/src/lib/modules/notification/conformation/conformation.component.ts +23 -0
  202. package/src/lib/modules/notification/notification/notification.component.html +209 -0
  203. package/src/lib/modules/notification/notification/notification.component.scss +211 -0
  204. package/src/lib/modules/notification/notification/notification.component.spec.ts +23 -0
  205. package/src/lib/modules/notification/notification/notification.component.ts +310 -0
  206. package/src/lib/modules/notification/notification-routing.module.ts +20 -0
  207. package/src/lib/modules/notification/notification.module.ts +21 -0
  208. package/src/lib/pipes/customDate.pipe.ts +18 -0
  209. package/src/lib/routes/route-wraper-modules/analyse-wrapper.module.ts +12 -0
  210. package/src/lib/routes/route-wraper-modules/edge-wrapper.module.ts +11 -0
  211. package/src/lib/routes/route-wraper-modules/manage-wrapper.module.ts +11 -0
  212. package/src/lib/routes/route-wraper-modules/profile-wrapper.module.ts +12 -0
  213. package/src/lib/routes/route-wraper-modules/store-wrapper.module.ts +11 -0
  214. package/src/lib/routes/route-wraper-modules/ticket-wrapper.module.ts +10 -0
  215. package/src/lib/routes/routing.ts +56 -0
  216. package/src/lib/services/auth.service.ts +178 -0
  217. package/src/lib/services/notification.service.spec.ts +16 -0
  218. package/src/lib/services/notification.service.ts +73 -0
  219. package/src/lib/services/toast.service.ts +82 -0
  220. package/{public-api.d.ts → src/public-api.ts} +71 -44
  221. package/tsconfig.lib.json +14 -0
  222. package/tsconfig.lib.prod.json +10 -0
  223. package/tsconfig.spec.json +14 -0
  224. package/esm2022/lib/guards/auth.guard.mjs +0 -26
  225. package/esm2022/lib/guards/lead.guard.mjs +0 -16
  226. package/esm2022/lib/guards/stores.guard.mjs +0 -16
  227. package/esm2022/lib/guards/tickets.guard.mjs +0 -16
  228. package/esm2022/lib/i18n/index.mjs +0 -3
  229. package/esm2022/lib/i18n/translation.module.mjs +0 -17
  230. package/esm2022/lib/i18n/translation.service.mjs +0 -53
  231. package/esm2022/lib/i18n/vocabs/ch.mjs +0 -106
  232. package/esm2022/lib/i18n/vocabs/de.mjs +0 -106
  233. package/esm2022/lib/i18n/vocabs/en.mjs +0 -106
  234. package/esm2022/lib/i18n/vocabs/es.mjs +0 -106
  235. package/esm2022/lib/i18n/vocabs/fr.mjs +0 -106
  236. package/esm2022/lib/i18n/vocabs/jp.mjs +0 -106
  237. package/esm2022/lib/interceptors/http-auth-interceptor.mjs +0 -124
  238. package/esm2022/lib/interfaces/global-state.mjs +0 -2
  239. package/esm2022/lib/modules/common/common-shared.module.mjs +0 -31
  240. package/esm2022/lib/modules/common/custom-select/custom-select.component.mjs +0 -155
  241. package/esm2022/lib/modules/common/filters/filters.component.mjs +0 -179
  242. package/esm2022/lib/modules/common/pagination/pagination.component.mjs +0 -49
  243. package/esm2022/lib/modules/errors/error403/error403.component.mjs +0 -33
  244. package/esm2022/lib/modules/errors/error404/error404.component.mjs +0 -44
  245. package/esm2022/lib/modules/errors/error500/error500.component.mjs +0 -45
  246. package/esm2022/lib/modules/errors/errors-routing.module.mjs +0 -48
  247. package/esm2022/lib/modules/errors/errors.component.mjs +0 -39
  248. package/esm2022/lib/modules/errors/errors.module.mjs +0 -37
  249. package/esm2022/lib/modules/errors/invalid-ip/invalid-ip.component.mjs +0 -44
  250. package/esm2022/lib/modules/intro/contact-support/contact-support.component.mjs +0 -19
  251. package/esm2022/lib/modules/intro/intro-routing.module.mjs +0 -24
  252. package/esm2022/lib/modules/intro/intro.module.mjs +0 -32
  253. package/esm2022/lib/modules/intro/lead-intro/lead-intro.component.mjs +0 -110
  254. package/esm2022/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.mjs +0 -31
  255. package/esm2022/lib/modules/layout/content/content.component.mjs +0 -107
  256. package/esm2022/lib/modules/layout/footer/footer.component.mjs +0 -17
  257. package/esm2022/lib/modules/layout/header/header-menu/header-menu.component.mjs +0 -41
  258. package/esm2022/lib/modules/layout/header/header.component.mjs +0 -100
  259. package/esm2022/lib/modules/layout/header/navbar/navbar.component.mjs +0 -256
  260. package/esm2022/lib/modules/layout/header/notifications-inner/notifications-inner.component.mjs +0 -79
  261. package/esm2022/lib/modules/layout/header/page-title/page-title.component.mjs +0 -56
  262. package/esm2022/lib/modules/layout/keenicon/icons.json +0 -1
  263. package/esm2022/lib/modules/layout/keenicon/keenicon.component.mjs +0 -37
  264. package/esm2022/lib/modules/layout/layout/layout.component.mjs +0 -314
  265. package/esm2022/lib/modules/layout/layout.module.mjs +0 -195
  266. package/esm2022/lib/modules/layout/scripts-init/scripts-init.component.mjs +0 -74
  267. package/esm2022/lib/modules/layout/scroll-top/scroll-top.component.mjs +0 -74
  268. package/esm2022/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.mjs +0 -159
  269. package/esm2022/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.mjs +0 -45
  270. package/esm2022/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.mjs +0 -119
  271. package/esm2022/lib/modules/layout/sidebar/sidebar.component.mjs +0 -134
  272. package/esm2022/lib/modules/layout/toolbar/accounting/accounting.component.mjs +0 -16
  273. package/esm2022/lib/modules/layout/toolbar/classic/classic.component.mjs +0 -331
  274. package/esm2022/lib/modules/layout/toolbar/client-settings/client-settings.component.mjs +0 -88
  275. package/esm2022/lib/modules/layout/toolbar/date-single-select/date-single-select.component.mjs +0 -201
  276. package/esm2022/lib/modules/layout/toolbar/datepicker/datepicker.component.mjs +0 -150
  277. package/esm2022/lib/modules/layout/toolbar/extended/extended.component.mjs +0 -15
  278. package/esm2022/lib/modules/layout/toolbar/metrics-header/metrics-header.component.mjs +0 -1321
  279. package/esm2022/lib/modules/layout/toolbar/reports/reports.component.mjs +0 -18
  280. package/esm2022/lib/modules/layout/toolbar/saas/saas.component.mjs +0 -18
  281. package/esm2022/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.mjs +0 -216
  282. package/esm2022/lib/modules/layout/toolbar/single-store/single-store.component.mjs +0 -176
  283. package/esm2022/lib/modules/layout/toolbar/single-storedate/single-storedate.component.mjs +0 -166
  284. package/esm2022/lib/modules/layout/toolbar/storesingle/storesingle.component.mjs +0 -105
  285. package/esm2022/lib/modules/layout/toolbar/toolbar.component.mjs +0 -354
  286. package/esm2022/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.mjs +0 -1061
  287. package/esm2022/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.mjs +0 -795
  288. package/esm2022/lib/modules/layout/toolbar/trax-header/trax-header.component.mjs +0 -880
  289. package/esm2022/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.mjs +0 -729
  290. package/esm2022/lib/modules/notification/conformation/conformation.component.mjs +0 -22
  291. package/esm2022/lib/modules/notification/notification/notification.component.mjs +0 -317
  292. package/esm2022/lib/modules/notification/notification-routing.module.mjs +0 -28
  293. package/esm2022/lib/modules/notification/notification.module.mjs +0 -32
  294. package/esm2022/lib/pipes/customDate.pipe.mjs +0 -22
  295. package/esm2022/lib/routes/route-wraper-modules/edge-wrapper.module.mjs +0 -18
  296. package/esm2022/lib/routes/route-wraper-modules/eyetest-wrapper.module.mjs +0 -18
  297. package/esm2022/lib/routes/route-wraper-modules/manage-wrapper.module.mjs +0 -18
  298. package/esm2022/lib/routes/route-wraper-modules/profile-wrapper.module.mjs +0 -18
  299. package/esm2022/lib/routes/route-wraper-modules/store-wrapper.module.mjs +0 -18
  300. package/esm2022/lib/routes/route-wraper-modules/ticket-wrapper.module.mjs +0 -18
  301. package/esm2022/lib/routes/routing.mjs +0 -58
  302. package/esm2022/lib/services/auth.service.mjs +0 -141
  303. package/esm2022/lib/services/notification.service.mjs +0 -74
  304. package/esm2022/lib/services/toast.service.mjs +0 -83
  305. package/esm2022/public-api.mjs +0 -56
  306. package/esm2022/tango-app-ui-shared.mjs +0 -5
  307. package/fesm2022/tango-app-ui-shared-edge-wrapper.module-CFDk0tvS.mjs +0 -21
  308. package/fesm2022/tango-app-ui-shared-edge-wrapper.module-CFDk0tvS.mjs.map +0 -1
  309. package/fesm2022/tango-app-ui-shared-eyetest-wrapper.module-CfO814JB.mjs +0 -21
  310. package/fesm2022/tango-app-ui-shared-eyetest-wrapper.module-CfO814JB.mjs.map +0 -1
  311. package/fesm2022/tango-app-ui-shared-intro.module-DYh4ZRha.mjs +0 -188
  312. package/fesm2022/tango-app-ui-shared-intro.module-DYh4ZRha.mjs.map +0 -1
  313. package/fesm2022/tango-app-ui-shared-manage-wrapper.module-BHyh4Njw.mjs +0 -21
  314. package/fesm2022/tango-app-ui-shared-manage-wrapper.module-BHyh4Njw.mjs.map +0 -1
  315. package/fesm2022/tango-app-ui-shared-notification.module-C5ZmCf8U.mjs +0 -400
  316. package/fesm2022/tango-app-ui-shared-notification.module-C5ZmCf8U.mjs.map +0 -1
  317. package/fesm2022/tango-app-ui-shared-profile-wrapper.module-BNC1AGOk.mjs +0 -21
  318. package/fesm2022/tango-app-ui-shared-profile-wrapper.module-BNC1AGOk.mjs.map +0 -1
  319. package/fesm2022/tango-app-ui-shared-store-wrapper.module-DdaCYHdv.mjs +0 -21
  320. package/fesm2022/tango-app-ui-shared-store-wrapper.module-DdaCYHdv.mjs.map +0 -1
  321. package/fesm2022/tango-app-ui-shared-ticket-wrapper.module-r32uKkDO.mjs +0 -21
  322. package/fesm2022/tango-app-ui-shared-ticket-wrapper.module-r32uKkDO.mjs.map +0 -1
  323. package/fesm2022/tango-app-ui-shared.mjs +0 -11322
  324. package/fesm2022/tango-app-ui-shared.mjs.map +0 -1
  325. package/index.d.ts +0 -5
  326. package/lib/guards/auth.guard.d.ts +0 -10
  327. package/lib/guards/lead.guard.d.ts +0 -2
  328. package/lib/guards/stores.guard.d.ts +0 -2
  329. package/lib/guards/tickets.guard.d.ts +0 -2
  330. package/lib/i18n/translation.module.d.ts +0 -8
  331. package/lib/i18n/translation.service.d.ts +0 -19
  332. package/lib/i18n/vocabs/ch.d.ts +0 -104
  333. package/lib/i18n/vocabs/de.d.ts +0 -104
  334. package/lib/i18n/vocabs/en.d.ts +0 -104
  335. package/lib/i18n/vocabs/es.d.ts +0 -104
  336. package/lib/i18n/vocabs/fr.d.ts +0 -104
  337. package/lib/i18n/vocabs/jp.d.ts +0 -104
  338. package/lib/interceptors/http-auth-interceptor.d.ts +0 -19
  339. package/lib/interfaces/global-state.d.ts +0 -5
  340. package/lib/modules/common/common-shared.module.d.ts +0 -13
  341. package/lib/modules/common/custom-select/custom-select.component.d.ts +0 -33
  342. package/lib/modules/common/filters/filters.component.d.ts +0 -38
  343. package/lib/modules/common/pagination/pagination.component.d.ts +0 -18
  344. package/lib/modules/errors/error403/error403.component.d.ts +0 -14
  345. package/lib/modules/errors/error404/error404.component.d.ts +0 -15
  346. package/lib/modules/errors/error500/error500.component.d.ts +0 -15
  347. package/lib/modules/errors/errors-routing.module.d.ts +0 -7
  348. package/lib/modules/errors/errors.component.d.ts +0 -13
  349. package/lib/modules/errors/errors.module.d.ts +0 -13
  350. package/lib/modules/errors/invalid-ip/invalid-ip.component.d.ts +0 -17
  351. package/lib/modules/intro/contact-support/contact-support.component.d.ts +0 -9
  352. package/lib/modules/intro/intro-routing.module.d.ts +0 -7
  353. package/lib/modules/intro/intro.module.d.ts +0 -11
  354. package/lib/modules/intro/lead-intro/lead-intro.component.d.ts +0 -31
  355. package/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.d.ts +0 -13
  356. package/lib/modules/layout/content/content.component.d.ts +0 -25
  357. package/lib/modules/layout/footer/footer.component.d.ts +0 -8
  358. package/lib/modules/layout/header/header-menu/header-menu.component.d.ts +0 -18
  359. package/lib/modules/layout/header/header.component.d.ts +0 -30
  360. package/lib/modules/layout/header/navbar/navbar.component.d.ts +0 -45
  361. package/lib/modules/layout/header/notifications-inner/notifications-inner.component.d.ts +0 -25
  362. package/lib/modules/layout/header/page-title/page-title.component.d.ts +0 -23
  363. package/lib/modules/layout/keenicon/keenicon.component.d.ts +0 -13
  364. package/lib/modules/layout/layout/layout.component.d.ts +0 -82
  365. package/lib/modules/layout/layout.module.d.ts +0 -49
  366. package/lib/modules/layout/scripts-init/scripts-init.component.d.ts +0 -19
  367. package/lib/modules/layout/scroll-top/scroll-top.component.d.ts +0 -19
  368. package/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.d.ts +0 -45
  369. package/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.d.ts +0 -19
  370. package/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.d.ts +0 -26
  371. package/lib/modules/layout/sidebar/sidebar.component.d.ts +0 -36
  372. package/lib/modules/layout/toolbar/accounting/accounting.component.d.ts +0 -8
  373. package/lib/modules/layout/toolbar/classic/classic.component.d.ts +0 -48
  374. package/lib/modules/layout/toolbar/client-settings/client-settings.component.d.ts +0 -16
  375. package/lib/modules/layout/toolbar/date-single-select/date-single-select.component.d.ts +0 -28
  376. package/lib/modules/layout/toolbar/datepicker/datepicker.component.d.ts +0 -28
  377. package/lib/modules/layout/toolbar/extended/extended.component.d.ts +0 -8
  378. package/lib/modules/layout/toolbar/metrics-header/metrics-header.component.d.ts +0 -103
  379. package/lib/modules/layout/toolbar/reports/reports.component.d.ts +0 -9
  380. package/lib/modules/layout/toolbar/saas/saas.component.d.ts +0 -9
  381. package/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.d.ts +0 -32
  382. package/lib/modules/layout/toolbar/single-store/single-store.component.d.ts +0 -33
  383. package/lib/modules/layout/toolbar/single-storedate/single-storedate.component.d.ts +0 -34
  384. package/lib/modules/layout/toolbar/storesingle/storesingle.component.d.ts +0 -24
  385. package/lib/modules/layout/toolbar/toolbar.component.d.ts +0 -56
  386. package/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.d.ts +0 -93
  387. package/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.d.ts +0 -80
  388. package/lib/modules/layout/toolbar/trax-header/trax-header.component.d.ts +0 -83
  389. package/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.d.ts +0 -74
  390. package/lib/modules/notification/conformation/conformation.component.d.ts +0 -10
  391. package/lib/modules/notification/notification/notification.component.d.ts +0 -63
  392. package/lib/modules/notification/notification-routing.module.d.ts +0 -7
  393. package/lib/modules/notification/notification.module.d.ts +0 -11
  394. package/lib/pipes/customDate.pipe.d.ts +0 -7
  395. package/lib/routes/route-wraper-modules/edge-wrapper.module.d.ts +0 -7
  396. package/lib/routes/route-wraper-modules/eyetest-wrapper.module.d.ts +0 -7
  397. package/lib/routes/route-wraper-modules/manage-wrapper.module.d.ts +0 -7
  398. package/lib/routes/route-wraper-modules/profile-wrapper.module.d.ts +0 -7
  399. package/lib/routes/route-wraper-modules/store-wrapper.module.d.ts +0 -7
  400. package/lib/routes/route-wraper-modules/ticket-wrapper.module.d.ts +0 -7
  401. package/lib/routes/routing.d.ts +0 -3
  402. package/lib/services/auth.service.d.ts +0 -49
  403. package/lib/services/notification.service.d.ts +0 -30
  404. package/lib/services/toast.service.d.ts +0 -10
@@ -1,729 +0,0 @@
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 TraxWithoutdateComponent {
12
- auth;
13
- router;
14
- gs;
15
- cd;
16
- dayjs = dayjs;
17
- isCustomDate = (m) => {
18
- const isValidDate = m > this.dayjs();
19
- return isValidDate ? "invalid-date" : false;
20
- };
21
- selectedDateRange = { startDate: dayjs().subtract(30, 'days'),
22
- endDate: dayjs().subtract(1, "days"), };
23
- selectedFilters = {
24
- client: null,
25
- clientName: null,
26
- clients: [],
27
- store: null,
28
- stores: [],
29
- date: null,
30
- group: [],
31
- location: [],
32
- };
33
- Opendropdown = false;
34
- dropdownOpen = null; // 'location' or 'group'
35
- searchLocationText = "";
36
- searchGroupText = "";
37
- locations = [];
38
- filteredLocations = [];
39
- groupsData = [];
40
- filteredGroups = [];
41
- filteredStores = [];
42
- stores = [];
43
- searchStoreText = '';
44
- clientList = [];
45
- selectedClient;
46
- locationLabel = [];
47
- groupLabel = [];
48
- users;
49
- url;
50
- constructor(auth, router, gs, cd) {
51
- this.auth = auth;
52
- this.router = router;
53
- this.gs = gs;
54
- this.cd = cd;
55
- }
56
- onClick(event) {
57
- const target = event.target;
58
- if (!target.closest('.dropdown1')) {
59
- this.Opendropdown = false;
60
- }
61
- }
62
- closeDropdown1() {
63
- this.Opendropdown = false;
64
- }
65
- ngOnInit() {
66
- this.url = this.router.url.split("?")[0].split('/');
67
- const user = JSON.parse(localStorage.getItem('user-info'));
68
- this.users = user;
69
- this.gs?.manageRefreshTrigger?.subscribe((e) => {
70
- if (e) {
71
- if (user.userType === 'tango') {
72
- this.getClient();
73
- }
74
- else {
75
- const storedFilters = localStorage.getItem("header-filters");
76
- if (storedFilters) {
77
- const headerFilters = JSON.parse(storedFilters);
78
- this.filteredStores = headerFilters?.stores.map((store) => ({
79
- ...store,
80
- checked: store.checked
81
- }));
82
- }
83
- }
84
- }
85
- });
86
- if (user.userType === 'tango') {
87
- this.getClient();
88
- }
89
- else {
90
- this.getLocations();
91
- this.getGroups();
92
- this.getStore();
93
- }
94
- const storedFilters = localStorage.getItem("header-filters");
95
- if (storedFilters) {
96
- const headerFilters = JSON.parse(storedFilters);
97
- // Initialize selectedFilters with defaults or existing values
98
- this.selectedFilters = {
99
- client: headerFilters.client || this.users.client,
100
- clientName: headerFilters.clientName || '',
101
- clients: headerFilters.clients || [],
102
- store: headerFilters.store || null,
103
- date: headerFilters.date || {},
104
- stores: headerFilters.stores || [],
105
- group: headerFilters.group || [],
106
- location: headerFilters.location || []
107
- };
108
- // Sync filtered data with stored selections
109
- this.filteredLocations = this.syncWithLocalStorage(headerFilters.location);
110
- this.filteredGroups = this.syncWithLocalStorage(headerFilters.group);
111
- this.filteredStores = this.syncWithLocalStorage(headerFilters.stores);
112
- // Format date range if it exists
113
- // Emit data via service and update localStorage
114
- this.emitAndStoreFilters();
115
- }
116
- else {
117
- // Initialize empty states if no header filters are present in localStorage
118
- this.resetFilters();
119
- }
120
- }
121
- syncWithLocalStorage(items) {
122
- return items
123
- ? items.map((item) => ({
124
- ...item,
125
- checked: item.checked === true
126
- }))
127
- : [];
128
- }
129
- emitAndStoreFilters() {
130
- this.gs.dataRangeValue.next(this.selectedFilters);
131
- localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
132
- }
133
- resetFilters() {
134
- this.selectedFilters = {
135
- client: null,
136
- clientName: '',
137
- clients: [],
138
- store: null,
139
- date: {},
140
- stores: [],
141
- group: [],
142
- location: []
143
- };
144
- this.filteredLocations = [];
145
- this.filteredGroups = [];
146
- this.filteredStores = [];
147
- }
148
- getClient() {
149
- this.auth.getClients().subscribe({
150
- next: (e) => {
151
- if (e) {
152
- this.clientList = e.data.result;
153
- const headerFilters = JSON.parse(localStorage.getItem("header-filters") || "{}");
154
- if (headerFilters.client) {
155
- this.clientList.find((obj) => {
156
- if (obj.clientId === headerFilters.client) {
157
- this.selectedClient = obj;
158
- }
159
- });
160
- this.selectedFilters.client = headerFilters.client;
161
- this.selectedFilters.clientName = headerFilters.clientName;
162
- this.selectedFilters.clients = headerFilters.clients;
163
- this.selectedFilters.store = headerFilters.store;
164
- this.selectedFilters.date = headerFilters.date;
165
- this.selectedFilters.stores = headerFilters.stores;
166
- this.selectedFilters.group = headerFilters.group;
167
- this.selectedFilters.location = headerFilters.location;
168
- this.gs.dataRangeValue.next(this.selectedFilters);
169
- // Ensure locations and groups are loaded before fetching stores
170
- this.getLocations();
171
- this.getGroups();
172
- // Fetch stores only after locations and groups are set
173
- this.getStore();
174
- }
175
- else {
176
- this.selectedClient = this.clientList[0];
177
- this.selectedFilters.client = this.selectedClient.clientId;
178
- this.selectedFilters.clientName = this.selectedClient.clientName;
179
- this.selectedFilters.clients = headerFilters.clients;
180
- this.selectedFilters.store = headerFilters.store;
181
- this.selectedFilters.date = headerFilters.date;
182
- this.selectedFilters.stores = headerFilters.stores;
183
- this.selectedFilters.group = headerFilters.group;
184
- this.selectedFilters.location = headerFilters.location;
185
- localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
186
- this.gs.dataRangeValue.next(this.selectedFilters);
187
- this.cd.detectChanges();
188
- // Ensure locations and groups are loaded before fetching stores
189
- this.getLocations();
190
- this.getGroups();
191
- // Fetch stores only after locations and groups are set
192
- this.getStore();
193
- }
194
- }
195
- else {
196
- this.selectedClient = this.clientList[0];
197
- this.selectedFilters.client = this.selectedClient.clientId;
198
- this.selectedFilters.clientName = this.selectedClient.clientName;
199
- // Ensure locations and groups are loaded before fetching stores
200
- this.getLocations();
201
- this.getGroups();
202
- // Fetch stores only after locations and groups are set
203
- this.getStore();
204
- localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
205
- this.gs.dataRangeValue.next(this.selectedFilters);
206
- // console.log("4")
207
- this.cd.detectChanges();
208
- }
209
- },
210
- });
211
- }
212
- onClientSelect(event) {
213
- // Update the selected client
214
- this.selectedClient = event;
215
- // Clear previous filtered data and selections
216
- this.filteredGroups = [];
217
- this.filteredStores = [];
218
- this.filteredLocations = [];
219
- this.selectedFilters.stores = [];
220
- this.selectedFilters.group = [];
221
- this.selectedFilters.location = [];
222
- // Fetch header filters from localStorage
223
- const headerFilters = JSON.parse(localStorage.getItem("header-filters") || "{}");
224
- // Update the selected filters with the new client
225
- this.selectedFilters.client = this.selectedClient.clientId;
226
- this.selectedFilters.clientName = this.selectedClient.clientName;
227
- // Remove old store, group, and location data from the header filters
228
- delete headerFilters.stores;
229
- delete headerFilters.groups;
230
- delete headerFilters.location;
231
- // Fetch new data based on the new client
232
- this.getLocations();
233
- this.getStore();
234
- this.getGroups();
235
- // Update localStorage with the new client selection and empty filter data
236
- localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
237
- window.location.reload();
238
- this.cd.detectChanges();
239
- }
240
- opendropdown(e) {
241
- e.stopPropagation();
242
- this.Opendropdown = !this.Opendropdown;
243
- }
244
- getLocations() {
245
- // const headerFilters: any = JSON.parse(localStorage.getItem("header-filters") || "{}");
246
- let obj = {
247
- clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId,
248
- city: [],
249
- group: [],
250
- };
251
- this.auth.getLocation(obj).subscribe({
252
- next: (res) => {
253
- let cityList = this.selectedFilters?.location?.filter((location) => location.checked).map((loc) => loc.city);
254
- // Map the fetched locations with default unchecked state
255
- this.locations = res?.data?.locationData.map((city) => ({
256
- city: city.city,
257
- checked: cityList?.includes(city.city) ? true : false,
258
- }));
259
- // Sync the fetched locations with any stored checked values in localStorage
260
- if (this.selectedFilters.location && Array.isArray(this.selectedFilters.location)) {
261
- this.filteredLocations = this.locations.map(location => {
262
- const matchedLocation = this.selectedFilters.location.find((loc) => loc.city === location.city);
263
- return matchedLocation ? { ...location, checked: matchedLocation.checked } : location;
264
- });
265
- }
266
- else {
267
- this.filteredLocations = this.locations;
268
- }
269
- if (this.searchLocationText) {
270
- this.filteredLocations = this.locations.filter((location) => location.city.toLowerCase().includes(this.searchLocationText.toLowerCase()));
271
- }
272
- const selectedLocations = this.locations.filter((location) => location.checked).map((location) => location.city);
273
- if (selectedLocations.length > 0) {
274
- setTimeout(() => {
275
- this.getStore(); // Fetch stores based on selected groups
276
- }, 1000);
277
- }
278
- },
279
- error: (err) => {
280
- console.error("Failed to fetch locations", err);
281
- },
282
- });
283
- }
284
- isAllLocationsSelected() {
285
- return this.filteredLocations.every(location => location.checked);
286
- }
287
- selectedLocationsLabel() {
288
- const selectedLocations = this.locationLabel = this.searchLocationText.length ? this.locations
289
- .filter(location => location.checked).map(location => location.city) : this.filteredLocations
290
- .filter(location => location.checked).map(location => location.city);
291
- return selectedLocations.length === 0
292
- ? ''
293
- : selectedLocations.length === 1
294
- ? selectedLocations[0]
295
- : `${selectedLocations.length} locations`;
296
- }
297
- removeLocation() {
298
- this.Reset();
299
- }
300
- getGroups() {
301
- const city = this.locations
302
- .filter(location => location.checked)
303
- .map(location => location.city);
304
- const obj = { city, clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId, group: [] };
305
- this.auth.getGroups(obj).subscribe({
306
- next: (res) => {
307
- let checkedGroup = this.selectedFilters?.group?.filter((group) => group.checked).map((group) => group.groupName);
308
- const combinedGroups = res?.data?.groupData?.map((groupName) => ({
309
- groupName: groupName.groupName,
310
- checked: checkedGroup?.includes(groupName.groupName) ? true : false,
311
- }));
312
- this.groupsData = combinedGroups;
313
- if (this.searchGroupText.length) {
314
- this.filteredGroups = combinedGroups.filter((item) => item.groupName.toLowerCase().includes(this.searchGroupText));
315
- }
316
- else {
317
- this.filteredGroups = combinedGroups;
318
- }
319
- // Auto-fetch stores when groups are selected
320
- const selectedGroups = this.groupsData.filter((group) => group.checked).map((group) => group.groupName);
321
- if (selectedGroups.length > 0) {
322
- setTimeout(() => {
323
- this.getStore(); // Fetch stores based on selected groups
324
- }, 1000);
325
- }
326
- },
327
- error: (err) => {
328
- console.error("Failed to fetch groups", err);
329
- },
330
- });
331
- }
332
- toggleDropdown(type) {
333
- if (this.dropdownOpen === type) {
334
- // If the dropdown is open, close it and avoid resetting the selected values unnecessarily
335
- this.dropdownOpen = null;
336
- }
337
- else {
338
- // Open the specific dropdown and handle data fetching only if necessary
339
- this.dropdownOpen = type;
340
- if (type === 'group') {
341
- // Fetch groups only if there are selected cities and no active search text
342
- const selectedCities = this.locations
343
- .filter((location) => location.checked)
344
- .map((location) => location.city);
345
- // Fetch groups only if locations are selected, no search text exists, and dropdown is opened
346
- if (this.filteredLocations.length > 0 || (selectedCities.length > 0 && !this.searchGroupText.trim())) {
347
- this.getGroups();
348
- }
349
- else {
350
- this.filteredGroups = []; // Clear groups if no locations are selected
351
- }
352
- }
353
- if (type === 'store') {
354
- // Fetch stores only if not already fetched and no search text is active
355
- if ((!this.filteredStores || this.filteredStores.length === 0) && !this.searchStoreText.trim()) {
356
- this.getStore();
357
- }
358
- }
359
- }
360
- }
361
- handleGroupDropdownClick() {
362
- if (this.dropdownOpen === 'group') {
363
- this.resetSelectedGroups();
364
- }
365
- this.toggleDropdown('group');
366
- }
367
- resetSelectedGroups() {
368
- this.filteredGroups.forEach((group) => (group.checked = false));
369
- this.searchGroupText = "";
370
- }
371
- selectedGroupsLabel() {
372
- const selectedGroups = this.groupLabel = this.searchGroupText.length ? this.groupsData.filter((group) => group.checked) : this.filteredGroups.filter((group) => group.checked);
373
- return selectedGroups.length === 0
374
- ? ""
375
- : selectedGroups.length === 1
376
- ? selectedGroups[0].groupName
377
- : `${selectedGroups.length} Clusters`;
378
- }
379
- removeGroup() {
380
- this.Reset();
381
- }
382
- isAllGroupsSelected() {
383
- return this.filteredGroups.length ? this.filteredGroups.every((group) => group.checked) : false;
384
- }
385
- getStore() {
386
- const city = this.locations
387
- .filter(location => location.checked)
388
- .map(location => location.city);
389
- const group = this.groupsData
390
- .filter(group => group.checked)
391
- .map(group => group.groupName);
392
- const data = { city, clusters: group, clientId: this.users.clientId ? this.users.clientId : this.selectedFilters.client };
393
- this.auth.getHeadertraxStores(data).subscribe({
394
- next: (res) => {
395
- if (res && res.code === 200) {
396
- this.stores = res.data.storesData;
397
- // Retrieve checked store IDs from selectedFilters
398
- const checkedStoreIds = this.selectedFilters?.stores
399
- ? this.selectedFilters.stores.filter((store) => store.checked).map((store) => store.storeId)
400
- : [];
401
- this.stores.forEach(store => {
402
- if (checkedStoreIds.includes(store.storeId)) {
403
- store.checked = true; // Sync the checked state with full store list
404
- }
405
- });
406
- // Map the stores and retain the 'checked' status
407
- if (this.searchStoreText.length) {
408
- this.filteredStores = this.stores?.filter(store => store.storeName.toLowerCase().includes(this.searchStoreText));
409
- }
410
- else {
411
- this.filteredStores = this.stores;
412
- }
413
- // Ensure selectedFilters is in sync with filteredStores
414
- if (!this.selectedFilters.stores || !this.selectedFilters.stores.length) {
415
- this.stores.forEach(store => {
416
- store.checked = true; // Sync the checked state with full store list
417
- });
418
- // No previously selected stores, mark all as checked
419
- this.filteredStores = this.selectedFilters.stores = this.filteredStores.map(store => ({
420
- ...store,
421
- checked: true
422
- }));
423
- }
424
- else {
425
- // Update selectedFilters to reflect current state of stores
426
- this.selectedFilters.stores = this.filteredStores.map(store => ({
427
- ...store,
428
- checked: store.checked
429
- }));
430
- }
431
- // Update localStorage with the latest selectedFilters
432
- localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
433
- // Emit data via service
434
- // this.gs.dataRangeValue.next(this.selectedFilters);
435
- // Trigger change detection to reflect changes in the UI
436
- this.cd.detectChanges();
437
- }
438
- else {
439
- this.stores = [];
440
- this.selectedFilters.stores = [];
441
- this.filteredStores = [];
442
- this.selectedFilters.stores = this.filteredStores.map(store => ({
443
- ...store,
444
- checked: false
445
- }));
446
- localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
447
- }
448
- },
449
- error: (err) => {
450
- this.stores = [];
451
- this.selectedFilters.stores = [];
452
- this.filteredStores = [];
453
- this.selectedFilters.stores = this.filteredStores.map(store => ({
454
- ...store,
455
- checked: false
456
- }));
457
- localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
458
- console.error("Failed to fetch stores", err);
459
- },
460
- });
461
- }
462
- resetSelectedStores() {
463
- this.filteredStores.forEach((store) => (store.checked = false));
464
- this.searchStoreText = "";
465
- }
466
- selectedStoresLabel() {
467
- const selectedStores = this.searchStoreText.length ? this.stores.filter((store) => store.checked) : this.filteredStores.filter((store) => store.checked);
468
- return selectedStores.length === 0
469
- ? "0 Stores"
470
- : selectedStores.length === 1
471
- ? selectedStores[0].storeName
472
- : `${selectedStores.length} Stores`;
473
- }
474
- isAllStoresSelected() {
475
- return this.filteredStores.length > 0 && this.filteredStores.every(store => store.checked);
476
- }
477
- // Method to handle dropdown item selection
478
- updateSelectedStores() {
479
- this.filteredStores.forEach(store => {
480
- const filteredStore = this.stores.findIndex(fStore => fStore.storeId === store.storeId);
481
- if (filteredStore != -1) {
482
- this.stores[filteredStore].checked = store.checked; // Sync the checked state with full store list
483
- }
484
- });
485
- // Update selectedFilters based on the current store selection
486
- this.selectedFilters.stores = this.stores.filter(store => store.checked);
487
- // Update localStorage with the latest selection
488
- localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
489
- // Emit updated filters via service
490
- // this.gs.dataRangeValue.next(this.selectedFilters);
491
- // Trigger change detection if necessary
492
- this.cd.detectChanges();
493
- }
494
- toggleSelectAllLocations(event) {
495
- const isChecked = event.target.checked;
496
- this.filteredLocations.forEach((location) => (location.checked = isChecked));
497
- this.updateSelectedLocations();
498
- }
499
- toggleSelectAllStores(event) {
500
- const checked = event.target.checked;
501
- // Apply the selection to both filtered and full list of stores
502
- this.filteredStores.forEach(store => store.checked = checked);
503
- this.stores.forEach(store => {
504
- const filteredStore = this.filteredStores.find(fStore => fStore.storeId === store.storeId);
505
- if (filteredStore) {
506
- store.checked = checked; // Sync the checked state with full store list
507
- }
508
- });
509
- // Update the selected stores and persist the selection
510
- this.updateSelectedStores();
511
- }
512
- updateSelectedLocations() {
513
- // When locations are selected, fetch the related groups
514
- const selectedCities = this.filteredLocations
515
- .filter((location) => location.checked)
516
- .map((location) => location.city);
517
- this.filteredLocations.forEach((location) => {
518
- let findLocationIndex = this.locations.findIndex((loc) => loc.city == location.city);
519
- if (findLocationIndex != -1) {
520
- this.locations[findLocationIndex].checked = location.checked;
521
- }
522
- });
523
- if (selectedCities.length > 0 || !selectedCities.length) {
524
- this.selectedFilters.stores = [];
525
- this.groupsData = [];
526
- this.getGroups(); // Fetch groups based on selected cities
527
- // If there are selected groups, fetch the stores based on selected groups
528
- this.getStore();
529
- this.selectedFilters.location = this.locations;
530
- }
531
- else {
532
- this.filteredGroups = []; // Clear groups if no locations are selected
533
- this.selectedFilters.location = [];
534
- }
535
- this.selectedFilters.group = [];
536
- this.filteredStores = []; // Reset stores as well
537
- this.searchGroupText = '';
538
- this.searchStoreText = '';
539
- // this.Opendropdown = false;
540
- }
541
- toggleSelectAllGroups(event) {
542
- const isChecked = event.target.checked;
543
- this.filteredGroups.forEach((group) => (group.checked = isChecked));
544
- this.updateSelectedGroups();
545
- // if (!isChecked) {
546
- // this.selectedFilters.stores =[];
547
- // // If there are selected groups, fetch the stores based on selected groups
548
- // this.getStore();
549
- // }
550
- }
551
- updateSelectedGroups() {
552
- // Fetch the relevant stores after groups are selected
553
- const selectedGroups = this.filteredGroups
554
- .filter((group) => group.checked)
555
- .map((group) => group.groupName);
556
- this.filteredGroups.forEach((group) => {
557
- let findGroupIndex = this.groupsData.findIndex((item) => item.groupName == group.groupName);
558
- if (findGroupIndex != -1) {
559
- this.groupsData[findGroupIndex].checked = group.checked;
560
- }
561
- });
562
- if (selectedGroups.length > 0 || !selectedGroups.length) {
563
- this.selectedFilters.stores = [];
564
- // If there are selected groups, fetch the stores based on selected groups
565
- this.getStore();
566
- this.selectedFilters.group = this.groupsData;
567
- }
568
- else {
569
- // If no groups are selected, clear the stores list
570
- this.filteredStores = [];
571
- // Also, update localStorage to reflect the cleared store selection
572
- this.selectedFilters.stores = [];
573
- localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
574
- // Emit data via service
575
- // this.gs.dataRangeValue.next(this.selectedFilters);
576
- }
577
- // Clear the search store text when groups are updated
578
- this.searchStoreText = '';
579
- }
580
- Reset() {
581
- setTimeout(() => {
582
- // Clear selected groups, stores, and locations
583
- this.filteredGroups = [];
584
- this.filteredStores = [];
585
- this.filteredLocations = []; // Reset locations as well
586
- this.locations = [];
587
- this.groupsData = [];
588
- this.stores = [];
589
- // Clear search input fields
590
- this.searchLocationText = "";
591
- this.searchGroupText = "";
592
- this.searchStoreText = "";
593
- this.selectedFilters.stores = [];
594
- this.selectedFilters.group = [];
595
- this.selectedFilters.location = [];
596
- // Fetch locations, groups, and stores again
597
- this.getLocations();
598
- this.getStore();
599
- this.getGroups();
600
- // Reset the filters in selectedFilters
601
- // // Once stores are fetched, mark all as checked
602
- // setTimeout(() => {
603
- // this.filteredStores = this.stores.map(store => ({
604
- // ...store,
605
- // checked: true // Mark all stores as checked
606
- // }));
607
- // // Sync selectedFilters with the updated store state
608
- // this.selectedFilters.stores = this.filteredStores.map(store => ({
609
- // ...store,
610
- // checked: true
611
- // }));
612
- // Update localStorage with the latest selectedFilters
613
- localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
614
- window.location.reload();
615
- // Emit the reset filters to update other components if needed
616
- // this.gs.dataRangeValue.next(this.selectedFilters);
617
- // Trigger change detection
618
- this.cd.detectChanges();
619
- // Adding a slight delay to ensure stores are fetched first
620
- // Close dropdown after reset if necessary
621
- this.Opendropdown = false;
622
- }, 100);
623
- }
624
- Apply() {
625
- // Close the dropdown
626
- this.Opendropdown = false;
627
- // Fetch existing filters from localStorage
628
- const headerFilters = JSON.parse(localStorage.getItem("header-filters") || "{}");
629
- this.selectedFilters.store = null;
630
- // Ensure current selections are reflected
631
- this.selectedFilters.location = this.locations;
632
- this.selectedFilters.group = this.groupsData;
633
- this.selectedFilters.stores = headerFilters.stores ? headerFilters.stores : this.stores;
634
- // Store updated filters back in localStorage
635
- localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
636
- window.location.reload();
637
- // Emit the updated filters via the service
638
- // this.gs.dataRangeValue.next(this.selectedFilters);
639
- // Trigger refresh if necessary
640
- // this.gs.manageRefreshTrigger.next(true);
641
- this.cd.detectChanges();
642
- }
643
- filterLocations() {
644
- const searchText = this.searchLocationText.toLowerCase();
645
- if (searchText) {
646
- // Preserve the checked state during filtering
647
- this.filteredLocations = this.locations
648
- .map(location => ({
649
- ...location,
650
- checked: this.filteredLocations.find(l => l.city === location.city)?.checked || false
651
- }))
652
- .filter(location => location?.city?.toLowerCase().includes(searchText));
653
- }
654
- else {
655
- // Restore the original checked state when search text is cleared
656
- this.filteredLocations = this.locations.map(location => ({
657
- ...location,
658
- checked: this.selectedFilters.location.find((l) => l.city === location.city)?.checked || false
659
- }));
660
- }
661
- }
662
- filterGroups() {
663
- const searchText = this.searchGroupText.toLowerCase();
664
- if (searchText) {
665
- // Preserve the checked state during filtering
666
- this.filteredGroups = this.groupsData
667
- .map(group => ({
668
- ...group,
669
- checked: this.filteredGroups.find(g => g.groupName === group.groupName)?.checked || false
670
- }))
671
- .filter(group => group?.groupName?.toLowerCase().includes(searchText));
672
- }
673
- else {
674
- // Restore the original checked state when search text is cleared
675
- this.filteredGroups = this.groupsData.map(group => ({
676
- ...group,
677
- checked: this.selectedFilters.group.find((g) => g.groupName === group.groupName)?.checked || false
678
- }));
679
- }
680
- }
681
- filterStores() {
682
- const searchText = this.searchStoreText.toLowerCase();
683
- // Preserve checked states during filtering
684
- if (searchText) {
685
- // Filter based on search text while preserving checked state
686
- this.filteredStores = this.stores
687
- .map(store => ({
688
- ...store,
689
- // Check if the store is already checked in filteredStores, fallback to original stores' checked state
690
- checked: this.selectedFilters.stores.find((s) => s.storeId === store.storeId)?.checked || store.checked || false
691
- }))
692
- .filter(store => store.storeName.toLowerCase().includes(searchText));
693
- }
694
- else {
695
- // When the search text is cleared, restore the original list with preserved checked states
696
- this.filteredStores = this.stores.map(store => ({
697
- ...store,
698
- // Preserve the checked state based on the selected filters
699
- checked: this.selectedFilters.stores.find((s) => s.storeId === store.storeId)?.checked || store.checked || false
700
- }));
701
- }
702
- }
703
- closeDropdown() {
704
- this.dropdownOpen = null;
705
- }
706
- clickOutside(event) {
707
- const clickedInside = event.target.closest(".dropdown-container");
708
- const clickedoutSide = event.target.closest(".dropdown1");
709
- if (!clickedInside) {
710
- this.closeDropdown();
711
- }
712
- if (!clickedoutSide) {
713
- this.closeDropdown1();
714
- }
715
- }
716
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TraxWithoutdateComponent, deps: [{ token: i1.AuthService }, { token: i2.Router }, { token: i3.GlobalStateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
717
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TraxWithoutdateComponent, selector: "lib-trax-withoutdate", host: { listeners: { "document:click": "clickOutside($event)" } }, ngImport: i0, template: "<div class=\"me-3\">\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\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 dropdown1 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 <!-- Location Dropdown -->\r\n<div class=\"dropdown-container\" (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 locations...\"\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 locations...\" \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 .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}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.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}.dropdown1{position:absolute;top:70px;min-width:270px!important}.dropdown1 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown1 .dropdown{position:relative;display:inline-block}.dropdown1 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}::ng-deep .dropdown1{z-index:1!important}.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" }] });
718
- }
719
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TraxWithoutdateComponent, decorators: [{
720
- type: Component,
721
- args: [{ selector: 'lib-trax-withoutdate', template: "<div class=\"me-3\">\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\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 dropdown1 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 <!-- Location Dropdown -->\r\n<div class=\"dropdown-container\" (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 locations...\"\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 locations...\" \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 .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}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.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}.dropdown1{position:absolute;top:70px;min-width:270px!important}.dropdown1 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown1 .dropdown{position:relative;display:inline-block}.dropdown1 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}::ng-deep .dropdown1{z-index:1!important}.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"] }]
722
- }], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.Router }, { type: i3.GlobalStateService }, { type: i0.ChangeDetectorRef }], propDecorators: { onClick: [{
723
- type: HostListener,
724
- args: ['document:click', ['$event']]
725
- }], clickOutside: [{
726
- type: HostListener,
727
- args: ["document:click", ["$event"]]
728
- }] } });
729
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJheC13aXRob3V0ZGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hcHAtc2hhcmVkL3NyYy9saWIvbW9kdWxlcy9sYXlvdXQvdG9vbGJhci90cmF4LXdpdGhvdXRkYXRlL3RyYXgtd2l0aG91dGRhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYXBwLXNoYXJlZC9zcmMvbGliL21vZHVsZXMvbGF5b3V0L3Rvb2xiYXIvdHJheC13aXRob3V0ZGF0ZS90cmF4LXdpdGhvdXRkYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxHQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLGlCQUFpQixDQUFDOzs7Ozs7OztBQVV6QixNQUFNLE9BQU8sd0JBQXdCO0lBcUN6QjtJQUEwQjtJQUMzQjtJQUNDO0lBdENYLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDYixZQUFZLEdBQUcsQ0FBQyxDQUFjLEVBQUUsRUFBRTtRQUNoQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QyxDQUFDLENBQUM7SUFFRixpQkFBaUIsR0FBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRSxDQUFDO0lBQ3pDLGVBQWUsR0FBUTtRQUNyQixNQUFNLEVBQUUsSUFB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cUIsQ0FDdEIsQ0FBQztRQUNGLE1BQU0sY0FBYyxHQUFJLEtBQUssQ0FBQyxNQUFzQixDQUFDLE9BQU8sQ0FDMUQsWUFBWSxDQUNiLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN0QjtRQUNELElBQUcsQ0FBQyxjQUFjLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0lBRUgsQ0FBQzt3R0E1eEJVLHdCQUF3Qjs0RkFBeEIsd0JBQXdCLCtIQ2pCckMsMnRRQTZMTTs7NEZENUtPLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSxzQkFBc0I7c0tBK0NoQyxPQUFPO3NCQUROLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBb3VCMUMsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIE9uSW5pdCxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgZGF5anMgZnJvbSBcImRheWpzXCI7XHJcbmltcG9ydCBcImRheWpzL2xvY2FsZS9lblwiO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdHJheC13aXRob3V0ZGF0ZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RyYXgtd2l0aG91dGRhdGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90cmF4LXdpdGhvdXRkYXRlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVHJheFdpdGhvdXRkYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuIGRheWpzID0gZGF5anM7XHJcbiAgaXNDdXN0b21EYXRlID0gKG06IGRheWpzLkRheWpzKSA9PiB7XHJcbiAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9IG0gPiB0aGlzLmRheWpzKCk7XHJcbiAgICByZXR1cm4gaXNWYWxpZERhdGUgPyBcImludmFsaWQtZGF0ZVwiIDogZmFsc2U7XHJcbiAgfTtcclxuXHJcbiAgc2VsZWN0ZWREYXRlUmFuZ2U6IGFueSA9IHsgc3RhcnREYXRlOiBkYXlqcygpLnN1YnRyYWN0KDMwLCAnZGF5cycpLFxyXG4gICAgZW5kRGF0ZTogZGF5anMoKS5zdWJ0cmFjdCgxLCBcImRheXNcIiksfTtcclxuICBzZWxlY3RlZEZpbHRlcnM6IGFueSA9IHtcclxuICAgIGNsaWVudDogbnVsbCxcclxuICAgIGNsaWVudE5hbWU6IG51bGwsXHJcbiAgICBjbGllbnRzOiBbXSxcclxuICAgIHN0b3JlOiBudWxsLFxyXG4gICAgc3RvcmVzOiBbXSxcclxuICAgIGRhdGU6IG51bGwsXHJcbiAgICBncm91cDogW10sXHJcbiAgICBsb2NhdGlvbjogW10sXHJcbiAgfTtcclxuICBPcGVuZHJvcGRvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkcm9wZG93bk9wZW46IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyAnbG9jYXRpb24nIG9yICdncm91cCdcclxuICBzZWFyY2hMb2NhdGlvblRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgc2VhcmNoR3JvdXBUZXh0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIGxvY2F0aW9uczogYW55W10gPSBbXTtcclxuICBmaWx0ZXJlZExvY2F0aW9uczogYW55W10gPSBbXTtcclxuICBncm91cHNEYXRhOiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkR3JvdXBzOiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkU3RvcmVzOiBhbnlbXSA9IFtdO1xyXG4gIHN0b3JlczphbnlbXSA9IFtdXHJcbiAgc2VhcmNoU3RvcmVUZXh0OnN0cmluZyA9ICcnO1xyXG4gIGNsaWVudExpc3Q6YW55ID0gW11cclxuICBzZWxlY3RlZENsaWVudDphbnlcclxuICBsb2NhdGlvbkxhYmVsOiBhbnlbXT1bXTtcclxuICBncm91cExhYmVsOiBhbnlbXT1bXTtcclxuICB1c2VyczogYW55O1xyXG4gIHVybDogYW55O1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSxwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHVibGljIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHt9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkNsaWNrIChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYoIXRhcmdldC5jbG9zZXN0KCcuZHJvcGRvd24xJykpIHtcclxuICAgICAgdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgY2xvc2VEcm9wZG93bjEoKXtcclxuICAgIHRoaXMuT3BlbmRyb3Bkb3duID0gZmFsc2U7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy51cmwgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoXCI/XCIpWzBdLnNwbGl0KCcvJyk7XHJcbiAgICBjb25zdCB1c2VyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgYXMgc3RyaW5nKTtcclxuICAgIHRoaXMudXNlcnMgPSB1c2VyO1xyXG4gICAgdGhpcy5ncz8ubWFuYWdlUmVmcmVzaFRyaWdnZXI/LnN1YnNjcmliZSgoZSkgPT4geyAgICAgIFxyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIGlmICh1c2VyLnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgICAgICAgdGhpcy5nZXRDbGllbnQoKTtcclxuICAgICAgICB9IGVsc2V7XHJcbiAgICAgICAgICBjb25zdCBzdG9yZWRGaWx0ZXJzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKTtcclxuICAgICAgICAgIGlmIChzdG9yZWRGaWx0ZXJzKSB7XHJcbiAgICAgICAgICBjb25zdCBoZWFkZXJGaWx0ZXJzID0gSlNPTi5wYXJzZShzdG9yZWRGaWx0ZXJzKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBoZWFkZXJGaWx0ZXJzPy5zdG9yZXMubWFwKChzdG9yZTphbnkpID0+ICh7XHJcbiAgICAgICAgICAgIC4uLnN0b3JlLFxyXG4gICAgICAgICAgICBjaGVja2VkOiBzdG9yZS5jaGVja2VkXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHVzZXIudXNlclR5cGUgPT09ICd0YW5nbycpIHtcclxuICAgICAgdGhpcy5nZXRDbGllbnQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgIH1cclxuICBcclxuICAgIGNvbnN0IHN0b3JlZEZpbHRlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpO1xyXG4gICAgaWYgKHN0b3JlZEZpbHRlcnMpIHtcclxuICAgICAgY29uc3QgaGVhZGVyRmlsdGVycyA9IEpTT04ucGFyc2Uoc3RvcmVkRmlsdGVycyk7XHJcbiAgXHJcbiAgICAgIC8vIEluaXRpYWxpemUgc2VsZWN0ZWRGaWx0ZXJzIHdpdGggZGVmYXVsdHMgb3IgZXhpc3RpbmcgdmFsdWVzXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzID0ge1xyXG4gICAgICAgIGNsaWVudDogaGVhZGVyRmlsdGVycy5jbGllbnQgfHwgdGhpcy51c2Vycy5jbGllbnQsXHJcbiAgICAgICAgY2xpZW50TmFtZTogaGVhZGVyRmlsdGVycy5jbGllbnROYW1lIHx8ICcnLFxyXG4gICAgICAgIGNsaWVudHM6IGhlYWRlckZpbHRlcnMuY2xpZW50cyB8fCBbXSxcclxuICAgICAgICBzdG9yZTogaGVhZGVyRmlsdGVycy5zdG9yZSB8fCBudWxsLFxyXG4gICAgICAgIGRhdGU6IGhlYWRlckZpbHRlcnMuZGF0ZSB8fCB7fSxcclxuICAgICAgICBzdG9yZXM6IGhlYWRlckZpbHRlcnMuc3RvcmVzIHx8IFtdLFxyXG4gICAgICAgIGdyb3VwOiBoZWFkZXJGaWx0ZXJzLmdyb3VwIHx8IFtdLFxyXG4gICAgICAgIGxvY2F0aW9uOiBoZWFkZXJGaWx0ZXJzLmxvY2F0aW9uIHx8IFtdXHJcbiAgICAgIH07XHJcbiAgXHJcbiAgICAgIC8vIFN5bmMgZmlsdGVyZWQgZGF0YSB3aXRoIHN0b3JlZCBzZWxlY3Rpb25zXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLnN5bmNXaXRoTG9jYWxTdG9yYWdlKGhlYWRlckZpbHRlcnMubG9jYXRpb24pO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gdGhpcy5zeW5jV2l0aExvY2FsU3RvcmFnZShoZWFkZXJGaWx0ZXJzLmdyb3VwKTtcclxuICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IHRoaXMuc3luY1dpdGhMb2NhbFN0b3JhZ2UoaGVhZGVyRmlsdGVycy5zdG9yZXMpO1xyXG4gICAgICAvLyBGb3JtYXQgZGF0ZSByYW5nZSBpZiBpdCBleGlzdHNcclxuICAgICAgLy8gRW1pdCBkYXRhIHZpYSBzZXJ2aWNlIGFuZCB1cGRhdGUgbG9jYWxTdG9yYWdlXHJcbnRoaXMuZW1pdEFuZFN0b3JlRmlsdGVycygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSW5pdGlhbGl6ZSBlbXB0eSBzdGF0ZXMgaWYgbm8gaGVhZGVyIGZpbHRlcnMgYXJlIHByZXNlbnQgaW4gbG9jYWxTdG9yYWdlXHJcbiAgICAgIHRoaXMucmVzZXRGaWx0ZXJzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgc3luY1dpdGhMb2NhbFN0b3JhZ2UoaXRlbXM6IGFueVtdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIGl0ZW1zXHJcbiAgICAgID8gaXRlbXMubWFwKChpdGVtOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgY2hlY2tlZDogaXRlbS5jaGVja2VkID09PSB0cnVlXHJcbiAgICAgICAgfSkpXHJcbiAgICAgIDogW107XHJcbiAgfVxyXG4gIHByaXZhdGUgZW1pdEFuZFN0b3JlRmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgcmVzZXRGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMgPSB7XHJcbiAgICAgIGNsaWVudDogbnVsbCxcclxuICAgICAgY2xpZW50TmFtZTogJycsXHJcbiAgICAgIGNsaWVudHM6IFtdLFxyXG4gICAgICBzdG9yZTogbnVsbCxcclxuICAgICAgZGF0ZToge30sXHJcbiAgICAgIHN0b3JlczogW10sXHJcbiAgICAgIGdyb3VwOiBbXSxcclxuICAgICAgbG9jYXRpb246IFtdXHJcbiAgICB9O1xyXG4gICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdO1xyXG4gIH1cclxuZ2V0Q2xpZW50KCl7XHJcbiAgdGhpcy5hdXRoLmdldENsaWVudHMoKS5zdWJzY3JpYmUoe1xyXG4gICAgbmV4dDogKGUpID0+IHtcclxuICAgICAgaWYgKGUpIHtcclxuICAgICAgICB0aGlzLmNsaWVudExpc3QgPSBlLmRhdGEucmVzdWx0O1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnM6IGFueSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGhlYWRlckZpbHRlcnMuY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudExpc3QuZmluZCgob2JqOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKG9iai5jbGllbnRJZCA9PT0gaGVhZGVyRmlsdGVycy5jbGllbnQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50ID0gb2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9IGhlYWRlckZpbHRlcnMuY2xpZW50O1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50TmFtZSA9IGhlYWRlckZpbHRlcnMuY2xpZW50TmFtZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudHMgPSBoZWFkZXJGaWx0ZXJzLmNsaWVudHM7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZSA9IGhlYWRlckZpbHRlcnMuc3RvcmU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5kYXRlID0gaGVhZGVyRmlsdGVycy5kYXRlO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gaGVhZGVyRmlsdGVycy5zdG9yZXM7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IGhlYWRlckZpbHRlcnMuZ3JvdXA7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IGhlYWRlckZpbHRlcnMubG9jYXRpb247XHJcbiAgICAgICAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBsb2NhdGlvbnMgYW5kIGdyb3VwcyBhcmUgbG9hZGVkIGJlZm9yZSBmZXRjaGluZyBzdG9yZXNcclxuIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiB0aGlzLmdldEdyb3VwcygpO1xyXG4gIC8vIEZldGNoIHN0b3JlcyBvbmx5IGFmdGVyIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBzZXRcclxuICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENsaWVudCA9IHRoaXMuY2xpZW50TGlzdFswXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPSAgdGhpcy5zZWxlY3RlZENsaWVudC5jbGllbnRJZDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnROYW1lID0gdGhpcy5zZWxlY3RlZENsaWVudC5jbGllbnROYW1lXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudHMgPSBoZWFkZXJGaWx0ZXJzLmNsaWVudHM7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlID0gaGVhZGVyRmlsdGVycy5zdG9yZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZGF0ZSA9IGhlYWRlckZpbHRlcnMuZGF0ZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gaGVhZGVyRmlsdGVycy5zdG9yZXM7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gaGVhZGVyRmlsdGVycy5ncm91cDtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPSBoZWFkZXJGaWx0ZXJzLmxvY2F0aW9uO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgXCJoZWFkZXItZmlsdGVyc1wiLFxyXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpIFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgLy8gRW5zdXJlIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBsb2FkZWQgYmVmb3JlIGZldGNoaW5nIHN0b3Jlc1xyXG4gdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgLy8gRmV0Y2ggc3RvcmVzIG9ubHkgYWZ0ZXIgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIHNldFxyXG4gIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50ID0gdGhpcy5jbGllbnRMaXN0WzBdO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPSAgdGhpcy5zZWxlY3RlZENsaWVudC5jbGllbnRJZDtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50TmFtZSA9IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50TmFtZVxyXG4gICAgICAgLy8gRW5zdXJlIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBsb2FkZWQgYmVmb3JlIGZldGNoaW5nIHN0b3Jlc1xyXG4gdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAvLyBGZXRjaCBzdG9yZXMgb25seSBhZnRlciBsb2NhdGlvbnMgYW5kIGdyb3VwcyBhcmUgc2V0XHJcbiB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgIFwiaGVhZGVyLWZpbHRlcnNcIixcclxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykgXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiNFwiKVxyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxub25DbGllbnRTZWxlY3QoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gIC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgY2xpZW50XHJcbiAgdGhpcy5zZWxlY3RlZENsaWVudCA9IGV2ZW50O1xyXG4gIC8vIENsZWFyIHByZXZpb3VzIGZpbHRlcmVkIGRhdGEgYW5kIHNlbGVjdGlvbnNcclxuICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107XHJcbiAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdO1xyXG4gIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSBbXTtcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBbXTtcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gW107XHJcblxyXG4gIC8vIEZldGNoIGhlYWRlciBmaWx0ZXJzIGZyb20gbG9jYWxTdG9yYWdlXHJcbiAgY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIik7XHJcbiAgXHJcbiAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCBmaWx0ZXJzIHdpdGggdGhlIG5ldyBjbGllbnRcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPSB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudElkO1xyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudE5hbWUgPSB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudE5hbWU7XHJcbiAgXHJcbiAgLy8gUmVtb3ZlIG9sZCBzdG9yZSwgZ3JvdXAsIGFuZCBsb2NhdGlvbiBkYXRhIGZyb20gdGhlIGhlYWRlciBmaWx0ZXJzXHJcbiAgZGVsZXRlIGhlYWRlckZpbHRlcnMuc3RvcmVzO1xyXG4gIGRlbGV0ZSBoZWFkZXJGaWx0ZXJzLmdyb3VwcztcclxuICBkZWxldGUgaGVhZGVyRmlsdGVycy5sb2NhdGlvbjtcclxuICBcclxuICAvLyBGZXRjaCBuZXcgZGF0YSBiYXNlZCBvbiB0aGUgbmV3IGNsaWVudFxyXG4gIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gIHRoaXMuZ2V0R3JvdXBzKCk7XHJcblxyXG4gIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2Ugd2l0aCB0aGUgbmV3IGNsaWVudCBzZWxlY3Rpb24gYW5kIGVtcHR5IGZpbHRlciBkYXRhXHJcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcclxuICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICBvcGVuZHJvcGRvd24oZTpNb3VzZUV2ZW50KSB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5PcGVuZHJvcGRvd24gPSAhdGhpcy5PcGVuZHJvcGRvd247XHJcbiAgfVxyXG4gIGdldExvY2F0aW9ucygpOiB2b2lkIHtcclxuICAgIC8vIGNvbnN0IGhlYWRlckZpbHRlcnM6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSB8fCBcInt9XCIpO1xyXG4gICAgbGV0IG9iaiA9e1xyXG4gICAgIGNsaWVudElkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPyB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgOnRoaXMudXNlcnMuY2xpZW50SWQsXHJcbiAgICAgY2l0eTogW10sXHJcbiAgICAgZ3JvdXA6IFtdLFxyXG4gICAgfVxyXG4gICAgdGhpcy5hdXRoLmdldExvY2F0aW9uKG9iaikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGNpdHlMaXN0ID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/LmxvY2F0aW9uPy5maWx0ZXIoKGxvY2F0aW9uOmFueSkgPT4gbG9jYXRpb24uY2hlY2tlZCkubWFwKChsb2M6YW55KSA9PiBsb2MuY2l0eSk7XHJcbiAgICAgICAgLy8gTWFwIHRoZSBmZXRjaGVkIGxvY2F0aW9ucyB3aXRoIGRlZmF1bHQgdW5jaGVja2VkIHN0YXRlXHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbnMgPSByZXM/LmRhdGE/LmxvY2F0aW9uRGF0YS5tYXAoKGNpdHk6IGFueSkgPT4gKHtcclxuICAgICAgICAgIGNpdHk6IGNpdHkuY2l0eSxcclxuICAgICAgICAgIGNoZWNrZWQ6IGNpdHlMaXN0Py5pbmNsdWRlcyhjaXR5LmNpdHkpID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgIH0pKTtcclxuICBcclxuICAgICAgICAvLyBTeW5jIHRoZSBmZXRjaGVkIGxvY2F0aW9ucyB3aXRoIGFueSBzdG9yZWQgY2hlY2tlZCB2YWx1ZXMgaW4gbG9jYWxTdG9yYWdlXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uICYmIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24pKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnMubWFwKGxvY2F0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZExvY2F0aW9uID0gdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24uZmluZCgobG9jOiBhbnkpID0+IGxvYy5jaXR5ID09PSBsb2NhdGlvbi5jaXR5KTtcclxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRMb2NhdGlvbiA/IHsgLi4ubG9jYXRpb24sIGNoZWNrZWQ6IG1hdGNoZWRMb2NhdGlvbi5jaGVja2VkIH0gOiBsb2NhdGlvbjtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLnNlYXJjaExvY2F0aW9uVGV4dCkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25zLmZpbHRlcigobG9jYXRpb246YW55KSA9PiBsb2NhdGlvbi5jaXR5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hMb2NhdGlvblRleHQudG9Mb3dlckNhc2UoKSkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnMuZmlsdGVyKChsb2NhdGlvbikgPT4gbG9jYXRpb24uY2hlY2tlZCkubWFwKChsb2NhdGlvbikgPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkTG9jYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAgICAgICAgICAgdGhpcy5nZXRTdG9yZSgpOyAvLyBGZXRjaCBzdG9yZXMgYmFzZWQgb24gc2VsZWN0ZWQgZ3JvdXBzXHJcbiAgICAgICAgICB9LDEwMDApXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggbG9jYXRpb25zXCIsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgaXNBbGxMb2NhdGlvbnNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmV2ZXJ5KGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpO1xyXG5cclxuICB9XHJcbiAgXHJcbiAgc2VsZWN0ZWRMb2NhdGlvbnNMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9uTGFiZWwgPSB0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC5sZW5ndGggPyB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAuZmlsdGVyKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpLm1hcChsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaXR5KSA6ICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZCkubWFwKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkTG9jYXRpb25zLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/ICcnXHJcbiAgICAgIDogc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID09PSAxXHJcbiAgICAgID8gc2VsZWN0ZWRMb2NhdGlvbnNbMF1cclxuICAgICAgOiBgJHtzZWxlY3RlZExvY2F0aW9ucy5sZW5ndGh9IGxvY2F0aW9uc2A7XHJcbiAgfVxyXG5cclxuICByZW1vdmVMb2NhdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVzZXQoKTtcclxuICB9XHJcbiAgXHJcbiAgZ2V0R3JvdXBzKCk6IHZvaWQgeyAgICBcclxuICAgIGNvbnN0IGNpdHkgPSB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAuZmlsdGVyKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAobG9jYXRpb24gPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgICBjb25zdCBvYmogPSB7IGNpdHksY2xpZW50SWQ6dGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID8gdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50IDp0aGlzLnVzZXJzLmNsaWVudElkLGdyb3VwOltdIH07XHJcbiAgICB0aGlzLmF1dGguZ2V0R3JvdXBzKG9iaikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGNoZWNrZWRHcm91cCA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzPy5ncm91cD8uZmlsdGVyKChncm91cDphbnkpID0+IGdyb3VwLmNoZWNrZWQpLm1hcCgoZ3JvdXA6YW55KSA9PiBncm91cC5ncm91cE5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkR3JvdXBzID0gcmVzPy5kYXRhPy5ncm91cERhdGE/Lm1hcCgoZ3JvdXBOYW1lOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICBncm91cE5hbWU6IGdyb3VwTmFtZS5ncm91cE5hbWUsXHJcbiAgICAgICAgICBjaGVja2VkOiBjaGVja2VkR3JvdXA/LmluY2x1ZGVzKGdyb3VwTmFtZS5ncm91cE5hbWUpID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICB0aGlzLmdyb3Vwc0RhdGEgPSBjb21iaW5lZEdyb3VwcztcclxuICAgICAgICBpZih0aGlzLnNlYXJjaEdyb3VwVGV4dC5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSBjb21iaW5lZEdyb3Vwcy5maWx0ZXIoKGl0ZW06YW55KSA9PiBpdGVtLmdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoR3JvdXBUZXh0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IGNvbWJpbmVkR3JvdXBzO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICAvLyBBdXRvLWZldGNoIHN0b3JlcyB3aGVuIGdyb3VwcyBhcmUgc2VsZWN0ZWRcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZ3JvdXBzRGF0YS5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKS5tYXAoKGdyb3VwKSA9PiBncm91cC5ncm91cE5hbWUpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZEdyb3Vwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RvcmUoKTsgLy8gRmV0Y2ggc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gICAgICAgICAgfSwxMDAwKVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIGdyb3Vwc1wiLCBlcnIpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVEcm9wZG93bih0eXBlOiAnbG9jYXRpb24nIHwgJ2dyb3VwJyB8ICdzdG9yZScpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRyb3Bkb3duT3BlbiA9PT0gdHlwZSkge1xyXG4gICAgICAvLyBJZiB0aGUgZHJvcGRvd24gaXMgb3BlbiwgY2xvc2UgaXQgYW5kIGF2b2lkIHJlc2V0dGluZyB0aGUgc2VsZWN0ZWQgdmFsdWVzIHVubmVjZXNzYXJpbHlcclxuICAgICAgdGhpcy5kcm9wZG93bk9wZW4gPSBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gT3BlbiB0aGUgc3BlY2lmaWMgZHJvcGRvd24gYW5kIGhhbmRsZSBkYXRhIGZldGNoaW5nIG9ubHkgaWYgbmVjZXNzYXJ5XHJcbiAgICAgIHRoaXMuZHJvcGRvd25PcGVuID0gdHlwZTtcclxuICBcclxuICAgICAgaWYgKHR5cGUgPT09ICdncm91cCcpIHtcclxuICAgICAgICAvLyBGZXRjaCBncm91cHMgb25seSBpZiB0aGVyZSBhcmUgc2VsZWN0ZWQgY2l0aWVzIGFuZCBubyBhY3RpdmUgc2VhcmNoIHRleHRcclxuICAgICAgICBjb25zdCBzZWxlY3RlZENpdGllcyA9IHRoaXMubG9jYXRpb25zXHJcbiAgICAgICAgICAuZmlsdGVyKChsb2NhdGlvbikgPT4gbG9jYXRpb24uY2hlY2tlZClcclxuICAgICAgICAgIC5tYXAoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICBcclxuICAgICAgICAvLyBGZXRjaCBncm91cHMgb25seSBpZiBsb2NhdGlvbnMgYXJlIHNlbGVjdGVkLCBubyBzZWFyY2ggdGV4dCBleGlzdHMsIGFuZCBkcm9wZG93biBpcyBvcGVuZWRcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMubGVuZ3RoID4gMCB8fCAoc2VsZWN0ZWRDaXRpZXMubGVuZ3RoID4gMCAmJiAhdGhpcy5zZWFyY2hHcm91cFRleHQudHJpbSgpKSkge1xyXG4gICAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdOyAvLyBDbGVhciBncm91cHMgaWYgbm8gbG9jYXRpb25zIGFyZSBzZWxlY3RlZFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGUgPT09ICdzdG9yZScpIHtcclxuICAgICAgLy8gRmV0Y2ggc3RvcmVzIG9ubHkgaWYgbm90IGFscmVhZHkgZmV0Y2hlZCBhbmQgbm8gc2VhcmNoIHRleHQgaXMgYWN0aXZlXHJcbiAgICAgIGlmICgoIXRoaXMuZmlsdGVyZWRTdG9yZXMgfHwgdGhpcy5maWx0ZXJlZFN0b3Jlcy5sZW5ndGggPT09IDApICYmICF0aGlzLnNlYXJjaFN0b3JlVGV4dC50cmltKCkpIHtcclxuICAgICAgICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIH0gXHJcbiAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIFxyXG4gIGhhbmRsZUdyb3VwRHJvcGRvd25DbGljaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRyb3Bkb3duT3BlbiA9PT0gJ2dyb3VwJykge1xyXG4gICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRHcm91cHMoKTtcclxuICAgIH1cclxuICAgIHRoaXMudG9nZ2xlRHJvcGRvd24oJ2dyb3VwJyk7XHJcbiAgfVxyXG5cclxuICByZXNldFNlbGVjdGVkR3JvdXBzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJlZEdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gKGdyb3VwLmNoZWNrZWQgPSBmYWxzZSkpO1xyXG4gICAgdGhpcy5zZWFyY2hHcm91cFRleHQgPSBcIlwiO1xyXG4gIH1cclxuICBzZWxlY3RlZEdyb3Vwc0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZ3JvdXBMYWJlbCA9IHRoaXMuc2VhcmNoR3JvdXBUZXh0Lmxlbmd0aCA/IHRoaXMuZ3JvdXBzRGF0YS5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKSA6IHRoaXMuZmlsdGVyZWRHcm91cHMuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAuY2hlY2tlZCk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRHcm91cHMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gXCJcIlxyXG4gICAgICA6IHNlbGVjdGVkR3JvdXBzLmxlbmd0aCA9PT0gMVxyXG4gICAgICA/IHNlbGVjdGVkR3JvdXBzWzBdLmdyb3VwTmFtZVxyXG4gICAgICA6IGAke3NlbGVjdGVkR3JvdXBzLmxlbmd0aH0gQ2x1c3RlcnNgO1xyXG4gIH1cclxuICByZW1vdmVHcm91cCgpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVzZXQoKTtcclxuICAgXHJcbiAgfVxyXG4gIFxyXG5cclxuICBpc0FsbEdyb3Vwc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgXHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZEdyb3Vwcy5sZW5ndGggPyB0aGlzLmZpbHRlcmVkR3JvdXBzLmV2ZXJ5KChncm91cCkgPT4gZ3JvdXAuY2hlY2tlZCkgOiBmYWxzZTtcclxuICB9XHJcbiAgICAgICAgXHJcbiAgZ2V0U3RvcmUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjaXR5ID0gdGhpcy5sb2NhdGlvbnNcclxuICAgICAgLmZpbHRlcihsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaGVja2VkKVxyXG4gICAgICAubWFwKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gIFxyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwc0RhdGFcclxuICAgICAgLmZpbHRlcihncm91cCA9PiBncm91cC5jaGVja2VkKVxyXG4gICAgICAubWFwKGdyb3VwID0+IGdyb3VwLmdyb3VwTmFtZSk7XHJcbiAgXHJcbiAgICBjb25zdCBkYXRhID0geyBjaXR5LCBjbHVzdGVyczpncm91cCwgY2xpZW50SWQ6IHRoaXMudXNlcnMuY2xpZW50SWQgPyB0aGlzLnVzZXJzLmNsaWVudElkIDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50IH07XHJcbiAgXHJcbiAgICB0aGlzLmF1dGguZ2V0SGVhZGVydHJheFN0b3JlcyhkYXRhKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZihyZXMgJiZyZXMuY29kZSA9PT0yMDApe1xyXG4gICAgICAgIHRoaXMuc3RvcmVzID0gcmVzLmRhdGEuc3RvcmVzRGF0YTsgICAgICBcclxuICAgICAgICAvLyBSZXRyaWV2ZSBjaGVja2VkIHN0b3JlIElEcyBmcm9tIHNlbGVjdGVkRmlsdGVyc1xyXG4gICAgICAgIGNvbnN0IGNoZWNrZWRTdG9yZUlkcyA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzPy5zdG9yZXNcclxuICAgICAgICAgID8gdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzLmZpbHRlcigoc3RvcmU6IGFueSkgPT4gc3RvcmUuY2hlY2tlZCkubWFwKChzdG9yZTogYW55KSA9PiBzdG9yZS5zdG9yZUlkKVxyXG4gICAgICAgICAgOiBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5zdG9yZXMuZm9yRWFjaChzdG9yZSA9PiB7XHJcbiAgICAgICAgICBpZiAoY2hlY2tlZFN0b3JlSWRzLmluY2x1ZGVzKHN0b3JlLnN0b3JlSWQpKSB7XHJcbiAgICAgICAgICAgIHN0b3JlLmNoZWNrZWQgPSB0cnVlOyAvLyBTeW5jIHRoZSBjaGVja2VkIHN0YXRlIHdpdGggZnVsbCBzdG9yZSBsaXN0XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgXHJcbiAgICAgICAgLy8gTWFwIHRoZSBzdG9yZXMgYW5kIHJldGFpbiB0aGUgJ2NoZWNrZWQnIHN0YXR1c1xyXG4gICAgICAgIGlmKHRoaXMuc2VhcmNoU3RvcmVUZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IHRoaXMuc3RvcmVzPy5maWx0ZXIoc3RvcmUgPT4gc3RvcmUuc3RvcmVOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hTdG9yZVRleHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEVuc3VyZSBzZWxlY3RlZEZpbHRlcnMgaXMgaW4gc3luYyB3aXRoIGZpbHRlcmVkU3RvcmVzXHJcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgfHwgIXRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3Jlcy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuc3RvcmVzLmZvckVhY2goc3RvcmUgPT4ge1xyXG4gICAgICAgICAgICBzdG9yZS5jaGVja2VkID0gdHJ1ZTsgLy8gU3luYyB0aGUgY2hlY2tlZCBzdGF0ZSB3aXRoIGZ1bGwgc3RvcmUgbGlzdFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIC8vIE5vIHByZXZpb3VzbHkgc2VsZWN0ZWQgc3RvcmVzLCBtYXJrIGFsbCBhcyBjaGVja2VkXHJcbiAgICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5tYXAoc3RvcmUgPT4gKHtcclxuICAgICAgICAgICAgLi4uc3RvcmUsXHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRydWVcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkRmlsdGVycyB0byByZWZsZWN0IGN1cnJlbnQgc3RhdGUgb2Ygc3RvcmVzXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSB0aGlzLmZpbHRlcmVkU3RvcmVzLm1hcChzdG9yZSA9PiAoe1xyXG4gICAgICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAgICAgY2hlY2tlZDogc3RvcmUuY2hlY2tlZFxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbG9jYWxTdG9yYWdlIHdpdGggdGhlIGxhdGVzdCBzZWxlY3RlZEZpbHRlcnNcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gIFxyXG4gICAgICAgIC8vIEVtaXQgZGF0YSB2aWEgc2VydmljZVxyXG4gICAgICAgIC8vIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHJlZmxlY3QgY2hhbmdlcyBpbiB0aGUgVUlcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0b3JlcyA9W107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzPVtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPVtdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IHRoaXMuZmlsdGVyZWRTdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAgIGNoZWNrZWQ6IGZhbHNlXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnN0b3JlcyA9W107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzPVtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPVtdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IHRoaXMuZmlsdGVyZWRTdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAgIGNoZWNrZWQ6IGZhbHNlXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBmZXRjaCBzdG9yZXNcIiwgZXJyKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuXHJcbiAgcmVzZXRTZWxlY3RlZFN0b3JlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMuZm9yRWFjaCgoc3RvcmUpID0+IChzdG9yZS5jaGVja2VkID0gZmFsc2UpKTtcclxuICAgIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gXCJcIjtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkU3RvcmVzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkU3RvcmVzID0gdGhpcy5zZWFyY2hTdG9yZVRleHQubGVuZ3RoID8gdGhpcy5zdG9yZXMuZmlsdGVyKChzdG9yZSkgPT4gc3RvcmUuY2hlY2tlZCkgOiB0aGlzLmZpbHRlcmVkU3RvcmVzLmZpbHRlcigoc3RvcmUpID0+IHN0b3JlLmNoZWNrZWQpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/IFwiMCBTdG9yZXNcIlxyXG4gICAgICA6IHNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMVxyXG4gICAgICA/IHNlbGVjdGVkU3RvcmVzWzBdLnN0b3JlTmFtZVxyXG4gICAgICA6IGAke3NlbGVjdGVkU3RvcmVzLmxlbmd0aH0gU3RvcmVzYDtcclxuICB9XHJcblxyXG4gIGlzQWxsU3RvcmVzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZFN0b3Jlcy5sZW5ndGggPiAwICYmIHRoaXMuZmlsdGVyZWRTdG9yZXMuZXZlcnkoc3RvcmUgPT4gc3RvcmUuY2hlY2tlZCk7XHJcbiAgfVxyXG4vLyBNZXRob2QgdG8gaGFuZGxlIGRyb3Bkb3duIGl0ZW0gc2VsZWN0aW9uXHJcbnVwZGF0ZVNlbGVjdGVkU3RvcmVzKCk6IHZvaWQge1xyXG4gIHRoaXMuZmlsdGVyZWRTdG9yZXMuZm9yRWFjaChzdG9yZSA9PiB7XHJcbiAgICBjb25zdCBmaWx0ZXJlZFN0b3JlID0gdGhpcy5zdG9yZXMuZmluZEluZGV4KGZTdG9yZSA9PiBmU3RvcmUuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk7XHJcbiAgICBpZiAoZmlsdGVyZWRTdG9yZSAhPSAtMSkge1xyXG4gICAgICB0aGlzLnN0b3Jlc1tmaWx0ZXJlZFN0b3JlXS5jaGVja2VkID0gc3RvcmUuY2hlY2tlZDsgLy8gU3luYyB0aGUgY2hlY2tlZCBzdGF0ZSB3aXRoIGZ1bGwgc3RvcmUgbGlzdFxyXG4gICAgfVxyXG4gIH0pOyAgXHJcbiAgLy8gVXBkYXRlIHNlbGVjdGVkRmlsdGVycyBiYXNlZCBvbiB0aGUgY3VycmVudCBzdG9yZSBzZWxlY3Rpb25cclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSB0aGlzLnN0b3Jlcy5maWx0ZXIoc3RvcmUgPT4gc3RvcmUuY2hlY2tlZCk7XHJcblxyXG4gIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2Ugd2l0aCB0aGUgbGF0ZXN0IHNlbGVjdGlvblxyXG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcblxyXG4gIC8vIEVtaXQgdXBkYXRlZCBmaWx0ZXJzIHZpYSBzZXJ2aWNlXHJcbiAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuXHJcbiAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIGlmIG5lY2Vzc2FyeVxyXG4gIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG59XHJcbiAgdG9nZ2xlU2VsZWN0QWxsTG9jYXRpb25zKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xyXG4gICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucy5mb3JFYWNoKChsb2NhdGlvbikgPT4gKGxvY2F0aW9uLmNoZWNrZWQgPSBpc0NoZWNrZWQpKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRMb2NhdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdEFsbFN0b3JlcyhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XHJcbiAgXHJcbiAgICAvLyBBcHBseSB0aGUgc2VsZWN0aW9uIHRvIGJvdGggZmlsdGVyZWQgYW5kIGZ1bGwgbGlzdCBvZiBzdG9yZXNcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMuZm9yRWFjaChzdG9yZSA9PiBzdG9yZS5jaGVja2VkID0gY2hlY2tlZCk7XHJcbiAgICB0aGlzLnN0b3Jlcy5mb3JFYWNoKHN0b3JlID0+IHtcclxuICAgICAgY29uc3QgZmlsdGVyZWRTdG9yZSA9IHRoaXMuZmlsdGVyZWRTdG9yZXMuZmluZChmU3RvcmUgPT4gZlN0b3JlLnN0b3JlSWQgPT09IHN0b3JlLnN0b3JlSWQpO1xyXG4gICAgICBpZiAoZmlsdGVyZWRTdG9yZSkge1xyXG4gICAgICAgIHN0b3JlLmNoZWNrZWQgPSBjaGVja2VkOyAvLyBTeW5jIHRoZSBjaGVja2VkIHN0YXRlIHdpdGggZnVsbCBzdG9yZSBsaXN0XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIFxyXG4gICAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCBzdG9yZXMgYW5kIHBlcnNpc3QgdGhlIHNlbGVjdGlvblxyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZFN0b3JlcygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VsZWN0ZWRMb2NhdGlvbnMoKTogdm9pZCB7XHJcbiAgICAvLyBXaGVuIGxvY2F0aW9ucyBhcmUgc2VsZWN0ZWQsIGZldGNoIHRoZSByZWxhdGVkIGdyb3Vwc1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRDaXRpZXMgPSB0aGlzLmZpbHRlcmVkTG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaGVja2VkKVxyXG4gICAgICAubWFwKChsb2NhdGlvbikgPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmZvckVhY2goKGxvY2F0aW9uOmFueSkgPT4ge1xyXG4gICAgICBsZXQgZmluZExvY2F0aW9uSW5kZXggPSB0aGlzLmxvY2F0aW9ucy5maW5kSW5kZXgoKGxvYzphbnkpID0+IGxvYy5jaXR5ID09IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgICBpZihmaW5kTG9jYXRpb25JbmRleCAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25zW2ZpbmRMb2NhdGlvbkluZGV4XS5jaGVja2VkID0gbG9jYXRpb24uY2hlY2tlZDtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGlmIChzZWxlY3RlZENpdGllcy5sZW5ndGggPiAwIHx8ICFzZWxlY3RlZENpdGllcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID1bXTtcclxuICAgICAgdGhpcy5ncm91cHNEYXRhID1bXVxyXG4gICAgICB0aGlzLmdldEdyb3VwcygpOyAvLyBGZXRjaCBncm91cHMgYmFzZWQgb24gc2VsZWN0ZWQgY2l0aWVzXHJcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBzZWxlY3RlZCBncm91cHMsIGZldGNoIHRoZSBzdG9yZXMgYmFzZWQgb24gc2VsZWN0ZWQgZ3JvdXBzXHJcbiAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPSB0aGlzLmxvY2F0aW9ucztcclxuICAgICBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSBbXTsgLy8gQ2xlYXIgZ3JvdXBzIGlmIG5vIGxvY2F0aW9ucyBhcmUgc2VsZWN0ZWRcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPSBbXTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSBbXTtcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTsgLy8gUmVzZXQgc3RvcmVzIGFzIHdlbGxcclxuICAgIHRoaXMuc2VhcmNoR3JvdXBUZXh0ID0gJyc7XHJcbiAgICB0aGlzLnNlYXJjaFN0b3JlVGV4dCA9ICcnO1xyXG4gICAgLy8gdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdEFsbEdyb3VwcyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgIHRoaXMuZmlsdGVyZWRHcm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IChncm91cC5jaGVja2VkID0gaXNDaGVja2VkKSk7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkR3JvdXBzKCk7XHJcbiAgICAvLyBpZiAoIWlzQ2hlY2tlZCkge1xyXG4gICAgLy8gICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPVtdO1xyXG4gICAgLy8gICAgLy8gSWYgdGhlcmUgYXJlIHNlbGVjdGVkIGdyb3VwcywgZmV0Y2ggdGhlIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgIC8vICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgIC8vICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWxlY3RlZEdyb3VwcygpOiB2b2lkIHtcclxuICAgIC8vIEZldGNoIHRoZSByZWxldmFudCBzdG9yZXMgYWZ0ZXIgZ3JvdXBzIGFyZSBzZWxlY3RlZFxyXG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cHMgPSB0aGlzLmZpbHRlcmVkR3JvdXBzXHJcbiAgICAgIC5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKVxyXG4gICAgICAubWFwKChncm91cCkgPT4gZ3JvdXAuZ3JvdXBOYW1lKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcmVkR3JvdXBzLmZvckVhY2goKGdyb3VwOmFueSkgPT4ge1xyXG4gICAgICBsZXQgZmluZEdyb3VwSW5kZXggPSB0aGlzLmdyb3Vwc0RhdGEuZmluZEluZGV4KChpdGVtOmFueSkgPT4gaXRlbS5ncm91cE5hbWUgPT0gZ3JvdXAuZ3JvdXBOYW1lKTtcclxuICAgICAgaWYoZmluZEdyb3VwSW5kZXggIT0gLTEpIHtcclxuICAgICAgICB0aGlzLmdyb3Vwc0RhdGFbZmluZEdyb3VwSW5kZXhdLmNoZWNrZWQgPSBncm91cC5jaGVja2VkO1xyXG4gICAgICB9XHJcbiAgICB9KSBcclxuICAgIGlmIChzZWxlY3RlZEdyb3Vwcy5sZW5ndGggPiAwIHx8ICFzZWxlY3RlZEdyb3Vwcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID1bXTtcclxuICAgICAgLy8gSWYgdGhlcmUgYXJlIHNlbGVjdGVkIGdyb3VwcywgZmV0Y2ggdGhlIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IHRoaXMuZ3JvdXBzRGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIElmIG5vIGdyb3VwcyBhcmUgc2VsZWN0ZWQsIGNsZWFyIHRoZSBzdG9yZXMgbGlzdFxyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gW107XHJcbiAgICAgIFxyXG4gICAgICAvLyBBbHNvLCB1cGRhdGUgbG9jYWxTdG9yYWdlIHRvIHJlZmxlY3QgdGhlIGNsZWFyZWQgc3RvcmUgc2VsZWN0aW9uXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IFtdO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gIFxyXG4gICAgICAvLyBFbWl0IGRhdGEgdmlhIHNlcnZpY2VcclxuICAgICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIH1cclxuICBcclxuICAgIC8vIENsZWFyIHRoZSBzZWFyY2ggc3RvcmUgdGV4dCB3aGVuIGdyb3VwcyBhcmUgdXBkYXRlZFxyXG4gICAgdGhpcy5zZWFyY2hTdG9yZVRleHQgPSAnJztcclxuICB9XHJcbiAgXHJcbiAgUmVzZXQoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgLy8gQ2xlYXIgc2VsZWN0ZWQgZ3JvdXBzLCBzdG9yZXMsIGFuZCBsb2NhdGlvbnNcclxuICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107XHJcbiAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdO1xyXG4gIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSBbXTsgLy8gUmVzZXQgbG9jYXRpb25zIGFzIHdlbGxcclxudGhpcy5sb2NhdGlvbnMgPVtdO3RoaXMuZ3JvdXBzRGF0YSA9W107IHRoaXMuc3RvcmVzID1bXTtcclxuICAvLyBDbGVhciBzZWFyY2ggaW5wdXQgZmllbGRzXHJcbiAgdGhpcy5zZWFyY2hMb2NhdGlvblRleHQgPSBcIlwiO1xyXG4gIHRoaXMuc2VhcmNoR3JvdXBUZXh0ID0gXCJcIjtcclxuICB0aGlzLnNlYXJjaFN0b3JlVGV4dCA9IFwiXCI7XHJcbnRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9W107XHJcbnRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID1bXTtcclxudGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPVtdO1xyXG5cclxuIFxyXG4gIC8vIEZldGNoIGxvY2F0aW9ucywgZ3JvdXBzLCBhbmQgc3RvcmVzIGFnYWluXHJcbiAgdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgdGhpcy5nZXRHcm91cHMoKTtcclxuICAvLyBSZXNldCB0aGUgZmlsdGVycyBpbiBzZWxlY3RlZEZpbHRlcnNcclxuXHJcblxyXG4gIC8vIC8vIE9uY2Ugc3RvcmVzIGFyZSBmZXRjaGVkLCBtYXJrIGFsbCBhcyBjaGVja2VkXHJcbiAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgLy8gICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgLy8gICAgIC4uLnN0b3JlLFxyXG4gIC8vICAgICBjaGVja2VkOiB0cnVlICAvLyBNYXJrIGFsbCBzdG9yZXMgYXMgY2hlY2tlZFxyXG4gIC8vICAgfSkpO1xyXG5cclxuICAvLyAgIC8vIFN5bmMgc2VsZWN0ZWRGaWx0ZXJzIHdpdGggdGhlIHVwZGF0ZWQgc3RvcmUgc3RhdGVcclxuICAvLyAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IHRoaXMuZmlsdGVyZWRTdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgLy8gICAgIC4uLnN0b3JlLFxyXG4gIC8vICAgICBjaGVja2VkOiB0cnVlXHJcbiAgLy8gICB9KSk7XHJcblxyXG4gICAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSB3aXRoIHRoZSBsYXRlc3Qgc2VsZWN0ZWRGaWx0ZXJzXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXHJcbiAgICAvLyBFbWl0IHRoZSByZXNldCBmaWx0ZXJzIHRvIHVwZGF0ZSBvdGhlciBjb21wb25lbnRzIGlmIG5lZWRlZFxyXG4gICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgIC8vIEFkZGluZyBhIHNsaWdodCBkZWxheSB0byBlbnN1cmUgc3RvcmVzIGFyZSBmZXRjaGVkIGZpcnN0XHJcbiBcclxuICBcclxuICAgIC8vIENsb3NlIGRyb3Bkb3duIGFmdGVyIHJlc2V0IGlmIG5lY2Vzc2FyeVxyXG4gICAgdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICB9LDEwMClcclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgXHJcbiAgQXBwbHkoKTogdm9pZCB7XHJcbiAgICAvLyBDbG9zZSB0aGUgZHJvcGRvd25cclxuICAgIHRoaXMuT3BlbmRyb3Bkb3duID0gZmFsc2U7XHJcbiAgXHJcbiAgICAvLyBGZXRjaCBleGlzdGluZyBmaWx0ZXJzIGZyb20gbG9jYWxTdG9yYWdlXHJcbiAgICBjb25zdCBoZWFkZXJGaWx0ZXJzOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJ7fVwiKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlID0gIG51bGxcclxuICAgIC8vIEVuc3VyZSBjdXJyZW50IHNlbGVjdGlvbnMgYXJlIHJlZmxlY3RlZFxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPSB0aGlzLmxvY2F0aW9ucztcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gdGhpcy5ncm91cHNEYXRhO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gaGVhZGVyRmlsdGVycy5zdG9yZXMgPyBoZWFkZXJGaWx0ZXJzLnN0b3JlcyA6IHRoaXMuc3RvcmVzO1xyXG4gIFxyXG4gIFxyXG4gICAgLy8gU3RvcmUgdXBkYXRlZCBmaWx0ZXJzIGJhY2sgaW4gbG9jYWxTdG9yYWdlXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcclxuICAgIC8vIEVtaXQgdGhlIHVwZGF0ZWQgZmlsdGVycyB2aWEgdGhlIHNlcnZpY2VcclxuICAgIC8vIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAvLyBUcmlnZ2VyIHJlZnJlc2ggaWYgbmVjZXNzYXJ5XHJcbiAgICAvLyB0aGlzLmdzLm1hbmFnZVJlZnJlc2hUcmlnZ2VyLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgXHJcbiAgZmlsdGVyTG9jYXRpb25zKCk6IHZvaWQgeyAgICBcclxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgXHJcbiAgICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgY2hlY2tlZCBzdGF0ZSBkdXJpbmcgZmlsdGVyaW5nXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAgIC5tYXAobG9jYXRpb24gPT4gKHtcclxuICAgICAgICAgIC4uLmxvY2F0aW9uLFxyXG4gICAgICAgICAgY2hlY2tlZDogdGhpcy5maWx0ZXJlZExvY2F0aW9ucy5maW5kKGwgPT4gbC5jaXR5ID09PSBsb2NhdGlvbi5jaXR5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIobG9jYXRpb24gPT5cclxuICAgICAgICAgIGxvY2F0aW9uPy5jaXR5Py50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNoZWNrZWQgc3RhdGUgd2hlbiBzZWFyY2ggdGV4dCBpcyBjbGVhcmVkXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5tYXAobG9jYXRpb24gPT4gKHtcclxuICAgICAgICAuLi5sb2NhdGlvbixcclxuICAgICAgICBjaGVja2VkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbi5maW5kKChsOmFueSkgPT4gbC5jaXR5ID09PSBsb2NhdGlvbi5jaXR5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG5cclxuICBmaWx0ZXJHcm91cHMoKTogdm9pZCB7ICBcclxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaEdyb3VwVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgXHJcbiAgICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgY2hlY2tlZCBzdGF0ZSBkdXJpbmcgZmlsdGVyaW5nXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSB0aGlzLmdyb3Vwc0RhdGFcclxuICAgICAgICAubWFwKGdyb3VwID0+ICh7XHJcbiAgICAgICAgICAuLi5ncm91cCxcclxuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuZmlsdGVyZWRHcm91cHMuZmluZChnID0+IGcuZ3JvdXBOYW1lID09PSBncm91cC5ncm91cE5hbWUpPy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgLmZpbHRlcihncm91cCA9PlxyXG4gICAgICAgICAgZ3JvdXA/Lmdyb3VwTmFtZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjaGVja2VkIHN0YXRlIHdoZW4gc2VhcmNoIHRleHQgaXMgY2xlYXJlZFxyXG4gICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gdGhpcy5ncm91cHNEYXRhLm1hcChncm91cCA9PiAoe1xyXG4gICAgICAgIC4uLmdyb3VwLFxyXG4gICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwLmZpbmQoKGc6YW55KSA9PiBnLmdyb3VwTmFtZSA9PT0gZ3JvdXAuZ3JvdXBOYW1lKT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIFxyXG4gIGZpbHRlclN0b3JlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaFN0b3JlVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgLy8gUHJlc2VydmUgY2hlY2tlZCBzdGF0ZXMgZHVyaW5nIGZpbHRlcmluZ1xyXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgLy8gRmlsdGVyIGJhc2VkIG9uIHNlYXJjaCB0ZXh0IHdoaWxlIHByZXNlcnZpbmcgY2hlY2tlZCBzdGF0ZVxyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXNcclxuICAgICAgICAubWFwKHN0b3JlID0+ICh7XHJcbiAgICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdG9yZSBpcyBhbHJlYWR5IGNoZWNrZWQgaW4gZmlsdGVyZWRTdG9yZXMsIGZhbGxiYWNrIHRvIG9yaWdpbmFsIHN0b3JlcycgY2hlY2tlZCBzdGF0ZVxyXG4gICAgICAgICAgY2hlY2tlZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzLmZpbmQoKHM6IGFueSkgPT4gcy5zdG9yZUlkID09PSBzdG9yZS5zdG9yZUlkKT8uY2hlY2tlZCB8fCBzdG9yZS5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgLmZpbHRlcihzdG9yZSA9PiBzdG9yZS5zdG9yZU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBXaGVuIHRoZSBzZWFyY2ggdGV4dCBpcyBjbGVhcmVkLCByZXN0b3JlIHRoZSBvcmlnaW5hbCBsaXN0IHdpdGggcHJlc2VydmVkIGNoZWNrZWQgc3RhdGVzXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN0b3Jlcy5tYXAoc3RvcmUgPT4gKHtcclxuICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgY2hlY2tlZCBzdGF0ZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgZmlsdGVyc1xyXG4gICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3Jlcy5maW5kKChzOiBhbnkpID0+IHMuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk/LmNoZWNrZWQgfHwgc3RvcmUuY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIFxyXG4gICBcclxuICBjbG9zZURyb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kcm9wZG93bk9wZW4gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OmNsaWNrXCIsIFtcIiRldmVudFwiXSlcclxuICBjbGlja091dHNpZGUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFxyXG4gICAgICBcIi5kcm9wZG93bi1jb250YWluZXJcIlxyXG4gICAgKTtcclxuICAgIGNvbnN0IGNsaWNrZWRvdXRTaWRlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcclxuICAgICAgXCIuZHJvcGRvd24xXCJcclxuICAgICk7XHJcbiAgICBpZiAoIWNsaWNrZWRJbnNpZGUpIHtcclxuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XHJcbiAgICB9XHJcbiAgICBpZighY2xpY2tlZG91dFNpZGUpIHtcclxuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duMSgpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcbn1cclxuaW50ZXJmYWNlIENpdHkge1xyXG4gIGNpdHk6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIExvY2F0aW9uIHtcclxuICBjaXR5OiBDaXR5O1xyXG4gIGNoZWNrZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwibWUtM1wiPlxyXG4gICAgPGxhYmVsICpuZ0lmPVwic2VsZWN0ZWRMb2NhdGlvbnNMYWJlbCgpXCIgY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1kZWZhdWx0IG14LTJcIj57e3NlbGVjdGVkTG9jYXRpb25zTGFiZWwoKX19IFxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicmVtb3ZlTG9jYXRpb24oKVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gICAgPGxhYmVsICpuZ0lmPVwic2VsZWN0ZWRHcm91cHNMYWJlbCgpXCIgIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdCBteC0yXCI+e3tzZWxlY3RlZEdyb3Vwc0xhYmVsKCl9fSBcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInJlbW92ZUdyb3VwKClcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuICAgIDxsYWJlbCAgY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1kZWZhdWx0XCI+e3tzZWxlY3RlZFN0b3Jlc0xhYmVsKCl9fTwvbGFiZWw+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJ3cmFwcGVyIG1lLTNcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxyXG48bGliLXNlbGVjdCBbaXRlbXNdPVwiY2xpZW50TGlzdFwiIFttdWx0aV09XCJmYWxzZVwiIFtzZWFyY2hGaWVsZF09XCInY2xpZW50TmFtZSdcIiBbZGlzYWJsZWRdPVwiZmFsc2VcIiBbaWRGaWVsZF09XCInY2xpZW50SWQnXCJcclxuKHNlbGVjdGVkKT1cIm9uQ2xpZW50U2VsZWN0KCRldmVudClcIiBbc2VsZWN0ZWRWYWx1ZXNdPVwiW3NlbGVjdGVkQ2xpZW50XVwiPjwvbGliLXNlbGVjdD5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvcGVuZHJvcGRvd24oJGV2ZW50KVwiICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBteC0yIHJvdW5kZWQtMyB0ZXh0LW5vd3JhcCBib3JkZXItdmFsXCI+XHJcbiAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIm1lLTJcIj5GaWx0ZXI8L3NwYW4+IC0tPlxyXG4gICAgICAgIDxzdmcgY2xhc3M9XCJwbC0zXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgMTBIMTVNMi41IDVIMTcuNU03LjUgMTVIMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiT3BlbmRyb3Bkb3duXCIgY2xhc3M9XCJjYXJkIHAtNSBkcm9wZG93bjEgcG9zaXRpb24tYWJzb2x1dGUgei0xIGVuZC0wXCIgc3R5bGU9XCJ6LWluZGV4OiAxICFpbXBvcnRhbnQ7XCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duMSgpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRpdGxlIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0yXCI+RmlsdGVyIE9wdGlvbnNcclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTI1IG1zLTMgYnRuLXJlc2l6ZVwiIChjbGljayk9XCJSZXNldCgpXCI+IFJlc2V0IDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMjUgIGJ0bi1yZXNpemVcIiAoY2xpY2spPVwiQXBwbHkoKVwiPkFwcGx5PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgIDwhLS0gTG9jYXRpb24gRHJvcGRvd24gLS0+XHJcbjxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250YWluZXJcIiAoY2xpY2tPdXRzaWRlKT1cImNsb3NlRHJvcGRvd24oKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bignbG9jYXRpb24nKVwiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZHJvcGRvd24taW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkTG9jYXRpb25zTGFiZWwoKVwiXHJcbiAgICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGxvY2F0aW9ucy4uLlwiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUgY3VzdG9tLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImRyb3Bkb3duT3BlbiA9PT0gJ2xvY2F0aW9uJ1wiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWItMiBkcm9wZG93bi1zZWFyY2hcIiBcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggbG9jYXRpb25zLi4uXCIgXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoTG9jYXRpb25UZXh0XCIgXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckxvY2F0aW9ucygpXCIgXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yIGRyb3Bkb3duLWl0ZW0gY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0QWxsTG9jYXRpb25zXCIgXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbExvY2F0aW9uc1NlbGVjdGVkKClcIiBcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsTG9jYXRpb25zKCRldmVudClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbExvY2F0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgU2VsZWN0IEFsbFxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBmb3JtLWNoZWNrIGN1c3RvbS1kcm9wZG93bi1pdGVtXCIgXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsb2NhdGlvbiBvZiBmaWx0ZXJlZExvY2F0aW9uc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImxvY2F0aW9uLmNpdHlcIiBcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibG9jYXRpb24uY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkTG9jYXRpb25zKClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwibG9jYXRpb24uY2l0eVwiPlxyXG4gICAgICAgICAgICAgICAge3sgbG9jYXRpb24uY2l0eSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBHcm91cCBEcm9wZG93biAtLT5cclxuPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lciBtdC0zXCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJ2dyb3VwJylcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGRyb3Bkb3duLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZEdyb3Vwc0xhYmVsKClcIiByZWFkb25seVxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjbHVzdGVycy4uXCJcclxuICAgICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudSBjdXN0b20tZHJvcGRvd24tbWVudVwiICpuZ0lmPVwiZHJvcGRvd25PcGVuID09PSAnZ3JvdXAnXCI+XHJcbiAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiIFxyXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBtYi0yIGRyb3Bkb3duLXNlYXJjaFwiIFxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjbHVzdGVycy4uLlwiIFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaEdyb3VwVGV4dFwiIFxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJHcm91cHMoKVwiIFxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItMiBkcm9wZG93bi1pdGVtIGN1c3RvbS1kcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBpZD1cInNlbGVjdEFsbEdyb3Vwc1wiIFxyXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNBbGxHcm91cHNTZWxlY3RlZCgpXCIgXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbEdyb3VwcygkZXZlbnQpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzZWxlY3RBbGxHcm91cHNcIj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IFxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZm9ybS1jaGVjayBjdXN0b20tZHJvcGRvd24taXRlbVwiIFxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZmlsdGVyZWRHcm91cHNcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIFtpZF09XCJncm91cC5ncm91cE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJncm91cC5jaGVja2VkXCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlU2VsZWN0ZWRHcm91cHMoKVwiIFxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCJncm91cC5ncm91cE5hbWVcIj5cclxuICAgICAgICAgICAgICAgIHt7IGdyb3VwLmdyb3VwTmFtZSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjwhLS0gU3RvcmUgRHJvcGRvd24gLS0+XHJcbjxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250YWluZXIgbXQtM1wiIChjbGlja091dHNpZGUpPVwiY2xvc2VEcm9wZG93bigpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCdzdG9yZScpXCI+XHJcbiAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiIFxyXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBkcm9wZG93bi1pbnB1dCBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZFN0b3Jlc0xhYmVsKClcIlxyXG4gICAgICAgICAgICByZWFkb25seVxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBzdG9yZXMuLi5cIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51IGN1c3RvbS1kcm9wZG93bi1tZW51XCIgKm5nSWY9XCJkcm9wZG93bk9wZW4gPT09ICdzdG9yZSdcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG1iLTIgZHJvcGRvd24tc2VhcmNoIFwiIFxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBzdG9yZXMuLi5cIiBcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hTdG9yZVRleHRcIiBcclxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyU3RvcmVzKClcIiBcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1iLTIgZHJvcGRvd24taXRlbSBjdXN0b20tZHJvcGRvd24taXRlbVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RBbGxTdG9yZXNcIiBcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsU3RvcmVzU2VsZWN0ZWQoKVwiIFxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGxTdG9yZXMoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2VsZWN0QWxsU3RvcmVzXCI+XHJcbiAgICAgICAgICAgICAgICBTZWxlY3QgQWxsXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBcclxuICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGZvcm0tY2hlY2sgY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIiBcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHN0b3JlIG9mIGZpbHRlcmVkU3RvcmVzXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBbaWRdPVwic3RvcmUuc3RvcmVJZFwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0b3JlLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZFN0b3JlcygpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cInN0b3JlLnN0b3JlSWRcIj5cclxuICAgICAgICAgICAgICAgIHt7IHN0b3JlLnN0b3JlTmFtZSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=